Skip to content

Commit e070a05

Browse files
committed
fix(i18n): seed locale state from bootstrap preload
1 parent bae71f1 commit e070a05

1 file changed

Lines changed: 11 additions & 6 deletions

File tree

packages/ui/src/lib/i18n/index.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export type TranslateParams = Record<string, unknown>
1010
export type Locale = "en" | "es" | "fr" | "ru" | "ja" | "zh-Hans"
1111

1212
const SUPPORTED_LOCALES: readonly Locale[] = ["en", "es", "fr", "ru", "ja", "zh-Hans"] as const
13+
const SUPPORTED_LOCALES_BY_LOWER = new Map(SUPPORTED_LOCALES.map((locale) => [locale.toLowerCase(), locale]))
1314

1415
const localeMessagesCache = new Map<Locale, Messages>([["en", enMessages]])
1516
const localeMessagesPromises = new Map<Locale, Promise<Messages>>()
@@ -32,20 +33,19 @@ function matchSupportedLocale(value: string | undefined): Locale | null {
3233

3334
const normalized = normalizeLocaleTag(value)
3435
const lower = normalized.toLowerCase()
35-
const supportedLower = new Map(SUPPORTED_LOCALES.map((locale) => [locale.toLowerCase(), locale]))
36-
const exact = supportedLower.get(lower)
36+
const exact = SUPPORTED_LOCALES_BY_LOWER.get(lower)
3737
if (exact) return exact
3838

3939
const parts = lower.split("-")
4040
const base = parts[0]
4141
if (!base) return null
4242

4343
if (base === "zh") {
44-
const zhHans = supportedLower.get("zh-hans")
44+
const zhHans = SUPPORTED_LOCALES_BY_LOWER.get("zh-hans")
4545
return zhHans ?? null
4646
}
4747

48-
const baseMatch = supportedLower.get(base)
48+
const baseMatch = SUPPORTED_LOCALES_BY_LOWER.get(base)
4949
return baseMatch ?? null
5050
}
5151

@@ -83,6 +83,7 @@ function translateFrom(messages: Messages, key: string, params?: TranslateParams
8383

8484
const [globalRevision, setGlobalRevision] = createSignal(0)
8585
let globalMessages: Messages = enMessages
86+
let globalLocale: Locale = "en"
8687

8788
function getMessagesForLocale(locale: Locale): Messages {
8889
return localeMessagesCache.get(locale) ?? enMessages
@@ -119,10 +120,12 @@ export async function preloadLocaleMessages(preferredLocale?: string | null): Pr
119120
const resolvedLocale = matchSupportedLocale(preferredLocale ?? undefined) ?? detectNavigatorLocale() ?? "en"
120121
try {
121122
globalMessages = await loadLocaleMessages(resolvedLocale)
123+
globalLocale = resolvedLocale
122124
setGlobalRevision((value) => value + 1)
123125
return resolvedLocale
124126
} catch {
125127
globalMessages = enMessages
128+
globalLocale = "en"
126129
setGlobalRevision((value) => value + 1)
127130
return "en"
128131
}
@@ -142,8 +145,8 @@ const I18nContext = createContext<I18nContextValue>()
142145

143146
export const I18nProvider: ParentComponent = (props) => {
144147
const { preferences } = useConfig()
145-
const [detectedLocale, setDetectedLocale] = createSignal<Locale>("en")
146-
const [resolvedLocale, setResolvedLocale] = createSignal<Locale>("en")
148+
const [detectedLocale, setDetectedLocale] = createSignal<Locale>(globalLocale)
149+
const [resolvedLocale, setResolvedLocale] = createSignal<Locale>(globalLocale)
147150

148151
onMount(() => {
149152
const detected = detectNavigatorLocale()
@@ -181,6 +184,7 @@ export const I18nProvider: ParentComponent = (props) => {
181184
}
182185
setResolvedLocale("en")
183186
globalMessages = enMessages
187+
globalLocale = "en"
184188
setGlobalRevision((value) => value + 1)
185189
})
186190

@@ -191,6 +195,7 @@ export const I18nProvider: ParentComponent = (props) => {
191195

192196
onCleanup(() => {
193197
globalMessages = enMessages
198+
globalLocale = "en"
194199
setGlobalRevision((value) => value + 1)
195200
})
196201

0 commit comments

Comments
 (0)