i18n: add Spanish (es) locale support (#9833)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jose Manuel Perez
2026-06-17 11:39:22 -05:00
committed by GitHub
parent 80a286da8c
commit 56812f4617
13 changed files with 4864 additions and 3 deletions
+1
View File
@@ -44,6 +44,7 @@
"i18n:extract": "formatjs extract 'src/**/*.{ts,tsx}' --ignore '**/*.d.ts' --out-file src/i18n/messages/en.json --flatten && pnpm run i18n:compile",
"i18n:check": "node scripts/i18n-check.js && node scripts/i18n-validate-locale.js",
"i18n:compile": "node scripts/i18n-compile.js",
"i18n:validate-es": "node scripts/i18n-validate-locale.js es",
"i18n:validate-ja": "node scripts/i18n-validate-locale.js ja",
"i18n:validate-locale": "node scripts/i18n-validate-locale.js"
},
@@ -81,6 +81,7 @@ const i18n = defineMessages({
languageTurkish: { id: 'settings.language.turkish', defaultMessage: 'Turkish' },
languageHindi: { id: 'settings.language.hindi', defaultMessage: 'Hindi' },
languageJapanese: { id: 'settings.language.japanese', defaultMessage: 'Japanese' },
languageSpanish: { id: 'settings.language.spanish', defaultMessage: 'Spanish' },
helpTitle: { id: 'settings.help.title', defaultMessage: 'Help & feedback' },
helpDesc: {
id: 'settings.help.description',
@@ -144,6 +145,7 @@ const i18n = defineMessages({
const LANGUAGE_OPTIONS: Array<{ value: LanguageSetting; message: keyof typeof i18n }> = [
{ value: 'system', message: 'languageSystem' },
{ value: 'en', message: 'languageEnglish' },
{ value: 'es', message: 'languageSpanish' },
{ value: 'hi', message: 'languageHindi' },
{ value: 'ja', message: 'languageJapanese' },
{ value: 'ru', message: 'languageRussian' },
+11 -1
View File
@@ -73,7 +73,6 @@ describe('getLocale', () => {
expect(getLocale()).toEqual({ locale: 'tr', messageLocale: 'tr' });
});
it('supports Japanese from navigator.languages', () => {
vi.stubGlobal('navigator', { languages: ['ja-JP'] });
expect(getLocale()).toEqual({ locale: 'ja-JP', messageLocale: 'ja' });
@@ -96,6 +95,17 @@ describe('getLocale', () => {
expect(getLocale()).toEqual({ locale: 'hi', messageLocale: 'hi' });
});
it('supports Spanish from navigator.languages', () => {
vi.stubGlobal('navigator', { languages: ['es-ES'] });
expect(getLocale()).toEqual({ locale: 'es-ES', messageLocale: 'es' });
});
it('supports explicit Spanish locale', () => {
mockAppConfig({ GOOSE_LOCALE: 'es' });
vi.stubGlobal('navigator', { languages: ['xx-XX'] });
expect(getLocale()).toEqual({ locale: 'es', messageLocale: 'es' });
});
it('falls back to base language when locale tag is invalid BCP 47', () => {
// "en-" is not a valid BCP 47 tag and would cause RangeError in Intl APIs
mockAppConfig({ GOOSE_LOCALE: 'en-' });
+1 -1
View File
@@ -15,7 +15,7 @@
export { defineMessages, useIntl } from 'react-intl';
/** The set of locales that have translation catalogs. */
export const SUPPORTED_LOCALES = ['en', 'hi', 'ja', 'ru', 'tr', 'zh-CN'] as const;
export const SUPPORTED_LOCALES = ['en', 'es', 'hi', 'ja', 'ru', 'tr', 'zh-CN'] as const;
export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];
const SUPPORTED_LOCALE_SET = new Set<string>(SUPPORTED_LOCALES);
+3
View File
@@ -4100,6 +4100,9 @@
"settings.language.russian": {
"defaultMessage": "Russian"
},
"settings.language.spanish": {
"defaultMessage": "Spanish"
},
"settings.language.systemDefault": {
"defaultMessage": "System Default"
},
File diff suppressed because it is too large Load Diff
+3
View File
@@ -4100,6 +4100,9 @@
"settings.language.russian": {
"defaultMessage": "रूसी"
},
"settings.language.spanish": {
"defaultMessage": "स्पेनिश"
},
"settings.language.systemDefault": {
"defaultMessage": "सिस्टम डिफ़ॉल्ट"
},
+3
View File
@@ -4100,6 +4100,9 @@
"settings.language.russian": {
"defaultMessage": "ロシア語"
},
"settings.language.spanish": {
"defaultMessage": "スペイン語"
},
"settings.language.systemDefault": {
"defaultMessage": "システムデフォルト"
},
+3
View File
@@ -4100,6 +4100,9 @@
"settings.language.russian": {
"defaultMessage": "Русский"
},
"settings.language.spanish": {
"defaultMessage": "Испанский"
},
"settings.language.systemDefault": {
"defaultMessage": "Системный язык"
},
+3
View File
@@ -4100,6 +4100,9 @@
"settings.language.russian": {
"defaultMessage": "Rusça"
},
"settings.language.spanish": {
"defaultMessage": "İspanyolca"
},
"settings.language.systemDefault": {
"defaultMessage": "Sistem varsayılanı"
},
+3
View File
@@ -4100,6 +4100,9 @@
"settings.language.russian": {
"defaultMessage": "俄语"
},
"settings.language.spanish": {
"defaultMessage": "西班牙语"
},
"settings.language.systemDefault": {
"defaultMessage": "系统默认"
},
+1
View File
@@ -171,6 +171,7 @@ const STARTUP_LOGS_DIR = path.join(app.getPath('userData'), 'logs', 'startup');
const validLanguageSettings = new Set<Settings['language']>([
'system',
'en',
'es',
'hi',
'ja',
'ru',
+1 -1
View File
@@ -28,7 +28,7 @@ export interface SessionSharingConfig {
baseUrl: string;
}
export type LanguageSetting = 'system' | 'en' | 'hi' | 'ja' | 'ru' | 'tr' | 'zh-CN';
export type LanguageSetting = 'system' | 'en' | 'es' | 'hi' | 'ja' | 'ru' | 'tr' | 'zh-CN';
export interface Settings {
// Desktop app settings