Merge branch 'dev' into 3843-alternative-impl

This commit is contained in:
Nick O'Leary
2023-05-22 17:41:23 +01:00
404 changed files with 51584 additions and 12411 deletions

View File

@@ -100,9 +100,13 @@ function buildDiagnosticReport(scope, callback) {
version: os.version(),
},
runtime: {
isStarted: runtime.isStarted(),
modules: modules,
version: runtime.settings.version,
isStarted: runtime.isStarted(),
flows: {
state: runtime.flows && runtime.flows.state(),
started: runtime.flows && runtime.flows.started,
},
modules: modules,
settings: {
available: runtime.settings.available(),
apiMaxLength: runtime.settings.apiMaxLength || "UNSET",
@@ -114,6 +118,11 @@ function buildDiagnosticReport(scope, callback) {
flowFile: runtime.settings.flowFile || "UNSET",
mqttReconnectTime: runtime.settings.mqttReconnectTime || "UNSET",
serialReconnectTime: runtime.settings.serialReconnectTime || "UNSET",
socketReconnectTime: runtime.settings.socketReconnectTime || "UNSET",
socketTimeout: runtime.settings.socketTimeout || "UNSET",
tcpMsgQueueSize: runtime.settings.tcpMsgQueueSize || "UNSET",
inboundWebSocketTimeout: runtime.settings.inboundWebSocketTimeout || "UNSET",
runtimeState: runtime.settings.runtimeState || "UNSET",
adminAuth: runtime.settings.adminAuth ? "SET" : "UNSET",
@@ -131,6 +140,7 @@ function buildDiagnosticReport(scope, callback) {
uiHost: runtime.settings.uiHost ? "SET" : "UNSET",
uiPort: runtime.settings.uiPort ? "SET" : "UNSET",
userDir: runtime.settings.userDir ? "SET" : "UNSET",
nodesDir: runtime.settings.nodesDir && runtime.settings.nodesDir.length ? "SET" : "UNSET",
}
}
}

View File

@@ -89,10 +89,16 @@ var api = module.exports = {
if (!runtime.settings.disableEditor) {
safeSettings.context = runtime.nodes.listContextStores();
if (runtime.settings.editorTheme && runtime.settings.editorTheme.codeEditor) {
safeSettings.codeEditor = runtime.settings.editorTheme.codeEditor || {};
safeSettings.codeEditor.lib = safeSettings.codeEditor.lib || "monaco";
safeSettings.codeEditor.options = safeSettings.codeEditor.options || {};
if (runtime.settings.editorTheme) {
if (runtime.settings.editorTheme.codeEditor) {
safeSettings.codeEditor = runtime.settings.editorTheme.codeEditor || {};
safeSettings.codeEditor.lib = safeSettings.codeEditor.lib || "monaco";
safeSettings.codeEditor.options = safeSettings.codeEditor.options || {};
}
if (runtime.settings.editorTheme.markdownEditor) {
safeSettings.markdownEditor = runtime.settings.editorTheme.markdownEditor || {};
safeSettings.markdownEditor.mermaid = safeSettings.markdownEditor.mermaid || { enabled: true };
}
}
safeSettings.libraries = runtime.library.getLibraries();
if (util.isArray(runtime.settings.paletteCategories)) {

View File

@@ -889,6 +889,16 @@ function handlePreRoute(flow, sendEvent, reportError) {
})
}
function deliverMessageToDestination(sendEvent) {
if (sendEvent?.destination?.node) {
try {
sendEvent.destination.node.receive(sendEvent.msg);
} catch(err) {
Log.error(`Error delivering message to node:${sendEvent.destination.node._path} [${sendEvent.destination.node.type}]`)
Log.error(err.stack)
}
}
}
function handlePreDeliver(flow,sendEvent, reportError) {
// preDeliver - the local router has identified the node it is going to send to. At this point, the message has been cloned if needed.
hooks.trigger("preDeliver",sendEvent,(err) => {
@@ -898,15 +908,10 @@ function handlePreDeliver(flow,sendEvent, reportError) {
} else if (err !== false) {
if (asyncMessageDelivery) {
setImmediate(function() {
if (sendEvent.destination.node) {
sendEvent.destination.node.receive(sendEvent.msg);
}
deliverMessageToDestination(sendEvent)
})
} else {
if (sendEvent.destination.node) {
sendEvent.destination.node.receive(sendEvent.msg);
}
deliverMessageToDestination(sendEvent)
}
// postDeliver - the message has been dispatched to be delivered asynchronously (unless the sync delivery flag is set, in which case it would be continue as synchronous delivery)
hooks.trigger("postDeliver", sendEvent, function(err) {

View File

@@ -474,7 +474,7 @@ class Subflow extends Flow {
*/
function createNodeInSubflow(subflowInstanceId, def) {
let node = clone(def);
let nid = redUtil.generateId();
let nid = `${subflowInstanceId}-${node.id}` //redUtil.generateId();
// console.log("Create Node In subflow",node._alias, "--->",nid, "(",node.type,")")
// node_map[node.id] = node;
node._alias = node.id;

View File

@@ -641,6 +641,7 @@ function getFlow(id) {
if (node.type === 'link out') {
delete node.wires;
}
delete node.credentials;
return node;
})
}
@@ -648,7 +649,10 @@ function getFlow(id) {
if (flow.configs) {
var configIds = Object.keys(flow.configs);
result.configs = configIds.map(function(configId) {
return clone(flow.configs[configId]);
const node = clone(flow.configs[configId]);
delete node.credentials;
return node
})
if (result.configs.length === 0) {
delete result.configs;
@@ -660,12 +664,16 @@ function getFlow(id) {
var subflow = clone(flow.subflows[subflowId]);
var nodeIds = Object.keys(subflow.nodes);
subflow.nodes = nodeIds.map(function(id) {
return subflow.nodes[id];
const node = clone(subflow.nodes[id])
delete node.credentials
return node
});
if (subflow.configs) {
var configIds = Object.keys(subflow.configs);
subflow.configs = configIds.map(function(id) {
return subflow.configs[id];
const node = clone(subflow.configs[id])
delete node.credentials
return node
})
}
delete subflow.instances;
@@ -777,6 +785,16 @@ const flowAPI = {
}
function getGlobalConfig() {
let gconf = null;
eachNode((n) => {
if (n.type === "global-config") {
gconf = n;
}
});
return gconf;
}
module.exports = {
init: init,
@@ -790,6 +808,9 @@ module.exports = {
get:getNode,
eachNode: eachNode,
getGlobalConfig: getGlobalConfig,
/**
* Gets the current flow configuration
*/

View File

@@ -18,7 +18,9 @@ var redUtil = require("@node-red/util").util;
var Log = require("@node-red/util").log;
var subflowInstanceRE = /^subflow:(.+)$/;
var typeRegistry = require("@node-red/registry");
const credentials = require("../nodes/credentials");
let _runtime = null;
var envVarExcludes = {};
@@ -134,10 +136,12 @@ function createNode(flow,config) {
subflowInstanceConfig,
instanceConfig
);
// Register this subflow as an instance node of the parent flow.
// This allows nodes inside the subflow to get ahold of each other
// such as a node accessing its config node
flow.subflowInstanceNodes[config.id] = subflow
subflow.start();
return subflow.node;
Log.error(Log._("nodes.flow.unknown-type", {type:type}));
}
} catch(err) {
Log.error(err);
@@ -197,7 +201,9 @@ function parseConfig(config) {
if (subflowDetails) {
var subflowType = subflowDetails[1]
n.subflow = subflowType;
flow.subflows[subflowType].instances.push(n)
if (flow.subflows[subflowType]) {
flow.subflows[subflowType].instances.push(n)
}
}
if (container) {
container.nodes[n.id] = n;
@@ -263,15 +269,55 @@ function parseConfig(config) {
return flow;
}
function getGlobalEnv(name) {
const nodes = _runtime.nodes;
if (!nodes) {
return null;
}
const gconf = nodes.getGlobalConfig();
const env = gconf ? gconf.env : null;
if (env) {
const cred = (gconf ? credentials.get(gconf.id) : null) || {
map: {}
};
const map = cred.map;
for (let i = 0; i < env.length; i++) {
const item = env[i];
if (item.name === name) {
if (item.type === "cred") {
return {
name: name,
value: map[name],
type: "cred"
};
}
return item;
}
}
}
return null;
}
module.exports = {
init: function(runtime) {
_runtime = runtime;
envVarExcludes = {};
if (runtime.settings.hasOwnProperty('envVarExcludes') && Array.isArray(runtime.settings.envVarExcludes)) {
runtime.settings.envVarExcludes.forEach(v => envVarExcludes[v] = true);
}
},
getEnvVar: function(k) {
return !envVarExcludes[k]?process.env[k]:undefined
if (!envVarExcludes[k]) {
const item = getGlobalEnv(k);
if (item) {
const val = redUtil.evaluateNodeProperty(item.value, item.type, null, null, null);
return val;
}
return process.env[k];
}
return undefined;
},
diffNodes: diffNodes,
mapEnvVarProperties: mapEnvVarProperties,

View File

@@ -89,6 +89,15 @@ function init(userSettings,httpServer,_adminApi) {
nodeApp = express();
adminApp = express();
const defaultServerSettings = {
"x-powered-by": false
}
const serverSettings = Object.assign({},defaultServerSettings,userSettings.httpServerOptions||{});
for (let eOption in serverSettings) {
nodeApp.set(eOption, serverSettings[eOption]);
adminApp.set(eOption, serverSettings[eOption]);
}
if (_adminApi) {
adminApi = _adminApi;
@@ -161,6 +170,8 @@ function start() {
for (i=0;i<nodeErrors.length;i+=1) {
if (nodeErrors[i].err.code === "type_already_registered") {
log.warn("["+nodeErrors[i].id+"] "+log._("server.type-already-registered",{type:nodeErrors[i].err.details.type,module: nodeErrors[i].err.details.moduleA}));
} else if (nodeErrors[i].err.code === "set_has_no_types") {
log.warn("["+nodeErrors[i].id+"] "+log._("server.set-has-no-types", nodeErrors[i].err.details));
} else {
log.warn("["+nodeErrors[i].id+"] "+nodeErrors[i].err);
}

View File

@@ -373,6 +373,11 @@ Node.prototype.send = function(msg) {
if (msg === null || typeof msg === "undefined") {
return;
} else if (!util.isArray(msg)) {
// A single message has been passed in
if (typeof msg !== 'object') {
this.error(Log._("nodes.flow.non-message-returned", { type: typeof msg }));
return
}
if (this._wire) {
// A single message and a single wire on output 0
// TODO: pre-load flows.get calls - cannot do in constructor
@@ -425,27 +430,31 @@ Node.prototype.send = function(msg) {
for (k = 0; k < msgs.length; k++) {
var m = msgs[k];
if (m !== null && m !== undefined) {
if (!m._msgid) {
hasMissingIds = true;
if (typeof m !== 'object') {
this.error(Log._("nodes.flow.non-message-returned", { type: typeof m }));
} else {
if (!m._msgid) {
hasMissingIds = true;
}
/* istanbul ignore else */
if (!sentMessageId) {
sentMessageId = m._msgid;
}
sendEvents.push({
msg: m,
source: {
id: this.id,
node: this,
port: i
},
destination: {
id: wires[j],
node: undefined
},
cloneMessage: msgSent
});
msgSent = true;
}
/* istanbul ignore else */
if (!sentMessageId) {
sentMessageId = m._msgid;
}
sendEvents.push({
msg: m,
source: {
id: this.id,
node: this,
port: i
},
destination: {
id: wires[j],
node: undefined
},
cloneMessage: msgSent
});
msgSent = true;
}
}
}

View File

@@ -589,17 +589,28 @@ function deleteContext(id,flowId) {
* If flowConfig is undefined, all flow/node contexts will be removed
**/
function clean(flowConfig) {
flowConfig = flowConfig || { allNodes: {} };
var promises = [];
for(var plugin in stores){
if(stores.hasOwnProperty(plugin)){
promises.push(stores[plugin].clean(Object.keys(flowConfig.allNodes)));
}
flowConfig = flowConfig || { allNodes: {}, subflows: {} };
const knownNodes = new Set(Object.keys(flowConfig.allNodes))
// We need to alias all of the subflow instance contents
for (const subflow of Object.values(flowConfig.subflows || {})) {
subflow.instances.forEach(instance => {
for (const nodeId of Object.keys(subflow.nodes || {})) {
knownNodes.add(`${instance.id}-${nodeId}`)
}
for (const nodeId of Object.keys(subflow.configs || {})) {
knownNodes.add(`${instance.id}-${nodeId}`)
}
})
}
for (var id in contexts) {
if (contexts.hasOwnProperty(id) && id !== "global") {
var promises = [];
for (const store of Object.values(stores)){
promises.push(store.clean(Array.from(knownNodes)));
}
for (const id of Object.keys(contexts)) {
if (id !== "global") {
var idParts = id.split(":");
if (!flowConfig.allNodes.hasOwnProperty(idParts[0])) {
if (!knownNodes.has(idParts[0])) {
delete contexts[id];
}
}

View File

@@ -383,6 +383,11 @@ var api = module.exports = {
}
}
}
} else if (nodeType === "global-config") {
if (JSON.stringify(savedCredentials.map) !== JSON.stringify(newCreds.map)) {
savedCredentials.map = newCreds.map;
dirty = true;
}
} else {
var dashedType = nodeType.replace(/\s+/g, '-');
var definition = credentialsDef[dashedType];

View File

@@ -205,6 +205,7 @@ module.exports = {
getNode: flows.get,
eachNode: flows.eachNode,
getContext: context.get,
getGlobalConfig: flows.getGlobalConfig,
clearContext: context.clear,

View File

@@ -18,7 +18,7 @@ var i18n = require("@node-red/util").i18n;
module.exports = {
"package.json": function(project) {
var package = {
var packageDetails = {
"name": project.name,
"description": project.summary||i18n._("storage.localfilesystem.projects.summary"),
"version": "0.0.1",
@@ -30,11 +30,11 @@ module.exports = {
};
if (project.files) {
if (project.files.flow) {
package['node-red'].settings.flowFile = project.files.flow;
package['node-red'].settings.credentialsFile = project.files.credentials;
packageDetails['node-red'].settings.flowFile = project.files.flow;
packageDetails['node-red'].settings.credentialsFile = project.files.credentials;
}
}
return JSON.stringify(package,"",4);
return JSON.stringify(packageDetails,"",4);
},
"README.md": function(project) {
var content = project.name+"\n"+("=".repeat(project.name.length))+"\n\n";

View File

@@ -71,6 +71,8 @@ function runGitCommand(args,cwd,env,emit) {
err.code = "git_missing_user";
} else if (/name consists only of disallowed characters/i.test(stderr)) {
err.code = "git_missing_user";
} else if (/nothing (add )?to commit/i.test(stdout)) {
return stdout;
}
throw err;
})
@@ -106,7 +108,7 @@ function runGitCommandWithSSHCommand(args,cwd,auth,emit) {
commandEnv.GIT_SSH = path.join(__dirname,"node-red-ssh.sh");
commandEnv.NODE_RED_KEY_FILE=auth.key_path;
// GIT_SSH_COMMAND - added in git 2.3.0
commandEnv.GIT_SSH_COMMAND = "ssh -i " + auth.key_path + " -F /dev/null";
commandEnv.GIT_SSH_COMMAND = "ssh -i \"" + auth.key_path + "\" -F /dev/null";
// console.log('commandEnv:', commandEnv);
return runGitCommand(args,cwd,commandEnv,emit).then( result => {
rs.close();
@@ -419,7 +421,10 @@ module.exports = {
});
},
initRepo: function(cwd) {
return runGitCommand(["init"],cwd);
var args = ["init", "--initial-branch", "main"];
return runGitCommand(args, cwd).catch(function () {
return runGitCommand(["init"], cwd);
});
},
setUpstream: function(cwd,remoteBranch) {
var args = ["branch","--set-upstream-to",remoteBranch];

32
packages/node_modules/@node-red/runtime/locales/de/runtime.json vendored Executable file → Normal file
View File

@@ -1,6 +1,6 @@
{
"runtime": {
"welcome": "Willkommen bei Node-RED!",
"welcome": "Willkommen bei Node-RED",
"version": "__component__ Version: __version__",
"unsupported_version": "Nicht unterstützte Version von __component__. Erforderlich: __requires__, jedoch gefunden: __version__",
"paths": {
@@ -8,7 +8,6 @@
"httpStatic": "HTTP-Statisch: __path__"
}
},
"server": {
"loading": "Paletten-Nodes werden geladen",
"palette-editor": {
@@ -34,17 +33,19 @@
"install-failed-not-found": "Das Modul $t(server.install.install-failed-long) wurde nicht gefunden",
"install-failed-name": "$t(server.install.install-failed-long). Ungültiger Modulname: __name__",
"install-failed-url": "$t(server.install.install-failed-long). Ungültige URL: __url__",
"post-install-error": "Fehler bei der Ausführung des 'postInstall'-Hooks:",
"upgrading": "Upgrade von Modul __name__ auf Version __version__ gestartet",
"upgraded": "Upgrade von Modul __name__ war erfolgreich. Neustart von Node-RED für die Verwendung der neuen Version erforderlich.",
"upgrade-failed-not-found": "Upgrade fehlgeschlagen. $t(server.install.install-failed-long). Version nicht gefunden.",
"uninstalling": "Das Modul __name__ wird deinstalliert",
"uninstall-failed": "Deinstallation fehlgeschlagen",
"uninstall-failed-long": "Die Deinstallation des Moduls __name__ ist fehlgeschlagen:",
"uninstalled": "Das Modul __name__ ist deinstalliert"
"uninstalled": "Das Modul __name__ ist deinstalliert",
"old-ext-mod-dir-warning": "\n\n---------------------------------------------------------------------\nNode-RED 1.3 Verzeichnis externer Module erkannt:\n __oldDir__\nDieses Verzeichnis wird nicht mehr verwendet. Die externen Module werden\nin Ihrem Node-RED-Benutzerverzeichnis neu installiert:\n __newDir__\nLöschen Sie das alte externalModules-Verzeichnis, um diese Meldung abzustellen.\n---------------------------------------------------------------------\n"
},
"deprecatedOption": "Die Verwendung von __old__ ist abgekündigt. Stattdessen __new__ verwenden.",
"unable-to-listen": "Überwachen (listen) von __listenpath__ nicht möglich",
"port-in-use": "FEHLER: Port wird verwendet",
"port-in-use": "Fehler: Port wird verwendet",
"uncaught-exception": "Nicht abgefangene Ausnahmebedingung:",
"admin-ui-disabled": "Administrator-Benutzeroberfläche deaktiv",
"now-running": "Server wird jetzt auf __listenpath__ ausgeführt",
@@ -55,11 +56,10 @@
"refresh-interval": "Erneuerung der https-Einstellungen erfolgt alle __interval__ Stunden",
"settings-refreshed": "https-Einstellungen wurden erneuert",
"refresh-failed": "Erneuerung der https-Einstellungen fehlgeschlagen: __message__",
"nodejs-version": "httpsRefreshInterval erfordert Node.js 11 or later",
"nodejs-version": "httpsRefreshInterval erfordert Node.js 11 oder höher",
"function-required": "httpsRefreshInterval erfordert die https-Eigenschaft in Form einer Funktion"
}
},
"api": {
"flows": {
"error-save": "Fehler beim Speichern der Flows: __message__",
@@ -77,17 +77,16 @@
"error-enable": "Der Node konnte nicht aktiviert werden:"
}
},
"comms": {
"error": "Kommunikationskanal-Fehler: __message__",
"error-server": "Kommunikationsserver-Fehler: __message__",
"error-send": "Kommunikationsende-Fehler: __message__"
},
"settings": {
"user-not-available": "Einstellungen konnten nicht gespeichert werden: __message__",
"not-available": "Einstellungen nicht verfügbar",
"property-read-only": "Die Eigenschaft '__prop__ 'ist schreibgeschützt"
"property-read-only": "Die Eigenschaft '__prop__' ist schreibgeschützt",
"readonly-mode": "Laufzeitumgebung im Nur-Lese-Modus. Änderungen werden nicht gespeichert."
},
"library": {
"unknownLibrary": "Unbekannte Bibliothek (Library): __library__",
@@ -98,10 +97,12 @@
},
"nodes": {
"credentials": {
"error": "Fehler beim Laden der Berechtigungen: __message__",
"error-saving": "Fehler beim Speichern der Berechtigungen: __message__",
"not-registered": "Der Berechtigung-Typ '__type__' ist nicht registriert",
"system-key-warning": "\n---------------------------------------------------------------------\nDie Datei mit den Flow-Berechtigungen wird mit einem vom System\ngenerierten Schlüssel verschlüsselt.\nWenn der vom System generierte Schlüssel aus irgendeinem Grund\nverloren geht, kann die Datei mit den Berechtigungen nicht\nwiederhergestellt werden. Sie muss dann gelöscht und die\nBerechtigungen müssen erneut eingestellt werden.\nEs sollte ein eigener Schlüssel mit Hilfe der Option\n'credentialSecret' in der Einstellungsdatei vorgegeben werden.\nNode-RED wird dann die Datei mit den Flow-Berechtigungen\nbei der nächsten Übernahme (deploy) einer Änderung erneut\nverschlüsseln.\n---------------------------------------------------------------------"
"error": "Fehler beim Laden der Credentials: __message__",
"error-saving": "Fehler beim Speichern der Credentials: __message__",
"not-registered": "Der Credentials-Typ '__type__' ist nicht registriert",
"system-key-warning": "\n---------------------------------------------------------------------\nDie Datei mit den Flow-Credentials wird mit einem vom System\ngenerierten Schlüssel verschlüsselt.\nWenn der vom System generierte Schlüssel aus irgendeinem Grund\nverloren geht, kann die Datei mit den Credentials nicht\nwiederhergestellt werden. Sie muss dann gelöscht und die\nCredentials müssen erneut eingestellt werden.\nEs sollte ein eigener Schlüssel mit Hilfe der Option\n'credentialSecret' in der Einstellungsdatei vorgegeben werden.\nNode-RED wird dann die Datei mit den Flow-Credentials\nbei der nächsten Übernahme (deploy) einer Änderung erneut\nverschlüsseln.\n---------------------------------------------------------------------",
"unencrypted": "Verwende unverschlüsselte Credentials",
"encryptedNotFound": "Verschlüsselte Credentials nicht gefunden"
},
"flows": {
"safe-mode": "Die Flows sind gestoppt im abgesicherten Modus. Übernahme (deploy) zum Starten.",
@@ -121,6 +122,7 @@
"stopped-flows": "Flows sind gestoppt",
"stopped": "gestoppt",
"stopping-error": "Fehler beim Stoppen des Nodes: __message__",
"updated-flows": "Flows aktualisiert",
"added-flow": "Flow wird hinzugefügt: __label__",
"updated-flow": "Aktualisierter Flow: __label__",
"removed-flow": "Entfernter Flow: __label__",
@@ -145,7 +147,6 @@
}
}
},
"storage": {
"index": {
"forbidden-flow-name": "Unzulässiger Flow-Name"
@@ -159,6 +160,7 @@
"restore": "Die '__type__'-Dateisicherung wird wiederhergestellt: __path__",
"restore-fail": "Die Wiederherstellung der '__type__'-Dateisicherung ist fehlgeschlagen: __message__",
"fsync-fail": "Die Übertragung der Datei __path__ auf das Laufwerk ist fehlgeschlagen: __message__",
"warn_name": "Name der Flows-Datei nicht festgelegt. Name wird unter Verwendung des Hostnamens generiert.",
"projects": {
"changing-project": "Aktives Projekt wird festgelegt: __project__",
"active-project": "Aktives Projekt: __project__",
@@ -174,7 +176,6 @@
}
}
},
"context": {
"log-store-init": "Kontextspeicher: __name__ [__info__]",
"error-loading-module": "Fehler beim Laden des Kontextspeichers: __message__",
@@ -189,5 +190,4 @@
"error-write": "Fehler beim Schreiben des Kontextes: __message__"
}
}
}

View File

@@ -20,6 +20,7 @@
"errors-help": "Run with -v for details",
"missing-modules": "Missing node modules:",
"node-version-mismatch": "Node module cannot be loaded on this version. Requires: __version__ ",
"set-has-no-types": "Set does not have any types. name: '__name__', module: '__module__', file: '__file__'",
"type-already-registered": "'__type__' already registered by module __module__",
"removing-modules": "Removing modules from config",
"added-types": "Added node types:",
@@ -134,7 +135,8 @@
"flow": {
"unknown-type": "Unknown type: __type__",
"missing-types": "missing types",
"error-loop": "Message exceeded maximum number of catches"
"error-loop": "Message exceeded maximum number of catches",
"non-message-returned": "Node tried to send a message of type __type__"
},
"index": {
"unrecognised-id": "Unrecognised id: __id__",

View File

@@ -0,0 +1,193 @@
{
"runtime": {
"welcome": "Bienvenue sur Node-RED",
"version": "__component__ version: __version__",
"unsupported_version": "Version non prise en charge de __component__. Requiert : __requires__ Trouvé : __version__",
"paths": {
"settings": "Fichier de paramètres : __path__",
"httpStatic": "HTTP Statique : __path__"
}
},
"server": {
"loading": "Chargement des noeuds de la palette",
"palette-editor": {
"disabled": "Éditeur de la palette désactivé : paramètres utilisateur",
"npm-not-found": "Éditeur de la palette désactivé : commande npm introuvable",
"npm-too-old": "Éditeur de la palette désactivé : version npm trop ancienne. Nécessite npm >= 3.x"
},
"errors": "Échec de l'enregistrement de __count__ type de noeud",
"errors_plural": "Échec de l'enregistrement de __count__ types de noeud",
"errors-help": "Exécuter avec -v pour plus de détails",
"missing-modules": "Modules de noeud manquants :",
"node-version-mismatch": "Le module de noeud ne peut pas être chargé sur cette version. Nécessite : __version__ ",
"type-already-registered": "'__type__' déjà enregistré par le module __module__",
"removing-modules": "Suppression de modules de la configuration",
"added-types": "Types de noeuds ajoutés :",
"removed-types": "Types de noeuds supprimés :",
"install": {
"invalid": "Nom de module invalide",
"installing": "Installation du module : __nom__, version : __version__",
"installed": "Module installé : __nom__",
"install-failed": "L'installation a échoué",
"install-failed-long": "L'installation du module __name__ a échoué :",
"install-failed-not-found": "Module $t(server.install.install-failed-long) introuvable",
"install-failed-name": "$t(server.install.install-failed-long) nom de module invalide : __name__",
"install-failed-url": "URL invalide $t(server.install.install-failed-long) : __url__",
"post-install-error": "Erreur lors de l'exécution du hook 'postInstall' :",
"upgrading": "Mettre à jour le module : __name__ vers la version : __version__",
"upgraded": "Module mis à jour : __name__. Redémarrer Node-RED pour utiliser la nouvelle version",
"upgrade-failed-not-found": "Version $t(server.install.install-failed-long) introuvable",
"uninstalling": "Désinstallation du module : __name__",
"uninstall-failed": "La désinstallation a échoué",
"uninstall-failed-long": "La désinstallation du module __name__ a échoué :",
"uninstalled": "Module désinstallé : __name__",
"old-ext-mod-dir-warning": "\n\n---------------------------------------------------------------------\nRépertoire des modules externes Node-RED 1.3 détecté :\n __oldDir__\nCe répertoire n'est plus utilisé. Les modules externes seront\nréinstallés dans votre répertoire utilisateur Node-RED :\n __newDir__\nSupprimer l'ancien répertoire externalModules pour arrêter ce message.\n---------------------------------------------------------------------\n"
},
"deprecatedOption": "L'utilisation de l'option __old__ est DÉCONSEILLÉE. Utiliser __new__ à la place",
"unable-to-listen": "Impossible d'écouter sur __listenpath__",
"port-in-use": "Erreur : port utilisé",
"uncaught-exception": "Exception non reconnue :",
"admin-ui-disabled": "Interface d'administration désactivée",
"now-running": "Le serveur tourne maintenant sur __listenpath__",
"failed-to-start": "Échec lors du démarrage du serveur :",
"headless-mode": "Fonctionne en mode sans interface graphique (headless)",
"httpadminauth-deprecated": "L'utilisation de httpAdminAuth est DÉCONSEILLÉE. Utiliser adminAuth à la place",
"https": {
"refresh-interval": "Actualisation des paramètres https toutes les __interval__ heures",
"settings-refreshed": "Les paramètres https du serveur ont été actualisés",
"refresh-failed": "Échec de l'actualisation des paramètres https : __message__",
"nodejs-version": "httpsRefreshInterval nécessite Node.js 11 ou version ultérieure",
"function-required": "httpsRefreshInterval nécessite que la propriété https soit une fonction"
}
},
"api": {
"flows": {
"error-save": "Erreur lors de l'enregistrement des flux : __message__",
"error-reload": "Erreur lors du rechargement des flux : __message__"
},
"library": {
"error-load-entry": "Erreur lors du chargement de l'entrée de la bibliothèque '__path__' : __message__",
"error-save-entry": "Erreur lors de l'enregistrement de l'entrée de la bibliothèque '__path__' : __message__",
"error-load-flow": "Erreur lors du chargement du flux '__path__' : __message__",
"error-save-flow": "Erreur lors de l'enregistrement du flux '__path__' : __message__"
},
"nodes": {
"enabled": "Types de noeuds activés :",
"disabled": "Types de noeuds désactivés :",
"error-enable": "Échec de l'activation du noeud :"
}
},
"comms": {
"error": "Erreur de canal de communication: __message__",
"error-server": "Erreur de communication avec le serveur : __message__",
"error-send": "Erreur d'envoi de communication : __message__"
},
"settings": {
"user-not-available": "Impossible d'enregistrer les paramètres utilisateur : __message__",
"not-available": "Paramètres non disponibles",
"property-read-only": "La propriété '__prop__' est en lecture seule",
"readonly-mode": "Exécution en mode lecture seule. Les modifications ne seront pas enregistrées."
},
"library": {
"unknownLibrary": "Bibliothèque inconnue : __library__",
"unknownType": "Type de bibliothèque inconnu : __type__",
"readOnly": "La bibliothèque __library__ est en lecture seule",
"failedToInit": "Échec de l'initialisation de la bibliothèque __library__ : __error__",
"invalidProperty": "Propriété invalide __prop__ : '__value__'"
},
"nodes": {
"credentials": {
"error": "Erreur lors du chargement des identifiants : __message__",
"error-saving": "Erreur lors de l'enregistrement des identifiants : __message__",
"not-registered": "Le type d'identifiant '__type__' n'a pas été enregistré",
"system-key-warning": "\n\n---------------------------------------------------------------------\nVotre fichier contenant les identifiants de flux est chiffré à l'aide d'une clé générée par le système.\n\nSi la clé générée par le système est perdue pour une raison quelconque, votre fichier contenant\nles identifiants ne sera pas récupérable, vous devrez le supprimer et ressaisir vos identifiants.\n\nVous pouvez définir votre propre clé en utilisant l'option 'credentialSecret' dans\nvotre fichier de paramètres. Node-RED rechiffrera alors votre fichier contenant les identifiants\nà l'aide de la clé que vous avez choisie la prochaine fois que vous déploierez une modification.\n---------------------------------------------------------------------\n",
"unencrypted": "Utilisation d'identifiants non chiffrés",
"encryptedNotFound": "Identifiants chiffrés introuvables"
},
"flows": {
"safe-mode": "Les flux se sont arrêtés en mode sans échec. Déployer les pour commencer.",
"registered-missing": "Type manquant enregistré : __type__",
"error": "Erreur lors du chargement des flux : __message__",
"starting-modified-nodes": "Démarrage des noeuds modifiés",
"starting-modified-flows": "Démarrage des flux modifiés",
"starting-flows": "Démarrage des flux",
"started-modified-nodes": "Noeuds modifiés démarrés",
"started-modified-flows": "Flux modifiés démarrés",
"started-flows": "Flux démarrés",
"stopping-modified-nodes": "Arrêt des noeuds modifiés",
"stopping-modified-flows": "Arrêt des flux modifiés",
"stopping-flows": "Arrêt des flux",
"stopped-modified-nodes": "Noeuds modifiés arrêtés",
"stopped-modified-flows": "Flux modifiés arrêtés",
"stopped-flows": "Flux arrêtés",
"stopped": "Arrêté",
"stopping-error": "Erreur lors de l'arrêt du noeud : __message__",
"updated-flows": "Flux mis à jour",
"added-flow": "Ajout du flux : __label__",
"updated-flow": "Flux mis à jour : __label__",
"removed-flow": "Flux supprimé : __label__",
"missing-types": "En attente d'enregistrement des types manquants :",
"missing-type-provided": " - __type__ (fourni par le module npm __module__)",
"missing-type-install-1": "Pour installer l'un des modules manquants, exécuter :",
"missing-type-install-2": "dans le répertoire :"
},
"flow": {
"unknown-type": "Type inconnu : __type__",
"missing-types": "Types manquants",
"error-loop": "Le message a dépassé le nombre maximum de captures (catches)"
},
"index": {
"unrecognised-id": "Identifiant non reconnu : __id__",
"type-in-use": "Type en cours d'utilisation : __msg__",
"unrecognised-module": "Module non reconnu : __module__"
},
"registry": {
"localfilesystem": {
"module-not-found": "Impossible de trouver le module '__module__'"
}
}
},
"storage": {
"index": {
"forbidden-flow-name": "Nom du flux interdit"
},
"localfilesystem": {
"user-dir": "Répertoire utilisateur : __path__",
"flows-file": "Fichier des flux : __path__",
"create": "Création d'un nouveau fichier __type__",
"empty": "Le fichier __type__ existant est vide",
"invalid": "Le fichier __type__ existant n'est pas un JSON valide",
"restore": "Restauration de la sauvegarde du fichier __type__ : __path__",
"restore-fail": "La restauration de la sauvegarde du fichier __type__ a échoué : __message__",
"fsync-fail": "Échec du vidage du fichier __path__ sur le disque : __message__",
"warn_name": "Le nom du fichier de flux n'est pas défini. Génération du nom à l'aide du nom d'hôte.",
"projects": {
"changing-project": "Définition du projet actif : __project__",
"active-project": "Projet actif : __project__",
"projects-directory": "Répertoire des projets : __projectsDirectory__",
"project-not-found": "Projet introuvable : __project__",
"no-active-project": "Aucun projet actif : utilisation du fichier de flux par défaut",
"disabled": "Projets désactivés : editorTheme.projects.enabled=false",
"disabledNoFlag": "Projets désactivés : définir editorTheme.projects.enabled=true pour activer",
"git-not-found": "Projets désactivés : commande git introuvable",
"git-version-old": "Projets désactivés : git __version__ non pris en charge. Nécessite 2.x",
"summary": "Un projet Node-RED",
"readme": "### À propos\n\nCeci est le fichier README.md de votre projet. Il aide les utilisateurs à comprendre ce que fait votre\nprojet, comment l'utiliser et tout ce qu'il est utile de savoir."
}
}
},
"context": {
"log-store-init": "Stockage contextuel : '__name__' [__info__]",
"error-loading-module": "Erreur lors du chargement du stockage contextuel : __message__",
"error-loading-module2": "Erreur lors du chargement du stockage contextuel '__module__' : __message__",
"error-module-not-defined": "Option 'module' manquante dans le stockage contextuel '__storage__'",
"error-invalid-module-name": "Nom du stockage contextuel invalide : '__name__'",
"error-invalid-default-module": "Stockage contextuel par défaut inconnu : '__storage__'",
"unknown-store": "Stockage contextuel inconnu '__name__' spécifié. Utilisation du stockage par défaut.",
"localfilesystem": {
"invalid-json": "JSON non valide dans le fichier de contexte '__file__'",
"error-circular": "Le contexte __scope__ contient une référence circulaire qui ne peut pas être persistante",
"error-write": "Erreur d'écriture du contexte : __message__"
}
}
}

View File

@@ -20,6 +20,7 @@
"errors-help": "詳細は -v を指定して実行してください",
"missing-modules": "不足しているノードモジュール:",
"node-version-mismatch": "ノードモジュールはこのバージョンではロードできません。必要なバージョン: __version__ ",
"set-has-no-types": "セットに型がありません。 名前: '__name__', モジュール: '__module__', ファイル: '__file__'",
"type-already-registered": "'__type__' はモジュール __module__ で登録済みです",
"removing-modules": "設定からモジュールを削除します",
"added-types": "追加したノード:",
@@ -134,7 +135,8 @@
"flow": {
"unknown-type": "不明なノード: __type__",
"missing-types": "欠落したノード",
"error-loop": "メッセージの例外補足回数が最大値を超えました"
"error-loop": "メッセージの例外補足回数が最大値を超えました",
"non-message-returned": "ノードが __type__ 型のメッセージの送信を試みました"
},
"index": {
"unrecognised-id": "不明なID: __id__",

0
packages/node_modules/@node-red/runtime/locales/ko/runtime.json vendored Executable file → Normal file
View File

View File

@@ -0,0 +1,199 @@
{
"runtime": {
"welcome": "Bem vindo ao Node-RED",
"version": "__component__ versão: __version__",
"unsupported_version": "Versão não suportada de __component__. Requer: __requires__ Encontrado: __version__",
"paths": {
"settings": "Arquivo de configurações : __path__",
"httpStatic": "HTTP Estático : __path__"
}
},
"server": {
"loading": "Carregando paletá de nós",
"palette-editor": {
"disabled": "Editor de paletas desativado : configurações do usuário",
"npm-not-found": "Editor de paleta desativado : comando npm não encontrado",
"npm-too-old": "Editor de paleta desativado : versão npm muito antiga. Requer npm> = 3.x"
},
"errors": "Falha ao registrar __count__ tipo de nó",
"errors_plural": "Falha ao registrar __count__ tipos de nós",
"errors-help": "Execute com -v para obter detalhes",
"missing-modules": "Módulos de nó que estão faltando:",
"node-version-mismatch": "O módulo de nó não pode ser carregado nesta versão. Requer: __version__",
"type-already-registered": "'__type__' já registrado pelo módulo __module__",
"removing-modules": "Removendo os módulos da configuração",
"added-types": "Tipos de nós adicionados:",
"removed-types": "Tipos de nós removidos:",
"install": {
"invalid": "Nome de módulo inválido",
"installing": "Módulo de instalação: __name__, versão: __version__",
"installed": "Módulo instalado: __name__",
"install-failed": "Instalação falhou",
"install-failed-long": "Instalação do módulo __name__ falhou:",
"install-failed-not-found": "Módulo $t(server.install.install-failed-long) não encontrado",
"install-failed-name": "$t(server.install.install-failed-long) nome do módulo inválido: __name__",
"install-failed-url": "$t(server.install.install-failed-long) url inválido: __url__",
"post-install-error": "Erro ao executar o gancho 'postInstall':",
"upgrading": "Módulo de atualização: __name__ para a versão: __version__",
"upgraded": "Módulo atualizado: __name__. Reinicie o Node-RED para usar a nova versão",
"upgrade-failed-not-found": "$t(server.install.install-failed-long) versão não encontrada",
"uninstalling": "Desinstalando módulo: __name__",
"uninstall-failed": "Desinstalação falhou",
"uninstall-failed-long": "A desinstalação do módulo __name__ falhou:",
"uninstalled": "Módulo desinstalado: __name__",
"old-ext-mod-dir-warning": "\n\n---------------------------------------------------------------------\ndetectado diretório de módulos externos do Node-RED 1.3:\n __oldDir__\nEste diretório não é mais usado. Módulos externos serão\nreinstalados em seu diretório de usuário Node-RED:\n __newDir__\nExclua o diretório 'externalModules' antigo para interromper esta mensagem.\n---------------------------------------------------------------------\n"
},
"deprecatedOption": "O uso de __old__ está DESCONTINUADO. Use __new__ em seu lugar",
"unable-to-listen": "Incapaz de ouvir em __listenpath__",
"port-in-use": "Erro: porta em uso",
"uncaught-exception": "Exceção não capturada:",
"admin-ui-disabled": "Admin UI desativada",
"now-running": "servidor rodando agora em __listenpath__",
"failed-to-start": "Falhou ao iniciar o servidor:",
"headless-mode": "Executando no modo sem interface gráfica",
"httpadminauth-deprecated": "O uso de 'httpAdminAuth' está DESCONTINUADO. Use 'adminAuth' em seu lugar",
"https": {
"refresh-interval": "Atualizando as configurações de https a cada __interval__ hora(s)",
"settings-refreshed": "As configurações https do servidor foram atualizadas",
"refresh-failed": "Falha ao atualizar as configurações https: __message__",
"nodejs-version": "httpsRefreshInterval requer Node.js 11 ou posterior",
"function-required": "httpsRefreshInterval requer que a propriedade https seja uma função"
}
},
"api": {
"flows": {
"error-save": "Erro ao salvar fluxos: __message__",
"error-reload": "Erro ao recarregar fluxos: __message__"
},
"library": {
"error-load-entry": "Erro ao carregar a entrada da biblioteca '__path__': __message__",
"error-save-entry": "Erro ao salvar a entrada da biblioteca '__path__': __message__",
"error-load-flow": "Erro ao carregar o fluxo '__path__': __message__",
"error-save-flow": "Erro ao salvar o fluxo '__path__': __message__"
},
"nodes": {
"enabled": "Tipos de nós habilitados:",
"disabled": "Tipos de nós desabilitados:",
"error-enable": "Falha ao habilitar o nó:"
}
},
"comms": {
"error": "Erro do canal de comunicação: __message__",
"error-server": "Erro do servidor de comunicação: __message__",
"error-send": "Erro de envio de comunicação: __message__"
},
"settings": {
"user-not-available": "Não é possível salvar as configurações do usuário: __message__",
"not-available": "Configurações não disponíveis",
"property-read-only": "A propriedade '__prop__' é somente leitura",
"readonly-mode": "Execução em modo leitura somente. As alterações não serão salvas."
},
"library": {
"unknownLibrary": "Biblioteca desconhecida: __library__",
"unknownType": "Tipo de biblioteca desconhecido: __type__",
"readOnly": "A biblioteca __library__ é somente de leitura",
"failedToInit": "Falha ao inicializar a biblioteca __library__: __error__",
"invalidProperty": "Propriedade inválida __prop__: '__value__'"
},
"nodes": {
"credentials": {
"error": "Erro ao carregar credenciais: __message__",
"error-saving": "Erro ao salvar credenciais: __message__",
"not-registered": "O tipo de credencial '__type__' não está registrado",
"system-key-warning": "\n\n------------------------------------- --------------------------------\nSeu arquivo de credenciais de fluxo é criptografado usando uma chave gerada pelo sistema.\n\nSe a chave gerada pelo sistema foi perdida por qualquer motivo, seu arquivo de credenciais \nnão será recuperável; você terá que excluí-lo e inserir novamente \nsuas credenciais. \n\nVocê deve definir sua própria chave usando a opção 'credentialSecret' em \n seu arquivo de configurações. O Node-RED irá então criptografar novamente o arquivo de credenciais \n usando a chave escolhida na próxima vez que você implantar uma alteração. \n ------------------- -------------------------------------------------- \n ",
"unencrypted": "Usando credenciais não criptografadas",
"encryptedNotFound": "Credenciais criptografadas não encontradas"
},
"flows": {
"safe-mode": "Fluxos interrompidos no modo de segurança. Implementar para iniciar.",
"registered-missing": "Tipo ausente registrado: __type__",
"error": "Erro ao carregar fluxos: __message__",
"starting-modified-nodes": "Iniciando nós modificados",
"starting-modified-flows": "Iniciando fluxos modificados",
"starting-flows": "Iniciando fluxos",
"started-modified-nodes": "Nós modificados iniciados",
"started-modified-flows": "Fluxos modificados iniciados",
"started-flows": "Fluxos iniciados",
"stopping-modified-nodes": "Parando nós modificados",
"stopping-modified-flows": "Parando fluxos modificados",
"stopping-flows": "Parando fluxos",
"stopped-modified-nodes": "Nós modificados interrompidos",
"stopped-modified-flows": "Fluxos modificados interrompidos",
"stopped-flows": "Fluxos interrompidos",
"stopped": "Parado",
"stopping-error": "Erro ao parar o nó: __message__",
"updated-flows": "Fluxos atualizados",
"added-flow": "Adicionando fluxo: __label__",
"updated-flow": "Fluxo atualizado: __label__",
"removed-flow": "Fluxo removido: __label__",
"missing-types": "Esperando que os tipos ausentes sejam registrados:",
"missing-type-provided": "- __type__ (fornecido pelo módulo npm __module__)",
"missing-type-install-1": "Para instalar qualquer um desses módulos ausentes, execute:",
"missing-type-install-2": "no diretório:"
},
"flow": {
"unknown-type": "Tipo desconhecido: __type__",
"missing-types": "tipos ausentes",
"error-loop": "A mensagem excedeu o número máximo de capturas"
},
"index": {
"unrecognised-id": "Não reconhecido id: __id__",
"type-in-use": "Tipo em uso: __msg__",
"unrecognised-module": "Módulo não reconhecido: __module__"
},
"registry": {
"localfilesystem": {
"module-not-found": "Não é possível encontrar o módulo '__module__'"
}
}
},
"storage": {
"index": {
"forbidden-flow-name": "nome do fluxo proibido"
},
"localfilesystem": {
"user-dir": "Diretório do usuário: __path__",
"flows-file": "Arquivo de fluxos: __path__",
"create": "Criando novo arquivo __type__",
"empty": "O arquivo __type__ existente está vazio",
"invalid": "O arquivo __type__ existente não é json válido",
"restore": "Restaurando backup de arquivo __type__: __path__",
"restore-fail": "Falha ao restaurar o backup do arquivo __type__: __message__",
"fsync-fail": "A liberação do arquivo __path__ para o disco falhou: __message__",
"warn_name": "Nome do arquivo de fluxo não definido. Gerando nome usando o nome do servidor.",
"projects": {
"changing-project": "Configurando projeto ativo: __project__",
"active-project": "Projeto ativo: __projeto__",
"projects-directory": "Diretório de projetos: __projectsDirectory__",
"project-not-found": "Projeto não encontrado: __project__",
"no-active-project": "Nenhum projeto ativo: usando arquivo de fluxos padrão",
"disabled": "Projetos desativados: editorTheme.projects.enabled = false",
"disabledNoFlag": "Projetos desativados: defina editorTheme.projects.enabled = true para ativar",
"git-not-found": "Projetos desativados: comando git não encontrado",
"git-version-old": "Projetos desativados: git __version__ não é compatível. Requer 2.x",
"summary": "Um Projeto Node-RED",
"readme": "### Sobre\n\nEste é o arquivo README.md do seu projeto. O Arquivo ajuda usuários a entender o que seu \nprojeto faz, como usá-lo e qualquer outra coisa que eles precisem saber."
}
}
},
"context": {
"log-store-init": "Armazenamento de contexto: '__name__' [__info__]",
"error-loading-module": "Erro ao carregar armazenamento de contexto: __message__",
"error-loading-module2": "Erro ao carregar o armazenamento de contexto '__module__': __message__",
"error-module-not-defined": "Armazenamento de contexto '__storage__' opção de 'módulo' ausente",
"error-invalid-module-name": "Nome de armazenamento de contexto inválido: '__name__'",
"error-invalid-default-module": "Armazenamento de contexto padrão desconhecido: '__storage__'",
"unknown-store": "Armazenamento de contexto desconhecido '__name__' especificado. Usando armazenamento padrão.",
"localfilesystem": {
"invalid-json": "JSON inválido no arquivo de contexto '__file__'",
"error-circular": "O contexto __scope__ contém uma referência circular que não pode ser continuada",
"error-write": "Erro ao escrever o contexto: __message__"
}
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "@node-red/runtime",
"version": "3.1.0-beta.0",
"version": "3.1.0-beta.2",
"license": "Apache-2.0",
"main": "./lib/index.js",
"repository": {
@@ -16,12 +16,12 @@
}
],
"dependencies": {
"@node-red/registry": "3.1.0-beta.0",
"@node-red/util": "3.1.0-beta.0",
"async-mutex": "0.3.2",
"@node-red/registry": "3.1.0-beta.2",
"@node-red/util": "3.1.0-beta.2",
"async-mutex": "0.4.0",
"clone": "2.1.2",
"express": "4.18.1",
"fs-extra": "10.1.0",
"express": "4.18.2",
"fs-extra": "11.1.1",
"json-stringify-safe": "5.0.1"
}
}