From 631399991e19cd10f14180c36f50e4d388241751 Mon Sep 17 00:00:00 2001 From: Zack Rauen Date: Fri, 22 Oct 2021 16:34:48 -0400 Subject: [PATCH] Fix translation fallbacks --- renderer/src/modules/localemanager.js | 2 +- renderer/src/modules/utilities.js | 29 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/renderer/src/modules/localemanager.js b/renderer/src/modules/localemanager.js index 85aef7e9..0249cfea 100644 --- a/renderer/src/modules/localemanager.js +++ b/renderer/src/modules/localemanager.js @@ -32,7 +32,7 @@ export default new class LocaleManager { newStrings = Locales[this.defaultLocale]; } this.locale = newLocale; - Utilities.extend(this.strings, newStrings); + Utilities.extendTruthy(this.strings, newStrings); Events.emit("strings-updated"); } }; \ No newline at end of file diff --git a/renderer/src/modules/utilities.js b/renderer/src/modules/utilities.js index 313fef91..04d4148a 100644 --- a/renderer/src/modules/utilities.js +++ b/renderer/src/modules/utilities.js @@ -192,6 +192,35 @@ export default class Utilities { return extendee; } + /** + * Deep extends an object with a set of other objects. Objects later in the list + * of `extenders` have priority, that is to say if one sets a key to be a primitive, + * it will be overwritten with the next one with the same key. If it is an object, + * and the keys match, the object is extended. This happens recursively. + * @param {object} extendee - Object to be extended + * @param {...object} extenders - Objects to extend with + * @returns {object} - A reference to `extendee` + */ + static extendTruthy(extendee, ...extenders) { + for (let i = 0; i < extenders.length; i++) { + for (const key in extenders[i]) { + if (extenders[i].hasOwnProperty(key)) { + if (typeof extendee[key] === "object" && typeof extenders[i][key] === "object") { + this.extendTruthy(extendee[key], extenders[i][key]); + } + else if (typeof extenders[i][key] === "object") { + extendee[key] = {}; + this.extendTruthy(extendee[key], extenders[i][key]); + } + else if (extenders[i][key]) { + extendee[key] = extenders[i][key]; + } + } + } + } + return extendee; + } + /** * Format strings with placeholders (`{{placeholder}}`) into full strings. * Quick example: `PluginUtilities.formatString("Hello, {{user}}", {user: "Zerebos"})`