notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 419102959f652b1855b26014b415557a359614f0
parent 9bcbcae688ba0d3c6c5fd419d50c3b82b7ff0bef
Author: Terry Yiu <git@tyiu.xyz>
Date:   Thu, 24 Jul 2025 23:33:04 -0400

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>

Diffstat:
Mcrates/notedeck/src/i18n/manager.rs | 31++++++++++++++++++++++++++++++-
Mcrates/notedeck_columns/src/ui/settings.rs | 23+++++++++++++++++++----
2 files changed, 49 insertions(+), 5 deletions(-)

diff --git a/crates/notedeck/src/i18n/manager.rs b/crates/notedeck/src/i18n/manager.rs @@ -5,8 +5,8 @@ use std::borrow::Cow; use std::collections::HashMap; use unic_langid::{langid, LanguageIdentifier}; -const EN_XA: LanguageIdentifier = langid!("en-XA"); const EN_US: LanguageIdentifier = langid!("en-US"); +const EN_XA: LanguageIdentifier = langid!("en-XA"); const DE: LanguageIdentifier = langid!("de"); const ES_419: LanguageIdentifier = langid!("es-419"); 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 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 { identifier: LanguageIdentifier, ftl: &'static str, @@ -70,6 +80,8 @@ pub struct Localization { available_locales: Vec<LanguageIdentifier>, /// Fallback locale fallback_locale: LanguageIdentifier, + /// Native names for locales + locale_native_names: HashMap<LanguageIdentifier, String>, /// Cached string results per locale (only for strings without arguments) string_cache: HashMap<LanguageIdentifier, HashMap<String, String>>, @@ -100,10 +112,23 @@ impl Default for Localization { 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 { current_locale: default_locale.to_owned(), available_locales, fallback_locale, + locale_native_names, use_isolating: true, normalized_key_cache: HashMap::new(), string_cache: HashMap::new(), @@ -391,6 +416,10 @@ impl Localization { &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 pub fn get_cache_stats(&self) -> Result<CacheStats, Box<dyn std::error::Error + Send + Sync>> { let mut total_strings = 0; diff --git a/crates/notedeck_columns/src/ui/settings.rs b/crates/notedeck_columns/src/ui/settings.rs @@ -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> { let id = ui.id(); let mut action = None; @@ -190,19 +202,22 @@ impl<'a> SettingsView<'a> { .text_style(NotedeckTextStyle::Small.text_style()), ); ComboBox::from_label("") - .selected_text(self.selected_language.to_owned()) + .selected_text(self.get_selected_language_name()) .show_ui(ui, |ui| { 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 .selectable_value( self.selected_language, lang.to_string(), - lang.to_string(), + &name, ) .clicked() { - action = - Some(SettingsAction::SetLocale(lang.to_owned())) + action = Some(SettingsAction::SetLocale(lang.to_owned())) } } })