Update and format test, i18n.ts and settings.ts

This commit is contained in:
Adrian 2024-08-26 19:06:14 -04:00
parent 51c8cf6be9
commit e20305ea2d
3 changed files with 43 additions and 38 deletions

View File

@ -107,6 +107,10 @@ export const languages: LanguageType = {
// "ca-ES": "Català", // "ca-ES": "Català",
}; };
export const languagesKeys = Object.keys(languages);
export const languagesLabels = Object.values(languages);
export async function initI18n(): Promise<void> { export async function initI18n(): Promise<void> {
// Prevent reinitialization // Prevent reinitialization
if (isInitialized) { if (isInitialized) {
@ -120,7 +124,7 @@ export async function initI18n(): Promise<void> {
* Q: How do I add a new language? * 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. * 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. * 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? * 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. * 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<void> {
await i18next.init({ await i18next.init({
nonExplicitSupportedLngs: true, nonExplicitSupportedLngs: true,
fallbackLng: "en", fallbackLng: "en",
supportedLngs: Object.keys(languages).map((langKey)=>langKey.split("-")[0]).filter((lang, i, a) => { supportedLngs: languagesKeys.map((langKey) => langKey.split("-")[0]).filter((lang, i, a) => {
return (a.findIndex((t) => t === lang) === i); return a.findIndex((t) => t === lang) === i;
}), }),
defaultNS: "menu", defaultNS: "menu",
ns: Object.keys(enConfig), ns: Object.keys(enConfig),

View File

@ -8,7 +8,7 @@ import SettingsUiHandler from "#app/ui/settings/settings-ui-handler";
import { EaseType } from "#enums/ease-type"; import { EaseType } from "#enums/ease-type";
import { MoneyFormat } from "#enums/money-format"; import { MoneyFormat } from "#enums/money-format";
import { PlayerGender } from "#enums/player-gender"; 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"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target";
function getTranslation(key: string): string { function getTranslation(key: string): string {
@ -80,9 +80,6 @@ export interface Setting {
isHidden?: () => boolean isHidden?: () => boolean
} }
// default is English
export const currentLanguage = languages[i18next.resolvedLanguage!] ?? "English";
/** /**
* Setting Keys for existing settings * Setting Keys for existing settings
* to be used when trying to find or update Settings * to be used when trying to find or update Settings
@ -306,8 +303,8 @@ export const Setting: Array<Setting> = [
* Update to current language or return default value. * Update to current language or return default value.
*/ */
{ {
value: currentLanguage, value: languages[i18next.resolvedLanguage!] ?? "English",
label: currentLanguage label: languages[i18next.resolvedLanguage!] ?? "English"
}, },
{ {
value: "Change", value: "Change",
@ -811,21 +808,19 @@ export function setSetting(scene: BattleScene, setting: string, value: integer):
}; };
scene.ui.setOverlayMode(Mode.OPTION_SELECT, { scene.ui.setOverlayMode(Mode.OPTION_SELECT, {
options: [ options: [
...Object.values(languages) ...languagesLabels.map((lang, index) => {
.map((lang, index) => { return {
return { label: lang,
label: lang, handler: () => changeLocaleHandler(languagesKeys[index]),
handler: () => changeLocaleHandler(Object.keys(languages)[index]), };
}; }).filter((lang) => {
}) // Remove active language.
.filter((lang) => { return languages[i18next.resolvedLanguage!] !== lang.label;
// Remove language active }),
return currentLanguage !== lang.label;
}),
{ {
label: i18next.t("settings:back"), label: i18next.t("settings:back"),
handler: () => cancelHandler(), handler: () => cancelHandler()
}, }
], ],
maxOptions: 7, maxOptions: 7,
}); });

View File

@ -1,10 +1,10 @@
import { setSetting, SettingKeys } from "#app/system/settings/settings.js"; import { setSetting, SettingKeys } from "#app/system/settings/settings.js";
import i18next from "i18next"; 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 GameManager from "../utils/gameManager";
import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler.js"; import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler.js";
import { Mode } from "#app/ui/ui.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 { class TestingOptionSelectUiHandler extends OptionSelectUiHandler {
public get getOptions() { public get getOptions() {
@ -15,6 +15,7 @@ class TestingOptionSelectUiHandler extends OptionSelectUiHandler {
describe("Check Languages", () => { describe("Check Languages", () => {
let phaserGame: Phaser.Game; let phaserGame: Phaser.Game;
let game: GameManager; let game: GameManager;
let optionSelectUiHandler: TestingOptionSelectUiHandler;
beforeAll(async () => { beforeAll(async () => {
phaserGame = new Phaser.Game({ phaserGame = new Phaser.Game({
@ -23,21 +24,22 @@ describe("Check Languages", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
expect(languages).not.toBe(undefined); expect(languages).not.toBe(undefined);
await game.runToTitle(); 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 () => { afterEach(async () => {
game.phaseInterceptor.restoreOg(); game.phaseInterceptor.restoreOg();
}); });
it("correct structure: { label: string, handler: function}", () => { it("Correct structure is expected: { 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;
expect( expect(
optionSelectUiHandler.getOptions?.every((option) => { optionSelectUiHandler.getOptions?.every((option) => {
return ( return (
@ -48,12 +50,16 @@ describe("Check Languages", () => {
).toBe(true); ).toBe(true);
}); });
[...Object.values(languages)].map(async (lang, index, array) => { [...languagesLabels].map(async (lang, index, array) => {
return it(`Check ${lang}`, async () => { return it(`Check ${lang}`, async () => {
expect(i18next.resolvedLanguage).toBe(Object.keys(languages)[index]); // Active language should be the current one.
i18next.changeLanguage( expect(i18next.resolvedLanguage).toBe(languagesKeys[index]);
Object.keys(languages)[(index + 1) % array.length]
); // 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]);
}); });
}); });
}); });