use std::process::Command;
pub fn detect_system_language() -> String {
if let Ok(lang) = std::env::var("LANG") {
if lang.starts_with("zh") {
return "zh".to_string();
} else if lang.starts_with("en") {
return "en".to_string();
}
}
if let Ok(lang) = std::env::var("LC_ALL") {
if lang.starts_with("zh") {
return "zh".to_string();
} else if lang.starts_with("en") {
return "en".to_string();
}
}
if let Ok(lang) = std::env::var("LC_CTYPE") {
if lang.starts_with("zh") {
return "zh".to_string();
} else if lang.starts_with("en") {
return "en".to_string();
}
}
if let Ok(lang) = std::env::var("LANGUAGE") {
if let Some(first_lang) = lang.split(':').next() {
if first_lang.starts_with("zh") {
return "zh".to_string();
} else if first_lang.starts_with("en") {
return "en".to_string();
}
}
}
if let Ok(output) = Command::new("defaults")
.args(["read", "-g", "AppleLanguages"])
.output()
{
if let Ok(lang_str) = String::from_utf8(output.stdout) {
if lang_str.contains("zh") {
return "zh".to_string();
}
}
}
"en".to_string()
}
#[derive(Debug, Clone)]
pub struct LocalizedStrings {
pub banner: String,
pub steps_count: String,
pub update_complete: String,
pub time_taken: String,
pub no_updates: String,
pub actions_executed: String,
pub already_latest: String,
}
impl LocalizedStrings {
pub fn new(lang: &str) -> Self {
match lang {
"zh" => Self {
banner: "开始 devtool 更新:".to_string(),
steps_count: "将执行 {} 个步骤:".to_string(),
update_complete: "更新完成:".to_string(),
time_taken: "耗时".to_string(),
no_updates: "无更新应用。".to_string(),
actions_executed: "已执行动作:".to_string(),
already_latest: "已是最新:".to_string(),
},
_ => Self {
banner: "Starting devtool update: ".to_string(),
steps_count: "Will execute {} steps:".to_string(),
update_complete: "Update completed: ".to_string(),
time_taken: "Time taken".to_string(),
no_updates: "No updates applied.".to_string(),
actions_executed: "Actions executed: ".to_string(),
already_latest: "Already latest: ".to_string(),
},
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_detect_system_language() {
let lang = detect_system_language();
assert!(lang == "zh" || lang == "en");
}
#[test]
fn test_localized_strings_zh() {
let strings = LocalizedStrings::new("zh");
assert!(strings.banner.contains("开始"));
assert!(strings.update_complete.contains("完成"));
}
#[test]
fn test_localized_strings_en() {
let strings = LocalizedStrings::new("en");
assert!(strings.banner.contains("Starting"));
assert!(strings.update_complete.contains("completed"));
}
}