i18n: add Spanish (es) locale support (#9833)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
committed by
GitHub
parent
80a286da8c
commit
56812f4617
@@ -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' },
|
||||
|
||||
@@ -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-' });
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
@@ -4100,6 +4100,9 @@
|
||||
"settings.language.russian": {
|
||||
"defaultMessage": "रूसी"
|
||||
},
|
||||
"settings.language.spanish": {
|
||||
"defaultMessage": "स्पेनिश"
|
||||
},
|
||||
"settings.language.systemDefault": {
|
||||
"defaultMessage": "सिस्टम डिफ़ॉल्ट"
|
||||
},
|
||||
|
||||
@@ -4100,6 +4100,9 @@
|
||||
"settings.language.russian": {
|
||||
"defaultMessage": "ロシア語"
|
||||
},
|
||||
"settings.language.spanish": {
|
||||
"defaultMessage": "スペイン語"
|
||||
},
|
||||
"settings.language.systemDefault": {
|
||||
"defaultMessage": "システムデフォルト"
|
||||
},
|
||||
|
||||
@@ -4100,6 +4100,9 @@
|
||||
"settings.language.russian": {
|
||||
"defaultMessage": "Русский"
|
||||
},
|
||||
"settings.language.spanish": {
|
||||
"defaultMessage": "Испанский"
|
||||
},
|
||||
"settings.language.systemDefault": {
|
||||
"defaultMessage": "Системный язык"
|
||||
},
|
||||
|
||||
@@ -4100,6 +4100,9 @@
|
||||
"settings.language.russian": {
|
||||
"defaultMessage": "Rusça"
|
||||
},
|
||||
"settings.language.spanish": {
|
||||
"defaultMessage": "İspanyolca"
|
||||
},
|
||||
"settings.language.systemDefault": {
|
||||
"defaultMessage": "Sistem varsayılanı"
|
||||
},
|
||||
|
||||
@@ -4100,6 +4100,9 @@
|
||||
"settings.language.russian": {
|
||||
"defaultMessage": "俄语"
|
||||
},
|
||||
"settings.language.spanish": {
|
||||
"defaultMessage": "西班牙语"
|
||||
},
|
||||
"settings.language.systemDefault": {
|
||||
"defaultMessage": "系统默认"
|
||||
},
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user