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"})`