Skip to content

Commit 1a1fa61

Browse files
committed
fix(client): normalize settings language selection
1 parent 4a1345c commit 1a1fa61

3 files changed

Lines changed: 30 additions & 5 deletions

File tree

client/src/i18n/language.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export const LANGUAGE_OPTIONS = ["zh", "en"] as const;
2+
3+
export type LanguageOptionCode = (typeof LANGUAGE_OPTIONS)[number];
4+
5+
export function getSelectedLanguageCode(
6+
language: string | undefined,
7+
): LanguageOptionCode | undefined {
8+
const baseLanguage = language?.split(/[-_]/, 1)[0]?.toLowerCase();
9+
return LANGUAGE_OPTIONS.find((code) => baseLanguage === code);
10+
}

client/src/pages/SettingsPage.tsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ import {
1212
import { useEffect, useState } from "react";
1313
import { useTranslation } from "react-i18next";
1414
import { ConfirmDialog } from "@/components/ConfirmDialog.tsx";
15+
import {
16+
getSelectedLanguageCode,
17+
LANGUAGE_OPTIONS,
18+
} from "@/i18n/language.ts";
1519
import { api } from "@/lib/api.ts";
1620
import { useTheme } from "@/providers/useTheme.ts";
1721

@@ -137,10 +141,13 @@ export function SettingsPage() {
137141
setPendingConfig(null);
138142
};
139143

140-
const languages = [
141-
{ code: "zh", label: t("language_name.zh") },
142-
{ code: "en", label: t("language_name.en") },
143-
];
144+
const selectedLanguage = getSelectedLanguageCode(
145+
i18n.resolvedLanguage ?? i18n.language,
146+
);
147+
const languages = LANGUAGE_OPTIONS.map((code) => ({
148+
code,
149+
label: t(`language_name.${code}`),
150+
}));
144151

145152
return (
146153
<div className="p-6 max-w-2xl">
@@ -193,7 +200,7 @@ export function SettingsPage() {
193200
key={code}
194201
onClick={() => i18n.changeLanguage(code)}
195202
className={`px-4 py-2 text-sm border transition-colors ${
196-
i18n.language === code
203+
selectedLanguage === code
197204
? "border-[var(--accent)] text-accent"
198205
: "border-theme text-secondary hover:text-primary"
199206
}`}

client/test/language.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import assert from "node:assert/strict";
2+
import test from "node:test";
3+
import { getSelectedLanguageCode } from "../src/i18n/language.ts";
4+
5+
test("getSelectedLanguageCode maps regional browser language codes to base options", () => {
6+
assert.equal(getSelectedLanguageCode("zh-CN"), "zh");
7+
assert.equal(getSelectedLanguageCode("en-US"), "en");
8+
});

0 commit comments

Comments
 (0)