|
|
- use actix_web::HttpRequest;
- use askama::Template;
- use crate::config::Config;
- #[derive(Template)]
- #[template(path = "index.html")]
- pub struct TplIndex<'a> {
- pub lang: &'a str,
- pub csrf_token: &'a str,
- }
- #[derive(Template)]
- #[template(path = "error.html")]
- pub struct TplError<'a> {
- pub lang: &'a str,
- pub error_msg: &'a str,
- }
- #[derive(Template)]
- #[template(path = "link.html")]
- pub struct TplLink<'a> {
- pub lang: &'a str,
- pub admin_token: &'a str,
- pub config: &'a Config,
- }
-
-
- pub fn get_lang(req: &HttpRequest) -> String {
- // getting language from client header
- // taking the two first characters of the Accept-Language header,
- // in lowercase, then parsing it.
- // if it fails, returns "en"
- if let Some(l) = req.headers().get("Accept-Language") {
- if let Ok(s) = l.to_str() {
- return s.to_lowercase()[..2].to_string();
- }
- }
- if let Some(l) = req.headers().get("lang") {
- if let Ok(s) = l.to_str() {
- return s.to_lowercase()[..2].to_string();
- }
- }
-
- String::from("en")
- }
- mod filters {
- use crate::config::LOC;
- pub fn tr(key: &str, lang: &str) -> askama::Result<String> {
- let translation = LOC.get(key).ok_or_else(|| {
- eprintln!("tr filter: couldn't find the key {}", key);
- askama::Error::from(std::fmt::Error)
- })?;
- Ok(String::from(
- translation
- .get(lang)
- .unwrap_or(translation.get("en").ok_or_else(|| {
- eprintln!("tr filter: couldn't find the lang {} in key {}", lang, key);
- askama::Error::from(std::fmt::Error)
- })?)
- .as_str()
- .ok_or_else(|| {
- eprintln!("tr filter: lang {} in key {} is not str", lang, key);
- askama::Error::from(std::fmt::Error)
- })?,
- ))
- }
- }
-
|