From e20305ea2d97f0e27085d6d6a0cc50df68c74236 Mon Sep 17 00:00:00 2001 From: Adrian Date: Mon, 26 Aug 2024 19:06:14 -0400 Subject: [PATCH] Update and format test, i18n.ts and settings.ts --- src/plugins/i18n.ts | 10 +++-- src/system/settings/settings.ts | 33 +++++++--------- .../settingMenu/languages_setting.test.ts | 38 +++++++++++-------- 3 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 74c7edcac1a..3227dfb4d1c 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -107,6 +107,10 @@ export const languages: LanguageType = { // "ca-ES": "CatalĂ ", }; +export const languagesKeys = Object.keys(languages); + +export const languagesLabels = Object.values(languages); + export async function initI18n(): Promise { // Prevent reinitialization if (isInitialized) { @@ -120,7 +124,7 @@ export async function initI18n(): Promise { * 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 forgot declare new language in `languages` const with language code as key and language label as value. + * Don't forget to declare new language in `languages` const with language code as key and language label as value. * * 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. @@ -137,8 +141,8 @@ export async function initI18n(): Promise { await i18next.init({ nonExplicitSupportedLngs: true, fallbackLng: "en", - supportedLngs: Object.keys(languages).map((langKey)=>langKey.split("-")[0]).filter((lang, i, a) => { - return (a.findIndex((t) => t === lang) === i); + supportedLngs: languagesKeys.map((langKey) => langKey.split("-")[0]).filter((lang, i, a) => { + return a.findIndex((t) => t === lang) === i; }), defaultNS: "menu", ns: Object.keys(enConfig), diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index d83afed1d2a..5e66210687c 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -8,7 +8,7 @@ import SettingsUiHandler from "#app/ui/settings/settings-ui-handler"; import { EaseType } from "#enums/ease-type"; import { MoneyFormat } from "#enums/money-format"; import { PlayerGender } from "#enums/player-gender"; -import { getIsInitialized, initI18n, languages } from "#app/plugins/i18n.js"; +import { getIsInitialized, initI18n, languages, languagesKeys, languagesLabels } from "#app/plugins/i18n.js"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; function getTranslation(key: string): string { @@ -80,9 +80,6 @@ export interface Setting { isHidden?: () => boolean } -// default is English -export const currentLanguage = languages[i18next.resolvedLanguage!] ?? "English"; - /** * Setting Keys for existing settings * to be used when trying to find or update Settings @@ -306,8 +303,8 @@ export const Setting: Array = [ * Update to current language or return default value. */ { - value: currentLanguage, - label: currentLanguage + value: languages[i18next.resolvedLanguage!] ?? "English", + label: languages[i18next.resolvedLanguage!] ?? "English" }, { value: "Change", @@ -811,21 +808,19 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): }; scene.ui.setOverlayMode(Mode.OPTION_SELECT, { options: [ - ...Object.values(languages) - .map((lang, index) => { - return { - label: lang, - handler: () => changeLocaleHandler(Object.keys(languages)[index]), - }; - }) - .filter((lang) => { - // Remove language active - return currentLanguage !== lang.label; - }), + ...languagesLabels.map((lang, index) => { + return { + label: lang, + handler: () => changeLocaleHandler(languagesKeys[index]), + }; + }).filter((lang) => { + // Remove active language. + return languages[i18next.resolvedLanguage!] !== lang.label; + }), { label: i18next.t("settings:back"), - handler: () => cancelHandler(), - }, + handler: () => cancelHandler() + } ], maxOptions: 7, }); diff --git a/src/test/settingMenu/languages_setting.test.ts b/src/test/settingMenu/languages_setting.test.ts index 1f85a9d775f..e220ff718b8 100644 --- a/src/test/settingMenu/languages_setting.test.ts +++ b/src/test/settingMenu/languages_setting.test.ts @@ -1,10 +1,10 @@ import { setSetting, SettingKeys } from "#app/system/settings/settings.js"; import i18next from "i18next"; -import { expect, describe, it, beforeAll, afterEach, vi } from "vitest"; +import { expect, describe, it, beforeAll, afterEach, vi, beforeEach } from "vitest"; import GameManager from "../utils/gameManager"; import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler.js"; import { Mode } from "#app/ui/ui.js"; -import { languages } from "#app/plugins/i18n.js"; +import { languages, languagesKeys, languagesLabels } from "#app/plugins/i18n.js"; class TestingOptionSelectUiHandler extends OptionSelectUiHandler { public get getOptions() { @@ -15,6 +15,7 @@ class TestingOptionSelectUiHandler extends OptionSelectUiHandler { describe("Check Languages", () => { let phaserGame: Phaser.Game; let game: GameManager; + let optionSelectUiHandler: TestingOptionSelectUiHandler; beforeAll(async () => { phaserGame = new Phaser.Game({ @@ -23,21 +24,22 @@ describe("Check Languages", () => { game = new GameManager(phaserGame); expect(languages).not.toBe(undefined); await game.runToTitle(); + vi.spyOn(game.scene.ui, "hideTooltip").mockReturnValueOnce(); + game.scene.ui.handlers[Mode.OPTION_SELECT] = new TestingOptionSelectUiHandler(game.scene); + game.scene.ui.handlers[Mode.OPTION_SELECT].setup(); + }); + + beforeEach(() => { + game.setMode(Mode.SETTINGS_DISPLAY); + setSetting(game.scene, SettingKeys.Language, 1); + optionSelectUiHandler = game.scene.ui.getHandler(); }); afterEach(async () => { game.phaseInterceptor.restoreOg(); }); - it("correct structure: { label: string, handler: function}", () => { - vi.spyOn(game.scene.ui, "hideTooltip").mockReturnValueOnce(); - game.scene.ui.handlers[Mode.OPTION_SELECT] = new TestingOptionSelectUiHandler(game.scene); - game.scene.ui.handlers[Mode.OPTION_SELECT].setup(); - game.setMode(Mode.SETTINGS_DISPLAY); - - setSetting(game.scene, SettingKeys.Language, 1); - const optionSelectUiHandler = game.scene.ui.getHandler() as TestingOptionSelectUiHandler; - + it("Correct structure is expected: { label: string, handler: function }", () => { expect( optionSelectUiHandler.getOptions?.every((option) => { return ( @@ -48,12 +50,16 @@ describe("Check Languages", () => { ).toBe(true); }); - [...Object.values(languages)].map(async (lang, index, array) => { + [...languagesLabels].map(async (lang, index, array) => { return it(`Check ${lang}`, async () => { - expect(i18next.resolvedLanguage).toBe(Object.keys(languages)[index]); - i18next.changeLanguage( - Object.keys(languages)[(index + 1) % array.length] - ); + // Active language should be the current one. + expect(i18next.resolvedLanguage).toBe(languagesKeys[index]); + + // Active language should not be among the options. + expect(optionSelectUiHandler.getOptions?.some(({ label }) => label === lang)).toBe(false); + + // Change to following language. + i18next.changeLanguage(languagesKeys[(index + 1) % array.length]); }); }); });