import { en } from './locales/en'; import { ko } from './locales/ko'; import { DeepPartial, Language, Strings } from './types'; let currentLang: Language = 'en'; let listeners: Array<() => void> = []; function deepMerge(...sources: Array>): T { const result: any = {}; for (const source of sources) { for (const key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { const value = source[key]; if ( value && typeof value === 'object' && !Array.isArray(value) && typeof value !== 'function' ) { if (!result[key] || typeof result[key] !== 'object') { result[key] = {}; } result[key] = deepMerge(result[key], value as any); } else { result[key] = value; } } } } return result as T; } const dictionaries: Record = { en: en, ko: deepMerge(en, ko) as Strings, }; export const strings = new Proxy(en, { get: (target, prop) => { const dict = dictionaries[currentLang]; return dict[prop as keyof Strings]; }, }); export const setLanguage = (lang: Language) => { if (currentLang !== lang) { currentLang = lang; if (lang === 'ko') { dictionaries.ko = deepMerge(en, ko) as Strings; } listeners.forEach(l => l()); } }; export const getLanguage = () => currentLang; export const subscribeLanguageChange = (listener: () => void) => { listeners.push(listener); return () => { listeners = listeners.filter(l => l !== listener); }; };