Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions ui/desktop/src/components/settings/app/AppSettingsSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,17 @@ const i18n = defineMessages({
languageJapanese: { id: 'settings.language.japanese', defaultMessage: 'Japanese' },
languageSpanish: { id: 'settings.language.spanish', defaultMessage: 'Spanish' },
languageKorean: { id: 'settings.language.korean', defaultMessage: 'Korean' },
languageFrench: { id: 'settings.language.french', defaultMessage: 'French' },
languageGerman: { id: 'settings.language.german', defaultMessage: 'German' },
languageItalian: { id: 'settings.language.italian', defaultMessage: 'Italian' },
languagePortuguese: { id: 'settings.language.portuguese', defaultMessage: 'Portuguese' },
languageIndonesian: { id: 'settings.language.indonesian', defaultMessage: 'Indonesian' },
languageMalay: { id: 'settings.language.malay', defaultMessage: 'Malay' },
languageVietnamese: { id: 'settings.language.vietnamese', defaultMessage: 'Vietnamese' },
languageChineseTraditional: {
id: 'settings.language.zhTW',
defaultMessage: 'Chinese (Traditional)',
},
helpTitle: { id: 'settings.help.title', defaultMessage: 'Help & feedback' },
helpDesc: {
id: 'settings.help.description',
Expand Down Expand Up @@ -147,12 +158,20 @@ const LANGUAGE_OPTIONS: Array<{ value: LanguageSetting; message: keyof typeof i1
{ value: 'system', message: 'languageSystem' },
{ value: 'en', message: 'languageEnglish' },
{ value: 'es', message: 'languageSpanish' },
{ value: 'fr', message: 'languageFrench' },
{ value: 'de', message: 'languageGerman' },
{ value: 'it', message: 'languageItalian' },
{ value: 'pt', message: 'languagePortuguese' },
{ value: 'id', message: 'languageIndonesian' },
{ value: 'ms', message: 'languageMalay' },
{ value: 'vi', message: 'languageVietnamese' },
{ value: 'hi', message: 'languageHindi' },
{ value: 'ja', message: 'languageJapanese' },
{ value: 'ko', message: 'languageKorean' },
{ value: 'ru', message: 'languageRussian' },
{ value: 'tr', message: 'languageTurkish' },
{ value: 'zh-CN', message: 'languageChineseSimplified' },
{ value: 'zh-TW', message: 'languageChineseTraditional' },
];

interface AppSettingsSectionProps {
Expand Down
17 changes: 11 additions & 6 deletions ui/desktop/src/i18n/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,30 @@
* 3. "en" (fallback)
*
* For Chinese: any Simplified Chinese tag (zh, zh-CN, zh-Hans, zh-Hans-CN, zh-SG, zh-MY)
* maps to the "zh-CN" catalog. Traditional variants (zh-TW, zh-HK, zh-Hant) are not yet
* translated and fall through to English.
* maps to the "zh-CN" catalog; Traditional variants (zh-TW, zh-HK, zh-MO, zh-Hant) map to
* the "zh-TW" catalog.
*/

// Re-export react-intl utilities that components use directly
export { defineMessages, useIntl } from 'react-intl';

/** The set of locales that have translation catalogs. */
export const SUPPORTED_LOCALES = ['en', 'es', 'hi', 'ja', 'ko', 'ru', 'tr', 'zh-CN'] as const;
// prettier-ignore
export const SUPPORTED_LOCALES = [
'en', 'es', 'fr', 'de', 'it', 'pt', 'id', 'ms', 'vi', 'hi', 'ja', 'ko', 'ru', 'tr', 'zh-CN', 'zh-TW',
] as const;
export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];
const SUPPORTED_LOCALE_SET = new Set<string>(SUPPORTED_LOCALES);

/**
* Map Simplified Chinese aliases (zh, zh-Hans*, zh-SG, zh-MY) to "zh-CN".
* Traditional variants (zh-Hant*, zh-TW, zh-HK, zh-MO) and non-Chinese tags pass through unchanged.
* Map Simplified Chinese aliases (zh, zh-Hans*, zh-SG, zh-MY) to "zh-CN" and Traditional
* variants (zh-Hant*, zh-TW, zh-HK, zh-MO) to "zh-TW". Non-Chinese tags pass through unchanged.
*/
function resolveChineseAlias(tag: string): string {
const lower = tag.toLowerCase();
if (/^zh-(hant|tw|hk|mo)(-|$)/.test(lower)) return tag;
// Traditional Chinese variants (zh-Hant*, zh-TW, zh-HK, zh-MO) → "zh-TW".
if (/^zh-(hant|tw|hk|mo)(-|$)/.test(lower)) return 'zh-TW';
// Remaining Chinese tags (zh, zh-CN, zh-Hans*, zh-SG, zh-MY) → "zh-CN".
if (lower === 'zh' || lower.startsWith('zh-')) return 'zh-CN';
return tag;
}
Expand Down
Loading
Loading