i18n: add Traditional Chinese (zh-TW)

Add a complete Taiwan Traditional Chinese catalog, locale selection,
Chinese readout formatting, translation notes and regression coverage.
Seed translations from #724 and #652 and adapt the zh-CN catalog.

Co-authored-by: caxer <[email protected]>
Co-authored-by: tbdavid2019 <[email protected]>
Co-authored-by: Enzo Abyie <[email protected]>
Co-authored-by: EDIT-Aeterna <[email protected]>
This commit is contained in:
committed 2026-10-23 22:52:48 +04:00
1 parent 8cdd184a90
commit 6b3e8bada3
16 files changed
+3070 -47

No files matched your search

+6 -4
View File
@@ -8,7 +8,7 @@ export const LOCALE_STORAGE_KEY = 'gev:locale:v1';
export const DEFAULT_LOCALE = 'en';
/** Shipped locales; order does not matter. Adding one: docs/TRANSLATORS.md. */
export const LOCALES = Object.freeze(['en', 'es', 'ru', 'zh-CN']);
export const LOCALES = Object.freeze(['en', 'es', 'ru', 'zh-CN', 'zh-TW']);
/** Each locale named in its own language, for the selector. */
export const LOCALE_NAMES = Object.freeze({
@@ -16,6 +16,7 @@ export const LOCALE_NAMES = Object.freeze({
es: 'Español',
ru: 'Русский',
'zh-CN': '简体中文',
'zh-TW': '繁體中文',
});
/** Right-to-left locales. */
@@ -29,11 +30,12 @@ const RTL_LOCALES = Object.freeze([]);
export function normalizeLocale(candidate) {
if (typeof candidate !== 'string') return null;
const [primary, ...rest] = candidate.trim().toLowerCase().split(/[-_]/);
// Traditional Chinese readers are not given Simplified: no zh-TW yet.
if (primary === 'zh')
if (primary === 'zh') {
if (rest.includes('hans')) return 'zh-CN';
return rest.some((part) => ['hant', 'tw', 'hk', 'mo'].includes(part))
? null
? 'zh-TW'
: 'zh-CN';
}
return LOCALES.includes(primary) ? primary : null;
}