import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; import { mergeTranslations } from '@/locales'; import * as z from 'zod'; import { setLocaleInClient } from '@/modules/auth/hooks/use-auth-hook'; export type SupportedLanguages = 'en' | 'ja'; const supportedLanguages: SupportedLanguages[] = ['en', 'ja']; const defaultLanguage: SupportedLanguages = 'en'; const localStorageKey = 'app-language'; const setLanguageHooks = (language: SupportedLanguages) => { setLocaleInClient(language); z.config((z.locales[language] ?? z.locales[defaultLanguage] ?? z.locales['en'])()); }; const getStoredLanguage = (): SupportedLanguages => { try { const stored = localStorage.getItem(localStorageKey); if (!stored) { localStorage.setItem(localStorageKey, defaultLanguage); return defaultLanguage; } return stored as SupportedLanguages; } catch { return defaultLanguage; } }; if (!i18n.isInitialized) { const lng = getStoredLanguage(); const enResources = mergeTranslations('en'); const jaResources = mergeTranslations('ja'); i18n.use(initReactI18next).init({ resources: { en: { translation: enResources, ...enResources, }, ja: { translation: jaResources, ...jaResources, }, }, defaultNS: 'translation', ns: ['translation', 'auth', 'app', 'landing', 'common', 'theme'], supportedLngs: supportedLanguages, lng, fallbackLng: defaultLanguage, interpolation: { escapeValue: false, }, }); setLanguageHooks(lng); } export const getLanguage = () => { return i18n.language; }; export const changeLanguage = (language: SupportedLanguages) => { try { localStorage.setItem(localStorageKey, language); } catch { // Fallback if localStorage is not available } i18n.changeLanguage(language); setLanguageHooks(language); }; export default i18n;