diff --git a/locales/de/main.ftl b/locales/de/main.ftl index ecc8e06..59aa6dc 100644 --- a/locales/de/main.ftl +++ b/locales/de/main.ftl @@ -4,6 +4,9 @@ invite-user = Benutzer einladen list-users = Liste der Benutzer welcome-user = Herzlich willkommen {$username} logout = Abmelden +login = Login + +not-found = Dieser Link existiert nicht, oder wurde gelöscht. edit-link-headline = Zu editierender Link: {$linktitle} edit-link = Link Editieren diff --git a/locales/en/main.ftl b/locales/en/main.ftl index 92e8fb1..713ab87 100644 --- a/locales/en/main.ftl +++ b/locales/en/main.ftl @@ -2,8 +2,11 @@ list-links = List of existing links add-link = Add a new link invite-user = Invite a new user list-users = List of existing users -welcome-user = Wellcome {$username} +welcome-user = Welcome {$username} logout = Logout +login = Login + +not-found = This Link has not been found or has been deleted edit-link-headline = Edit link: {$linktitle} edit-link = Edit link diff --git a/src/views.rs b/src/views.rs index d64eaff..5dcafca 100644 --- a/src/views.rs +++ b/src/views.rs @@ -3,9 +3,14 @@ use std::time::SystemTime; use actix_identity::Identity; use actix_web::{ http::header::{CacheControl, CacheDirective, ContentType, Expires}, - web, HttpResponse, + web, HttpRequest, HttpResponse, }; use argonautica::Verifier; +use fluent_langneg::{ + convert_vec_str_to_langids_lossy, negotiate_languages, parse_accepted_languages, + NegotiationStrategy, +}; +use fluent_templates::LanguageIdentifier; use image::{DynamicImage, ImageOutputFormat, Luma}; use qrcode::{render::svg, QrCode}; use tera::{Context, Tera}; @@ -27,6 +32,35 @@ fn redirect_builder(target: &str) -> HttpResponse { .body(format!("Redirect to {}", target)) } +fn detect_language(request: &HttpRequest) -> Result { + let requested = parse_accepted_languages( + request + .headers() + .get(actix_web::http::header::ACCEPT_LANGUAGE) + .ok_or_else(|| ServerError::User("Failed to get Accept_Language".to_owned()))? + .to_str() + .map_err(|_| { + ServerError::User("Failed to convert Accept_language to str".to_owned()) + })?, + ); + let available = convert_vec_str_to_langids_lossy(&["de", "en"]); + let default: LanguageIdentifier = "en" + .parse() + .map_err(|_| ServerError::User("Failed to parse a langid.".to_owned()))?; + + let supported = negotiate_languages( + &requested, + &available, + Some(&default), + NegotiationStrategy::Filtering, + ); + let languagecode = supported + .get(0) + .map_or("en".to_string(), std::string::ToString::to_string); + println!("Detected the language: {}", &languagecode); + Ok(languagecode) +} + /// Show the list of all available links if a user is authenticated pub(crate) async fn index( tera: web::Data, @@ -251,9 +285,14 @@ pub(crate) async fn toggle_admin( pub(crate) async fn login( tera: web::Data, id: Identity, + config: web::Data, + req: HttpRequest, ) -> Result { + let language_code = detect_language(&req)?; + slog_info!(config.log, "Detected languagecode: {}", &language_code); let mut data = Context::new(); data.insert("title", "Login"); + data.insert("language", &language_code); if let Some(_id) = id.identity() { return Ok(redirect_builder("/admin/index/")); @@ -304,6 +343,7 @@ pub(crate) async fn redirect( tera: web::Data, config: web::Data, data: web::Path, + req: HttpRequest, ) -> Result { slog_info!(config.log, "Redirecting to {:?}", data); let link = queries::get_link_simple(&data.0, &config).await; @@ -323,6 +363,8 @@ pub(crate) async fn redirect( ); let mut data = Context::new(); data.insert("title", "Wurde gel\u{f6}scht"); + let language = detect_language(&req)?; + data.insert("language", &language); let rendered = tera.render("not_found.html", &data)?; Ok(HttpResponse::NotFound().body(rendered)) } diff --git a/templates/login.html b/templates/login.html index 6bcc718..16681c7 100644 --- a/templates/login.html +++ b/templates/login.html @@ -4,14 +4,16 @@
- +
- +
- +

 

diff --git a/templates/not_found.html b/templates/not_found.html index e4cd887..6502453 100644 --- a/templates/not_found.html +++ b/templates/not_found.html @@ -2,7 +2,7 @@ {% block content %}
-

This Link has not been found or has been deleted

+

{{ fluent(key="not-found", lang=language) }}

 

{% endblock %} \ No newline at end of file