feat: integrate language switcher into settings with modern segment control UI

- Move language switcher from header to settings modal for better organization
- Implement modern segment control UI instead of radio buttons for language selection
- Add language preference persistence in localStorage and backend settings
- Support instant language preview with cancel/revert functionality
- Remove standalone LanguageSwitcher component
- Improve initial language detection logic (localStorage -> browser -> default)
- Add proper i18n keys for language settings UI text
This commit is contained in:
Jason
2025-09-28 22:23:49 +08:00
parent 0bedbb2663
commit c5aa244d65
8 changed files with 157 additions and 38 deletions

View File

@@ -15,6 +15,8 @@ pub struct AppSettings {
pub claude_config_dir: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub codex_config_dir: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
}
fn default_show_in_tray() -> bool {
@@ -32,6 +34,7 @@ impl Default for AppSettings {
minimize_to_tray_on_close: true,
claude_config_dir: None,
codex_config_dir: None,
language: None,
}
}
}
@@ -55,6 +58,13 @@ impl AppSettings {
.map(|s| s.trim())
.filter(|s| !s.is_empty())
.map(|s| s.to_string());
self.language = self
.language
.as_ref()
.map(|s| s.trim())
.filter(|s| matches!(*s, "en" | "zh"))
.map(|s| s.to_string());
}
pub fn load() -> Self {