use whichlang::{detect_language, Lang};
fn lang_to_iso_639_1(lang: Lang) -> &'static str {
match lang {
Lang::Ara => "ar",
Lang::Cmn => "zh", Lang::Deu => "de",
Lang::Eng => "en",
Lang::Fra => "fr",
Lang::Hin => "hi",
Lang::Ita => "it",
Lang::Jpn => "ja",
Lang::Kor => "ko",
Lang::Nld => "nl",
Lang::Por => "pt",
Lang::Rus => "ru",
Lang::Spa => "es",
Lang::Swe => "sv",
Lang::Tur => "tr",
Lang::Vie => "vi",
}
}
pub fn detect_lang(text: &str) -> Option<String> {
if text.trim().is_empty() {
return None;
}
Some(lang_to_iso_639_1(detect_language(text)).to_string())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn detects_english_sentence() {
assert_eq!(
detect_lang("The quick brown fox jumps over the lazy dog."),
Some("en".to_string())
);
}
#[test]
fn detects_french_accented_sentence() {
assert_eq!(
detect_lang("Bonjour, comment allez-vous aujourd'hui ? J'espère que tout va bien."),
Some("fr".to_string())
);
}
#[test]
fn detects_french_without_accents() {
assert_eq!(
detect_lang("Salut ca va bien merci et toi comment vas tu aujourd hui"),
Some("fr".to_string())
);
}
#[test]
fn detects_simple_greeting() {
assert_eq!(
detect_lang("Bonjour tout le monde, je suis ravi de vous voir"),
Some("fr".to_string())
);
}
#[test]
fn empty_input_yields_none() {
assert_eq!(detect_lang(""), None);
assert_eq!(detect_lang(" \n\t "), None);
}
#[test]
fn maps_every_whichlang_variant_to_two_letters() {
for lang in [
Lang::Ara,
Lang::Cmn,
Lang::Deu,
Lang::Eng,
Lang::Fra,
Lang::Hin,
Lang::Ita,
Lang::Jpn,
Lang::Kor,
Lang::Nld,
Lang::Por,
Lang::Rus,
Lang::Spa,
Lang::Swe,
Lang::Tur,
Lang::Vie,
] {
let code = lang_to_iso_639_1(lang);
assert_eq!(code.len(), 2, "{:?} -> {}", lang, code);
assert!(
code.chars().all(|c| c.is_ascii_lowercase()),
"{:?} -> {}",
lang,
code
);
}
}
}