1rust_i18n::i18n!("locales", fallback = "en");
2
3pub fn rule_description(code: &str, default: &str) -> String {
6 let key = format!("rules.{code}.description");
7 let translated = rust_i18n::t!(&key);
8 if translated == key {
10 default.to_string()
11 } else {
12 translated.to_string()
13 }
14}
15
16pub fn rule_explanation(code: &str, default: &str) -> String {
19 let key = format!("rules.{code}.explanation");
20 let translated = rust_i18n::t!(&key);
21 if translated == key {
22 default.to_string()
23 } else {
24 translated.to_string()
25 }
26}
27
28pub fn set_locale(locale: &str) {
30 rust_i18n::set_locale(locale);
31}
32
33pub fn get_locale() -> String {
35 rust_i18n::locale().to_string()
36}
37
38pub fn t(key: &str) -> String {
40 let translated = rust_i18n::t!(key);
41 translated.to_string()
42}
43
44pub fn rule_message(key: &str, params: &[(String, String)], fallback: &str) -> String {
48 if key.is_empty() {
49 return fallback.to_string();
50 }
51 let translated = rust_i18n::t!(key);
52 let translated_str = translated.to_string();
53 if translated_str == key {
55 return fallback.to_string();
56 }
57 let mut result = translated_str;
60 for (k, v) in params {
61 let translated_v = translate_param_value(v);
62 result = result.replace(&format!("%{{{k}}}"), &translated_v);
63 }
64 result
65}
66
67fn translate_param_value(value: &str) -> String {
70 let key = format!("params.{value}");
71 let translated = rust_i18n::t!(&key);
72 let translated_str = translated.to_string();
73 if translated_str == key {
74 value.to_string()
75 } else {
76 translated_str
77 }
78}
79
80#[cfg(test)]
81mod tests {
82 use super::*;
83
84 #[test]
87 fn test_locale_switching() {
88 set_locale("en");
90 assert_eq!(
91 rule_description("LT01", "fallback"),
92 "Inappropriate spacing found."
93 );
94 assert_eq!(t("cli.no_sql_files"), "No SQL files found.");
95
96 set_locale("ja");
98 assert_eq!(
99 rule_description("LT01", "fallback"),
100 "不適切なスペースが見つかりました。"
101 );
102 assert_eq!(t("cli.no_sql_files"), "SQLファイルが見つかりません。");
103
104 set_locale("en");
106 assert_eq!(rule_description("XX99", "my fallback"), "my fallback");
107
108 set_locale("en");
110 }
111}