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:
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()))
}
}
})