Files
Cli-Proxy-API-Management-Ce…/src/utils/language.ts
T
lmanchu 30f14500c8 feat(i18n): add Traditional Chinese (Taiwan) locale
Add zh-TW as a new supported language, covering all 1500+ translation keys
with Taiwan-standard terminology and phrasing.

Changes:
- src/i18n/locales/zh-TW.json: new file, full Traditional Chinese translation
- src/i18n/index.ts: import and register zh-TW locale
- src/types/common.ts: add 'zh-TW' to Language union type
- src/utils/constants.ts: add zh-TW to LANGUAGE_ORDER and LANGUAGE_LABEL_KEYS
- src/utils/language.ts: add zh-tw/zh-hant browser locale detection
- src/i18n/locales/*.json: add chinese_tw label key to all locales

Co-authored-by: lmanchu <lman.chu@gmail.com>
2026-04-12 14:15:46 +08:00

50 lines
1.4 KiB
TypeScript

import type { Language } from '@/types';
import { STORAGE_KEY_LANGUAGE, SUPPORTED_LANGUAGES } from '@/utils/constants';
export const isSupportedLanguage = (value: string): value is Language =>
SUPPORTED_LANGUAGES.includes(value as Language);
const parseStoredLanguage = (value: string): Language | null => {
try {
const parsed = JSON.parse(value);
const candidate = parsed?.state?.language ?? parsed?.language ?? parsed;
if (typeof candidate === 'string' && isSupportedLanguage(candidate)) {
return candidate;
}
} catch {
if (isSupportedLanguage(value)) {
return value;
}
}
return null;
};
const getStoredLanguage = (): Language | null => {
if (typeof window === 'undefined') {
return null;
}
try {
const stored = localStorage.getItem(STORAGE_KEY_LANGUAGE);
if (!stored) {
return null;
}
return parseStoredLanguage(stored);
} catch {
return null;
}
};
const getBrowserLanguage = (): Language => {
if (typeof navigator === 'undefined') {
return 'zh-CN';
}
const raw = navigator.languages?.[0] || navigator.language || 'zh-CN';
const lower = raw.toLowerCase();
if (lower.startsWith('zh-tw') || lower.startsWith('zh-hant')) return 'zh-TW';
if (lower.startsWith('zh')) return 'zh-CN';
if (lower.startsWith('ru')) return 'ru';
return 'en';
};
export const getInitialLanguage = (): Language => getStoredLanguage() ?? getBrowserLanguage();