diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 91006979b..2832359f6 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -1,110 +1,114 @@ -import i18next from 'i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; - -import { deConfig } from '#app/locales/de/config.js'; -import { enConfig } from '#app/locales/en/config.js'; -import { esConfig } from '#app/locales/es/config.js'; -import { frConfig } from '#app/locales/fr/config.js'; -import { itConfig } from '#app/locales/it/config.js'; -import { zhCnConfig } from '#app/locales/zh_CN/config.js'; - -export interface SimpleTranslationEntries { - [key: string]: string -} - -export interface MoveTranslationEntry { - name: string, - effect: string -} - -export interface MoveTranslationEntries { - [key: string]: MoveTranslationEntry -} - -export interface AbilityTranslationEntry { - name: string, - description: string -} - -export interface AbilityTranslationEntries { - [key: string]: AbilityTranslationEntry -} - -export interface Localizable { - localize(): void; -} - -export function initI18n(): void { - let lang = ''; - - if (localStorage.getItem('prLang')) - lang = localStorage.getItem('prLang'); - - /** - * i18next is a localization library for maintaining and using translation resources. - * - * Q: How do I add a new language? - * A: To add a new language, create a new folder in the locales directory with the language code. - * Each language folder should contain a file for each namespace (ex. menu.ts) with the translations. - * Don't forget to declare new language in `supportedLngs` i18next initializer - * - * Q: How do I add a new namespace? - * A: To add a new namespace, create a new file in each language folder with the translations. - * Then update the `resources` field in the init() call and the CustomTypeOptions interface. - * - * Q: How do I make a language selectable in the settings? - * A: In src/system/settings.ts, add a new case to the Setting.Language switch statement. - */ - - i18next.use(LanguageDetector).init({ - lng: lang, - fallbackLng: 'en', - supportedLngs: ['en', 'es', 'fr', 'it', 'de', 'zh_CN'], - debug: true, - interpolation: { - escapeValue: false, - }, - resources: { - en: { - ...enConfig - }, - es: { - ...esConfig - }, - fr: { - ...frConfig - }, - it: { - ...itConfig - }, - de: { - ...deConfig - }, - zh_CN: { - ...zhCnConfig - } - }, - }); -} - -// Module declared to make referencing keys in the localization files type-safe. -declare module 'i18next' { - interface CustomTypeOptions { - resources: { - menu: SimpleTranslationEntries; - menuUiHandler: SimpleTranslationEntries; - move: MoveTranslationEntries; - battle: SimpleTranslationEntries, - ability: AbilityTranslationEntries; - pokeball: SimpleTranslationEntries; - pokemon: SimpleTranslationEntries; - pokemonStat: SimpleTranslationEntries; - commandUiHandler: SimpleTranslationEntries; - fightUiHandler: SimpleTranslationEntries; - tutorial: SimpleTranslationEntries; - starterSelectUiHandler: SimpleTranslationEntries; - }; - } -} - -export default i18next; +import i18next from 'i18next'; +import LanguageDetector from 'i18next-browser-languagedetector'; + +import { deConfig } from '#app/locales/de/config.js'; +import { enConfig } from '#app/locales/en/config.js'; +import { esConfig } from '#app/locales/es/config.js'; +import { frConfig } from '#app/locales/fr/config.js'; +import { itConfig } from '#app/locales/it/config.js'; +import { zhCnConfig } from '#app/locales/zh_CN/config.js'; +import { jpConfig } from '#app/locales/jp/config.js'; + +export interface SimpleTranslationEntries { + [key: string]: string +} + +export interface MoveTranslationEntry { + name: string, + effect: string +} + +export interface MoveTranslationEntries { + [key: string]: MoveTranslationEntry +} + +export interface AbilityTranslationEntry { + name: string, + description: string +} + +export interface AbilityTranslationEntries { + [key: string]: AbilityTranslationEntry +} + +export interface Localizable { + localize(): void; +} + +export function initI18n(): void { + let lang = ''; + + if (localStorage.getItem('prLang')) + lang = localStorage.getItem('prLang'); + + /** + * i18next is a localization library for maintaining and using translation resources. + * + * Q: How do I add a new language? + * A: To add a new language, create a new folder in the locales directory with the language code. + * Each language folder should contain a file for each namespace (ex. menu.ts) with the translations. + * Don't forget to declare new language in `supportedLngs` i18next initializer + * + * Q: How do I add a new namespace? + * A: To add a new namespace, create a new file in each language folder with the translations. + * Then update the `resources` field in the init() call and the CustomTypeOptions interface. + * + * Q: How do I make a language selectable in the settings? + * A: In src/system/settings.ts, add a new case to the Setting.Language switch statement. + */ + + i18next.use(LanguageDetector).init({ + lng: lang, + fallbackLng: 'en', + supportedLngs: ['en', 'es', 'fr', 'it', 'de', 'zh_CN', 'jp'], + debug: true, + interpolation: { + escapeValue: false, + }, + resources: { + en: { + ...enConfig + }, + es: { + ...esConfig + }, + fr: { + ...frConfig + }, + it: { + ...itConfig + }, + de: { + ...deConfig + }, + zh_CN: { + ...zhCnConfig + }, + jp: { + ...jpConfig + } + }, + }); +} + +// Module declared to make referencing keys in the localization files type-safe. +declare module 'i18next' { + interface CustomTypeOptions { + resources: { + menu: SimpleTranslationEntries; + menuUiHandler: SimpleTranslationEntries; + move: MoveTranslationEntries; + battle: SimpleTranslationEntries, + ability: AbilityTranslationEntries; + pokeball: SimpleTranslationEntries; + pokemon: SimpleTranslationEntries; + pokemonStat: SimpleTranslationEntries; + commandUiHandler: SimpleTranslationEntries; + fightUiHandler: SimpleTranslationEntries; + tutorial: SimpleTranslationEntries; + starterSelectUiHandler: SimpleTranslationEntries; + }; + } +} + +export default i18next; \ No newline at end of file