use std::{borrow::Cow, collections::HashMap, sync::LazyLock}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum Language { English, German, } static LANG_TABLES: LazyLock>> = LazyLock::new(|| { let mut k = HashMap::new(); for (lang, source) in [ (Language::English, include_str!("../../locale/en.ini")), (Language::German, include_str!("../../locale/de.ini")), ] { let tr_map = source .lines() .filter_map(|line| { let (key, value) = line.split_once("=")?; Some((key.trim(), value.trim())) }) .collect::>(); k.insert(lang, tr_map); } k }); pub fn tr(lang: Language, key: &str, args: &[(&str, &str)]) -> Cow<'static, str> { let tr_map = LANG_TABLES.get(&lang).unwrap(); match tr_map.get(key) { Some(value) => { if args.is_empty() { Cow::Borrowed(value) } else { let mut s = value.to_string(); for (k, v) in args { s = s.replace(&format!("{{{k}}}"), v) } Cow::Owned(s) } } None => Cow::Owned(format!("TR[{key}]")), } }