fix(ui): localize language selector and validate stored locale

- Add translation keys for language selector label and language names
   - Update all locale files (en, pt-BR, zh-CN, zh-TW) with:
     - overview.access.language key for selector label
     - languages.* keys for language display names
   - Localize language selector in overview.ts to react to locale changes
   - Add validation for stored locale in app.ts to prevent invalid values
     from causing silent failures in setLocale

   Fixes issues identified in code review:
   - Unlocalized language selector inconsistency
   - Settings locale type drift risk
This commit is contained in:
Jadilson Guedes
2026-02-16 16:20:39 -03:00
committed by Peter Steinberger
parent a9c952b13a
commit cf44a0c4c1
5 changed files with 33 additions and 5 deletions

View File

@@ -59,6 +59,7 @@ export const en: TranslationMap = {
token: "Gateway Token",
password: "Password (not stored)",
sessionKey: "Default Session Key",
language: "Language",
connectHint: "Click Connect to apply connection changes.",
},
snapshot: {
@@ -104,4 +105,10 @@ export const en: TranslationMap = {
focusToggle: "Toggle focus mode (hide sidebar + page header)",
onboardingDisabled: "Disabled during onboarding",
},
languages: {
en: "English",
zhCN: "简体中文 (Simplified Chinese)",
zhTW: "繁體中文 (Traditional Chinese)",
ptBR: "Português (Brazilian Portuguese)",
},
};

View File

@@ -59,6 +59,7 @@ export const pt_BR: TranslationMap = {
token: "Token do Gateway",
password: "Senha (não armazenada)",
sessionKey: "Chave de Sessão Padrão",
language: "Idioma",
connectHint: "Clique em Conectar para aplicar as alterações de conexão.",
},
snapshot: {
@@ -104,4 +105,10 @@ export const pt_BR: TranslationMap = {
focusToggle: "Alternar modo de foco (ocultar barra lateral + cabeçalho da página)",
onboardingDisabled: "Desativado durante a integração",
},
languages: {
en: "English",
zhCN: "简体中文 (Chinês Simplificado)",
zhTW: "繁體中文 (Chinês Tradicional)",
ptBR: "Português (Português Brasileiro)",
},
};

View File

@@ -59,6 +59,7 @@ export const zh_CN: TranslationMap = {
token: "网关令牌",
password: "密码 (不存储)",
sessionKey: "默认会话密钥",
language: "语言",
connectHint: "点击连接以应用连接更改。",
},
snapshot: {
@@ -104,4 +105,10 @@ export const zh_CN: TranslationMap = {
focusToggle: "切换专注模式 (隐藏侧边栏 + 页面页眉)",
onboardingDisabled: "引导期间禁用",
},
languages: {
en: "English",
zhCN: "简体中文 (简体中文)",
zhTW: "繁體中文 (繁体中文)",
ptBR: "Português (巴西葡萄牙语)",
},
};

View File

@@ -55,6 +55,7 @@ export const zh_TW: TranslationMap = {
token: "網關令牌",
password: "密碼 (不存儲)",
sessionKey: "默認會話密鑰",
language: "語言",
connectHint: "點擊連接以應用連接更改。",
},
snapshot: {
@@ -100,4 +101,10 @@ export const zh_TW: TranslationMap = {
focusToggle: "切換專注模式 (隱藏側邊欄 + 頁面頁眉)",
onboardingDisabled: "引導期間禁用",
},
languages: {
en: "English",
zhCN: "简体中文 (簡體中文)",
zhTW: "繁體中文 (繁體中文)",
ptBR: "Português (巴西葡萄牙語)",
},
};

View File

@@ -165,7 +165,7 @@ export function renderOverview(props: OverviewProps) {
/>
</label>
<label class="field">
<span>Language</span>
<span>${t("overview.access.language")}</span>
<select
.value=${currentLocale}
@change=${(e: Event) => {
@@ -174,10 +174,10 @@ export function renderOverview(props: OverviewProps) {
props.onSettingsChange({ ...props.settings, locale: v });
}}
>
<option value="en">English</option>
<option value="zh-CN">简体中文 (Simplified Chinese)</option>
<option value="zh-TW">繁體中文 (Traditional Chinese)</option>
<option value="pt-BR">Português (Brazilian Portuguese)</option>
<option value="en">${t("languages.en")}</option>
<option value="zh-CN">${t("languages.zhCN")}</option>
<option value="zh-TW">${t("languages.zhTW")}</option>
<option value="pt-BR">${t("languages.ptBR")}</option>
</select>
</label>
</div>