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 = '
'+ - ''+ + ''+ ''+ '
'+ '
'+ - '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(''); } }); - - select.append(''); + select.append(''); 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/⌘ + aSelect all nodes
    Shift + ClickSelect all connected nodes
    Ctrl/⌘ + ClickAdd/remove node from selection
    DeleteDelete selected nodes or link
    Ctrl/⌘ + a'+RED._("keyboard.selectAll")+'
    Shift + Click'+RED._("keyboard.selectAllConnected")+'
    Ctrl/⌘ + Click'+RED._("keyboard.addRemoveNode")+'
    Delete'+RED._("keyboard.deleteSelected")+'
     
    Ctrl/⌘ + iImport nodes
    Ctrl/⌘ + eExport selected nodes
    Ctrl/⌘ + i'+RED._("keyboard.importNode")+'
    Ctrl/⌘ + e'+RED._("keyboard.exportNode")+'
    '+ '
    '+ '
    '+ ''+ - ''+ + ''+ ''+ - ''+ + ''+ ''+ - ''+ - ''+ - ''+ + ''+ + ''+ + ''+ '
    Ctrl/⌘ + SpaceToggle sidebar
    Ctrl/⌘ + Space'+RED._("keyboard.toggleSidebar")+'
    DeleteDelete selected nodes or link
    Delete'+RED._("keyboard.deleteNode")+'
    Ctrl/⌘ + cCopy selected nodes
    Ctrl/⌘ + xCut selected nodes
    Ctrl/⌘ + vPaste 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 += ''; + table += ''; if (node.type != "subflow" && node.name) { table += ""; } - table += ""; - table += ""; + table += ""; + table += ""; var m = /^subflow(:(.+))?$/.exec(node.type); if (m) { @@ -76,7 +76,7 @@ RED.sidebar.info = (function() { subflowNode = node; } - table += ''; + table += ''; var userCount = 0; var subflowType = "subflow:"+subflowNode.id; @@ -85,12 +85,12 @@ RED.sidebar.info = (function() { userCount++; } }); - table += ""; - table += ""; + table += ""; + table += ""; } 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ฏูİı|]" + } + } + +}
    Node
    '+RED._("tabInfo.node")+'
    Name "+node.name+"
    Type "+node.type+"
    ID "+node.id+"
    "+RED._("tabInfo.type")+" "+node.type+"
    "+RED._("tabInfo.id")+" "+node.id+"
    Subflow
    '+RED._("tabInfo.subflow")+'
    name"+subflowNode.name+"
    instances"+userCount+"
    "+RED._("tabInfo.name")+""+subflowNode.name+"
    "+RED._("tabInfo.instances")+""+userCount+"
    Properties
    '+RED._("tabInfo.properties")+'