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!("en", "English (English)"),
42 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}