mirror of
https://github.com/MagicMirrorOrg/MagicMirror.git
synced 2026-03-12 17:51:41 +08:00
Thanks to: @Blackspirits, @Crazylegstoo, @jarnoml, @jboucly, @JHWelch, @khassel, @KristjanESPERANTO, @rejas, @sdetweil, @xsorifc28 ⚠️ This release needs nodejs version >=22.21.1 <23 || >=24 [Compare to previous Release v2.33.0](https://github.com/MagicMirrorOrg/MagicMirror/compare/v2.33.0...develop) [core] Prepare Release 2.34.0 (https://github.com/MagicMirrorOrg/MagicMirror/pull/3998) dependency update + adjust Playwright setup + fix linter issue (https://github.com/MagicMirrorOrg/MagicMirror/pull/3994) demo with gif (https://github.com/MagicMirrorOrg/MagicMirror/pull/3995) [core] fix: allow browser globals in config files (https://github.com/MagicMirrorOrg/MagicMirror/pull/3992) [core] fix: restore --ozone-platform=wayland flag for reliable Wayland support (https://github.com/MagicMirrorOrg/MagicMirror/pull/3989) [core] auto create release notes with every push on develop (https://github.com/MagicMirrorOrg/MagicMirror/pull/3985) [core] chore: simplify Wayland start script (https://github.com/MagicMirrorOrg/MagicMirror/pull/3974) [gitignore] restore the old Git behavior for the default modules (https://github.com/MagicMirrorOrg/MagicMirror/pull/3968) [core] configure cspell to check default modules only and fix typos (https://github.com/MagicMirrorOrg/MagicMirror/pull/3955) [gitignore] restoring the old Git behavior for the CSS directory (https://github.com/MagicMirrorOrg/MagicMirror/pull/3954) feat(core): add server:watch script with automatic restart on file changes (https://github.com/MagicMirrorOrg/MagicMirror/pull/3920) [check_config] refactor: improve error handling (https://github.com/MagicMirrorOrg/MagicMirror/pull/3927) refactor: replace express-ipfilter with lightweight custom middleware (https://github.com/MagicMirrorOrg/MagicMirror/pull/3917) refactor: replace module-alias dependency with internal alias resolver (https://github.com/MagicMirrorOrg/MagicMirror/pull/3893) [dependencies] [chore] update dependencies and min. node version (https://github.com/MagicMirrorOrg/MagicMirror/pull/3986) [core] bump dependencies into december (https://github.com/MagicMirrorOrg/MagicMirror/pull/3982) Bump actions/checkout from 5 to 6 (https://github.com/MagicMirrorOrg/MagicMirror/pull/3972) Update deps, unpin parse5 (https://github.com/MagicMirrorOrg/MagicMirror/pull/3934) [core] Update deps and pin jsdom to v27.0.0 (https://github.com/MagicMirrorOrg/MagicMirror/pull/3925) chore: update dependencies (https://github.com/MagicMirrorOrg/MagicMirror/pull/3921) update deps, exclude node v23 (https://github.com/MagicMirrorOrg/MagicMirror/pull/3916) remove eslint warnings, add npm publish process to Collaboration.md (https://github.com/MagicMirrorOrg/MagicMirror/pull/3913) feat: add ESlint rule no-sparse-arrays for config check (https://github.com/MagicMirrorOrg/MagicMirror/pull/3911) chore: bump dependencies into october (https://github.com/MagicMirrorOrg/MagicMirror/pull/3909) [logging] logger: add calling filename as prefix on server side (https://github.com/MagicMirrorOrg/MagicMirror/pull/3926) [logger] Add prefixes to most Log messages (https://github.com/MagicMirrorOrg/MagicMirror/pull/3923) [modules/alert] Add new pt and pt-BR translations for Alert module and update global PT strings (https://github.com/MagicMirrorOrg/MagicMirror/pull/3965) [modules/calendar] add checksum to test whether calendar event list changed (https://github.com/MagicMirrorOrg/MagicMirror/pull/3988) [calendar] fix: prevent excessive fetching on client reload and refactor calendarfetcherutils.js (https://github.com/MagicMirrorOrg/MagicMirror/pull/3976) [calendar] refactor: migrate CalendarFetcher to ES6 class and improve error handling (https://github.com/MagicMirrorOrg/MagicMirror/pull/3959) [calendar] Show repeatingCountTitle only if yearDiff > 0 (https://github.com/MagicMirrorOrg/MagicMirror/pull/3949) [tests] suppress debug logs in CI environment + improve calendar symbol test stability (https://github.com/MagicMirrorOrg/MagicMirror/pull/3941) [calendar] chore: remove requiresVersion: "2.1.0" (https://github.com/MagicMirrorOrg/MagicMirror/pull/3932) [calendar] test: remove "Recurring event per timezone" test (https://github.com/MagicMirrorOrg/MagicMirror/pull/3929) [modules/compliments] [compliments] refactor: optimize loadComplimentFile method and add unit tests (https://github.com/MagicMirrorOrg/MagicMirror/pull/3969) fix: set compliments remote file minimum delay to 15 minutes (https://github.com/MagicMirrorOrg/MagicMirror/pull/3970) [compliments] fix: duplicate query param "?" in compliments module refresh url (https://github.com/MagicMirrorOrg/MagicMirror/pull/3967) [modules/newsfeed] [newsfeed] fix header layout issue (https://github.com/MagicMirrorOrg/MagicMirror/pull/3946) [modules/weather] [weatherprovider] update subclass language use override (https://github.com/MagicMirrorOrg/MagicMirror/pull/3914) [weather] fix wind-icon not showing in pirateweather (https://github.com/MagicMirrorOrg/MagicMirror/pull/3957) [weather] add error handling to weather fetch functions, including cors (https://github.com/MagicMirrorOrg/MagicMirror/pull/3791) remove deprecated ukmetoffice datapoint provider, cleanup .gitignore (https://github.com/MagicMirrorOrg/MagicMirror/pull/3952) fixes problems with daylight-saving-time in weather provider openmeteo (https://github.com/MagicMirrorOrg/MagicMirror/pull/3931) Fix for envcanada Provider to use updated Env Canada URL (https://github.com/MagicMirrorOrg/MagicMirror/pull/3919) [weather] feat: add configurable forecast date format option (https://github.com/MagicMirrorOrg/MagicMirror/pull/3918) [testing] testing: update "Enforce Pull-Request Rules" workflow (https://github.com/MagicMirrorOrg/MagicMirror/pull/3987) [core] refactor: replace XMLHttpRequest with fetch and migrate e2e tests to Playwright (https://github.com/MagicMirrorOrg/MagicMirror/pull/3950) [test] replace node-libgpiod with serialport in electron-rebuild workflow (https://github.com/MagicMirrorOrg/MagicMirror/pull/3945) [ci] Add concurrency to automated tests workflow to cancel outdated runs (https://github.com/MagicMirrorOrg/MagicMirror/pull/3943) [tests] migrate from jest to vitest (https://github.com/MagicMirrorOrg/MagicMirror/pull/3940) --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Karsten Hassel <hassel@gmx.de> Co-authored-by: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com> Co-authored-by: Ryan Williams <65094007+ryan-d-williams@users.noreply.github.com> Co-authored-by: Veeck <github@veeck.de> Co-authored-by: Bugsounet - Cédric <github@bugsounet.fr> Co-authored-by: Marc Landis <dirk.rettschlag@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: HeikoGr <20295490+HeikoGr@users.noreply.github.com> Co-authored-by: Pedro Lamas <pedrolamas@gmail.com> Co-authored-by: veeck <gitkraken@veeck.de> Co-authored-by: Magnus <34011212+MagMar94@users.noreply.github.com> Co-authored-by: Ikko Eltociear Ashimine <eltociear@gmail.com> Co-authored-by: DevIncomin <56730075+Developer-Incoming@users.noreply.github.com> Co-authored-by: Nathan <n8nyoung@gmail.com> Co-authored-by: mixasgr <mixasgr@users.noreply.github.com> Co-authored-by: Savvas Adamtziloglou <savvas-gr@greeklug.gr> Co-authored-by: Konstantinos <geraki@gmail.com> Co-authored-by: OWL4C <124401812+OWL4C@users.noreply.github.com> Co-authored-by: BugHaver <43462320+bughaver@users.noreply.github.com> Co-authored-by: BugHaver <43462320+lsaadeh@users.noreply.github.com> Co-authored-by: Koen Konst <koenspero@gmail.com> Co-authored-by: Koen Konst <c.h.konst@avisi.nl> Co-authored-by: dathbe <github@beffa.us> Co-authored-by: Marcel <m-idler@users.noreply.github.com> Co-authored-by: Kevin G. <crazylegstoo@gmail.com> Co-authored-by: Jboucly <33218155+jboucly@users.noreply.github.com> Co-authored-by: Jboucly <contact@jboucly.fr> Co-authored-by: Jarno <54169345+jarnoml@users.noreply.github.com> Co-authored-by: Jordan Welch <JordanHWelch@gmail.com> Co-authored-by: Blackspirits <blackspirits@gmail.com> Co-authored-by: Samed Ozdemir <samed@xsor.io>
130 lines
4.2 KiB
JavaScript
130 lines
4.2 KiB
JavaScript
/* global translations */
|
|
|
|
const Translator = (function () {
|
|
|
|
/**
|
|
* Load a JSON file via fetch.
|
|
* @param {string} file Path of the file we want to load.
|
|
* @returns {Promise<object>} the translations in the specified file
|
|
*/
|
|
async function loadJSON (file) {
|
|
const baseHref = document.baseURI;
|
|
const url = new URL(file, baseHref);
|
|
|
|
try {
|
|
const response = await fetch(url);
|
|
if (!response.ok) {
|
|
throw new Error(`Unexpected response status: ${response.status}`);
|
|
}
|
|
return await response.json();
|
|
} catch (exception) {
|
|
Log.error(`Loading json file =${file} failed`);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
return {
|
|
coreTranslations: {},
|
|
coreTranslationsFallback: {},
|
|
translations: {},
|
|
translationsFallback: {},
|
|
|
|
/**
|
|
* Load a translation for a given key for a given module.
|
|
* @param {Module} module The module to load the translation for.
|
|
* @param {string} key The key of the text to translate.
|
|
* @param {object} variables The variables to use within the translation template (optional)
|
|
* @returns {string} the translated key
|
|
*/
|
|
translate (module, key, variables = {}) {
|
|
|
|
/**
|
|
* Combines template and variables like:
|
|
* template: "Please wait for {timeToWait} before continuing with {work}."
|
|
* variables: {timeToWait: "2 hours", work: "painting"}
|
|
* to: "Please wait for 2 hours before continuing with painting."
|
|
* @param {string} template Text with placeholder
|
|
* @param {object} variables Variables for the placeholder
|
|
* @returns {string} the template filled with the variables
|
|
*/
|
|
function createStringFromTemplate (template, variables) {
|
|
if (Object.prototype.toString.call(template) !== "[object String]") {
|
|
return template;
|
|
}
|
|
let templateToUse = template;
|
|
if (variables.fallback && !template.match(new RegExp("{.+}"))) {
|
|
templateToUse = variables.fallback;
|
|
}
|
|
return templateToUse.replace(new RegExp("{([^}]+)}", "g"), function (_unused, varName) {
|
|
return varName in variables ? variables[varName] : `{${varName}}`;
|
|
});
|
|
}
|
|
|
|
if (this.translations[module.name] && key in this.translations[module.name]) {
|
|
return createStringFromTemplate(this.translations[module.name][key], variables);
|
|
}
|
|
|
|
if (key in this.coreTranslations) {
|
|
return createStringFromTemplate(this.coreTranslations[key], variables);
|
|
}
|
|
|
|
if (this.translationsFallback[module.name] && key in this.translationsFallback[module.name]) {
|
|
return createStringFromTemplate(this.translationsFallback[module.name][key], variables);
|
|
}
|
|
|
|
if (key in this.coreTranslationsFallback) {
|
|
return createStringFromTemplate(this.coreTranslationsFallback[key], variables);
|
|
}
|
|
|
|
return key;
|
|
},
|
|
|
|
/**
|
|
* Load a translation file (json) and remember the data.
|
|
* @param {Module} module The module to load the translation file for.
|
|
* @param {string} file Path of the file we want to load.
|
|
* @param {boolean} isFallback Flag to indicate fallback translations.
|
|
*/
|
|
async load (module, file, isFallback) {
|
|
Log.log(`[translator] ${module.name} - Load translation${isFallback ? " fallback" : ""}: ${file}`);
|
|
|
|
if (this.translationsFallback[module.name]) {
|
|
return;
|
|
}
|
|
|
|
const json = await loadJSON(module.file(file));
|
|
const property = isFallback ? "translationsFallback" : "translations";
|
|
this[property][module.name] = json;
|
|
},
|
|
|
|
/**
|
|
* Load the core translations.
|
|
* @param {string} lang The language identifier of the core language.
|
|
*/
|
|
async loadCoreTranslations (lang) {
|
|
if (lang in translations) {
|
|
Log.log(`[translator] Loading core translation file: ${translations[lang]}`);
|
|
this.coreTranslations = await loadJSON(translations[lang]);
|
|
} else {
|
|
Log.log("[translator] Configured language not found in core translations.");
|
|
}
|
|
|
|
await this.loadCoreTranslationsFallback();
|
|
},
|
|
|
|
/**
|
|
* Load the core translations' fallback.
|
|
* The first language defined in translations.js will be used.
|
|
*/
|
|
async loadCoreTranslationsFallback () {
|
|
let first = Object.keys(translations)[0];
|
|
if (first) {
|
|
Log.log(`[translator] Loading core translation fallback file: ${translations[first]}`);
|
|
this.coreTranslationsFallback = await loadJSON(translations[first]);
|
|
}
|
|
}
|
|
};
|
|
}());
|
|
|
|
window.Translator = Translator;
|