mod keys;
mod translations;
pub use keys::{TextKey, MonthKey, TooltipKey, month_names_short};
pub use translations::Translatable;
use std::sync::atomic::{AtomicU8, Ordering};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[repr(u8)]
pub enum Language {
#[default]
En = 0,
Ru = 1,
}
impl Language {
pub fn from_u8(v: u8) -> Self {
match v {
1 => Language::Ru,
_ => Language::En,
}
}
pub fn code(&self) -> &'static str {
match self {
Language::En => "en",
Language::Ru => "ru",
}
}
pub fn name(&self) -> &'static str {
match self {
Language::En => "English",
Language::Ru => "Russian",
}
}
pub fn native_name(&self) -> &'static str {
match self {
Language::En => "English",
Language::Ru => "Русский",
}
}
pub fn all() -> &'static [Language] {
&[Language::En, Language::Ru]
}
}
static CURRENT_LANGUAGE: AtomicU8 = AtomicU8::new(0);
#[inline]
pub fn current_language() -> Language {
Language::from_u8(CURRENT_LANGUAGE.load(Ordering::Relaxed))
}
#[inline]
pub fn set_language(lang: Language) {
CURRENT_LANGUAGE.store(lang as u8, Ordering::Relaxed);
}
#[inline]
pub fn t(key: TextKey) -> &'static str {
key.get(current_language())
}
#[inline]
pub fn t_tooltip(key: TooltipKey) -> &'static str {
key.get(current_language())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_language_default() {
assert_eq!(Language::default(), Language::En);
}
#[test]
fn test_language_codes() {
assert_eq!(Language::En.code(), "en");
assert_eq!(Language::Ru.code(), "ru");
}
#[test]
fn test_language_names() {
assert_eq!(Language::En.name(), "English");
assert_eq!(Language::Ru.name(), "Russian");
assert_eq!(Language::Ru.native_name(), "Русский");
}
#[test]
fn test_global_language() {
let prev = current_language();
set_language(Language::Ru);
assert_eq!(current_language(), Language::Ru);
set_language(Language::En);
assert_eq!(current_language(), Language::En);
set_language(prev);
}
#[test]
fn test_translation() {
set_language(Language::En);
assert_eq!(t(TextKey::Delete), "Delete");
set_language(Language::Ru);
assert_eq!(t(TextKey::Delete), "Удалить");
set_language(Language::En);
}
#[test]
fn test_tooltip_translation() {
set_language(Language::En);
assert_eq!(t_tooltip(TooltipKey::CloseWindow), "Close window");
set_language(Language::Ru);
assert_eq!(t_tooltip(TooltipKey::CloseWindow), "Закрыть окно");
set_language(Language::En);
}
}