1use i18n_embed::{
4 DefaultLocalizer, LanguageLoader, Localizer,
5 fluent::{FluentLanguageLoader, fluent_language_loader},
6};
7use rust_embed::RustEmbed;
8use std::sync::{LazyLock, OnceLock};
9
10#[derive(RustEmbed)]
11#[folder = "i18n/"]
12struct Localizations;
13
14pub static LANGUAGE_LOADER: LazyLock<FluentLanguageLoader> = LazyLock::new(|| {
15 let loader: FluentLanguageLoader = fluent_language_loader!();
16
17 loader
18 .load_fallback_language(&Localizations)
19 .expect("Error while loading fallback language");
20
21 loader
22});
23
24static LOCALIZATION_INITIALIZED: OnceLock<()> = OnceLock::new();
25
26#[macro_export]
27macro_rules! fl {
28 ($message_id:literal) => {{
29 $crate::localize::localize();
30 i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id)
31 }};
32 ($message_id:literal, $($args:expr),*) => {{
33 $crate::localize::localize();
34 i18n_embed_fl::fl!($crate::localize::LANGUAGE_LOADER, $message_id, $($args), *)
35 }};
36}
37
38pub fn localizer() -> Box<dyn Localizer> {
40 Box::from(DefaultLocalizer::new(&*LANGUAGE_LOADER, &Localizations))
41}
42
43pub fn localize() {
44 LOCALIZATION_INITIALIZED.get_or_init(|| {
45 let localizer = localizer();
46 let requested_languages = i18n_embed::DesktopLanguageRequester::requested_languages();
47 if let Err(error) = localizer.select(&requested_languages) {
48 eprintln!("Error while loading language for libcosmic {}", error);
49 }
50 });
51}