diff --git a/packages/node_modules/@node-red/util/lib/i18n.js b/packages/node_modules/@node-red/util/lib/i18n.js index 738212b82..51b488129 100644 --- a/packages/node_modules/@node-red/util/lib/i18n.js +++ b/packages/node_modules/@node-red/util/lib/i18n.js @@ -81,35 +81,58 @@ function mergeCatalog(fallback,catalog) { } } -var MessageFileLoader = { - type: "backend", - init: function(services, backendOptions, i18nextOptions) {}, - read: function(lng, ns, callback) { - if (resourceMap[ns]) { - var file = path.join(resourceMap[ns].basedir,lng,resourceMap[ns].file); - //console.log(file); - fs.readFile(file,"utf8",function(err,content) { + +function readFile(lng, ns) { + return new Promise((resolve, reject) => { + if (resourceCache[ns] && resourceCache[ns][lng]) { + resolve(resourceCache[ns][lng]); + } else if (resourceMap[ns]) { + var file = path.join(resourceMap[ns].basedir, lng, resourceMap[ns].file); + fs.readFile(file, "utf8", function (err, content) { if (err) { - callback(err); + reject(err); } else { try { - resourceCache[ns] = resourceCache[ns]||{}; + resourceCache[ns] = resourceCache[ns] || {}; resourceCache[ns][lng] = JSON.parse(content.replace(/^\uFEFF/, '')); - //console.log(resourceCache[ns][lng]); - if (lng !== defaultLang) { - mergeCatalog(resourceCache[ns][defaultLang],resourceCache[ns][lng]); + var baseLng = lng.split('-')[0]; + if (baseLng !== lng && resourceCache[ns][baseLng]) { + mergeCatalog(resourceCache[ns][baseLng], resourceCache[ns][lng]); } - callback(null, resourceCache[ns][lng]); - } catch(e) { - callback(e); + if (lng !== defaultLang) { + mergeCatalog(resourceCache[ns][defaultLang], resourceCache[ns][lng]); + } + resolve(resourceCache[ns][lng]); + } catch (e) { + reject(e); } } }); } else { - callback(new Error("Unrecognised namespace")); + reject(new Error("Unrecognised namespace")); } - } + }); +} +var MessageFileLoader = { + type: "backend", + init: function (services, backendOptions, i18nextOptions) { }, + read: function (lng, ns, callback) { + // there are two languages to consider: + // 1) the actual language lng (e. g. 'en-US' or 'de-DE', 'fr-FR',...) + // 2) the base language (e. g. 'en', 'de', 'fr',...) + var baseLng = lng.split('-')[0]; + // read base language (e. g. 'de'), then actual language (e. g. 'de-DE') + readFile(baseLng, ns).then( + baseData => { + // scenario 2: reading base language was successful -> read actual language -> if this fails, return base language data + readFile(lng, ns).then(data => callback(null, data), () => callback(null, baseData)) + }, + () => { + // scenario 2: reading base language failed -> read actual language -> if this fails too, return error + readFile(lng, ns).then(data => callback(null, data), err => callback(err)) + }); + } } function getCurrentLocale() {