use whatlang::{detect, Lang};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum TextDirection {
#[default]
Ltr,
Rtl,
}
impl TextDirection {
pub fn as_str(&self) -> &'static str {
match self {
TextDirection::Ltr => "ltr",
TextDirection::Rtl => "rtl",
}
}
}
pub fn detect_language(content: &str) -> (String, TextDirection) {
if let Some(info) = detect(content) {
let lang_code = lang_to_code(info.lang());
let direction = if is_rtl_language(info.lang()) {
TextDirection::Rtl
} else {
TextDirection::Ltr
};
(lang_code.to_string(), direction)
} else {
("en".to_string(), TextDirection::Ltr)
}
}
fn lang_to_code(lang: Lang) -> &'static str {
match lang {
Lang::Ara => "ar",
Lang::Ben => "bn",
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::Por => "pt",
Lang::Rus => "ru",
Lang::Spa => "es",
Lang::Tur => "tr",
Lang::Heb => "he",
Lang::Pes => "fa",
Lang::Urd => "ur",
_ => "en",
}
}
fn is_rtl_language(lang: Lang) -> bool {
matches!(lang, Lang::Ara | Lang::Heb | Lang::Pes | Lang::Urd)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_detect_english() {
let (lang, dir) = detect_language("This is a simple English text for testing.");
assert_eq!(lang, "en");
assert_eq!(dir, TextDirection::Ltr);
}
#[test]
fn test_detect_arabic() {
let (lang, dir) = detect_language("هذا نص عربي للاختبار والتحقق من اللغة");
assert_eq!(lang, "ar");
assert_eq!(dir, TextDirection::Rtl);
}
}