use i18n_embed::fluent::{FluentLanguageLoader, fluent_language_loader};
use i18n_embed::{DesktopLanguageRequester, LanguageLoader};
use rust_embed::RustEmbed;
use std::sync::LazyLock;
#[derive(RustEmbed)]
#[folder = "i18n/"]
struct Localizations;
pub static LOADER: LazyLock<FluentLanguageLoader> = LazyLock::new(|| {
let loader = fluent_language_loader!();
loader
.load_fallback_language(&Localizations)
.expect("fallback language must be present");
loader.set_use_isolating(false);
loader
});
pub fn init() {
let requested = DesktopLanguageRequester::requested_languages();
let _ = i18n_embed::select(&*LOADER, &Localizations, &requested);
}
#[macro_export]
macro_rules! tr {
($id:literal) => { i18n_embed_fl::fl!($crate::i18n::LOADER, $id) };
($id:literal, $($args:tt)*) => { i18n_embed_fl::fl!($crate::i18n::LOADER, $id, $($args)*) };
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_catalog_loads() {
let loader = fluent_language_loader!();
let langs = loader
.available_languages(&Localizations)
.expect("list languages");
assert!(
langs.len() >= 13,
"expected ≥13 languages, got {}",
langs.len()
);
for lang in langs {
loader
.load_languages(&Localizations, &[lang.clone()])
.unwrap_or_else(|e| panic!("catalog {lang} failed to load: {e}"));
}
}
}