cosmic/
localize.rs

1// SPDX-License-Identifier: GPL-3.0-only
2
3use 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
38// Get the `Localizer` to be used for localizing this library.
39pub 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}