rust_i18n::i18n!("locales", fallback = "en");
pub fn rule_description(code: &str, default: &str) -> String {
let key = format!("rules.{code}.description");
let translated = rust_i18n::t!(&key);
if translated == key {
default.to_string()
} else {
translated.to_string()
}
}
pub fn rule_explanation(code: &str, default: &str) -> String {
let key = format!("rules.{code}.explanation");
let translated = rust_i18n::t!(&key);
if translated == key {
default.to_string()
} else {
translated.to_string()
}
}
pub fn set_locale(locale: &str) {
rust_i18n::set_locale(locale);
}
pub fn get_locale() -> String {
rust_i18n::locale().to_string()
}
pub fn t(key: &str) -> String {
let translated = rust_i18n::t!(key);
translated.to_string()
}
pub fn rule_message(key: &str, params: &[(String, String)], fallback: &str) -> String {
if key.is_empty() {
return fallback.to_string();
}
let translated = rust_i18n::t!(key);
let translated_str = translated.to_string();
if translated_str == key {
return fallback.to_string();
}
let mut result = translated_str;
for (k, v) in params {
let translated_v = translate_param_value(v);
result = result.replace(&format!("%{{{k}}}"), &translated_v);
}
result
}
fn translate_param_value(value: &str) -> String {
let key = format!("params.{value}");
let translated = rust_i18n::t!(&key);
let translated_str = translated.to_string();
if translated_str == key {
value.to_string()
} else {
translated_str
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_locale_switching() {
set_locale("en");
assert_eq!(
rule_description("LT01", "fallback"),
"Inappropriate spacing found."
);
assert_eq!(t("cli.no_sql_files"), "No SQL files found.");
set_locale("ja");
assert_eq!(
rule_description("LT01", "fallback"),
"不適切なスペースが見つかりました。"
);
assert_eq!(t("cli.no_sql_files"), "SQLファイルが見つかりません。");
set_locale("en");
assert_eq!(rule_description("XX99", "my fallback"), "my fallback");
set_locale("en");
}
}