Files
buzz-sheet/lib/i18n/locale-store.ts
T
gunshiz e0794822b1
CI / Verify (push) Successful in 1m18s
CI / Build immutable images and deploy (push) Successful in 1m57s
feat(i18n) : add personal languages and compact weapon exports
2026-09-14 16:44:44 +07:00

32 lines
1.1 KiB
TypeScript

import { defaultLocale, isLocale, localeStorageKey, type Locale } from "./locales";
export function createLocaleStore(storage: () => Pick<Storage, "getItem" | "setItem"> | undefined) {
let locale: Locale = defaultLocale;
let restored = false;
const listeners = new Set<() => void>();
const emit = () => listeners.forEach((listener) => listener());
return {
getSnapshot: () => locale,
getServerSnapshot: () => defaultLocale,
subscribe(listener: () => void) {
listeners.add(listener);
if (!restored) {
restored = true;
try {
const saved = storage()?.getItem(localeStorageKey);
if (isLocale(saved)) locale = saved;
} catch { /* Storage may be disabled by the browser. */ }
emit();
}
return () => { listeners.delete(listener); };
},
setLocale(value: Locale) {
if (!isLocale(value)) return;
locale = value;
try { storage()?.setItem(localeStorageKey, value); } catch { /* Keep the session choice when storage is unavailable. */ }
emit();
},
};
}