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

View File

@@ -1,9 +1,9 @@
use crate::{language::language, page::Page}; use crate::{language::language, page::Page};
use axum::http::HeaderMap; use axum::http::HeaderMap;
use axum_extra::extract::PrivateCookieJar; use axum_extra::extract::CookieJar;
use maud::{html, Markup, PreEscaped}; 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); let lang = language(&cookies, &headers);
rust_i18n::set_locale(lang.to_locale()); rust_i18n::set_locale(lang.to_locale());

View File

@@ -1,8 +1,8 @@
use crate::Language; use crate::Language;
use axum::http::HeaderMap; 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") { if let Some(lang_cookie) = cookies.clone().get("language") {
// Return existing language cookie // Return existing language cookie
lang_cookie.value().to_string().into() 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::{http::HeaderMap, routing::get, Router};
use axum_extra::extract::{ use axum_extra::extract::{
cookie::{Cookie, Expiration, Key}, cookie::{Cookie, Expiration, Key},
PrivateCookieJar, CookieJar, PrivateCookieJar,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use sqlx::{pool::PoolOptions, sqlite::SqliteConnectOptions, SqlitePool}; use sqlx::{pool::PoolOptions, sqlite::SqliteConnectOptions, SqlitePool};
@@ -172,10 +172,11 @@ impl Backend {
async fn client_full( async fn client_full(
&self, &self,
cookies: PrivateCookieJar, cookies: PrivateCookieJar,
lang_cookies: &CookieJar,
headers: &HeaderMap, headers: &HeaderMap,
) -> (PrivateCookieJar, Req) { ) -> (PrivateCookieJar, Req) {
let (cookies, client) = self.client(cookies).await; let (cookies, client) = self.client(cookies).await;
let lang = language::language(&cookies, headers); let lang = language::language(&lang_cookies, headers);
(cookies, Req { client, lang }) (cookies, Req { client, lang })
} }