google_maps/types/
language.rs

1//! Contains the `Language` enum and its associated traits. It is used to
2//! specify a desired language for a response. _This is not a comprehensive list
3//! of languages, it is a list of languages that Google Maps supports._
4
5use crate::error::Error as GoogleMapsError;
6use phf::phf_map;
7use serde::{Deserialize, Deserializer, Serialize, Serializer};
8
9// -----------------------------------------------------------------------------
10
11/// Specifies the language in which to return results.
12///
13/// [Languages](https://developers.google.com/maps/faq#languagesupport)
14/// ====================================================================
15///
16/// * See the [list of supported languages](https://developers.google.com/maps/faq#languagesupport).
17///   Google often updates the supported languages, so this list may not be
18///   exhaustive.
19///
20/// * If `language` is not supplied, the API attempts to use the preferred
21///   language as specified in the `Accept-Language` header, or the native
22///   language of the domain from which the request is sent.
23///
24/// * The API does its best to provide a street address that is readable for
25///   both the user and locals. To achieve that goal, it returns street
26///   addresses in the local language, transliterated to a script readable by
27///   the user if necessary, observing the preferred language. All other
28///   addresses are returned in the preferred language. Address components are
29///   all returned in the same language, which is chosen from the first
30///   component.
31///
32/// * If a name is not available in the preferred language, the API uses the
33///   closest match.
34///
35/// * The preferred language has a small influence on the set of results that
36///   the API chooses to return, and the order in which they are returned. The
37///   geocoder interprets abbreviations differently depending on language, such
38///   as the abbreviations for street types, or synonyms that may be valid in
39///   one language but not in another. For example, _utca_ and _tér_ are
40///   synonyms for street in Hungarian.
41///
42/// By default the API will attempt to load the most appropriate language based
43/// on the users location or browser settings. Some APIs allow you to explicitly
44/// set a language when you make a request. More information on how to set the
45/// language is available in the documentation for each API:
46///
47/// * [Maps JavaScript API](https://developers.google.com/maps/documentation/javascript/localization)
48/// * [Geocoding API](https://developers.google.com/maps/documentation/geocoding/intro#language-param)
49/// * [Directions API](https://developers.google.com/maps/documentation/directions/intro#language-param)
50/// * [Distance Matrix API](https://developers.google.com/maps/documentation/distance-matrix/intro#language-param)
51/// * [Places API](https://developers.google.com/places/web-service/search#language-param)
52///
53/// Supported Languages:
54/// Google often updates supported languages. This list may not be exhaustive
55/// and is subject to change.
56///
57/// You can see what the map will look like in any of the languages listed above
58/// in this [sample application](https://developers.google.com/maps/documentation/javascript/demos/localization/).
59
60#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
61#[repr(u16)]
62#[non_exhaustive]
63pub enum Language {
64    Afrikaans = 0,
65    Albanian = 1,
66    Amharic = 2,
67    Arabic = 3,
68    Armenian = 4,
69    Azerbaijani = 5,
70    Basque = 6,
71    Belarusian = 7,
72    Bengali = 8,
73    Bosnian = 9,
74    Bulgarian = 10,
75    Burmese = 11,
76    Catalan = 12,
77    Chinese = 13,
78    ChineseHongKong = 14,
79    ChineseSimplified = 15,
80    ChineseTaiwan = 16,
81    ChineseTraditional = 17,
82    Croatian = 18,
83    Czech = 19,
84    Danish = 20,
85    Dutch = 21,
86    #[default]
87    English = 22,
88    EnglishAustralian = 23,
89    EnglishCanada = 24,
90    EnglishGreatBritain = 25,
91    EnglishUs = 26,
92    Estonian = 27,
93    Farsi = 28,
94    Finnish = 29,
95    Filipino = 30,
96    French = 31,
97    FrenchCanada = 32,
98    Galician = 33,
99    Georgian = 34,
100    German = 35,
101    Greek = 36,
102    Gujarati = 37,
103    Hebrew = 38,
104    Hindi = 39,
105    Hungarian = 40,
106    Icelandic = 41,
107    Indonesian = 42,
108    Italian = 43,
109    Japanese = 44,
110    Kannada = 45,
111    Kazakh = 46,
112    Khmer = 47,
113    Korean = 48,
114    Kyrgyz = 49,
115    Lao = 50,
116    Latvian = 51,
117    Lithuanian = 52,
118    Macedonian = 53,
119    Malay = 54,
120    Malayalam = 55,
121    Marathi = 56,
122    Mongolian = 57,
123    Nepali = 58,
124    Norwegian = 59,
125    Polish = 60,
126    Portuguese = 61,
127    PortugueseBrazil = 62,
128    PortuguesePortugal = 63,
129    Punjabi = 64,
130    Romanian = 65,
131    Russian = 66,
132    Serbian = 67,
133    Sinhalese = 68,
134    Slovak = 69,
135    Slovenian = 70,
136    Spanish = 71,
137    SpanishLatinAmerica = 72,
138    Swahili = 73,
139    Swedish = 74,
140    Tamil = 75,
141    Telugu = 76,
142    Thai = 77,
143    Turkish = 78,
144    Ukrainian = 79,
145    Urdu = 80,
146    Uzbek = 81,
147    Vietnamese = 82,
148    Zulu = 83,
149    /// If the language is not recognized by
150    /// [serde](https://crates.io/crates/serde) when reading data from
151    /// Google it will be assigned to this `Other` variant.
152    ///
153    /// As new types are added to Google Maps, they must also be added to this
154    /// crate. However, in the meantime, the `Other` catch-all variant allows
155    /// `serde` to read data from Google without producing an error until the
156    /// new variant added to this `enum`.
157    Other = 84,
158} // enum
159
160// -----------------------------------------------------------------------------
161
162impl<'de> Deserialize<'de> for Language {
163    /// Manual implementation of `Deserialize` for `serde`. This will take
164    /// advantage of the `phf`-powered `TryFrom` implementation for this type.
165    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
166        let string = String::deserialize(deserializer)?;
167        match Self::try_from(string.as_str()) {
168            Ok(variant) => Ok(variant),
169            Err(error) => Err(serde::de::Error::custom(error.to_string())),
170        } // match
171    } // fn
172} // impl
173
174// -----------------------------------------------------------------------------
175
176impl Serialize for Language {
177    /// Manual implementation of `Serialize` for `serde`.
178    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
179    where
180        S: Serializer,
181    {
182        serializer.serialize_str(std::convert::Into::<&str>::into(self))
183    } // fn
184} // impl
185
186// -----------------------------------------------------------------------------
187
188impl std::convert::From<&Self> for Language {
189    /// Converts a borrowed `&Language` enum into an owned `Language` enum by
190    /// copying it.
191    fn from(language: &Self) -> Self {
192        *language
193    } // fn
194} // impl
195
196// -----------------------------------------------------------------------------
197
198impl std::convert::From<&Language> for &str {
199    /// Converts a `Language` enum to a `String` that contains a
200    /// [language](https://developers.google.com/maps/faq#languagesupport) code.
201    fn from(language: &Language) -> Self {
202        match language {
203            Language::Afrikaans => "af",
204            Language::Albanian => "sq",
205            Language::Amharic => "am",
206            Language::Arabic => "ar",
207            Language::Armenian => "hy",
208            Language::Azerbaijani => "az",
209            Language::Basque => "eu",
210            Language::Belarusian => "be",
211            Language::Bengali => "bn",
212            Language::Bosnian => "bs",
213            Language::Bulgarian => "bg",
214            Language::Burmese => "my",
215            Language::Catalan => "ca",
216            Language::Chinese => "zh",
217            Language::ChineseHongKong => "zh-HK",
218            Language::ChineseSimplified => "zh-CN",
219            Language::ChineseTaiwan => "zh-TW",
220            Language::ChineseTraditional => "zh-Hant",
221            Language::Croatian => "hr",
222            Language::Czech => "cs",
223            Language::Danish => "da",
224            Language::Dutch => "nl",
225            Language::English => "en",
226            Language::EnglishAustralian => "en-AU",
227            Language::EnglishCanada => "en-CA",
228            Language::EnglishGreatBritain => "en-GB",
229            Language::EnglishUs => "en-US",
230            Language::Estonian => "et",
231            Language::Farsi => "fa",
232            Language::Finnish => "fi",
233            Language::Filipino => "fil",
234            Language::French => "fr",
235            Language::FrenchCanada => "fr-CA",
236            Language::Galician => "gl",
237            Language::Georgian => "ka",
238            Language::German => "de",
239            Language::Greek => "el",
240            Language::Gujarati => "gu",
241            Language::Hebrew => "iw",
242            Language::Hindi => "hi",
243            Language::Hungarian => "hu",
244            Language::Icelandic => "is",
245            Language::Indonesian => "id",
246            Language::Italian => "it",
247            Language::Japanese => "ja",
248            Language::Kannada => "kn",
249            Language::Kazakh => "kk",
250            Language::Khmer => "km",
251            Language::Korean => "ko",
252            Language::Kyrgyz => "ky",
253            Language::Lao => "lo",
254            Language::Latvian => "lv",
255            Language::Lithuanian => "lt",
256            Language::Macedonian => "mk",
257            Language::Malay => "ms",
258            Language::Malayalam => "ml",
259            Language::Marathi => "mr",
260            Language::Mongolian => "mn",
261            Language::Nepali => "ne",
262            Language::Norwegian => "no",
263            Language::Polish => "pl",
264            Language::Portuguese => "pt",
265            Language::PortugueseBrazil => "pr-BR",
266            Language::PortuguesePortugal => "pt-PT",
267            Language::Punjabi => "pa",
268            Language::Romanian => "ro",
269            Language::Russian => "ru",
270            Language::Serbian => "sr",
271            Language::Sinhalese => "si",
272            Language::Slovak => "sk",
273            Language::Slovenian => "sl",
274            Language::Spanish => "es",
275            Language::SpanishLatinAmerica => "es-419",
276            Language::Swahili => "sw",
277            Language::Swedish => "sv",
278            Language::Tamil => "ta",
279            Language::Telugu => "te",
280            Language::Thai => "th",
281            Language::Turkish => "tr",
282            Language::Ukrainian => "uk",
283            Language::Urdu => "ur",
284            Language::Uzbek => "uz",
285            Language::Vietnamese => "vi",
286            Language::Zulu => "zu",
287            Language::Other => "xx",
288        } // match
289    } // fn
290} // impl
291
292// -----------------------------------------------------------------------------
293
294impl std::fmt::Display for Language {
295    /// Converts a `Language` enum to a `String` that contains a
296    /// [language](https://developers.google.com/maps/faq#languagesupport) code.
297    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
298        write!(f, "{}", std::convert::Into::<&str>::into(self))
299    } // fmt
300} // impl
301
302// -----------------------------------------------------------------------------
303
304impl std::convert::From<&Language> for String {
305    /// Converts a `Language` enum to a `String` that contains a
306    /// [language](https://developers.google.com/maps/faq#languagesupport) code.
307    fn from(language: &Language) -> Self {
308        std::convert::Into::<&str>::into(language).to_string()
309    } // fn
310} // impl
311
312// -----------------------------------------------------------------------------
313
314static LANGUAGES_BY_CODE: phf::Map<&'static str, Language> = phf_map! {
315    "af" => Language::Afrikaans,
316    "sq" => Language::Albanian,
317    "am" => Language::Amharic,
318    "ar" => Language::Arabic,
319    "hy" => Language::Armenian,
320    "az" => Language::Azerbaijani,
321    "eu" => Language::Basque,
322    "be" => Language::Belarusian,
323    "bn" => Language::Bengali,
324    "bs" => Language::Bosnian,
325    "bg" => Language::Bulgarian,
326    "my" => Language::Burmese,
327    "ca" => Language::Catalan,
328    "zh" => Language::Chinese,
329    "zh-CN" => Language::ChineseSimplified,
330    "zh-Hant" => Language::ChineseTraditional,
331    "zh-HK" => Language::ChineseHongKong,
332    "zh-TW" => Language::ChineseTaiwan,
333    "hr" => Language::Croatian,
334    "cs" => Language::Czech,
335    "da" => Language::Danish,
336    "nl" => Language::Dutch,
337    "en" => Language::English,
338    "en-AU" => Language::EnglishAustralian,
339    "en-CA" => Language::EnglishCanada,
340    "en-GB" => Language::EnglishGreatBritain,
341    "en-US" => Language::EnglishUs,
342    "et" => Language::Estonian,
343    "fa" => Language::Farsi,
344    "fi" => Language::Finnish,
345    "fil" => Language::Filipino,
346    "fr" => Language::French,
347    "fr-CA" => Language::FrenchCanada,
348    "gl" => Language::Galician,
349    "ka" => Language::Georgian,
350    "de" => Language::German,
351    "el" => Language::Greek,
352    "gu" => Language::Gujarati,
353    "iw" => Language::Hebrew,
354    "hi" => Language::Hindi,
355    "hu" => Language::Hungarian,
356    "is" => Language::Icelandic,
357    "id" => Language::Indonesian,
358    "it" => Language::Italian,
359    "ja" => Language::Japanese,
360    "kn" => Language::Kannada,
361    "kk" => Language::Kazakh,
362    "km" => Language::Khmer,
363    "ko" => Language::Korean,
364    "ky" => Language::Kyrgyz,
365    "lo" => Language::Lao,
366    "lv" => Language::Latvian,
367    "lt" => Language::Lithuanian,
368    "mk" => Language::Macedonian,
369    "ms" => Language::Malay,
370    "ml" => Language::Malayalam,
371    "mr" => Language::Marathi,
372    "mn" => Language::Mongolian,
373    "ne" => Language::Nepali,
374    "no" => Language::Norwegian,
375    "pl" => Language::Polish,
376    "pt" => Language::Portuguese,
377    "pr-BR" => Language::PortugueseBrazil,
378    "pt-PT" => Language::PortuguesePortugal,
379    "pa" => Language::Punjabi,
380    "ro" => Language::Romanian,
381    "ru" => Language::Russian,
382    "sr" => Language::Serbian,
383    "si" => Language::Sinhalese,
384    "sk" => Language::Slovak,
385    "sl" => Language::Slovenian,
386    "es" => Language::Spanish,
387    "es-419" => Language::SpanishLatinAmerica,
388    "sw" => Language::Swahili,
389    "sv" => Language::Swedish,
390    "ta" => Language::Tamil,
391    "te" => Language::Telugu,
392    "th" => Language::Thai,
393    "tr" => Language::Turkish,
394    "uk" => Language::Ukrainian,
395    "ur" => Language::Urdu,
396    "uz" => Language::Uzbek,
397    "vi" => Language::Vietnamese,
398    "zu" => Language::Zulu,
399    "xx" => Language::Other,
400};
401
402// -----------------------------------------------------------------------------
403
404impl std::convert::TryFrom<&str> for Language {
405    // Error definitions are contained in the `google_maps\src\error.rs` module.
406    type Error = GoogleMapsError;
407    /// Gets a `Language` enum from a `String` that contains a supported
408    /// [language](https://developers.google.com/maps/faq#languagesupport) code.
409    fn try_from(language_code: &str) -> Result<Self, Self::Error> {
410        Ok(LANGUAGES_BY_CODE
411            .get(language_code)
412            .copied()
413            .unwrap_or(Self::Other))
414    } // fn
415} // impl
416
417// -----------------------------------------------------------------------------
418
419impl std::str::FromStr for Language {
420    // Error definitions are contained in the `google_maps\src\error.rs` module.
421    type Err = GoogleMapsError;
422    /// Gets a `Language` enum from a `String` that contains a supported
423    /// [language](https://developers.google.com/maps/faq#languagesupport) code.
424    fn from_str(language_code: &str) -> Result<Self, Self::Err> {
425        Ok(LANGUAGES_BY_CODE
426            .get(language_code)
427            .copied()
428            .unwrap_or(Self::Other))
429    } // fn
430} // impl
431
432// -----------------------------------------------------------------------------
433
434impl Language {
435    /// Formats a `Language` enum into a string that is presentable to the
436    /// end user.
437    #[must_use]
438    pub const fn display(&self) -> &str {
439        match self {
440            Self::Afrikaans => "Afrikaans",
441            Self::Albanian => "Albanian",
442            Self::Amharic => "Amharic",
443            Self::Arabic => "Arabic",
444            Self::Armenian => "Armenian",
445            Self::Azerbaijani => "Azerbaijani",
446            Self::Basque => "Basque",
447            Self::Belarusian => "Belarusian",
448            Self::Bengali => "Bengali",
449            Self::Bosnian => "Bosnian",
450            Self::Bulgarian => "Bulgarian",
451            Self::Burmese => "Burmese",
452            Self::Catalan => "Catalan",
453            Self::Chinese => "Chinese",
454            Self::ChineseHongKong => "Chinese (Hong Kong)",
455            Self::ChineseSimplified => "Chinese (Simplified)",
456            Self::ChineseTaiwan => "Chinese (Taiwan)",
457            Self::ChineseTraditional => "Chinese (Traditional)",
458            Self::Croatian => "Croatian",
459            Self::Czech => "Czech",
460            Self::Danish => "Danish",
461            Self::Dutch => "Dutch",
462            Self::English => "English",
463            Self::EnglishAustralian => "English (Australian)",
464            Self::EnglishCanada => "English (Canada)",
465            Self::EnglishGreatBritain => "English (Great Britain)",
466            Self::EnglishUs => "English (US)",
467            Self::Estonian => "Estonian",
468            Self::Farsi => "Farsi",
469            Self::Finnish => "Finnish",
470            Self::Filipino => "Filipino",
471            Self::French => "French",
472            Self::FrenchCanada => "French (Canada)",
473            Self::Galician => "Galician",
474            Self::Georgian => "Georgian",
475            Self::German => "German",
476            Self::Greek => "Greek",
477            Self::Gujarati => "Gujarati",
478            Self::Hebrew => "Hebrew",
479            Self::Hindi => "Hindi",
480            Self::Hungarian => "Hungarian",
481            Self::Icelandic => "Icelandic",
482            Self::Indonesian => "Indonesian",
483            Self::Italian => "Italian",
484            Self::Japanese => "Japanese",
485            Self::Kannada => "Kannada",
486            Self::Kazakh => "Kazakh",
487            Self::Khmer => "Khmer",
488            Self::Korean => "Korean",
489            Self::Kyrgyz => "Kyrgyz",
490            Self::Lao => "Lao",
491            Self::Latvian => "Latvian",
492            Self::Lithuanian => "Lithuanian",
493            Self::Macedonian => "Macedonian",
494            Self::Malay => "Malay",
495            Self::Malayalam => "Malayalam",
496            Self::Marathi => "Marathi",
497            Self::Mongolian => "Mongolian",
498            Self::Nepali => "Nepali",
499            Self::Norwegian => "Norwegian",
500            Self::Polish => "Polish",
501            Self::Portuguese => "Portuguese",
502            Self::PortugueseBrazil => "Portuguese (Brazil)",
503            Self::PortuguesePortugal => "Portuguese (Portugal)",
504            Self::Punjabi => "Punjabi",
505            Self::Romanian => "Romanian",
506            Self::Russian => "Russian",
507            Self::Serbian => "Serbian",
508            Self::Sinhalese => "Sinhalese",
509            Self::Slovak => "Slovak",
510            Self::Slovenian => "Slovenian",
511            Self::Spanish => "Spanish",
512            Self::SpanishLatinAmerica => "Spanish (Latin America)",
513            Self::Swahili => "Swahili",
514            Self::Swedish => "Swedish",
515            Self::Tamil => "Tamil",
516            Self::Telugu => "Telugu",
517            Self::Thai => "Thai",
518            Self::Turkish => "Turkish",
519            Self::Ukrainian => "Ukrainian",
520            Self::Urdu => "Urdu",
521            Self::Uzbek => "Uzbek",
522            Self::Vietnamese => "Vietnamese",
523            Self::Zulu => "Zulu",
524            Self::Other => "Other",
525        } // match
526    } // fn
527} // impl