pub fn detect() -> Option<String> {
sys_locale::get_locale().map(|raw| normalise(&raw))
}
fn normalise(code: &str) -> String {
code.split(['_', '-', '.'])
.next()
.unwrap_or(code)
.to_lowercase()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn normalise_handles_common_forms() {
assert_eq!(normalise("nl_NL.UTF-8"), "nl");
assert_eq!(normalise("nl-NL"), "nl");
assert_eq!(normalise("NL"), "nl");
assert_eq!(normalise("en"), "en");
assert_eq!(normalise("pt_BR"), "pt");
assert_eq!(normalise("zh-CN"), "zh");
assert_eq!(normalise(""), "");
}
#[test]
fn detect_returns_two_letter_code_or_none() {
if let Some(c) = detect() {
assert!(c.chars().all(|ch| ch.is_ascii_lowercase()));
assert!(c.len() <= 3, "detect() returned non-language code: {c:?}");
}
}
}