From ebb2f3a1c6c6542fdb70137ff36c11fad4d1a776 Mon Sep 17 00:00:00 2001 From: tobspr Date: Thu, 13 Jan 2022 22:30:52 +0100 Subject: [PATCH] Add support for modifying and registering new transltions --- src/js/core/background_resources_loader.js | 2 +- src/js/core/globals.js | 2 +- src/js/mods/demo_mod.js | 11 ++++++++++ src/js/mods/mod_interface.js | 19 ++++++++++++----- src/js/translations.js | 24 ++++++++++++---------- 5 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/js/core/background_resources_loader.js b/src/js/core/background_resources_loader.js index 927071a9..10f8d6f0 100644 --- a/src/js/core/background_resources_loader.js +++ b/src/js/core/background_resources_loader.js @@ -233,7 +233,7 @@ export class BackgroundResourcesLoader { this.numAssetsToLoadTotal = 0; this.numAssetsLoaded = 0; }) - .then(MODS.modInterface.injectSprites.bind(MODS)) + .then(MODS.modInterface.injectSprites.bind(MODS.modInterface)) ); } } diff --git a/src/js/core/globals.js b/src/js/core/globals.js index fcb9a3e8..4e72dddf 100644 --- a/src/js/core/globals.js +++ b/src/js/core/globals.js @@ -16,5 +16,5 @@ export let GLOBAL_APP = null; export function setGlobalApp(app) { assert(!GLOBAL_APP, "Create application twice!"); GLOBAL_APP = app; - MODS.linkApp(app); + MODS.app = app; } diff --git a/src/js/mods/demo_mod.js b/src/js/mods/demo_mod.js index f3bcbaf8..5df293ce 100644 --- a/src/js/mods/demo_mod.js +++ b/src/js/mods/demo_mod.js @@ -60,5 +60,16 @@ export class DemoMod extends Mod { this.modLoader.signals.modifyLevelDefinitions.add(definitions => { definitions[0].shape = "LuCuLuCu"; }); + + this.modLoader.modInterface.registerTranslations("en", { + ingame: { + interactiveTutorial: { + title: "Hello", + hints: { + "1_1_extractor": "World!", + }, + }, + }, + }); } } diff --git a/src/js/mods/mod_interface.js b/src/js/mods/mod_interface.js index 9ce15d01..6cfc86be 100644 --- a/src/js/mods/mod_interface.js +++ b/src/js/mods/mod_interface.js @@ -8,6 +8,8 @@ import { AtlasSprite, SpriteAtlasLink } from "../core/sprites"; import { Mod } from "./mod"; import { enumShortcodeToSubShape, enumSubShape, enumSubShapeToShortcode } from "../game/shape_definition"; import { Loader } from "../core/loader"; +import { LANGUAGES } from "../languages"; +import { matchDataRecursive, T } from "../translations"; const LOG = createLogger("mod-interface"); @@ -35,11 +37,6 @@ export class ModInterface { * @param {ModLoader} modLoader */ constructor(modLoader) { - /** - * @param {Application} app - */ - this.app = undefined; - this.modLoader = modLoader; /** @type {Map} */ @@ -105,4 +102,16 @@ export class ModInterface { MODS_ADDITIONAL_SHAPE_MAP_WEIGHTS[id] = weightComputation; MODS_ADDITIONAL_SUB_SHAPE_DRAWERS[id] = shapeDrawer; } + + registerTranslations(language, translations) { + const data = LANGUAGES[language]; + if (!data) { + throw new Error("Unknown language: " + language); + } + + matchDataRecursive(data.data, translations, true); + if (language === "en") { + matchDataRecursive(T, translations, true); + } + } } diff --git a/src/js/translations.js b/src/js/translations.js index 6ad926bc..9d976a41 100644 --- a/src/js/translations.js +++ b/src/js/translations.js @@ -24,15 +24,6 @@ if (G_IS_DEV && globalConfig.debug.testTranslations) { mapTranslations(T); } -export function applyLanguage(languageCode) { - logger.log("Applying language:", languageCode); - const data = LANGUAGES[languageCode]; - if (!data) { - logger.error("Language not found:", languageCode); - return false; - } -} - // Language key is something like de-DE or en or en-US function mapLanguageCodeToId(languageKey) { const key = languageKey.toLowerCase(); @@ -97,17 +88,20 @@ export function autoDetectLanguageId() { return "en"; } -function matchDataRecursive(dest, src) { +export function matchDataRecursive(dest, src, addNewKeys = false) { if (typeof dest !== "object" || typeof src !== "object") { return; } + if (dest === null || src === null) { + return; + } for (const key in dest) { if (src[key]) { // console.log("copy", key); const data = dest[key]; if (typeof data === "object") { - matchDataRecursive(dest[key], src[key]); + matchDataRecursive(dest[key], src[key], addNewKeys); } else if (typeof data === "string" || typeof data === "number") { // console.log("match string", key); dest[key] = src[key]; @@ -116,6 +110,14 @@ function matchDataRecursive(dest, src) { } } } + + if (addNewKeys) { + for (const key in src) { + if (!dest[key]) { + dest[key] = JSON.parse(JSON.stringify(src[key])); + } + } + } } export function updateApplicationLanguage(id) {