allow specifying language via client cookie

This commit is contained in:
2025-08-13 15:31:33 +02:00
parent 998248acb7
commit fb1bb429c3
4 changed files with 21 additions and 16 deletions

View File

@@ -10,7 +10,7 @@ use axum::{
routing::{get, post},
Form, Router,
};
use axum_extra::extract::PrivateCookieJar;
use axum_extra::extract::{CookieJar, PrivateCookieJar};
use maud::{html, Markup, PreEscaped};
use serde::Deserialize;
use std::sync::Arc;
@@ -19,18 +19,20 @@ use uuid::Uuid;
async fn index(
State(backend): State<Arc<Backend>>,
cookies: PrivateCookieJar,
lang_cookies: CookieJar,
headers: HeaderMap,
) -> Response {
retu(backend, cookies, headers, None).await
retu(backend, cookies, lang_cookies, headers, None).await
}
async fn retu(
backend: Arc<Backend>,
cookies: PrivateCookieJar,
lang_cookies: CookieJar,
headers: HeaderMap,
message: Option<MyMessage>,
) -> Response {
let (cookies, req) = backend.client_full(cookies, &headers).await;
let (cookies, req) = backend.client_full(cookies, &lang_cookies, &headers).await;
let client = req.client;
rust_i18n::set_locale(&req.lang.to_string());
@@ -107,19 +109,20 @@ async fn retu(
async fn game(
State(backend): State<Arc<Backend>>,
cookies: PrivateCookieJar,
lang_cookies: CookieJar,
headers: HeaderMap,
Path(uuid): Path<String>,
) -> Response {
let (cookies, req) = backend.client_full(cookies, &headers).await;
let (cookies, req) = backend.client_full(cookies, &lang_cookies, &headers).await;
let client = req.client;
rust_i18n::set_locale(req.lang.to_locale());
let Ok(uuid) = Uuid::parse_str(&uuid) else {
return not_found(cookies, headers).await.into_response();
return not_found(lang_cookies, headers).await.into_response();
};
let Some(camera) = backend.get_camera(&uuid).await else {
return not_found(cookies, headers).await.into_response();
return not_found(lang_cookies, headers).await.into_response();
};
let message = if let Ok(number) = backend.client_found_camera(&client, &camera).await {
@@ -132,10 +135,10 @@ async fn game(
)
};
retu(backend, cookies, headers, Some(message)).await
retu(backend, cookies, lang_cookies, headers, Some(message)).await
}
async fn not_found(cookies: PrivateCookieJar, headers: HeaderMap) -> Markup {
async fn not_found(cookies: CookieJar, headers: HeaderMap) -> Markup {
let lang = language(&cookies, &headers);
Page::new(lang).content(html! {
h1 { (t!("not_found_title")) }
@@ -150,10 +153,11 @@ struct NameForm {
async fn set_name(
State(backend): State<Arc<Backend>>,
cookies: PrivateCookieJar,
lang_cookies: CookieJar,
headers: HeaderMap,
Form(form): Form<NameForm>,
) -> Response {
let (cookies, req) = backend.client_full(cookies, &headers).await;
let (cookies, req) = backend.client_full(cookies, &lang_cookies, &headers).await;
let client = req.client;
rust_i18n::set_locale(req.lang.to_locale());
@@ -176,7 +180,7 @@ async fn set_name(
),
};
retu(backend, cookies, headers, Some(message)).await
retu(backend, cookies, lang_cookies, headers, Some(message)).await
}
pub(super) fn routes() -> Router<AppState> {

View File

@@ -1,9 +1,9 @@
use crate::{language::language, page::Page};
use axum::http::HeaderMap;
use axum_extra::extract::PrivateCookieJar;
use axum_extra::extract::CookieJar;
use maud::{html, Markup, PreEscaped};
pub(super) async fn index(cookies: PrivateCookieJar, headers: HeaderMap) -> Markup {
pub(super) async fn index(cookies: CookieJar, headers: HeaderMap) -> Markup {
let lang = language(&cookies, &headers);
rust_i18n::set_locale(lang.to_locale());

View File

@@ -1,8 +1,8 @@
use crate::Language;
use axum::http::HeaderMap;
use axum_extra::extract::PrivateCookieJar;
use axum_extra::extract::CookieJar;
pub(crate) fn language(cookies: &PrivateCookieJar, headers: &HeaderMap) -> Language {
pub(crate) fn language(cookies: &CookieJar, headers: &HeaderMap) -> Language {
if let Some(lang_cookie) = cookies.clone().get("language") {
// Return existing language cookie
lang_cookie.value().to_string().into()

View File

@@ -2,7 +2,7 @@ use crate::model::client::Client;
use axum::{http::HeaderMap, routing::get, Router};
use axum_extra::extract::{
cookie::{Cookie, Expiration, Key},
PrivateCookieJar,
CookieJar, PrivateCookieJar,
};
use serde::{Deserialize, Serialize};
use sqlx::{pool::PoolOptions, sqlite::SqliteConnectOptions, SqlitePool};
@@ -172,10 +172,11 @@ impl Backend {
async fn client_full(
&self,
cookies: PrivateCookieJar,
lang_cookies: &CookieJar,
headers: &HeaderMap,
) -> (PrivateCookieJar, Req) {
let (cookies, client) = self.client(cookies).await;
let lang = language::language(&cookies, headers);
let lang = language::language(&lang_cookies, headers);
(cookies, Req { client, lang })
}