diff options
Diffstat (limited to 'server/src/locale.rs')
-rw-r--r-- | server/src/locale.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/server/src/locale.rs b/server/src/locale.rs new file mode 100644 index 0000000..6d16c17 --- /dev/null +++ b/server/src/locale.rs @@ -0,0 +1,55 @@ +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(lang_from_request(request))) }) + } +} + +pub(crate) fn lang_from_request(request: &Request) -> Language { + 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), + "de" => Some(Language::German), + _ => None, + } + }) + .next() + }) + .unwrap_or(Language::English) +} |