use super::language::Language;
pub fn detect_language() -> Language {
let locale = std::env::var("LANG")
.or_else(|_| std::env::var("LC_ALL"))
.or_else(|_| std::env::var("LC_CTYPE"))
.unwrap_or_else(|_| "en_US.UTF-8".to_string());
if locale.starts_with("zh") || locale.contains("zh_CN") || locale.contains("zh_TW") {
Language::Chinese
} else {
Language::English
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_detect_chinese_language() {
let original_lang = std::env::var("LANG").ok();
let original_lc_all = std::env::var("LC_ALL").ok();
let original_lc_ctype = std::env::var("LC_CTYPE").ok();
std::env::set_var("LANG", "zh_CN.UTF-8");
assert_eq!(detect_language(), Language::Chinese);
std::env::set_var("LANG", "zh_TW.UTF-8");
assert_eq!(detect_language(), Language::Chinese);
std::env::set_var("LANG", "zh");
assert_eq!(detect_language(), Language::Chinese);
if let Some(lang) = original_lang {
std::env::set_var("LANG", lang);
} else {
std::env::remove_var("LANG");
}
if let Some(lc_all) = original_lc_all {
std::env::set_var("LC_ALL", lc_all);
} else {
std::env::remove_var("LC_ALL");
}
if let Some(lc_ctype) = original_lc_ctype {
std::env::set_var("LC_CTYPE", lc_ctype);
} else {
std::env::remove_var("LC_CTYPE");
}
}
#[test]
fn test_detect_english_language() {
let original_lang = std::env::var("LANG").ok();
let original_lc_all = std::env::var("LC_ALL").ok();
let original_lc_ctype = std::env::var("LC_CTYPE").ok();
std::env::set_var("LANG", "en_US.UTF-8");
assert_eq!(detect_language(), Language::English);
std::env::set_var("LANG", "en_GB.UTF-8");
assert_eq!(detect_language(), Language::English);
if let Some(lang) = original_lang {
std::env::set_var("LANG", lang);
} else {
std::env::remove_var("LANG");
}
if let Some(lc_all) = original_lc_all {
std::env::set_var("LC_ALL", lc_all);
} else {
std::env::remove_var("LC_ALL");
}
if let Some(lc_ctype) = original_lc_ctype {
std::env::set_var("LC_CTYPE", lc_ctype);
} else {
std::env::remove_var("LC_CTYPE");
}
}
#[test]
fn test_detect_default_language() {
let original_lang = std::env::var("LANG").ok();
let original_lc_all = std::env::var("LC_ALL").ok();
let original_lc_ctype = std::env::var("LC_CTYPE").ok();
std::env::remove_var("LANG");
std::env::remove_var("LC_ALL");
std::env::remove_var("LC_CTYPE");
assert_eq!(detect_language(), Language::English);
if let Some(lang) = original_lang {
std::env::set_var("LANG", lang);
}
if let Some(lc_all) = original_lc_all {
std::env::set_var("LC_ALL", lc_all);
}
if let Some(lc_ctype) = original_lc_ctype {
std::env::set_var("LC_CTYPE", lc_ctype);
}
}
}