1#![doc=include_str!("../README.md")]
2
3#[macro_use]
4extern crate thiserror;
5
6
7pub use config::Config;
8pub use error::Error;
9use rocket::{
10 request::{FromRequest, Outcome},
11 Request,
12};
13use std::{fmt::Display, hash::Hash, str::FromStr};
14mod accept_language;
15mod config;
16mod error;
17mod url;
18
19macro_rules! language_impls {
20 ($($upper:ident | $lower:ident | $english_name:literal | $native_name:literal )*) => {
21 $(#[doc = stringify!($lower | $upper | $english_name | $native_name)])*
24 #[non_exhaustive]
25 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
26 pub enum LangCode {$(
27 #[doc=stringify!($english_name)]
28 $upper
29 ),+}
30 pub use LangCode::*;
31
32 impl LangCode {
33 pub const ALL_CODES: &'static [Self] = &[$(Self::$upper,)*];
36
37 pub fn as_str(self) -> &'static str {
44 match self {
45 $(Self::$upper => stringify!($lower)),*
46 }
47 }
48 pub fn english_name(self) -> &'static str {
55 match self {
56 $(Self::$upper => $english_name,)*
57 }
58 }
59 pub fn native_name(self) -> &'static str {
67 match self {
68 $(Self::$upper => $native_name,)*
69 }
70 }
71 }
72
73 impl FromStr for LangCode {
74 type Err = Error;
75 fn from_str(input: &str) -> Result<LangCode, Error> {
76 match input {
77 $(stringify!($lower) => Ok(Self::$upper),)*
78 _ => Err(Error::NotAcceptable),
79 }
80 }
81 }
82
83 impl Display for LangCode {
84 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
85 write!(f, "{}", self.as_str())
86 }
87 }
88
89
90 }
91}
92impl TryFrom<&Request<'_>> for LangCode {
93 type Error = Error;
94 fn try_from(req: &Request) -> Result<LangCode, Error> {
95 req.local_cache(|| Ok::<_, Error>(En))
96 .clone()
97 }
98}
99
100#[rocket::async_trait]
103impl<'r> FromRequest<'r> for LangCode {
104 type Error = Error;
105 async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
109 match request
110 .local_cache(|| Ok::<_, Error>(En))
111 .clone()
112 {
113 Ok(lang) => Outcome::Success(lang),
114 Err(err) => Outcome::Failure((err.status(), err)),
115 }
116 }
117}
118
119
120
121language_impls! {
122Aa | aa | "Afar" | "Afaraf"
123Ab | ab | "Abkhaz" | "аҧсуа бызшәа"
124Af | af | "Afrikaans" | "Afrikaans"
125Ak | ak | "Akan" | "Akan"
126Sq | sq | "Albanian" | "Shqip"
127Am | am | "Amharic" | "አማርኛ"
128Ar | ar | "Arabic" | "العربية"
129An | an | "Aragonese" | "aragonés"
130Hy | hy | "Armenian" | "Հայերեն"
131As | as | "Assamese" | "অসমীয়া"
132Av | av | "Avaric" | "авар мацӀ"
133Ae | ae | "Avestan" | "avesta"
134Ay | ay | "Aymara" | "aymar aru"
135Az | az | "Azerbaijani" | "azərbaycan dili"
136Bm | bm | "Bambara" | "bamanankan"
137Ba | ba | "Bashkir" | "башҡорт теле"
138Eu | eu | "Basque" | "euskara"
139Be | be | "Belarusian" | "беларуская мова"
140Bn | bn | "Bengali" | "বাংলা"
141Bh | bh | "Bihari" | "भोजपुरी"
142Bi | bi | "Bislama" | "Bislama"
143Bs | bs | "Bosnian" | "bosanski jezik"
144Br | br | "Breton" | "brezhoneg"
145Bg | bg | "Bulgarian" | "български език"
146My | my | "Burmese" | "ဗမာစာ"
147Ca | ca | "Catalan" | "català"
148Ch | ch | "Chamorro" | "Chamoru"
149Ce | ce | "Chechen" | "нохчийн мотт"
150Ny | ny | "Chichewa" | "chiCheŵa"
151Zh | zh | "Chinese" | "中文"
152Cv | cv | "Chuvash" | "чӑваш чӗлхи"
153Kw | kw | "Cornish" | "Kernewek"
154Co | co | "Corsican" | "corsu"
155Cr | cr | "Cree" | "ᓀᐦᐃᔭᐍᐏᐣ"
156Hr | hr | "Croatian" | "hrvatski jezik"
157Cs | cs | "Czech" | "čeština"
158Da | da | "Danish" | "dansk"
159Dv | dv | "Divehi" | "ދިވެހި"
160Nl | nl | "Dutch" | "Nederlands"
161Dz | dz | "Dzongkha" | "རྫོང་ཁ"
162En | en | "English" | "English"
163Eo | eo | "Esperanto" | "Esperanto"
164Et | et | "Estonian" | "eesti"
165Ee | ee | "Ewe" | "Eʋegbe"
166Fo | fo | "Faroese" | "føroyskt"
167Fj | fj | "Fijian" | "vosa Vakaviti"
168Fi | fi | "Finnish" | "suomi"
169Fr | fr | "French" | "français"
170Ff | ff | "Fula" | "Fulfulde"
171Gl | gl | "Galician" | "galego"
172Ka | ka | "Georgian" | "ქართული"
173De | de | "German" | "Deutsch"
174El | el | "Greek" | "ελληνικά"
175Gn | gn | "Guaraní" | "Avañe'ẽ"
176Gu | gu | "Gujarati" | "ગુજરાતી"
177Ht | ht | "Haitian" | "Kreyòl ayisyen"
178Ha | ha | "Hausa" | "(Hausa) هَوُسَ"
179He | he | "Hebrew" | "עברית"
180Hz | hz | "Herero" | "Otjiherero"
181Hi | hi | "Hindi" | "हिन्दी"
182Ho | ho | "Hiri Motu" | "Hiri Motu"
183Hu | hu | "Hungarian" | "magyar"
184Ia | ia | "Interlingua" | "Interlingua"
185Id | id | "Indonesian" | "Bahasa Indonesia"
186Ie | ie | "Interlingue" | "Interlingue"
187Ga | ga | "Irish" | "Gaeilge"
188Ig | ig | "Igbo" | "Asụsụ Igbo"
189Ik | ik | "Inupiaq" | "Iñupiaq"
190Io | io | "Ido" | "Ido"
191Is | is | "Icelandic" | "Íslenska"
192It | it | "Italian" | "Italiano"
193Iu | iu | "Inuktitut" | "ᐃᓄᒃᑎᑐᑦ"
194Ja | ja | "Japanese" | "日本語 (にほんご)"
195Jv | jv | "Javanese" | "ꦧꦱꦗꦮ"
196Kl | kl | "Kalaallisut" | "kalaallisut"
197Kn | kn | "Kannada" | "ಕನ್ನಡ"
198Kr | kr | "Kanuri" | "Kanuri"
199Ks | ks | "Kashmiri" | "कश्मीरी"
200Kk | kk | "Kazakh" | "қазақ тілі"
201Km | km | "Khmer" | "ខ្មែរ"
202Ki | ki | "Kikuyu" | "Gĩkũyũ"
203Rw | rw | "Kinyarwanda" | "Ikinyarwanda"
204Ky | ky | "Kyrgyz" | "Кыргызча"
205Kv | kv | "Komi" | "коми кыв"
206Kg | kg | "Kongo" | "Kikongo"
207Ko | ko | "Korean" | "한국어"
208Ku | ku | "Kurdish" | "Kurdî"
209Kj | kj | "Kwanyama" | "Kuanyama"
210La | la | "Latin" | "lingua latina"
211Lb | lb | "Luxembourgish" | "Lëtzebuergesch"
212Lg | lg | "Ganda" | "Luganda"
213Li | li | "Limburgish" | "Limburgs"
214Ln | ln | "Lingala" | "Lingála"
215Lo | lo | "Lao" | "ພາສາລາວ"
216Lt | lt | "Lithuanian" | "lietuvių kalba"
217Lu | lu | "Luba-Katanga" | "Tshiluba"
218Lv | lv | "Latvian" | "latviešu valoda"
219Gv | gv | "Manx" | "Gaelg"
220Mk | mk | "Macedonian" | "македонски јазик"
221Mg | mg | "Malagasy" | "fiteny malagasy"
222Ms | ms | "Malay" | "bahasa Melayu"
223Ml | ml | "Malayalam" | "മലയാളം"
224Mt | mt | "Maltese" | "Malti"
225Mi | mi | "Māori" | "te reo Māori"
226Mr | mr | "Marathi" | "मराठी"
227Mh | mh | "Marshallese" | "Kajin M̧ajeļ"
228Mn | mn | "Mongolian" | "Монгол хэл"
229Na | na | "Nauruan" | "Dorerin Naoero"
230Nv | nv | "Navajo" | "Diné bizaad"
231Nd | nd | "Northern Ndebele" | "isiNdebele"
232Ne | ne | "Nepali" | "नेपाली"
233Ng | ng | "Ndonga" | "Owambo"
234Nb | nb | "Norwegian Bokmål" | "Norsk bokmål"
235Nn | nn | "Norwegian Nynorsk" | "Norsk nynorsk"
236No | no | "Norwegian" | "Norsk"
237Ii | ii | "Nuosu" | "ꆈꌠ꒿ Nuosuhxop"
238Nr | nr | "Southern Ndebele" | "isiNdebele"
239Oc | oc | "Occitan" | "occitan"
240Oj | oj | "Ojibwe" | "ᐊᓂᔑᓈᐯᒧᐎᓐ"
241Cu | cu | "Old Church Slavonic" | "ѩзыкъ словѣньскъ"
242Om | om | "Oromo" | "Afaan Oromoo"
243Or | or | "Oriya" | "ଓଡ଼ିଆ"
244Os | os | "Ossetian" | "ирон æвзаг"
245Pa | pa | "Punjabi" | "ਪੰਜਾਬੀ"
246Pi | pi | "Pāli" | "पाऴि"
247Fa | fa | "Persian" | "فارسی"
248Pl | pl | "Polish" | "język polski"
249Ps | ps | "Pashto" | "پښتو"
250Pt | pt | "Portuguese" | "Português"
251Qu | qu | "Quechua" | "Runa Simi"
252Rm | rm | "Romansh" | "rumantsch grischun"
253Rn | rn | "Kirundi" | "Ikirundi"
254Ro | ro | "Romanian" | "Română"
255Ru | ru | "Russian" | "Русский"
256Sa | sa | "Sanskrit" | "संस्कृतम्"
257Sc | sc | "Sardinian" | "sardu"
258Sd | sd | "Sindhi" | "सिन्धी"
259Se | se | "Northern Sami" | "Davvisámegiella"
260Sm | sm | "Samoan" | "gagana fa'a Samoa"
261Sg | sg | "Sango" | "yângâ tî sängö"
262Sr | sr | "Serbian" | "српски језик"
263Gd | gd | "Gaelic" | "Gàidhlig"
264Sn | sn | "Shona" | "chiShona"
265Si | si | "Sinhalese" | "සිංහල"
266Sk | sk | "Slovak" | "slovenčina"
267Sl | sl | "Slovene" | "slovenski jezik"
268So | so | "Somali" | "Soomaaliga"
269St | st | "Southern Sotho" | "Sesotho"
270Es | es | "Spanish" | "Español"
271Su | su | "Sundanese" | "Basa Sunda"
272Sw | sw | "Swahili" | "Kiswahili"
273Ss | ss | "Swati" | "SiSwati"
274Sv | sv | "Swedish" | "svenska"
275Ta | ta | "Tamil" | "தமிழ்"
276Te | te | "Telugu" | "తెలుగు"
277Tg | tg | "Tajik" | "тоҷикӣ"
278Th | th | "Thai" | "ไทย"
279Ti | ti | "Tigrinya" | "ትግርኛ"
280Bo | bo | "Tibetan" | "བོད་ཡིག"
281Tk | tk | "Turkmen" | "Türkmen"
282Tl | tl | "Tagalog" | "Wikang Tagalog"
283Tn | tn | "Tswana" | "Setswana"
284To | to | "Tonga" | "faka Tonga"
285Tr | tr | "Turkish" | "Türkçe"
286Ts | ts | "Tsonga" | "Xitsonga"
287Tt | tt | "Tatar" | "татар теле"
288Tw | tw | "Twi" | "Twi"
289Ty | ty | "Tahitian" | "Reo Tahiti"
290Ug | ug | "Uyghur" | "ئۇيغۇرچە"
291Uk | uk | "Ukrainian" | "Українська"
292Ur | ur | "Urdu" | "اردو"
293Uz | uz | "Uzbek" | "Oʻzbek"
294Ve | ve | "Venda" | "Tshivenḓa"
295Vi | vi | "Vietnamese" | "Tiếng Việt"
296Vo | vo | "Volapük" | "Volapük"
297Wa | wa | "Walloon" | "walon"
298Cy | cy | "Welsh" | "Cymraeg"
299Wo | wo | "Wolof" | "Wollof"
300Fy | fy | "Western Frisian" | "Frysk"
301Xh | xh | "Xhosa" | "isiXhosa"
302Yi | yi | "Yiddish" | "ייִדיש"
303Yo | yo | "Yoruba" | "Yorùbá"
304Za | za | "Zhuang" | "Saɯ cueŋƅ"
305Zu | zu | "Zulu" | "isiZulu"
306}