feat(i18n): add fr, de, it, pt, id, ms, vi, zh-TW desktop locales (#10072)

Co-authored-by: Yixuan Zhong <Yixuan.Zhong@aecom.com>
This commit is contained in:
Yixuan Zhong
2026-06-29 00:33:11 +08:00
committed by GitHub
parent 52291e64a7
commit 9ff7376338
20 changed files with 36826 additions and 7 deletions
@@ -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',
@@ -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 {
+11 -6
View File
@@ -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;
}
File diff suppressed because it is too large Load Diff
+24
View File
@@ -3887,15 +3887,33 @@
"settings.language.english": {
"defaultMessage": "English"
},
"settings.language.french": {
"defaultMessage": "French"
},
"settings.language.german": {
"defaultMessage": "German"
},
"settings.language.hindi": {
"defaultMessage": "Hindi"
},
"settings.language.indonesian": {
"defaultMessage": "Indonesian"
},
"settings.language.italian": {
"defaultMessage": "Italian"
},
"settings.language.japanese": {
"defaultMessage": "Japanese"
},
"settings.language.korean": {
"defaultMessage": "Korean"
},
"settings.language.malay": {
"defaultMessage": "Malay"
},
"settings.language.portuguese": {
"defaultMessage": "Portuguese"
},
"settings.language.russian": {
"defaultMessage": "Russian"
},
@@ -3911,9 +3929,15 @@
"settings.language.turkish": {
"defaultMessage": "Turkish"
},
"settings.language.vietnamese": {
"defaultMessage": "Vietnamese"
},
"settings.language.zhCN": {
"defaultMessage": "Chinese (Simplified)"
},
"settings.language.zhTW": {
"defaultMessage": "Chinese (Traditional)"
},
"settings.menuBarIcon.description": {
"defaultMessage": "Show goose in the menu bar"
},
+24
View File
@@ -3887,15 +3887,33 @@
"settings.language.english": {
"defaultMessage": "Inglés"
},
"settings.language.french": {
"defaultMessage": "Francés"
},
"settings.language.german": {
"defaultMessage": "Alemán"
},
"settings.language.hindi": {
"defaultMessage": "Hindi"
},
"settings.language.indonesian": {
"defaultMessage": "Indonesio"
},
"settings.language.italian": {
"defaultMessage": "Italiano"
},
"settings.language.japanese": {
"defaultMessage": "Japonés"
},
"settings.language.korean": {
"defaultMessage": "Coreano"
},
"settings.language.malay": {
"defaultMessage": "Malayo"
},
"settings.language.portuguese": {
"defaultMessage": "Portugués"
},
"settings.language.russian": {
"defaultMessage": "Ruso"
},
@@ -3911,9 +3929,15 @@
"settings.language.turkish": {
"defaultMessage": "Turco"
},
"settings.language.vietnamese": {
"defaultMessage": "Vietnamita"
},
"settings.language.zhCN": {
"defaultMessage": "Chino (simplificado)"
},
"settings.language.zhTW": {
"defaultMessage": "Chino (tradicional)"
},
"settings.menuBarIcon.description": {
"defaultMessage": "Muestra goose en la barra de menús"
},
File diff suppressed because it is too large Load Diff
+24
View File
@@ -3887,15 +3887,33 @@
"settings.language.english": {
"defaultMessage": "अंग्रेज़ी"
},
"settings.language.french": {
"defaultMessage": "फ़्रेंच"
},
"settings.language.german": {
"defaultMessage": "जर्मन"
},
"settings.language.hindi": {
"defaultMessage": "हिन्दी"
},
"settings.language.indonesian": {
"defaultMessage": "इंडोनेशियाई"
},
"settings.language.italian": {
"defaultMessage": "इतालवी"
},
"settings.language.japanese": {
"defaultMessage": "जापानी"
},
"settings.language.korean": {
"defaultMessage": "कोरियाई"
},
"settings.language.malay": {
"defaultMessage": "मलय"
},
"settings.language.portuguese": {
"defaultMessage": "पुर्तगाली"
},
"settings.language.russian": {
"defaultMessage": "रूसी"
},
@@ -3911,9 +3929,15 @@
"settings.language.turkish": {
"defaultMessage": "तुर्की"
},
"settings.language.vietnamese": {
"defaultMessage": "वियतनामी"
},
"settings.language.zhCN": {
"defaultMessage": "चीनी (सरलीकृत)"
},
"settings.language.zhTW": {
"defaultMessage": "चीनी (पारंपरिक)"
},
"settings.menuBarIcon.description": {
"defaultMessage": "मेनू बार में goose दिखाएँ"
},
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+24
View File
@@ -3887,15 +3887,33 @@
"settings.language.english": {
"defaultMessage": "英語"
},
"settings.language.french": {
"defaultMessage": "フランス語"
},
"settings.language.german": {
"defaultMessage": "ドイツ語"
},
"settings.language.hindi": {
"defaultMessage": "ヒンディー語"
},
"settings.language.indonesian": {
"defaultMessage": "インドネシア語"
},
"settings.language.italian": {
"defaultMessage": "イタリア語"
},
"settings.language.japanese": {
"defaultMessage": "日本語"
},
"settings.language.korean": {
"defaultMessage": "韓国語"
},
"settings.language.malay": {
"defaultMessage": "マレー語"
},
"settings.language.portuguese": {
"defaultMessage": "ポルトガル語"
},
"settings.language.russian": {
"defaultMessage": "ロシア語"
},
@@ -3911,9 +3929,15 @@
"settings.language.turkish": {
"defaultMessage": "トルコ語"
},
"settings.language.vietnamese": {
"defaultMessage": "ベトナム語"
},
"settings.language.zhCN": {
"defaultMessage": "中国語(簡体字)"
},
"settings.language.zhTW": {
"defaultMessage": "中国語(繁体字)"
},
"settings.menuBarIcon.description": {
"defaultMessage": "メニューバーにgooseを表示します"
},
+24
View File
@@ -3887,15 +3887,33 @@
"settings.language.english": {
"defaultMessage": "영어"
},
"settings.language.french": {
"defaultMessage": "프랑스어"
},
"settings.language.german": {
"defaultMessage": "독일어"
},
"settings.language.hindi": {
"defaultMessage": "힌디어"
},
"settings.language.indonesian": {
"defaultMessage": "인도네시아어"
},
"settings.language.italian": {
"defaultMessage": "이탈리아어"
},
"settings.language.japanese": {
"defaultMessage": "일본어"
},
"settings.language.korean": {
"defaultMessage": "한국어"
},
"settings.language.malay": {
"defaultMessage": "말레이어"
},
"settings.language.portuguese": {
"defaultMessage": "포르투갈어"
},
"settings.language.russian": {
"defaultMessage": "러시아어"
},
@@ -3911,9 +3929,15 @@
"settings.language.turkish": {
"defaultMessage": "터키어"
},
"settings.language.vietnamese": {
"defaultMessage": "베트남어"
},
"settings.language.zhCN": {
"defaultMessage": "중국어(간체)"
},
"settings.language.zhTW": {
"defaultMessage": "중국어(번체)"
},
"settings.menuBarIcon.description": {
"defaultMessage": "메뉴 막대에 goose를 표시합니다."
},
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+24
View File
@@ -3887,15 +3887,33 @@
"settings.language.english": {
"defaultMessage": "Английский"
},
"settings.language.french": {
"defaultMessage": "Французский"
},
"settings.language.german": {
"defaultMessage": "Немецкий"
},
"settings.language.hindi": {
"defaultMessage": "Хинди"
},
"settings.language.indonesian": {
"defaultMessage": "Индонезийский"
},
"settings.language.italian": {
"defaultMessage": "Итальянский"
},
"settings.language.japanese": {
"defaultMessage": "Японский"
},
"settings.language.korean": {
"defaultMessage": "Корейский"
},
"settings.language.malay": {
"defaultMessage": "Малайский"
},
"settings.language.portuguese": {
"defaultMessage": "Португальский"
},
"settings.language.russian": {
"defaultMessage": "Русский"
},
@@ -3911,9 +3929,15 @@
"settings.language.turkish": {
"defaultMessage": "Турецкий"
},
"settings.language.vietnamese": {
"defaultMessage": "Вьетнамский"
},
"settings.language.zhCN": {
"defaultMessage": "Китайский (упрощенный)"
},
"settings.language.zhTW": {
"defaultMessage": "Китайский (традиционный)"
},
"settings.menuBarIcon.description": {
"defaultMessage": "Показывать goose в строке меню"
},
+24
View File
@@ -3887,15 +3887,33 @@
"settings.language.english": {
"defaultMessage": "İngilizce"
},
"settings.language.french": {
"defaultMessage": "Fransızca"
},
"settings.language.german": {
"defaultMessage": "Almanca"
},
"settings.language.hindi": {
"defaultMessage": "Hintçe"
},
"settings.language.indonesian": {
"defaultMessage": "Endonezce"
},
"settings.language.italian": {
"defaultMessage": "İtalyanca"
},
"settings.language.japanese": {
"defaultMessage": "Japonca"
},
"settings.language.korean": {
"defaultMessage": "Korece"
},
"settings.language.malay": {
"defaultMessage": "Malayca"
},
"settings.language.portuguese": {
"defaultMessage": "Portekizce"
},
"settings.language.russian": {
"defaultMessage": "Rusça"
},
@@ -3911,9 +3929,15 @@
"settings.language.turkish": {
"defaultMessage": "Türkçe"
},
"settings.language.vietnamese": {
"defaultMessage": "Vietnamca"
},
"settings.language.zhCN": {
"defaultMessage": "Çince (Basitleştirilmiş)"
},
"settings.language.zhTW": {
"defaultMessage": "Çince (Geleneksel)"
},
"settings.menuBarIcon.description": {
"defaultMessage": "Menü çubuğunda goose'yi göster"
},
File diff suppressed because it is too large Load Diff
+24
View File
@@ -3887,15 +3887,33 @@
"settings.language.english": {
"defaultMessage": "英语"
},
"settings.language.french": {
"defaultMessage": "法语"
},
"settings.language.german": {
"defaultMessage": "德语"
},
"settings.language.hindi": {
"defaultMessage": "印地语"
},
"settings.language.indonesian": {
"defaultMessage": "印度尼西亚语"
},
"settings.language.italian": {
"defaultMessage": "意大利语"
},
"settings.language.japanese": {
"defaultMessage": "日语"
},
"settings.language.korean": {
"defaultMessage": "韩语"
},
"settings.language.malay": {
"defaultMessage": "马来语"
},
"settings.language.portuguese": {
"defaultMessage": "葡萄牙语"
},
"settings.language.russian": {
"defaultMessage": "俄语"
},
@@ -3911,9 +3929,15 @@
"settings.language.turkish": {
"defaultMessage": "土耳其语"
},
"settings.language.vietnamese": {
"defaultMessage": "越南语"
},
"settings.language.zhCN": {
"defaultMessage": "简体中文"
},
"settings.language.zhTW": {
"defaultMessage": "中文(繁体)"
},
"settings.menuBarIcon.description": {
"defaultMessage": "在菜单栏显示 goose"
},
File diff suppressed because it is too large Load Diff
+8
View File
@@ -172,12 +172,20 @@ const validLanguageSettings = new Set<Settings['language']>([
'system',
'en',
'es',
'fr',
'de',
'it',
'pt',
'id',
'ms',
'vi',
'hi',
'ja',
'ko',
'ru',
'tr',
'zh-CN',
'zh-TW',
]);
function isValidLanguageSetting(value: unknown): value is Settings['language'] {
+4 -1
View File
@@ -23,7 +23,10 @@ export type DefaultKeyboardShortcuts = {
[K in keyof KeyboardShortcuts]: string;
};
export type LanguageSetting = 'system' | 'en' | 'es' | 'hi' | 'ja' | 'ko' | 'ru' | 'tr' | 'zh-CN';
// prettier-ignore
export type LanguageSetting =
| 'system' | 'en' | 'es' | 'fr' | 'de' | 'it' | 'pt' | 'id' | 'ms' | 'vi'
| 'hi' | 'ja' | 'ko' | 'ru' | 'tr' | 'zh-CN' | 'zh-TW';
export interface Settings {
// Desktop app settings