Skip to main content

rustapi/
i18n.rs

1use i18n_embed::{
2    DesktopLanguageRequester, I18nEmbedError, LanguageLoader,
3    fluent::{FluentLanguageLoader, fluent_language_loader},
4    unic_langid::LanguageIdentifier,
5};
6use lazy_static::lazy_static;
7use rust_embed::RustEmbed;
8
9macro_rules! lang {
10    ($id:tt, $label:tt) => {
11        Language {
12            id: $id,
13            label: $label,
14        }
15    };
16}
17
18#[derive(RustEmbed)]
19#[folder = "i18n/"]
20struct Localizations;
21
22lazy_static! {
23    pub static ref LANGUAGE_LOADER: FluentLanguageLoader = {
24        let loader: FluentLanguageLoader = fluent_language_loader!();
25
26        loader.load_fallback_language(&Localizations).unwrap();
27
28        loader
29    };
30}
31
32pub struct Language {
33    pub id: &'static str,
34    pub label: &'static str,
35}
36
37const_array!(
38    pub LANGUAGES: Language [
39        // lang!("ar", "العربية (Arabic)"),
40        // lang!("de", "Deutsch (German)"),
41        lang!("en", "English (English)"),
42        // lang!("es", "Español (Spanish)"),
43        // lang!("fr", "Français (French)"),
44        // lang!("it", "Italiano (Italian)"),
45        // lang!("ja", "日本語 (Japanese)"),
46        // lang!("ko", "한국어 (Korean)"),
47        // lang!("pt", "Português (Portuguese)"),
48        // lang!("ru", "Русский (Russian)"),
49        lang!("zh_CN", "简体中文 (Simplified Chinese)"),
50        lang!("zh_TW", "繁體中文 (Traditional Chinese)")
51    ]
52);
53
54pub fn select_locales(
55    request_languages: &[&'static str],
56) -> Result<Vec<LanguageIdentifier>, I18nEmbedError> {
57    let requested_languages: Vec<LanguageIdentifier> = request_languages
58        .iter()
59        .filter_map(|raw| raw.parse().ok())
60        .collect();
61
62    i18n_embed::select(&*LANGUAGE_LOADER, &Localizations, &requested_languages)
63}
64
65pub fn select_system_locales() -> Result<Vec<LanguageIdentifier>, I18nEmbedError> {
66    let requested_languages = DesktopLanguageRequester::requested_languages();
67
68    i18n_embed::select(&*LANGUAGE_LOADER, &Localizations, &requested_languages)
69}