Add human-readable names to locales in settings
Changelog-Added: Added human-readable names to locales in settings Signed-off-by: Terry Yiu <git@tyiu.xyz>
This commit is contained in:
@@ -5,8 +5,8 @@ use std::borrow::Cow;
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use unic_langid::{langid, LanguageIdentifier};
|
use unic_langid::{langid, LanguageIdentifier};
|
||||||
|
|
||||||
const EN_XA: LanguageIdentifier = langid!("en-XA");
|
|
||||||
const EN_US: LanguageIdentifier = langid!("en-US");
|
const EN_US: LanguageIdentifier = langid!("en-US");
|
||||||
|
const EN_XA: LanguageIdentifier = langid!("en-XA");
|
||||||
const DE: LanguageIdentifier = langid!("de");
|
const DE: LanguageIdentifier = langid!("de");
|
||||||
const ES_419: LanguageIdentifier = langid!("es-419");
|
const ES_419: LanguageIdentifier = langid!("es-419");
|
||||||
const ES_ES: LanguageIdentifier = langid!("es-ES");
|
const ES_ES: LanguageIdentifier = langid!("es-ES");
|
||||||
@@ -16,6 +16,16 @@ const ZH_CN: LanguageIdentifier = langid!("ZH_CN");
|
|||||||
const ZH_TW: LanguageIdentifier = langid!("ZH_TW");
|
const ZH_TW: LanguageIdentifier = langid!("ZH_TW");
|
||||||
const NUM_FTLS: usize = 9;
|
const NUM_FTLS: usize = 9;
|
||||||
|
|
||||||
|
const EN_US_NATIVE_NAME: &str = "English (US)";
|
||||||
|
const EN_XA_NATIVE_NAME: &str = "Éñglísh (Pséúdólóçàlé)";
|
||||||
|
const DE_NATIVE_NAME: &str = "Deutsch";
|
||||||
|
const ES_419_NATIVE_NAME: &str = "Español (Latinoamérica)";
|
||||||
|
const ES_ES_NATIVE_NAME: &str = "Español (España)";
|
||||||
|
const FR_NATIVE_NAME: &str = "Français";
|
||||||
|
const TH_NATIVE_NAME: &str = "ภาษาไทย";
|
||||||
|
const ZH_CN_NATIVE_NAME: &str = "简体中文";
|
||||||
|
const ZH_TW_NATIVE_NAME: &str = "繁體中文";
|
||||||
|
|
||||||
struct StaticBundle {
|
struct StaticBundle {
|
||||||
identifier: LanguageIdentifier,
|
identifier: LanguageIdentifier,
|
||||||
ftl: &'static str,
|
ftl: &'static str,
|
||||||
@@ -70,6 +80,8 @@ pub struct Localization {
|
|||||||
available_locales: Vec<LanguageIdentifier>,
|
available_locales: Vec<LanguageIdentifier>,
|
||||||
/// Fallback locale
|
/// Fallback locale
|
||||||
fallback_locale: LanguageIdentifier,
|
fallback_locale: LanguageIdentifier,
|
||||||
|
/// Native names for locales
|
||||||
|
locale_native_names: HashMap<LanguageIdentifier, String>,
|
||||||
|
|
||||||
/// Cached string results per locale (only for strings without arguments)
|
/// Cached string results per locale (only for strings without arguments)
|
||||||
string_cache: HashMap<LanguageIdentifier, HashMap<String, String>>,
|
string_cache: HashMap<LanguageIdentifier, HashMap<String, String>>,
|
||||||
@@ -100,10 +112,23 @@ impl Default for Localization {
|
|||||||
ZH_TW.clone(),
|
ZH_TW.clone(),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
let locale_native_names = HashMap::from([
|
||||||
|
(EN_US, EN_US_NATIVE_NAME.to_owned()),
|
||||||
|
(EN_XA, EN_XA_NATIVE_NAME.to_owned()),
|
||||||
|
(DE, DE_NATIVE_NAME.to_owned()),
|
||||||
|
(ES_419, ES_419_NATIVE_NAME.to_owned()),
|
||||||
|
(ES_ES, ES_ES_NATIVE_NAME.to_owned()),
|
||||||
|
(FR, FR_NATIVE_NAME.to_owned()),
|
||||||
|
(TH, TH_NATIVE_NAME.to_owned()),
|
||||||
|
(ZH_CN, ZH_CN_NATIVE_NAME.to_owned()),
|
||||||
|
(ZH_TW, ZH_TW_NATIVE_NAME.to_owned()),
|
||||||
|
]);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
current_locale: default_locale.to_owned(),
|
current_locale: default_locale.to_owned(),
|
||||||
available_locales,
|
available_locales,
|
||||||
fallback_locale,
|
fallback_locale,
|
||||||
|
locale_native_names,
|
||||||
use_isolating: true,
|
use_isolating: true,
|
||||||
normalized_key_cache: HashMap::new(),
|
normalized_key_cache: HashMap::new(),
|
||||||
string_cache: HashMap::new(),
|
string_cache: HashMap::new(),
|
||||||
@@ -391,6 +416,10 @@ impl Localization {
|
|||||||
&self.fallback_locale
|
&self.fallback_locale
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_locale_native_name(&self, locale: &LanguageIdentifier) -> Option<&str> {
|
||||||
|
self.locale_native_names.get(locale).map(|s| s.as_str())
|
||||||
|
}
|
||||||
|
|
||||||
/// Gets cache statistics for monitoring performance
|
/// Gets cache statistics for monitoring performance
|
||||||
pub fn get_cache_stats(&self) -> Result<CacheStats, Box<dyn std::error::Error + Send + Sync>> {
|
pub fn get_cache_stats(&self) -> Result<CacheStats, Box<dyn std::error::Error + Send + Sync>> {
|
||||||
let mut total_strings = 0;
|
let mut total_strings = 0;
|
||||||
|
|||||||
@@ -103,6 +103,18 @@ impl<'a> SettingsView<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the localized name for a language identifier
|
||||||
|
fn get_selected_language_name(&mut self) -> String {
|
||||||
|
if let Ok(lang_id) = self.selected_language.parse::<LanguageIdentifier>() {
|
||||||
|
self.i18n
|
||||||
|
.get_locale_native_name(&lang_id)
|
||||||
|
.map(|s| s.to_owned())
|
||||||
|
.unwrap_or_else(|| lang_id.to_string())
|
||||||
|
} else {
|
||||||
|
self.selected_language.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn ui(&mut self, ui: &mut egui::Ui) -> Option<SettingsAction> {
|
pub fn ui(&mut self, ui: &mut egui::Ui) -> Option<SettingsAction> {
|
||||||
let id = ui.id();
|
let id = ui.id();
|
||||||
let mut action = None;
|
let mut action = None;
|
||||||
@@ -190,19 +202,22 @@ impl<'a> SettingsView<'a> {
|
|||||||
.text_style(NotedeckTextStyle::Small.text_style()),
|
.text_style(NotedeckTextStyle::Small.text_style()),
|
||||||
);
|
);
|
||||||
ComboBox::from_label("")
|
ComboBox::from_label("")
|
||||||
.selected_text(self.selected_language.to_owned())
|
.selected_text(self.get_selected_language_name())
|
||||||
.show_ui(ui, |ui| {
|
.show_ui(ui, |ui| {
|
||||||
for lang in self.i18n.get_available_locales() {
|
for lang in self.i18n.get_available_locales() {
|
||||||
|
let name = self.i18n
|
||||||
|
.get_locale_native_name(lang)
|
||||||
|
.map(|s| s.to_owned())
|
||||||
|
.unwrap_or_else(|| lang.to_string());
|
||||||
if ui
|
if ui
|
||||||
.selectable_value(
|
.selectable_value(
|
||||||
self.selected_language,
|
self.selected_language,
|
||||||
lang.to_string(),
|
lang.to_string(),
|
||||||
lang.to_string(),
|
&name,
|
||||||
)
|
)
|
||||||
.clicked()
|
.clicked()
|
||||||
{
|
{
|
||||||
action =
|
action = Some(SettingsAction::SetLocale(lang.to_owned()))
|
||||||
Some(SettingsAction::SetLocale(lang.to_owned()))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user