From dae1d6057e61dc5bf5d9d96bf4422e210f0a9acb Mon Sep 17 00:00:00 2001 From: tot92 Date: Sat, 9 Nov 2019 22:07:06 +0100 Subject: [PATCH 1/3] fixed i18n language fallback behaviour --- .../node_modules/@node-red/util/lib/i18n.js | 59 +++++++++++++------ 1 file changed, 41 insertions(+), 18 deletions(-) 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() { From 4d6828ec1423ea1aaeef6ec0a5ccf95f999b2806 Mon Sep 17 00:00:00 2001 From: tot92 Date: Sat, 9 Nov 2019 22:09:02 +0100 Subject: [PATCH 2/3] typo --- packages/node_modules/@node-red/util/lib/i18n.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/util/lib/i18n.js b/packages/node_modules/@node-red/util/lib/i18n.js index 51b488129..39e4a2c1a 100644 --- a/packages/node_modules/@node-red/util/lib/i18n.js +++ b/packages/node_modules/@node-red/util/lib/i18n.js @@ -125,7 +125,7 @@ var MessageFileLoader = { // 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 + // scenario 1: 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)) }, () => { From 683c6a748ee510efb52848f37fd2018511f4f63d Mon Sep 17 00:00:00 2001 From: tot92 Date: Mon, 18 Nov 2019 20:45:48 +0100 Subject: [PATCH 3/3] switched loading order --- .../node_modules/@node-red/util/lib/i18n.js | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/packages/node_modules/@node-red/util/lib/i18n.js b/packages/node_modules/@node-red/util/lib/i18n.js index 39e4a2c1a..236b66306 100644 --- a/packages/node_modules/@node-red/util/lib/i18n.js +++ b/packages/node_modules/@node-red/util/lib/i18n.js @@ -118,19 +118,12 @@ 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 1: 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)) + readFile(lng, ns) + .then(data => callback(null, data)) + .catch(() => { + // if reading language file fails -> try reading base language (e. g. 'fr' instead of 'fr-FR' or 'de' for 'de-DE') + var baseLng = lng.split('-')[0]; + readFile(baseLng, ns).then(baseData => callback(null, baseData)).catch(err => callback(err)); }); } }