import i18n from 'i18next' import { initReactI18next } from 'react-i18next' import { parse } from 'yaml' import { GET_CURRENT_LANGUAGE, SET_CURRENT_LANGUAGE } from '#/events/constants' import { builtinI18nList } from '#/i18n' import { ipc } from '@/utils/bridge' import enRaw from '../../../public/i18n/en.yml?raw' import zhCNRaw from '../../../public/i18n/zh-CN.yml?raw' import zhTWRaw from '../../../public/i18n/zh-TW.yml?raw' import koRaw from '../../../public/i18n/ko.yml?raw' import jaRaw from '../../../public/i18n/ja.yml?raw' type TranslationMap = Record function parseLocale (raw: string): TranslationMap { return parse(raw) as TranslationMap } function applyLanguage (lang: string) { const nextLanguage = ['en', 'zh-CN', 'zh-TW', 'ko', 'ja'].includes(lang) ? lang : 'en' return i18n.changeLanguage(nextLanguage).catch(() => { return i18n.changeLanguage('en') }) } let initializePromise: Promise | null = null export function initializeI18n () { if (initializePromise) { return initializePromise } initializePromise = i18n .use(initReactI18next) .init({ resources: { en: { translation: parseLocale(enRaw) }, 'zh-CN': { translation: parseLocale(zhCNRaw) }, 'zh-TW': { translation: parseLocale(zhTWRaw) }, ko: { translation: parseLocale(koRaw) }, ja: { translation: parseLocale(jaRaw) } }, lng: 'en', fallbackLng: 'en', interpolation: { escapeValue: false, prefix: '${', suffix: '}' } }) .then(async () => { ipc.send(GET_CURRENT_LANGUAGE) ipc.once(GET_CURRENT_LANGUAGE, (lang: string) => { applyLanguage(lang) }) ipc.on(SET_CURRENT_LANGUAGE, (lang: string) => { applyLanguage(lang) }) return i18n }) return initializePromise } export async function setCurrentLanguage (lang: string) { await applyLanguage(lang) ipc.send(SET_CURRENT_LANGUAGE, lang) } export function getLanguageList () { return builtinI18nList } export default i18n