diff options
Diffstat (limited to 'server/src/routes/locale.rs')
-rw-r--r-- | server/src/routes/locale.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/server/src/routes/locale.rs b/server/src/routes/locale.rs new file mode 100644 index 0000000..cdf25d5 --- /dev/null +++ b/server/src/routes/locale.rs @@ -0,0 +1,54 @@ +use jellybase::locale::Language; +use rocket::{ + outcome::Outcome, + request::{self, FromRequest}, + Request, +}; +use std::ops::Deref; + +pub struct AcceptLanguage(pub Language); +impl Deref for AcceptLanguage { + type Target = Language; + fn deref(&self) -> &Self::Target { + &self.0 + } +} +impl<'r> FromRequest<'r> for AcceptLanguage { + type Error = (); + + fn from_request<'life0, 'async_trait>( + request: &'r Request<'life0>, + ) -> ::core::pin::Pin< + Box< + dyn ::core::future::Future<Output = request::Outcome<Self, Self::Error>> + + ::core::marker::Send + + 'async_trait, + >, + > + where + 'r: 'async_trait, + 'life0: 'async_trait, + Self: 'async_trait, + { + Box::pin(async move { + Outcome::Success(AcceptLanguage( + request + .headers() + .get_one("accept-language") + .and_then(|h| { + h.split(",") + .filter_map(|e| { + let code = e.split(";").next()?; + let code = code.split_once("-").unwrap_or((code, "")).0; + match code { + "en" => Some(Language::English), + _ => None, + } + }) + .next() + }) + .unwrap_or(Language::English), + )) + }) + } +} |