1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00

Expose i18n in editor

This commit is contained in:
Nick O'Leary 2015-05-06 22:14:00 +01:00
parent 008bc98070
commit a7900940da
12 changed files with 133 additions and 38 deletions

View File

@ -93,6 +93,7 @@ module.exports = function(grunt) {
// Ensure editor source files are concatenated in // Ensure editor source files are concatenated in
// the right order // the right order
"editor/js/main.js", "editor/js/main.js",
"editor/js/i18n.js",
"editor/js/settings.js", "editor/js/settings.js",
"editor/js/user.js", "editor/js/user.js",
"editor/js/comms.js", "editor/js/comms.js",

44
editor/js/i18n.js Normal file
View File

@ -0,0 +1,44 @@
/**
* Copyright 2013, 2015 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
RED.i18n = (function() {
return {
init: function(done) {
i18n.init({
resGetPath: 'locales/__ns__?lang=__lng__',
dynamicLoad: false,
ns: {
namespaces: ["editor","node-red"],
defaultNs: "editor"
},
fallbackLng: ['en']
},function() {
done();
});
RED["_"] = function() {
return i18n.t.apply(null,arguments);
}
},
loadCatalog: function(namespace,done) {
i18n.loadNamespace(namespace,done);
}
}
})();

View File

@ -16,8 +16,8 @@
var RED = (function() { var RED = (function() {
function loadSettings() { function loadLocales() {
RED.settings.init(loadNodeList); RED.i18n.init(loadEditor);
} }
function loadNodeList() { function loadNodeList() {
@ -29,10 +29,26 @@ var RED = (function() {
url: 'nodes', url: 'nodes',
success: function(data) { success: function(data) {
RED.nodes.setNodeList(data); RED.nodes.setNodeList(data);
var nsCount = 0;
for(var i=0;i<data.length;i++) {
var ns = data[i];
if (ns.module != "node-red") {
nsCount++;
RED.i18n.loadCatalog(ns.id, function() {
nsCount--;
if (nsCount === 0) {
loadNodes(); loadNodes();
} }
}); });
} }
}
if (nsCount === 0) {
loadNodes();
}
}
});
}
function loadNodes() { function loadNodes() {
$.ajax({ $.ajax({
@ -43,6 +59,9 @@ var RED = (function() {
url: 'nodes', url: 'nodes',
success: function(data) { success: function(data) {
$("body").append(data); $("body").append(data);
$("body").i18n();
$(".palette-spinner").hide(); $(".palette-spinner").hide();
$(".palette-scroll").show(); $(".palette-scroll").show();
$("#palette-search").show(); $("#palette-search").show();
@ -135,21 +154,6 @@ var RED = (function() {
RED.view.status(statusEnabled); RED.view.status(statusEnabled);
} }
function loadLocales() {
i18n.init({
ns: {
namespaces: ["editor"],
defaultNs: "editor"
},
fallbackLng: ['en-US']
},function() {
RED["_"] = function() {
return i18n.t.apply(null,arguments);
}
loadEditor();
});
}
function loadEditor() { function loadEditor() {
RED.menu.init({id:"btn-sidemenu", RED.menu.init({id:"btn-sidemenu",
options: [ options: [

View File

@ -107,6 +107,7 @@ RED.nodes = (function() {
registerNodeType: function(nt,def) { registerNodeType: function(nt,def) {
nodeDefinitions[nt] = def; nodeDefinitions[nt] = def;
if (def.category != "subflows") { if (def.category != "subflows") {
def.set = nodeSets[typeToId[nt]];
nodeSets[typeToId[nt]].added = true; nodeSets[typeToId[nt]].added = true;
// TODO: too tightly coupled into palette UI // TODO: too tightly coupled into palette UI
} }
@ -134,6 +135,19 @@ RED.nodes = (function() {
} }
function addNode(n) { function addNode(n) {
var ns;
if (n._def.set.module === "node-red") {
ns = "node-red";
} else {
ns = n._def.set.id;
}
n["_"] = function() {
var args = Array.prototype.slice.call(arguments, 0);
if (args[0].indexOf(":") === -1) {
args[0] = ns+":"+args[0];
}
return RED._.apply(null,args);
}
if (n._def.category == "config") { if (n._def.category == "config") {
configNodes[n.id] = n; configNodes[n.id] = n;
RED.sidebar.config.refresh(); RED.sidebar.config.refresh();

View File

@ -574,13 +574,21 @@ RED.editor = (function() {
$( "#dialog" ).dialog("option","buttons",buttons); $( "#dialog" ).dialog("option","buttons",buttons);
} }
$("#dialog-form").html($("script[data-template-name='"+type+"']").html()); $("#dialog-form").html($("script[data-template-name='"+type+"']").html());
var ns;
if (node._def.set.module === "node-red") {
ns = "node-red";
} else {
ns = node._def.set.id;
}
$("#dialog-form").find('[data-i18n]').each(function() {
var current = $(this).attr("data-i18n");
if (current.indexOf(":") === -1) {
$(this).attr("data-i18n",ns+":"+current);
}
});
$('<input type="text" style="display: none;" />').appendTo("#dialog-form"); $('<input type="text" style="display: none;" />').appendTo("#dialog-form");
prepareEditDialog(node,node._def,"node-input"); prepareEditDialog(node,node._def,"node-input");
$("#dialog").i18n();
$( "#dialog" ).dialog("option","title","Edit "+type+" node").dialog( "open" ); $( "#dialog" ).dialog("option","title","Edit "+type+" node").dialog( "open" );
} }
@ -603,6 +611,21 @@ RED.editor = (function() {
} }
$("#dialog-config-form").html($("script[data-template-name='"+type+"']").html()); $("#dialog-config-form").html($("script[data-template-name='"+type+"']").html());
var ns;
if (node_def.set.module === "node-red") {
ns = "node-red";
} else {
ns = node_def.set.id;
}
$("#dialog-config-form").find('[data-i18n]').each(function() {
var current = $(this).attr("data-i18n");
if (current.indexOf(":") === -1) {
$(this).attr("data-i18n",ns+":"+current);
}
});
prepareEditDialog(configNode,node_def,"node-config-input"); prepareEditDialog(configNode,node_def,"node-config-input");
var buttons = $( "#node-config-dialog" ).dialog("option","buttons"); var buttons = $( "#node-config-dialog" ).dialog("option","buttons");
@ -652,6 +675,8 @@ RED.editor = (function() {
} }
$( "#node-config-dialog" ).dialog("option","buttons",buttons); $( "#node-config-dialog" ).dialog("option","buttons",buttons);
$("#node-config-dialog").i18n();
$( "#node-config-dialog" ) $( "#node-config-dialog" )
.dialog("option","node-adding",adding) .dialog("option","node-adding",adding)
.dialog("option","node-property",name) .dialog("option","node-property",name)

View File

@ -152,7 +152,7 @@
<div id="node-dialog-rename-workspace" class="hide"> <div id="node-dialog-rename-workspace" class="hide">
<form class="form-horizontal"> <form class="form-horizontal">
<div class="form-row"> <div class="form-row">
<label for="node-input-workspace-name" ><i class="fa fa-tag"></i> Name:</label> <label for="node-input-workspace-name" ><i class="fa fa-tag"></i> <span data-i18n="workspace.label.name"></span>:</label>
<input type="text" id="node-input-workspace-name"> <input type="text" id="node-input-workspace-name">
</div> </div>
</form> </form>

View File

@ -1,3 +1,7 @@
{ {
"foo": "fred" "workspace": {
"label": {
"name": "Name"
}
}
} }

View File

@ -16,7 +16,7 @@
<script type="text/x-red" data-template-name="inject"> <script type="text/x-red" data-template-name="inject">
<div class="form-row node-input-payload"> <div class="form-row node-input-payload">
<label for="node-input-payloadType"><i class="fa fa-envelope"></i> Payload</label> <label for="node-input-payloadType"><i class="fa fa-envelope"></i> <span data-i18n="inject.payload"></span></label>
<select id="node-input-payloadType" style="width:73%"> <select id="node-input-payloadType" style="width:73%">
<option value="date">timestamp</option> <option value="date">timestamp</option>
<option value="string">string</option> <option value="string">string</option>

View File

@ -3,6 +3,8 @@
"repeat": "repeat = __repeat__", "repeat": "repeat = __repeat__",
"crontab": "crontab = __crontab__", "crontab": "crontab = __crontab__",
"stopped": "stopped", "stopped": "stopped",
"failed": "Inject failed: __error__" "failed": "Inject failed: __error__",
"payload": "Payload"
} }
} }

View File

@ -86,7 +86,7 @@ function init(adminApp,storage) {
adminApp.get("/nodes/:mod/:set",needsPermission("nodes.read"),nodes.getSet); adminApp.get("/nodes/:mod/:set",needsPermission("nodes.read"),nodes.getSet);
adminApp.put("/nodes/:mod/:set",needsPermission("nodes.write"),nodes.putSet); adminApp.put("/nodes/:mod/:set",needsPermission("nodes.write"),nodes.putSet);
adminApp.get(/^\/locales\/(.+?)\/(.*).json$/,needsPermission("nodes.read"),locales.get); adminApp.get(/locales\/(.+)\/?$/,needsPermission("nodes.read"),locales.get);
// Library // Library
library.init(adminApp); library.init(adminApp);

View File

@ -17,13 +17,10 @@ var i18n = require("../i18n");
module.exports = { module.exports = {
get: function(req,res) { get: function(req,res) {
var lang = req.params[0]; var namespace = req.params[0];
var namespace = req.params[1]; namespace = namespace.replace(/\.json$/,"");
var lang = "en-US"; // TODO: determine requested lang
var catalog = i18n.catalog(namespace,lang); var catalog = i18n.catalog(namespace,lang);
if (catalog) { res.json(catalog||{});
res.json(catalog);
} else {
res.send(404);
}
} }
} }

View File

@ -37,7 +37,6 @@ function registerMessageCatalog(namespace,dir,file) {
return when.promise(function(resolve,reject) { return when.promise(function(resolve,reject) {
resourceMap[namespace] = { basedir:dir, file:file}; resourceMap[namespace] = { basedir:dir, file:file};
i18n.loadNamespace(namespace,function() { i18n.loadNamespace(namespace,function() {
//console.log(namespace,dir);
resolve(); resolve();
}); });
}); });
@ -47,14 +46,16 @@ var MessageFileLoader = {
fetchOne: function(lng, ns, callback) { fetchOne: function(lng, ns, callback) {
if (resourceMap[ns]) { if (resourceMap[ns]) {
var file = path.join(resourceMap[ns].basedir,lng,resourceMap[ns].file); var file = path.join(resourceMap[ns].basedir,lng,resourceMap[ns].file);
//console.log(file);
fs.readFile(file,"utf8",function(err,content) { fs.readFile(file,"utf8",function(err,content) {
if (err) { if (err) {
callback(err); callback(err);
} else { } else {
try { try {
//console.log(">>",ns,file); //console.log(">>",ns,file,lng);
resourceCache[ns] = resourceCache[ns]||{}; resourceCache[ns] = resourceCache[ns]||{};
resourceCache[ns][lng] = JSON.parse(content.replace(/^\uFEFF/, '')); resourceCache[ns][lng] = JSON.parse(content.replace(/^\uFEFF/, ''));
//console.log(resourceCache[ns][lng]);
callback(null, resourceCache[ns][lng]); callback(null, resourceCache[ns][lng]);
} catch(e) { } catch(e) {
callback(e); callback(e);
@ -84,6 +85,8 @@ function init() {
} }
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];
@ -94,6 +97,7 @@ function getCatalog(namespace,lang) {
} }
} }
} }
//console.log(result);
return result; return result;
} }