diff --git a/Documentation.md b/Documentation.md index 973b58b..2aeb917 100644 --- a/Documentation.md +++ b/Documentation.md @@ -145,6 +145,8 @@ Markdown file Markdown file is stored in `/app/data/index.md` +> For french clients, `/app/data/index-fr.md` will be read instead. + ``` --- name: Option @@ -188,6 +190,8 @@ Post content The file is stored at `/app/data/blog/about.md`. +> For french clients, `/app/data/blog/about-fr.md` will be read instead. + ## Projects Markdown files are stored in `/app/data/projects/apps/` @@ -214,6 +218,8 @@ files in `archive` subdirectory of `apps`. The file is stored at `/app/data/projects/about.md`. +> For french clients, `/app/data/projects/about-fr.md` will be read instead. + ## Contacts Markdown files are stored in `/app/data/contacts/` @@ -254,6 +260,8 @@ For example, `socials` contact files are stored in `/app/data/contacts/socials/` The file is stored at `/app/data/contacts/about.md`. +> For french clients, `/app/data/contacts/about-fr.md` will be read instead. + ## Courses Markdown files are stored in `/app/data/cours/` diff --git a/src/routes/blog.rs b/src/routes/blog.rs index 3fbf6c6..6676794 100644 --- a/src/routes/blog.rs +++ b/src/routes/blog.rs @@ -1,5 +1,7 @@ -use actix_web::{get, http::header::ContentType, routes, web, HttpResponse, Responder}; -use cached::proc_macro::once; +use actix_web::{ + get, http::header::ContentType, routes, web, HttpRequest, HttpResponse, Responder, +}; +use cached::proc_macro::cached; use ramhorns::Content; use crate::{ @@ -8,14 +10,17 @@ use crate::{ utils::{ markdown::{File, FilePath}, metadata::MType, - misc::{make_kw, read_file, Html}, + misc::{lang, make_kw, read_file_fallback, Html, Lang}, routes::blog::{build_rss, get_post, get_posts, Post, BLOG_DIR, MIME_TYPE_RSS, POST_DIR}, }, }; #[get("/blog")] -pub async fn index(config: web::Data) -> impl Responder { - Html(build_index(config.get_ref().to_owned())) +pub async fn index(req: HttpRequest, config: web::Data) -> impl Responder { + Html(build_index( + config.get_ref().to_owned(), + lang(req.headers()), + )) } #[derive(Content, Debug)] @@ -26,19 +31,19 @@ struct BlogIndexTemplate { no_posts: bool, } -#[once(time = 60)] -fn build_index(config: Config) -> String { +#[cached(time = 60)] +fn build_index(config: Config, lang: Lang) -> String { let blog_dir = format!("{}/{}", config.locations.data_dir, BLOG_DIR); let mut posts = get_posts(&format!("{blog_dir}/{POST_DIR}")); // Get about - let about: Option = read_file( + let about = read_file_fallback( FilePath { base: blog_dir, path: "about.md".to_owned(), }, MType::Generic, - None, + lang, ); // Sort from newest to oldest diff --git a/src/routes/contact.rs b/src/routes/contact.rs index ea28cdf..494bf0b 100644 --- a/src/routes/contact.rs +++ b/src/routes/contact.rs @@ -1,5 +1,5 @@ use actix_web::{get, routes, web, HttpRequest, Responder}; -use cached::proc_macro::once; +use cached::proc_macro::cached; use ramhorns::Content; use crate::{ @@ -8,7 +8,7 @@ use crate::{ utils::{ markdown::{File, FilePath}, metadata::MType, - misc::{make_kw, read_file, Html}, + misc::{lang, make_kw, read_file_fallback, Html, Lang}, routes::contact::{find_links, read, remove_paragraphs}, }, }; @@ -28,8 +28,8 @@ pub fn pages(cfg: &mut web::ServiceConfig) { } #[get("")] -async fn page(config: web::Data) -> impl Responder { - Html(build_page(config.get_ref().to_owned())) +async fn page(req: HttpRequest, config: web::Data) -> impl Responder { + Html(build_page(config.get_ref().to_owned(), lang(req.headers()))) } #[routes] @@ -78,19 +78,19 @@ struct NetworksTemplate { others: Vec, } -#[once(time = 60)] -fn build_page(config: Config) -> String { +#[cached(time = 60)] +fn build_page(config: Config, lang: Lang) -> String { let contacts_dir = format!("{}/{}", config.locations.data_dir, CONTACT_DIR); let ext = ".md"; // Get about - let about = read_file( + let about = read_file_fallback( FilePath { base: contacts_dir.clone(), path: "about.md".to_owned(), }, MType::Generic, - None, + lang, ); let mut socials = read(&FilePath { diff --git a/src/routes/index.rs b/src/routes/index.rs index b1067b5..da16348 100644 --- a/src/routes/index.rs +++ b/src/routes/index.rs @@ -8,7 +8,7 @@ use crate::{ utils::{ markdown::{File, FilePath}, metadata::MType, - misc::{lang, make_kw, read_file, Html, Lang}, + misc::{lang, make_kw, read_file, read_file_fallback, Html, Lang}, }, }; @@ -36,14 +36,14 @@ struct StyleAvatar { #[cached(time = 60)] fn build_page(config: Config, lang: Lang) -> String { - let (fp, t) = ( + let mut file = read_file_fallback( FilePath { base: config.locations.data_dir.clone(), path: "index.md".to_owned(), }, MType::Index, + lang, ); - let mut file = read_file(fp.clone(), t, Some(lang)).or(read_file(fp, t, None)); // Default values let mut name = config.fc.fullname.clone().unwrap_or_default(); diff --git a/src/routes/portfolio.rs b/src/routes/portfolio.rs index ef12e4f..9950eb5 100644 --- a/src/routes/portfolio.rs +++ b/src/routes/portfolio.rs @@ -1,5 +1,5 @@ -use actix_web::{get, web, Responder}; -use cached::proc_macro::once; +use actix_web::{get, web, HttpRequest, Responder}; +use cached::proc_macro::cached; use glob::glob; use ramhorns::Content; @@ -9,13 +9,13 @@ use crate::{ utils::{ markdown::{File, FilePath}, metadata::MType, - misc::{make_kw, read_file, Html}, + misc::{lang, make_kw, read_file, read_file_fallback, Html, Lang}, }, }; #[get("/portfolio")] -pub async fn page(config: web::Data) -> impl Responder { - Html(build_page(config.get_ref().to_owned())) +pub async fn page(req: HttpRequest, config: web::Data) -> impl Responder { + Html(build_page(config.get_ref().to_owned(), lang(req.headers()))) } #[derive(Content, Debug)] @@ -29,8 +29,8 @@ struct PortfolioTemplate<'a> { err_msg: &'a str, } -#[once(time = 60)] -fn build_page(config: Config) -> String { +#[cached(time = 60)] +fn build_page(config: Config, lang: Lang) -> String { let projects_dir = format!("{}/projects", config.locations.data_dir); let apps_dir = FilePath { base: format!("{projects_dir}/apps"), @@ -39,13 +39,13 @@ fn build_page(config: Config) -> String { let ext = ".md"; // Get about - let about = read_file( + let about = read_file_fallback( FilePath { base: projects_dir, path: "about.md".to_owned(), }, MType::Generic, - None, + lang, ); // Get apps diff --git a/src/utils/misc.rs b/src/utils/misc.rs index d3709cc..e267d7b 100644 --- a/src/utils/misc.rs +++ b/src/utils/misc.rs @@ -58,6 +58,15 @@ impl Responder for Html { } } +/// Read a file localized, fallback to default file if localized file isn't found +pub fn read_file_fallback(filename: FilePath, expected_file: MType, lang: Lang) -> Option { + read_file(filename.clone(), expected_file, Some(lang)).or(read_file( + filename, + expected_file, + None, + )) +} + /// Read a file pub fn read_file(filename: FilePath, expected_file: MType, lang: Option) -> Option { reader(filename, expected_file, lang.unwrap_or(Lang::English))