1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
/*
This file is part of jellything (https://codeberg.org/metamuffin/jellything)
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2025 metamuffin <metamuffin.org>
*/
use jellyui::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)
}
|