initial
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
import {
|
||||
DEFAULT_LOCALE,
|
||||
detectBrowserLocale,
|
||||
initI18n,
|
||||
isSupportedLocale,
|
||||
type SupportedLocale,
|
||||
} from '@chat-app/shared/i18n';
|
||||
|
||||
const LOCAL_STORAGE_KEY = 'chatapp.locale';
|
||||
|
||||
export function getCachedLocale(): SupportedLocale | null {
|
||||
try {
|
||||
const raw = window.localStorage.getItem(LOCAL_STORAGE_KEY);
|
||||
return isSupportedLocale(raw) ? raw : null;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export function cacheLocale(locale: SupportedLocale): void {
|
||||
try {
|
||||
window.localStorage.setItem(LOCAL_STORAGE_KEY, locale);
|
||||
} catch {
|
||||
// Ignore (private mode, quota, etc.). Profile row remains source of truth.
|
||||
}
|
||||
}
|
||||
|
||||
// Precedence for the very first paint (before we know the user):
|
||||
// 1. cached choice from a previous session
|
||||
// 2. navigator language(s)
|
||||
// 3. DEFAULT_LOCALE (en)
|
||||
export function resolveInitialLocale(): SupportedLocale {
|
||||
return (
|
||||
getCachedLocale() ??
|
||||
detectBrowserLocale(typeof navigator !== 'undefined' ? navigator.languages : undefined) ??
|
||||
DEFAULT_LOCALE
|
||||
);
|
||||
}
|
||||
|
||||
export function bootstrapI18n(): void {
|
||||
const initialLocale = resolveInitialLocale();
|
||||
initI18n({
|
||||
initialLocale,
|
||||
onLanguageChanged: (locale) => cacheLocale(locale),
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user