Skip to main content

codex_helper_tui/tui/
i18n.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2pub enum Language {
3    Zh,
4    En,
5}
6
7pub fn parse_language(s: &str) -> Option<Language> {
8    let s = s.trim().to_ascii_lowercase();
9    if s.is_empty() {
10        return None;
11    }
12    match s.as_str() {
13        "zh" | "zh-cn" | "zh_cn" | "zh-hans" | "zh_hans" | "cn" | "chinese" | "中文" => {
14            Some(Language::Zh)
15        }
16        "en" | "en-us" | "en_us" | "english" => Some(Language::En),
17        _ => None,
18    }
19}
20
21pub fn detect_system_language() -> Language {
22    // Best-effort: prefer env vars to avoid platform-specific commands.
23    // Common values:
24    // - LANG=zh_CN.UTF-8
25    // - LC_ALL=zh_CN.UTF-8
26    // - LANGUAGE=zh_CN:en_US
27    for key in ["LC_ALL", "LC_MESSAGES", "LANGUAGE", "LANG"] {
28        if let Ok(v) = std::env::var(key) {
29            let v = v.trim().to_ascii_lowercase();
30            if v.starts_with("zh") || v.contains("zh_cn") || v.contains("zh-cn") {
31                return Language::Zh;
32            }
33            if v.starts_with("en") {
34                return Language::En;
35            }
36        }
37    }
38    Language::En
39}
40
41pub(crate) fn pick<'a>(lang: Language, zh: &'a str, en: &'a str) -> &'a str {
42    match lang {
43        Language::Zh => zh,
44        Language::En => en,
45    }
46}