use std::sync::atomic::{AtomicU8, Ordering};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Lang {
Fr,
En,
}
impl Lang {
pub fn code(self) -> &'static str {
match self {
Lang::Fr => "fr",
Lang::En => "en",
}
}
pub fn of_code(code: &str) -> Lang {
if code.trim().eq_ignore_ascii_case("en") {
Lang::En
} else {
Lang::Fr
}
}
}
static UI: AtomicU8 = AtomicU8::new(0);
pub fn ui() -> Lang {
match UI.load(Ordering::Relaxed) {
1 => Lang::En,
_ => Lang::Fr,
}
}
pub fn set_ui(lang: Lang) {
UI.store(u8::from(lang == Lang::En), Ordering::Relaxed);
}
pub fn from_env() {
if let Ok(code) = std::env::var("ESCOUADE_LANG") {
set_ui(Lang::of_code(&code));
}
}
pub fn from_greeting() {
let said = escouade_plugin_protocol::greeting().and_then(|g| g.lang.as_deref());
if let Some(code) = said {
set_ui(Lang::of_code(code));
}
}
#[macro_export]
macro_rules! tr_in {
($lang:expr, $fr:literal, $en:literal $(,)?) => {
match $lang {
$crate::i18n::Lang::Fr => format!($fr),
$crate::i18n::Lang::En => format!($en),
}
};
($lang:expr, $fr:literal, $en:literal, $($args:tt)+) => {
match $lang {
$crate::i18n::Lang::Fr => format!($fr, $($args)+),
$crate::i18n::Lang::En => format!($en, $($args)+),
}
};
}
#[macro_export]
macro_rules! tr {
($fr:literal, $en:literal $(, $($args:tt)+)?) => {
$crate::tr_in!($crate::i18n::ui(), $fr, $en $(, $($args)+)?)
};
}