mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Move locale files under api/runtime components
This commit is contained in:
parent
88dc202db2
commit
d2be7f8c8f
13
Gruntfile.js
13
Gruntfile.js
@ -174,8 +174,8 @@ module.exports = function(grunt) {
|
|||||||
messages: {
|
messages: {
|
||||||
src: [
|
src: [
|
||||||
'nodes/core/locales/en-US/messages.json',
|
'nodes/core/locales/en-US/messages.json',
|
||||||
'locales/en-US/editor.json',
|
'red/api/locales/en-US/editor.json',
|
||||||
'locales/en-US/runtime.json'
|
'red/runtime/locales/en-US/runtime.json'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -223,8 +223,8 @@ module.exports = function(grunt) {
|
|||||||
json: {
|
json: {
|
||||||
files: [
|
files: [
|
||||||
'nodes/core/locales/en-US/messages.json',
|
'nodes/core/locales/en-US/messages.json',
|
||||||
'locales/en-US/editor.json',
|
'red/api/locales/en-US/editor.json',
|
||||||
'locales/en-US/runtime.json'
|
'red/runtime/locales/en-US/runtime.json'
|
||||||
],
|
],
|
||||||
tasks: ['jsonlint:messages']
|
tasks: ['jsonlint:messages']
|
||||||
}
|
}
|
||||||
@ -238,7 +238,7 @@ module.exports = function(grunt) {
|
|||||||
args: nodemonArgs,
|
args: nodemonArgs,
|
||||||
ext: 'js,html,json',
|
ext: 'js,html,json',
|
||||||
watch: [
|
watch: [
|
||||||
'red','nodes','locales'
|
'red','nodes'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -302,8 +302,7 @@ module.exports = function(grunt) {
|
|||||||
'red/**',
|
'red/**',
|
||||||
'public/**',
|
'public/**',
|
||||||
'editor/templates/**',
|
'editor/templates/**',
|
||||||
'bin/**',
|
'bin/**'
|
||||||
'locales/**'
|
|
||||||
],
|
],
|
||||||
dest: path.resolve('<%= paths.dist %>/node-red-<%= pkg.version %>')
|
dest: path.resolve('<%= paths.dist %>/node-red-<%= pkg.version %>')
|
||||||
}]
|
}]
|
||||||
|
@ -34,6 +34,7 @@ var comms = require("./comms");
|
|||||||
var auth = require("./auth");
|
var auth = require("./auth");
|
||||||
var needsPermission = auth.needsPermission;
|
var needsPermission = auth.needsPermission;
|
||||||
|
|
||||||
|
var i18n;
|
||||||
var log;
|
var log;
|
||||||
var adminApp;
|
var adminApp;
|
||||||
var nodeApp;
|
var nodeApp;
|
||||||
@ -50,6 +51,7 @@ var errorHandler = function(err,req,res,next) {
|
|||||||
|
|
||||||
function init(server,runtime) {
|
function init(server,runtime) {
|
||||||
var settings = runtime.settings;
|
var settings = runtime.settings;
|
||||||
|
i18n = runtime.i18n;
|
||||||
log = runtime.log;
|
log = runtime.log;
|
||||||
if (settings.httpNodeRoot !== false) {
|
if (settings.httpNodeRoot !== false) {
|
||||||
nodeApp = express();
|
nodeApp = express();
|
||||||
@ -127,8 +129,9 @@ function init(server,runtime) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
function start() {
|
function start() {
|
||||||
comms.start();
|
return i18n.registerMessageCatalog("editor",path.resolve(path.join(__dirname,"locales")),"editor.json").then(function(){
|
||||||
return when.resolve();
|
comms.start();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
function stop() {
|
function stop() {
|
||||||
comms.stop();
|
comms.stop();
|
||||||
|
@ -13,20 +13,52 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
var i18n;
|
var i18n;
|
||||||
|
var supportedLangs = [];
|
||||||
|
|
||||||
|
var apiLocalDir = path.resolve(path.join(__dirname,"locales"));
|
||||||
|
|
||||||
|
var initSupportedLangs = function() {
|
||||||
|
fs.readdir(apiLocalDir, function(err,files) {
|
||||||
|
if(!err) {
|
||||||
|
supportedLangs = files;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function determineLangFromHeaders(acceptedLanguages){
|
||||||
|
var lang = i18n.defaultLang;
|
||||||
|
acceptedLanguages = acceptedLanguages || [];
|
||||||
|
for (var i=0;i<acceptedLanguages.length;i++){
|
||||||
|
if (supportedLangs.indexOf(acceptedLanguages[i]) !== -1){
|
||||||
|
lang = acceptedLanguages[i];
|
||||||
|
break;
|
||||||
|
// check the language without the country code
|
||||||
|
} else if (supportedLangs.indexOf(acceptedLanguages[i].split("-")[0]) !== -1) {
|
||||||
|
lang = acceptedLanguages[i].split("-")[0];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lang;
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
init: function(runtime) {
|
init: function(runtime) {
|
||||||
i18n = runtime.i18n;
|
i18n = runtime.i18n;
|
||||||
|
initSupportedLangs();
|
||||||
},
|
},
|
||||||
get: function(req,res) {
|
get: function(req,res) {
|
||||||
var namespace = req.params[0];
|
var namespace = req.params[0];
|
||||||
namespace = namespace.replace(/\.json$/,"");
|
namespace = namespace.replace(/\.json$/,"");
|
||||||
var lang = i18n.determineLangFromHeaders(req.acceptsLanguages() || []);
|
var lang = determineLangFromHeaders(req.acceptsLanguages() || []);
|
||||||
var prevLang = i18n.i.lng();
|
var prevLang = i18n.i.lng();
|
||||||
i18n.i.setLng(lang, function(){
|
i18n.i.setLng(lang, function(){
|
||||||
var catalog = i18n.catalog(namespace,lang);
|
var catalog = i18n.catalog(namespace,lang);
|
||||||
res.json(catalog||{});
|
res.json(catalog||{});
|
||||||
});
|
});
|
||||||
i18n.i.setLng(prevLang);
|
i18n.i.setLng(prevLang);
|
||||||
}
|
},
|
||||||
|
determineLangFromHeaders: determineLangFromHeaders
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
var when = require("when");
|
var when = require("when");
|
||||||
var comms = require("./comms");
|
var comms = require("./comms");
|
||||||
|
var locales = require("./locales");
|
||||||
var redNodes;
|
var redNodes;
|
||||||
var log;
|
var log;
|
||||||
var i18n;
|
var i18n;
|
||||||
@ -33,7 +34,7 @@ module.exports = {
|
|||||||
log.audit({event: "nodes.list.get"},req);
|
log.audit({event: "nodes.list.get"},req);
|
||||||
res.json(redNodes.getNodeList());
|
res.json(redNodes.getNodeList());
|
||||||
} else {
|
} else {
|
||||||
var lang = i18n.determineLangFromHeaders(req.acceptsLanguages());
|
var lang = locales.determineLangFromHeaders(req.acceptsLanguages());
|
||||||
log.audit({event: "nodes.configs.get"},req);
|
log.audit({event: "nodes.configs.get"},req);
|
||||||
res.send(redNodes.getNodeConfigs(lang));
|
res.send(redNodes.getNodeConfigs(lang));
|
||||||
}
|
}
|
||||||
@ -126,7 +127,7 @@ module.exports = {
|
|||||||
res.status(404).end();
|
res.status(404).end();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var lang = i18n.determineLangFromHeaders(req.acceptsLanguages());
|
var lang = locales.determineLangFromHeaders(req.acceptsLanguages());
|
||||||
result = redNodes.getNodeConfig(id,lang);
|
result = redNodes.getNodeConfig(id,lang);
|
||||||
if (result) {
|
if (result) {
|
||||||
log.audit({event: "nodes.config.get",id:id},req);
|
log.audit({event: "nodes.config.get",id:id},req);
|
||||||
|
@ -20,19 +20,9 @@ var path = require("path");
|
|||||||
var fs = require("fs");
|
var fs = require("fs");
|
||||||
|
|
||||||
var defaultLang = "en-US";
|
var defaultLang = "en-US";
|
||||||
var supportedLangs = [];
|
|
||||||
|
|
||||||
var resourceMap = {
|
var resourceMap = {};
|
||||||
"runtime": {
|
var resourceCache = {};
|
||||||
basedir: path.resolve(__dirname+"/../../locales"),
|
|
||||||
file:"runtime.json"
|
|
||||||
},
|
|
||||||
"editor": {
|
|
||||||
basedir: path.resolve(__dirname+"/../../locales"),
|
|
||||||
file: "editor.json"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var resourceCache = {}
|
|
||||||
|
|
||||||
function registerMessageCatalog(namespace,dir,file) {
|
function registerMessageCatalog(namespace,dir,file) {
|
||||||
return when.promise(function(resolve,reject) {
|
return when.promise(function(resolve,reject) {
|
||||||
@ -43,19 +33,6 @@ function registerMessageCatalog(namespace,dir,file) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var initSupportedLangs = function() {
|
|
||||||
return when.promise(function(resolve,reject) {
|
|
||||||
fs.readdir(resourceMap.editor.basedir, function(err,files) {
|
|
||||||
if(err) {
|
|
||||||
reject(err);
|
|
||||||
} else {
|
|
||||||
supportedLangs = files;
|
|
||||||
resolve();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function mergeCatalog(fallback,catalog) {
|
function mergeCatalog(fallback,catalog) {
|
||||||
for (var k in fallback) {
|
for (var k in fallback) {
|
||||||
if (fallback.hasOwnProperty(k)) {
|
if (fallback.hasOwnProperty(k)) {
|
||||||
@ -102,21 +79,17 @@ function init() {
|
|||||||
i18n.backend(MessageFileLoader);
|
i18n.backend(MessageFileLoader);
|
||||||
i18n.init({
|
i18n.init({
|
||||||
ns: {
|
ns: {
|
||||||
namespaces: ["runtime","editor"],
|
namespaces: [],
|
||||||
defaultNs: "runtime"
|
defaultNs: "runtime"
|
||||||
},
|
},
|
||||||
fallbackLng: ['en-US']
|
fallbackLng: [defaultLang]
|
||||||
},function() {
|
},function() {
|
||||||
initSupportedLangs().then(function() {
|
resolve();
|
||||||
resolve();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCatalog(namespace,lang) {
|
function getCatalog(namespace,lang) {
|
||||||
//console.log("+",namespace,lang);
|
|
||||||
//console.log(resourceCache[namespace][lang]);
|
|
||||||
var result = null;
|
var result = null;
|
||||||
if (resourceCache.hasOwnProperty(namespace)) {
|
if (resourceCache.hasOwnProperty(namespace)) {
|
||||||
result = resourceCache[namespace][lang];
|
result = resourceCache[namespace][lang];
|
||||||
@ -130,32 +103,15 @@ function getCatalog(namespace,lang) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//console.log(result);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function determineLangFromHeaders(acceptedLanguages){
|
|
||||||
var lang = "en-US";
|
|
||||||
acceptedLanguages = acceptedLanguages || [];
|
|
||||||
for (var i=0;i<acceptedLanguages.length;i++){
|
|
||||||
if (supportedLangs.indexOf(acceptedLanguages[i]) !== -1){
|
|
||||||
lang = acceptedLanguages[i];
|
|
||||||
break;
|
|
||||||
// check the language without the country code
|
|
||||||
} else if (supportedLangs.indexOf(acceptedLanguages[i].split("-")[0]) !== -1) {
|
|
||||||
lang = acceptedLanguages[i].split("-")[0];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lang;
|
|
||||||
}
|
|
||||||
|
|
||||||
var obj = module.exports = {
|
var obj = module.exports = {
|
||||||
init: init,
|
init: init,
|
||||||
registerMessageCatalog: registerMessageCatalog,
|
registerMessageCatalog: registerMessageCatalog,
|
||||||
catalog: getCatalog,
|
catalog: getCatalog,
|
||||||
i: i18n,
|
i: i18n,
|
||||||
determineLangFromHeaders: determineLangFromHeaders
|
defaultLang:defaultLang
|
||||||
}
|
}
|
||||||
|
|
||||||
obj['_'] = function() {
|
obj['_'] = function() {
|
||||||
|
@ -51,6 +51,9 @@ function getVersion() {
|
|||||||
|
|
||||||
function start() {
|
function start() {
|
||||||
return i18n.init()
|
return i18n.init()
|
||||||
|
.then(function() {
|
||||||
|
return i18n.registerMessageCatalog("runtime",path.resolve(path.join(__dirname,"locales")),"runtime.json")
|
||||||
|
})
|
||||||
.then(function() { return storage.init(settings)})
|
.then(function() { return storage.init(settings)})
|
||||||
.then(function() { return settings.load(storage)})
|
.then(function() { return settings.load(storage)})
|
||||||
.then(function() {
|
.then(function() {
|
||||||
|
@ -22,9 +22,8 @@ var sinon = require('sinon');
|
|||||||
var when = require('when');
|
var when = require('when');
|
||||||
|
|
||||||
var nodes = require("../../../red/api/nodes");
|
var nodes = require("../../../red/api/nodes");
|
||||||
|
|
||||||
var comms = require("../../../red/api/comms");
|
var comms = require("../../../red/api/comms");
|
||||||
|
var locales = require("../../../red/api/locales");
|
||||||
|
|
||||||
describe("nodes api", function() {
|
describe("nodes api", function() {
|
||||||
|
|
||||||
@ -37,6 +36,7 @@ describe("nodes api", function() {
|
|||||||
warn: function(){}
|
warn: function(){}
|
||||||
}
|
}
|
||||||
nodes.init(runtime);
|
nodes.init(runtime);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
before(function() {
|
before(function() {
|
||||||
@ -50,8 +50,11 @@ describe("nodes api", function() {
|
|||||||
app.put("/nodes/:mod/:set",nodes.putSet);
|
app.put("/nodes/:mod/:set",nodes.putSet);
|
||||||
app.delete("/nodes/:id",nodes.delete);
|
app.delete("/nodes/:id",nodes.delete);
|
||||||
sinon.stub(comms,"publish");
|
sinon.stub(comms,"publish");
|
||||||
|
sinon.stub(locales,"determineLangFromHeaders", function() {
|
||||||
|
return "en-US";
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
after(function() {
|
after(function() {
|
||||||
comms.publish.restore();
|
comms.publish.restore();
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user