diff --git a/editor/js/ui/clipboard.js b/editor/js/ui/clipboard.js
index 2db0f17ec..2b099e6e3 100644
--- a/editor/js/ui/clipboard.js
+++ b/editor/js/ui/clipboard.js
@@ -16,7 +16,7 @@
RED.clipboard = (function() {
-
+ // TODO: Fix issue where text outside an inner function cannot be NLS-enabled since RED._ is not available yet when that code is run
var dialog = $('
')
.appendTo("body")
.dialog({
@@ -27,7 +27,7 @@ RED.clipboard = (function() {
buttons: [
{
id: "clipboard-dialog-ok",
- text: "Ok",
+ text: "Ok", //RED._("dialog.ok"),
click: function() {
if (/Import/.test(dialog.dialog("option","title"))) {
RED.view.importNodes($("#clipboard-import").val());
@@ -37,14 +37,14 @@ RED.clipboard = (function() {
},
{
id: "clipboard-dialog-cancel",
- text: "Cancel",
+ text: "Cancel", //RED._("dialog.cancel"),
click: function() {
$( this ).dialog( "close" );
}
},
{
id: "clipboard-dialog-close",
- text: "Close",
+ text: "Close", //RED._("dialog.close"),
click: function() {
$( this ).dialog( "close" );
}
@@ -62,15 +62,16 @@ RED.clipboard = (function() {
var dialogContainer = dialog.children(".dialog-form");
var exportNodesDialog = ''+
- ' Nodes: '+
+ ' '+'Nodes:' /*RED._("dialog.nodes")*/+' '+
''+
'
'+
''+
- 'Select the text above and copy to the clipboard with Ctrl-C.'+
+ 'Select the text above and copy to the clipboard with Ctrl-C.'+
+ //RED._("dialog.selectToCopy")+
'
';
var importNodesDialog = ''+
- ''+
+ ''+
'
';
function validateImport() {
@@ -98,7 +99,7 @@ RED.clipboard = (function() {
$("#clipboard-import").keyup(validateImport);
$("#clipboard-import").on('paste',function() { setTimeout(validateImport,10)});
- dialog.dialog("option","title","Import nodes").dialog("open");
+ dialog.dialog("option","title",RED._("dialog.importNodes")).dialog("open");
}
function exportNodes() {
@@ -120,7 +121,7 @@ RED.clipboard = (function() {
return false;
})
});
- dialog.dialog("option","title","Export nodes to clipboard").dialog( "open" );
+ dialog.dialog("option","title",RED._("dialog.exportNodesClipboard")).dialog( "open" );
}
}
diff --git a/editor/js/ui/deploy.js b/editor/js/ui/deploy.js
index 90f75d1a5..0b985e097 100644
--- a/editor/js/ui/deploy.js
+++ b/editor/js/ui/deploy.js
@@ -49,18 +49,18 @@ RED.deploy = (function() {
if (type == "default") {
$(''+
- ' Deploy '+
+ ' '+RED._("deploy.deploy")+' '+
' '+
' ').prependTo(".header-toolbar");
RED.menu.init({id:"btn-deploy-options",
options: [
- {id:"deploymenu-item-full",toggle:"deploy-type",icon:"red/images/deploy-full.png",label:"Full",sublabel:"Deploys everything in the workspace",selected: true, onselect:function(s) { if(s){changeDeploymentType("full")}}},
- {id:"deploymenu-item-flow",toggle:"deploy-type",icon:"red/images/deploy-flows.png",label:"Modified Flows",sublabel:"Only deploys flows that contain changed nodes", onselect:function(s) {if(s){changeDeploymentType("flows")}}},
- {id:"deploymenu-item-node",toggle:"deploy-type",icon:"red/images/deploy-nodes.png",label:"Modified Nodes",sublabel:"Only deploys nodes that have changed",onselect:function(s) { if(s){changeDeploymentType("nodes")}}}
+ {id:"deploymenu-item-full",toggle:"deploy-type",icon:"red/images/deploy-full.png",label:RED._("deploy.full"),sublabel:RED._("deploy.fullDesc"),selected: true, onselect:function(s) { if(s){changeDeploymentType("full")}}},
+ {id:"deploymenu-item-flow",toggle:"deploy-type",icon:"red/images/deploy-flows.png",label:RED._("deploy.modifiedFlows"),sublabel:RED._("deploy.modifiedFlowsDesc"), onselect:function(s) {if(s){changeDeploymentType("flows")}}},
+ {id:"deploymenu-item-node",toggle:"deploy-type",icon:"red/images/deploy-nodes.png",label:RED._("deploy.modifiedNodes"),sublabel:RED._("deploy.modifiedNodesDesc"),onselect:function(s) { if(s){changeDeploymentType("nodes")}}}
]
});
} else if (type == "simple") {
- var label = options.label || "Deploy";
+ var label = options.label || RED._("deploy.deploy");
var icon = 'red/images/deploy-full-o.png';
if (options.hasOwnProperty('icon')) {
icon = options.icon;
@@ -83,7 +83,7 @@ RED.deploy = (function() {
height: "auto",
buttons: [
{
- text: "Confirm deploy",
+ text: RED._("deploy.confirmDeploy"),
click: function() {
var ignoreChecked = $( "#node-dialog-confirm-deploy-hide" ).prop("checked");
@@ -95,7 +95,7 @@ RED.deploy = (function() {
}
},
{
- text: "Cancel",
+ text: RED._("deploy.cancelDeploy"),
click: function() {
$( this ).dialog( "close" );
}
@@ -114,7 +114,7 @@ RED.deploy = (function() {
RED.nodes.on('change',function(state) {
if (state.dirty) {
window.onbeforeunload = function() {
- return "You have undeployed changes.\n\nLeaving this page will lose these changes.";
+ return RED._("deploy.undeployedChanges");
}
$("#btn-deploy").removeClass("disabled");
} else {
@@ -215,7 +215,7 @@ RED.deploy = (function() {
"Node-RED-Deployment-Type":deploymentType
}
}).done(function(data,textStatus,xhr) {
- RED.notify("Successfully deployed","success");
+ RED.notify(RED._("deploy.successfulDeploy"),"success");
RED.nodes.eachNode(function(node) {
if (node.changed) {
node.dirty = true;
@@ -236,9 +236,9 @@ RED.deploy = (function() {
}).fail(function(xhr,textStatus,err) {
RED.nodes.dirty(true);
if (xhr.responseText) {
- RED.notify("Error : "+xhr.responseJSON.message,"error");
+ RED.notify(RED._("deploy.error")+xhr.responseJSON.message,"error");
} else {
- RED.notify("Error : no response from server","error");
+ RED.notify(RED._("deploy.error")+RED._("deploy.noResponseError"),"error");
}
}).always(function() {
$("#btn-deploy-icon").removeClass('spinner');
diff --git a/editor/js/ui/editor.js b/editor/js/ui/editor.js
index 3de64f0f4..8d254bf47 100644
--- a/editor/js/ui/editor.js
+++ b/editor/js/ui/editor.js
@@ -178,7 +178,7 @@ RED.editor = (function() {
buttons: [
{
id: "node-dialog-ok",
- text: "Ok",
+ text: "Ok", // RED._("dialog.ok"),
click: function() {
if (editing_node) {
var changes = {};
@@ -285,7 +285,7 @@ RED.editor = (function() {
contentType: "application/json; charset=utf-8"
}).done(function() {
RED.library.loadFlowLibrary();
- RED.notify("Saved nodes","success");
+ RED.notify(RED._("editor.savedNodes"),"success");
});
}
}
@@ -294,7 +294,7 @@ RED.editor = (function() {
},
{
id: "node-dialog-cancel",
- text: "Cancel",
+ text: "Cancel", // RED._("dialog.cancel"),
click: function() {
if (editing_node && editing_node._def) {
if (editing_node._def.oneditcancel) {
@@ -392,9 +392,9 @@ RED.editor = (function() {
input.after(button);
if (node[property]) {
- button.text("edit");
+ button.text(RED._("editor.configEdit"));
} else {
- button.text("add");
+ button.text(RED._("editor.configAdd"));
}
button.click(function(e) {
@@ -565,7 +565,7 @@ RED.editor = (function() {
var buttons = $( "#dialog" ).dialog("option","buttons");
buttons.unshift({
class: 'leftButton',
- text: "Edit flow",
+ text: RED._("editor.editFlow"),
click: function() {
RED.workspaces.show(id);
$("#node-dialog-ok").click();
@@ -652,7 +652,7 @@ RED.editor = (function() {
if (buttons.length == 2) {
buttons.unshift({
class: 'leftButton',
- text: "Delete",
+ text: RED._("editor.configDelete"),
click: function() {
var configProperty = $(this).dialog('option','node-property');
var configId = $(this).dialog('option','node-id');
@@ -684,7 +684,7 @@ RED.editor = (function() {
});
}
buttons[1].text = "Update";
- $("#node-config-dialog-user-count").html(configNode.users.length+" node"+(configNode.users.length==1?" uses":"s use")+" this config").show();
+ $("#node-config-dialog-user-count").html(RED._("editor.nodesUse", {count:configNode.users.length})).show();
}
$( "#node-config-dialog" ).dialog("option","buttons",buttons);
@@ -695,7 +695,7 @@ RED.editor = (function() {
.dialog("option","node-property",name)
.dialog("option","node-id",configNode.id)
.dialog("option","node-type",type)
- .dialog("option","title",(adding?"Add new ":"Edit ")+type+" config node")
+ .dialog("option","title",(adding?RED._("editor.addNewConfig", {type:type}):RED._("editor.editConfig", {type:type})))
.dialog( "open" );
}
@@ -703,9 +703,9 @@ RED.editor = (function() {
var button = $("#node-input-edit-"+name);
if (button.length) {
if (value) {
- button.text("edit");
+ button.text(RED._("editor.configEdit"));
} else {
- button.text("add");
+ button.text(RED._("editor.configAdd"));
}
$("#node-input-"+name).val(value);
} else {
@@ -724,12 +724,12 @@ RED.editor = (function() {
select.append(''+label+' ');
}
});
-
- select.append('Add new '+type+'... ');
+ select.append(''+RED._("editor.addNewType", {type:type})+' ');
window.setTimeout(function() { select.change();},50);
}
}
-
+
+ // TODO: Cannot NLS enable until RED._ is exposed
$( "#node-config-dialog" ).dialog({
modal: true,
autoOpen: false,
@@ -740,7 +740,7 @@ RED.editor = (function() {
buttons: [
{
id: "node-config-dialog-ok",
- text: "Ok",
+ text: "Ok", // RED._("dialog.ok"),
click: function() {
var configProperty = $(this).dialog('option','node-property');
var configId = $(this).dialog('option','node-id');
@@ -800,7 +800,7 @@ RED.editor = (function() {
},
{
id: "node-config-dialog-cancel",
- text: "Cancel",
+ text: "Cancel", // RED._("dialog.cancel"),
click: function() {
var configType = $(this).dialog('option','node-type');
var configId = $(this).dialog('option','node-id');
@@ -854,7 +854,7 @@ RED.editor = (function() {
buttons: [
{
id: "subflow-dialog-ok",
- text: "Ok",
+ text: "Ok", // RED._("dialog.ok"),
click: function() {
if (editing_node) {
var i;
@@ -868,7 +868,7 @@ RED.editor = (function() {
changes['name'] = editing_node.name;
editing_node.name = newName;
changed = true;
- $("#menu-item-workspace-menu-"+editing_node.id.replace(".","-")).text("Subflow: "+newName);
+ $("#menu-item-workspace-menu-"+editing_node.id.replace(".","-")).text(RED._("editor.subflow")+newName);
}
RED.palette.refresh();
@@ -901,7 +901,7 @@ RED.editor = (function() {
},
{
id: "subflow-dialog-cancel",
- text: "Cancel",
+ text: "Cancel", // RED._("dialog.cancel")
click: function() {
$( this ).dialog( "close" );
editing_node = null;
@@ -940,9 +940,9 @@ RED.editor = (function() {
userCount++;
}
});
-
- $("#subflow-dialog-user-count").html("There "+(userCount==1?"is":"are")+" "+userCount+" instance"+(userCount==1?" ":"s")+" of this subflow").show();
- $("#subflow-dialog").dialog("option","title","Edit flow "+subflow.name).dialog( "open" );
+
+ $("#subflow-dialog-user-count").html(RED._("editor.subflowInstances", {count:userCount})).show();
+ $("#subflow-dialog").dialog("option","title",RED._("editor.editFlow")+subflow.name).dialog( "open" );
}
diff --git a/editor/js/ui/keyboard.js b/editor/js/ui/keyboard.js
index 179702c36..c9a340ee4 100644
--- a/editor/js/ui/keyboard.js
+++ b/editor/js/ui/keyboard.js
@@ -69,24 +69,24 @@ RED.keyboard = (function() {
dialog = $(''+
'
'+
'
'+
- 'Ctrl/⌘ + a Select all nodes '+
- 'Shift + Click Select all connected nodes '+
- 'Ctrl/⌘ + Click Add/remove node from selection '+
- 'Delete Delete selected nodes or link '+
+ 'Ctrl/⌘ + a '+RED._("keyboard.selectAll")+' '+
+ 'Shift + Click '+RED._("keyboard.selectAllConnected")+' '+
+ 'Ctrl/⌘ + Click '+RED._("keyboard.addRemoveNode")+' '+
+ 'Delete '+RED._("keyboard.deleteSelected")+' '+
' '+
- 'Ctrl/⌘ + i Import nodes '+
- 'Ctrl/⌘ + e Export selected nodes '+
+ 'Ctrl/⌘ + i '+RED._("keyboard.importNode")+' '+
+ 'Ctrl/⌘ + e '+RED._("keyboard.exportNode")+' '+
'
'+
'
'+
'
'+
'
'+
- 'Ctrl/⌘ + Space Toggle sidebar '+
+ 'Ctrl/⌘ + Space '+RED._("keyboard.toggleSidebar")+' '+
' '+
- 'Delete Delete selected nodes or link '+
+ 'Delete '+RED._("keyboard.deleteNode")+' '+
' '+
- 'Ctrl/⌘ + c Copy selected nodes '+
- 'Ctrl/⌘ + x Cut selected nodes '+
- 'Ctrl/⌘ + v Paste nodes '+
+ 'Ctrl/⌘ + c '+RED._("keyboard.copyNode")+' '+
+ 'Ctrl/⌘ + x '+RED._("keyboard.cutNode")+' '+
+ 'Ctrl/⌘ + v '+RED._("keyboard.pasteNode")+' '+
'
'+
'
'+
'
')
diff --git a/editor/js/ui/library.js b/editor/js/ui/library.js
index 7a98025f1..9f3baa4d2 100644
--- a/editor/js/ui/library.js
+++ b/editor/js/ui/library.js
@@ -146,8 +146,8 @@ RED.library = (function() {
''+
' '+
'
'
);
@@ -232,14 +232,14 @@ RED.library = (function() {
libraryEditor.$blockScrolling = Infinity;
$( "#node-dialog-library-lookup" ).dialog({
- title: options.type+" library",
+ title: RED._("library.typeLibrary", {type:options.type}),
modal: true,
autoOpen: false,
width: 800,
height: 450,
buttons: [
{
- text: "Ok",
+ text: RED._("dialog.ok"),
click: function() {
if (selectedLibraryItem) {
for (var i=0;i"+type+" ";
}
- popOverContent = $(l+($("script[data-help-name|='"+type+"']").html()||"no information available
").trim())
+ popOverContent = $(l+($("script[data-help-name|='"+type+"']").html()||""+RED._("palette.noInfo")+"
").trim())
.filter(function(n) {
return this.nodeType == 1 || (this.nodeType == 3 && this.textContent.trim().length > 0)
}).slice(0,2);
} catch(err) {
// Malformed HTML may cause errors. TODO: need to understand what can break
- console.log("Error generating pop-over label for '"+type+"'.");
+ console.log(RED._("palette.popOverError",{type:type}));
console.log(err.toString());
- popOverContent = ""+label+"
no information available
";
+ popOverContent = ""+label+"
"+RED._("palette.noInfo")+"
";
}
diff --git a/editor/js/ui/subflow.js b/editor/js/ui/subflow.js
index 1a49974da..cd42b7afb 100644
--- a/editor/js/ui/subflow.js
+++ b/editor/js/ui/subflow.js
@@ -216,7 +216,7 @@ RED.subflow = (function() {
function convertToSubflow() {
var selection = RED.view.selection();
if (!selection.nodes) {
- RED.notify("Cannot create subflow : no nodes selected","error");
+ RED.notify(RED._("notification.noNodesSelected"),"error");
return;
}
var i;
@@ -276,7 +276,7 @@ RED.subflow = (function() {
candidateOutputs.sort(function(a,b) { return a.source.y-b.source.y});
if (candidateInputs.length > 1) {
- RED.notify("Cannot create subflow : multiple inputs to selection","error");
+ RED.notify(RED._("notification.multipleInputsToSelection"),"error");
return;
}
//if (candidateInputs.length == 0) {
diff --git a/editor/js/ui/tab-info.js b/editor/js/ui/tab-info.js
index c5f62c5c9..3d4928e77 100644
--- a/editor/js/ui/tab-info.js
+++ b/editor/js/ui/tab-info.js
@@ -60,12 +60,12 @@ RED.sidebar.info = (function() {
function refresh(node) {
var table = '';
- table += 'Node ';
+ table += ''+RED._("tabInfo.node")+' ';
if (node.type != "subflow" && node.name) {
table += "Name "+node.name+" ";
}
- table += "Type "+node.type+" ";
- table += "ID "+node.id+" ";
+ table += ""+RED._("tabInfo.type")+" "+node.type+" ";
+ table += ""+RED._("tabInfo.id")+" "+node.id+" ";
var m = /^subflow(:(.+))?$/.exec(node.type);
if (m) {
@@ -76,7 +76,7 @@ RED.sidebar.info = (function() {
subflowNode = node;
}
- table += 'Subflow ';
+ table += ''+RED._("tabInfo.subflow")+' ';
var userCount = 0;
var subflowType = "subflow:"+subflowNode.id;
@@ -85,12 +85,12 @@ RED.sidebar.info = (function() {
userCount++;
}
});
- table += "name "+subflowNode.name+" ";
- table += "instances "+userCount+" ";
+ table += ""+RED._("tabInfo.name")+" "+subflowNode.name+" ";
+ table += ""+RED._("tabInfo.instances")+" "+userCount+" ";
}
if (!m && node.type != "subflow" && node.type != "comment") {
- table += ' ';
+ table += ' ';
if (node._def) {
for (var n in node._def.defaults) {
if (n != "name" && node._def.defaults.hasOwnProperty(n)) {
@@ -98,7 +98,7 @@ RED.sidebar.info = (function() {
var type = typeof val;
if (type === "string") {
if (val.length === 0) {
- val += 'blank ';
+ val += ''+RED._("tabInfo.blank")+' ';
} else {
if (val.length > 30) {
val = val.substring(0,30)+" ...";
diff --git a/editor/js/ui/view.js b/editor/js/ui/view.js
index 41a3d7ad1..0266a6868 100644
--- a/editor/js/ui/view.js
+++ b/editor/js/ui/view.js
@@ -309,11 +309,11 @@ RED.view = (function() {
if (activeSubflow && m) {
var subflowId = m[1];
if (subflowId === activeSubflow.id) {
- RED.notify("Error : Cannot add subflow to itself","error");
+ RED.notify(RED._("notification.cannotAddSubflowToItself"),"error");
return;
}
if (RED.nodes.subflowContains(m[1],activeSubflow.id)) {
- RED.notify("Error : Cannot add subflow - circular reference detected","error");
+ RED.notify(RED._("notification.cannotAddCircularReference"),"error");
return;
}
@@ -856,7 +856,7 @@ RED.view = (function() {
}
}
clipboard = JSON.stringify(nns);
- RED.notify(nns.length+" node"+(nns.length>1?"s":"")+" copied");
+ RED.notify(RED._("notification.nodeCopied",{count:nns.length}));
}
}
@@ -1043,9 +1043,9 @@ RED.view = (function() {
redraw();
}
} else if (d.changed) {
- RED.notify("Warning : node has undeployed changes","warning");
+ RED.notify(RED._("notification.undeployedChanges"),"warning");
} else {
- RED.notify("Warning : node actions disabled within subflow","warning");
+ RED.notify(RED._("notification.nodeActionDisabled"),"warning");
}
d3.event.preventDefault();
}
@@ -1754,9 +1754,9 @@ RED.view = (function() {
} catch(error) {
if (error.code != "NODE_RED") {
console.log(error.stack);
- RED.notify("Error : "+error,"error");
+ RED.notify(RED._("notification.error")+error,"error");
} else {
- RED.notify("Error : "+error.message,"error");
+ RED.notify(RED._("notification.error")+error.message,"error");
}
}
}
diff --git a/editor/js/ui/workspaces.js b/editor/js/ui/workspaces.js
index 9f7959e36..a4229a60d 100644
--- a/editor/js/ui/workspaces.js
+++ b/editor/js/ui/workspaces.js
@@ -122,11 +122,11 @@ RED.workspaces = (function() {
modal: true,
autoOpen: false,
width: 500,
- title: "Rename sheet",
+ title: "Rename sheet", // RED._("dialog.renameSheet"),
buttons: [
{
class: 'leftButton',
- text: "Delete",
+ text: "Delete", // RED._("dialog.delete"),
click: function() {
var workspace = $(this).dialog('option','workspace');
$( this ).dialog( "close" );
@@ -134,7 +134,7 @@ RED.workspaces = (function() {
}
},
{
- text: "Ok",
+ text: "Ok", // RED._("dialog.ok"),
click: function() {
var workspace = $(this).dialog('option','workspace');
var label = $( "#node-input-workspace-name" ).val();
@@ -148,7 +148,7 @@ RED.workspaces = (function() {
}
},
{
- text: "Cancel",
+ text: "Cancel", // RED._("dialog.cancel"),
click: function() {
$( this ).dialog( "close" );
}
@@ -165,10 +165,10 @@ RED.workspaces = (function() {
modal: true,
autoOpen: false,
width: 500,
- title: "Confirm delete",
+ title: "Confirm delete", // RED._("dialog.confirmDelete"),
buttons: [
{
- text: "Ok",
+ text: "Ok", // RED._("dialog.ok"),
click: function() {
var workspace = $(this).dialog('option','workspace');
deleteWorkspace(workspace,true);
@@ -176,7 +176,7 @@ RED.workspaces = (function() {
}
},
{
- text: "Cancel",
+ text: "Cancel", // RED._("dialog.cancel"),
click: function() {
$( this ).dialog( "close" );
}
@@ -251,7 +251,7 @@ RED.workspaces = (function() {
if (!workspace_tabs.contains(id)) {
var sf = RED.nodes.subflow(id);
if (sf) {
- addWorkspace({type:"subflow",id:id,label:"Subflow: "+sf.name, closeable: true});
+ addWorkspace({type:"subflow",id:id,label:RED._("workspaces.subflow")+sf.name, closeable: true});
}
}
workspace_tabs.activateTab(id);
@@ -259,7 +259,7 @@ RED.workspaces = (function() {
refresh: function() {
RED.nodes.eachSubflow(function(sf) {
if (workspace_tabs.contains(sf.id)) {
- workspace_tabs.renameTab(sf.id,"Subflow: "+sf.name);
+ workspace_tabs.renameTab(sf.id,RED._("workspaces.subflow")+sf.name);
}
});
},
diff --git a/locales/en-US/editor.json b/locales/en-US/editor.json
index 1ac40030b..c8333c4c8 100644
--- a/locales/en-US/editor.json
+++ b/locales/en-US/editor.json
@@ -36,7 +36,19 @@
"nodeDisabled_plural": "Nodes disabled:",
"lostConnectionError": "Error : Lost connection to server",
"importUnrecognised": "Imported unrecognised ",
- "loggedInAs": "Logged in as "
+ "loggedInAs": "Logged in as ",
+ "invalidFilename": "Invalid filename",
+ "savedType": "Saved __type__",
+ "saveFailed": "Save failed: ",
+ "noNodesSelected": "Cannot create subflow : no nodes selected",
+ "multipleInputsToSelection": "Cannot create subflow : multiple inputs to selection",
+ "cannotAddSubflowToItself": "Error : Cannot add subflow to itself",
+ "cannotAddCircularReference": "Error : Cannot add subflow - circular reference detected",
+ "nodeCopied": "__count__ node copied",
+ "nodeCopied_plural": "__count__ nodes copied",
+ "undeployedChanges": "Warning : node has undeployed changes",
+ "nodeActionDisabled": "Warning : node actions disabled within subflow",
+ "error": "Error : "
},
"error": {
"apiSubflowOnly": "this api is subflow only. called with:",
@@ -47,6 +59,84 @@
"dialog": {
"cancel": "Cancel",
"login": "Login",
- "loginFailed": "Login failed"
+ "loginFailed": "Login failed",
+ "ok": "Ok",
+ "delete": "Delete",
+ "close": "Close",
+ "nodes": " Nodes:",
+ "selectToCopy": "Select the text above and copy to the clipboard with Ctrl-C.",
+ "pasteNodesHere": "Paste nodes here",
+ "importNodes": "Import nodes",
+ "exportNodesClipboard": "Export nodes to clipboard",
+ "renameSheet": "Rename sheet",
+ "confirmDelete": "Confirm delete"
+ },
+ "deploy": {
+ "deploy": "Deploy",
+ "full": "Full",
+ "modifiedFlows": "Modified Flows",
+ "modifiedNodes": "Modified Nodes",
+ "fullDesc": "Deploys everything in the workspace",
+ "modifiedFlowsDesc": "Only deploys flows that contain changed nodes",
+ "modifiedNodesDesc": "Only deploys nodes that have changed",
+ "confirmDeploy": "Confirm deploy",
+ "cancelDeploy": "Cancel",
+ "undeployedChanges": "You have undeployed changes.\n\nLeaving this page will lose these changes.",
+ "successfulDeploy": "Successfully Deployed",
+ "error": "Error : ",
+ "noResponseError": "no response from server"
+ },
+ "editor": {
+ "savedNodes": "Saved nodes",
+ "configEdit": "edit",
+ "configAdd": "add",
+ "configDelete": "Delete",
+ "editFlow": "Edit flow ",
+ "nodesUse": "__count__ node uses this config",
+ "nodesUse_plural": "__count__ nodes use this config",
+ "addNewConfig": "Add new __type__ config node",
+ "editConfig": "Edit __type__ config node",
+ "addNewType": "Add new __type__...",
+ "subflow": "Subflow: ",
+ "subflowInstances": "There is __count__ instance of this subflow",
+ "subflowInstances_plural": "There are __count__ instances of this subflow"
+ },
+ "keyboard": {
+ "selectAll": "Select all nodes",
+ "selectAllConnected": "Select all connected nodes",
+ "addRemoveNode": "Add/remove node from selection",
+ "deleteSelected": "Delete selected nodes or link",
+ "importNode": "Import nodes",
+ "exportNode": "Export selected nodes",
+ "toggleSidebar": "Toggle sidebar",
+ "deleteNode": "Delete selected nodes or link",
+ "copyNode": "Copy selected nodes",
+ "cutNode": "Cut selected nodes",
+ "pasteNode": "Paste nodes"
+ },
+ "library": {
+ "openLibrary": "Open Library...",
+ "saveToLibrary": "Save to Library...",
+ "typeLibrary": "__type__ library",
+ "unnamedType": "Unnamed __type__",
+ "saveToLibrary": "Save to Library",
+ "exportToLibrary": "Export nodes to library"
+ },
+ "palette": {
+ "noInfo": "no information available",
+ "popOverError": "Error generating pop-over label for '__type__'."
+ },
+ "tabInfo": {
+ "node": "Node",
+ "type": "Type",
+ "id": "ID",
+ "subflow": "Subflow",
+ "name": "name",
+ "instances": "instances",
+ "properties": "Properties",
+ "blank": "blank"
+ },
+ "workspaces": {
+ "subflow": "Subflow: "
}
}
diff --git a/locales/zz-ZZ/editor.json b/locales/zz-ZZ/editor.json
new file mode 100644
index 000000000..a30fe6815
--- /dev/null
+++ b/locales/zz-ZZ/editor.json
@@ -0,0 +1,142 @@
+{
+ "workspace": {
+ "label": {
+ "name": "[G'Nameฏูİı|]"
+ }
+ },
+ "menu": {
+ "label": {
+ "sidebar": "[G'Sidebarฏูİı|]",
+ "displayStatus": "[G'Display node statusฏูİı|]",
+ "import": "[G'Importฏูİı|]",
+ "export": "[G'Exportฏูİı|]",
+ "clipboard": "[G'Clipboardฏูİı|]",
+ "library": "[G'Libraryฏูİı|]",
+ "configurationNodes": "[G'Configuration nodesฏูİı|]",
+ "subflows": "[G'Subflowsฏูİı|]",
+ "createSubflow": "[G'Create subflowฏูİı|]",
+ "selectionToSubflow": "[G'Selection to subflowฏูİı|]",
+ "workspaces": "[G'Workspacesฏูİı|]",
+ "add": "[G'Addฏูİı|]",
+ "rename": "[G'Renameฏูİı|]",
+ "delete": "[G'Deleteฏูİı|]",
+ "keyboardShortcuts": "[G'Keyboard Shortcutsฏูİı|]",
+ "login": "[G'Loginฏูİı|]",
+ "logout": "[G'Logoutฏูİı|]"
+ }
+ },
+ "notification": {
+ "nodeAdded": "[G'Node added to palette:ฏูİı|]",
+ "nodeAdded_plural": "[G'Nodes added to paletteฏูİı|]",
+ "nodeRemoved": "[G'Node removed from palette:ฏูİı|]",
+ "nodeRemoved_plural": "[G'Nodes removed from palette:ฏูİı|]",
+ "nodeEnabled": "[G'Node enabled:ฏูİı|]",
+ "nodeEnabled_plural": "[G'Nodes enabled:ฏูİı|]",
+ "nodeDisabled": "[G'Node disabled:ฏูİı|]",
+ "nodeDisabled_plural": "[G'Nodes disabled:ฏูİı|]",
+ "lostConnectionError": "[G'Error : Lost connection to serverฏูİı|]",
+ "importUnrecognised": "[G'Imported unrecognised ฏูİı|]",
+ "loggedInAs": "[G'Logged in as ฏูİı|]",
+ "invalidFilename": "[G'Invalid filenameฏูİı|]",
+ "savedType": "[G'Saved __type__ฏูİı|]",
+ "saveFailed": "[G'Save failed: ฏูİı|]",
+ "noNodesSelected": "[G'Cannot create subflow : no nodes selectedฏูİı|]",
+ "multipleInputsToSelection": "[G'Cannot create subflow : multiple inputs to selectionฏูİı|]",
+ "cannotAddSubflowToItself": "[G'Error : Cannot add subflow to itselfฏูİı|]",
+ "cannotAddCircularReference": "[G'Error : Cannot add subflow - circular reference detectedฏูİı|]",
+ "nodeCopied": "[G'__count__ node copiedฏูİı|]",
+ "nodeCopied_plural": "[G'__count__ nodes copiedฏูİı|]",
+ "undeployedChanges": "[G'Warning : node has undeployed changesฏูİı|]",
+ "nodeActionDisabled": "[G'Warning : node actions disabled within subflowฏูİı|]",
+ "error": "[G'Error : ฏูİı|]"
+ },
+ "error": {
+ "apiSubflowOnly": "[G'this api is subflow only. called with:ฏูİı|]",
+ "invalidFlow": "[G'Invalid flow: ฏูİı|]",
+ "cannotAddSubflowToItself": "[G'Cannot add subflow to itselfฏูİı|]",
+ "cannotAddCircularReference": "[G'Cannot add subflow - circular reference detectedฏูİı|]"
+ },
+ "dialog": {
+ "cancel": "[G'Cancelฏูİı|]",
+ "login": "[G'Loginฏูİı|]",
+ "loginFailed": "[G'Login failedฏูİı|]",
+ "ok": "[G'Okฏูİı|]",
+ "delete": "[G'Deleteฏูİı|]",
+ "close": "[G'Closeฏูİı|]",
+ "nodes": "[G' Nodes:ฏูİı|]",
+ "selectToCopy": "[G'Select the text above and copy to the clipboard with Ctrl-C.ฏูİı|]",
+ "pasteNodesHere": "[G'Paste nodes hereฏูİı|]",
+ "importNodes": "[G'Import nodesฏูİı|]",
+ "exportNodesClipboard": "[G'Export nodes to clipboardฏูİı|]",
+ "renameSheet": "[G'Rename sheetฏูİı|]",
+ "confirmDelete": "[G'Confirm deleteฏูİı|]"
+ },
+ "deploy": {
+ "deploy": "[G'Deployฏูİı|]",
+ "full": "[G'Fullฏูİı|]",
+ "modifiedFlows": "[G'Modified Flowsฏูİı|]",
+ "modifiedNodes": "[G'Modified Nodesฏูİı|]",
+ "fullDesc": "[G'Deploys everything in the workspaceฏูİı|]",
+ "modifiedFlowsDesc": "[G'Only deploys flows that contain changed nodesฏูİı|]",
+ "modifiedNodesDesc": "[G'Only deploys nodes that have changedฏูİı|]",
+ "confirmDeploy": "[G'Confirm deployฏูİı|]",
+ "cancelDeploy": "[G'Cancelฏูİı|]",
+ "undeployedChanges": "[G'You have undeployed changes.\n\nLeaving this page will lose these changes.ฏูİı|]",
+ "successfulDeploy": "[G'Successfully Deployedฏูİı|]",
+ "error": "[G'Error : ฏูİı|]",
+ "noResponseError": "[G'no response from serverฏูİı|]"
+ },
+ "editor": {
+ "savedNodes": "[G'Saved nodesฏูİı|]",
+ "configEdit": "[G'editฏูİı|]",
+ "configAdd": "[G'addฏูİı|]",
+ "configDelete": "[G'Deleteฏูİı|]",
+ "editFlow": "[G'Edit flow ฏูİı|]",
+ "nodesUse": "[G'__count__ node uses this configฏูİı|]",
+ "nodesUse_plural": "[G'__count__ nodes use this configฏูİı|]",
+ "addNewConfig": "[G'Add new __type__ config nodeฏูİı|]",
+ "editConfig": "[G'Edit __type__ config nodeฏูİı|]",
+ "addNewType": "[G'Add new __type__...ฏูİı|]",
+ "subflow": "[G'Subflow: ฏูİı|]",
+ "subflowInstances": "[G'There is __count__ instance of this subflowฏูİı|]",
+ "subflowInstances_plural": "[G'There are __count__ instances of this subflowฏูİı|]"
+ },
+ "keyboard": {
+ "selectAll": "[G'Select all nodesฏูİı|]",
+ "selectAllConnected": "[G'Select all connected nodesฏูİı|]",
+ "addRemoveNode": "[G'Add/remove node from selectionฏูİı|]",
+ "deleteSelected": "[G'Delete selected nodes or linkฏูİı|]",
+ "importNode": "[G'Import nodesฏูİı|]",
+ "exportNode": "[G'Export selected nodesฏูİı|]",
+ "toggleSidebar": "[G'Toggle sidebarฏูİı|]",
+ "deleteNode": "[G'Delete selected nodes or linkฏูİı|]",
+ "copyNode": "[G'Copy selected nodesฏูİı|]",
+ "cutNode": "[G'Cut selected nodesฏูİı|]",
+ "pasteNode": "[G'Paste nodesฏูİı|]"
+ },
+ "library": {
+ "openLibrary": "[G'Open Library...ฏูİı|]",
+ "saveToLibrary": "[G'Save to Library...ฏูİı|]",
+ "typeLibrary": "[G'__type__ libraryฏูİı|]",
+ "unnamedType": "[G'Unnamed __type__ฏูİı|]",
+ "saveToLibrary": "[G'Save to Libraryฏูİı|]",
+ "exportToLibrary": "[G'Export nodes to libraryฏูİı|]"
+ },
+ "palette": {
+ "noInfo": "[G'no information availableฏูİı|]",
+ "popOverError": "[G'Error generating pop-over label for '__type__'.ฏูİı|]"
+ },
+ "tabInfo": {
+ "node": "[G'Nodeฏูİı|]",
+ "type": "[G'Typeฏูİı|]",
+ "id": "[G'IDฏูİı|]",
+ "subflow": "[G'Subflowฏูİı|]",
+ "name": "[G'nameฏูİı|]",
+ "instances": "[G'instancesฏูİı|]",
+ "properties": "[G'Propertiesฏูİı|]",
+ "blank": "[G'blankฏูİı|]"
+ },
+ "workspaces": {
+ "subflow": "[G'Subflow: ฏูİı|]"
+ }
+}
diff --git a/locales/zz-ZZ/runtime.json b/locales/zz-ZZ/runtime.json
new file mode 100644
index 000000000..c3b3a3528
--- /dev/null
+++ b/locales/zz-ZZ/runtime.json
@@ -0,0 +1,91 @@
+{
+ "runtime": {
+ "welcome": "[G'Welcome to Node-REDฏูİı|]",
+ "version": "[G'__component__ version: __version__ฏูİı|]",
+ "paths": {
+ "settings": "[G'Settings file : __path__ฏูİı|]"
+ }
+ },
+
+ "server": {
+ "loading": "[G'Loading palette nodesฏูİı|]",
+ "errors": "[G'Failed to register __count__ node typeฏูİı|]",
+ "errors_plural": "[G'Failed to register __count__ node typesฏูİı|]",
+ "errors-help": "[G'Run with -v for detailsฏูİı|]",
+ "missing-modules": "[G'Missing node modules:ฏูİı|]",
+ "removing-modules": "[G'Removing modules from configฏูİı|]",
+ "added-types": "[G'Added node types:ฏูİı|]",
+ "removed-types": "[G'Removed node types:ฏูİı|]",
+ "install": {
+ "invalid": "[G'Invalid module nameฏูİı|]",
+ "installing": "[G'Installing module: __name__ฏูİı|]",
+ "installed": "[G'Installed module: __name__ฏูİı|]",
+ "install-failed": "[G'Install failedฏูİı|]",
+ "install-failed-long": "[G'Installation of module __name__ failed:ฏูİı|]",
+ "install-failed-not-found": "[G'$t(install-failed-long) module not foundฏูİı|]",
+
+ "uninstalling": "[G'Uninstalling module: __name__ฏูİı|]",
+ "uninstall-failed": "[G'Uninstall failedฏูİı|]",
+ "uninstall-failed-long": "[G'Uninstall of module __name__ failed:ฏูİı|]",
+ "uninstalled": "[G'Uninstalled module: __name__ฏูİı|]"
+ }
+ },
+
+ "api": {
+ "flows": {
+ "error-save": "[G'Error saving flows: __message__ฏูİı|]"
+ },
+ "library": {
+ "error-load-entry": "[G'Error loading library entry '__path__': __message__ฏูİı|]",
+ "error-save-entry": "[G'Error saving library entry '__path__': __message__ฏูİı|]",
+ "error-load-flow": "[G'Error loading flow '__path__': __message__ฏูİı|]",
+ "error-save-flow": "[G'Error saving flow '__path__': __message__ฏูİı|]"
+ },
+ "nodes": {
+ "enabled": "[G'Enabled node types:ฏูİı|]",
+ "disabled": "[G'Disabled node types:ฏูİı|]",
+ "error-enable": "[G'Failed to enable node:ฏูİı|]"
+ }
+ },
+
+ "comms": {
+ "error": "[G'Communication channel error: __message__ฏูİı|]",
+ "error-server": "[G'Communication server error: __message__ฏูİı|]",
+ "error-send": "[G'Communication send error: __message__ฏูİı|]"
+ },
+
+ "nodes": {
+ "credentials": {
+ "error":"[G'Error loading credentials: __message__ฏูİı|]",
+ "not-registered": "[G'Credential type '__type__' is not registeredฏูİı|]"
+ },
+ "flows": {
+ "registered-missing": "[G'Missing type registered: __type__ฏูİı|]",
+ "error": "[G'Error loading flows: __message__ฏูİı|]",
+ "starting-modified-nodes": "[G'Starting modified nodesฏูİı|]",
+ "starting-modified-flows": "[G'Starting modified flowsฏูİı|]",
+ "starting-flows": "[G'Starting flowsฏูİı|]",
+ "started-modified-nodes": "[G'Started modified nodesฏูİı|]",
+ "started-modified-flows": "[G'Started modified flowsฏูİı|]",
+ "started-flows": "[G'Started flowsฏูİı|]",
+ "stopping-modified-nodes": "[G'Stopping modified nodesฏูİı|]",
+ "stopping-modified-flows": "[G'Stopping modified flowsฏูİı|]",
+ "stopping-flows": "[G'Stopping flowsฏูİı|]",
+ "stopped-modified-nodes": "[G'Stopped modified nodesฏูİı|]",
+ "stopped-modified-flows": "[G'Stopped modified flowsฏูİı|]",
+ "stopped-flows": "[G'Stopped flowsฏูİı|]",
+ "stopped": "[G'Stoppedฏูİı|]",
+ "missing-types": "[G'Waiting for missing types to be registered:ฏูİı|]"
+
+ }
+ },
+
+ "storage": {
+ "localfilesystem": {
+ "user-dir": "[G'User directory : __path__ฏูİı|]",
+ "flows-file": "[G'Flows file : __path__ฏูİı|]",
+ "create": "[G'Creating new flow fileฏูİı|]"
+ }
+ }
+
+}