From e75b6618b3b7882f833adf0f091c550d46ca69fd Mon Sep 17 00:00:00 2001 From: akrlin <111370249+arkrolin@users.noreply.github.com> Date: Wed, 15 Apr 2026 14:47:26 +0800 Subject: [PATCH] fix(stage-ui,i18n) fix a bug when change language (#1666) --- apps/stage-pocket/src/modules/i18n.ts | 32 ++----------------- .../src/renderer/modules/i18n.ts | 31 +++--------------- packages/i18n/src/index.ts | 2 +- packages/stage-ui/stories/modules/i18n.ts | 30 +++-------------- 4 files changed, 13 insertions(+), 82 deletions(-) diff --git a/apps/stage-pocket/src/modules/i18n.ts b/apps/stage-pocket/src/modules/i18n.ts index f7c1951e2..438770ebe 100644 --- a/apps/stage-pocket/src/modules/i18n.ts +++ b/apps/stage-pocket/src/modules/i18n.ts @@ -1,29 +1,8 @@ import messages from '@proj-airi/i18n/locales' +import { resolveSupportedLocale } from '@proj-airi/i18n' import { createI18n } from 'vue-i18n' -// TODO: Align this bootstrap locale normalization with `@proj-airi/i18n`. -const languageRemap: Record = { - 'zh-CN': 'zh-Hans', - 'zh-TW': 'zh-Hant', - 'zh-HK': 'zh-Hans', // TODO: remove this when zh-Hant is supported - 'zh-Hant': 'zh-Hans', // TODO: remove this when zh-Hant is supported - 'en-US': 'en', - 'en-GB': 'en', - 'en-AU': 'en', - 'en': 'en', - 'es-ES': 'es', - 'es-MX': 'es', - 'es-AR': 'es', - 'es': 'es', - 'vi': 'vi', - 'vi-VN': 'vi', - 'ru': 'ru', - 'ru-RU': 'ru', - 'fr': 'fr', - 'fr-FR': 'fr', -} - function getLocale() { let language = localStorage.getItem('settings/language') @@ -32,14 +11,7 @@ function getLocale() { language = navigator.language || 'en' } - const languages = Object.keys(messages!) - if (languageRemap[language || 'en'] != null) { - language = languageRemap[language || 'en'] - } - if (language && languages.includes(language)) - return language - - return 'en' + return resolveSupportedLocale(language, Object.keys(messages!)) } export const i18n = createI18n({ diff --git a/apps/stage-tamagotchi/src/renderer/modules/i18n.ts b/apps/stage-tamagotchi/src/renderer/modules/i18n.ts index f8cca15a1..438770ebe 100644 --- a/apps/stage-tamagotchi/src/renderer/modules/i18n.ts +++ b/apps/stage-tamagotchi/src/renderer/modules/i18n.ts @@ -1,38 +1,17 @@ import messages from '@proj-airi/i18n/locales' +import { resolveSupportedLocale } from '@proj-airi/i18n' import { createI18n } from 'vue-i18n' -// TODO: Align this bootstrap locale normalization with `@proj-airi/i18n`. -const languageRemap: Record = { - 'zh-CN': 'zh-Hans', - 'zh-TW': 'zh-Hans', // TODO: remove this when zh-Hant is supported - 'zh-HK': 'zh-Hans', // TODO: remove this when zh-Hant is supported - 'zh-Hant': 'zh-Hans', // TODO: remove this when zh-Hant is supported - 'en-US': 'en', - 'en-GB': 'en', - 'en-AU': 'en', - 'en': 'en', - 'es-ES': 'es', - 'es-MX': 'es', - 'es-AR': 'es', - 'es': 'es', - 'vi': 'vi', - 'vi-VN': 'vi', - 'ru': 'ru', - 'ru-RU': 'ru', -} - function getLocale() { let language = localStorage.getItem('settings/language') - const languages = Object.keys(messages!) - if (languageRemap[language || 'en'] != null) { - language = languageRemap[language || 'en'] + if (!language) { + // Fallback to browser language + language = navigator.language || 'en' } - if (language && languages.includes(language)) - return language - return 'en' + return resolveSupportedLocale(language, Object.keys(messages!)) } export const i18n = createI18n({ diff --git a/packages/i18n/src/index.ts b/packages/i18n/src/index.ts index 5347f7b48..90edafe12 100644 --- a/packages/i18n/src/index.ts +++ b/packages/i18n/src/index.ts @@ -13,7 +13,7 @@ export const all = { export const localeRemap: Record = { 'zh-CN': 'zh-Hans', 'zh-TW': 'zh-Hant', - 'zh-HK': 'zh-Hans', + 'zh-HK': 'zh-Hant', 'zh-Hant': 'zh-Hant', 'zh-Hans': 'zh-Hans', 'en': 'en', diff --git a/packages/stage-ui/stories/modules/i18n.ts b/packages/stage-ui/stories/modules/i18n.ts index 7f3619ff4..438770ebe 100644 --- a/packages/stage-ui/stories/modules/i18n.ts +++ b/packages/stage-ui/stories/modules/i18n.ts @@ -1,37 +1,17 @@ import messages from '@proj-airi/i18n/locales' +import { resolveSupportedLocale } from '@proj-airi/i18n' import { createI18n } from 'vue-i18n' -const languageRemap: Record = { - 'zh-CN': 'zh-Hans', - 'zh-TW': 'zh-Hans', // TODO: remove this when zh-Hant is supported - 'zh-HK': 'zh-Hans', // TODO: remove this when zh-Hant is supported - 'zh-Hant': 'zh-Hans', // TODO: remove this when zh-Hant is supported - 'en-US': 'en', - 'en-GB': 'en', - 'en-AU': 'en', - 'en': 'en', - 'es-ES': 'es', - 'es-MX': 'es', - 'es-AR': 'es', - 'es': 'es', - 'ru': 'ru', - 'ru-RU': 'ru', - 'fr': 'fr', - 'fr-FR': 'fr', -} - function getLocale() { let language = localStorage.getItem('settings/language') - const languages = Object.keys(messages!) - if (languageRemap[language || 'en'] != null) { - language = languageRemap[language || 'en'] + if (!language) { + // Fallback to browser language + language = navigator.language || 'en' } - if (language && languages.includes(language)) - return language - return 'en' + return resolveSupportedLocale(language, Object.keys(messages!)) } export const i18n = createI18n({