Merge pull request #132 from batisteo/i18n
i18n basic configuration and trans Tera tag
This commit is contained in:
commit
7a2c26a71f
2
build.rs
2
build.rs
|
@ -1,7 +1,7 @@
|
|||
#[macro_use]
|
||||
extern crate clap;
|
||||
|
||||
use clap::Shell;
|
||||
// use clap::Shell;
|
||||
|
||||
include!("src/cli.rs");
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ pub struct Config {
|
|||
/// Description of the site
|
||||
pub description: Option<String>,
|
||||
/// The language used in the site. Defaults to "en"
|
||||
pub language_code: Option<String>,
|
||||
pub default_language: Option<String>,
|
||||
/// Whether to generate RSS. Defaults to false
|
||||
pub generate_rss: Option<bool>,
|
||||
/// The number of articles to include in the RSS feed. Defaults to unlimited
|
||||
|
@ -50,6 +50,9 @@ pub struct Config {
|
|||
/// Whether to compile the `sass` directory and output the css files into the static folder
|
||||
pub compile_sass: Option<bool>,
|
||||
|
||||
/// Languages list and translated strings
|
||||
pub translations: Option<HashMap<String, Toml>>,
|
||||
|
||||
/// All user params set in [extra] in the config
|
||||
pub extra: Option<HashMap<String, Toml>>,
|
||||
|
||||
|
@ -74,13 +77,14 @@ impl Config {
|
|||
Err(e) => bail!(e)
|
||||
};
|
||||
|
||||
set_default!(config.language_code, "en".to_string());
|
||||
set_default!(config.default_language, "en".to_string());
|
||||
set_default!(config.highlight_code, false);
|
||||
set_default!(config.generate_rss, false);
|
||||
set_default!(config.rss_limit, 20);
|
||||
set_default!(config.generate_tags_pages, false);
|
||||
set_default!(config.generate_categories_pages, false);
|
||||
set_default!(config.compile_sass, false);
|
||||
set_default!(config.translations, HashMap::new());
|
||||
set_default!(config.extra, HashMap::new());
|
||||
|
||||
match config.highlight_theme {
|
||||
|
@ -166,12 +170,13 @@ impl Default for Config {
|
|||
highlight_code: Some(true),
|
||||
highlight_theme: Some("base16-ocean-dark".to_string()),
|
||||
description: None,
|
||||
language_code: Some("en".to_string()),
|
||||
default_language: Some("en".to_string()),
|
||||
generate_rss: Some(false),
|
||||
rss_limit: Some(10_000),
|
||||
generate_tags_pages: Some(true),
|
||||
generate_categories_pages: Some(true),
|
||||
compile_sass: Some(false),
|
||||
translations: None,
|
||||
extra: None,
|
||||
build_timestamp: Some(1),
|
||||
}
|
||||
|
@ -302,4 +307,27 @@ a_value = 10
|
|||
assert_eq!(extra["hello"].as_str().unwrap(), "world".to_string());
|
||||
assert_eq!(extra["a_value"].as_integer().unwrap(), 10);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn can_use_language_configuration() {
|
||||
let config = r#"
|
||||
base_url = "https://remplace-par-ton-url.fr"
|
||||
default_language = "fr"
|
||||
|
||||
[translations]
|
||||
[translations.fr]
|
||||
title = "Un titre"
|
||||
|
||||
[translations.en]
|
||||
title = "A title"
|
||||
|
||||
"#;
|
||||
|
||||
let config = Config::parse(config);
|
||||
assert!(config.is_ok());
|
||||
let translations = config.unwrap().translations.unwrap();
|
||||
assert_eq!(translations["fr"]["title"].as_str().unwrap(), "Un titre");
|
||||
assert_eq!(translations["en"]["title"].as_str().unwrap(), "A title");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -259,6 +259,7 @@ impl Site {
|
|||
}
|
||||
|
||||
pub fn register_tera_global_fns(&mut self) {
|
||||
self.tera.register_global_function("trans", global_fns::make_trans(self.config.clone()));
|
||||
self.tera.register_global_function("get_page", global_fns::make_get_page(&self.pages));
|
||||
self.tera.register_global_function("get_section", global_fns::make_get_section(&self.sections));
|
||||
self.tera.register_global_function(
|
||||
|
|
|
@ -21,6 +21,21 @@ macro_rules! required_string_arg {
|
|||
};
|
||||
}
|
||||
|
||||
|
||||
pub fn make_trans(config: Config) -> GlobalFn {
|
||||
let translations_config = config.translations.unwrap();
|
||||
let default_lang = to_value(config.default_language.unwrap()).unwrap();
|
||||
|
||||
Box::new(move |args| -> Result<Value> {
|
||||
let key = required_string_arg!(args.get("key"), "`trans` requires a `key` argument.");
|
||||
let lang_arg = args.get("lang").unwrap_or(&default_lang).clone();
|
||||
let lang = from_value::<String>(lang_arg).unwrap();
|
||||
let translations = &translations_config[lang.as_str()];
|
||||
Ok(to_value(&translations[key.as_str()]).unwrap())
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
pub fn make_get_page(all_pages: &HashMap<PathBuf, Page>) -> GlobalFn {
|
||||
let mut pages = HashMap::new();
|
||||
for page in all_pages.values() {
|
||||
|
@ -111,7 +126,7 @@ pub fn make_get_taxonomy_url(tags: Option<Taxonomy>, categories: Option<Taxonomy
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::{make_get_url, make_get_taxonomy_url};
|
||||
use super::{make_get_url, make_get_taxonomy_url, make_trans};
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
|
@ -186,4 +201,33 @@ mod tests {
|
|||
args.insert("name".to_string(), to_value("random").unwrap());
|
||||
assert!(static_fn(args).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn can_translate_a_string() {
|
||||
let trans_config = r#"
|
||||
base_url = "https://remplace-par-ton-url.fr"
|
||||
default_language = "fr"
|
||||
|
||||
[translations]
|
||||
[translations.fr]
|
||||
title = "Un titre"
|
||||
|
||||
[translations.en]
|
||||
title = "A title"
|
||||
|
||||
"#;
|
||||
|
||||
let config = Config::parse(trans_config).unwrap();
|
||||
let static_fn = make_trans(config);
|
||||
let mut args = HashMap::new();
|
||||
|
||||
args.insert("key".to_string(), to_value("title").unwrap());
|
||||
assert_eq!(static_fn(args.clone()).unwrap(), "Un titre");
|
||||
|
||||
args.insert("lang".to_string(), to_value("en").unwrap());
|
||||
assert_eq!(static_fn(args.clone()).unwrap(), "A title");
|
||||
|
||||
args.insert("lang".to_string(), to_value("fr").unwrap());
|
||||
assert_eq!(static_fn(args.clone()).unwrap(), "Un titre");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue