allow specifying language via client cookie
This commit is contained in:
24
src/game.rs
24
src/game.rs
@@ -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> {
|
||||||
|
@@ -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());
|
||||||
|
|
||||||
|
@@ -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()
|
||||||
|
@@ -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 })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user