diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6704566 --- /dev/null +++ b/.gitignore @@ -0,0 +1,104 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..8ed25e2 --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +@trycrypto:registry=https://pkgs.dev.azure.com/trycrypto/_packaging/trycrypto/npm/registry/ + +always-auth=true \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..40a460b --- /dev/null +++ b/README.md @@ -0,0 +1,56 @@ +
+ +# My Dapp + +This project is for the blockchain application My Dapp. It contains code for the Smart Contract, web-based dapp and NodeJS server. + +# Pre-requisites + +In order to develop and build "My Dapp," the following pre-requisites must be installed: + +* [Visual Studio Code](https://code.visualstudio.com/download) (or any IDE for editing Javascript) +* [NodeJS](https://nodejs.org/en/download/) + +# Installation + +Using a terminal (or command prompt), change to the folder containing the project files and type: `npm run bootstrap` This will fetch all required dependencies. The process will take 1-3 minutes and while it is in progress you can move on to the next step. + +Note: You may see some npm warnings about "web3-bzz" after dependencies are installed. These can be ignored as the associated code is never invoked. +# Build, Deploy and Test + +Using a terminal (or command prompt), change to the folder containing the project files and type: `npm run dev` This will run all the dev scripts in each project package.json. + +To view your dapp, open your browser to http://localhost:5000 + +If you encounter any problems at this step, visit [https://support.trycrypto.com](https://support.trycrypto.com) for help. + + +## Smart Contract + +`lerna run deploy --scope=@trycrypto/dappstarter-dapplib --stream` to compile contracts/*.sol files, deploy them to the blockchain. + +## Dapp + +Run the dapp in a separate terminal. You *must* have run `npm run deploy` for the dapp to see most recent smart contract changes. + +`lerna run dev --scope=@trycrypto/dappstarter-client --stream` runs the dapp on http://localhost:5001 using webpack dev server + +## Server + +Run the server in a separate terminal. You *must* have run `npm run deploy` for the dapp to see most recent smart contract changes. + +`lerna run dev --scope=@trycrypto/dappstarter-server --stream` runs NodeJS server app on port 5002 with NestJS + +## Testing + +`test-config.js` contains settings used by test scripts + +Run tests using `lerna run test [test file] --scope=@trycrypto/dappstarter-dapplib --stream` +## Production Builds + +DappStarter currently does not provide blockchain migration scripts to be used in production. However, here are the scripts for generating production builds: + +`lerna run build:prod` generates dapp bundle for production. + diff --git a/lerna.json b/lerna.json new file mode 100644 index 0000000..6cf7d3f --- /dev/null +++ b/lerna.json @@ -0,0 +1,7 @@ +{ + "packages": [ + "packages/*" + ], + "npmClient": "npm", + "version": "0.0.0" +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..444a2da --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "@trycrypto/dappstarter-hypergen", + "version": "1.0.0", + "scripts": { + "bootstrap": "npx lerna bootstrap", + "start": "npx lerna run dev --no-sort --stream --parallel", + "dev": "npm start" + }, + "devDependencies": { + "chalk": "^4.0.0", + "detect-port": "^1.3.0", + "lerna": "^3.21.0" + + } +} \ No newline at end of file diff --git a/packages/client/.babelrc b/packages/client/.babelrc new file mode 100644 index 0000000..e05d60a --- /dev/null +++ b/packages/client/.babelrc @@ -0,0 +1,12 @@ +{ + "presets": [ + "@babel/env" + ,"@babel/react" + ], + "plugins": [ + ["@babel/plugin-proposal-decorators", { "legacy": true }], + "@babel/plugin-proposal-class-properties", + "@babel/plugin-transform-runtime" + ] +} + diff --git a/packages/client/.gitignore b/packages/client/.gitignore new file mode 100644 index 0000000..716fc80 --- /dev/null +++ b/packages/client/.gitignore @@ -0,0 +1,63 @@ +# Logs +logs +*.log +npm-debug.log* +src/config.json +prod/ +dist/ + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release +build/contracts +build + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +~$*.pptx diff --git a/packages/client/LICENSE b/packages/client/LICENSE new file mode 100644 index 0000000..aeb3362 --- /dev/null +++ b/packages/client/LICENSE @@ -0,0 +1,74 @@ +MIT License + +Copyright (c) 2019 Decent Function, Inc. d/b/a TryCrypto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +OTHER LICENSES: + +LICENSE FOR SafeMath + +The MIT License (MIT) + +Copyright (c) 2016 Smart Contract Solutions, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +LICENSE for MDBootstrap + +Copyright (c) 2019 MDBootstrap.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/packages/client/README.md b/packages/client/README.md new file mode 100644 index 0000000..065a5ee --- /dev/null +++ b/packages/client/README.md @@ -0,0 +1,69 @@ +# My Dapp + +This project is for the blockchain application My Dapp. It contains code for the Smart Contract, web-based dapp and NodeJS server. + +# Pre-requisites + +In order to develop and build "My Dapp," the following pre-requisites must be installed: + +* [Visual Studio Code](https://code.visualstudio.com/download) (or any IDE for editing Javascript) +* [NodeJS v10.x](https://nodejs.org/en/download/) +* [Solidity v0.5.11](https://www.npmjs.com/package/solc) +* [Truffle v5.0.7](https://truffleframework.com/truffle) +* [Ganache v2.0.0](https://truffleframework.com/ganache) - blockchain simulator for Ethereum + +# Installation + +Using a terminal (or command prompt), change to the folder containing the project files and type: `lerna bootstrap` This will fetch all required dependencies. The process will take 1-3 minutes and while it is in progress you can move on to the next step. + +Note: You may see some npm warnings about "web3-bzz" after dependencies are installed. These can be ignored as the associated code is never invoked. + +## Ganache Settings (for Ethereum only; skip for other blockchains) + +Launch the Ganache GUI, then create a new workspace with any name of your choice. Once the workspace is active, click the gear icon and complete these configuration steps: + +- Workspace Tab: Truffle Projects: Select "Add Project" and select "truffle-config.js" from the same folder as this README.md file + +- Accounts & Keys Tab: Mnemonic (field with 12 or more words): Copy/paste the words below. + + ### grid arena fog sugar noodle ribbon remain evil install seek fresh smile + + These keywords are used to auto-generate accounts with private keys for development. If the keywords in "truffle-config.js" (which are the same as above) and Ganache don't match, you will not be able to deploy your Smart Contracts to Ganache. + +- Server Tab: Check that "Port Number" is "7545" and "Network ID = 5777" +# Build, Deploy and Test + +Using a terminal (or command prompt), change to the folder containing the project files and type: `npm run dev` This will run all the dev scripts in each project package.json. + +To view your dapp, open your browser to http://localhost:5000 + +If you encounter any problems at this step, visit [https://support.trycrypto.com](https://support.trycrypto.com) for help. + + +## Smart Contract + +`lerna run deploy --scope=@trycrypto/dappstarter-dapplib --stream` to compile contracts/*.sol files, deploy them to the blockchain. + +## Dapp + +Run the dapp in a separate terminal. You *must* have run `npm run deploy` for the dapp to see most recent smart contract changes. + +`lerna run dev --scope=@trycrypto/dappstarter-client --stream` runs the dapp on http://localhost:5001 using webpack dev server + +## Server + +Run the server in a separate terminal. You *must* have run `npm run deploy` for the dapp to see most recent smart contract changes. + +`lerna run dev --scope=@trycrypto/dappstarter-server --stream` runs NodeJS server app on port 5002 with NestJS + +## Testing + +`test-config.js` contains settings used by test scripts + +Run tests using `lerna run test [test file] --scope=@trycrypto/dappstarter-dapplib --stream` +## Production Builds + +DappStarter currently does not provide blockchain migration scripts to be used in production. However, here are the scripts for generating production builds: + +`lerna run build:prod` generates dapp bundle for production. + diff --git a/packages/client/jsconfig.json b/packages/client/jsconfig.json new file mode 100644 index 0000000..95f773e --- /dev/null +++ b/packages/client/jsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "es6", + "experimentalDecorators": true + } +} \ No newline at end of file diff --git a/packages/client/package.json b/packages/client/package.json new file mode 100644 index 0000000..852c332 --- /dev/null +++ b/packages/client/package.json @@ -0,0 +1,80 @@ +{ + "name": "@trycrypto/dappstarter-client", + "version": "0.1.0", + "description": "Dapp scaffolding created with DappStarter", + "directories": { + "test": "test" + }, + "license": "MIT", + "scripts": { + "start": "npm run deploy && npm run dapp", + "dev": "wait-on ../dapplib/src/dapp-config.json && npm run client", + "client": "npm run dapp", + "dapp": "webpack-dev-server --mode development --config webpack.config.dapp.js", + "dapp:prod": "webpack --mode production --config webpack.config.dapp.js" + }, + "authors": [ + "Nik Kalyani+ Your Dapp is ready, and the world is waiting for you to create + something amazing. Visit + TryCrypto.com + for more insights on dapp development. The examples below + demonstrate how to use the Dapp Library, ActionCard and ActionButton + components to interact with the Dapp smart contract. +
+Die Flows wurden aufgrund fehlender Nodetypen gestoppt.
", + "restartRequired" : "Node-RED muss erneut gestartet werden, damit aufgerüstete Module aktiviert werden können", + "credentials_load_failed" : "Die Flows wurden gestoppt, da die Berechtigungsnachweise nicht entschlüsselt werden konnten.
Die Datei mit dem Datenflowberechtigungsnachweis ist verschlüsselt, aber der Verschlüsselungsschlüssel des Projekts fehlt oder ist ungültig.
", + "credentials_load_failed_reset" : "Die Berechtigungsnachweise konnten nicht entschlüsselt werden
Die Datei mit dem Flow-Berechtigungsnachweis ist verschlüsselt, aber der Chiffrierschlüssel des Projekts fehlt oder ist ungültig.
Die Datei des Flow-Berechtigungsnachweises wird bei der nächsten Implementierung zurückgesetzt. Alle vorhandenen Datenflowberechtigungsnachweise werden gelöscht.
", + "missing_flow_file" : "Die Projektflowdatei wurde nicht gefunden.
Das Projekt ist nicht mit einer Flow-Datei konfiguriert.
", + "missing_package_file" : "Die Projektpaketdatei wurde nicht gefunden.
In dem Projekt fehlt eine Datei 'package.json'.
", + "project_empty" : "Das Projekt ist leer.
Möchten Sie eine Standardgruppe von Projektdateien erstellen?
Andernfalls müssen Sie Dateien außerhalb des Editors manuell zum Projekt hinzufügen.
Das Projekt '__project__' wurde nicht gefunden.
", + "git_merge_conflict" : "Das automatische Zusammenführen von Änderungen ist fehlgeschlagen.
Beheben Sie die nicht zusammengeführten Konflikte und schreiben Sie die Ergebnisse fest.
" + }, + "error" : " Fehler : __message__", + "errors" : { + "lostConnection" : "Verbindung zum Server verloren, Verbindung wird erneut hergestellt ...", + "lostConnectionReconnect" : "Verbindung zum Server verloren, Verbindung in __time__s wird wieder hergestellt.", + "lostConnectionTry" : "Jetzt testen", + "cannotAddSubflowToItself" : "Subflow kann nicht zu sich selbst hinzugefügt werden", + "cannotAddCircularReference" : "Subflow kann nicht hinzugefügt werden-zirkuläre Referenz wurde erkannt", + "unsupportedVersion" : "Verwenden einer nicht unterstützten Version von Node.js
Sie sollten ein Upgrade auf das neueste LTS-Release von Node.js durchführen.
", + "failedToAppendNode" : "Fehler beim Laden von '__module__'
__error__
" + }, + "project" : { + "change-branch" : "Wechseln Sie in die lokale Verzweigung '__project__'.", + "merge-abort" : "Git-Zusammenführung abgebrochen", + "loaded" : "Projekt '__project__' geladen", + "updated" : "Projekt '__project__' aktualisiert", + "pull" : "Projekt '__project__' erneut geladen", + "revert" : "Projekt '__project__' erneut geladen", + "merge-complete" : "Git-Zusammenführung abgeschlossen" + }, + "label" : { + "manage-project-dep" : "Projektabhängigkeiten verwalten", + "setup-cred" : "Berechtigungsnachweise einrichten", + "setup-project" : "Projektdateien konfigurieren", + "create-default-package" : "Standardpaketdatei erstellen", + "no-thanks" : "Nein danke", + "create-default-project" : "Standardprojektdateien erstellen", + "show-merge-conflicts" : "Zusammenführungskonflikte anzeigen" + } + }, + "clipboard" : { + "clipboard" : "Zwischenablage", + "nodes" : "Nodes", + "pasteNodes" : "Nodes hier einfügen", + "importNodes" : "Nodes importieren", + "exportNodes" : "Nodes in Zwischenablage exportieren", + "importUnrecognised" : "Importierter Typ nicht erkannt:", + "importUnrecognised_plural" : "Importierte Typen nicht erkannt:", + "nodesExported" : "Nodes, die in die Zwischenablage exportiert wurden", + "nodeCopied" : "__count__ Node kopiert", + "nodeCopied_plural" : "__count__ Nodes kopiert", + "invalidFlow" : "Ungültiger Nachrichtenflow: __message__", + "export" : { + "selected" : "Ausgewählte Nodes", + "current" : "Aktueller Flow", + "all" : "alle Flows", + "compact" : "kompakt", + "formatted" : "formatiert", + "copy" : "In Zwischenablage exportieren" + }, + "import" : { + "import" : "Importieren in", + "newFlow" : "neuer Flow" + }, + "copyMessagePath" : "Pfad kopiert", + "copyMessageValue" : "Wert kopiert", + "copyMessageValue_truncated" : "Abgeschnittene Wert kopiert" + }, + "deploy" : { + "deploy" : "deploy", + "full" : "Voll", + "fullDesc" : "Implementiert alles im Arbeitsbereich", + "modifiedFlows" : "Geänderte Flows", + "modifiedFlowsDesc" : "Implementiert nur Flows, die geänderte Nodes enthalten.", + "modifiedNodes" : "Geänderte Nodes", + "modifiedNodesDesc" : "Implementiert nur Nodes, die sich geändert haben.", + "successfulDeploy" : "Erfolgreich implementiert", + "deployFailed" : "Deploy fehlgeschlagen: __message__", + "unusedConfigNodes" : "Sie haben einige nicht verwendete Konfigurations-Nodes.", + "unusedConfigNodesLink" : "Klicken Sie hier, um sie zu sehen", + "errors" : { + "noResponse" : "Keine Antwort vom Server" + }, + "confirm" : { + "button" : { + "ignore" : "Ignorieren", + "confirm" : "Deploy bestätigen", + "review" : "Änderungen prüfen", + "cancel" : "Abbrechen", + "merge" : "Zusammenführen", + "overwrite" : "Ignorieren & deployen" + }, + "undeployedChanges" : "Sie haben nicht implementierte Änderungen.\n\nWenn Sie diese Seite verlassen, gehen diese Änderungen verloren.", + "improperlyConfigured" : "Der Arbeitsbereich enthält einige Nodes, die nicht ordnungsgemäß konfiguriert sind:", + "unknown" : "Der Arbeitsbereich enthält einige unbekannte Node-Typen:", + "confirm" : "Sind Sie sicher, dass Sie deployen möchten?", + "doNotWarn" : "warnen Sie nicht noch einmal.", + "conflict" : "Auf dem Server wird eine aktuellere Gruppe von Datenflüssen ausgeführt.", + "backgroundUpdate" : "Die Datenflüsse auf dem Server wurden aktualisiert.", + "conflictChecking" : "Überprüfen Sie, ob die Änderungen automatisch gemischt werden können.", + "conflictAutoMerge" : "Die Änderungen enthalten keine Konflikte und können automatisch gemischt werden.", + "conflictManualMerge" : "Zu den Änderungen gehören Konflikte, die aufgelöst werden müssen, bevor sie implementiert werden können.", + "plusNMore" : "+ __count__ mehr" + } + }, + "diff" : { + "unresolvedCount" : "__count__ unaufgelöster Konflikt", + "unresolvedCount_plural" : "__count__ unaufgelöste Konflikte", + "globalNodes" : "Globale Nodes", + "flowProperties" : "Flow-Eigenschaften", + "type" : { + "added" : "hinzugefügt", + "changed" : "geändert", + "unchanged" : "unverändert", + "deleted" : "gelöscht", + "flowDeleted" : "Flow gelöscht", + "flowAdded" : "Flow hinzugefügt", + "movedTo" : "verschoben zu __id__", + "movedFrom" : "verschoben von __id__" + }, + "nodeCount" : "__count__, Node", + "nodeCount_plural" : "__count__-Nodes", + "local" : "Lokale Änderungen", + "remote" : "Ferne Änderungen", + "reviewChanges" : "Änderungen prüfen", + "noBinaryFileShowed" : "Der Inhalt der Binärdatei kann nicht angezeigt", + "viewCommitDiff" : "Änderungen festschreiben", + "compareChanges" : "Änderungen vergleichen", + "saveConflict" : "Konfliktlösung speichern", + "conflictHeader" : " __resolved__ von __unresolved__ -Konflikten behoben", + "commonVersionError" : "Allgemeine Version enthält keine gültige JSON-Datei:", + "oldVersionError" : "Alte Version enthält keine gültige JSON-Datei:", + "newVersionError" : "Neue Version enthält keine gültige JSON-Datei:" + }, + "subflow" : { + "editSubflow" : "Flowschablone bearbeiten: __name__", + "edit" : "Flowsschablone bearbeiten", + "subflowInstances" : "Es ist __count__ Instanz dieser Subflow-Vorlage vorhanden.", + "subflowInstances_plural" : "Es gibt __count__ Instanzen dieser Subflow-Vorlage.", + "editSubflowProperties" : "Eigenschaften bearbeiten", + "input" : "Eingaben:", + "output" : "Ausgaben:", + "deleteSubflow" : "Subflow löschen", + "info" : "Beschreibung", + "category" : "Kategorie", + "errors" : { + "noNodesSelected" : " Subflow kann nicht erstellt werden : Es wurden keine Nodes ausgewählt.", + "multipleInputsToSelection" : " Subflow kann nicht erstellt werden : Mehrere Eingaben zur Auswahl" + } + }, + "editor" : { + "configEdit" : "Bearbeiten", + "configAdd" : "Hinzufügen", + "configUpdate" : "Aktualisieren", + "configDelete" : "Löschen", + "nodesUse" : "__count__node verwendet diese Konfiguration", + "nodesUse_plural" : "__count__ -Nodes verwenden diese Konfiguration", + "addNewConfig" : "Neuen __type__config-Node hinzufügen", + "editNode" : "__type__ Node bearbeiten", + "editConfig" : "__type__config-Node bearbeiten", + "addNewType" : "Neuen __type__ hinzufügen ...", + "nodeProperties" : "Node-Eigenschaften", + "portLabels" : "Node-Einstellungen", + "labelInputs" : "Eingänge", + "labelOutputs" : "Ausgänge", + "settingIcon" : "Symbol", + "noDefaultLabel" : "keine", + "defaultLabel" : "Standardbeschriftung verwenden", + "searchIcons" : "Suchsymbole", + "useDefault" : "Standardwert verwenden", + "errors" : { + "scopeChange" : "Wenn Sie den Geltungsbereich ändern, wird er für Nodes in anderen Nachrichtenflüssen, die ihn verwenden, nicht verfügbar sein." + } + }, + "keyboard" : { + "title" : "Tastaturkurzbefehle", + "keyboard" : "Tastatur", + "filterActions" : "Filteraktionen", + "shortcut" : "Direktaufruf", + "scope" : "Bereich", + "unassigned" : "Nicht zugeordnet", + "global" : "global", + "workspace" : "Arbeitsbereich", + "selectAll" : "Alle Nodes auswählen", + "selectAllConnected" : "Alle verbundenen Nodes auswählen", + "addRemoveNode" : "Node aus Auswahl hinzufügen/entfernen", + "editSelected" : "Ausgewählten Node bearbeiten", + "deleteSelected" : "Ausgewählte Node oder ausgewählten Link löschen", + "importNode" : "Node importieren", + "exportNode" : "Node exportieren", + "nudgeNode" : "Ausgewählte Nodes verschieben (1px)", + "moveNode" : "Ausgewählte Nodes verschieben (20px)", + "toggleSidebar" : "Seitenleiste ein-/ausschalten", + "copyNode" : "Ausgewählte Nodes kopieren", + "cutNode" : "Ausgewählte Nodes ausschneiden", + "pasteNode" : "Node einfügen", + "undoChange" : "Letzte Änderung rückgängig machen", + "searchBox" : "Suchfeld öffnen", + "managePalette" : "Palette verwalten" + }, + "library" : { + "library" : "Bibliothek", + "openLibrary" : "Bibliothek öffnen ...", + "saveToLibrary" : "In Bibliothek speichern ...", + "typeLibrary" : "__type__, Bibliothek", + "unnamedType" : "Unbenannt __type__", + "dialogSaveOverwrite" : "Ein __libraryType__ mit dem Namen __libraryName__ ist bereits vorhanden. Überschreiben?", + "invalidFilename" : "Ungültiger Dateiname", + "savedNodes" : "Gespeicherte Nodes", + "savedType" : "Gespeichert __type__", + "saveFailed" : "Speichern fehlgeschlagen: __message__", + "types": { + "examples" : "Beispiele" + } + }, + "palette" : { + "noInfo" : "Keine Informationen verfügbar", + "filter" : "Filter Nodes", + "search" : "Suchmodule", + "addCategory" : "Neu hinzufügen ...", + "label" : { + "subflows" : "Subflows", + "input" : "Eingabe", + "output" : "Ausgabe", + "function" : "Funktion", + "social" : "Soziale", + "storage" : "Speicher", + "analysis" : "Analyse", + "advanced" : "fortgeschritten" + }, + "event" : { + "nodeAdded" : "Node zur Palette hinzugefügt:", + "nodeAdded_plural" : "Die Nodes wurde der Palette hinzugefügt.", + "nodeRemoved" : "Node aus Palette entfernt:", + "nodeRemoved_plural" : "Nodes aus Palette entfernt:", + "nodeEnabled" : "Node aktiviert:", + "nodeEnabled_plural" : "Nodes aktiviert:", + "nodeDisabled" : "Node inaktiviert:", + "nodeDisabled_plural" : "Nodes inaktiviert:", + "nodeUpgraded" : "Node-Modul __module__ aktualisiert auf Version __version__" + }, + "editor" : { + "title" : "Palette verwalten", + "palette" : "Palette", + "times" : { + "seconds" : "Vor Sekunden", + "minutes" : "Minuten vor", + "minutesV" : "__count__ Minuten", + "hoursV" : "__count__ Stunde ago", + "hoursV_plural" : "__count__hours ago", + "daysV" : "__count__ Tag ago", + "daysV_plural" : "__count__ Tage", + "weeksV" : "__count__ Woche vor", + "weeksV_plural" : "__count__wochen ago", + "monthsV" : "__count__ Monat vor", + "monthsV_plural" : "__count__ Monaten", + "yearsV" : "__count__ Jahr", + "yearsV_plural" : "__count__ Jahren", + "yearMonthsV" : "____ Jahr, __count__ Monat", + "yearMonthsV_plural" : "____ Jahr, __count__ Monaten", + "yearsMonthsV" : "____ Jahre, __count__ Monat vor", + "yearsMonthsV_plural" : "____ Jahre, __count__ Monaten" + }, + "nodeCount" : "__label__, Node", + "nodeCount_plural" : "__label__ Nodes", + "moduleCount" : "__count__ Modul verfügbar", + "moduleCount_plural" : "__count__-Module verfügbar", + "inuse" : "im Gebrauch", + "enableall" : "alle aktivieren", + "disableall" : "Alle inaktivieren", + "enable" : "aktivieren", + "disable" : "inaktivieren", + "remove" : "entfernen", + "update" : "Update auf __version__", + "updated" : "aktualisiert", + "install" : "installieren", + "installed" : "installiert", + "loading" : "Kataloge werden geladen ...", + "tab-nodes" : "Nodes", + "tab-install" : "installieren", + "sort" : "Sortierung:", + "sortAZ" : "a-z", + "sortRecent" : "kürzlich", + "more" : "+ __count__ mehr", + "errors" : { + "catalogLoadFailed" : "Fehler beim Laden des Node-Katalogs.
Weitere Informationen finden Sie in der Browserkonsole.
", + "installFailed" : "Installation fehlgeschlagen: __module__
__message__
Überprüfen Sie das Protokoll auf weitere Informationen.
", + "removeFailed" : "Entfernen fehlgeschlagen: __module__
__message__
Überprüfen Sie das Protokoll auf weitere Informationen.
", + "updateFailed" : "Aktualisierung fehlgeschlagen: __module__
__message__
Überprüfen Sie das Protokoll auf weitere Informationen.
", + "enableFailed" : "Fehlgeschlagene Aktivierung: __module__
__message__
Überprüfen Sie das Protokoll auf weitere Informationen.
", + "disableFailed" : "Inaktivieren fehlgeschlagen: __module__
__message__
Überprüfen Sie das Protokoll auf weitere Informationen.
" + }, + "confirm" : { + "install" : { + "body" : "Installieren von '__module__'
Vor der Installation von lesen Sie bitte die Dokumentation des Nodes. Einige Nodes haben Abhängigkeiten, die nicht automatisch aufgelöst werden können und einen Neustart von 'Node-RED' erfordern.
", + "title" : "Nodes installieren" + }, + "remove" : { + "body" : "Entfernen von '__module__'
-Der Node deinstalliert ihn aus Node-RED. Der Node kann weiterhin Ressourcen verwenden, bis Node-RED erneut gestartet wird.
", + "title" : "Nodes entfernen" + }, + "update" : { + "body" : "Aktualisieren von '__module__'
Für die Aktualisierung des Nodes ist ein Neustart von 'Node-RED' erforderlich, damit die Aktualisierung abgeschlossen werden kann. Dies muss manuell geschehen.
", + "title" : "Nodes aktualisieren" + }, + "cannotUpdate" : { + "body" : "Es ist eine Aktualisierung für diesen Node verfügbar, aber sie ist nicht an einer Position installiert, die vom Palettenmanager aktualisiert werden kann.Ferne Änderungen können nicht gezogen werden. Die nicht zwischengespeicherten lokalen Änderungen werden überschrieben.
Die Änderungen festschreiben und die Anforderung wiederholen.
", + "showUnstagedChanges" : "Nicht zwischengespeicherte Änderungen anzeigen", + "connectionFailed" : "Verbindung zum fernen Repository konnte nicht hergestellt werden: ", + "pullUnrelatedHistory" : "Das ferne Protokoll der Festschreibungen hat einen nicht zugehörigen Verlauf.
Sind Sie sicher, dass Sie die Änderungen in Ihr lokales Repository ziehen möchten?
", + "pullChanges" : "Änderungen extrahieren", + "history" : "Verlauf", + "daysAgo" : "__count__ Tag ago", + "daysAgo_plural" : "__count__ Tage", + "hoursAgo" : "__count__ Stunde ago", + "hoursAgo_plural" : "__count__hours ago", + "minsAgo" : "__count__ min ago", + "minsAgo_plural" : "__count__ mins ago", + "secondsAgo" : "Sekunden zurück", + "notTracking" : "Ihre lokale Verzweigung verfolgt derzeit keine ferne Verzweigung.", + "statusUnmergedChanged" : "In Ihrem Repository sind nicht zusammengeführte Änderungen vorhanden. Sie müssen die Konflikte beheben und das Ergebnis festschreiben.", + "repositoryUpToDate" : "Ihr Repository ist auf dem neuesten Stand.", + "commitsAhead" : "Ihr Repository ist __count__commit vor der fernen. Sie können diese Festschreibung jetzt übertragen.", + "commitsAhead_plural" : "Ihr Repository ist __count__ ist vor der fernen Commits festgeschrieben. Sie können diese Commits jetzt verschieben.", + "commitsBehind" : "Ihr Projektarchiv ist __count__ hinter der Fernbedienung. Sie können diese Festschreibung jetzt extrahieren.", + "commitsBehind_plural" : "Ihr Repository ist __count__ ist hinter der Fernbedienung festgeschrieben. Sie können diese Commits jetzt extrahieren.", + "commitsAheadAndBehind1" : "Ihr Projektarchiv ist __count__commit hinter und ", + "commitsAheadAndBehind1_plural" : "Ihr Repository ist __count__ schreibt sich zurück und ", + "commitsAheadAndBehind2" : "__count__ wird vor der fernen festgeschrieben. ", + "commitsAheadAndBehind2_plural" : "__count__ schreibt vor der fernen Funktion fest. ", + "commitsAheadAndBehind3" : "Sie müssen die ferne Festschreibung nach unten ziehen, bevor Sie sie drücken.", + "commitsAheadAndBehind3_plural" : "Sie müssen die fernen Festschreibungen vor dem Pusdrücken zurückziehen." + } + } + }, + "typedInput" : { + "type" : { + "str" : "String", + "num" : "Number", + "re" : "Regulärer Ausdruck", + "bool" : "boolean", + "json" : "JSON", + "bin" : "Buffer", + "date" : "timestamp", + "jsonata" : "Ausdruck", + "env" : "env, Variable" + } + }, + "editableList" : { + "add" : "hinzufügen" + }, + "search" : { + "empty" : "Keine Übereinstimmungen gefunden", + "addNode" : "Node hinzufügen ..." + }, + "expressionEditor" : { + "functions" : "Funktionen", + "functionReference" : "Funktionsreferenz", + "insert" : "Einfügen", + "title" : "JSONata-Ausdruckseditor", + "test" : "Test", + "data" : "Beispielnachricht", + "result" : "Ergebnis", + "format" : "Formatiere Ausdruck", + "compatMode" : "Kompatibilitätsmodus aktiviert", + "compatModeDesc" : " Der aktuelle Ausdruck scheint immer noch auf msg
zu verweisen, so dass er im Kompatibilitätsmodus ausgewertet wird. Aktualisieren Sie den Ausdruck so, dass msg
nicht verwendet wird, da dieser Modus in der Zukunft entfernt wird.
Wenn die JSONata-Unterstützung zuerst zu Node-RED hinzugefügt wurde, ist der Ausdruck erforderlich, um auf das Objekt msg
zu verweisen. Beispiel: msg.payload
würde für den Zugriff auf die Nutzdaten verwendet.
Das ist nicht mehr erforderlich, da der Ausdruck direkt anhand der Nachricht ausgewertet wird. Um auf die Nutzdaten zugreifen zu können, muss der Ausdruck nur Nutzdaten
sein.
Der Buffertyp wird als JSON-Array mit Bytewerten gespeichert. Der Editor versucht, den eingegebenen Wert als JSON-Array zu parsen. Wenn es sich nicht um ein gültiges JSON handelt, wird es als UTF-8-Zeichenfolge behandelt und in ein Array der einzelnen Zeichencodepunkte konvertiert.
Beispiel: Der Wert Hello World
wird in das JSON-Array konvertiert:
[ 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]" + }, + "projects" : { + "config-git" : "Git-Client konfigurieren", + "welcome" : { + "hello" : "Hallo! Wir haben 'Projekte' in 'Node-RED' eingeführt.", + "desc0" : "Dies ist eine neue Methode für die Verwaltung Ihrer Datenflowsdateien und die Versionssteuerung Ihrer Abläufe.", + "desc1" : "Um zu beginnen, können Sie Ihr erstes Projekt erstellen oder ein vorhandenes Projekt aus einem Git-Repository klonen.", + "desc2" : "Wenn Sie sich nicht sicher sind, können Sie das jetzt überspringen. Sie können immer noch Ihr erstes Projekt aus dem 'Projects' -Menü erstellen.", + "create" : "Projekt erstellen", + "clone" : "Repository klonen", + "not-right-now" : "Jetzt nicht mehr" + }, + "git-config" : { + "setup" : "Konfigurieren Sie Ihren Versionssteuerungsclient.", + "desc0" : "Node-RED verwendet das Open-Source-Tool Git für die Versionssteuerung. Es protokolliert Änderungen in Ihren Projektdateien und ermöglicht es Ihnen, sie in ferne Repositorys zu übertragen.", + "desc1" : "Wenn Sie eine Reihe von Änderungen festschreiben, werden die Änderungen mit einem Benutzernamen und einer E-Mail-Adresse von GIT-Datensätzen vorgenommen. Der Benutzername kann alles sein, was Sie wollen-es muss nicht Ihr richtiger Name sein.", + "desc2" : "Ihr Git-Client ist bereits mit den unten stehenden Details konfiguriert.", + "desc3" : "Sie können diese Einstellungen später unter der Registerkarte \"Git config\" des Einstellungsdialogs ändern.", + "username" : "Benutzername", + "email" : "E-Mail" + }, + "project-details" : { + "create" : "Erstellen Sie Ihr Projekt.", + "desc0" : "Ein Projekt wird als Git-Repository verwaltet. Es ist wesentlich einfacher, Ihre Abläufe mit anderen zu teilen und an ihnen zu arbeiten.", + "desc1" : "Sie können mehrere Projekte erstellen und schnell zwischen den Projekten im Editor wechseln.", + "desc2" : "Zu Beginn benötigt Ihr Projekt einen Namen und eine optionale Beschreibung.", + "already-exists" : "Das Projekt ist bereits vorhanden", + "must-contain" : "Darf nur A-Z 0-9 _ enthalten.", + "project-name" : "Projektname", + "desc" : "Beschreibung", + "opt" : "Optional" + }, + "clone-project" : { + "clone" : "Projekt klonen", + "desc0" : "Wenn Sie bereits über ein Git-Repository verfügen, das ein Projekt enthält, können Sie es klonen, um es zu starten.", + "already-exists" : "Das Projekt ist bereits vorhanden", + "must-contain" : "Darf nur A-Z 0-9 _ enthalten.", + "project-name" : "Projektname", + "no-info-in-url" : "Geben Sie den Benutzernamen/das Kennwort nicht in die URL ein.", + "git-url" : "Git-Repository-URL", + "protocols" : "https://, ssh:// oder file://", + "auth-failed" : "Authentifizierung fehlgeschlagen", + "username" : "Benutzername", + "passwd" : "Kennwort", + "ssh-key" : "SSH-Schlüssel", + "passphrase" : "Kennphrase", + "ssh-key-desc" : "Bevor Sie ein Repository über ssh klonen können, müssen Sie einen SSH-Schlüssel hinzufügen, um auf diesen zu zugreifen.", + "ssh-key-add" : "Einen ssh-Schlüssel hinzufügen", + "credential-key" : "Verschlüsselungsschlüssel für Berechtigungsnachweise", + "cant-get-ssh-key" : "Fehler! Der ausgewählte SSH-Schlüsselpfad kann nicht abgerufen werden.", + "already-exists2" : "bereits vorhanden", + "git-error" : "Git-Fehler", + "connection-failed" : "Verbindung fehlgeschlagen", + "not-git-repo" : "Kein Git-Repository", + "repo-not-found" : "Repository nicht gefunden" + }, + "default-files" : { + "create" : "Erstellen Sie Ihre Projektdateien.", + "desc0" : "Ein Projekt enthält Ihre Flow-Dateien, eine README-Datei und eine package.json-Datei.", + "desc1" : "Es kann alle anderen Dateien enthalten, die im Git-Repository verwaltet werden sollen.", + "desc2" : "Ihre vorhandenen Flow- und Berechtigungsnachweisdateien werden in das Projekt kopiert.", + "flow-file" : "Flow-Datei", + "credentials-file" : "Berechtigungsnachweisdatei" + }, + "encryption-config" : { + "setup" : "Setup der Verschlüsselung Ihrer Berechtigungsnachweisdatei", + "desc0" : "Die Datei mit den Datenflowsberechtigungsnachweisen kann verschlüsselt werden, um ihren Inhalt sicher zu halten.", + "desc1" : "Wenn Sie diese Berechtigungsnachweise in einem öffentlichen Git-Repository speichern möchten, müssen Sie sie verschlüsseln, indem Sie einen geheimen Schlüsselausdruck bereitstellen.", + "desc2" : "Die Datei mit den Datenflowberechtigungsnachweisen ist derzeit nicht verschlüsselt.", + "desc3" : "Das heißt, ihr Inhalt, wie z. B. Kennwörter und Zugriffstokens, kann von jedem mit Zugriff auf die Datei gelesen werden.", + "desc4" : "Wenn Sie diese Berechtigungsnachweise in einem öffentlichen Git-Repository speichern möchten, müssen Sie sie verschlüsseln, indem Sie einen geheimen Schlüsselausdruck bereitstellen.", + "desc5" : "Ihre Datei mit den Datenflowberechtigungsnachweisen wird derzeit mit der Eigenschaft credentialSecret aus Ihrer Einstellungsdatei als Schlüssel verschlüsselt.", + "desc6" : "Die Datei mit den Datenflowberechtigungsnachweisen wird derzeit mit einem vom System generierten Schlüssel verschlüsselt. Sie sollten einen neuen geheimen Schlüssel für dieses Projekt angeben.", + "desc7" : "Der Schlüssel wird separat von den Projektdateien gespeichert. Sie müssen den Schlüssel angeben, damit dieses Projekt in einer anderen Instanz von Node-RED verwendet werden kann.", + "credentials" : "Berechtigungsnachweis", + "enable" : "Verschlüsselung aktivieren", + "disable" : "Verschlüsselung inaktivieren", + "disabled" : "inaktiviert", + "copy" : "Vorhandenen Schlüssel kopieren", + "use-custom" : "Angepasster Schlüssel verwenden", + "desc8" : "Die Datei mit den Berechtigungsnachweisen wird nicht verschlüsselt, und ihr Inhalt kann leicht gelesen werden.", + "create-project-files" : "Projektdateien erstellen", + "create-project" : "Projekt erstellen", + "already-exists" : "bereits vorhanden", + "git-error" : "Git-Fehler", + "git-auth-error" : "git-auth-Fehler" + }, + "create-success" : { + "success" : "Sie haben Ihr erstes Projekt erfolgreich erstellt!", + "desc0" : "Sie können jetzt weiterhin Node-RED verwenden, wie Sie es immer haben.", + "desc1" : "Auf der Registerkarte \"info\" in der Seitenleiste wird angezeigt, was Ihr aktuelles aktives Projekt ist. Die Schaltfläche neben dem Namen kann für den Zugriff auf die Sicht 'Projekteinstellungen' verwendet werden.", + "desc2" : "Die Registerkarte 'Verlauf' in der Seitenleiste kann verwendet werden, um Dateien anzuzeigen, die sich in Ihrem Projekt geändert haben, und sie festzuschreiben. Es zeigt Ihnen eine vollständige Historie Ihrer Commits an und ermöglicht es Ihnen, Ihre Änderungen in ein fernes Repository zu übertragen." + }, + "create" : { + "projects" : "Projekte", + "already-exists" : "Das Projekt ist bereits vorhanden", + "must-contain" : "Darf nur A-Z 0-9 _ enthalten.", + "no-info-in-url" : "Geben Sie den Benutzernamen/das Kennwort nicht in die URL ein.", + "open" : "Projekt öffnen", + "create" : "Projekt erstellen", + "clone" : "Repository klonen", + "project-name" : "Projektname", + "desc" : "Beschreibung", + "opt" : "Optional", + "flow-file" : "Flow-Datei", + "credentials" : "Berechtigungsnachweis", + "enable-encryption" : "Verschlüsselung aktivieren", + "disable-encryption" : "Verschlüsselung inaktivieren", + "encryption-key" : "Chiffrierschlüssel", + "desc0" : "Eine Phrase, mit der Sie Ihre Berechtigungsnachweise schützen", + "desc1" : "Die Datei mit den Berechtigungsnachweisen wird nicht verschlüsselt, und ihr Inhalt kann leicht gelesen werden.", + "git-url" : "Git-Repository-URL", + "protocols" : "https://, ssh:// oder file://", + "auth-failed" : "Authentifizierung fehlgeschlagen", + "username" : "Benutzername", + "password" : "Kennwort", + "ssh-key" : "SSH-Schlüssel", + "passphrase" : "Kennphrase", + "desc2" : "Bevor Sie ein Repository über ssh klonen können, müssen Sie einen SSH-Schlüssel hinzufügen, um auf diesen zu zugreifen.", + "add-ssh-key" : "Einen ssh-Schlüssel hinzufügen", + "credentials-encryption-key" : "Verschlüsselungsschlüssel für Berechtigungsnachweise", + "already-exists-2" : "bereits vorhanden", + "git-error" : "Git-Fehler", + "con-failed" : "Verbindung fehlgeschlagen", + "not-git" : "Kein Git-Repository", + "no-resource" : "Repository nicht gefunden", + "cant-get-ssh-key-path" : "Fehler! Der ausgewählte SSH-Schlüsselpfad kann nicht abgerufen werden.", + "unexpected_error" : "unerwarteter_Fehler" + }, + "delete" : { + "confirm" : "Sind Sie sicher, dass Sie dieses Projekt löschen möchten?" + }, + "create-project-list" : { + "search" : "Projekte durchsuchen", + "current" : "aktuell" + }, + "require-clean" : { + "confirm" : "
Sie haben nicht implementierte Änderungen verloren, die verloren gehen.
Möchten Sie fortfahren?
" + }, + "send-req" : { + "auth-req" : "Authentifizierung für Repository erforderlich", + "username" : "Benutzername", + "password" : "Kennwort", + "passphrase" : "Kennphrase", + "retry" : "Retry", + "update-failed" : "Fehler beim Aktualisieren der Auth.", + "unhandled" : "Nicht behandelte Fehlerantwort" + }, + "create-branch-list" : { + "invalid" : "Ungültige Verzweigung", + "create" : "Verzweigung erstellen", + "current" : "aktuell" + }, + "create-default-file-set" : { + "no-active" : "Standarddatei kann ohne aktives Projekt nicht erstellt werden", + "no-empty" : "Für ein nicht leeres Projekt kann keine Standarddatei erstellt werden.", + "git-error" : "Git-Fehler" + }, + "errors" : { + "no-username-email" : "Ihr Git-Client ist nicht mit einem Benutzernamen/einer E-Mail konfiguriert.", + "unexpected" : "Es ist ein unerwarteter Fehler aufgetreten", + "code" : "code" + } + } +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/de/infotips.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/de/infotips.json new file mode 100644 index 0000000..4cec02f --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/de/infotips.json @@ -0,0 +1,23 @@ +{ + "info" : { + "tip0" : "Sie können die ausgewählten Nodes oder Verbindungen mit {{ core:delete-selection }} entfernen.", + "tip1" : "Suche nach Nodes mit {{ core:search }}", + "tip2" : "{{ core:toggle-sidebar }} schaltet die Ansicht dieser Seitenleiste ein.", + "tip3" : "Sie können Ihre Palette von Nodes mit {{ core:manage-palette }} verwalten.", + "tip4" : "Ihre Flow-Konfigurations-Nodes werden in der Seitenleiste angezeigt. Es kann über das Menü oder mit {{ core:show-config-tab }} aufgerufen werden.", + "tip5" : "Aktiviert oder inaktiviert diese Tipps von der Option in den Einstellungen", + "tip6" : "Verschieben Sie die ausgewählten Nodes mit Hilfe der [left] [up] [down] und [right] Tasten. Halten Sie [Shift] gedrückt, um das Fenster weiter zu schieben", + "tip7" : "Wenn Sie einen Node auf eine Verbindung ziehen, wird er in die Verbindung eingefügt.", + "tip8" : "Die ausgewählten Nodes exportieren oder die aktuelle Registerkarte mit {{ core:show-export-dialog }}", + "tip9" : "Importieren Sie einen Flow, indem Sie sein JSON in den Editor ziehen oder mit {{ core:show-import-dialog }}.", + "tip10" : "[Umschalt] [Klicken] und ziehen Sie auf einen Node-Anschluss, um alle angeschlossenen Verbindungen oder nur die ausgewählte zu verschieben.", + "tip11" : "Die Registerkarte \"Info\" mit {{ core:show-info-tab }} oder der Registerkarte \"Debug\" mit {{ core:show-debug-tab }} anzeigen", + "tip12" : "[ctrl] [Klicken] in den Arbeitsbereich, um den Schnellhinzufügedialog zu öffnen.", + "tip13" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einem Node-Anschluss klicken, um eine Schnellverbindung zu aktivieren.", + "tip14" : "Halten Sie [Umschalt] gedrückt, wenn Sie auf einen Node klicken, um auch alle verbundenen Nodes auszuwählen.", + "tip15" : "Halten Sie [ctrl] gedrückt, wenn Sie auf einen Node klicken, um ihn aus der aktuellen Auswahl hinzuzufügen oder zu entfernen.", + "tip16" : "Indexzungen wechseln mit {{ core:show-previous-tab }} und {{ core:show-next-tab }}", + "tip17" : "Sie können die Änderungen im Editierrahmen des Nodes mit {{ core:confirm-edit-tray }} bestätigen oder sie mit {{ core:cancel-edit-tray }} abbrechen.", + "tip18" : "Durch Drücken von {{ core:edit-selected-node }} wird der erste Node in der aktuellen Auswahl bearbeitet." + } +} \ No newline at end of file diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/de/jsonata.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/de/jsonata.json new file mode 100644 index 0000000..7859ca8 --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/de/jsonata.json @@ -0,0 +1,222 @@ +{ + "$string" : { + "args" : "arg", + "desc" : "Transformiert den Parameter *arg* in eine Zeichenfolge mit den folgenden Transformationsregeln:\n\n -Zeichenfolgen bleiben unverändert\n -Funktionen werden in eine leere Zeichenfolge konvertiert\n -Numerische Unendlichkeit und NaN lösen einen Fehler aus, da sie nicht als JSON-Nummer dargestellt werden können.\n -Alle anderen Werte werden mit Hilfe der Funktion 'JSON.stringify' in eine JSON-Zeichenfolge konvertiert." + }, + "$length" : { + "args" : "str", + "desc" : "Gibt die Anzahl der Zeichen in der Zeichenfolge `str` zurück. Es wird ein Fehler ausgelöst, wenn `str` keine Zeichenfolge ist." + }, + "$substring" : { + "args" : "str, start [, länge]", + "desc" : "Gibt eine Zeichenfolge zurück, die die Zeichen im ersten Parameter `str` beginnend bei Position `start` (Null-Offset) enthält. Wenn \"length\" angegeben ist, enthält die Unterzeichenfolge maximal \"Länge\" Zeichen. Wenn `start` negativ ist, gibt es die Anzahl der Zeichen am Ende von `str` an." + }, + "$substringBefore" : { + "args" : "str, chars", + "desc" : "Gibt die Unterzeichenfolge vor dem ersten Auftreten der Zeichenfolge `chars` in `str` zurück. Falls `str` nicht `chars` enthält, gibt es `str` zurück." + }, + "$substringAfter" : { + "args" : "str, chars", + "desc" : "Gibt die Unterzeichenfolge nach dem ersten Auftreten der Zeichenfolge `chars` in `str` zurück. Falls `str` nicht `chars` enthält, gibt es `str` zurück." + }, + "$uppercase" : { + "args" : "str", + "desc" : "Gibt eine Zeichenfolge mit allen Zeichen von `str` zurück, die in Großbuchstaben konvertiert werden." + }, + "$lowercase" : { + "args" : "str", + "desc" : "Gibt eine Zeichenfolge mit allen Zeichen von `str` in Kleinbuchstaben zurück." + }, + "$trim" : { + "args" : "str", + "desc" : "Normalisiert und trimmt alle Leerzeichen in `str` durch Anwenden der folgenden Schritte:\n\n -Alle Tabulatorstopps, Wagenrückläufe und Zeilenvorschübe werden durch Leerzeichen ersetzt.\n-Zusammenhängende Folgen von Räumen werden auf einen einzigen Raum reduziert.\n-Trailing und führende Plätze werden entfernt.\n\n Wenn 'str' nicht angegeben ist (d. h. Diese Funktion wird ohne Argumente aufgerufen), dann wird der Kontextwert als Wert von `str` verwendet. Es wird ein Fehler ausgelöst, wenn `str` keine Zeichenfolge ist." + }, + "$contains" : { + "args" : "str, Muster", + "desc" : "Gibt `true` zurück, wenn `str` durch `Muster` abgeglichen wird, sonst gibt es `false` zurück. Wenn 'str' nicht angegeben ist (d. h. Diese Funktion wird mit einem Argument aufgerufen), dann wird der Kontextwert als Wert von `str` verwendet. Der Parameter 'Muster' kann entweder eine Zeichenfolge oder ein regulärer Ausdruck sein." + }, + "$split" : { + "args" : "str [, Trennzeichen] [, Grenzwert]", + "desc" : "Teilt den Parameter 'str' in einem Array mit Unterzeichenfolgen. Es ist ein Fehler, wenn `str` keine Zeichenfolge ist. Der optionale Parameter 'Trennzeichen' gibt die Zeichen in der `str` an, um die es entweder als Zeichenfolge oder als regulärer Ausdruck geteilt werden soll. Wenn 'Trennzeichen' nicht angegeben wird, wird die leere Zeichenfolge angenommen, und `str` wird in ein Array aus einzelnen Zeichen aufgeteilt. Es handelt sich um einen Fehler, wenn `Trennzeichen' keine Zeichenfolge ist. Der optionale Parameter 'Grenzwert' ist eine Zahl, die die maximale Anzahl von Unterzeichenfolgen angibt, die in das resultierende Array eingeschlossen werden sollen. Alle zusätzlichen Unterzeichenfolgen werden gelöscht. Wenn 'Grenzwert' nicht angegeben wird, wird ' str ` vollständig geteilt, wobei die Größe des resultierenden Arrays nicht begrenzt ist. Es handelt sich um einen Fehler, wenn `Grenzwert' keine nicht negative Zahl ist." + }, + "$join" : { + "args" : "array [, Trennzeichen]", + "desc" : "Verkettet ein Array von Komponentenzeichenfolgen in eine einzelne verkettete Zeichenfolge mit jeder Komponentenzeichenfolge, die durch den optionalen Parameter 'separator' getrennt ist. Es ist ein Fehler, wenn die Eingabe `Array` ein Element enthält, das keine Zeichenfolge ist. Wenn 'Trennzeichen' nicht angegeben wird, wird davon ausgegangen, dass es sich um eine leere Zeichenfolge handelt, d. h. Zwischen den Komponentenzeichenfolgen ist kein Trennzeichen vorhanden. Es handelt sich um einen Fehler, wenn `Trennzeichen' keine Zeichenfolge ist." + }, + "$match" : { + "args" : "str, Muster [, Grenzwert]", + "desc" : "Wendet die Zeichenfolge `str` an den regulären Ausdruck `Muster` an und gibt ein Array von Objekten zurück, wobei jedes Objekt Informationen zu jedem Vorkommen einer Übereinstimmung in `str` enthält." + }, + "$replace" : { + "args" : "str, Muster, Ersatz [, Grenzwert]", + "desc" : "Findet Vorkommen von `Muster` in `str` und ersetzt sie durch `Ersatz`.\n\nDer optionale Parameter 'Grenzwert' ist die maximale Anzahl an Ersetzungen." + }, + "$now" : { + "args" : "", + "desc" : "Generiert einen Zeitstempel im ISO-8601-kompatiblen Format und gibt sie als Zeichenfolge zurück." + }, + "$base64encode" : { + "args" : "Zeichenfolge", + "desc" : "Konvertiert eine ASCII-Zeichenfolge in eine Basis-64-Darstellung. Jedes Zeichen in der Zeichenfolge wird als Byte mit binären Daten behandelt. Dies setzt voraus, dass alle Zeichen in der Zeichenfolge im Bereich von 0x00 bis 0xFF liegen, der alle Zeichen in URI-codierten Zeichenfolgen enthält. Unicode-Zeichen außerhalb dieses Bereichs werden nicht unterstützt." + }, + "$base64decode" : { + "args" : "Zeichenfolge", + "desc" : "Konvertiert die Basis-64-codierten Byte in eine Zeichenfolge unter Verwendung einer UTF-8-Unicode-Codepage." + }, + "$number" : { + "args" : "arg", + "desc" : "Der Parameter 'arg' wird unter Verwendung der folgenden Regeln für das Casting in eine Zahl verwendet:\n\n -Zahlen bleiben unverändert\n -Zeichenfolgen, die eine Folge von Zeichen enthalten, die eine rechtliche JSON-Nummer darstellen, werden in diese Zahl konvertiert.\n -Alle anderen Werte bewirken, dass ein Fehler ausgelöst wird." + }, + "$abs" : { + "args" : "Anzahl", + "desc" : "Gibt den absoluten Wert des Parameters 'Zahl' zurück." + }, + "$floor" : { + "args" : "Anzahl", + "desc" : "Gibt den Wert von 'Zahl' auf die nächste ganze Zahl zurück, die kleiner oder gleich 'Zahl' ist." + }, + "$ceil" : { + "args" : "Anzahl", + "desc" : "Gibt den Wert von 'Zahl' auf die nächste ganze Zahl zurück, die größer oder gleich 'Zahl' ist." + }, + "$round" : { + "args" : "Zahl [, Genauigkeit]", + "desc" : "Gibt den Wert des Parameters `Zahl` zurück, der auf die Anzahl der Dezimalstellen gerundet wird, die durch den optionalen Parameter 'Genauigkeit' angegeben wird." + }, + "$power" : { + "args" : "Basis, Exponent", + "desc" : "Gibt den Wert von `Basis` potenziert mit `Exponent` zurück." + }, + "$sqrt" : { + "args" : "Zahl", + "desc" : "Gibt die Quadratwurzel des Werts des Parameters 'Zahl' zurück." + }, + "$random" : { + "args" : "", + "desc" : "Gibt eine Pseudozufallszahl größer-gleich null und kleiner als eins zurück." + }, + "$millis" : { + "args" : "", + "desc" : "Gibt die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) als Zahl zurück. Alle Invocationen von `$millis ()` innerhalb einer Auswertung eines Ausdrucks geben alle denselben Wert zurück." + }, + "$sum" : { + "args" : "Array", + "desc" : "Gibt die arithmetische Summe eines `Array` von Zahlen zurück. Es ist ein Fehler, wenn die Eingabe `Array` ein Element enthält, das keine Zahl ist." + }, + "$max" : { + "args" : "Array", + "desc" : "Gibt die maximale Anzahl in einem `Array` von Zahlen zurück. Es ist ein Fehler, wenn die Eingabe `Array` ein Element enthält, das keine Zahl ist." + }, + "$min" : { + "args" : "Array", + "desc" : "Gibt die minimale Zahl in einem `Array` von Zahlen zurück. Es ist ein Fehler, wenn die Eingabe `Array` ein Element enthält, das keine Zahl ist." + }, + "$average" : { + "args" : "Array", + "desc" : "Gibt den Mittelwert eines `Array` von Zahlen zurück. Es ist ein Fehler, wenn die Eingabe `Array` ein Element enthält, das keine Zahl ist." + }, + "$boolean" : { + "args" : "arg", + "desc" : "Castet das Argument mit den folgenden Regeln in einen Booleschen Wert:\n\n -` Boolean ': nicht geändert\n -` string `: leer: `false`\n -` string `: nicht leer: `true`\n -` Zahl `: ` 0 `: ` falsch `\n -` Zahl `: Nicht-Null: `true`\n -` null `: `false`\n -` array `: leer: `false`\n -` array `: enthält ein Mitglied, das auf `true` setzt: `true`\n -` array `: alle Member werden in `false` umgesetzt: `false`\n -` object `: empty: `false`\n -` object `: non-empty: `true`\n -` Funktion `: ` falsch `" + }, + "$not" : { + "args" : "arg", + "desc" : "Gibt den Booleschen Wert NOT für das Argument zurück. `arg` wird zuerst in einen Booleschen Wert umgesetzt." + }, + "$exists" : { + "args" : "arg", + "desc" : "Gibt den Booleschen Wert 'true' zurück, wenn der Ausdruck `arg` als Wert ausgewertet wird, oder 'false', wenn der Ausdruck nicht mit einem anderen Ausdruck übereinstimmt (z. B. ein Pfad zu einer nicht vorhandenen Feldreferenz)." + }, + "$count" : { + "args" : "Array", + "desc" : "Gibt die Anzahl der Elemente in dem Array zurück." + }, + "$append" : { + "args" : "Array, Array", + "desc" : "Hängen Sie zwei Arrays an." + }, + "$sort" : { + "args" : "array [, Funktion]", + "desc" : "Gibt ein Array zurück, das alle Werte im Parameter 'array' enthält, aber in der Reihenfolge sortiert wird.\n\nWenn ein Vergleichsoperator 'function' angegeben wird, muss es sich um eine Funktion handeln, die zwei Parameter benötigt:\n\n` Funktion (links, rechts) `\n\nDiese Funktion wird durch den Sortieralgorithmus aufgerufen, um zwei Werte links und rechts zu vergleichen. Wenn der Wert von links nach dem Wert von rechts in der gewünschten Sortierreihenfolge platziert werden soll, muss die Funktion den Booleschen Wert 'true' zurückgeben, um einen Auslagerungsspeicher anzuzeigen. Andernfalls muss 'false' zurückgegeben werden." + }, + "$reverse" : { + "args" : "Array", + "desc" : "Gibt ein Array zurück, das alle Werte aus dem Parameter 'array' enthält, aber in umgekehrter Reihenfolge." + }, + "$shuffle" : { + "args" : "Array", + "desc" : "Gibt ein Array zurück, das alle Werte aus dem Parameter ` array ` enthält, aber in zufälliger Reihenfolge geschattiert ist." + }, + "$zip" : { + "args" : "Array, ...", + "desc" : "Gibt ein konvolviertes (gezipptes) Array zurück, das gruppierte Arrays von Werten aus den Argumenten ` array1 ` ... ` arrayN ' aus Index 0, 1, 2 ... enthält." + }, + "$keys" : { + "args" : "Objekt", + "desc" : "Gibt ein Array zurück, das die Schlüssel in dem Objekt enthält. Wenn es sich bei dem Argument um ein Array von Objekten handelt, enthält das zurückgegebene Array eine deduplizierte Liste aller Schlüssel in allen Objekten." + }, + "$lookup" : { + "args" : "Objekt, Schlüssel", + "desc" : "Gibt den Wert zurück, der dem Schlüssel im Objekt zugeordnet ist. Wenn es sich bei dem ersten Argument um ein Array von Objekten handelt, werden alle Objekte im Array durchsucht, und die Werte, die mit allen Vorkommen des Schlüssels verknüpft sind, werden zurückgegeben." + }, + "$spread" : { + "args" : "Objekt", + "desc" : "Teilt ein Objekt, das Schlüssel/Wert-Paare enthält, in ein Array von Objekten, von denen jedes ein einzelnes Schlüssel/Wert-Paar aus dem Eingabeobjekt hat. Wenn es sich bei dem Parameter um ein Array von Objekten handelt, enthält die resultierende Feldgruppe ein Objekt für jedes Schlüssel/Wert-Paar in jedem Objekt in der angegebenen Feldgruppe." + }, + "$merge" : { + "args" : "array <object>", + "desc" : "Mischt ein Array von ` Objekten ` in ein einzelnes ` Objekt `, das alle Schlüssel/Wert-Paare aus jedem der Objekte in dem Eingabe-Array enthält. Wenn eines der Eingabeobjekte denselben Schlüssel enthält, enthält das zurückgegebene Objekt den Wert des letzten Objekts in der Feldgruppe. Es handelt sich um einen Fehler, wenn das Eingabe-Array ein Element enthält, das kein Objekt ist." + }, + "$sift" : { + "args" : "Objekt, Funktion", + "desc" : "Gibt ein Objekt zurück, das nur die Schlüssel/Wert-Paare aus dem Parameter 'object' enthält, die die Prädikat ` funktion ' erfüllen, die als zweiter Parameter übergeben wird.\n\nDie Funktion ` function `, die als zweiter Parameter angegeben wird, muss die folgende Signatur aufweisen:\n\n` function (value [, key [, object]]) `" + }, + "$each" : { + "args" : "Objekt, Funktion", + "desc" : "Gibt ein Array zurück, das die Werte enthält, die von der Funktion ` function ` zurückgegeben werden, wenn sie auf jedes Schlüssel/Wert-Paar im ` object ` angewendet werden." + }, + "$map" : { + "args" : "Array, Funktion", + "desc" : "Gibt ein Array zurück, das die Ergebnisse der Anwendung des Parameters ` function ` auf jeden Wert im Parameter 'array' enthält.\n\nDie Funktion ` function `, die als zweiter Parameter angegeben wird, muss die folgende Signatur aufweisen:\n\n` function (value [, index [, array]]) `" + }, + "$filter" : { + "args" : "Array, Funktion", + "desc" : "Gibt ein Array zurück, das nur die Werte im Parameter 'array' enthält, die das Prädikat ` funktion ` erfüllen.\n\nDie Funktion ` function `, die als zweiter Parameter angegeben wird, muss die folgende Signatur aufweisen:\n\n` function (value [, index [, array]]) `" + }, + "$reduce" : { + "args" : "array, function [, init]", + "desc" : "Gibt einen aggregierten Wert zurück, der aus der Anwendung des Parameters ` function 'nacheinander auf jeden Wert in' array ` in Kombination mit dem Ergebnis der vorherigen Anwendung der Funktion angewendet wurde.\n\nDie Funktion muss zwei Argumente akzeptieren und verhält sich wie ein Infix-Operator zwischen jedem Wert innerhalb des ` Array `.\n\nDer optionale Parameter 'init' wird als Anfangswert in der Aggregation verwendet." + }, + "$flowContext" : { + "args" : "Zeichenfolge [, Zeichenfolge]", + "desc" : "Ruft eine Flusskontexteigenschaft ab.\n\nDies ist eine definierte Funktion vom Typ \"Node-RED\"." + }, + "$globalContext" : { + "args" : "Zeichenfolge [, Zeichenfolge]", + "desc" : "Ruft eine globale Kontexteigenschaft ab.\n\nDies ist eine definierte Funktion vom Typ \"Node-RED\"." + }, + "$pad" : { + "args" : "string, width [, char]", + "desc" : "Gibt eine Kopie der ` Zeichenfolge ` mit zusätzlichen Aufenthalten zurück, falls erforderlich, so dass die Gesamtzahl der Zeichen mindestens der absolute Wert des Parameters 'width' ist.\n\nWenn ` width ` eine positive Zahl ist, wird die Zeichenfolge nach rechts aufgefüllt. Wenn sie negativ ist, wird sie nach links geplisften.\n\nDas optionale Argument 'char' gibt die Padding-Zeichen an, die verwendet werden sollen. Wenn keine Angabe gemacht wird, wird standardmäßig der Wert für das Leerzeichen angenommen." + }, + "$fromMillis" : { + "args" : "Anzahl", + "desc" : "Konvertieren Sie eine Zahl, die Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) enthält in eine Zeitangabe im ISO 8601-Format." + }, + "$formatNumber" : { + "args" : "Zahl, Bild [, Optionen]", + "desc" : "Transformiere die `Zahl` an eine Zeichenfolge und formatiert sie in eine dezimale Darstellung, wie in der 'Bild' -Zeichenfolge angegeben.\n\n Das Verhalten dieser Funktion ist mit der XPath/XQuery-Funktion fn:formatnummer konsistent, wie sie in der XPath F&O 3.1-Spezifikation definiert ist. Der Parameter für die Bildzeichenfolge definiert, wie die Zahl formatiert ist und hat die gleiche Syntax wie fn:format-number.\n\nDas optionale dritte Argument ` Optionen ` wird verwendet, um die standardmäßigen länderspezifischen Formatierungszeichen, wie z. B. das Dezimaltrennzeichen, zu überschreiben. Wenn dieses Argument angegeben wird, muss es sich um ein Objekt handeln, das Name/Wert-Paare enthält, die im Abschnitt mit dem Dezimalformat der XPath F&O 3.1-Spezifikation angegeben sind." + }, + "$formatBase" : { + "args" : "Zahl [, Radix]", + "desc" : "Transformiere die `Zahl` in eine Zeichenfolge und formatiert sie in eine ganze Zahl, die in der durch das `radix` -Argument angegebenen Zahlenbasis dargestellt wird. Wenn 'radix' nicht angegeben wird, wird standardmäßig die Basis 10 verwendet. 'radix` kann zwischen 2 und 36 liegen, andernfalls wird ein Fehler ausgelöst." + }, + "$toMillis" : { + "args" : "timestamp", + "desc" : "Konvertieren Sie eine Zeitangabe im ISO 8601-Format in die Anzahl der Millisekunden seit der Unix-Epoche (1. Januar 1970 (UTC)) als Zahl. Es wird ein Fehler ausgelöst, wenn die Zeichenfolge nicht das richtige Format hat." + }, + "$env" : { + "args" : "arg", + "desc" : "Gibt den Wert einer Umgebungsvariablen zurück.\n\nDies ist eine definierte Funktion vom Typ \"Node-RED\"." + } +} \ No newline at end of file diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json new file mode 100644 index 0000000..ed4d4f9 --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -0,0 +1,1015 @@ +{ + "common": { + "label": { + "name": "Name", + "ok": "Ok", + "done":"Done", + "cancel": "Cancel", + "delete": "Delete", + "close": "Close", + "load": "Load", + "save": "Save", + "import": "Import", + "export": "Export", + "back": "Back", + "next": "Next", + "clone": "Clone project", + "cont": "Continue" + }, + "type": { + "string": "string", + "number": "number", + "boolean": "boolean", + "array": "array", + "buffer": "buffer", + "object": "object", + "jsonString": "JSON string", + "undefined": "undefined", + "null": "null" + } + }, + "workspace": { + "defaultName": "Flow __number__", + "editFlow": "Edit flow: __name__", + "confirmDelete": "Confirm delete", + "delete": "Are you sure you want to delete '__label__'?", + "dropFlowHere": "Drop the flow here", + "addFlow": "Add Flow", + "listFlows": "List Flows", + "status": "Status", + "enabled": "Enabled", + "disabled":"Disabled", + "info": "Description", + "selectNodes": "Click nodes to select" + }, + "menu": { + "label": { + "view": { + "view": "View", + "grid": "Grid", + "showGrid": "Show grid", + "snapGrid": "Snap to grid", + "gridSize": "Grid size", + "textDir": "Text Direction", + "defaultDir": "Default", + "ltr": "Left-to-right", + "rtl": "Right-to-left", + "auto": "Contextual", + "language": "Language", + "browserDefault": "Browser default" + }, + "sidebar": { + "show": "Show sidebar" + }, + "palette": { + "show": "Show palette" + }, + "settings": "Settings", + "userSettings": "User Settings", + "nodes": "Nodes", + "displayStatus": "Show node status", + "displayConfig": "Configuration nodes", + "import": "Import", + "export": "Export", + "search": "Search flows", + "searchInput": "search your flows", + "subflows": "Subflows", + "createSubflow": "Create Subflow", + "selectionToSubflow": "Selection to Subflow", + "flows": "Flows", + "add": "Add", + "rename": "Rename", + "delete": "Delete", + "keyboardShortcuts": "Keyboard shortcuts", + "login": "Login", + "logout": "Logout", + "editPalette":"Manage palette", + "other": "Other", + "showTips": "Show tips", + "help": "Node-RED website", + "projects": "Projects", + "projects-new": "New", + "projects-open": "Open", + "projects-settings": "Project Settings", + "showNodeLabelDefault": "Show label of newly added nodes" + } + }, + "actions": { + "toggle-navigator": "Toggle navigator", + "zoom-out": "Zoom out", + "zoom-reset": "Reset zoom", + "zoom-in": "Zoom in" + }, + "user": { + "loggedInAs": "Logged in as __name__", + "username": "Username", + "password": "Password", + "login": "Login", + "loginFailed": "Login failed", + "notAuthorized": "Not authorized", + "errors": { + "settings": "You must be logged in to access settings", + "deploy": "You must be logged in to deploy changes", + "notAuthorized": "You must be logged in to perform this action" + } + }, + "notification": { + "warning": "Warning: __message__", + "warnings": { + "undeployedChanges": "node has undeployed changes", + "nodeActionDisabled": "node actions disabled", + "nodeActionDisabledSubflow": "node actions disabled within subflow", + "missing-types": "Flows stopped due to missing node types.
", + "safe-mode":"Flows stopped in safe mode.
You can modify your flows and deploy the changes to restart.
", + "restartRequired": "Node-RED must be restarted to enable upgraded modules", + "credentials_load_failed": "Flows stopped as the credentials could not be decrypted.
The flow credential file is encrypted, but the project's encryption key is missing or invalid.
", + "credentials_load_failed_reset":"Credentials could not be decrypted
The flow credential file is encrypted, but the project's encryption key is missing or invalid.
The flow credential file will be reset on the next deployment. Any existing flow credentials will be cleared.
", + "missing_flow_file": "Project flow file not found.
The project is not configured with a flow file.
", + "missing_package_file": "Project package file not found.
The project is missing a package.json file.
", + "project_empty": "The project is empty.
Do you want to create a default set of project files?
Otherwise, you will have to manually add files to the project outside of the editor.
Project '__project__' not found.
", + "git_merge_conflict": "Automatic merging of changes failed.
Fix the unmerged conflicts then commit the results.
" + }, + "error": "Error: __message__", + "errors": { + "lostConnection": "Lost connection to server, reconnecting...", + "lostConnectionReconnect": "Lost connection to server, reconnecting in __time__s.", + "lostConnectionTry": "Try now", + "cannotAddSubflowToItself": "Cannot add subflow to itself", + "cannotAddCircularReference": "Cannot add subflow - circular reference detected", + "unsupportedVersion": "Using an unsupported version of Node.js
You should upgrade to the latest Node.js LTS release
", + "failedToAppendNode": "Failed to load '__module__'
__error__
" + }, + "project": { + "change-branch": "Change to local branch '__project__'", + "merge-abort": "Git merge aborted", + "loaded": "Project '__project__' loaded", + "updated": "Project '__project__' updated", + "pull": "Project '__project__' reloaded", + "revert": "Project '__project__' reverted", + "merge-complete": "Git merge completed", + "setupCredentials": "Setup credentials", + "setupProjectFiles": "Setup project files", + "no": "No thanks", + "createDefault": "Create default project files", + "mergeConflict": "Show merge conflicts" + }, + "label": { + "manage-project-dep": "Manage project dependencies", + "setup-cred": "Setup credentials", + "setup-project": "Setup project files", + "create-default-package": "Create default package file", + "no-thanks": "No thanks", + "create-default-project": "Create default project files", + "show-merge-conflicts": "Show merge conflicts" + } + }, + "clipboard": { + "clipboard": "Clipboard", + "nodes": "Nodes", + "node": "__count__ node", + "node_plural": "__count__ nodes", + "configNode": "__count__ configuration node", + "configNode_plural": "__count__ configuration nodes", + "flow": "__count__ flow", + "flow_plural": "__count__ flows", + "subflow": "__count__ subflow", + "subflow_plural": "__count__ subflows", + "pasteNodes": "Paste flow json or", + "selectFile": "select a file to import", + "importNodes": "Import nodes", + "exportNodes": "Export nodes", + "download": "Download", + "importUnrecognised": "Imported unrecognised type:", + "importUnrecognised_plural": "Imported unrecognised types:", + "nodesExported": "Nodes exported to clipboard", + "nodesImported": "Imported:", + "nodeCopied": "__count__ node copied", + "nodeCopied_plural": "__count__ nodes copied", + "invalidFlow": "Invalid flow: __message__", + "export": { + "selected":"selected nodes", + "current":"current flow", + "all":"all flows", + "compact":"compact", + "formatted":"formatted", + "copy": "Copy to clipboard", + "export": "Export to library", + "exportAs": "Export as", + "overwrite": "Replace", + "exists": "\"__file__\" already exists.
Do you want to replace it?
" + }, + "import": { + "import": "Import to", + "newFlow": "new flow", + "errors": { + "notArray": "Input not a JSON Array", + "itemNotObject": "Input not a valid flow - item __index__ not a node object", + "missingId": "Input not a valid flow - item __index__ missing 'id' property", + "missingType": "Input not a valid flow - item __index__ missing 'type' property" + } + }, + "copyMessagePath": "Path copied", + "copyMessageValue": "Value copied", + "copyMessageValue_truncated": "Truncated value copied" + }, + "deploy": { + "deploy": "Deploy", + "full": "Full", + "fullDesc": "Deploys everything in the workspace", + "modifiedFlows": "Modified Flows", + "modifiedFlowsDesc": "Only deploys flows that contain changed nodes", + "modifiedNodes": "Modified Nodes", + "modifiedNodesDesc": "Only deploys nodes that have changed", + "restartFlows": "Restart Flows", + "restartFlowsDesc": "Restarts the current deployed flows", + "successfulDeploy": "Successfully deployed", + "successfulRestart": "Successfully restarted flows", + "deployFailed": "Deploy failed: __message__", + "unusedConfigNodes":"You have some unused configuration nodes.", + "unusedConfigNodesLink":"Click here to see them", + "errors": { + "noResponse": "no response from server" + }, + "confirm": { + "button": { + "ignore": "Ignore", + "confirm": "Confirm deploy", + "review": "Review changes", + "cancel": "Cancel", + "merge": "Merge", + "overwrite": "Ignore & deploy" + }, + "undeployedChanges": "You have undeployed changes.\n\nLeaving this page will lose these changes.", + "improperlyConfigured": "The workspace contains some nodes that are not properly configured:", + "unknown": "The workspace contains some unknown node types:", + "confirm": "Are you sure you want to deploy?", + "doNotWarn": "do not warn about this again", + "conflict": "The server is running a more recent set of flows.", + "backgroundUpdate": "The flows on the server have been updated.", + "conflictChecking": "Checking to see if the changes can be merged automatically", + "conflictAutoMerge": "The changes include no conflicts and can be merged automatically.", + "conflictManualMerge": "The changes include conflicts that must be resolved before they can be deployed.", + "plusNMore": "+ __count__ more" + } + }, + "eventLog": { + "title": "Event log", + "view": "View log" + }, + "diff": { + "unresolvedCount": "__count__ unresolved conflict", + "unresolvedCount_plural": "__count__ unresolved conflicts", + "globalNodes": "Global nodes", + "flowProperties": "Flow Properties", + "type": { + "added": "added", + "changed": "changed", + "unchanged": "unchanged", + "deleted": "deleted", + "flowDeleted": "flow deleted", + "flowAdded": "flow added", + "movedTo": "moved to __id__", + "movedFrom": "moved from __id__" + }, + "nodeCount": "__count__ node", + "nodeCount_plural": "__count__ nodes", + "local":"Local changes", + "remote":"Remote changes", + "reviewChanges": "Review Changes", + "noBinaryFileShowed": "Cannot show binary file contents", + "viewCommitDiff": "View Commit Changes", + "compareChanges": "Compare Changes", + "saveConflict": "Save conflict resolution", + "conflictHeader": "__resolved__ of __unresolved__ conflicts resolved", + "commonVersionError": "Common Version doesn't contain valid JSON:", + "oldVersionError": "Old Version doesn't contain valid JSON:", + "newVersionError": "New Version doesn't contain valid JSON:" + }, + "subflow": { + "editSubflowInstance": "Edit subflow instance: __name__", + "editSubflow": "Edit subflow template: __name__", + "edit": "Edit subflow template", + "subflowInstances": "There is __count__ instance of this subflow template", + "subflowInstances_plural": "There are __count__ instances of this subflow template", + "editSubflowProperties": "edit properties", + "input": "inputs:", + "output": "outputs:", + "status": "status node", + "deleteSubflow": "delete subflow", + "info": "Description", + "category": "Category", + "env": { + "restore": "Restore to subflow default", + "remove": "Remove environment variable" + }, + "errors": { + "noNodesSelected": "Cannot create subflow: no nodes selected", + "multipleInputsToSelection": "Cannot create subflow: multiple inputs to selection" + } + }, + "editor": { + "configEdit": "Edit", + "configAdd": "Add", + "configUpdate": "Update", + "configDelete": "Delete", + "nodesUse": "__count__ node uses this config", + "nodesUse_plural": "__count__ nodes use this config", + "addNewConfig": "Add new __type__ config node", + "editNode": "Edit __type__ node", + "editConfig": "Edit __type__ config node", + "addNewType": "Add new __type__...", + "nodeProperties": "node properties", + "label": "Label", + "color": "Color", + "portLabels": "Port labels", + "labelInputs": "Inputs", + "labelOutputs": "Outputs", + "settingIcon": "Icon", + "default": "default", + "noDefaultLabel": "none", + "defaultLabel": "use default label", + "searchIcons": "Search icons", + "useDefault": "use default", + "description": "Description", + "show": "Show", + "hide": "Hide", + "locale": "Select UI Language", + "icon": "Icon", + "inputType": "Input type", + "inputs" : { + "input": "input", + "select": "select", + "checkbox": "checkbox", + "spinner": "spinner", + "none": "none", + "hidden": "hide property" + }, + "types": { + "str": "string", + "num": "number", + "bool": "bool", + "json": "JSON", + "bin": "buffer", + "env": "env variable" + }, + "menu": { + "input": "input", + "select": "select", + "checkbox": "checkbox", + "spinner": "spinner", + "hidden": "label only" + }, + "select": { + "label": "Label", + "value": "Value" + }, + "spinner": { + "min": "Minimum", + "max": "Maximum" + }, + "errors": { + "scopeChange": "Changing the scope will make it unavailable to nodes in other flows that use it", + "invalidProperties": "Invalid properties:" + } + }, + "keyboard": { + "title": "Keyboard Shortcuts", + "keyboard": "Keyboard", + "filterActions": "filter actions", + "shortcut": "shortcut", + "scope": "scope", + "unassigned": "Unassigned", + "global": "global", + "workspace": "workspace", + "selectAll": "Select all nodes", + "selectAllConnected": "Select all connected nodes", + "addRemoveNode": "Add/remove node from selection", + "editSelected": "Edit selected node", + "deleteSelected": "Delete selected nodes or link", + "importNode": "Import nodes", + "exportNode": "Export nodes", + "nudgeNode": "Move selected nodes (1px)", + "moveNode": "Move selected nodes (20px)", + "toggleSidebar": "Toggle sidebar", + "togglePalette": "Toggle palette", + "copyNode": "Copy selected nodes", + "cutNode": "Cut selected nodes", + "pasteNode": "Paste nodes", + "undoChange": "Undo the last change performed", + "searchBox": "Open search box", + "managePalette": "Manage palette", + "actionList":"Action list" + }, + "library": { + "library": "Library", + "openLibrary": "Open Library...", + "saveToLibrary": "Save to Library...", + "typeLibrary": "__type__ library", + "unnamedType": "Unnamed __type__", + "exportedToLibrary": "Nodes exported to library", + "dialogSaveOverwrite": "A __libraryType__ called __libraryName__ already exists. Overwrite?", + "invalidFilename": "Invalid filename", + "savedNodes": "Saved nodes", + "savedType": "Saved __type__", + "saveFailed": "Save failed: __message__", + "newFolder": "New folder", + "types": { + "local": "Local", + "examples": "Examples" + } + }, + "palette": { + "noInfo": "no information available", + "filter": "filter nodes", + "search": "search modules", + "addCategory": "Add new...", + "label": { + "subflows": "subflows", + "network": "network", + "common": "common", + "input": "input", + "output": "output", + "function": "function", + "sequence": "sequence", + "parser": "parser", + "social": "social", + "storage": "storage", + "analysis": "analysis", + "advanced": "advanced" + }, + "actions": { + "collapse-all": "Collapse all categories", + "expand-all": "Expand all categories" + }, + "event": { + "nodeAdded": "Node added to palette:", + "nodeAdded_plural": "Nodes added to palette:", + "nodeRemoved": "Node removed from palette:", + "nodeRemoved_plural": "Nodes removed from palette:", + "nodeEnabled": "Node enabled:", + "nodeEnabled_plural": "Nodes enabled:", + "nodeDisabled": "Node disabled:", + "nodeDisabled_plural": "Nodes disabled:", + "nodeUpgraded": "Node module __module__ upgraded to version __version__" + }, + "editor": { + "title": "Manage palette", + "palette": "Palette", + "times": { + "seconds": "seconds ago", + "minutes": "minutes ago", + "minutesV": "__count__ minutes ago", + "hoursV": "__count__ hour ago", + "hoursV_plural": "__count__ hours ago", + "daysV": "__count__ day ago", + "daysV_plural": "__count__ days ago", + "weeksV": "__count__ week ago", + "weeksV_plural": "__count__ weeks ago", + "monthsV": "__count__ month ago", + "monthsV_plural": "__count__ months ago", + "yearsV": "__count__ year ago", + "yearsV_plural": "__count__ years ago", + "yearMonthsV": "__y__ year, __count__ month ago", + "yearMonthsV_plural": "__y__ year, __count__ months ago", + "yearsMonthsV": "__y__ years, __count__ month ago", + "yearsMonthsV_plural": "__y__ years, __count__ months ago" + }, + "nodeCount": "__label__ node", + "nodeCount_plural": "__label__ nodes", + "moduleCount": "__count__ module available", + "moduleCount_plural": "__count__ modules available", + "inuse": "in use", + "enableall": "enable all", + "disableall": "disable all", + "enable": "enable", + "disable": "disable", + "remove": "remove", + "update": "update to __version__", + "updated": "updated", + "install": "install", + "installed": "installed", + "conflict": "conflict", + "conflictTip": "This module cannot be installed as it includes a
node type that has already been installed
Conflicts with __module__
Failed to load node catalogue.
Check the browser console for more information
", + "installFailed": "Failed to install: __module__
__message__
Check the log for more information
", + "removeFailed": "Failed to remove: __module__
__message__
Check the log for more information
", + "updateFailed": "Failed to update: __module__
__message__
Check the log for more information
", + "enableFailed": "Failed to enable: __module__
__message__
Check the log for more information
", + "disableFailed": "Failed to disable: __module__
__message__
Check the log for more information
" + }, + "confirm": { + "install": { + "body":"Installing '__module__'
Before installing, please read the node's documentation. Some nodes have dependencies that cannot be automatically resolved and can require a restart of Node-RED.
", + "title": "Install nodes" + }, + "remove": { + "body":"Removing '__module__'
Removing the node will uninstall it from Node-RED. The node may continue to use resources until Node-RED is restarted.
", + "title": "Remove nodes" + }, + "update": { + "body":"Updating '__module__'
Updating the node will require a restart of Node-RED to complete the update. This must be done manually.
", + "title": "Update nodes" + }, + "cannotUpdate": { + "body":"An update for this node is available, but it is not installed in a location that the palette manager can update.Unable to pull remote changes; your unstaged local changes would be overwritten.
Commit your changes and try again.
", + "showUnstagedChanges": "Show unstaged changes", + "connectionFailed": "Could not connect to remote repository: ", + "pullUnrelatedHistory": "The remote has an unrelated history of commits.
Are you sure you want to pull the changes into your local repository?
", + "pullChanges": "Pull changes", + "history": "history", + "projectHistory": "Project History", + "daysAgo": "__count__ day ago", + "daysAgo_plural": "__count__ days ago", + "hoursAgo": "__count__ hour ago", + "hoursAgo_plural": "__count__ hours ago", + "minsAgo": "__count__ min ago", + "minsAgo_plural": "__count__ mins ago", + "secondsAgo": "Seconds ago", + "notTracking": "Your local branch is not currently tracking a remote branch.", + "statusUnmergedChanged": "Your repository has unmerged changes. You need to fix the conflicts and commit the result.", + "repositoryUpToDate": "Your repository is up to date.", + "commitsAhead": "Your repository is __count__ commit ahead of the remote. You can push this commit now.", + "commitsAhead_plural": "Your repository is __count__ commits ahead of the remote. You can push these commits now.", + "commitsBehind": "Your repository is __count__ commit behind of the remote. You can pull this commit now.", + "commitsBehind_plural": "Your repository is __count__ commits behind of the remote. You can pull these commits now.", + "commitsAheadAndBehind1": "Your repository is __count__ commit behind and ", + "commitsAheadAndBehind1_plural": "Your repository is __count__ commits behind and ", + "commitsAheadAndBehind2": "__count__ commit ahead of the remote. ", + "commitsAheadAndBehind2_plural": "__count__ commits ahead of the remote. ", + "commitsAheadAndBehind3": "You must pull the remote commit down before pushing.", + "commitsAheadAndBehind3_plural": "You must pull the remote commits down before pushing.", + "refreshCommitHistory": "Refresh commit history", + "refreshChanges": "Refresh changes" + } + } + }, + "typedInput": { + "type": { + "str": "string", + "num": "number", + "re": "regular expression", + "bool": "boolean", + "json": "JSON", + "bin": "buffer", + "date": "timestamp", + "jsonata": "expression", + "env": "env variable" + } + }, + "editableList": { + "add": "add" + }, + "search": { + "empty": "No matches found", + "addNode": "add a node..." + }, + "expressionEditor": { + "functions": "Functions", + "functionReference": "Function reference", + "insert": "Insert", + "title": "JSONata Expression editor", + "test": "Test", + "data": "Example message", + "result": "Result", + "format": "format expression", + "compatMode": "Compatibility mode enabled", + "compatModeDesc": " The current expression appears to still reference msg
so will be evaluated in compatibility mode. Please update the expression to not use msg
as this mode will be removed in the future.
When JSONata support was first added to Node-RED, it required the expression to reference the msg
object. For example msg.payload
would be used to access the payload.
That is no longer necessary as the expression will be evaluated against the message directly. To access the payload, the expression should be just payload
.
The Buffer type is stored as a JSON array of byte values. The editor will attempt to parse the entered value as a JSON array. If it is not valid JSON, it will be treated as a UTF-8 String and converted to an array of the individual character code points.
For example, a value of Hello World
will be converted to the JSON array:
[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]" + }, + "projects": { + "config-git": "Configure Git client", + "welcome": { + "hello": "Hello! We have introduced 'projects' to Node-RED.", + "desc0": "This is a new way for you to manage your flow files and includes version control of your flows.", + "desc1": "To get started you can create your first project or clone an existing project from a git repository.", + "desc2": "If you are not sure, you can skip this for now. You will still be able to create your first project from the 'Projects' menu at any time.", + "create": "Create Project", + "clone": "Clone Repository", + "openExistingProject": "Open existing project", + "not-right-now": "Not right now" + }, + "git-config": { + "setup": "Setup your version control client", + "desc0": "Node-RED uses the open source tool Git for version control. It tracks changes to your project files and lets you push them to remote repositories.", + "desc1": "When you commit a set of changes, Git records who made the changes with a username and email address. The Username can be anything you want - it does not need to be your real name.", + "desc2": "Your Git client is already configured with the details below.", + "desc3": "You can change these settings later under the 'Git config' tab of the settings dialog.", + "username": "Username", + "email": "Email" + }, + "project-details": { + "create": "Create your project", + "desc0": "A project is maintained as a Git repository. It makes it much easier to share your flows with others and to collaborate on them.", + "desc1": "You can create multiple projects and quickly switch between them from the editor.", + "desc2": "To begin, your project needs a name and an optional description.", + "already-exists": "Project already exists", + "must-contain": "Must contain only A-Z 0-9 _ -", + "project-name": "Project name", + "desc": "Description", + "opt": "Optional" + }, + "clone-project": { + "clone": "Clone a project", + "desc0": "If you already have a git repository containing a project, you can clone it to get started.", + "already-exists": "Project already exists", + "must-contain": "Must contain only A-Z 0-9 _ -", + "project-name": "Project name", + "no-info-in-url": "Do not include the username/password in the url", + "git-url": "Git repository URL", + "protocols": "https://, ssh:// or file://", + "auth-failed": "Authentication failed", + "username": "Username", + "passwd": "Password", + "ssh-key": "SSH Key", + "passphrase": "Passphrase", + "ssh-key-desc": "Before you can clone a repository over ssh you must add an SSH key to access it.", + "ssh-key-add": "Add an ssh key", + "credential-key": "Credentials encryption key", + "cant-get-ssh-key": "Error! Can't get selected SSH key path.", + "already-exists2": "already exists", + "git-error": "git error", + "connection-failed": "Connection failed", + "not-git-repo": "Not a git repository", + "repo-not-found": "Repository not found" + }, + "default-files": { + "create": "Create your project files", + "desc0": "A project contains your flow files, a README file and a package.json file.", + "desc1": "It can contain any other files you want to maintain in the Git repository.", + "desc2": "Your existing flow and credential files will be copied into the project.", + "flow-file": "Flow file", + "credentials-file": "Credentials file" + }, + "encryption-config": { + "setup": "Setup encryption of your credentials file", + "desc0": "Your flow credentials file can be encrypted to keep its contents secure.", + "desc1": "If you want to store these credentials in a public Git repository, you must encrypt them by providing a secret key phrase.", + "desc2": "Your flow credentials file is not currently encrypted.", + "desc3": "That means its contents, such as passwords and access tokens, can be read by anyone with access to the file.", + "desc4": "If you want to store these credentials in a public Git repository, you must encrypt them by providing a secret key phrase.", + "desc5": "Your flow credentials file is currently encrypted using the credentialSecret property from your settings file as the key.", + "desc6": "Your flow credentials file is currently encrypted using a system-generated key. You should provide a new secret key for this project.", + "desc7": "The key will be stored separately from your project files. You will need to provide the key to use this project in another instance of Node-RED.", + "credentials": "Credentials", + "enable": "Enable encryption", + "disable": "Disable encryption", + "disabled": "disabled", + "copy": "Copy over existing key", + "use-custom": "Use custom key", + "desc8": "The credentials file will not be encrypted and its contents easily read", + "create-project-files": "Create project files", + "create-project": "Create project", + "already-exists": "already exists", + "git-error": "git error", + "git-auth-error": "git auth error" + }, + "create-success": { + "success": "You have successfully created your first project!", + "desc0": "You can now continue to use Node-RED just as you always have.", + "desc1": "The 'info' tab in the sidebar shows you what your current active project is. The button next to the name can be used to access the project settings view.", + "desc2": "The 'history' tab in the sidebar can be used to view files that have changed in your project and to commit them. It shows you a complete history of your commits and allows you to push your changes to a remote repository." + }, + "create": { + "projects": "Projects", + "already-exists": "Project already exists", + "must-contain": "Must contain only A-Z 0-9 _ -", + "no-info-in-url": "Do not include the username/password in the url", + "open": "Open Project", + "create": "Create Project", + "clone": "Clone Repository", + "project-name": "Project name", + "desc": "Description", + "opt": "Optional", + "flow-file": "Flow file", + "credentials": "Credentials", + "enable-encryption": "Enable encryption", + "disable-encryption": "Disable encryption", + "encryption-key": "Encryption key", + "desc0": "A phrase to secure your credentials with", + "desc1": "The credentials file will not be encrypted and its contents easily read", + "git-url": "Git repository URL", + "protocols": "https://, ssh:// or file://", + "auth-failed": "Authentication failed", + "username": "Username", + "password": "Password", + "ssh-key": "SSH Key", + "passphrase": "Passphrase", + "desc2": "Before you can clone a repository over ssh you must add an SSH key to access it.", + "add-ssh-key": "Add an ssh key", + "credentials-encryption-key": "Credentials encryption key", + "already-exists-2": "already exists", + "git-error": "git error", + "con-failed": "Connection failed", + "not-git": "Not a git repository", + "no-resource": "Repository not found", + "cant-get-ssh-key-path": "Error! Can't get selected SSH key path.", + "unexpected_error": "unexpected_error" + }, + "delete": { + "confirm": "Are you sure you want to delete this project?" + }, + "create-project-list": { + "search": "search your projects", + "current": "current" + }, + "require-clean": { + "confirm": "
You have undeployed changes that will be lost.
Do you want to continue?
" + }, + "send-req": { + "auth-req": "Authentication required for repository", + "username": "Username", + "password": "Password", + "passphrase": "Passphrase", + "retry": "Retry", + "update-failed": "Failed to update auth", + "unhandled": "Unhandled error response", + "host-key-verify-failed": "Host key verification failed.
The repository host key could not be verified. Please update your known_hosts
file and try again."
+ },
+ "create-branch-list": {
+ "invalid": "Invalid branch",
+ "create": "Create branch",
+ "current": "current"
+ },
+ "create-default-file-set": {
+ "no-active": "Cannot create default file set without an active project",
+ "no-empty": "Cannot create default file set on a non-empty project",
+ "git-error": "git error"
+ },
+ "errors" : {
+ "no-username-email": "Your Git client is not configured with a username/email.",
+ "unexpected": "An unexpected error occurred",
+ "code": "code"
+ }
+ },
+ "editor-tab": {
+ "properties": "Properties",
+ "envProperties": "Environment Variables",
+ "description": "Description",
+ "appearance": "Appearance",
+ "preview": "UI Preview",
+ "defaultValue": "Default value"
+ },
+ "languages" : {
+ "de": "German",
+ "en-US": "English",
+ "ja": "Japanese",
+ "ko": "Korean",
+ "zh-CN": "Chinese(Simplified)",
+ "zh-TW": "Chinese(Traditional)"
+ }
+}
diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/en-US/infotips.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/en-US/infotips.json
new file mode 100644
index 0000000..21a7e73
--- /dev/null
+++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/en-US/infotips.json
@@ -0,0 +1,23 @@
+{
+ "info": {
+ "tip0" : "You can remove the selected nodes or links with {{core:delete-selection}}",
+ "tip1" : "Search for nodes using {{core:search}}",
+ "tip2" : "{{core:toggle-sidebar}} will toggle the view of this sidebar",
+ "tip3" : "You can manage your palette of nodes with {{core:manage-palette}}",
+ "tip4" : "Your flow configuration nodes are listed in the sidebar panel. It can be accessed from the menu or with {{core:show-config-tab}}",
+ "tip5" : "Enable or disable these tips from the option in the settings",
+ "tip6" : "Move the selected nodes using the [left] [up] [down] and [right] keys. Hold [shift] to nudge them further",
+ "tip7" : "Dragging a node onto a wire will splice it into the link",
+ "tip8" : "Export the selected nodes, or the current tab with {{core:show-export-dialog}}",
+ "tip9" : "Import a flow by dragging its JSON into the editor, or with {{core:show-import-dialog}}",
+ "tip10" : "[shift] [click] and drag on a node port to move all of the attached wires or just the selected one",
+ "tip11" : "Show the Info tab with {{core:show-info-tab}} or the Debug tab with {{core:show-debug-tab}}",
+ "tip12" : "[ctrl] [click] in the workspace to open the quick-add dialog",
+ "tip13" : "Hold down [ctrl] when you [click] on a node port to enable quick-wiring",
+ "tip14" : "Hold down [shift] when you [click] on a node to also select all of its connected nodes",
+ "tip15" : "Hold down [ctrl] when you [click] on a node to add or remove it from the current selection",
+ "tip16" : "Switch flow tabs with {{core:show-previous-tab}} and {{core:show-next-tab}}",
+ "tip17" : "You can confirm your changes in the node edit tray with {{core:confirm-edit-tray}} or cancel them with {{core:cancel-edit-tray}}",
+ "tip18" : "Pressing {{core:edit-selected-node}} will edit the first node in the current selection"
+ }
+}
diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json
new file mode 100644
index 0000000..d777d19
--- /dev/null
+++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json
@@ -0,0 +1,270 @@
+{
+ "$string": {
+ "args": "arg[, prettify]",
+ "desc": "Casts the `arg` parameter to a string using the following casting rules:\n\n - Strings are unchanged\n - Functions are converted to an empty string\n - Numeric infinity and NaN throw an error because they cannot be represented as a JSON number\n - All other values are converted to a JSON string using the `JSON.stringify` function. If `prettify` is true, then \"prettified\" JSON is produced. i.e One line per field and lines will be indented based on the field depth."
+ },
+ "$length": {
+ "args": "str",
+ "desc": "Returns the number of characters in the string `str`. An error is thrown if `str` is not a string."
+ },
+ "$substring": {
+ "args": "str, start[, length]",
+ "desc": "Returns a string containing the characters in the first parameter `str` starting at position `start` (zero-offset). If `length` is specified, then the substring will contain maximum `length` characters. If `start` is negative then it indicates the number of characters from the end of `str`."
+ },
+ "$substringBefore": {
+ "args": "str, chars",
+ "desc": "Returns the substring before the first occurrence of the character sequence `chars` in `str`. If `str` does not contain `chars`, then it returns `str`."
+ },
+ "$substringAfter": {
+ "args": "str, chars",
+ "desc": "Returns the substring after the first occurrence of the character sequence `chars` in `str`. If `str` does not contain `chars`, then it returns `str`."
+ },
+ "$uppercase": {
+ "args": "str",
+ "desc": "Returns a string with all the characters of `str` converted to uppercase."
+ },
+ "$lowercase": {
+ "args": "str",
+ "desc": "Returns a string with all the characters of `str` converted to lowercase."
+ },
+ "$trim": {
+ "args": "str",
+ "desc": "Normalizes and trims all whitespace characters in `str` by applying the following steps:\n\n - All tabs, carriage returns, and line feeds are replaced with spaces.\n- Contiguous sequences of spaces are reduced to a single space.\n- Trailing and leading spaces are removed.\n\n If `str` is not specified (i.e. this function is invoked with no arguments), then the context value is used as the value of `str`. An error is thrown if `str` is not a string."
+ },
+ "$contains": {
+ "args": "str, pattern",
+ "desc": "Returns `true` if `str` is matched by `pattern`, otherwise it returns `false`. If `str` is not specified (i.e. this function is invoked with one argument), then the context value is used as the value of `str`. The `pattern` parameter can either be a string or a regular expression."
+ },
+ "$split": {
+ "args": "str[, separator][, limit]",
+ "desc": "Splits the `str` parameter into an array of substrings. It is an error if `str` is not a string. The optional `separator` parameter specifies the characters within the `str` about which it should be split as either a string or regular expression. If `separator` is not specified, then the empty string is assumed, and `str` will be split into an array of single characters. It is an error if `separator` is not a string. The optional `limit` parameter is a number that specifies the maximum number of substrings to include in the resultant array. Any additional substrings are discarded. If `limit` is not specified, then `str` is fully split with no limit to the size of the resultant array. It is an error if `limit` is not a non-negative number."
+ },
+ "$join": {
+ "args": "array[, separator]",
+ "desc": "Joins an array of component strings into a single concatenated string with each component string separated by the optional `separator` parameter. It is an error if the input `array` contains an item which isn't a string. If `separator` is not specified, then it is assumed to be the empty string, i.e. no `separator` between the component strings. It is an error if `separator` is not a string."
+ },
+ "$match": {
+ "args": "str, pattern [, limit]",
+ "desc": "Applies the `str` string to the `pattern` regular expression and returns an array of objects, with each object containing information about each occurrence of a match within `str`."
+ },
+ "$replace": {
+ "args": "str, pattern, replacement [, limit]",
+ "desc": "Finds occurrences of `pattern` within `str` and replaces them with `replacement`.\n\nThe optional `limit` parameter is the maximum number of replacements."
+ },
+ "$now": {
+ "args":"",
+ "desc":"Generates a timestamp in ISO 8601 compatible format and returns it as a string."
+ },
+ "$base64encode": {
+ "args":"string",
+ "desc":"Converts an ASCII string to a base 64 representation. Each character in the string is treated as a byte of binary data. This requires that all characters in the string are in the 0x00 to 0xFF range, which includes all characters in URI encoded strings. Unicode characters outside of that range are not supported."
+ },
+ "$base64decode": {
+ "args":"string",
+ "desc":"Converts base 64 encoded bytes to a string, using a UTF-8 Unicode codepage."
+ },
+ "$number": {
+ "args": "arg",
+ "desc": "Casts the `arg` parameter to a number using the following casting rules:\n\n - Numbers are unchanged\n - Strings that contain a sequence of characters that represent a legal JSON number are converted to that number\n - All other values cause an error to be thrown."
+ },
+ "$abs": {
+ "args":"number",
+ "desc":"Returns the absolute value of the `number` parameter."
+ },
+ "$floor": {
+ "args":"number",
+ "desc":"Returns the value of `number` rounded down to the nearest integer that is smaller or equal to `number`."
+ },
+ "$ceil": {
+ "args":"number",
+ "desc":"Returns the value of `number` rounded up to the nearest integer that is greater than or equal to `number`."
+ },
+ "$round": {
+ "args":"number [, precision]",
+ "desc":"Returns the value of the `number` parameter rounded to the number of decimal places specified by the optional `precision` parameter."
+ },
+ "$power": {
+ "args":"base, exponent",
+ "desc":"Returns the value of `base` raised to the power of `exponent`."
+ },
+ "$sqrt": {
+ "args":"number",
+ "desc":"Returns the square root of the value of the `number` parameter."
+ },
+ "$random": {
+ "args":"",
+ "desc":"Returns a pseudo random number greater than or equal to zero and less than one."
+ },
+ "$millis": {
+ "args":"",
+ "desc":"Returns the number of milliseconds since the Unix Epoch (1 January, 1970 UTC) as a number. All invocations of `$millis()` within an evaluation of an expression will all return the same value."
+ },
+ "$sum": {
+ "args": "array",
+ "desc": "Returns the arithmetic sum of an `array` of numbers. It is an error if the input `array` contains an item which isn't a number."
+ },
+ "$max": {
+ "args": "array",
+ "desc": "Returns the maximum number in an `array` of numbers. It is an error if the input `array` contains an item which isn't a number."
+ },
+ "$min": {
+ "args": "array",
+ "desc": "Returns the minimum number in an `array` of numbers. It is an error if the input `array` contains an item which isn't a number."
+ },
+ "$average": {
+ "args": "array",
+ "desc": "Returns the mean value of an `array` of numbers. It is an error if the input `array` contains an item which isn't a number."
+ },
+ "$boolean": {
+ "args": "arg",
+ "desc": "Casts the argument to a Boolean using the following rules:\n\n - `Boolean` : unchanged\n - `string`: empty : `false`\n - `string`: non-empty : `true`\n - `number`: `0` : `false`\n - `number`: non-zero : `true`\n - `null` : `false`\n - `array`: empty : `false`\n - `array`: contains a member that casts to `true` : `true`\n - `array`: all members cast to `false` : `false`\n - `object`: empty : `false`\n - `object`: non-empty : `true`\n - `function` : `false`"
+ },
+ "$not": {
+ "args": "arg",
+ "desc": "Returns Boolean NOT on the argument. `arg` is first cast to a boolean"
+ },
+ "$exists": {
+ "args": "arg",
+ "desc": "Returns Boolean `true` if the `arg` expression evaluates to a value, or `false` if the expression does not match anything (e.g. a path to a non-existent field reference)."
+ },
+ "$count": {
+ "args": "array",
+ "desc": "Returns the number of items in the array"
+ },
+ "$append": {
+ "args": "array, array",
+ "desc": "Appends two arrays"
+ },
+ "$sort": {
+ "args":"array [, function]",
+ "desc":"Returns an array containing all the values in the `array` parameter, but sorted into order.\n\nIf a comparator `function` is supplied, then it must be a function that takes two parameters:\n\n`function(left, right)`\n\nThis function gets invoked by the sorting algorithm to compare two values left and right. If the value of left should be placed after the value of right in the desired sort order, then the function must return Boolean `true` to indicate a swap. Otherwise it must return `false`."
+ },
+ "$reverse": {
+ "args":"array",
+ "desc":"Returns an array containing all the values from the `array` parameter, but in reverse order."
+ },
+ "$shuffle": {
+ "args":"array",
+ "desc":"Returns an array containing all the values from the `array` parameter, but shuffled into random order."
+ },
+ "$zip": {
+ "args":"array, ...",
+ "desc":"Returns a convolved (zipped) array containing grouped arrays of values from the `array1` … `arrayN` arguments from index 0, 1, 2...."
+ },
+ "$keys": {
+ "args": "object",
+ "desc": "Returns an array containing the keys in the object. If the argument is an array of objects, then the array returned contains a de-duplicated list of all the keys in all of the objects."
+ },
+ "$lookup": {
+ "args": "object, key",
+ "desc": "Returns the value associated with key in object. If the first argument is an array of objects, then all of the objects in the array are searched, and the values associated with all occurrences of key are returned."
+ },
+ "$spread": {
+ "args": "object",
+ "desc": "Splits an object containing key/value pairs into an array of objects, each of which has a single key/value pair from the input object. If the parameter is an array of objects, then the resultant array contains an object for every key/value pair in every object in the supplied array."
+ },
+ "$merge": {
+ "args": "array<object>",
+ "desc": "Merges an array of `objects` into a single `object` containing all the key/value pairs from each of the objects in the input array. If any of the input objects contain the same key, then the returned `object` will contain the value of the last one in the array. It is an error if the input array contains an item that is not an object."
+ },
+ "$sift": {
+ "args":"object, function",
+ "desc":"Returns an object that contains only the key/value pairs from the `object` parameter that satisfy the predicate `function` passed in as the second parameter.\n\nThe `function` that is supplied as the second parameter must have the following signature:\n\n`function(value [, key [, object]])`"
+ },
+ "$each": {
+ "args":"object, function",
+ "desc":"Returns an array containing the values return by the `function` when applied to each key/value pair in the `object`."
+ },
+ "$map": {
+ "args":"array, function",
+ "desc":"Returns an array containing the results of applying the `function` parameter to each value in the `array` parameter.\n\nThe `function` that is supplied as the second parameter must have the following signature:\n\n`function(value [, index [, array]])`"
+ },
+ "$filter": {
+ "args":"array, function",
+ "desc":"Returns an array containing only the values in the `array` parameter that satisfy the `function` predicate.\n\nThe `function` that is supplied as the second parameter must have the following signature:\n\n`function(value [, index [, array]])`"
+ },
+ "$reduce": {
+ "args":"array, function [, init]",
+ "desc":"Returns an aggregated value derived from applying the `function` parameter successively to each value in `array` in combination with the result of the previous application of the function.\n\nThe function must accept two arguments, and behaves like an infix operator between each value within the `array`. The signature of `function` must be of the form: `myfunc($accumulator, $value[, $index[, $array]])`\n\nThe optional `init` parameter is used as the initial value in the aggregation."
+ },
+ "$flowContext": {
+ "args": "string[, string]",
+ "desc": "Retrieves a flow context property.\n\nThis is a Node-RED defined function."
+ },
+ "$globalContext": {
+ "args": "string[, string]",
+ "desc": "Retrieves a global context property.\n\nThis is a Node-RED defined function."
+ },
+ "$pad": {
+ "args": "string, width [, char]",
+ "desc": "Returns a copy of the `string` with extra padding, if necessary, so that its total number of characters is at least the absolute value of the `width` parameter.\n\nIf `width` is a positive number, then the string is padded to the right; if negative, it is padded to the left.\n\nThe optional `char` argument specifies the padding character(s) to use. If not specified, it defaults to the space character."
+ },
+ "$fromMillis": {
+ "args": "number",
+ "desc": "Convert a number representing milliseconds since the Unix Epoch (1 January, 1970 UTC) to a timestamp string in the ISO 8601 format."
+ },
+ "$formatNumber": {
+ "args": "number, picture [, options]",
+ "desc": "Casts the `number` to a string and formats it to a decimal representation as specified by the `picture` string.\n\n The behaviour of this function is consistent with the XPath/XQuery function fn:format-number as defined in the XPath F&O 3.1 specification. The picture string parameter defines how the number is formatted and has the same syntax as fn:format-number.\n\nThe optional third argument `options` is used to override the default locale specific formatting characters such as the decimal separator. If supplied, this argument must be an object containing name/value pairs specified in the decimal format section of the XPath F&O 3.1 specification."
+ },
+ "$formatBase": {
+ "args": "number [, radix]",
+ "desc": "Casts the `number` to a string and formats it to an integer represented in the number base specified by the `radix` argument. If `radix` is not specified, then it defaults to base 10. `radix` can be between 2 and 36, otherwise an error is thrown."
+ },
+ "$toMillis": {
+ "args": "timestamp",
+ "desc": "Convert a `timestamp` string in the ISO 8601 format to the number of milliseconds since the Unix Epoch (1 January, 1970 UTC) as a number. An error is thrown if the string is not in the correct format."
+ },
+ "$env": {
+ "args": "arg",
+ "desc": "Returns the value of an environment variable.\n\nThis is a Node-RED defined function."
+ },
+ "$eval": {
+ "args": "expr [, context]",
+ "desc": "Parses and evaluates the string `expr` which contains literal JSON or a JSONata expression using the current context as the context for evaluation."
+ },
+ "$formatInteger": {
+ "args": "number, picture",
+ "desc": "Casts the `number` to a string and formats it to an integer representation as specified by the `picture` string. The picture string parameter defines how the number is formatted and has the same syntax as `fn:format-integer` from the XPath F&O 3.1 specification."
+ },
+ "$parseInteger": {
+ "args": "string, picture",
+ "desc": "Parses the contents of the `string` parameter to an integer (as a JSON number) using the format specified by the `picture` string. The `picture` string parameter has the same format as `$formatInteger`."
+ },
+ "$error": {
+ "args": "[str]",
+ "desc": "Throws an error with a message. The optional `str` will replace the default message of `$error() function evaluated`"
+ },
+ "$assert": {
+ "args": "arg, str",
+ "desc": "If `arg` is true the function returns undefined. If `arg` is false an exception is thrown with `str` as the message of the exception."
+ },
+ "$single": {
+ "args": "array, function",
+ "desc": "Returns the one and only value in the `array` parameter that satisfies the `function` predicate (i.e. the `function` returns Boolean `true` when passed the value). Throws an exception if the number of matching values is not exactly one.\n\nThe function should be supplied in the following signature: `function(value [, index [, array]])` where value is each input of the array, index is the position of that value and the whole array is passed as the third argument"
+ },
+ "$encodeUrl": {
+ "args": "str",
+ "desc": "Encodes a Uniform Resource Locator (URL) component by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character.\n\nExample: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`"
+ },
+ "$encodeUrlComponent": {
+ "args": "str",
+ "desc": "Encodes a Uniform Resource Locator (URL) by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character. \n\nExample: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`"
+ },
+ "$decodeUrl": {
+ "args": "str",
+ "desc": "Decodes a Uniform Resource Locator (URL) component previously created by encodeUrlComponent. \n\nExample: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`"
+ },
+ "$decodeUrlComponent": {
+ "args": "str",
+ "desc": "Decodes a Uniform Resource Locator (URL) previously created by encodeUrl. \n\nExample: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`"
+ },
+ "$distinct": {
+ "args": "array",
+ "desc": "Returns an array with duplicate values removed from `array`"
+ },
+ "$type": {
+ "args": "value",
+ "desc": "Returns the type of `value` as a string. If `value` is undefined, this will return `undefined`"
+ }
+}
diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/ja/editor.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ja/editor.json
new file mode 100644
index 0000000..cf04ced
--- /dev/null
+++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ja/editor.json
@@ -0,0 +1,1013 @@
+{
+ "common": {
+ "label": {
+ "name": "名前",
+ "ok": "OK",
+ "done": "完了",
+ "cancel": "中止",
+ "delete": "削除",
+ "close": "閉じる",
+ "load": "読み込み",
+ "save": "保存",
+ "import": "読み込み",
+ "export": "書き出し",
+ "back": "戻る",
+ "next": "進む",
+ "clone": "プロジェクトをクローン",
+ "cont": "続ける"
+ },
+ "type": {
+ "string": "文字列",
+ "number": "数値",
+ "boolean": "真偽値",
+ "array": "配列",
+ "buffer": "バッファ",
+ "object": "オブジェクト",
+ "jsonString": "JSON文字列",
+ "undefined": "undefined",
+ "null": "null"
+ }
+ },
+ "workspace": {
+ "defaultName": "フロー __number__",
+ "editFlow": "フローを編集: __name__",
+ "confirmDelete": "削除の確認",
+ "delete": "本当に '__label__' を削除しますか?",
+ "dropFlowHere": "ここにフローをドロップしてください",
+ "addFlow": "フローの追加",
+ "listFlows": "フロー一覧",
+ "status": "状態",
+ "enabled": "有効",
+ "disabled": "無効",
+ "info": "詳細",
+ "selectNodes": "ノードをクリックして選択"
+ },
+ "menu": {
+ "label": {
+ "view": {
+ "view": "表示",
+ "grid": "グリッド",
+ "showGrid": "グリッドを表示",
+ "snapGrid": "ノードの配置を補助",
+ "gridSize": "グリッドの大きさ",
+ "textDir": "テキストの方向",
+ "defaultDir": "標準",
+ "ltr": "左から右",
+ "rtl": "右から左",
+ "auto": "文脈",
+ "language": "表示言語",
+ "browserDefault": "ブラウザのデフォルト"
+ },
+ "sidebar": {
+ "show": "サイドバーを表示"
+ },
+ "palette": {
+ "show": "パレットを表示"
+ },
+ "settings": "設定",
+ "userSettings": "ユーザ設定",
+ "nodes": "ノード",
+ "displayStatus": "ノードの状態を表示",
+ "displayConfig": "ノードの設定",
+ "import": "読み込み",
+ "export": "書き出し",
+ "search": "ノードを検索",
+ "searchInput": "ノードを検索",
+ "subflows": "サブフロー",
+ "createSubflow": "サブフローを作成",
+ "selectionToSubflow": "選択部分をサブフロー化",
+ "flows": "フロー",
+ "add": "フローを新規追加",
+ "rename": "フロー名を変更",
+ "delete": "フローを削除",
+ "keyboardShortcuts": "ショートカットキーの説明",
+ "login": "ログイン",
+ "logout": "ログアウト",
+ "editPalette": "パレットの管理",
+ "other": "その他",
+ "showTips": "ヒントを表示",
+ "help": "Node-REDウェブサイト",
+ "projects": "プロジェクト",
+ "projects-new": "新規",
+ "projects-open": "開く",
+ "projects-settings": "設定",
+ "showNodeLabelDefault": "追加したノードのラベルを表示"
+ }
+ },
+ "actions": {
+ "toggle-navigator": "ナビゲータの表示/非表示を切替",
+ "zoom-out": "縮小",
+ "zoom-reset": "拡大/縮小を初期化",
+ "zoom-in": "拡大"
+ },
+ "user": {
+ "loggedInAs": "__name__ としてログインしました",
+ "username": "ユーザ名",
+ "password": "パスワード",
+ "login": "ログイン",
+ "loginFailed": "ログインに失敗しました",
+ "notAuthorized": "権限がありません",
+ "errors": {
+ "settings": "設定を参照するには、ログインする必要があります",
+ "deploy": "変更をデプロイするには、ログインする必要があります",
+ "notAuthorized": "本アクションを行うには、ログインする必要があります"
+ }
+ },
+ "notification": {
+ "warning": "警告: __message__",
+ "warnings": {
+ "undeployedChanges": "ノードの変更をデプロイしていません",
+ "nodeActionDisabled": "ノードのアクションは無効になっています",
+ "nodeActionDisabledSubflow": "ノードのアクションは、サブフロー内で無効になっています",
+ "missing-types": "
不明なノードが存在するため、フローを停止しました。
", + "safe-mode": "セーフモードでフローを停止しました
フローを変更し、再起動するために変更をデプロイできます
", + "restartRequired": "更新されたモジュールを有効化するため、Node-REDを再起動する必要があります", + "credentials_load_failed": "認証情報を復号できないため、フローを停止しました
フローの認証情報ファイルは暗号化されています。しかし、プロジェクトの暗号鍵が存在しない、または不正です
", + "credentials_load_failed_reset": "認証情報を復号できません
フローの認証情報ファイルは暗号化されています。しかし、プロジェクトの暗号鍵が存在しない、または不正です。
次回のデプロイでフローの認証情報ファイルがリセットされます。既存フローの認証情報は削除されます。
", + "missing_flow_file": "プロジェクトのフローファイルが存在しません
本プロジェクトにフローファイルが登録されていません
", + "missing_package_file": "プロジェクトのパッケージファイルが存在しません
本プロジェクトにはpackage.jsonファイルがありません
", + "project_empty": "空のプロジェクトです
デフォルトのプロジェクトファイルを作成しますか?
作成しない場合、エディタの外でファイルをプロジェクトへ手動で追加する必要があります
プロジェクト '__project__' が存在しません
", + "git_merge_conflict": "変更の自動マージが失敗しました
マージされていない競合を解決し、コミットしてください
" + }, + "error": "エラー: __message__", + "errors": { + "lostConnection": "サーバとの接続が切断されました: 再接続しています", + "lostConnectionReconnect": "サーバとの接続が切断されました: __time__ 秒後に再接続します", + "lostConnectionTry": "すぐに接続", + "cannotAddSubflowToItself": "サブフロー自身を追加できません", + "cannotAddCircularReference": "循環参照を検出したため、サブフローを追加できません", + "unsupportedVersion": "サポートされていないバージョンのNode.jsを使用しています。
最新のNode.js LTSに更新してください。
", + "failedToAppendNode": "'__module__'がロードできませんでした。
__error__
" + }, + "project": { + "change-branch": "ローカルブランチ'__project__'に変更しました", + "merge-abort": "Gitマージを中止しました", + "loaded": "プロジェクト'__project__'をロードしました", + "updated": "プロジェクト'__project__'を更新しました", + "pull": "プロジェクト'__project__'を再ロードしました", + "revert": "プロジェクト'__project__'を取り消しました", + "merge-complete": "Gitマージが完了しました", + "setupCredentials": "認証情報を設定", + "setupProjectFiles": "プロジェクトファイルの設定", + "no": "結構です", + "createDefault": "デフォルトのプロジェクトファイルを作成", + "mergeConflict": "マージの衝突を表示" + }, + "label": { + "manage-project-dep": "プロジェクトの依存関係の管理", + "setup-cred": "認証情報の設定", + "setup-project": "プロジェクトファイルの設定", + "create-default-package": "デフォルトパッケージファイルの作成", + "no-thanks": "不要", + "create-default-project": "デフォルトプロジェクトファイルの作成", + "show-merge-conflicts": "マージ競合を表示" + } + }, + "clipboard": { + "clipboard": "クリップボード", + "nodes": "ノード", + "node": "__count__ 個のノード", + "node_plural": "__count__ 個のノード", + "configNode": "__count__ 個の設定ノード", + "configNode_plural": "__count__ 個の設定ノード", + "flow": "__count__ 個のフロー", + "flow_plural": "__count__ 個のフロー", + "subflow": "__count__ 個のサブフロー", + "subflow_plural": "__count__ 個のサブフロー", + "pasteNodes": "JSON形式のフローデータを貼り付けてください", + "selectFile": "読み込むファイルを選択してください", + "importNodes": "フローをクリップボートから読み込み", + "exportNodes": "フローをクリップボードへ書き出し", + "download": "ダウンロード", + "importUnrecognised": "認識できない型が読み込まれました:", + "importUnrecognised_plural": "認識できない型が読み込まれました:", + "nodesExported": "クリップボードへフローを書き出しました", + "nodesImported": "読み込みました:", + "nodeCopied": "__count__ 個のノードをコピーしました", + "nodeCopied_plural": "__count__ 個のノードをコピーしました", + "invalidFlow": "不正なフロー: __message__", + "export": { + "selected": "選択したフロー", + "current": "現在のタブ", + "all": "全てのタブ", + "compact": "インデントのないJSONフォーマット", + "formatted": "インデント付きのJSONフォーマット", + "copy": "書き出し", + "export": "ライブラリに書き出し", + "exportAs": "書き出し先", + "overwrite": "更新", + "exists": "\"__file__\"は既に存在します。
更新しますか?
" + }, + "import": { + "import": "読み込み先", + "newFlow": "新規のタブ", + "errors": { + "notArray": "JSON形式の配列ではありません", + "itemNotObject": "不正なフロー - __index__ 番目の要素はノードオブジェクトではありません", + "missingId": "不正なフロー - __index__ 番目の要素に'id'プロパティがありません", + "missingType": "不正なフロー - __index__ 番目の要素に'type'プロパティがありません" + } + }, + "copyMessagePath": "パスをコピーしました", + "copyMessageValue": "値をコピーしました", + "copyMessageValue_truncated": "切り捨てられた値をコピーしました" + }, + "deploy": { + "deploy": "デプロイ", + "full": "全て", + "fullDesc": "ワークスペースを全てデプロイ", + "modifiedFlows": "変更したフロー", + "modifiedFlowsDesc": "変更したノードを含むフローのみデプロイ", + "modifiedNodes": "変更したノード", + "modifiedNodesDesc": "変更したノードのみデプロイ", + "restartFlows": "フローを再起動", + "restartFlowsDesc": "デプロイされた現在のフローを再起動", + "successfulDeploy": "デプロイが成功しました", + "successfulRestart": "フローの再起動が成功しました", + "deployFailed": "デプロイが失敗しました: __message__", + "unusedConfigNodes": "使われていない「ノードの設定」があります。", + "unusedConfigNodesLink": "設定を参照する", + "errors": { + "noResponse": "サーバの応答がありません" + }, + "confirm": { + "button": { + "ignore": "無視", + "confirm": "デプロイの確認", + "review": "差分を確認", + "cancel": "中止", + "merge": "変更をマージ", + "overwrite": "無視してデプロイ" + }, + "undeployedChanges": "デプロイしていない変更があります。このページを抜けると変更が削除されます。", + "improperlyConfigured": "以下のノードは、正しくプロパティが設定されていません:", + "unknown": "ワークスペースに未知の型のノードがあります。", + "confirm": "このままデプロイしても良いですか?", + "doNotWarn": "この警告を再度表示しない", + "conflict": "フローを編集している間に、他のブラウザがフローをデプロイしました。", + "backgroundUpdate": "サーバ上のフローが更新されました", + "conflictChecking": "変更を自動的にマージしてよいか確認してください。", + "conflictAutoMerge": "変更の衝突がないため、自動的にマージできます。", + "conflictManualMerge": "変更に衝突があるため、デプロイ前に解決する必要があります。", + "plusNMore": "さらに __count__ 個" + } + }, + "eventLog": { + "title": "イベントログ", + "view": "ログを確認" + }, + "diff": { + "unresolvedCount": "未解決の衝突 __count__", + "unresolvedCount_plural": "未解決の衝突 __count__", + "globalNodes": "グローバルノード", + "flowProperties": "フロープロパティ", + "type": { + "added": "追加", + "changed": "変更", + "unchanged": "変更なし", + "deleted": "削除", + "flowDeleted": "削除されたフロー", + "flowAdded": "追加されたフロー", + "movedTo": "__id__ へ移動", + "movedFrom": "__id__ から移動" + }, + "nodeCount": "__count__ 個のノード", + "nodeCount_plural": "__count__ 個のノード", + "local": "ローカルの変更", + "remote": "リモートの変更", + "reviewChanges": "変更を表示", + "noBinaryFileShowed": "バイナリファイルの中身は表示することができません", + "viewCommitDiff": "コミットの内容を表示", + "compareChanges": "変更を比較", + "saveConflict": "解決して保存", + "conflictHeader": "__unresolved__ 個中 __resolved__ 個のコンフリクトを解決", + "commonVersionError": "共通バージョンは正しいJSON形式ではありません:", + "oldVersionError": "古いバージョンは正しいJSON形式ではありません:", + "newVersionError": "新しいバージョンは正しいJSON形式ではありません:" + }, + "subflow": { + "editSubflowInstance": "サブフローインスタンスを編集: __name__", + "editSubflow": "サブフローのテンプレートを編集: __name__", + "edit": "サブフローのテンプレートを編集", + "subflowInstances": "このサブフローのテンプレートのインスタンスが __count__ 個存在します", + "subflowInstances_plural": "このサブフローのテンプレートのインスタンスが __count__ 個存在します", + "editSubflowProperties": "プロパティを編集", + "input": "入力:", + "output": "出力:", + "status": "ステータスノード", + "deleteSubflow": "サブフローを削除", + "info": "詳細", + "category": "カテゴリ", + "env": { + "restore": "デフォルト値に戻す", + "remove": "環境変数を削除" + }, + "errors": { + "noNodesSelected": "サブフローを作成できません: ノードが選択されていません", + "multipleInputsToSelection": "サブフローを作成できません: 複数の入力が選択されています" + } + }, + "editor": { + "configEdit": "編集", + "configAdd": "追加", + "configUpdate": "更新", + "configDelete": "削除", + "nodesUse": "__count__ 個のノードが、この設定を使用しています", + "nodesUse_plural": "__count__ 個のノードが、この設定を使用しています", + "addNewConfig": "新規に __type__ ノードの設定を追加", + "editNode": "__type__ ノードを編集", + "editConfig": "__type__ ノードの設定を編集", + "addNewType": "新規に __type__ を追加...", + "nodeProperties": "プロパティ", + "label": "ラベル", + "color": "色", + "portLabels": "ポートラベル", + "labelInputs": "入力", + "labelOutputs": "出力", + "settingIcon": "アイコン", + "default": "デフォルト", + "noDefaultLabel": "なし", + "defaultLabel": "既定のラベルを使用", + "searchIcons": "アイコンを検索", + "useDefault": "デフォルトを使用", + "description": "詳細", + "show": "表示", + "hide": "非表示", + "locale": "UI言語の選択", + "icon": "記号", + "inputType": "入力形式", + "inputs": { + "input": "入力", + "select": "メニュー", + "checkbox": "チェックボックス", + "spinner": "スピナー", + "none": "無し", + "hidden": "非表示" + }, + "types": { + "str": "文字列", + "num": "数値", + "bool": "真偽", + "json": "JSON", + "bin": "バッファ", + "env": "環境変数" + }, + "menu": { + "input": "入力", + "select": "選択", + "checkbox": "チェックボックス", + "spinner": "数値", + "hidden": "ラベルのみ" + }, + "select": { + "label": "ラベル", + "value": "値" + }, + "spinner": { + "min": "最小値", + "max": "最大値" + }, + "errors": { + "scopeChange": "スコープの変更は、他のフローで使われているノードを無効にします", + "invalidProperties": "プロパティが不正です:" + } + }, + "keyboard": { + "title": "キーボードショートカット", + "keyboard": "キーボード", + "filterActions": "動作を検索", + "shortcut": "ショートカット", + "scope": "範囲", + "unassigned": "未割当", + "global": "グローバル", + "workspace": "ワークスペース", + "selectAll": "全てのノードを選択", + "selectAllConnected": "接続された全てのノードを選択", + "addRemoveNode": "ノードの選択、選択解除", + "editSelected": "選択したノードを編集", + "deleteSelected": "選択したノードや接続を削除", + "importNode": "フローの読み込み", + "exportNode": "フローの書き出し", + "nudgeNode": "選択したノードを移動(移動量小)", + "moveNode": "選択したノードを移動(移動量大)", + "toggleSidebar": "サイドバーの表示/非表示", + "togglePalette": "パレットの表示/非表示", + "copyNode": "選択したノードをコピー", + "cutNode": "選択したノードを切り取り", + "pasteNode": "ノードを貼り付け", + "undoChange": "変更操作を戻す", + "searchBox": "ノードを検索", + "managePalette": "パレットの管理", + "actionList": "動作一覧" + }, + "library": { + "library": "ライブラリ", + "openLibrary": "ライブラリを開く", + "saveToLibrary": "ライブラリへ保存", + "typeLibrary": "__type__ ライブラリ", + "unnamedType": "名前なし __type__", + "exportedToLibrary": "ライブラリにノードを書き出しました", + "dialogSaveOverwrite": "__libraryName__ という __libraryType__ は既に存在しています 上書きしますか?", + "invalidFilename": "不正なファイル名", + "savedNodes": "フローを保存しました", + "savedType": "__type__ を保存しました", + "saveFailed": "保存に失敗しました: __message__", + "newFolder": "新規フォルダ", + "types": { + "local": "ローカル", + "examples": "サンプル" + } + }, + "palette": { + "noInfo": "情報がありません", + "filter": "ノードを検索", + "search": "ノードを検索", + "addCategory": "新規追加...", + "label": { + "subflows": "サブフロー", + "network": "ネットワーク", + "common": "共通", + "input": "入力", + "output": "出力", + "function": "機能", + "sequence": "シーケンス", + "parser": "パーサ", + "social": "ソーシャル", + "storage": "ストレージ", + "analysis": "分析", + "advanced": "その他" + }, + "actions": { + "collapse-all": "全カテゴリを折畳む", + "expand-all": "全カテゴリを展開" + }, + "event": { + "nodeAdded": "ノードをパレットへ追加しました:", + "nodeAdded_plural": "ノードをパレットへ追加しました:", + "nodeRemoved": "ノードをパレットから削除しました:", + "nodeRemoved_plural": "ノードをパレットから削除しました:", + "nodeEnabled": "ノードを有効化しました:", + "nodeEnabled_plural": "ノードを有効化しました:", + "nodeDisabled": "ノードを無効化しました:", + "nodeDisabled_plural": "ノードを無効化しました:", + "nodeUpgraded": "ノードモジュール __module__ をバージョン __version__ へ更新しました" + }, + "editor": { + "title": "パレットの管理", + "palette": "パレット", + "times": { + "seconds": "秒前", + "minutes": "分前", + "minutesV": "__count__ 分前", + "hoursV": "__count__ 時間前", + "hoursV_plural": "__count__ 時間前", + "daysV": "__count__ 日前", + "daysV_plural": "__count__ 日前", + "weeksV": "__count__ 週間前", + "weeksV_plural": "__count__ 週間前", + "monthsV": "__count__ ヵ月前", + "monthsV_plural": "__count__ ヵ月前", + "yearsV": "__count__ 年前", + "yearsV_plural": "__count__ 年前", + "yearMonthsV": "__y__ 年 __count__ ヵ月前", + "yearMonthsV_plural": "__y__ 年 __count__ ヵ月前", + "yearsMonthsV": "__y__ 年 __count__ ヵ月前", + "yearsMonthsV_plural": "__y__ 年 __count__ ヵ月前" + }, + "nodeCount": "__label__ 個のノード", + "nodeCount_plural": "__label__ 個のノード", + "moduleCount": "__count__ 個のモジュール", + "moduleCount_plural": "__count__ 個のモジュール", + "inuse": "使用中", + "enableall": "全て有効化", + "disableall": "全て無効化", + "enable": "有効化", + "disable": "無効化", + "remove": "削除", + "update": "__version__ へ更新", + "updated": "更新済", + "install": "ノードを追加", + "installed": "追加しました", + "conflict": "競合", + "conflictTip": "インストール済みのノードの種別と競合しているため
ノードをインストールできません
競合: __module__
ノードのカタログの読み込みに失敗しました。
詳細はブラウザのコンソールを確認してください。
", + "installFailed": "追加処理が失敗しました: __module__
__message__
詳細はログを確認してください。
", + "removeFailed": "削除処理が失敗しました: __module__
__message__
詳細はログを確認してください。
", + "updateFailed": "更新処理が失敗しました: __module__
__message__
詳細はログを確認してください。
", + "enableFailed": "有効化処理が失敗しました: __module__
__message__
詳細はログを確認してください。
", + "disableFailed": "無効化処理が失敗しました: __module__
__message__
詳細はログを確認してください。
" + }, + "confirm": { + "install": { + "body": "__module__ をインストールします。
ノードを追加する前に、ドキュメントを確認してください。ノードによっては、モジュールの依存関係を自動的に解決できない場合や、Node-REDの再起動が必要となる場合があります。
", + "title": "ノードを追加" + }, + "remove": { + "body": "__module__ を削除します。
Node-REDからノードを削除します。ノードはNode-REDが再起動されるまで、リソースを使い続ける可能性があります。
", + "title": "ノードを削除" + }, + "update": { + "body": "__module__ を更新します。
更新を完了するには手動でNode-REDを再起動する必要があります。
", + "title": "ノードの更新" + }, + "cannotUpdate": { + "body": "ノードの更新があります。「パレットの管理」の画面では更新されません。リモートの変更のプル失敗:ステージングされていないローカルの変更を上書きされてしまいます。
変更をコミットしてから再度実行してください。
", + "showUnstagedChanges": "ステージングされていない変更を表示", + "connectionFailed": "リモートリポジトリに接続できません: ", + "pullUnrelatedHistory": "リモートに関連のないコミット履歴があります。
本当に変更をプルしてローカルリポジトリに反映しますか?
", + "pullChanges": "プル変更", + "history": "履歴", + "projectHistory": "プロジェクト履歴", + "daysAgo": "__count__ 日前", + "daysAgo_plural": "__count__ 日前", + "hoursAgo": "__count__ 時間前", + "hoursAgo_plural": "__count__ 時間前", + "minsAgo": "__count__ 分前", + "minsAgo_plural": "__count__ 分前", + "secondsAgo": "数秒前", + "notTracking": "ローカルブランチは現在リモートブランチをトラッキングしていません。", + "statusUnmergedChanged": "リポジトリ内にマージされていない変更があります。コンフリクトを解決してコミットしてください。", + "repositoryUpToDate": "リポジトリは最新です。", + "commitsAhead": "あなたのリポジトリはリモートより__count__コミット進んでいます。現在のコミットをプッシュできます。", + "commitsAhead_plural": "あなたのリポジトリはリモートより__count__コミット進んでいます。現在のコミットをプッシュできます。", + "commitsBehind": "あなたのリポジトリはリモートより__count__コミット遅れています。現在のコミットをプルできます。", + "commitsBehind_plural": "あなたのリポジトリはリモートより__count__コミット遅れています。現在のコミットをプルできます。", + "commitsAheadAndBehind1": "あなたのリポジトリはリモートより__count__コミット遅れており、かつ", + "commitsAheadAndBehind1_plural": "あなたのリポジトリはリモートより__count__コミット遅れており、かつ", + "commitsAheadAndBehind2": "__count__コミット進んでいます。 ", + "commitsAheadAndBehind2_plural": "__count__コミット進んでいます。 ", + "commitsAheadAndBehind3": "プッシュする前にリモートのコミットをプルしてください。", + "commitsAheadAndBehind3_plural": "プッシュする前にリモートのコミットをプルしてください。", + "refreshCommitHistory": "コミット履歴を更新", + "refreshChanges": "変更を更新" + } + } + }, + "typedInput": { + "type": { + "str": "文字列", + "num": "数値", + "re": "正規表現", + "bool": "真偽", + "json": "JSON", + "bin": "バッファ", + "date": "日時", + "jsonata": "JSONata式", + "env": "環境変数" + } + }, + "editableList": { + "add": "追加" + }, + "search": { + "empty": "一致したものが見つかりませんでした", + "addNode": "ノードを追加..." + }, + "expressionEditor": { + "functions": "関数", + "functionReference": "関数リファレンス", + "insert": "挿入", + "title": "JSONata式エディタ", + "test": "テスト", + "data": "メッセージ例", + "result": "結果", + "format": "整形", + "compatMode": "互換モードが有効になっています", + "compatModeDesc": " 入力された式では msg
を参照しているため、互換モードで評価します。このモードは将来廃止予定のため、式で msg
を使わないよう修正してください。
JSONataをNode-REDで最初にサポートした際には、 msg
オブジェクトの参照が必要でした。例えば msg.payload
がペイロードを参照するために使われていました。
直接メッセージに対して式を評価するようになったため、この形式は使えなくなります。ペイロードを参照するには、単に payload
にしてください。
バッファ型は、バイト値から成るJSON配列として格納されます。このエディタは、入力値をJSON配列として構文解析します。もし不正なJSON配列の場合、UTF-8文字列として扱い、各文字コード番号から成る配列へ変換します。
例えば、 Hello World
という値を、以下のJSON配列へ変換します。
[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]" + }, + "projects": { + "config-git": "Gitクライアントの設定", + "welcome": { + "hello": "こんにちは! Node-REDで「プロジェクト」機能が利用できるようになりました。", + "desc0": "フローファイルの管理方法が刷新され、バージョン管理も可能です。", + "desc1": "まず最初にプロジェクトを作成するか、既存のGitリポジトリからプロジェクトをクローンしてください。", + "desc2": "とりあえずこの処理をスキップしてもかまいません。「プロジェクト」メニューから、いつでもプロジェクトの作成を開始できます。", + "create": "プロジェクトの作成", + "clone": "プロジェクトのクローン", + "openExistingProject": "既存のプロジェクトを開く", + "not-right-now": "後にする" + }, + "git-config": { + "setup": "バージョン管理クライアントの設定", + "desc0": "Node-REDはオープンソースツールのGitを使ってバージョン管理を行います。Gitによりプロジェクトファイルに対する変化を記録し、外部リポジトリに保存することができます。", + "desc1": "変更をコミットする際、変更を行った人物の情報としてユーザ名とEmailアドレスをGitが記憶します。ユーザ名は本名でなくても構いません。好きな名前を使ってください。", + "desc2": "Gitクライアントの現在の設定は以下の通りです。", + "desc3": "設定ダイアログの「Git設定」タブから別途変更することもできます。", + "username": "ユーザ名", + "email": "Email" + }, + "project-details": { + "create": "プロジェクトの作成", + "desc0": "プロジェクトはGitリポジトリとして管理します。Gitリポジトリを使ってフローの共有やコラボレーションが簡単にできます。", + "desc1": "複数のプロジェクトを作成し、エディタから即座に変更できます。", + "desc2": "まず、プロジェクト名と説明(任意)を指定してください。", + "already-exists": "既に存在するプロジェクトです", + "must-contain": "A-Z 0-9 _ - のみ指定可能", + "project-name": "プロジェクト名", + "desc": "説明", + "opt": "任意" + }, + "clone-project": { + "clone": "プロジェクトをクローン", + "desc0": "プロジェクトを含んだGitリポジトリを作成済みの場合、クローンを作成することができます。", + "already-exists": "既に存在するプロジェクトです", + "must-contain": "A-Z 0-9 _ - のみ指定可能", + "project-name": "プロジェクト名", + "no-info-in-url": "URLにユーザ名/パスワードを含めないようにしてください", + "git-url": "GitリポジトリのURL", + "protocols": "https://, ssh:// もしくは file://", + "auth-failed": "認証に失敗しました", + "username": "ユーザ名", + "passwd": "パスワード", + "ssh-key": "SSHキー", + "passphrase": "パスフレーズ", + "ssh-key-desc": "SSHでリポジトリをクローンする前にSSHキーを追加してください。", + "ssh-key-add": "SSHキーの追加", + "credential-key": "認証情報の暗号化キー", + "cant-get-ssh-key": "エラー! 選択したSSHキーのパスを取得できません。", + "already-exists2": "既に存在します", + "git-error": "Gitエラー", + "connection-failed": "接続に失敗しました", + "not-git-repo": "Gitリポジトリではありません", + "repo-not-found": "リポジトリが見つかりません" + }, + "default-files": { + "create": "プロジェクト関連ファイルの作成", + "desc0": "プロジェクトはフローファイル、README、package.jsonを含みます。", + "desc1": "その他、Gitリポジトリで管理したいファイルを含めても構いません。", + "desc2": "既存のフローと認証情報ファイルをプロジェクトにコピーします。", + "flow-file": "フローファイル", + "credentials-file": "認証情報ファイル" + }, + "encryption-config": { + "setup": "認証情報ファイルの暗号化設定", + "desc0": "フロー認証情報ファイルを暗号化して内容の安全性を担保できます。", + "desc1": "認証情報を公開Gitリポジトリに保存する際には、秘密キーフレーズによって暗号化します。", + "desc2": "認証情報ファイルは暗号化されていません。", + "desc3": "パスワードやアクセストークンといった認証情報を他人が参照できます。", + "desc4": "認証情報を公開Gitリポジトリに保存する際には、秘密キーフレーズによって暗号化します。", + "desc5": "フロー認証情報ファイルはsettingsファイルのcredentialSecretプロパティで暗号化されています。", + "desc6": "フロー認証情報ファイルはシステムが生成したキーによって暗号化されています。このプロジェクト用に新しい秘密キーを指定してください。", + "desc7": "キーはプロジェクトファイルとは別に保存されます。他のNode-REDでこのプロジェクトを利用するには、このプロジェクトのキーが必要です。", + "credentials": "認証情報", + "enable": "暗号化を有効にする", + "disable": "暗号化を無効にする", + "disabled": "無効", + "copy": "既存のキーをコピー", + "use-custom": "カスタムキーを使用", + "desc8": "認証情報ファイルが暗号化されないため、簡単に読み出すことができます。", + "create-project-files": "プロジェクト関連ファイル作成", + "create-project": "プロジェクト作成", + "already-exists": "既に存在", + "git-error": "Gitエラー", + "git-auth-error": "Git認証エラー" + }, + "create-success": { + "success": "最初のプロジェクトの作成が成功しました!", + "desc0": "以降は、これまでと同様にNode-REDを利用できます。", + "desc1": "サイドバーの「情報」タブに現在選択されたプロジェクトを表示します。プロジェクト名の隣のボタンでプロジェクト設定画面を呼び出すことができます。", + "desc2": "サイドバーの「履歴」タブで変更が加えられたプロジェクト内のファイルを確認しコミットできます。このサイドバーでは、全てのコミット履歴を確認し、変更を外部リポジトリにプッシュすることが可能です。" + }, + "create": { + "projects": "プロジェクト", + "already-exists": "プロジェクトは既に存在します", + "must-contain": "A-Z 0-9 _ - のみ指定可能", + "no-info-in-url": "URLにユーザ名/パスワードを含めないようにしてください", + "open": "プロジェクトを開く", + "create": "プロジェクトを作成", + "clone": "プロジェクトをクローン", + "project-name": "プロジェクト名", + "desc": "説明", + "opt": "任意", + "flow-file": "フローファイル", + "credentials": "認証情報", + "enable-encryption": "暗号化を有効にする", + "disable-encryption": "暗号化を無効にする", + "encryption-key": "暗号化キー", + "desc0": "認証情報をセキュアにするためのフレーズ", + "desc1": "認証情報ファイルが暗号化されないため、簡単に読み出すことができます", + "git-url": "GitリポジトリのURL", + "protocols": "https://, ssh:// もしくは file://", + "auth-failed": "認証に失敗しました", + "username": "ユーザ名", + "password": "パスワード", + "ssh-key": "SSHキー", + "passphrase": "パスフレーズ", + "desc2": "SSHでリポジトリをクローンする前にSSHキーを追加してください。", + "add-ssh-key": "SSHキーの追加", + "credentials-encryption-key": "認証情報の暗号化キー", + "already-exists-2": "既に存在します", + "git-error": "Gitエラー", + "con-failed": "接続に失敗しました", + "not-git": "Gitリポジトリではありません", + "no-resource": "リポジトリが見つかりません", + "cant-get-ssh-key-path": "エラー! 選択したSSHキーのパスを取得できません。", + "unexpected_error": "予期しないエラー" + }, + "delete": { + "confirm": "プロジェクトを削除しても良いですか?" + }, + "create-project-list": { + "search": "プロジェクトを検索", + "current": "有効" + }, + "require-clean": { + "confirm": "
デプロイされていない変更は失われます。
続けますか?
" + }, + "send-req": { + "auth-req": "リポジトリに対する認証が必要です", + "username": "ユーザ名", + "password": "パスワード", + "passphrase": "パスフレーズ", + "retry": "リトライ", + "update-failed": "認証の更新に失敗しました", + "unhandled": "エラー応答が処理されませんでした" + }, + "create-branch-list": { + "invalid": "不正なブランチ", + "create": "ブランチの作成", + "current": "有効" + }, + "create-default-file-set": { + "no-active": "有効なプロジェクトが無い場合、デフォルトのファイル群を作成できません。", + "no-empty": "デフォルトのファイル群を空でないプロジェクトに作成することはできません。", + "git-error": "Gitエラー" + }, + "errors": { + "no-username-email": "Gitクライアントのユーザ名/emailが設定されていません。", + "unexpected": "予期しないエラーが発生しました", + "code": "コード" + } + }, + "editor-tab": { + "properties": "プロパティ", + "envProperties": "環境変数", + "description": "説明", + "appearance": "外観", + "preview": "UIプレビュー", + "defaultValue": "デフォルト値" + }, + "languages": { + "de": "ドイツ語", + "en-US": "英語", + "ja": "日本語", + "ko": "韓国語", + "zh-CN": "中国語(簡体)", + "zh-TW": "中国語(繁体)" + } +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/ja/infotips.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ja/infotips.json new file mode 100644 index 0000000..45ba845 --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ja/infotips.json @@ -0,0 +1,23 @@ +{ + "info": { + "tip0": "選択したノードや接続を {{core:delete-selection}} により、削除できます。", + "tip1": "{{core:search}} で、フロー内のノードを検索できます。", + "tip2": "{{core:toggle-sidebar}} で、サイドバーの表示/非表示の切り替えができます。", + "tip3": "{{core:manage-palette}} で「パレットの管理」が表示されます。", + "tip4": "フロー内の「ノードの設定」は、サイドバーに一覧表示できます。メニューから呼び出すか {{core:show-config-tab}} を入力してください。", + "tip5": "設定により、ヒントの表示/非表示を変更できます。", + "tip6": "[left] [up] [down] [right] で選択したノードを移動できます。[shift] を押すと移動量が大きくなります。", + "tip7": "ノードを接続の上へドラッグすると、接続内にノードを挿入できます。", + "tip8": "選択したノードやタブ内のフローをJSONデータとして書き出すには {{core:show-export-dialog}} を押してください。", + "tip9": "フローデータが入ったJSONファイルをエディタへドラッグ、または {{core:show-import-dialog}} により、フローを読み込むことができます。", + "tip10": "ノードの端子に複数の接続がある時、[shift] を押しながら [click] しドラッグすることで、複数の接続をまとめて他のノードの端子へ移動できます。", + "tip11": "{{core:show-info-tab}} で「情報」タブを表示します。 {{core:show-debug-tab}} で「デバッグ」タブを表示します。", + "tip12": "[ctrl] を押しながらワークスペースを [click] すると、ノードのダイアログが表示され、素早くノードを追加できます。", + "tip13": "[ctrl] を押しながらノードの端子や後続のノードを [click] すると、複数のノードを素早く接続できます。", + "tip14": "[shift] を押しながらノードを [click] すると、接続された全てのノードを選択できます。", + "tip15": "[ctrl] を押しながらノードを [click] すると、選択/非選択を切り替えできます。", + "tip16": "{{core:show-previous-tab}} や {{core:show-next-tab}} で、タブの切り替えができます。", + "tip17": "ノードのプロバティ設定画面にて {{core:confirm-edit-tray}} を押すと、変更を確定できます。また、 {{core:cancel-edit-tray}} を押すと、変更を取り消せます。", + "tip18": "ノードを選択し、 {{core:edit-selected-node}} を押すとプロパティ設定画面が表示されます。" + } +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/ja/jsonata.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ja/jsonata.json new file mode 100644 index 0000000..659cf66 --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ja/jsonata.json @@ -0,0 +1,270 @@ +{ + "$string": { + "args": "arg[, prettify]", + "desc": "以下の型変換ルールを用いて、引数 *arg* を文字列へ型変換します。:\n\n - 文字列は変換しません。\n - 関数は空の文字列に変換します。\n - JSONの数値として表現できないため、無限大やNaNはエラーになります。\n - 他の値は `JSON.stringify` 関数を用いて、JSONの文字列へ変換します。`prettify`が真の場合、JSONを整形出力します。フィールドを1行毎に出力。フィールドのネスト深さによってインデントを行います。" + }, + "$length": { + "args": "str", + "desc": "文字列 `str` の文字数を返します。 `str` が文字列でない場合、エラーを返します。" + }, + "$substring": { + "args": "str, start[, length]", + "desc": "位置 `start` (ゼロオフセット)から開始する引数 `str` の文字列を返します。 `length` を指定した場合、部分文字列は最大 `length` 文字を持ちます。 `start` が負の値の場合、その値は `str` の末尾からの文字数を指します。" + }, + "$substringBefore": { + "args": "str, chars", + "desc": "`str` 内で先頭に存在する文字列 `chars` より前の部分文字列を返します。 `str` が `chars` を持たない場合、 `str` を返します。" + }, + "$substringAfter": { + "args": "str, chars", + "desc": "`str` 内で先頭に存在する文字列 `chars` より後ろの部分文字列を返します。 `str` が `chars` を持たない場合、 `str` を返します。" + }, + "$uppercase": { + "args": "str", + "desc": "`str` の全ての文字を大文字にした文字列を返します。" + }, + "$lowercase": { + "args": "str", + "desc": "`str` の全ての文字を小文字にした文字列を返します。" + }, + "$trim": { + "args": "str", + "desc": "以下のステップを適用して `str` 内の全ての空白文字を取り除き、正規化します。\n\n - 全てのタブ、キャリッジリターン、ラインフィードを空白に置き換える。\n- 連続する空白を1つの空白に減らす。\n- 末尾と先頭の空白を削除する。\n\n `str` を指定しない場合(例: 本関数を引数なしで呼び出す)、コンテキスト値を `str` の値として使用します。 `str` が文字列でない場合、エラーになります。" + }, + "$contains": { + "args": "str, pattern", + "desc": "`str` が `pattern` とマッチした場合は `true` 、マッチしない場合は `false` を返します。 `str` を指定しない場合(例: 本関数を1つの引数で呼び出す)、コンテキスト値を `str` の値として使用します。引数 `pattern` は文字列や正規表現とすることができます。" + }, + "$split": { + "args": "str[, separator][, limit]", + "desc": "引数 `str` を分割し、部分文字列の配列にします。 `str` が文字列でない場合、エラーになります。省略可能な引数 `separator` には `str` を分割する文字を文字列または正規表現で指定します。 `separator` を指定しない場合、空の文字列と見なし、 `str` は1文字ずつから成る配列に分割します。 `separator` が文字列でない場合、エラーになります。省略可能な引数 `limit` には、結果の配列が持つ部分文字列の最大数を指定します。この数を超える部分文字列は破棄されます。 `limit` を指定しない場合、 `str` は結果の配列のサイズに上限なく完全に分割されます。 `limit` が負の値の場合、エラーになります。" + }, + "$join": { + "args": "array[, separator]", + "desc": "文字列の配列を、省略可能な引数 `separator` で区切った1つの文字列へ連結します。配列 `array` が文字列でない要素を含む場合、エラーになります。 `separator` を指定しない場合、空の文字列と見なします(例: 文字列間の `separator` なし)。 `separator` が文字列でない場合、エラーになります。" + }, + "$match": { + "args": "str, pattern [, limit]", + "desc": "文字列 `str` に対して正規表現 `pattern` を適用し、オブジェクトの配列を返します。配列要素のオブジェクトは `str` のうちマッチした部分の情報を保持します。" + }, + "$replace": { + "args": "str, pattern, replacement [, limit]", + "desc": "文字列 `str` からパターン `pattern` を検索し、置換文字列 `replacement` に置き換えます。\n\n任意の引数 `limit` には、置換回数の上限値を指定します。" + }, + "$now": { + "args": "", + "desc": "ISO 8601互換形式の時刻を生成し、文字列として返します。" + }, + "$base64encode": { + "args": "string", + "desc": "ASCII形式の文字列をBase 64形式へ変換します。文字列内の各文字は、バイナリデータのバイト値として扱われます。文字列内の文字は、URIエンコードした文字列も含め、0x00から0xFFの範囲である必要があります。範囲外のユニコードの文字はサポートされません。" + }, + "$base64decode": { + "args": "string", + "desc": "UTF-8のコードページを用いて、Base 64形式のバイト値を文字列に変換します。" + }, + "$number": { + "args": "arg", + "desc": "以下の型変換ルールを用いて、引数 `arg` を数値へ変換します。:\n\n - 数値は、変換しません。\n - 正しいJSONの数値を表す文字列は、数値に変換します。\n - 他の形式の値は、エラーになります。" + }, + "$abs": { + "args": "number", + "desc": "引数 `number` の絶対値を返します。" + }, + "$floor": { + "args": "number", + "desc": "`number` の値を `number` 以下の最も近い整数値へ切り捨てた値を返します。" + }, + "$ceil": { + "args": "number", + "desc": "`number` の値を `number` 以上の最も近い整数値へ切り上げた値を返します。" + }, + "$round": { + "args": "number [, precision]", + "desc": "引数 `number` の値を四捨五入した値を返します。任意の引数 `precision` には、四捨五入で用いる小数点以下の桁数を指定します。" + }, + "$power": { + "args": "base, exponent", + "desc": "基数 `base` を指数 `exponent` 分、累乗した値を返します。" + }, + "$sqrt": { + "args": "number", + "desc": "引数 `number` の平方根を返します。" + }, + "$random": { + "args": "", + "desc": "0以上、1未満の疑似乱数を返します。" + }, + "$millis": { + "args": "", + "desc": "Unixエポック(1 January, 1970 UTC)からの経過ミリ秒を数値として返します。評価対象式に含まれる `$millis()` の呼び出しは、全て同じ値を返します。" + }, + "$sum": { + "args": "array", + "desc": "数値の配列 `array` の合計値を返します。 `array` が数値でない要素を含む場合、エラーになります。" + }, + "$max": { + "args": "array", + "desc": "数値の配列 `array` 内の最大値を返します。 `array` が数値でない要素を含む場合、エラーになります。" + }, + "$min": { + "args": "array", + "desc": "数値の配列 `array` 内の最小値を返します。 `array` が数値でない要素を含む場合、エラーになります。" + }, + "$average": { + "args": "array", + "desc": "数値の配列 `array` の平均値を返します。 `array` が数値でない要素を含む場合、エラーになります。" + }, + "$boolean": { + "args": "arg", + "desc": "以下のルールを用いて、ブーリアン型へ型変換します。:\n\n - `Boolean` : 変換しない\n - `string`: 空 : `false`\n - `string`: 空でない : `true`\n - `number`: `0` : `false`\n - `number`: 0でない : `true`\n - `null` : `false`\n - `array`: 空 : `false`\n - `array`: `true` に型変換された要素を持つ: `true`\n - `array`: 全ての要素が `false` に型変換: `false`\n - `object`: 空 : `false`\n - `object`: 空でない : `true`\n - `function` : `false`" + }, + "$not": { + "args": "arg", + "desc": "引数の否定をブーリアン型で返します。 `arg` は最初にブーリアン型に型変換されます。" + }, + "$exists": { + "args": "arg", + "desc": "`arg` の式の評価値が存在する場合は `true` 、式の評価結果が未定義の場合(例: 存在しない参照フィールドへのパス)は `false` を返します。" + }, + "$count": { + "args": "array", + "desc": "配列の要素数を返します。" + }, + "$append": { + "args": "array, array", + "desc": "2つの配列を連結します。" + }, + "$sort": { + "args": "array [, function]", + "desc": "配列 `array` 内の値を並び変えた配列を返します。\n\n比較関数 `function` を用いる場合、比較関数は以下のとおり2つの引数を持つ必要があります。\n\n`function(left, right)`\n\n比較関数は、leftとrightの2つの値を比較するために、値を並び替える処理で呼び出されます。もし、求められる並び順にてleftの値をrightの値より後ろに置きたい場合は、比較関数は置き換えを表すブーリアン型の `true` を返す必要があります。一方、置き換えが不要の場合は `false` を返す必要があります。" + }, + "$reverse": { + "args": "array", + "desc": "配列 `array` の値を、逆順にした配列を返します。" + }, + "$shuffle": { + "args": "array", + "desc": "配列 `array` の値を、ランダムな順番にした配列を返します。" + }, + "$zip": { + "args": "array, ...", + "desc": "配列 `array1` … `arrayN` の位置 0, 1, 2.... の値を要素とする配列から成る配列を返します。" + }, + "$keys": { + "args": "object", + "desc": "オブジェクト内のキーを含む配列を返します。引数がオブジェクトの配列の場合、返す配列は全オブジェクトの全キーの重複の無いリストとなります。" + }, + "$lookup": { + "args": "object, key", + "desc": "オブジェクト内のキーが持つ値を返します。最初の引数がオブジェクトの配列の場合、配列内の全てのオブジェクトを検索し、存在する全てのキーが持つ値を返します。" + }, + "$spread": { + "args": "object", + "desc": "key/valueのペアを持つオブジェクトを、各要素が1つのkey/valueのペアを持つオブジェクトの配列に分割します。引数がオブジェクトの配列の場合、結果の配列は各オブジェクトから得た各key/valueのペアのオブジェクトを持ちます。" + }, + "$merge": { + "args": "array<object>", + "desc": "`object` の配列を1つの `object` へマージします。 マージ結果のオブジェクトは入力配列内の各オブジェクトのkey/valueペアを含みます。入力のオブジェクトが同じキーを持つ場合、戻り値の `object` には配列の最後のオブジェクトのkey/value値が格納されます。入力の配列がオブジェクトでない要素を含む場合、エラーとなります。" + }, + "$sift": { + "args": "object, function", + "desc": "引数 `object` が持つkey/valueのペアのうち、関数 `function` によってふるい分けたオブジェクトのみを返します。\n\n関数 `function` は、以下の引数を持つ必要があります。\n\n`function(value [, key [, object]])`" + }, + "$each": { + "args": "object, function", + "desc": "`object` の各key/valueのペアに対して、関数 `function` を適用し、その返却値から成る配列を返します。" + }, + "$map": { + "args": "array, function", + "desc": "配列 `array` 内の各値に対して、関数 `function` を適用した結果から成る配列を返します。\n\n関数 `function` は、以下の引数を持つ必要があります。\n\n`function(value [, index [, array]])`" + }, + "$filter": { + "args": "array, function", + "desc": "配列 `array` 内の値のうち、関数 `function` の条件を満たす値のみを持つ配列を返します。\n\n関数 `function` は、以下の引数を持つ必要があります。\n\n`function(value [, index [, array]])`" + }, + "$reduce": { + "args": "array, function [, init]", + "desc": "配列の各要素値に関数 `function` を連続的に適用して得られる集約値を返します。 `function` の適用の際には、直前の `function` の適用結果と要素値が引数として与えられます。\n\n関数 `function` は引数を2つ取り、配列の各要素の間に配置する中置演算子のように作用しなくてはなりません。関数`function`のシグネチャは`myfunc($accumulator, $value[, $index[, $array]])`という形式でなければなりません。\n\n任意の引数 `init` には、集約時の初期値を設定します。" + }, + "$flowContext": { + "args": "string", + "desc": "フローコンテキストのプロパティを取得します。" + }, + "$globalContext": { + "args": "string", + "desc": "グローバルコンテキストのプロパティを取得します。" + }, + "$pad": { + "args": "string, width [, char]", + "desc": "文字数が引数 `width` の絶対値以上となるよう、必要に応じて追加文字を付け足した `string` のコピーを返します。\n\n`width` が正の値の場合、文字列の右側に追加文字を付け足します。もし負の値の場合、文字列の左側に追加文字を付け足します。\n\n任意の引数 `char` には、本関数で用いる追加文字を指定します。もし追加文字を指定しない場合は、既定値として空白文字を使用します。" + }, + "$fromMillis": { + "args": "number", + "desc": "Unixエポック(1 January, 1970 UTC)からの経過ミリ秒を表す数値を、ISO 8601形式のタイムスタンプの文字列に変換します。" + }, + "$formatNumber": { + "args": "number, picture [, options]", + "desc": "`number` を文字列へ変換し、文字列 `picture` に指定した数値表現になるよう書式を変更します。\n\nこの関数の動作は、XPath F&O 3.1の仕様に定義されているXPath/XQuery関数のfn:format-numberの動作と同じです。引数の文字列 picture は、fn:format-numberと同じ構文で数値の書式を定義します。\n\n任意の第三引数 `options` は、小数点記号の様な既定のロケール固有の書式設定文字を上書きするために使用します。この引数を指定する場合、XPath F&O 3.1の仕様の数値形式の項に記述されているname/valueペアを含むオブジェクトでなければなりません。" + }, + "$formatBase": { + "args": "number [, radix]", + "desc": "`number` を引数 `radix` に指定した値を基数とした形式の文字列に変換します。 `radix` が指定されていない場合、基数10を既定値として設定します。 `radix` には2~36の値を設定でき、それ以外の値の場合はエラーになります。" + }, + "$toMillis": { + "args": "timestamp", + "desc": "ISO 8601形式の文字列 `timestamp` を、Unixエポック(1 January, 1970 UTC)からの経過ミリ秒を表す数値へ変換します。 文字列が正しい形式でない場合、エラーとなります。" + }, + "$env": { + "args": "arg", + "desc": "環境変数の値を返します。\n\n本関数はNode-REDの定義関数です。" + }, + "$eval": { + "args": "expr [, context]", + "desc": "JSONリテラルもしくはJSONata式を表す`expr`を評価します。評価の際には現在のコンテキストをコンテキストとして用います。" + }, + "$formatInteger": { + "args": "number, picture", + "desc": "`number`を`picture`指定に従って文字列に変換します。`picture`文字列は数値の変換方法をXPath F&O 3.1仕様の`fn:format-integer`に従って定義します。" + }, + "$parseInteger": { + "args": "string, picture", + "desc": "`picture`文字列の指定に従って、`string`パラメータを整数(JSON数値)に変換します。`picture`文字列は`$formatInteger`と同じ形式です。" + }, + "$error": { + "args": "[str]", + "desc": "メッセージを指定して例外を送出します。メッセージ`str`を省略した場合は`$error() function evaluated`をメッセージとします。" + }, + "$assert": { + "args": "arg, str", + "desc": "`arg`が真の場合、undefinedを返します。偽の場合、`str`をメッセージとする例外を送出します。" + }, + "$single": { + "args": "array, function", + "desc": "`array`の要素のうち、条件判定関数`function`を満たす(`function`に与えた場合に真偽値`true`を返す)要素が1つのみである場合、それを返します。マッチする要素が1つのみでない場合、例外を送出します。\n\n指定する関数は`function(value [, index [, array]])`というシグネチャでなければなりません。ここで、`value`は`array`の要素値、`index`は要素の添字、第三引数には配列全体を渡します。" + }, + "$encodeUrl": { + "args": "str", + "desc": "Uniform Resource Locator (URL)を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`" + }, + "$encodeUrlComponent": { + "args": "str", + "desc": "Uniform Resource Locator (URL)要素を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`" + }, + "$decodeUrl": { + "args": "str", + "desc": "encodeUrlComponentで置換したUniform Resource Locator (URL)をデコードします。\n\n例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`" + }, + "$decodeUrlComponent": { + "args": "str", + "desc": "encodeUrlで置換したUniform Resource Locator (URL)要素をデコードします。 \n\n例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`" + }, + "$distinct": { + "args": "array", + "desc": "配列`array`から重複要素を削除した配列を返します。" + }, + "$type": { + "args": "value", + "desc": "`value` の型を文字列として返します。もし `value` が未定義の場合、 `undefined` が返されます。" + } +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/ko/editor.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ko/editor.json new file mode 100644 index 0000000..099050d --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ko/editor.json @@ -0,0 +1,900 @@ +{ + "common": { + "label": { + "name": "이름", + "ok": "확인", + "done": "완료", + "cancel": "취소", + "delete": "삭제", + "close": "닫기", + "load": "열기", + "save": "저장", + "import": "가져오기", + "export": "내보내기", + "back": "뒤로", + "next": "앞으로", + "clone": "프로젝트 복제", + "cont": "계속하기" + } + }, + "workspace": { + "defaultName": "플로우 __number__", + "editFlow": "플로우 수정 : __name__", + "confirmDelete": "삭제 확인", + "delete": "정말로 '__label__' 을(를) 삭제하시겠습니까?", + "dropFlowHere": "플로우를 이곳에 가져오세요", + "addFlow": "플로우 추가", + "status": "상태", + "enabled": "사용가능", + "disabled": "사용불가능", + "info": "상세내역" + }, + "menu": { + "label": { + "view": { + "view": "창", + "grid": "눈금선", + "showGrid": "눈금선 보이기", + "snapGrid": "노드 배치 보조 켜기", + "gridSize": "눈금선 크기", + "textDir": "텍스트 방향", + "defaultDir": "기본", + "ltr": "왼쪽 -> 오른쪽", + "rtl": "오른쪽 -> 왼쪽", + "auto": "자동배분" + }, + "sidebar": { + "show": "우측사이드바 보이기" + }, + "palette": { + "show": "팔렛트 보이기" + }, + "settings": "설정", + "userSettings": "사용자 설정", + "nodes": "노드설정", + "displayStatus": "노드상태 보이기", + "displayConfig": "설정노드 보기", + "import": "가져오기", + "export": "내보내기", + "search": "플로우 겅색", + "searchInput": "플로우 검색", + "subflows": "보조 플로우", + "createSubflow": "보조 플로우 생성", + "selectionToSubflow": "보조 플로우 선택", + "flows": "플로우", + "add": "추가", + "rename": "이름변경", + "delete": "삭제", + "keyboardShortcuts": "단축키", + "login": "로그인", + "logout": "로그아웃", + "editPalette": "팔렛트 관리", + "other": "기타", + "showTips": "Tip 보기", + "help": "Node-RED 웹사이트", + "projects": "프로젝트", + "projects-new": "신규", + "projects-open": "열기", + "projects-settings": "프로젝트 설정", + "showNodeLabelDefault": "새로 추가된 노드의 라벨 보이기" + } + }, + "actions": { + "toggle-navigator": "네비게이터 표시/비표시", + "zoom-out": "축소하기", + "zoom-reset": "확대/축소 초기화", + "zoom-in": "확대하기" + }, + "user": { + "loggedInAs": "__name__ 에 로그인됨", + "username": "사용자명", + "password": "비밀번호", + "login": "로그인", + "loginFailed": "로그인 실패", + "notAuthorized": "권한이 없습니다", + "errors": { + "settings": "로그인 후 설정이 가능합니다", + "deploy": "로그인 후 배포가 가능합니다", + "notAuthorized": "이 기능은 로그인 후 사용가능합니다" + } + }, + "notification": { + "warning": "경고: __message__", + "warnings": { + "undeployedChanges": "변경사항 배포가 취소되었습니다", + "nodeActionDisabled": "노드 실행이 비활성화 되었습니다", + "nodeActionDisabledSubflow": "보조 플로우에서 노드 실행이 비활성화 되었습니다", + "missing-types": "타입이 없는 노드로인해 플로우가 중지되었습니다
", + "safe-mode": "[안전모드] 플로우가 정지되었습니다.
플로우의 수정과 배포가 가능합니다. 다시 배포버튼을 누르세요.
", + "restartRequired": "업그레이드한 모듈을 유효화하기 위해 Node-RED를 재시작 합니다 ", + "credentials_load_failed": "인증정보 복호화에 실패하여 플로우가 멈췄습니다.
인증정보는 암호화 되어있습니다. 프로젝트의 암호화 키가 깨졌거나 정상적이지 않습니다.
", + "credentials_load_failed_reset": "인증정보를 복호화할 수 없습니다
인증정보는 암호화 되어있습니다. 프로젝트의 암호화 키가 깨졌거나 정상적이지 않습니다.
다음 배포시 플로우의 인증정보는 초기화 될것입니다. 기존 모든 플로우의 인증정보가 지워집니다.
", + "missing_flow_file": "프로젝트 플로우 파일을 찾을 수 없습니다
프로젝트의 플로우 파일이 설정되지 않았습니다
", + "missing_package_file": "프로젝트 패키지 파일을 찾을 수 없습니다
프로젝트의 package.json 파일이 없습니다
", + "project_empty": "프로젝트가 누락되어 있습니다.
기본 프로젝트 파일을 만드시겠습니까?
그렇지 않으면 수동으로 편집가 외부에 프로젝트 파일을 만드셔야 합니다.
'__project__' 가 없습니다.
", + "git_merge_conflict": "변경사항 자동병합에 실패했습니다.
병합되지 않은 충돌을 수정 후 재등록 하세요.
" + }, + "error": "에러: __message__", + "errors": { + "lostConnection": "서버와 연결이 끊어졌습니다. 재접속을 시도합니다 ...", + "lostConnectionReconnect": "서버와 연결이 끊어졌습니다. __time__ 초 안에 재접속을 시도합니다.", + "lostConnectionTry": "지금 재접속", + "cannotAddSubflowToItself": "서브플로우 자기자신을 추가할 수 없습니다", + "cannotAddCircularReference": "순환참조가 발견되었습니다. 서브플로우를 추가할 수 없습니다", + "unsupportedVersion": "지원하지 않는 Node.js를 사용하고 있습니다
Node.js LTS 버전을 사용해 주세요
", + "failedToAppendNode": "'__module__' 읽어오기 실패
__error__
" + }, + "project": { + "change-branch": "로컬지점으로 '__project__' 변경", + "merge-abort": "Git 병합을 중지했습니다.", + "loaded": "'__project__' 프로젝트를 열었습니다", + "updated": "'__project__'가 변경 되었습니다", + "pull": "'__project__'를 다시 가져왔습니다", + "revert": "'__project__'를 취소했습니다", + "merge-complete": "Git 병합이 완료되었습니다" + }, + "label": { + "manage-project-dep": "프로젝트 의존성 관리", + "setup-cred": "인증정보 설정", + "setup-project": "프로젝트 파일 설정", + "create-default-package": "기본 패키지 파일 생성", + "no-thanks": "괜찮습니다", + "create-default-project": "기본 프로젝트 파일 생성", + "show-merge-conflicts": "병합 충돌 보여주기" + } + }, + "clipboard": { + "clipboard": "클립보드", + "nodes": "노드", + "node": "__count__ 개의 노드", + "node_plural": "__count__ 개의 노드", + "configNode": "__count__ 개의 설정 노드", + "configNode_plural": "__count__ 개의 설정 노드", + "flow": "__count__ 개의 플로우", + "flow_plural": "__count__ 개의 플로우", + "subflow": "__count__ 개의 서브 플로우", + "subflow_plural": "__count__ 개의 서브 플로우", + "pasteNodes": "여기에 노드를 붙여넣기 하세요", + "selectFile": "불러올 파일을 선택하세요", + "importNodes": "노드 불러오기", + "exportNodes": "클립보드에 노드 내보내기", + "download": "다운로드", + "importUnrecognised": "알 수 없는 형식 :", + "importUnrecognised_plural": "알 수 없는 형식 :", + "nodesExported": "클립보드에 노드 내보내기", + "nodesImported": "불러오기 : ", + "nodeCopied": "__count__개의 노드가 복사 되었습니다", + "nodeCopied_plural": "__count__개의 노드가 복사 되었습니다", + "invalidFlow": "정상적지 않은 플로우 : __message__", + "export": { + "selected": "선택된 노드", + "current": "현재 플로우", + "all": "모든 플로우", + "compact": "압축형식", + "formatted": "서식유지", + "copy": "클립보드로 내보내기" + }, + "import": { + "import": "가져올 위치 : ", + "newFlow": "새로운 플로우", + "errors": { + "notArray": "입력이 JSON 배열이 아닙니다", + "itemNotObject": "입력이 올바른 플로우가 아닙니다 - __index__는 노드 오브젝트가 아닙니다", + "missingId": "입력이 올바른 플로우가 아닙니다 - __index__의 'id' 속성이 없습니다", + "missingType": "입력이 올바른 플로우가 아닙니다 - __index__의 'type' 속성이 없습니다" + } + }, + "copyMessagePath": "Path가 복사 되었습니다", + "copyMessageValue": "Value가 복사 되었습니다", + "copyMessageValue_truncated": "Truncated value가 복사 되었습니다" + }, + "deploy": { + "deploy": "배포하기", + "full": "전체", + "fullDesc": "작업공간 내 모든 플로우를 배포합니다", + "modifiedFlows": "변경된 플로우", + "modifiedFlowsDesc": "변경사항이 있는 플로우만 배포합니다", + "modifiedNodes": "변경된 노드", + "modifiedNodesDesc": "변경사항이 있는 노드만 배포합니다", + "restartFlows": "플로우 재시작", + "restartFlowsDesc": "현재 배포된 플로우를 재시작합니다", + "successfulDeploy": "배포가 성공했습니다", + "successfulRestart": "플로우 재시작을 성공했습니다", + "deployFailed": "배포 실패 : __message__", + "unusedConfigNodes": "사용되지 않는 설정노드가 있습니다", + "unusedConfigNodesLink": "여기를 클릭하면 볼 수 있습니다", + "errors": { + "noResponse": "서버의 응답이 없습니다" + }, + "confirm": { + "button": { + "ignore": "무시", + "confirm": "배포 확인", + "review": "변경사항 보기", + "cancel": "취소", + "merge": "병합", + "overwrite": "무시하고 배포하기" + }, + "undeployedChanges": "배포되지 않은 변경사항이 있습니다.\n\n이 페이지를 떠나면 변경사항이 사라집니다", + "improperlyConfigured": "작업공간에 올바르게 구성되지 않은 노드가 있습니다 :", + "unknown": "작업공간에 알려지지 않는 노드타입이 있습니다 :", + "confirm": "배포하시겠습니까?", + "doNotWarn": "이 경고를 무시", + "conflict": "서버가 최신 플로우를 사용중입니다", + "backgroundUpdate": "플로우가 변경되었습니다", + "conflictChecking": "변경사항이 자동으로 병합될 수 있는지 확인", + "conflictAutoMerge": "변경사항에 충돌이 없습니다. 자동병합이 가능합니다", + "conflictManualMerge": "변경사항에 충돌이 있습니다. 배포하기 전에 충돌을 해결하세요", + "plusNMore": "+ __count__ 개 더보기" + } + }, + "eventLog": { + "title": "이벤트 로그", + "view": "로그 보기" + }, + "diff": { + "unresolvedCount": "__count__개의 충돌이 해결되지 않음", + "unresolvedCount_plural": "__count__개의 충돌이 해결되지 않음", + "globalNodes": "Global 노드", + "flowProperties": "플로우 속성", + "type": { + "added": "추가됨", + "changed": "변경됨", + "unchanged": "변경없음", + "deleted": "삭제됨", + "flowDeleted": "플로우 삭제됨", + "flowAdded": "플로우 추가됨", + "movedTo": "__id__로 이동됨", + "movedFrom": "__id__로 부터 이동됨" + }, + "nodeCount": "__count__ 개의 노드", + "nodeCount_plural": "__count__ 개의 노드", + "local": "로컬 변경사항", + "remote": "원격 변경사항", + "reviewChanges": "변경사항 살펴보기", + "noBinaryFileShowed": "바이너리파일 내용을 볼수 없습니다", + "viewCommitDiff": "변경사항 보기", + "compareChanges": "변경사항 비교", + "saveConflict": "충돌 해결내용 저장", + "conflictHeader": "__unresolved__ 개 중 __resolved__ 충돌이 해결됨", + "commonVersionError": "Common Version의 JSON 형식이 올바르지 않습니다 :", + "oldVersionError": "Old Version의 JSON 형식이 올바르지 않습니다 :", + "newVersionError": "New Version의 JSON 형식이 올바르지 않습니다 :" + }, + "subflow": { + "editSubflow": "플로우 템플릿 수정 : __name__", + "edit": "플로우 템플릿 수정", + "subflowInstances": "서브 플로우 템플릿에 __count__개의 인스턴스가 있습니다", + "subflowInstances_plural": "서브 플로우 템플릿에 __count__개의 인스턴스가 있습니다", + "editSubflowProperties": "속성 수정", + "input": "입력:", + "output": "출력:", + "deleteSubflow": "서브 플로우 삭제", + "info": "상세내역", + "category": "카테고리", + "errors": { + "noNodesSelected": "서브 플로우를 생성할 수 없습니다 : 노드가 선택되지 않았습니다", + "multipleInputsToSelection": "서브 플로우를 생성할 수 없습니다 : 복수의 입력이 선택되었습니다" + } + }, + "editor": { + "configEdit": "수정", + "configAdd": "추가", + "configUpdate": "변경", + "configDelete": "삭제", + "nodesUse": "__count__개의 노드가 이 설정을 사용중입니다", + "nodesUse_plural": "__count__개의 노드가 이 설정을 사용중입니다", + "addNewConfig": "__type__의 설정노드 추가", + "editNode": "__type__의 노드 수정", + "editConfig": "__type__의 설정노드 수정", + "addNewType": "__type__의 노드타입 추가 ...", + "nodeProperties": "노드 속성", + "label": "명칭", + "portLabels": "포트 설정", + "labelInputs": "입력", + "labelOutputs": "출력", + "settingIcon": "아이콘", + "noDefaultLabel": "없음", + "defaultLabel": "기본 명칭", + "searchIcons": "아이콘 조회", + "useDefault": "기본설정 사용", + "description": "상세 내역", + "show": "보이기", + "hide": "숨기기", + "errors": { + "scopeChange": "범위를 변경하게 되면 다른 플로우의 노드가 사용이 불가능해 집니다." + } + }, + "keyboard": { + "title": "키보드 단축키", + "keyboard": "키보드", + "filterActions": "필터", + "shortcut": "단축키", + "scope": "범위", + "unassigned": "미할당", + "global": "글로벌", + "workspace": "작업공간", + "selectAll": "모든 노드 선택", + "selectAllConnected": "모든 연결된 노드 선택", + "addRemoveNode": "노드 추가/삭제", + "editSelected": "선택된 노드 수정", + "deleteSelected": "선택된 노드나 링크를 삭제", + "importNode": "노드 불러오기", + "exportNode": "노드 내보내기", + "nudgeNode": "선택된 노드 이동 (1px)", + "moveNode": "선택된 노드 이동 (20px)", + "toggleSidebar": "사이드바 표시/비표시", + "togglePalette": "팔렛트 표시/비표시", + "copyNode": "선택된 노드 복사", + "cutNode": "선택된 노드 잘라내기", + "pasteNode": "노드 붙여넣기", + "undoChange": "마지막 변경 되돌리기", + "searchBox": "검색창 열기", + "managePalette": "팔렛트 관리" + }, + "library": { + "library": "라이브러리", + "openLibrary": "라이브러리 열기...", + "saveToLibrary": "라이브러리로 저장...", + "typeLibrary": "__type__ 라이브러리", + "unnamedType": "이름없는 __type__", + "dialogSaveOverwrite": "__libraryType__이 __libraryName__으로 이미 등록되어있습니다. 덮어쓸까요?", + "invalidFilename": "파일명이 올바르지 않습니다", + "savedNodes": "저장된 노드", + "savedType": "저장된 __type__", + "saveFailed": "저장 실패 : __message__", + "types": { + "examples": "예시" + } + }, + "palette": { + "noInfo": "정보 없음", + "filter": "필터", + "search": "모듈 검색", + "addCategory": "추가 ...", + "label": { + "subflows": "서브 플로우", + "input": "입력", + "output": "출력", + "function": "기능", + "social": "소셜", + "storage": "저장", + "analysis": "분석", + "advanced": "그 외" + }, + "actions": { + "collapse-all": "모든 카테고리 접기", + "expand-all": "모든 카테고리 펼치기" + }, + "event": { + "nodeAdded": "팔렛트에 노드가 추가되었습니다:", + "nodeAdded_plural": "팔렛트에 노드가 추가되었습니다:", + "nodeRemoved": "팔렛트에서 노드가 삭제되었습니다:", + "nodeRemoved_plural": "팔렛트에서 노드가 삭제되었습니다:", + "nodeEnabled": "노드가 활성화 되었습니다:", + "nodeEnabled_plural": "노드가 활성화 되었습니다:", + "nodeDisabled": "노드가 비활성화 되었습니다:", + "nodeDisabled_plural": "노드가 비활성화 되었습니다:", + "nodeUpgraded": "__module__ 노드모듈이 __version__으로 업그레이드 되었습니다" + }, + "editor": { + "title": "팔렛트 관리", + "palette": "팔렛트", + "times": { + "seconds": "몇초 전", + "minutes": "몇분 전", + "minutesV": "__count__분 전", + "hoursV": "__count__시간 전", + "hoursV_plural": "__count__시간 전", + "daysV": "__count__일 전", + "daysV_plural": "__count__일 전", + "weeksV": "__count__주 전", + "weeksV_plural": "__count__주 전", + "monthsV": "__count__달 전", + "monthsV_plural": "__count__달 전", + "yearsV": "__count__년 전", + "yearsV_plural": "__count__년 전", + "yearMonthsV": "__y__년, __count__월 전", + "yearMonthsV_plural": "__y__년, __count__월 전", + "yearsMonthsV": "__y__년, __count__월 전", + "yearsMonthsV_plural": "__y__년, __count__월 전" + }, + "nodeCount": "__label__ 개의 노드", + "nodeCount_plural": "__label__ 개의 노드", + "moduleCount": "__count__ 개의 모듈 사용가능", + "moduleCount_plural": "__count__ 개의 모듈 사용가능", + "inuse": "사용중", + "enableall": "모두 활성화", + "disableall": "모두 비활성화", + "enable": "활성화", + "disable": "비활성화", + "remove": "삭제", + "update": "__version__으로 업데이트", + "updated": "업데이트 됨", + "install": "설치", + "installed": "설치됨", + "conflict": "충돌", + "conflictTip": "노드타입이 이미 설치 되어 있습니다.
/p>
충돌모듈 : __module__
노드 카탈로그를 설치하지 못했습니다.
브라우저 콘솔로그를 참고하세요.
", + "installFailed": "설치 실패 : __module__
__message__
브라우저 콘솔로그를 참고하세요.
", + "removeFailed": "삭제 실패 : __module__
__message__
브라우저 콘솔로그를 참고하세요.
", + "updateFailed": "업데이트 실패 : __module__
__message__
브라우저 콘솔로그를 참고하세요.
", + "enableFailed": "활성화 실패 : __module__
__message__
브라우저 콘솔로그를 참고하세요.
", + "disableFailed": "비활성화 실패 : __module__
__message__
브라우저 콘솔로그를 참고하세요.
" + }, + "confirm": { + "install": { + "body": "'__module__' 설치중
설치하기 전 노드 설명서를 읽으세요. 어떤 노드은 의존성이 자동으로 해결되지 않거나, Node-RED의 재시작이 필요할 수 있습니다.
", + "title": "노드 설치" + }, + "remove": { + "body": "'__module__' 삭제중
Node-RED에서 노드를 제거합니다. Node-RED가 재시작되기까지 리소스가 계속 사용될 수도 있습니다.
", + "title": "노드 삭제" + }, + "update": { + "body": "'__module__' 업데이트중
업데이트 반영을 위해 Node-RED를 수동으로 재시작해야 할 경우도 있습니다.
", + "title": "노드 변경" + }, + "cannotUpdate": { + "body": "이 노드에 대한 업데이트가 있지만, 팔레트 관리자가 변경할 수 있는 위치에 설치되지 않았습니다.원격저장소의 변경사항을 가져올 수 없습니다, 당신의 unstaged 로컬 변경사항을 덮어씁니다.
변경사항을 적용하고 다시 시도하세요
", + "showUnstagedChanges": "unstaged 변경사항 보여주기", + "connectionFailed": "원격저장소 연결 불가 : ", + "pullUnrelatedHistory": "원격저장소에 연관없는 커밋 기록이 있습니다.
모든 변경사항을 로컬 저장소로 가져 오시겠습니까?
", + "pullChanges": "Pull 변경사항", + "history": "이력", + "projectHistory": "프로젝트 이력", + "daysAgo": "__count__일 전", + "daysAgo_plural": "__count__일 전", + "hoursAgo": "__count__시간 전", + "hoursAgo_plural": "__count__시간 전", + "minsAgo": "__count__분 전", + "minsAgo_plural": "__count__분 전", + "secondsAgo": "몇초 전", + "notTracking": "당신의 로컬 브랜치는 원격브랜치를 트래킹하고 있지 않습니다", + "statusUnmergedChanged": "당신의 저장소는 병합되지 않은 변경사항을 가지고 있습니다. 충돌을 수정하고 결과를 커밋하세요", + "repositoryUpToDate": "당신의 저장소는 최신상태 입니다", + "commitsAhead": "당신의 저장소가 원격지보다 __count__ 커밋을 앞서 있습니다. 이제 커밋 할 수 있습니다.", + "commitsAhead_plural": "당신의 저장소가 원격지보다 __count__ 커밋을 앞서 있습니다. 지금 커밋할 수 있습니다.", + "commitsBehind": "당신의 저장소가 원격지보다 __count__ 커밋이 늦습니다. 이제 pull 할 수 있습니다.", + "commitsBehind_plural": "당신의 저장소가 원격지보다 __count__ 커밋이 늦습니다. 이제 pull 할 수 있습니다.", + "commitsAheadAndBehind1": "당신의 저장소가 __count__ 커밋이 늦고, ", + "commitsAheadAndBehind1_plural": "당신의 저장소가 __count__ 커밋이 늦고 ", + "commitsAheadAndBehind2": "__count__ 커밋이 원격지보다 앞서 있습니다. ", + "commitsAheadAndBehind2_plural": "__count__ 커밋이 원격지보다 앞서 있습니다.", + "commitsAheadAndBehind3": "push하기전에 리모트 저장소에서 pull을 먼저 수행하세요.", + "commitsAheadAndBehind3_plural": "push하기전에 리모트 저장소에서 pull을 먼저 수행하세요.", + "refreshCommitHistory": "커밋 기록 새로고침", + "refreshChanges": "변경사항 새로고침" + } + } + }, + "typedInput": { + "type": { + "str": "string", + "num": "number", + "re": "regular expression", + "bool": "boolean", + "json": "JSON", + "bin": "buffer", + "date": "timestamp", + "jsonata": "expression", + "env": "env variable" + } + }, + "editableList": { + "add": "추가" + }, + "search": { + "empty": "결과 없음", + "addNode": "노드 추가 ..." + }, + "expressionEditor": { + "functions": "기능", + "functionReference": "기능 참조", + "insert": "삽입", + "title": "JSONata 형식 에디터", + "test": "테스트", + "data": "예제 메세지", + "result": "결과", + "format": "형식", + "compatMode": "호환모드 사용", + "compatModeDesc": " 입력된 형식은 msg
를 참조하고 있어, 호환모드로 평가합니다. 이 모드는 후에 폐지될 예정이니, msg
를 사용하지 않도록 해 주시길 바랍니다.
JSONata를 Node-RED에서 처음 지원했을 때에는 msg
오브젝트의 참조가 필요했습니다. 예를 들어 msg.payload
는 payload를 참고하기 위해 사용되었습니다.
직접 메시지에 대하여 식을 평가하도록 되었기에, 이 형식은 사용할 수 없게 됩니다. payload를 참조하려면 단순히 payload
로 지정해 주십시오.
버퍼타입은 byet값의 JSON배열로 저장됩니다. 이 에디터는 입력된 값을 JSON 배열로 구문분석 합니다. 만약 유효한 JSON이 아닌경우 UTF-8 문자열로 처리되어 각 문자코드 번호의 배열로 변환됩니다.
예를들어 Hello World
라는 값은 다음의 JSON 배열로 변환됩니다.
[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]" + }, + "projects": { + "config-git": "Git client 설정", + "welcome": { + "hello": "안녕하세요. Node-RED에서 프로젝트 기능을 이용할 수 있게 되었습니다.", + "desc0": "플로우 파일을 관리하는 새로운 방법이며, 버전을 관리할 수 도 있습니다.", + "desc1": "무선 프로젝트를 작성하거나 기존의 Git저장소에서 프로젝트를 복제할 수 있습니다.", + "desc2": "이 기능을 건너뛰어도 상관없습니다. 언제든지 프로젝트 메뉴에서 첫번째 프로젝트를 만들 수 있습니다.", + "create": "프로젝트 생성", + "clone": "프로젝트 복제", + "not-right-now": "나중에" + }, + "git-config": { + "setup": "버전관리 클라이언트를 설정합니다", + "desc0": "Node-RED는 오픈소스 Git로 버전관리를 할 수 있습니다. 프로젝트 파일의 변경사항을 추적하고 원격저장소로 push할 수 있습니다.", + "desc1": "당신이 변경사항을 커밋하면 git은 누가 변경사항을 만들었는지 사용자명과 이메일 정보를 기록합니다. 사용자명은 꼭 당신의 실명일 필요는 없습니다.", + "desc2": "당신의 Git 클라이언트는 아래와 같이 이미 설정되었습니다.", + "desc3": "당신은 git config의 설정탭에서 설정을 변경할 수 있습니다.", + "username": "사용자명", + "email": "이메일" + }, + "project-details": { + "create": "프로젝트 생성", + "desc0": "프로젝트는 Git 저장소로 관리되어집니다. 다른 사람과 협업하거나 공유하기 쉬워집니다.", + "desc1": "당신은 여러 개의 프로젝트를 생성할 수 있고 에디터에서 프로젝트를 선택할 수 있습니다.", + "desc2": "시작하려면 프로젝트 이름과 프로젝트의 상세설명이 필요합니다.", + "already-exists": "프로젝트가 이미 존재합니다", + "must-contain": "A-Z 0-9 _ -의 문자만 사용이 가능합니다", + "project-name": "프로젝트명", + "desc": "상세설명", + "opt": "옵션" + }, + "clone-project": { + "clone": "프로젝트 복제", + "desc0": "프로젝트가 있는 저장소를 가지고 있다면, 즉시 복제하여 사용할 수 있습니다.", + "already-exists": "프로젝트가 이미 존재합니다", + "must-contain": "A-Z 0-9 _ -의 문자만 사용이 가능합니다", + "project-name": "프로젝트명", + "no-info-in-url": "URL안에 사용자아이디/비밀번호를 사용하지 마세요", + "git-url": "Git 저장소 URL", + "protocols": "https://, ssh:// 혹은 file://", + "auth-failed": "인증 실패", + "username": "사용자명", + "passwd": "패스워드", + "ssh-key": "SSH키", + "passphrase": "패스워드", + "ssh-key-desc": "저장소를 복제하기 전에 접속을 위해 SSH키를 먼저 추가하세요.", + "ssh-key-add": "ssh키 추가", + "credential-key": "인증 암호화 키", + "cant-get-ssh-key": "에러! 선택한 SSH키 경로를 가져올 수 없습니다", + "already-exists2": "이미 존재합니다", + "git-error": "git 에러", + "connection-failed": "접속 실패", + "not-git-repo": "Git저장소가 아닙니다", + "repo-not-found": "저장소가 없습니다" + }, + "default-files": { + "create": "프로젝트 파일 생성", + "desc0": "프로젝트는 당신의 플로우, README, package.json 파일을 포함합니다.", + "desc1": "Git 저장소에서 관리하고 싶은 다른 파일들을 포함할 수 있습니다.", + "desc2": "당신이 이미 가지고 있는 flow, 자격증명파일이 프로젝트로 복사될 것입니다.", + "flow-file": "플로우 파일", + "credentials-file": "자격증명 파일" + }, + "encryption-config": { + "setup": "자격인증 파일의 암호화 설정", + "desc0": "플로우의 자격인증 파일 암호화를 통해 내용을 안전하게 유지할 수 있습니다.", + "desc1": "자격증명을 공용 Git저장소에 저장하려면 비밀키 구문을 제공하여 암호화 해야 합니다", + "desc2": "당신의 플로우 자격인증 파일은 암호화 되어 있지 않습니다.", + "desc3": "즉, 암호 및 액세스 토큰과 같은 내용을 파일에 액세스 할 수있는 모든 사람이 열람할 수 있습니다.", + "desc4": "자격증명을 공용 Git저장소에 저장하려면 비밀키 구문을 제공하여 암호화 해야 합니다", + "desc5": "당신의 플로우 자격증명파일은 setting파일의 credentialSecret속성으로 암호화되어 있습니다.", + "desc6": "당신의 플로우 자격증명파일은 시스템이 생성된 키에 의해 암호화 되어있습니다. 이 프로젝트용 새로운 비밀키를 지정해 주세요.", + "desc7": "키는 프로젝트파일과는 별개로 보존됩니다. 다른 Node-RED에서 이 프로젝트를 이용하려면 이 프로젝트의 키가 필요합니다.", + "credentials": "자격인증", + "enable": "암호화 활성화", + "disable": "암호화 비활성화", + "disabled": "비활성화됨", + "copy": "기존 키를 복사", + "use-custom": "커스텀키 사용", + "desc8": "자격증명 파일이 암호화되어 있지 않아, 간단히 해당내용이 열람될 수 있습니다.", + "create-project-files": "프로젝트 생성", + "create-project": "프로젝트 생성", + "already-exists": "이미 존재합니다.", + "git-error": "git 에러", + "git-auth-error": "git 인증 에러" + }, + "create-success": { + "success": "당신의 첫번째 프로젝트 생성이 성공하였습니다.", + "desc0": "앞으로 이와 같이 Node-RED를 사용할 수 있습니다.", + "desc1": "사이드바의 '정보'탭은 현재 활성화된 프로젝트를 보여줍니다. 이름 옆에 있는 버틀을 사용하여 프로젝트 설정화면을 불러올 수 있습니다.", + "desc2": "사이드바의 '이력'탭은 프로젝트의 변경된 파일을 확인하고 커밋할 수 있습니다. 커밋의 전체 기록을 보여주고 변경사항을 원격 저장소에 push할 수 있습니다." + }, + "create": { + "projects": "프로젝트", + "already-exists": "프로젝트가 이미 존재합니다", + "must-contain": "A-Z 0-9 _ -의 문자만 사용이 가능합니다", + "no-info-in-url": "URL안에 사용자아이디/비밀번호를 사용하지 마세요", + "open": "프로젝트 열기", + "create": "프로젝트 생성", + "clone": "프로젝트 복제", + "project-name": "프로젝트명", + "desc": "상세내역", + "opt": "옵션", + "flow-file": "플로우 파일", + "credentials": "자격증명", + "enable-encryption": "암호화 활성화", + "disable-encryption": "암호화 비활성화", + "encryption-key": "암호화 키", + "desc0": "자격증명 정보를 안전하게 하는 문구", + "desc1": "자격증명 파일이 암호화되어 있지 않아, 간단히 해당내용이 열람될 수 있습니다.", + "git-url": "Git 저장소 URL", + "protocols": "https://, ssh:// 혹은 file://", + "auth-failed": "인증 실패", + "username": "사용자명", + "password": "패스워드", + "ssh-key": "SSH키", + "passphrase": "패스워드", + "desc2": "저장소를 복제하기 전에 접속을 위해 SSH키를 먼저 추가하세요.", + "add-ssh-key": "ssh키 추가", + "credentials-encryption-key": "자격인증 암호화 키", + "already-exists-2": "이미 존재합니다", + "git-error": "git 에러", + "con-failed": "접속 실패", + "not-git": "git 저장소가 아닙니다", + "no-resource": "저장소아 없습니다", + "cant-get-ssh-key-path": "에러! 선택한 SSH키 경로를 가져올 수 없습니다.", + "unexpected_error": "예기치 않은 에러" + }, + "delete": { + "confirm": "프로젝트를 정말 지우시겠습니까?" + }, + "create-project-list": { + "search": "프로젝트 검색", + "current": "현재" + }, + "require-clean": { + "confirm": "
변경사항을 배포하지 않아 내용이 손실될 수 있습니다.
계속 할까요?
" + }, + "send-req": { + "auth-req": "저장소에 대한 인증이 필요합니다.", + "username": "사용자명", + "password": "패스워드", + "passphrase": "패스워드", + "retry": "재시도", + "update-failed": "인증 변경 실패", + "unhandled": "오류 응답 미처리" + }, + "create-branch-list": { + "invalid": "올바르지 않은 브랜치", + "create": "브랜치 생성", + "current": "현재" + }, + "create-default-file-set": { + "no-active": "활성화된 프로젝트 없이 기본 파일을 만들 수 없습니다.", + "no-empty": "비어있지 않은 프로젝트에 기본 파일을 만들 수 없습니다.", + "git-error": "git 에러" + }, + "errors": { + "no-username-email": "당신의 Git 클라이언트에 사용자명/이메일이 설정되지 않았습니다.", + "unexpected": "예기치 않은 에러가 발생했습니다.", + "code": "코드" + } + }, + "editor-tab": { + "properties": "속성", + "description": "상세 내역", + "appearance": "모양" + } +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/ko/infotips.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ko/infotips.json new file mode 100644 index 0000000..c6b399c --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ko/infotips.json @@ -0,0 +1,23 @@ +{ + "info": { + "tip0": "{{core:delete-selection}}를 사용하여 선택된 노드나 링크를 삭제할 수 있습니다.", + "tip1": "{{core:search}}를 활용하여 노드를 검색할 수 있습니다.", + "tip2": "{{core:toggle-sidebar}}를 사용하여 사이드바를 표시/비표시 전환 할 수 있습니다.", + "tip3": "{{core:manage-palette}}를 사용하여 노드 팔레트를 관리 할 수 있습니다.", + "tip4": "플로우 안의 설정노드가 사이드바에 표시됩니다. 메뉴 혹은 {{core:show-config-tab}}를 사용하여 엑세스 할 수 있습니다.", + "tip5": "설정에서 이 팁을 활성화/비활성화 할 수 있습니다.", + "tip6": "[left] [up] [down] [right] 키를 사용하여 선택된 노드를 움직일 수 있습니다. [shift]키를 누른 채로 움직이면 이동폭이 늘어납니다.", + "tip7": "노드를 와이어 사이로 드래그 하여 연결할 수도 있습니다.", + "tip8": "{{core:show-export-dialog}}를 사용하여 선택한 노드 또는 현재탭을 내보낼 수 있습니다.", + "tip9": "JSON파일을 에디터로 드래그하거나 {{core:show-import-dialog}}를 사용하여 플로우 가져올 수 있습니다.", + "tip10": "[shift] [click] 하고서 드래그하여 선택한 와이어를 이동할 수 있습니다.", + "tip11": "{{core:show-info-tab}}를 사용하여 정보탭을 표시하거나 {{core:show-debug-tab}}를 사용하여 디버그탭을 표시할 수 있습니다.", + "tip12": "작업공간에서 [ctrl] [click]을 사용하여 빠른추가 대회상자를 열 수 있습니다.", + "tip13": "[ctrl]을 누른 상태로 노드의 포트를 클릭하여 빠르게 연결할 수 있습니다.", + "tip14": "[shift]를 누른 상태로 노드를 클릭하여 연결된 모든 노드를 선택할 수 있습니다.", + "tip15": "[ctrl]을 누른 상태로 노드를 클릭하여 현재 선택영역에 노드를 추가/제거 할 수 있습니다.", + "tip16": "{{core:show-previous-tab}}와 {{core:show-next-tab}}를 사용하여 탭을 전환할 수 있습니다.", + "tip17": "노드 편집 창에서 {{core : confirm-edit-tray}}로 변경 사항을 확인하거나 {{core : cancel-edit-tray}}로 취소 할 수 있습니다.", + "tip18": "{{core : edit-selected-node}}를 누르면 현재 선택 영역의 첫 번째 노드가 편집됩니다." + } +} \ No newline at end of file diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/ko/jsonata.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ko/jsonata.json new file mode 100644 index 0000000..8b28518 --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/ko/jsonata.json @@ -0,0 +1,222 @@ +{ + "$string": { + "args": "arg", + "desc": "다음과 같은 규칙을 사용하여 인수 *arg*를 문자열로 변환합니다. \n\n - 문자열은 변경되지 않습니다. \n - 함수는 빈 문자열로 변환됩니다. \n - 무한대와 NaN은 JSON수치로 표현할 수 없기 때문에 오류처리 됩니다. \n - 다른 모든 값은 `JSON.stringify` 함수를 사용하여 JSON 문자열로 변환됩니다." + }, + "$length": { + "args": "str", + "desc": "문자열 `str`의 문자 수를 반환합니다. `str`가 문자열이 아닌 경우 에러를 반환합니다." + }, + "$substring": { + "args": "str, start[, length]", + "desc": "(zero-offset)의 `start`에서 시작하는 첫번째 인수 `str`의 문자열을 반환합니다. 만약 `length`가 지정된 경우, 부분 문자열은 최대 `length`의 크기를 갖습니다. 만약 `start` 인수가 음수이면 `str`의 끝에서부터의 문자수를 나타냅니다." + }, + "$substringBefore": { + "args": "str, chars", + "desc": "`str`에 `chars`문자가 처음으로 나오기 전까지의 부분문자열을 반환합니다. 만약 `chars`가 없으면 `str`을 반환합니다." + }, + "$substringAfter": { + "args": "str, chars", + "desc": "`str`에 `chars`문자가 처음으로 나온 이후의 부분문자열을 반환합니다. 만약 `chars`가 없으면 `str`을 반환합니다." + }, + "$uppercase": { + "args": "str", + "desc": "`str`의 문자를 대문자로 반환합니다." + }, + "$lowercase": { + "args": "str", + "desc": "`str`의 문자를 소문자로 반환합니다." + }, + "$trim": { + "args": "str", + "desc": "다음의 순서대로 `str`의 모든 공백을 자르고 정규화 합니다:\n\n - 모든 탭, 캐리지 리턴 및 줄 바꿈은 공백으로 대체됩니다. \n- 연속된 공백은 하나로 줄입니다.\n- 후행 및 선행 공백은 삭제됩니다.\n\n 만일 `str`이 지정되지 않으면 (예: 이 함수를 인수없이 호출), context값을 `str`의 값으로 사용합니다. `str`이 문자열이 아니면 에러가 발생합니다." + }, + "$contains": { + "args": "str, pattern", + "desc": "`str`이 `pattern`과 일치하면 `true`를, 일치하지 않으면 `false`를 반환합니다. 만약 `str`이 지정되지 않으면 (예: 이 함수를 인수없이 호출), context값을 `str`의 값으로 사용합니다. `pattern` 인수는 문자열이나 정규표현으로 할 수 있습니다." + }, + "$split": { + "args": "str[, separator][, limit]", + "desc": "`str`인수를 분할하여 부분문자열로 배열합니다. `str`이 문자열이 아니면 에러가 발생합니다. 생략가능한 인수 `separator`는 `str`을 분할하는 문자를 문자열 또는 정규표현으로 지정합니다. `separator`를 지정하지 않은 경우, 공백의 문자열로 간주하여 `str`은 단일 문자의 배열로 분리됩니다. `separator`가 문자열이 아니면 에러가 발생합니다. 생략가능한 인수 'limit`는 결과의 배열이 갖는 부분문자열의 최대수를 지정합니다. 이 수를 넘는 부분문자열은 파기됩니다. `limit`가 지정되지 않으면`str`은 결과 배열의 크기의 제한없이 완전히 분리됩니다. `limit`이 음수인 경우 에러가 발생합니다." + }, + "$join": { + "args": "array[, separator]", + "desc": "문자열의 배열을 생략가능한 인수 `separator`로 구분한 하나의 문자열로 연결합니다. 배열 `array`가 문자열이 아닌 요소를 포함하는 경우, 에러가 발생합니다. `separator`를 지정하지 않은 경우, 공백의 문자열로 간주합니다(예: 문자열간의 `separator`없음). `separator`가 문자열이 아닌 경우, 에러가 발생합니다." + }, + "$match": { + "args": "str, pattern [, limit]", + "desc": "`str`문자열에 `pattern`를 적용하여, 오브젝트 배열을 반환합니다. 배열요소의 오브젝트는 `str`중 일치하는 부분의 정보를 보유합니다." + }, + "$replace": { + "args": "str, pattern, replacement [, limit]", + "desc": "`str`문자열에서 `pattern` 패턴을 검색하여, `replacement`로 대체합니다.\n\n임의이ㅡ 인수 `limit`는 대체 횟수의 상한값을 지정합니다." + }, + "$now": { + "args": "", + "desc": "ISO 8601 호환 형식으로 타임 스탬프를 생성하고 이를 문자열로 반환합니다." + }, + "$base64encode": { + "args": "string", + "desc": "ASCII 문자열을 base 64 표현으로 변환합니다. 문자열의 각 문자는 이진 데이터의 바이트로 처리됩니다. 이렇게 하려면 문자열의 모든 문자가 URI로 인코딩 된 문자열을 포함하고, 0x00에서 0xFF 범위에 있어야합니다. 해당 범위를 벗어난 유니 코드 문자는 지원되지 않습니다" + }, + "$base64decode": { + "args": "string", + "desc": "UTF-8코드페이지를 이용하여, Base 64형식의 바이트값을 문자열로 변환합니다." + }, + "$number": { + "args": "arg", + "desc": "`arg`를 다음과 같은 규칙을 사요하여 숫자로 변환합니다. :\n\n - 숫자는 변경되지 않습니다.\n – 올바른 JSON의 숫자는 숫자 그대로 변환됩니다.\n – 그 외의 형식은 에러를 발생합니다." + }, + "$abs": { + "args": "number", + "desc": "`number`의 절대값을 반환합니다." + }, + "$floor": { + "args": "number", + "desc": "`number`를 `number`보다 같거나 작은 정수로 내림하여 반환합니다." + }, + "$ceil": { + "args": "number", + "desc": "`number`를 `number`와 같거나 큰 정수로 올림하여 반환합니다." + }, + "$round": { + "args": "number [, precision]", + "desc": "인수 `number`를 반올림한 값을 반환합니다. 임의의 인수 `precision`에는 반올립에서 사용할 소수점이하의 자릿수를 지정합니다." + }, + "$power": { + "args": "base, exponent", + "desc": "기수 `base`의 값을 지수 `exponent`만큼의 거듭 제곱으로 반환합니다." + }, + "$sqrt": { + "args": "number", + "desc": "인수 `number`의 제곱근을 반환합니다." + }, + "$random": { + "args": "", + "desc": "0이상 1미만의 의사난수를 반환합니다." + }, + "$millis": { + "args": "", + "desc": "Unix Epoch (1970 년 1 월 1 일 UTC)부터 경과된 밀리 초 수를 숫자로 반환합니다. 평가대상식에 포함되는 $millis()의 모든 호출은 모두 같은 값을 반환합니다." + }, + "$sum": { + "args": "array", + "desc": "숫자 배열 `array`의 합계를 반환합니다. `array`에 숫자가 아닌 요소가 있는 경우, 에러가 발생합니다." + }, + "$max": { + "args": "array", + "desc": "숫자 배열 `array`에서 최대값을 반환합니다. `array`에 숫자가 아닌 요소가 있는 경우, 에러가 발생합니다." + }, + "$min": { + "args": "array", + "desc": "숫자 배열 `array`에서 최소값을 반환합니다. `array`에 숫자가 아닌 요소가 있는 경우, 에러가 발생합니다." + }, + "$average": { + "args": "array", + "desc": "숫자 배열 `array`에서 평균값을 반환합니다. `array`에 숫자가 아닌 요소가 있는 경우, 에러가 발생합니다." + }, + "$boolean": { + "args": "arg", + "desc": "`arg` 값을 다음의 규칙에 의해 Boolean으로 변환합니다::\n\n - `Boolean` : 변환하지 않음\n - `string`: 비어있음 : `false`\n - `string`: 비어있지 않음 : `true`\n - `number`: `0` : `false`\n - `number`: 0이 아님 : `true`\n - `null` : `false`\n - `array`: 비어있음 : `false`\n - `array`: `true`로 변환된 요소를 가짐 : `true`\n - `array`: 모든 요소가 `false`로 변환 : `false`\n - `object`: 비어있음 : `false`\n - `object`: 비어있지 않음 : `true`\n - `function` : `false`" + }, + "$not": { + "args": "arg", + "desc": "인수의 부정을 Boolean으로 변환합니다. `arg`는 가장먼저boolean으로 변환됩니다." + }, + "$exists": { + "args": "arg", + "desc": "`arg` 식의 평가값이 존재하는 경우 `true`, 식의 평가결과가 미정의인 경우 (예: 존재하지 않는 참조필드로의 경로)는 `false`를 반환합니다." + }, + "$count": { + "args": "array", + "desc": "`array`의 요소 갯수를 반환합니다." + }, + "$append": { + "args": "array, array", + "desc": "두개의 `array`를 병합합니다." + }, + "$sort": { + "args": "array [, function]", + "desc": "배열 `array`의 모든 값을 순서대로 정렬하여 반환합니다. \n\n 비교함수 `function`을 이용하는 경우, 비교함수는 아래와 같은 두개의 인수를 가져야 합니다. \n\n `function(left,right)` \n\n 비교함수는 left와 right의 두개의 값을 비교하기에, 값을 정렬하는 처리에서 호출됩니다. 만약 요구되는 정렬에서 left값을 right값보다 뒤로 두고싶은 경우에는, 비교함수는 치환을 나타내는 Boolean형의 ``true`를, 그렇지 않은 경우에는 `false`를 반환해야 합니다." + }, + "$reverse": { + "args": "array", + "desc": "`array`에 포함된 모든 값의 순서를 역순으로 변환하여 반환합니다." + }, + "$shuffle": { + "args": "array", + "desc": "`array`에 포함된 모든 값의 순서를 랜덤으로 반환합니다." + }, + "$zip": { + "args": "array, ...", + "desc": "배열 `array1` ... arrayN`의 위치 0, 1, 2…. 의 값으로 구성된 convolved (zipped) 배열을 반환합니다." + }, + "$keys": { + "args": "object", + "desc": "`object` 키를 포함하는 배열을 반환합니다. 인수가 오브젝트의 배열이면 반환되는 배열은 모든 오브젝트에있는 모든 키의 중복되지 않은 목록이 됩니다." + }, + "$lookup": { + "args": "object, key", + "desc": "`object` 내의 `key`가 갖는 값을 반환합니다. 최초의 인수가 객체의 배열 인 경우, 배열 내의 모든 오브젝트를 검색하여, 존재하는 모든 키가 갖는 값을 반환합니다." + }, + "$spread": { + "args": "object", + "desc": "`object`의 키/값 쌍별로 각 요소가 하나인 오브젝트 배열로 분할합니다. 만일 오브젝트 배열인 경우, 배열의 결과는 각 오브젝트에서 얻은 키/값 쌍의 오브젝트를 갖습니다." + }, + "$merge": { + "args": "array<object>", + "desc": "`object`배열을 하나의 `object`로 병합합니다. 병합결과의 오브젝트는 입력배열내의 각 오브젝트의 키/값 쌍을 포함합니다. 입력 오브젝트가 같은 키를 가질경우, 반환 된 `object`에는 배열 마지막의 오브젝트의 키/값이 격납됩니다. 입력 배열이 오브젝트가 아닌 요소를 포함하는 경우, 에러가 발생합니다." + }, + "$sift": { + "args": "object, function", + "desc": "함수 `function`을 충족시키는 `object` 인수 키/값 쌍만 포함하는 오브젝트를 반환합니다. \n\n 함수 `function` 다음과 같은 인수를 가져야 합니다 : \n\n `function(value [, key [, object]])`" + }, + "$each": { + "args": "object, function", + "desc": "`object`의 각 키/값 쌍에, 함수`function`을 적용한 값의 배열을 반환합니다." + }, + "$map": { + "args": "array, function", + "desc": "`array`의 각 값에 `function`을 적용한 결과로 이루어진 배열을 반환합니다. \n\n 함수 `function`은 다음과 같은 인수를 가져야 합니다. \n\n `function(value[, index[, array]])`" + }, + "$filter": { + "args": "array, function", + "desc": "`array`의 값중, 함수 `function`의 조건을 만족하는 값으로 이루어진 배열을 반환합니다. \n\n 함수 `function`은 다음과 같은 형식을 가져야 합니다. \n\n `function(value[, index[, array]])`" + }, + "$reduce": { + "args": "array, function [, init]", + "desc": "배열의 각 요소값에 함수 `function`을 연속적으로 적용하여 얻어지는 집계값을 반환합니다. `function`의 적용에는 직전의 `function`의 적용결과와 요소값이 인수로 주어집니다. \n\n 함수 `function`은 인수를 두개 뽑아, 배열의 각 요소 사이에 배치하는 중치연산자처럼 작용해야 합니다. \n\n 임의의 인수 `init`에는 집약시의 초기값을 설정합니다." + }, + "$flowContext": { + "args": "string[, string]", + "desc": "플로우 컨텍스트 속성을 취득합니다." + }, + "$globalContext": { + "args": "string[, string]", + "desc": "플로우의 글로벌 컨텍스트 속성을 취득합니다." + }, + "$pad": { + "args": "string, width [, char]", + "desc": "문자수가 인수 `width`의 절대값이상이 되도록, 필요한 경우 여분의 패딩을 사용하여 `string`의 복사본을 반환합니다. \n\n `width`가 양수인 경우, 오른쪽으로 채워지고, 음수이면 왼쪽으로 채워집니다. \n\n 임의의 `char`인수에는 이 함수에서 사용할 패딩을 지정합니다. 지정하지 않는 경우에는, 기본값으로 공백을 사용합니다." + }, + "$fromMillis": { + "args": "number", + "desc": "Unix Epoch (1970 년 1 월 1 일 UTC) 이후의 밀리 초를 나타내는 숫자를 ISO 8601 형식의 타임 스탬프 문자열로 변환합니다." + }, + "$formatNumber": { + "args": "number, picture [, options]", + "desc": "`number`를 문자열로 변환하고 `picture` 문자열에 지정된 표현으로 서식을 변경합니다. \n\n 이 함수의 동작은 XPath F&O 3.1사양에 정의된 XPath/XQuery함수의 fn:format-number의 동작과 같습니다. 인수의 문자열 picture은 fn:format-number 과 같은 구문으로 수치의 서식을 정의합니다. \n\n 임의의 제3 인수 `option`은 소수점기호와 같은 기본 로케일 고유의 서식설정문자를 덮어쓰는데에 사용됩니다. 이 인수를 지정할 경우, XPath F&O 3.1사양의 수치형식에 기술되어있는 name/value 쌍을 포함하는 오브젝트여야 합니다." + }, + "$formatBase": { + "args": "number [, radix]", + "desc": "`number`를 인수 `radix`에 지정한 값을 기수로하는 문자열로 변환합니다. `radix`가 지정되지 않은 경우, 기수 10이 기본값으로 설정됩니다. `radix`에는 2~36의 값을 설정할 수 있고, 그 외의 값의 경우에는 에러가 발생합니다." + }, + "$toMillis": { + "args": "timestamp", + "desc": "ISO 8601 형식의 `timestamp`를 Unix Epoch (1970 년 1 월 1 일 UTC) 이후의 밀리 초 수로 변환합니다. 문자열이 올바른 형식이 아닌 경우 에러가 발생합니다." + }, + "$env": { + "args": "arg", + "desc": "환경변수를 값으로 반환합니다.\n\n 이 함수는 Node-RED 정의 함수입니다." + } +} \ No newline at end of file diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json new file mode 100644 index 0000000..95d3fa5 --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json @@ -0,0 +1,1014 @@ +{ + "common": { + "label": { + "name": "姓名", + "ok": "确认", + "done": "完成", + "cancel": "取消", + "delete": "删除", + "close": "关闭", + "load": "读取", + "save": "保存", + "import": "导入", + "export": "导出", + "back": "后退", + "next": "下一个", + "clone": "克隆项目", + "cont": "继续" + }, + "type": { + "string": "字符串", + "number": "数字", + "boolean": "布尔值", + "array": "数组", + "buffer": "buffer", + "object": "对象", + "jsonString": "JSON字符串", + "undefined": "未定义", + "null": "空" + } + }, + "workspace": { + "defaultName": "流程__number__", + "editFlow": "编辑流程: __name__", + "confirmDelete": "确认删除", + "delete": "你确定想删除 '__label__'?", + "dropFlowHere": "把流程放到这里", + "addFlow": "添加流程", + "listFlows": "流程一览", + "status": "状态", + "enabled": "有效", + "disabled": "无效", + "info": "详细描述", + "selectNodes": "点击节点来选择" + }, + "menu": { + "label": { + "view": { + "view": "显示", + "grid": "网格", + "showGrid": "显示网格", + "snapGrid": "对齐网格", + "gridSize": "网格尺寸", + "textDir": "文本方向", + "defaultDir": "默认方向", + "ltr": "从左到右", + "rtl": "从右到左", + "auto": "上下文", + "language": "语言", + "browserDefault": "浏览器默认" + }, + "sidebar": { + "show": "显示侧边栏" + }, + "palette": { + "show": "显示控制板" + }, + "settings": "设置", + "userSettings": "用户设置", + "nodes": "节点", + "displayStatus": "显示节点状态", + "displayConfig": "修改节点配置", + "import": "导入", + "export": "导出", + "search": "查找流程", + "searchInput": "查找流程", + "subflows": "子流程", + "createSubflow": "新建子流程", + "selectionToSubflow": "将选择部分更改为子流程", + "flows": "流程", + "add": "增加", + "rename": "重命名", + "delete": "删除", + "keyboardShortcuts": "键盘快捷方式", + "login": "登陆", + "logout": "退出", + "editPalette": "节点管理", + "other": "其他", + "showTips": "显示小提示", + "help": "Node-RED网页", + "projects": "项目", + "projects-new": "新建", + "projects-open": "打开", + "projects-settings": "项目设定", + "showNodeLabelDefault": "显示新添加的节点的标签" + } + }, + "actions": { + "toggle-navigator": "切换导航器", + "zoom-out": "缩小", + "zoom-reset": "重设缩放", + "zoom-in": "放大" + }, + "user": { + "loggedInAs": "作为__name__登陆", + "username": "账号", + "password": "密码", + "login": "登陆", + "loginFailed": "登陆失败", + "notAuthorized": "未授权", + "errors": { + "settings": "设置信息需要登陆后才能访问", + "deploy": "改动需要登陆后才能部署", + "notAuthorized": "此操作需要登陆后才能执行" + } + }, + "notification": { + "warning": "警告: __message__", + "warnings": { + "undeployedChanges": "节点中存在未部署的更改", + "nodeActionDisabled": "节点操作已禁用", + "nodeActionDisabledSubflow": "节点动作在子流程中被禁用", + "missing-types": "流程由于缺少节点类型而停止。请检查日志的详细信息", + "safe-mode": "流程以安全模式停止。
您可以修改流程并部署更改以重新启动。
", + "restartRequired": "Node-RED必须重新启动,以启用升级的模块", + "credentials_load_failed": "由于无法解密凭据,因此流程停止。
流程凭据文件已加密,但是项目的加密密钥丢失或无效。
", + "credentials_load_failed_reset": "凭据无法解密
流凭据文件已加密,但是项目的加密密钥丢失或无效。
流凭据文件将在下一次部署时重置。任何现有的流凭证将被清除。
", + "missing_flow_file": "找不到项目流程文件。
该项目未配置流程文件。
", + "missing_package_file": "找不到项目包文件。
项目缺少package.json文件。
", + "project_empty": "该项目为空。
是否要创建一组默认的项目文件?
否则,您将必须在编辑器外部手动将文件添加到项目中。
未找到项目'__project__'。
", + "git_merge_conflict": "自动合并更改失败。
修复未合并的冲突,然后提交结果。
" + }, + "error": "错误: __message__", + "errors": { + "lostConnection": "丢失与服务器的连接,重新连接...", + "lostConnectionReconnect": "丢失与服务器的连接,__time__秒后重新连接", + "lostConnectionTry": "现在尝试", + "cannotAddSubflowToItself": "无法向其自身添加子流程", + "cannotAddCircularReference": "无法添加子流程 - 循环引用", + "unsupportedVersion": "您正在使用不受支持的Node.js版本'__module__'加载失败
__error__
" + }, + "project": { + "change-branch": "转到本地分支'__project__'", + "merge-abort": "Git合并中止", + "loaded": "项目'__project__'已加载", + "updated": "项目'__project__'已更新", + "pull": "项目'__project__'已重新加载", + "revert": "项目 '__project__'已还原", + "merge-complete": "Git合并完成", + "setupCredentials": "设定证书", + "setupProjectFiles": "设置项目文件", + "no": "不了,谢谢", + "createDefault": "创建默认项目文件", + "mergeConflict": "显示合并冲突" + }, + "label": { + "manage-project-dep": "管理项目依赖性", + "setup-cred": "设定证书", + "setup-project": "设置项目文件", + "create-default-package": "创建默认的包文件", + "no-thanks": "不了,谢谢", + "create-default-project": "创建默认项目文件", + "show-merge-conflicts": "显示合并冲突" + } + }, + "clipboard": { + "clipboard": "剪贴板", + "nodes": "节点", + "node": "__count__节点", + "node_plural": "__count__节点", + "configNode": "__count__配置节点", + "configNode_plural": "__count__配置节点", + "flow": "__count__流程", + "flow_plural": "__count__流程", + "subflow": "__count__子流程", + "subflow_plural": "__count__子流程", + "pasteNodes": "在这里粘贴节点", + "selectFile": "选择要导入的文件", + "importNodes": "导入节点", + "exportNodes": "导出节点至剪贴板", + "download": "下载", + "importUnrecognised": "导入了无法识别的类型:", + "importUnrecognised_plural": "导入了无法识别的类型:", + "nodesExported": "节点导出到了剪贴板", + "nodesImported": "导入:", + "nodeCopied": "已复制__count__个节点", + "nodeCopied_plural": "已复制__count__个节点", + "invalidFlow": "无效的流程: __message__", + "export": { + "selected": "已选择的节点", + "current": "现在的节点", + "all": "所有流程", + "compact": "紧凑", + "formatted": "已格式化", + "copy": "导出到剪贴板", + "export": "到处到库", + "exportAs": "导出为", + "overwrite": "替换", + "exists": "\"__file__\"已存在
是否要替换它?
" + }, + "import": { + "import": "导入到", + "newFlow": "新流程", + "errors": { + "notArray": "输入的不是JSON数组", + "itemNotObject": "输入的流无效 - 项目__index__不是节点对象", + "missingId": "输入的流无效-项 __index__ 缺少'id'属性", + "missingType": "输入的流程无效-项__index__缺少'类型'属性" + } + }, + "copyMessagePath": "已复制路径", + "copyMessageValue": "已复制数值", + "copyMessageValue_truncated": "已复制舍弃的数值" + }, + "deploy": { + "deploy": "部署", + "full": "全面", + "fullDesc": "在工作区中部署所有内容", + "modifiedFlows": "已修改的流程", + "modifiedFlowsDesc": "只部署包含已更改节点的流", + "modifiedNodes": "已更改的节点", + "modifiedNodesDesc": "只部署已经更改的节点", + "restartFlows": "重启流程", + "restartFlowsDesc": "重新启动当前部署的流程", + "successfulDeploy": "部署成功", + "successfulRestart": "成功重启流程", + "deployFailed": "部署失败: __message__", + "unusedConfigNodes": "您有一些未使用的配置节点", + "unusedConfigNodesLink": "点击此处查看它们", + "errors": { + "noResponse": "服务器没有响应" + }, + "confirm": { + "button": { + "ignore": "忽略", + "confirm": "确认部署", + "review": "查看更改", + "cancel": "取消", + "merge": "合并", + "overwrite": "忽略 & 部署" + }, + "undeployedChanges": "您有未部署的更改。\n\n离开此页面将丢失这些更改。", + "improperlyConfigured": "工作区包含一些未正确配置的节点:", + "unknown": "工作区包含一些未知的节点类型:", + "confirm": "你确定要部署吗?", + "doNotWarn": "不要再对此发出警告", + "conflict": "服务器正在运行较新的一组流程。", + "backgroundUpdate": "服务器上的流程已更新。", + "conflictChecking": "检查是否可以自动合并更改", + "conflictAutoMerge": "此更改不包括冲突,可以自动合并", + "conflictManualMerge": "这些更改包括了在部署之前必须解决的冲突。", + "plusNMore": "+ __count__更多" + } + }, + "eventLog": { + "title": "事件记录日志", + "view": "查看日志" + }, + "diff": { + "unresolvedCount": "__count__个未解决的冲突", + "unresolvedCount_plural": "__count__个未解决的冲突", + "globalNodes": "全局节点", + "flowProperties": "流程属性", + "type": { + "added": "已添加", + "changed": "已更改", + "unchanged": "未更改", + "deleted": "已删除", + "flowDeleted": "已删除流程", + "flowAdded": "已添加流程", + "movedTo": "移动至__id__", + "movedFrom": "从__id__移动" + }, + "nodeCount": "__count__个节点", + "nodeCount_plural": "__count__个节点", + "local": "本地", + "remote": "远程", + "reviewChanges": "查看变更", + "noBinaryFileShowed": "无法显示二进制文件内容", + "viewCommitDiff": "查看提交更改", + "compareChanges": "比较变更", + "saveConflict": "保存冲突解决", + "conflictHeader": "已解决__unresolved__中的__resolved__个冲突", + "commonVersionError": "通用版本不包含有效的JSON:", + "oldVersionError": "旧版本不包含有效的JSON:", + "newVersionError": "新版本不包含有效的JSON:" + }, + "subflow": { + "editSubflowInstance": "编辑子流实例:__name__", + "editSubflow": "编辑流程模板: __name__", + "edit": "编辑流程模板", + "subflowInstances": "这个子流程模板有__count__个实例", + "subflowInstances_plural": "这个子流程模板有__count__个实例", + "editSubflowProperties": "编辑属性", + "input": "输入:", + "output": "输出:", + "status": "状态节点", + "deleteSubflow": "删除子流程", + "info": "详细描述", + "category": "类别", + "env": { + "restore": "恢复为默认子流", + "remove": "删除环境变量" + }, + "errors": { + "noNodesSelected": "无法创建子流程: 未选择节点", + "multipleInputsToSelection": "无法创建子流程: 多个输入到了选择" + } + }, + "editor": { + "configEdit": "编辑", + "configAdd": "添加", + "configUpdate": "更新", + "configDelete": "删除", + "nodesUse": "__count__个节点使用此配置", + "nodesUse_plural": "__count__个节点使用此配置", + "addNewConfig": "添加新的__type__配置", + "editNode": "编辑__type__节点", + "editConfig": "编辑__type__配置", + "addNewType": "添加新的__type__节点", + "nodeProperties": "节点属性", + "label": "标签", + "color": "颜色", + "portLabels": "端口标签", + "labelInputs": "输入", + "labelOutputs": "输出", + "settingIcon": "图标", + "default": "默认", + "noDefaultLabel": "无", + "defaultLabel": "使用默认标签", + "searchIcons": "搜索图标", + "useDefault": "使用默认", + "description": "描述", + "show": "显示", + "hide": "隐藏", + "locale": "选择界面语言", + "icon": "图标", + "inputType": "输入类型", + "inputs": { + "input": "输入", + "select": "选择", + "checkbox": "复选框", + "spinner": "微调器", + "none": "空", + "hidden": "隐藏属性" + }, + "types": { + "str": "字符串", + "num": "数字", + "bool": "布尔", + "json": "JSON", + "bin": "buffer", + "env": "环境变量" + }, + "menu": { + "input": "输入", + "select": "选择", + "checkbox": "复选框", + "spinner": "微调器", + "hidden": "仅标签" + }, + "select": { + "label": "标签", + "value": "值" + }, + "spinner": { + "min": "最小值", + "max": "最大值" + }, + "errors": { + "scopeChange": "更改范围将使其他流中的节点无法使用", + "invalidProperties": "无效的属性:" + } + }, + "keyboard": { + "title": "键盘快捷键", + "keyboard": "键盘", + "filterActions": "筛选动作", + "shortcut": "快捷键", + "scope": "范围", + "unassigned": "未分配", + "global": "全局", + "workspace": "工作组", + "selectAll": "选择所有节点", + "selectAllConnected": "选择所有连接的节点", + "addRemoveNode": "从选择中添加/删除节点", + "editSelected": "编辑选定节点", + "deleteSelected": "删除选定节点或链接", + "importNode": "导入节点", + "exportNode": "导出节点", + "nudgeNode": "移动所选节点(1px)", + "moveNode": "移动所选节点(20px)", + "toggleSidebar": "切换侧边栏", + "togglePalette": "切换控制板", + "copyNode": "复制所选节点", + "cutNode": "剪切所选节点", + "pasteNode": "粘贴节点", + "undoChange": "撤消上次执行的更改", + "searchBox": "打开搜索框", + "managePalette": "管理面板", + "actionList": "动作列表" + }, + "library": { + "library": "库", + "openLibrary": "打开库...", + "saveToLibrary": "保存到库...", + "typeLibrary": "__type__类型库", + "unnamedType": "无名__type__", + "exportedToLibrary": "节点导出到库", + "dialogSaveOverwrite": "一个叫做__libraryName__的__libraryType__已经存在,您需要覆盖么?", + "invalidFilename": "无效的文件名", + "savedNodes": "保存的节点", + "savedType": "已保存__type__", + "saveFailed": "保存失败: __message__", + "newFolder": "新文件夹", + "types": { + "local": "本地的", + "examples": "例子" + }, + "exportToLibrary": "将节点导出到库" + }, + "palette": { + "noInfo": "无可用信息", + "filter": "过滤节点", + "search": "搜索模块", + "addCategory": "添加新的...", + "label": { + "subflows": "子流程", + "network": "网络", + "common": "共通", + "input": "输入", + "output": "输出", + "function": "功能", + "sequence": "序列", + "parser": "解析", + "social": "社交", + "storage": "存储", + "analysis": "分析", + "advanced": "高级" + }, + "actions": { + "collapse-all": "收起所有类别", + "expand-all": "展开所有类别" + }, + "event": { + "nodeAdded": "添加到面板中的节点:", + "nodeAdded_plural": "添加到面板中的多个节点", + "nodeRemoved": "从面板中删除的节点:", + "nodeRemoved_plural": "从面板中删除的多个节点:", + "nodeEnabled": "启用节点:", + "nodeEnabled_plural": "启用多个节点:", + "nodeDisabled": "禁用节点:", + "nodeDisabled_plural": "禁用多个节点:", + "nodeUpgraded": "节点模块__module__升级到__version__版本" + }, + "editor": { + "title": "面板管理", + "palette": "控制板", + "times": { + "seconds": "秒前", + "minutes": "分前", + "minutesV": "__count__分前", + "hoursV": "__count__小时前", + "hoursV_plural": "__count__小时前", + "daysV": "__count__天前", + "daysV_plural": "__count__天前", + "weeksV": "__count__周前", + "weeksV_plural": "__count__周前", + "monthsV": "__count__月前", + "monthsV_plural": "__count__月前", + "yearsV": "__count__年前", + "yearsV_plural": "__count__年前", + "yearMonthsV": "__y__年, __count__月前", + "yearMonthsV_plural": "__y__年, __count__月前", + "yearsMonthsV": "__y__年, __count__月前", + "yearsMonthsV_plural": "__y__年, __count__月前" + }, + "nodeCount": "__label__个节点", + "nodeCount_plural": "__label__个节点", + "moduleCount": "__count__个可用模块", + "moduleCount_plural": "__count__个可用模块", + "inuse": "使用中", + "enableall": "全部启用", + "disableall": "全部禁用", + "enable": "启用", + "disable": "禁用", + "remove": "移除", + "update": "更新至__version__版本", + "updated": "已更新", + "install": "安装", + "installed": "已安装", + "conflict": "冲突", + "conflictTip": "无法安装此模块,因为它包含已安装的
节点类型
与__module__
冲突
无法提取远程更改;您未暂存的本地更改将被覆盖。
请先提交更改,然后重试。
", + "showUnstagedChanges": "显示未暂存的更改", + "connectionFailed": "无法连接到远程存储库:", + "pullUnrelatedHistory": "远程有无关的提交历史
您确定要将这些更改拉入本地仓库吗?
", + "pullChanges": "拉取更改", + "history": "历史", + "projectHistory": "项目历史", + "daysAgo": "__count__天前", + "daysAgo_plural": "__count__天前", + "hoursAgo": "__count__小时前", + "hoursAgo_plural": "__count__小时前", + "minsAgo": "__count__分钟前", + "minsAgo_plural": "__count__分钟前", + "secondsAgo": "秒前", + "notTracking": "您的本地分支当前未跟踪一个远程分支。", + "statusUnmergedChanged": "您的仓库中有未合并的更改。您需要解决冲突并提交结果。", + "repositoryUpToDate": "您的仓库是最新的。", + "commitsAhead": "您的存储库领先远程仓库__count__次提交。您现在可以推送这些提交。", + "commitsAhead_plural": "您的存储库领先远程仓库__count__次提交。您现在可以推送这些提交。", + "commitsBehind": "您的存储库落后远程仓库__count__次提交。您现在可以拉取这些提交。", + "commitsBehind_plural": "您的存储库落后远程仓库__count__次提交。您现在可以拉取这些提交。", + "commitsAheadAndBehind1": "您的存储库落后远程仓库__count__次提交", + "commitsAheadAndBehind1_plural": "您的存储库落后远程仓库__count__次提交", + "commitsAheadAndBehind2": "领先远程仓库__count__次提交。", + "commitsAheadAndBehind2_plural": "领先远程仓库__count__次提交。", + "commitsAheadAndBehind3": "您必须先拉取远程提交,然后才能进行推送。", + "commitsAheadAndBehind3_plural": "您必须先拉取远程提交,然后才能进行推送。", + "refreshCommitHistory": "刷新提交历史", + "refreshChanges": "刷新更改" + } + } + }, + "typedInput": { + "type": { + "str": "文字列", + "num": "数字", + "re": "正则表达式", + "bool": "布尔值", + "json": "JSON", + "bin": "二进制流", + "date": "时间戳", + "jsonata": "表达式", + "env": "环境变量" + } + }, + "editableList": { + "add": "添加" + }, + "search": { + "empty": "找不到匹配", + "addNode": "添加一个节点..." + }, + "expressionEditor": { + "functions": "功能", + "functionReference": "功能reference", + "insert": "插入", + "title": "JSONata表达式编辑器", + "test": "测试", + "data": "示例消息", + "result": "结果", + "format": "格式表达方法", + "compatMode": "兼容模式启用", + "compatModeDesc": " 目前的表达式仍然参考msg
,所以将以兼容性模式进行评估。请更新表达式,使其不使用msg
,因为此模式将在将来删除。
当JSONata支持首次添加到Node-RED时,它需要表达式引用msg
对象。例如msg.payload
将用于访问有效负载。
这样便不再需要表达式直接针对消息进行评估。要访问有效负载,表达式应该只是payload
.
缓冲区类型被存储为字节值的JSON数组。编辑器将尝试将输入的数值解析为JSON数组。如果它不是有效的JSON,它将被视为UTF-8字符串,并被转换为单个字符代码点的数组。
例如,Hello World
的值会被转换为JSON数组:
[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]" + }, + "projects": { + "config-git": "配置Git客户端", + "welcome": { + "hello": "你好! 我们已经将“项目”引入了Node-RED。", + "desc0": "这是一种用于管理流程文件的新方法,并且包括对流程的版本控制。", + "desc1": "首先,您可以创建您的第一个项目或从git存储库克隆现有项目。", + "desc2": "如果不确定,可以暂时跳过此步骤。您仍然可以随时通过“项目”菜单创建第一个项目。", + "create": "建立专案", + "clone": "克隆仓库", + "openExistingProject": "打开现有项目", + "not-right-now": "不是现在" + }, + "git-config": { + "setup": "设置您的版本控制客户端", + "desc0": "Node-RED使用开源工具Git进行版本控制。它跟踪对项目文件的更改,并允许您将其推送到远程存储库。", + "desc1": "提交一组更改时,Git会使用用户名和电子邮件地址记录谁进行了更改。用户名可以是您想要的任何名称-不必是您的真实姓名。", + "desc2": "您的Git客户端已经配置了以下详细信息。", + "desc3": "您可以稍后在设置对话框的'Git config'标签下更改这些设置。", + "username": "用户名", + "email": "电子邮件" + }, + "project-details": { + "create": "创建你的项目", + "desc0": "项目被维护为Git仓库。与他人一起共享您的流程", + "desc1": "您可以创建多个项目,并通过编辑器在它们之间快速切换。", + "desc2": "首先,您的项目需要一个名称和一个可选的描述。", + "already-exists": "项目已存在", + "must-contain": "只能包含A-Z 0-9 _ -", + "project-name": "项目名", + "desc": "描述", + "opt": "可选的" + }, + "clone-project": { + "clone": "克隆一个项目", + "desc0": "如果您已经有一个包含项目的git仓库,则可以对其进行克隆以开始使用。", + "already-exists": "项目已存在", + "must-contain": "只能包含A-Z 0-9 _ -", + "project-name": "项目名", + "no-info-in-url": "网址中不要包含用户名/密码", + "git-url": "Git仓库的url", + "protocols": "https://, ssh:// or file://", + "auth-failed": "认证失败", + "username": "用户名", + "passwd": "秘密啊", + "ssh-key": "SSH密钥", + "passphrase": "密码短语", + "ssh-key-desc": "在通过ssh克隆仓库之前,必须添加SSH密钥才能访问它。", + "ssh-key-add": "添加一个ssh密钥", + "credential-key": "证书加密密钥", + "cant-get-ssh-key": "错误! 无法获取所选的SSH密钥路径。", + "already-exists2": "已存在", + "git-error": "git错误", + "connection-failed": "连接失败", + "not-git-repo": "不是一个git仓库", + "repo-not-found": "未发现仓库" + }, + "default-files": { + "create": "创建您的项目文件", + "desc0": "一个包含您的流程文件,Readme文件和package.json文件的项目。", + "desc1": "它可以包含您要在Git仓库中维护的任何其他文件。", + "desc2": "您现有的流程和凭证文件将被复制到项目中。", + "flow-file": "流程文件", + "credentials-file": "证书文件" + }, + "encryption-config": { + "setup": "设置证书文件的加密", + "desc0": "您的流程证书文件可以被加密以确保其内容安全。", + "desc1": "如果要将这些证书存储在公共Git存储库中,则必须通过提供密钥短语来对它们进行加密。", + "desc2": "您的流程证书文件当前未加密。", + "desc3": "这意味着任何有权访问该文件的人都可以读取其内容,例如密码和访问令牌。", + "desc4": "如果要将这些证书存储在公共Git仓库中,则必须通过提供密钥短语来对它们进行加密。", + "desc5": "当前,使用设置文件中的credentialSecret属性作为密钥来加密流程证书文件。", + "desc6": "您的流程证书文件当前使用系统生成的密钥加密。您应该为此项目提供一个新的密钥。", + "desc7": "密钥将与项目文件分开存储。您将需要提供在另一个Node-RED实例中使用该项目的密钥。", + "credentials": "证书", + "enable": "启用加密", + "disable": "禁用加密", + "disabled": "禁用的", + "copy": "复制现有密钥", + "use-custom": "使用自定义密钥", + "desc8": "证书文件不会被加密,其内容很容易阅读", + "create-project-files": "创建项目文件", + "create-project": "创建项目", + "already-exists": "已存在", + "git-error": "git错误", + "git-auth-error": "git认证错误" + }, + "create-success": { + "success": "您已经成功创建了第一个项目!", + "desc0": "现在,您可以像往常一样继续使用Node-RED。", + "desc1": "侧栏中的“信息”标签显示了您当前的活动项目。名称旁边的按钮可用于访问项目设置视图。", + "desc2": "侧栏中的“历史记录”标签可用于查看项目中已更改的文件并提交。它向您显示了提交的完整历史记录,并允许您将更改推送到远程存储库。" + }, + "create": { + "projects": "项目", + "already-exists": "项目已存在", + "must-contain": "只能包含A-Z 0-9 _ -", + "no-info-in-url": "网址中不要包含用户名/密码", + "open": "打开项目", + "create": "创建项目", + "clone": "克隆仓库", + "project-name": "项目名", + "desc": "描述", + "opt": "可选的", + "flow-file": "流程文件", + "credentials": "证书", + "enable-encryption": "启用加密", + "disable-encryption": "禁用加密", + "encryption-key": "加密密钥", + "desc0": "用来保护您的凭证的短语", + "desc1": "凭证文件不会被加密,其内容很容易阅读", + "git-url": "Git存储库URL", + "protocols": "https://, ssh:// or file://", + "auth-failed": "验证失败", + "username": "用户名", + "password": "密码", + "ssh-key": "SSH密钥", + "passphrase": "密码短语", + "desc2": "在通过ssh克隆存储库之前,必须添加SSH密钥才能访问它。", + "add-ssh-key": "添加一个ssh密钥", + "credentials-encryption-key": "证书加密密钥", + "already-exists-2": "已存在", + "git-error": "git错误", + "con-failed": "连接失败", + "not-git": "不是git仓库", + "no-resource": "找不到存储库", + "cant-get-ssh-key-path": "错误!无法获取所选的SSH密钥路径。", + "unexpected_error": "意外的错误" + }, + "delete": { + "confirm": "您确定要删除此项目吗?" + }, + "create-project-list": { + "search": "搜索您的项目", + "current": "当前的" + }, + "require-clean": { + "confirm": "
您有未部署的更改,这些更改将丢失。
您要继续吗?
" + }, + "send-req": { + "auth-req": "存储库需要认证", + "username": "用户名", + "password": "秘密", + "passphrase": "密码短语", + "retry": "重试", + "update-failed": "无法更新身份验证", + "unhandled": "未处理的错误响应" + }, + "create-branch-list": { + "invalid": "无效的分支", + "create": "创建分支", + "current": "当前的" + }, + "create-default-file-set": { + "no-active": "没有活动项目就无法创建默认文件集", + "no-empty": "无法在非空项目上创建默认文件集", + "git-error": "git错误" + }, + "errors": { + "no-username-email": "您的Git客户端未配置用户名/电子邮件。", + "unexpected": "发生了一个意料之外的问题", + "code": "代码" + } + }, + "editor-tab": { + "properties": "属性", + "envProperties": "环境变量", + "description": "描述", + "appearance": "外观", + "preview": "UI预览", + "defaultValue": "默认值" + }, + "languages": { + "de": "德语", + "en-US": "英文", + "ja": "日语", + "ko": "韩文", + "zh-CN": "简体中文", + "zh-TW": "繁体中文" + } +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-CN/infotips.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-CN/infotips.json new file mode 100644 index 0000000..9fe92aa --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-CN/infotips.json @@ -0,0 +1,23 @@ +{ + "info": { + "tip0" : "您可以用 {{core:delete-selection}} 删除选择的节点或链接。", + "tip1" : "{{core:search}} 可以在流程内搜索节点。", + "tip2": "{{core:toggle-sidebar}} 可以显示或隐藏边栏。", + "tip3": "您可以在 {{core:manage-palette}} 中管理节点的控制面板。", + "tip4": "边栏中会列出流程中所有的配置节点。您可以通过菜单或者 {{core:show-config-tab}} 来访问这些节点。", + "tip5": "您可以在设定中选择显示或隐藏这些提示。", + "tip6": "您可以用[left] [up] [down] [right]键来移动被选中的节点。按住[shift]可以更快地移动节点。", + "tip7": "把节点拖到连接上可以向连接中插入节点。", + "tip8": "您可以用 {{core:show-export-dialog}} 来导出被选中的节点或标签页中的流程。", + "tip9": "您可以将流程的json文件拖入编辑框或 {{core:show-import-dialog}} 来导入流程。", + "tip10": "按住[shift]后单击并拖动节点可以将该节点的多个连接一并移动到其他节点的端口。", + "tip11": "{{core:show-info-tab}} 可以显示「信息」标签页。 {{core:show-debug-tab}} 可以显示「调试」标签页。", + "tip12": "按住[ctrl]的同时点击工作界面可以在节点的对话栏中快速添加节点。", + "tip13": "按住[ctrl]的同时点击节点的端口或后续节点可以快速连接多个节点。", + "tip14": "按住[shift]的同时点击节点会选中所有被连接的节点。", + "tip15": "按住[ctrl]的同时点击节点可以在选中或取消选中节点。", + "tip16": "{{core:show-previous-tab}} 和 {{core:show-next-tab}} 可以切换标签页。", + "tip17": "您可以在节点的属性配置画面中通过 {{core:confirm-edit-tray}} 来更改设置,或者用 {{core:cancel-edit-tray}} 来取消更改。", + "tip18": "您可以通过点击 {{core:edit-selected-node}} 来显示被选中节点的属性设置画面。" + } +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-CN/jsonata.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-CN/jsonata.json new file mode 100644 index 0000000..f27ec1f --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-CN/jsonata.json @@ -0,0 +1,270 @@ +{ + "$string": { + "args": "arg", + "desc": "通过以下的类型转换规则将参数*arg*转换成字符串:\n\n - 字符串不转换。\n -函数转换成空的字符串。\n - JSON的值无法用数字表示所以用无限大或者NaN(非数)表示。\n - 用’JSON.stringify’函数将其他值转换成JSON字符串。" + }, + "$length": { + "args": "str", + "desc": "输出字符串’str’的字数。如果’str’不是字符串,抛出错误。" + }, + "$substring": { + "args": "str, start[, length]", + "desc": "输出`start`位置后的的首次出现的包括`str`的子字符串。 如果`length`被指定,那么的字符串中将只包括前`length`个文字。如果`start`是负数则输出从`str`末尾开始的`length`个文字" + }, + "$substringBefore": { + "args": "str, chars", + "desc": "输出’str’中首次出现的’chars’之前的子字符串,如果’str’中不包括’chars’则输出’str’。" + }, + "$substringAfter": { + "args": "str, chars", + "desc": "输出’str’中首次出现的’chars’之后的子字符串,如果’str’中不包括’chars’则输出’str’。" + }, + "$uppercase": { + "args": "str", + "desc": "`将’str’中的所有字母变为大写后输出。" + }, + "$lowercase": { + "args": "str", + "desc": "将’str’中的所有字母变为小写后输出。" + }, + "$trim": { + "args": "str", + "desc": "将以下步骤应用于`str`来去除所有空白文字并实现标准化。\n\n – 将全部tab制表符、回车键、换行字符用空白代替。\n- 将连续的空白文字变成一个空白文字。\n- 消除开头和末尾的空白文字。\n\n如果`str`没有被指定(即在无输入参数的情况下调用本函数),将上下文的值作为`str`来使用。 如果`str` 不是字符串则抛出错误。" + }, + "$contains": { + "args": "str, pattern", + "desc": "字符串`str` 和 `pattern`匹配的话输出`true`,不匹配的情况下输出 `false`。 不指定`str`的情况下(比如用一个参数调用本函数时)、将上下文的值作为`str`来使用。参数 `pattern`可以为字符串或正则表达。" + }, + "$split": { + "args": "str[, separator][, limit]", + "desc": "将参数`str`分解成由子字符串组成的数组。 如果`str`不是字符串抛出错误。可以省略的参数 `separator`中指定字符串`str`的分隔符。分隔符可以是文字或正则表达式。在不指定`separator`的情况下、将分隔符看作空的字符串并把`str`拆分成由单个字母组成的数组。如果`separator`不是字符串则抛出错误。在可省略的参数`limit`中指定分割后的子字符串的最大个数。超出个数的子字符串将被舍弃。如果`limit`没有被指定,`str` 将不考虑子字符串的个数而将字符串完全分隔。如果`limit`是负数则抛出错误。" + }, + "$join": { + "args": "array[, separator]", + "desc": "用可以省略的参数 `separator`来把多个字符串连接。如果`array`不是字符串则抛出错误。 如果没有指定`separator`,则用空字符串来连接字符(即字符串之间没有`separator`)。 如果`separator`不是字符则抛出错误。" + }, + "$match": { + "args": "str, pattern [, limit]", + "desc": "对字符串`str`使用正则表达式`pattern`并输出与`str`相匹配的部分信息。" + }, + "$replace": { + "args": "str, pattern, replacement [, limit]", + "desc": "在字符串`str`中搜索`pattern`并用`replacement`来替换。\n\n可选参数`limit`用来指定替换次数的上限。" + }, + "$now": { + "args": "", + "desc": "生成ISO 8601互換格式的时刻,并作为字符串输出。" + }, + "$base64encode": { + "args": "string", + "desc": "将ASCII格式的字符串转换为Base 64格式。将字符串中的文字视作二进制形式的数据处理。包含URI编码在内的字符串文字必须在0x00到0xFF的范围内,否则不会被支持。" + }, + "$base64decode": { + "args": "string", + "desc": "用UTF-8代码页将Base 64形式二进制值转换为字符串。" + }, + "$number": { + "args": "arg", + "desc": "用下述的规则将参数 `arg`转换为数值。:\n\n – 数值不做转换。\n – 将字符串中合法的JSON数値表示转换成数値。\n – 其他形式的值则抛出错误。" + }, + "$abs": { + "args": "number", + "desc": "输出参数`number`的绝对值。" + }, + "$floor": { + "args": "number", + "desc": "输出比`number`的值小的最大整数。" + }, + "$ceil": { + "args": "number", + "desc": "输出比`number`的值大的最小整数。" + }, + "$round": { + "args": "number [, precision]", + "desc": "输出四舍五入后的参数`number`。可省略的参数 `precision`指定四舍五入后小数点下的位数。" + }, + "$power": { + "args": "base, exponent", + "desc": "输出底数`base`的`exponent`次幂。" + }, + "$sqrt": { + "args": "number", + "desc": "输出参数 `number`的平方根。" + }, + "$random": { + "args": "", + "desc": "输出比0大,比1小的伪随机数。" + }, + "$millis": { + "args": "", + "desc": "返回从UNIX时间 (1970年1月1日 UTC/GMT的午夜)开始到现在的毫秒数。在同一个表达式的测试中所有对`$millis()`的调用将会返回相同的值。" + }, + "$sum": { + "args": "array", + "desc": "输出数组`array`的总和。如果`array`不是数值则抛出错误。" + }, + "$max": { + "args": "array", + "desc": "输出数组`array`的最大值。如果`array`不是数值则抛出错误。" + }, + "$min": { + "args": "array", + "desc": "输出数组`array`的最小值。如果`array`不是数值则抛出错误。。" + }, + "$average": { + "args": "array", + "desc": "输出数组`array`的平均数。如果`array`不是数值则抛出错误。。" + }, + "$boolean": { + "args": "arg", + "desc": "用下述规则将数据转换成布尔值。:\n\n - 不转换布尔值`Boolean`。\n – 将空的字符串`string`转换为`false`\n – 将不为空的字符串`string`转换为`true`\n – 将为0的数字`number`转换成`false`\n –将不为0的数字`number`转换成`true`\n –将`null`转换成`false`\n –将空的数组`array`转换成`false`\n –如果数组`array`中含有可以转换成`true`的要素则转换成`true`\n –如果`array`中没有可转换成`true`的要素则转换成`false`\n – 空的对象`object`转换成`false`\n – 非空的对象`object`转换成`true`\n –将函数`function`转换成`false`" + }, + "$not": { + "args": "arg", + "desc": "输出做取反运算后的布尔值。首先将`arg`转换为布尔值。" + }, + "$exists": { + "args": "arg", + "desc": "如果算式`arg`的值存在则输出`true`。如果算式的值不存在(比如指向不存在区域的引用)则输出`false`。" + }, + "$count": { + "args": "array", + "desc": "输出数组中的元素数。" + }, + "$append": { + "args": "array, array", + "desc": "将两个数组连接。" + }, + "$sort": { + "args": "array [, function]", + "desc": "输出排序后的数组`array`。\n\n如果使用了比较函数`function`,则下述两个参数需要被指定。\n\n`function(left, right)`\n\n该比较函数是为了比较left和right两个值而被排序算法调用的。如果用户希望left的值被置于right的值之后,那么该函数必须输出布尔值`true`来表示位置交换。而在不需要位置交换时函数必须输出`false`。" + }, + "$reverse": { + "args": "array", + "desc": "输出倒序后的数组`array`。" + }, + "$shuffle": { + "args": "array", + "desc": "输出随机排序后的数组 `array`。" + }, + "$zip": { + "args": "array, ...", + "desc": "将数组中的值按索引顺序打包后输出。" + }, + "$keys": { + "args": "object", + "desc": "输出由对象内的键组成的数组。如果参数是对象的数组则输出由所有对象中的键去重后组成的队列。" + }, + "$lookup": { + "args": "object, key", + "desc": "输出对象中与参数`key`对应的值。如果第一个参数`object`是数组,那么数组中所有的对象都将被搜索并输出这些对象中与参数`key`对应的值。" + }, + "$spread": { + "args": "object", + "desc": "将对象中的键值对分隔成每个要素中只含有一个键值对的数组。如果参数`object`是数组,那么返回值的数组中包含所有对象中的键值对。" + }, + "$merge": { + "args": "array<object>", + "desc": "将输入数组`objects`中所有的键值对合并到一个`object`中并返回。如果输入数组的要素中含有重复的键,则返回的`object`中将只包含数组中最后出现要素的值。如果输入数组中包括对象以外的元素,则抛出错误。" + }, + "$sift": { + "args": "object, function", + "desc": "输出参数`object`中符合`function`的键值对。\n\n`function`必须含有下述参数。\n\n`function(value [, key [, object]])`" + }, + "$each": { + "args": "object, function", + "desc": "将函数`function`应用于`object`中的所有键值对并输出由所有返回值组成的数组。" + }, + "$map": { + "args": "array, function", + "desc": "将函数`function`应用于数组`array`中所有的值并输出由返回值组成的数组。\n\n`function`中必须含有下述参数。\n\n`function(value [, index [, array]])`" + }, + "$filter": { + "args": "array, function", + "desc": "输出数组`array`中符合函数`function`条件的值组成的数组。\n\n`function`必须包括下述参数。\n\n`function(value [, index [, array]])`" + }, + "$reduce": { + "args": "array, function [, init]", + "desc": "将`function`依次应用于数组中的各要素值。 其中,前一个要素值的计算结果将参与到下一次的函数运算中。。\n\n函数`function`接受两个参数并作为中缀表示法中的操作符。\n\n可省略的参数`init`将作为运算的初始值。" + }, + "$flowContext": { + "args": "string", + "desc": "获取流上下文(流等级的上下文,可以让所有节点共享)的属性。" + }, + "$globalContext": { + "args": "string", + "desc": "获取全局上下文的属性。" + }, + "$pad": { + "args": "string, width [, char]", + "desc": "根据需要,向字符串`string`的副本中填充文字使该字符串的字数达到`width`的绝对值并返回填充文字后的字符串。\n\n如果`width`的值为正,则向字符串`string`的右侧填充文字,如果`width`为负,则向字符串`string`的左侧填充文字。\n\n可选参数`char`用来指定填充的文字。如果未指定该参数,则填充空白文字。" + }, + "$fromMillis": { + "args": "number", + "desc": "将表示从UNIX时间 (1970年1月1日 UTC/GMT的午夜)开始到现在的毫秒数的数值转换成ISO 8601形式时间戳的字符串。" + }, + "$formatNumber": { + "args": "number, picture [, options]", + "desc": "将`number`转换成具有`picture`所指定的数值格式的字符串。\n\n此函数的功能与XPath F&O 3.1规格中定义的XPath/XQuery函数的fn:format-number功能相一致。参数`picture`用于指定数值的转换格式,其语法与fn:format-number中的定义一致。\n\n可选的第三参数`options`用来覆盖默认的局部环境格式,如小数点分隔符。如果指定该参数,那么该参数必须是包含name/value对的对象,并且name/value对必须符合XPath F&O 3.1规格中记述的数值格式。" + }, + "$formatBase": { + "args": "number [, radix]", + "desc": "将`number`变换为以参数`radix`的值为基数形式的字符串。如果不指定`radix`的值,则默认基数为10。指定的`radix`值必须在2~36之间,否则抛出错误。" + }, + "$toMillis": { + "args": "timestamp", + "desc": "将ISO 8601格式的字符串`timestamp`转换为从UNIX时间 (1970年1月1日 UTC/GMT的午夜)开始到现在的毫秒数。如果该字符串的格式不正确,则抛出错误。" + }, + "$env": { + "args": "arg", + "desc": "返回环境变量的值。\n\n这是Node-RED定义的函数。" + }, + "$eval": { + "args": "expr [, context]", + "desc": "使用当前上下文来作为评估依据,分析并评估字符串`expr`,其中包含文字JSON或JSONata表达式。" + }, + "$formatInteger": { + "args": "number, picture", + "desc": "将“数字”转换为字符串,并将其格式化为“图片”字符串指定的整数表示形式。图片字符串参数定义了数字的格式,并具有与XPath F&O 3.1 规范中的fn:format-integer相同的语法。" + }, + "$parseInteger": { + "args": "string, picture", + "desc": "使用“图片”字符串指定的格式将“字符串”参数的内容解析为整数(作为JSON数字)。图片字符串参数与$formatInteger格式相同。." + }, + "$error": { + "args": "[str]", + "desc": "引发错误并显示一条消息。 可选的`str`将替代$error()函数评估的默认消息。" + }, + "$assert": { + "args": "arg, str", + "desc": "如果`arg`为真,则该函数返回。 如果arg为假,则抛出带有str的异常作为异常消息。" + }, + "$single": { + "args": "array, function", + "desc": "返回满足参数function谓语的array参数中的唯一值 (比如:传递值时,函数返回布尔值“true”)。如果匹配值的数量不唯一时,则抛出异常。\n\n应在以下签名中提供函数:`function(value [,index [,array []]])`其中value是数组的每个输入,index是该值的位置,整个数组作为第三个参数传递。" + }, + "$encodeUrl": { + "args": "str", + "desc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一资源定位符(URL)组件进行编码。\n\n示例:`$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`" + }, + "$encodeUrlComponent": { + "args": "str", + "desc": "通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一资源定位符(URL)进行编码。\n\n示例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`" + }, + "$decodeUrl": { + "args": "str", + "desc": "解码以前由encodeUrlComponent创建的统一资源定位器(URL)组件。 \n\n示例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`" + }, + "$decodeUrlComponent": { + "args": "str", + "desc": "解码先前由encodeUrl创建的统一资源定位符(URL)。 \n\n示例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`" + }, + "$distinct": { + "args": "array", + "desc": "返回一个数组,其中重复的值已从`数组`中删除" + }, + "$type": { + "args": "value", + "desc": "以字符串形式返回`值`的类型。 如果该`值`未定义,则将返回`未定义`" + } +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json new file mode 100644 index 0000000..897599b --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json @@ -0,0 +1,1015 @@ +{ + "common": { + "label": { + "name": "名稱", + "ok": "確認", + "done": "完成", + "cancel": "取消", + "delete": "刪除", + "close": "關閉", + "load": "讀取", + "save": "保存", + "import": "匯入", + "export": "匯出", + "back": "返回", + "next": "下一步", + "clone": "複製專案", + "cont": "Continue" + }, + "type": { + "string": "字符串", + "number": "數值", + "boolean": "布林", + "array": "數組", + "buffer": "buffer", + "object": "對象", + "jsonString": "JSON字符串", + "undefined": "未定義", + "null": "空" + } + }, + "workspace": { + "defaultName": "流程__number__", + "editFlow": "編輯流程: __name__", + "confirmDelete": "確認刪除", + "delete": "確定想要刪除 '__label__'?", + "dropFlowHere": "把流程放到這裡", + "addFlow": "新增流程", + "listFlows": "流程列表", + "status": "狀態", + "enabled": "有效", + "disabled": "無效", + "info": "詳細描述", + "selectNodes": "點擊節點用於選擇" + }, + "menu": { + "label": { + "view": { + "view": "顯示", + "grid": "格線", + "showGrid": "顯示格線", + "snapGrid": "對齊格線", + "gridSize": "格線尺寸", + "textDir": "文本方向", + "defaultDir": "默認方向", + "ltr": "從左到右", + "rtl": "從右到左", + "auto": "上下文", + "language": "語言", + "browserDefault": "瀏覽器默認" + }, + "sidebar": { + "show": "顯示側邊欄" + }, + "palette": { + "show": "顯示控制板" + }, + "settings": "設置", + "userSettings": "使用者設置", + "nodes": "節點", + "displayStatus": "顯示節點狀態", + "displayConfig": "修改節點配置", + "import": "匯入", + "export": "匯出", + "search": "搜尋流程", + "searchInput": "搜尋流程", + "subflows": "子流程", + "createSubflow": "新建子流程", + "selectionToSubflow": "將選擇部分更改為子流程", + "flows": "流程", + "add": "增加", + "rename": "重新命名", + "delete": "刪除", + "keyboardShortcuts": "鍵盤快速鍵", + "login": "登入", + "logout": "退出", + "editPalette": "節點管理", + "other": "其他", + "showTips": "顯示小提示", + "help": "Node-RED website", + "projects": "專案", + "projects-new": "新專案", + "projects-open": "開啟專案", + "projects-settings": "專案設定", + "showNodeLabelDefault": "顯示新添加節點的標籤" + } + }, + "actions": { + "toggle-navigator": "切換導航器", + "zoom-out": "縮小", + "zoom-reset": "重置縮放", + "zoom-in": "放大" + }, + "user": { + "loggedInAs": "作為__name__登入", + "username": "帳號", + "password": "密碼", + "login": "登入", + "loginFailed": "登入失敗", + "notAuthorized": "未授權", + "errors": { + "settings": "設置資訊需要登入後才能訪問", + "deploy": "改動需要登入後才能部署", + "notAuthorized": "此操作需要登入後才能執行" + } + }, + "notification": { + "warning": "警告: __message__", + "warnings": { + "undeployedChanges": "節點中存在未部署的更改", + "nodeActionDisabled": "節點動作在子流程中被禁用", + "nodeActionDisabledSubflow": "子流程中禁用了節點操作", + "missing-types": "流程由於缺少節點類型而停止。請檢查日誌的詳細資訊", + "safe-mode": "流程在安全模式下停止。
您可以修改流程並部署更改以重新啟動。
", + "restartRequired": "Node-RED必須重新啟動,以啟用升級的模組", + "credentials_load_failed": "流程由於無法解密證書而停止。
流程證書文件已加密,但是項目的加密密鑰丟失或無效。
", + "credentials_load_failed_reset": "證書無法解密
流程證書文件已加密,但是項目的加密密鑰丟失或無效。
流程證書文件將在下一次部署時重置。任何現有的流程證書將被清除。
", + "missing_flow_file": "找不到項目流程文件。
該項目未配置流程文件。
", + "missing_package_file": "找不到項目包文件。
項目缺少package.json文件。
", + "project_empty": "該項目為空。
是否要創建一組默認的項目文件?
否則,您將不得不在編輯器外部手動將文件添加到項目中。
找不到項目的'__project__'
", + "git_merge_conflict": "自動合併更改失敗。
修復未合併的衝突,然後提交結果。
" + }, + "error": "Error: __message__", + "errors": { + "lostConnection": "丟失與伺服器的連接,重新連接...", + "lostConnectionReconnect": "丟失與伺服器的連接,__time__秒後重新連接", + "lostConnectionTry": "現在嘗試", + "cannotAddSubflowToItself": "無法向其自身添加子流程", + "cannotAddCircularReference": "無法添加子流程 - 迴圈引用", + "unsupportedVersion": "您正在使用不受支持的Node.js版本加載'__module__'失敗
__error__
" + }, + "project": { + "change-branch": "轉到本地分支'__project__'", + "merge-abort": "Git合併中止", + "loaded": "已加載項目'__project__'", + "updated": "已更新項目'__project__'", + "pull": "已重新加載項目'__project__'", + "revert": "項目“__project__”已還原", + "merge-complete": "Git合併完成", + "setupCredentials": "設定證書", + "setupProjectFiles": "設置項目文件", + "no": "不了,謝謝", + "createDefault": "創建默認項目文件", + "mergeConflict": "顯示合併衝突" + }, + "label": { + "manage-project-dep": "管理項目依賴性", + "setup-cred": "設定憑證", + "setup-project": "設置項目文件", + "create-default-package": "創建默認的包文件", + "no-thanks": "不了,謝謝", + "create-default-project": "創建默認項目文件", + "show-merge-conflicts": "顯示合併衝突" + } + }, + "clipboard": { + "clipboard": "剪貼簿", + "nodes": "節點", + "node": "__count__ 節點", + "node_plural": "__count__ 多個節點", + "configNode": "__count__ 節點組態", + "configNode_plural": "__count__ 多節點組態", + "flow": "__count__ 流程", + "flow_plural": "__count__ 多流程", + "subflow": "__count__ 子流程", + "subflow_plural": "__count__ 多子流程", + "pasteNodes": "在這裡粘貼節點", + "selectFile": "匯入所選檔案", + "importNodes": "匯入節點", + "exportNodes": "匯出節點至剪貼簿", + "download": "下載", + "importUnrecognised": "匯入了無法識別的類型:", + "importUnrecognised_plural": "匯入了無法識別的類型:", + "nodesExported": "節點匯出到了剪貼簿", + "nodesImported": "已匯入:", + "nodeCopied": "已複製__count__個節點", + "nodeCopied_plural": "已複製__count__個節點", + "invalidFlow": "無效的流程: __message__", + "export": { + "selected": "已選擇的節點", + "current": "現在的節點", + "all": "所有流程", + "compact": "緊湊", + "formatted": "已格式化", + "copy": "匯出到剪貼簿", + "export": "匯出到庫", + "exportAs": "匯出為", + "overwrite": "取代", + "exists": "\"__file__\" 已經存在.
是否要取代?
" + }, + "import": { + "import": "匯入到", + "newFlow": "新流程", + "errors": { + "notArray": "輸入的不是JSON數組", + "itemNotObject": "輸入的流程無效-項目__index__不是節點對象", + "missingId": "輸入的流程無效-項__index__缺少“ id”屬性", + "missingType": "輸入的流程無效-項__index__缺少“類型”屬性" + } + }, + "copyMessagePath": "已複製路徑", + "copyMessageValue": "已複製數值", + "copyMessageValue_truncated": "已複製捨棄的數值" + }, + "deploy": { + "deploy": "部署", + "full": "全面", + "fullDesc": "在工作區中部署所有內容", + "modifiedFlows": "已修改的流程", + "modifiedFlowsDesc": "只部署包含已更改節點的流程", + "modifiedNodes": "已更改的節點", + "modifiedNodesDesc": "只部署已經更改的節點", + "restartFlows": "重新啟動流程", + "restartFlowsDesc": "重新啟動當前部署的流程", + "successfulDeploy": "部署成功", + "successfulRestart": "成功重啟流程", + "deployFailed": "部署失敗: __message__", + "unusedConfigNodes": "您有一些未使用的配置節點", + "unusedConfigNodesLink": "點擊此處查看它們", + "errors": { + "noResponse": "伺服器沒有回應" + }, + "confirm": { + "button": { + "ignore": "忽略", + "confirm": "確認部署", + "review": "查看更改", + "cancel": "取消", + "merge": "合併", + "overwrite": "忽略 & 部署" + }, + "undeployedChanges": "您有未部署的更改。\n\n離開此頁面將丟失這些更改。", + "improperlyConfigured": "工作區包含一些未正確配置的節點:", + "unknown": "工作區包含一些未知的節點類型:", + "confirm": "確定要部署嗎?", + "doNotWarn": "不要再對此發出警告", + "conflict": "伺服器正在運行較新的一組流程。", + "backgroundUpdate": "伺服器上的流程已更新。", + "conflictChecking": "檢查是否可以自動合併更改", + "conflictAutoMerge": "此更改不包括衝突,可以自動合併", + "conflictManualMerge": "這些更改包括了在部署之前必須解決的衝突。", + "plusNMore": "+更多的__count__" + } + }, + "eventLog": { + "title": "事件日誌", + "view": "查看日誌" + }, + "diff": { + "unresolvedCount": "__count__個未解決的衝突", + "unresolvedCount_plural": "__count__個未解決的衝突", + "globalNodes": "全局節點", + "flowProperties": "流程屬性", + "type": { + "added": "已添加", + "changed": "已更改", + "unchanged": "未更改", + "deleted": "已刪除", + "flowDeleted": "已刪除流程", + "flowAdded": "已添加流程", + "movedTo": "移動至__id__", + "movedFrom": "從__id__移動" + }, + "nodeCount": "__count__個節點", + "nodeCount_plural": "__count__個節點", + "local": "本地", + "remote": "遠端", + "reviewChanges": "查看變更", + "noBinaryFileShowed": "無法顯示二進製文件內容", + "viewCommitDiff": "查看提交更改", + "compareChanges": "比較變更", + "saveConflict": "保存衝突解決", + "conflictHeader": "已解決__unresolved__中的__resolved__個衝突", + "commonVersionError": "通用版本不包含有效的JSON:", + "oldVersionError": "舊版本不包含有效的JSON:", + "newVersionError": "新版本不包含有效的JSON:" + }, + "subflow": { + "editSubflowInstance": "編輯子流程實例:__name__", + "editSubflow": "編輯流程範本: __name__", + "edit": "編輯流程範本", + "subflowInstances": "這個子流程範本有__count__個實例", + "subflowInstances_plural": "這個子流程範本有__count__個實例", + "editSubflowProperties": "編輯屬性", + "input": "輸入:", + "output": "輸出:", + "status": "狀態節點", + "deleteSubflow": "刪除子流程", + "info": "詳細描述", + "category": "類別", + "env": { + "restore": "恢復為默認子流程", + "remove": "類別刪除環境變量" + }, + "errors": { + "noNodesSelected": "無法創建子流程: 未選擇節點", + "multipleInputsToSelection": "無法創建子流程: 多個輸入到了選擇" + } + }, + "editor": { + "configEdit": "編輯", + "configAdd": "添加", + "configUpdate": "更新", + "configDelete": "刪除", + "nodesUse": "__count__個節點使用此配置", + "nodesUse_plural": "__count__個節點使用此配置", + "addNewConfig": "添加新的__type__配置", + "editNode": "編輯__type__節點", + "editConfig": "編輯__type__配置", + "addNewType": "添加新的__type__節點", + "nodeProperties": "節點屬性", + "label": "Label", + "color": "顏色", + "portLabels": "埠標籤", + "labelInputs": "輸入", + "labelOutputs": "輸出", + "settingIcon": "Icon", + "default": "默認", + "noDefaultLabel": "無", + "defaultLabel": "使用默認標籤", + "searchIcons": "搜尋圖標", + "useDefault": "使用默認", + "description": "描述", + "show": "顯示", + "hide": "隱藏", + "locale": "選擇界面語言", + "icon": "圖標", + "inputType": "輸入類型", + "inputs": { + "input": "輸入", + "select": "選擇", + "checkbox": "復選框", + "spinner": "微調器", + "none": "空", + "hidden": "隱藏屬性" + }, + "types": { + "str": "字符串", + "num": "數字", + "bool": "布爾", + "json": "JSON", + "bin": "buffer", + "env": "環境變量" + }, + "menu": { + "input": "輸入", + "select": "選擇", + "checkbox": "復選框", + "spinner": "微調器", + "hidden": "僅標簽" + }, + "select": { + "label": "標簽", + "value": "值" + }, + "spinner": { + "min": "最小值", + "max": "最大值" + }, + "errors": { + "scopeChange": "更改範圍將使其他流程中的節點無法使用", + "invalidProperties": "無效的屬性:" + } + }, + "keyboard": { + "title": "鍵盤快速鍵", + "keyboard": "鍵盤", + "filterActions": "篩選動作", + "shortcut": "快捷鍵", + "scope": "範圍", + "unassigned": "未分配", + "global": "全局", + "workspace": "工作區", + "selectAll": "選擇所有節點", + "selectAllConnected": "選擇所有連接的節點", + "addRemoveNode": "從選擇中添加/刪除節點", + "editSelected": "編輯選定節點", + "deleteSelected": "刪除選定節點或連結", + "importNode": "匯入節點", + "exportNode": "匯出節點", + "nudgeNode": "移動所選節點(1px)", + "moveNode": "移動所選節點(20px)", + "toggleSidebar": "切換側邊欄", + "togglePalette": "切換調色板", + "copyNode": "複製所選節點", + "cutNode": "剪切所選節點", + "pasteNode": "粘貼節點", + "undoChange": "撤銷上次執行的更改", + "searchBox": "打開搜尋框", + "managePalette": "管理面板", + "actionList": "動作列表" + }, + "library": { + "library": "庫", + "openLibrary": "打開庫...", + "saveToLibrary": "保存到庫...", + "typeLibrary": "__type__型別程式庫", + "unnamedType": "無名__type__", + "exportedToLibrary": "節點導出到庫", + "dialogSaveOverwrite": "一個叫做__libraryName__的__libraryType__已經存在,您需要覆蓋麼?", + "invalidFilename": "無效的檔案名", + "savedNodes": "保存的節點", + "savedType": "已保存__type__", + "saveFailed": "保存失敗: __message__", + "newFolder": "新文件夾", + "types": { + "local": "本地", + "examples": "例子" + }, + "exportToLibrary": "將節點匯出到庫" + }, + "palette": { + "noInfo": "無可用資訊", + "filter": "過濾節點", + "search": "搜尋模組", + "addCategory": "添加新的...", + "label": { + "subflows": "子流程", + "network": "網絡", + "common": "共通", + "input": "輸入", + "output": "輸出", + "function": "功能", + "sequence": "序列", + "parser": "解析", + "social": "社交", + "storage": "存儲", + "analysis": "分析", + "advanced": "高級" + }, + "actions": { + "collapse-all": "收起所有類別", + "expand-all": "展開所有類別" + }, + "event": { + "nodeAdded": "添加到面板中的節點:", + "nodeAdded_plural": "添加到面板中的多個節點", + "nodeRemoved": "從面板中刪除的節點:", + "nodeRemoved_plural": "從面板中刪除的多個節點:", + "nodeEnabled": "啟用節點:", + "nodeEnabled_plural": "啟用多個節點:", + "nodeDisabled": "禁用節點:", + "nodeDisabled_plural": "禁用多個節點:", + "nodeUpgraded": "節點模組__module__升級到__version__版本" + }, + "editor": { + "title": "面板管理", + "palette": "Palette", + "times": { + "seconds": "秒前", + "minutes": "分前", + "minutesV": "__count__分前", + "hoursV": "__count__小時前", + "hoursV_plural": "__count__小時前", + "daysV": "__count__天前", + "daysV_plural": "__count__天前", + "weeksV": "__count__周前", + "weeksV_plural": "__count__周前", + "monthsV": "__count__月前", + "monthsV_plural": "__count__月前", + "yearsV": "__count__年前", + "yearsV_plural": "__count__年前", + "yearMonthsV": "__y__年, __count__月前", + "yearMonthsV_plural": "__y__年, __count__月前", + "yearsMonthsV": "__y__年, __count__月前", + "yearsMonthsV_plural": "__y__年, __count__月前" + }, + "nodeCount": "__label__個節點", + "nodeCount_plural": "__label__個節點", + "moduleCount": "__count__個可用模組", + "moduleCount_plural": "__count__個可用模組", + "inuse": "使用中", + "enableall": "全部啟用", + "disableall": "全部禁用", + "enable": "啟用", + "disable": "禁用", + "remove": "移除", + "update": "更新至__version__版本", + "updated": "已更新", + "install": "安裝", + "installed": "已安裝", + "conflict": "conflict", + "conflictTip": "無法安裝此模塊,因為它包含已安裝的
節點類型
與__module__
衝突
無法提取遠程更改;您未進行的暫存本地更改將被覆蓋。
提交更改,然後重試。
", + "showUnstagedChanges": "顯示未分階段的更改", + "connectionFailed": "無法連接到遠程存儲庫:", + "pullUnrelatedHistory": "遠程服務器具有不相關的提交歷史記錄。
您確定要將更改保存到本地存儲庫中嗎?
", + "pullChanges": "Pull變更", + "history": "歷史", + "projectHistory": "項目歷史", + "daysAgo": "__count__天前", + "daysAgo_plural": "__count__天前", + "hoursAgo": "__count__小時前", + "hoursAgo_plural": "__count__小時前", + "minsAgo": "__count__分鐘前", + "minsAgo_plural": "__count__分鐘前", + "secondsAgo": "秒前", + "notTracking": "您的本地分支當前未跟蹤遠程分支。", + "statusUnmergedChanged": "您的存儲庫中有未合併的更改。您需要解決衝突並提交結果。", + "repositoryUpToDate": "您的存儲庫是最新的。", + "commitsAhead": "您的倉庫領先遠程倉庫__count__次提交。您現在可以push這些提交。", + "commitsAhead_plural": "您的倉庫領先遠程倉庫__count__次提交。您現在可以push這些提交。", + "commitsBehind": "您的倉庫落後遠程倉庫__count__次提交。您現在可以pull這些提交。", + "commitsBehind_plural": "您的倉庫落後遠程倉庫__count__次提交。您現在可以pull這些提交。", + "commitsAheadAndBehind1": "您的倉庫落後遠程倉庫__count__次提交", + "commitsAheadAndBehind1_plural": "您的倉庫落後遠程倉庫__count__次提交", + "commitsAheadAndBehind2": "領先遠程倉庫__count__次提交。", + "commitsAheadAndBehind2_plural": "領先遠程倉庫__count__次提交。", + "commitsAheadAndBehind3": "您必須先pull遠程提交,然後再進行push。", + "commitsAheadAndBehind3_plural": "您必須先pull遠程提交,然後再進行push。", + "refreshCommitHistory": "刷新提交歷史", + "refreshChanges": "刷新更改" + } + } + }, + "typedInput": { + "type": { + "str": "文字列", + "num": "數字", + "re": "規則運算式", + "bool": "布林", + "json": "JSON", + "bin": "二進位流", + "date": "時間戳記", + "jsonata": "expression", + "env": "env variable" + } + }, + "editableList": { + "add": "添加" + }, + "search": { + "empty": "找不到匹配", + "addNode": "添加一個節點..." + }, + "expressionEditor": { + "functions": "功能", + "functionReference": "Function reference", + "insert": "插入", + "title": "JSONata運算式編輯器", + "test": "Test", + "data": "示例消息", + "result": "結果", + "format": "格式表達方法", + "compatMode": "相容模式啟用", + "compatModeDesc": " 目前的運算式仍然參考msg
,所以將以相容性模式進行評估。請更新運算式,使其不使用msg
,因為此模式將在將來刪除。
當JSONata支持首次添加到Node-RED時,它需要運算式引用msg
物件。例如msg.payload
將用於訪問有效負載。
這樣便不再需要運算式直接針對消息進行評估。要訪問有效負載,運算式應該只是payload
.
緩衝區類型被存儲為位元組值的JSON陣列。編輯器將嘗試將輸入的數值解析為JSON陣列。如果它不是有效的JSON,它將被視為UTF-8字串,並被轉換為單個字元代碼點的陣列。
例如,Hello World
的值會被轉換為JSON陣列:
[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]" + }, + "projects": { + "config-git": "配置Git客戶端", + "welcome": { + "hello": "你好! 我們已經將“項目”引入了Node-RED。", + "desc0": "這是一種用於管理流程文件的新方法,並且包括對流程的版本控制。", + "desc1": "首先,您可以創建您的第一個項目或從git存儲庫克隆現有項目。", + "desc2": "如果不確定,可以暫時跳過此步驟。 您仍然可以隨時通過“項目”菜單創建第一個項目。", + "create": "創建項目", + "clone": "克隆存儲庫", + "openExistingProject": "打開現有項目", + "not-right-now": "不是現在" + }, + "git-config": { + "setup": "設置您的版本控制客戶端", + "desc0": "Node-RED使用開源工具Git進行版本控制。 它跟蹤對項目文件的更改,並允許您將其推送到遠程存儲庫。", + "desc1": "提交一組更改時,Git會使用用戶名和電子郵件地址記錄誰進行了更改。 用戶名可以是您想要的任何名稱-不必是您的真實姓名。", + "desc2": "您的Git客戶端已經配置了以下詳細信息。", + "desc3": "您可以稍後在設置對話框的“ Git config”標籤下更改這些設置。", + "username": "用戶名", + "email": "電子郵件" + }, + "project-details": { + "create": "創建您的項目", + "desc0": "項目被維護為Git存儲庫。 與他人共享您的流程並進行協作更容易。", + "desc1": "您可以創建多個項目,並通過編輯器在它們之間快速切換。", + "desc2": "首先,您的項目需要一個名稱和一個可選的描述。", + "already-exists": "項目已存在", + "must-contain": "必須僅包含A-Z 0-9 _ -", + "project-name": "項目名", + "desc": "描述", + "opt": "可選的" + }, + "clone-project": { + "clone": "克隆項目", + "desc0": "如果您已經有一個包含項目的git存儲庫,則可以對其進行克隆以開始使用。", + "already-exists": "項目已經存在", + "must-contain": "必須僅包含A-Z 0-9 _ -", + "project-name": "項目名", + "no-info-in-url": "網址中不要包含用戶名/密碼", + "git-url": "Git存儲庫URL", + "protocols": "https://, ssh:// or file://", + "auth-failed": "驗證失敗", + "username": "用戶名", + "passwd": "密碼", + "ssh-key": "SSH密鑰", + "passphrase": "密碼短語", + "ssh-key-desc": "在通過ssh克隆存儲庫之前,必須添加SSH密鑰才能訪問它。", + "ssh-key-add": "添加一個ssh密鑰", + "credential-key": "證書加密密鑰", + "cant-get-ssh-key": "錯誤! 無法獲取所選的SSH密鑰路徑。", + "already-exists2": "已存在", + "git-error": "git錯誤", + "connection-failed": "連接失敗", + "not-git-repo": "不是一個git倉庫", + "repo-not-found": "未發現倉庫" + }, + "default-files": { + "create": "創建您的項目文件", + "desc0": "一個項目包含您的流程文件,自述文件和package.json文件。", + "desc1": "它可以包含您要在Git存儲庫中維護的任何其他文件。", + "desc2": "您現有的流程和證書文件將被複製到項目中。", + "flow-file": "流文件", + "credentials-file": "證書文件" + }, + "encryption-config": { + "setup": "設置證書文件的加密", + "desc0": "您的流程證書文件可以被加密以確保其內容安全。", + "desc1": "如果要將這些證書存儲在公共Git存儲庫中,則必須通過提供密鑰短語來對它們進行加密。", + "desc2": "您的流程證書文件當前未加密。", + "desc3": "這意味著任何有權訪問該文件的人都可以讀取其內容,例如密碼和訪問令牌。", + "desc4": "如果要將這些證書存儲在公共Git存儲庫中,則必須通過提供密鑰短語來對它們進行加密。", + "desc5": "當前,使用設置文件中的credentialSecret屬性作為密鑰來加密流憑據文件。", + "desc6": "您的流程證書文件當前使用系統生成的密鑰加密。 您應該為此項目提供一個新的密鑰。", + "desc7": "密鑰將與項目文件分開存儲。 您將需要提供在另一個Node-RED實例中使用該項目的密鑰。", + "credentials": "證書", + "enable": "啟用加密", + "disable": "禁用加密", + "disabled": "禁用的", + "copy": "複製現有密鑰", + "use-custom": "使用自定義密鑰", + "desc8": "憑證文件不會被加密,其內容很容易閱讀", + "create-project-files": "創建項目文件", + "create-project": "創建項目", + "already-exists": "已存在", + "git-error": "git錯誤", + "git-auth-error": "git認證錯誤" + }, + "create-success": { + "success": "您已經成功創建了第一個項目!", + "desc0": "現在,您可以像往常一樣繼續使用Node-RED。", + "desc1": "側欄中的“信息”標籤顯示了您當前的活動項目。名稱旁邊的按鈕可用於訪問項目設置視圖。", + "desc2": "側欄中的“歷史記錄”標籤可用於查看項目中已更改的文件並提交。 它向您顯示了提交的完整歷史記錄,並允許您將更改推送到遠程存儲庫。" + }, + "create": { + "projects": "項目", + "already-exists": "項目已存在", + "must-contain": "必須僅包含A-Z 0-9 _ -", + "no-info-in-url": "網址中不要包含用戶名/密碼", + "open": "打開項目", + "create": "創建項目", + "clone": "克隆倉庫", + "project-name": "項目名", + "desc": "描述", + "opt": "可選的", + "flow-file": "流程文件", + "credentials": "證書", + "enable-encryption": "啟用加密", + "disable-encryption": "禁用加密", + "encryption-key": "加密的密鑰", + "desc0": "用來保護您的憑證的短語", + "desc1": "憑證文件不會被加密,其內容很容易閱讀", + "git-url": "Git倉庫的URL", + "protocols": "https://, ssh:// or file://", + "auth-failed": "驗證失敗", + "username": "用戶名", + "password": "密碼", + "ssh-key": "SSH密鑰", + "passphrase": "密碼短語", + "desc2": "在通過ssh克隆存儲庫之前,必須添加SSH密鑰才能訪問它。", + "add-ssh-key": "添加一個ssh密鑰", + "credentials-encryption-key": "憑證加密密鑰", + "already-exists-2": "已存在", + "git-error": "git錯誤", + "con-failed": "連接失敗", + "not-git": "不是git倉庫", + "no-resource": "找不到存儲庫", + "cant-get-ssh-key-path": "錯誤! 無法獲取所選的SSH密鑰路徑。", + "unexpected_error": "意外的錯誤" + }, + "delete": { + "confirm": "您確定要刪除此項目嗎?" + }, + "create-project-list": { + "search": "搜尋您的項目", + "current": "當前的" + }, + "require-clean": { + "confirm": "
您有未部署的更改,這些更改將丟失。
您要繼續嗎?
" + }, + "send-req": { + "auth-req": "存儲庫需要認證", + "username": "用戶名", + "password": "密碼", + "passphrase": "密碼短語", + "retry": "重試", + "update-failed": "無法更新身份驗證", + "unhandled": "未處理的錯誤響應" + }, + "create-branch-list": { + "invalid": "無效的分支", + "create": "創建分支", + "current": "當前的" + }, + "create-default-file-set": { + "no-active": "沒有活動項目就無法創建默認文件集", + "no-empty": "無法在非空項目上創建默認文件集", + "git-error": "git error" + }, + "errors": { + "no-username-email": "您的Git客戶端未配置用戶名/電子郵件。", + "unexpected": "發生了一個意料之外的問題", + "code": "代碼" + } + }, + "editor-tab": { + "properties": "屬性", + "envProperties": "環境變量", + "description": "描述", + "appearance": "外觀", + "preview": "UI預覽", + "defaultValue": "默認值", + "env": "環境變量" + }, + "languages": { + "de": "德語", + "en-US": "英語", + "ja": "日語", + "ko": "韓語", + "zh-CN": "簡體中文", + "zh-TW": "繁體中文" + } +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-TW/infotips.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-TW/infotips.json new file mode 100644 index 0000000..f783f2e --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-TW/infotips.json @@ -0,0 +1,23 @@ +{ + "info": { + "tip0" : "您可以用 {{core:delete-selection}} 刪除選擇的節點或連結。", + "tip1" : "{{core:search}} 可以在流程內搜索節點。", + "tip2": "{{core:toggle-sidebar}} 可以顯示或隱藏邊側欄。", + "tip3": "您可以在 {{core:manage-palette}} 中管理節點的控制台。", + "tip4": "側邊欄中會列出流程中所有的配置節點。您可以通過功能表或者 {{core:show-config-tab}} 來訪問這些節點。", + "tip5": "您可以在設定中選擇顯示或隱藏這些提示。", + "tip6": "您可以用[left] [up] [down] [right]鍵來移動被選中的節點。按住[shift]可以更快地移動節點。", + "tip7": "把節點拖到連接上可以向連接中插入節點。", + "tip8": "您可以用 {{core:show-export-dialog}} 來匯出被選中的節點或標籤頁中的流程。", + "tip9": "您可以將流程的json文字檔拖入編輯方塊或 {{core:show-import-dialog}} 來導入流程。", + "tip10": "按住[shift]後按一下並拖動節點可以將該節點的多個連接一併移動到其他節點的埠。", + "tip11": "{{core:show-info-tab}} 可以顯示「資訊」標籤頁。 {{core:show-debug-tab}} 可以顯示「調試」標籤頁。", + "tip12": "按住[ctrl]的同時點擊工作介面可以在節點的對話欄中快速添加節點。", + "tip13": "按住[ctrl]的同時點擊節點的埠或後續節點可以快速連接多個節點。", + "tip14": "按住[shift]的同時點擊節點會選中所有被連接的節點。", + "tip15": "按住[ctrl]的同時點擊節點可以在選中或取消選中節點。", + "tip16": "{{core:show-previous-tab}} 和 {{core:show-next-tab}} 可以切換標籤頁。", + "tip17": "您可以在節點的屬性配置畫面中通過 {{core:confirm-edit-tray}} 來更改設置,或者用 {{core:cancel-edit-tray}} 來取消更改。", + "tip18": "您可以通過點擊 {{core:edit-selected-node}} 來顯示被選中節點的屬性設置畫面。" + } +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-TW/jsonata.json b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-TW/jsonata.json new file mode 100644 index 0000000..6d99ffc --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/locales/zh-TW/jsonata.json @@ -0,0 +1,270 @@ +{ + "$string": { + "args": "arg", + "desc": "通過以下的類型轉換規則將參數*arg*轉換成字串:\n\n - 字串不轉換。\n -函數轉換成空的字串。\n - JSON的值無法用數字表示所以用無限大或者NaN(非數)表示。\n - 用’JSON.stringify’函數將其他值轉換成JSON字串。" + }, + "$length": { + "args": "str", + "desc": "輸出字串’str’的字數。如果’str’不是字串,拋出錯誤。" + }, + "$substring": { + "args": "str, start[, length]", + "desc": "輸出`start`位置後的的首次出現的包括`str`的子字串。 如果`length`被指定,那麼的字串中將只包括前`length`個文字。如果`start`是負數則輸出從`str`末尾開始的`length`個文字" + }, + "$substringBefore": { + "args": "str, chars", + "desc": "輸出’str’中首次出現的’chars’之前的子字串,如果’str’中不包括’chars’則輸出’str’。" + }, + "$substringAfter": { + "args": "str, chars", + "desc": "輸出’str’中首次出現的’chars’之後的子字串,如果’str’中不包括’chars’則輸出’str’。" + }, + "$uppercase": { + "args": "str", + "desc": "`將’str’中的所有字母變為大寫後輸出。" + }, + "$lowercase": { + "args": "str", + "desc": "將’str’中的所有字母變為小寫後輸出。" + }, + "$trim": { + "args": "str", + "desc": "將以下步驟應用於`str`來去除所有空白文字並實現標準化。\n\n – 將全部tab定位字元、Enter鍵、換行字元用空白代替。\n- 將連續的空白文字變成一個空白文字。\n- 消除開頭和末尾的空白文字。\n\n如果`str`沒有被指定(即在無輸入參數的情況下調用本函數),將上下文的值作為`str`來使用。 如果`str` 不是字串則拋出錯誤。" + }, + "$contains": { + "args": "str, pattern", + "desc": "字串`str` 和 `pattern`匹配的話輸出`true`,不匹配的情況下輸出 `false`。 不指定`str`的情況下(比如用一個參數調用本函數時)、將上下文的值作為`str`來使用。參數 `pattern`可以為字串或正則表達。" + }, + "$split": { + "args": "str[, separator][, limit]", + "desc": "將參數`str`分解成由子字串組成的陣列。 如果`str`不是字串拋出錯誤。可以省略的參數 `separator`中指定字串`str`的分隔符號。分隔符號可以是文字或規則運算式。在不指定`separator`的情況下、將分隔符號看作空的字串並把`str`拆分成由單個字母組成的陣列。如果`separator`不是字串則拋出錯誤。在可省略的參數`limit`中指定分割後的子字串的最大個數。超出個數的子字串將被捨棄。如果`limit`沒有被指定,`str` 將不考慮子字串的個數而將字串完全分隔。如果`limit`是負數則拋出錯誤。" + }, + "$join": { + "args": "array[, separator]", + "desc": "用可以省略的參數 `separator`來把多個字元串連接。如果`array`不是字串則拋出錯誤。 如果沒有指定`separator`,則用空字串來連接字元(即字串之間沒有`separator`)。 如果`separator`不是字元則拋出錯誤。" + }, + "$match": { + "args": "str, pattern [, limit]", + "desc": "對字串`str`使用規則運算式`pattern`並輸出與`str`相匹配的部分資訊。" + }, + "$replace": { + "args": "str, pattern, replacement [, limit]", + "desc": "在字串`str`中搜索`pattern`並用`replacement`來替換。\n\n可選參數`limit`用來指定替換次數的上限。" + }, + "$now": { + "args": "", + "desc": "生成ISO 8601互換格式的時刻,並作為字串輸出。" + }, + "$base64encode": { + "args": "string", + "desc": "將ASCII格式的字串轉換為Base 64格式。將字串中的文字視作二進位形式的資料處理。包含URI編碼在內的字串文字必須在0x00到0xFF的範圍內,否則不會被支持。" + }, + "$base64decode": { + "args": "string", + "desc": "用UTF-8內碼表將Base 64形式二進位值轉換為字串。" + }, + "$number": { + "args": "arg", + "desc": "用下述的規則將參數 `arg`轉換為數值。:\n\n – 數值不做轉換。\n – 將字串中合法的JSON數値表示轉換成數値。\n – 其他形式的值則拋出錯誤。" + }, + "$abs": { + "args": "number", + "desc": "輸出參數`number`的絕對值。" + }, + "$floor": { + "args": "number", + "desc": "輸出比`number`的值小的最大整數。" + }, + "$ceil": { + "args": "number", + "desc": "輸出比`number`的值大的最小整數。" + }, + "$round": { + "args": "number [, precision]", + "desc": "輸出四捨五入後的參數`number`。可省略的參數 `precision`指定四捨五入後小數點下的位數。" + }, + "$power": { + "args": "base, exponent", + "desc": "輸出底數`base`的`exponent`次冪。" + }, + "$sqrt": { + "args": "number", + "desc": "輸出參數 `number`的平方根。" + }, + "$random": { + "args": "", + "desc": "輸出比0大,比1小的偽亂數。" + }, + "$millis": { + "args": "", + "desc": "返回從UNIX時間 (1970年1月1日 UTC/GMT的午夜)開始到現在的毫秒數。在同一個運算式的測試中所有對`$millis()`的調用將會返回相同的值。" + }, + "$sum": { + "args": "array", + "desc": "輸出陣列`array`的總和。如果`array`不是數值則拋出錯誤。" + }, + "$max": { + "args": "array", + "desc": "輸出陣列`array`的最大值。如果`array`不是數值則拋出錯誤。" + }, + "$min": { + "args": "array", + "desc": "輸出陣列`array`的最小值。如果`array`不是數值則拋出錯誤。。" + }, + "$average": { + "args": "array", + "desc": "輸出陣列`array`的平均數。如果`array`不是數值則拋出錯誤。。" + }, + "$boolean": { + "args": "arg", + "desc": "用下述規則將資料轉換成布林值。:\n\n - 不轉換布林值`Boolean`。\n – 將空的字串`string`轉換為`false`\n – 將不為空的字串`string`轉換為`true`\n – 將為0的數位`number`轉換成`false`\n –將不為0的數位`number`轉換成`true`\n –將`null`轉換成`false`\n –將空的陣列`array`轉換成`false`\n –如果陣列`array`中含有可以轉換成`true`的要素則轉換成`true`\n –如果`array`中沒有可轉換成`true`的要素則轉換成`false`\n – 空的物件`object`轉換成`false`\n – 非空的物件`object`轉換成`true`\n –將函數`function`轉換成`false`" + }, + "$not": { + "args": "arg", + "desc": "輸出做反轉運算後的布林值。首先將`arg`轉換為布林值。" + }, + "$exists": { + "args": "arg", + "desc": "如果算式`arg`的值存在則輸出`true`。如果算式的值不存在(比如指向不存在區域的引用)則輸出`false`。" + }, + "$count": { + "args": "array", + "desc": "輸出陣列中的元素數。" + }, + "$append": { + "args": "array, array", + "desc": "將兩個陣列連接。" + }, + "$sort": { + "args": "array [, function]", + "desc": "輸出排序後的陣列`array`。\n\n如果使用了比較函數`function`,則下述兩個參數需要被指定。\n\n`function(left, right)`\n\n該比較函數是為了比較left和right兩個值而被排序演算法調用的。如果使用者希望left的值被置於right的值之後,那麼該函數必須輸出布林值`true`來表示位置交換。而在不需要位置交換時函數必須輸出`false`。" + }, + "$reverse": { + "args": "array", + "desc": "輸出倒序後的陣列`array`。" + }, + "$shuffle": { + "args": "array", + "desc": "輸出隨機排序後的陣列 `array`。" + }, + "$zip": { + "args": "array, ...", + "desc": "將陣列中的值按索引順序打包後輸出。" + }, + "$keys": { + "args": "object", + "desc": "輸出由物件內的鍵組成的陣列。如果參數是物件的陣列則輸出由所有物件中的鍵去重後組成的佇列。" + }, + "$lookup": { + "args": "object, key", + "desc": "輸出對象中與參數`key`對應的值。如果第一個參數`object`是陣列,那麼陣列中所有的物件都將被搜索並輸出這些物件中與參數`key`對應的值。" + }, + "$spread": { + "args": "object", + "desc": "將物件中的鍵值對分隔成每個要素中只含有一個鍵值對的陣列。如果參數`object`是陣列,那麼返回值的陣列中包含所有物件中的鍵值對。" + }, + "$merge": { + "args": "array<object>", + "desc": "將輸入陣列`objects`中所有的鍵值對合併到一個`object`中並返回。如果輸入陣列的要素中含有重複的鍵,則返回的`object`中將只包含陣列中最後出現要素的值。如果輸入陣列中包括物件以外的元素,則拋出錯誤。" + }, + "$sift": { + "args": "object, function", + "desc": "輸出參數`object`中符合`function`的鍵值對。\n\n`function`必須含有下述參數。\n\n`function(value [, key [, object]])`" + }, + "$each": { + "args": "object, function", + "desc": "將函數`function`應用於`object`中的所有鍵值對並輸出由所有返回值組成的陣列。" + }, + "$map": { + "args": "array, function", + "desc": "將函數`function`應用於陣列`array`中所有的值並輸出由返回值組成的陣列。\n\n`function`中必須含有下述參數。\n\n`function(value [, index [, array]])`" + }, + "$filter": { + "args": "array, function", + "desc": "輸出陣列`array`中符合函數`function`條件的值組成的陣列。\n\n`function`必須包括下述參數。\n\n`function(value [, index [, array]])`" + }, + "$reduce": { + "args": "array, function [, init]", + "desc": "將`function`依次應用於陣列中的各要素值。 其中,前一個要素值的計算結果將參與到下一次的函數運算中。。\n\n函數`function`接受兩個參數並作為中綴標記法中的操作符。\n\n可省略的參數`init`將作為運算的初始值。" + }, + "$flowContext": { + "args": "string", + "desc": "獲取流上下文(流等級的上下文,可以讓所有節點共用)的屬性。" + }, + "$globalContext": { + "args": "string", + "desc": "獲取全域上下文的屬性。" + }, + "$pad": { + "args": "string, width [, char]", + "desc": "根據需要,向字串`string`的副本中填充文字使該字串的字數達到`width`的絕對值並返回填充文字後的字串。\n\n如果`width`的值為正,則向字串`string`的右側填充文字,如果`width`為負,則向字串`string`的左側填充文字。\n\n可選參數`char`用來指定填充的文字。如果未指定該參數,則填充空白文字。" + }, + "$fromMillis": { + "args": "number", + "desc": "將表示從UNIX時間 (1970年1月1日 UTC/GMT的午夜)開始到現在的毫秒數的數值轉換成ISO 8601形式時間戳記的字串。" + }, + "$formatNumber": { + "args": "number, picture [, options]", + "desc": "將`number`轉換成具有`picture`所指定的數值格式的字串。\n\n此函數的功能與XPath F&O 3.1規格中定義的XPath/XQuery函數的fn:format-number功能相一致。參數`picture`用於指定數值的轉換格式,其語法與fn:format-number中的定義一致。\n\n可選的第三參數`options`用來覆蓋預設的局部環境格式,如小數點分隔符號。如果指定該參數,那麼該參數必須是包含name/value對的物件,並且name/value對必須符合XPath F&O 3.1規格中記述的數值格式。" + }, + "$formatBase": { + "args": "number [, radix]", + "desc": "將`number`變換為以參數`radix`的值為基數形式的字串。如果不指定`radix`的值,則默認基數為10。指定的`radix`值必須在2~36之間,否則拋出錯誤。" + }, + "$toMillis": { + "args": "timestamp", + "desc": "將ISO 8601格式的字串`timestamp`轉換為從UNIX時間 (1970年1月1日 UTC/GMT的午夜)開始到現在的毫秒數。如果該字串的格式不正確,則拋出錯誤。" + }, + "$env": { + "args": "arg", + "desc": "返回環境變量的值。\n\n這是Node-RED定義的函數。" + }, + "$eval": { + "args": "expr [, context]", + "desc": "使用當前上下文來作為評估依據,分析並評估字符串`expr`,其中包含文字JSON或JSONata表達式。" + }, + "$formatInteger": { + "args": "number, picture", + "desc": "將“數字”轉換為字符串,並將其格式化為“圖片”字符串指定的整數表示形式。圖片字符串參數定義了數字的格式,並具有與XPath F&O 3.1 規範中的fn:format-integer相同的語法。" + }, + "$parseInteger": { + "args": "string, picture", + "desc": "使用“圖片”字符串指定的格式將“字符串”參數的內容解析為整數(作為JSON數字)。圖片字符串參數與$formatInteger格式相同。." + }, + "$error": { + "args": "[str]", + "desc": "引發錯誤並顯示一條消息。 可選的`str`將替代$error()函數評估的默認消息。" + }, + "$assert": { + "args": "arg, str", + "desc": "如果`arg`為真,則該函數返回。 如果arg為假,則拋出帶有str的異常作為異常消息。" + }, + "$single": { + "args": "array, function", + "desc": "返回滿足參數function謂語的array參數中的唯一值 (比如:傳遞值時,函數返回布林值“true”)。如果匹配值的數量不唯一時,則拋出異常。\n\n應在以下簽名中提供函數:`function(value [,index [,array []]])`其中value是數組的每個輸入,index是該值的位置,整個數組作為第三個參數傳遞。" + }, + "$encodeUrl": { + "args": "str", + "desc": "通過用表示字符的UTF-8編碼的一個,兩個,三個或四個轉義序列替換某些字符的每個實例,對統一資源定位符(URL)組件進行編碼。\n\n示例:`$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`" + }, + "$encodeUrlComponent": { + "args": "str", + "desc": "通過用表示字符的UTF-8編碼的一個,兩個,三個或四個轉義序列替換某些字符的每個實例,對統一資源定位符(URL)進行編碼。\n\n示例: `$encodeUrl(\"https://mozilla.org/?x=шеллы\")` => `\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\"`" + }, + "$decodeUrl": { + "args": "str", + "desc": "解碼以前由encodeUrlComponent創建的統一資源定位器(URL)組件。 \n\n示例: `$decodeUrlComponent(\"%3Fx%3Dtest\")` => `\"?x=test\"`" + }, + "$decodeUrlComponent": { + "args": "str", + "desc": "解碼先前由encodeUrl創建的統一資源定位符(URL)。 \n\n示例: `$decodeUrl(\"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B\")` => `\"https://mozilla.org/?x=шеллы\"`" + }, + "$distinct": { + "args": "array", + "desc": "返回一個數組,其中重復的值已從`數組`中刪除" + }, + "$type": { + "args": "value", + "desc": "以字符串形式返回`值`的類型。 如果該`值`未定義,則將返回`未定義`" + } +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/package.json b/packages/connector/packages/node_modules/@node-red/editor-client/package.json new file mode 100644 index 0000000..0b3e16e --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/package.json @@ -0,0 +1,18 @@ +{ + "name": "@node-red/editor-client", + "version": "1.0.4", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red.git" + }, + "contributors": [ + { + "name": "Nick O'Leary" + }, + { + "name": "Dave Conway-Jones" + } + ], + "main": "./lib/index.js" +} diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/src/ace/README.md b/packages/connector/packages/node_modules/@node-red/editor-client/src/ace/README.md new file mode 100644 index 0000000..bbcef57 --- /dev/null +++ b/packages/connector/packages/node_modules/@node-red/editor-client/src/ace/README.md @@ -0,0 +1,50 @@ +How to build the custom ACE modes for Node-RED +---------------------------------------------- + +Node-RED includes custom JSONata and JavaScript modes. + + +## JSONata + +The `ace/mode/jsonata` mode is maintained under `editor-client/src/vendor/jsonata`. +Those files are edited in place and copied into the build by Grunt. + +## JavaScript + +The `ace/mode/nrjavascript` mode is used exclusively by the Function node. It +inherits almost entirely from the normal JavaScript mode. The one key difference +is that it wraps the code with a Function before parsing. This is required to +avoid some false-flagged errors. + +The source of the mode is under `editor-client/src/ace/mode`. If those files are +modified in anyway, they *must* be manually built to generate the files under +`editor-client/src/ace/bin` and checked in. Those files are the ones the Grunt +built copies out in the Node-RED build. + +### Building the mode files + + +#### Setup build environment + + cd /tmp/ + git clone https://github.com/ajaxorg/ace.git + cd ace + npm install + +#### Copy mode src files into build environment + + cd"+RED._("clipboard.importUnrecognised",{count:unknownTypes.length})+"
"+typeList,"error",false,10000); + } + + var activeWorkspace = RED.workspaces.active(); + //TODO: check the z of the subflow instance and check _that_ if it exists + var activeSubflow = getSubflow(activeWorkspace); + for (i=0;i"+message+"
"); + RED.sidebar.info.refresh() + }); + }); + return; + } + + if (msg.text) { + msg.default = msg.text; + var text = RED._(msg.text,msg); + var options = { + type: msg.type, + fixed: msg.timeout === undefined, + timeout: msg.timeout, + id: notificationId + } + if (notificationId === "runtime-state") { + if (msg.error === "safe-mode") { + options.buttons = [ + { + text: RED._("common.label.close"), + click: function() { + persistentNotifications[notificationId].hideNotification(); + } + } + ] + } else if (msg.error === "missing-types") { + text+="').appendTo(parseError);
+ $('').text(v.substring(errorPos-12,errorPos)).appendTo(code)
+ $('').text(v.charAt(errorPos)).appendTo(code);
+ $('').text(v.substring(errorPos+1,errorPos+12)).appendTo(code);
+ }
+ popover.close(true).setContent(message).open();
+ currentPopoverError = errString;
+ }
+ } else {
+ currentPopoverError = null;
+ }
+ $("#red-ui-clipboard-dialog-ok").button("disable");
+ }
+ },100);
+ } else {
+ var file = libraryBrowser.getSelected();
+ if (file && file.label && !file.children) {
+ $("#red-ui-clipboard-dialog-ok").button("enable");
+ } else {
+ $("#red-ui-clipboard-dialog-ok").button("disable");
+ }
+ }
+ }
+
+ function importNodes(mode) {
+ if (disabled) {
+ return;
+ }
+ mode = mode || "clipboard";
+
+ dialogContainer.empty();
+ dialogContainer.append($(importNodesDialog));
+
+ var tabs = RED.tabs.create({
+ id: "red-ui-clipboard-dialog-import-tabs",
+ vertical: true,
+ onchange: function(tab) {
+ $("#red-ui-clipboard-dialog-import-tabs-content").children().hide();
+ $("#" + tab.id).show();
+ activeTab = tab.id;
+ if (popover) {
+ popover.close(true);
+ currentPopoverError = null;
+ }
+ if (tab.id === "red-ui-clipboard-dialog-import-tab-clipboard") {
+ $("#red-ui-clipboard-dialog-import-text").trigger("focus");
+ } else {
+ libraryBrowser.focus();
+ }
+ validateImport();
+ }
+ });
+ tabs.addTab({
+ id: "red-ui-clipboard-dialog-import-tab-clipboard",
+ label: RED._("clipboard.clipboard")
+ });
+ tabs.addTab({
+ id: "red-ui-clipboard-dialog-import-tab-library",
+ label: RED._("library.library")
+ });
+ tabs.addTab({
+ id: "red-ui-clipboard-dialog-import-tab-examples",
+ label: RED._("library.types.examples")
+ });
+
+ $("#red-ui-clipboard-dialog-tab-library-name").on("keyup", validateExportFilename);
+ $("#red-ui-clipboard-dialog-tab-library-name").on('paste',function() { setTimeout(validateExportFilename,10)});
+ $("#red-ui-clipboard-dialog-export").button("enable");
+
+ libraryBrowser = RED.library.createBrowser({
+ container: $("#red-ui-clipboard-dialog-import-tab-library"),
+ onselect: function(file) {
+ if (file && file.label && !file.children) {
+ $("#red-ui-clipboard-dialog-ok").button("enable");
+ } else {
+ $("#red-ui-clipboard-dialog-ok").button("disable");
+ }
+ },
+ onconfirm: function(item) {
+ if (item && item.label && !item.children) {
+ $("#red-ui-clipboard-dialog-ok").trigger("click");
+ }
+ }
+ })
+ loadFlowLibrary(libraryBrowser,"local",RED._("library.types.local"));
+
+ examplesBrowser = RED.library.createBrowser({
+ container: $("#red-ui-clipboard-dialog-import-tab-examples"),
+ onselect: function(file) {
+ if (file && file.label && !file.children) {
+ $("#red-ui-clipboard-dialog-ok").button("enable");
+ } else {
+ $("#red-ui-clipboard-dialog-ok").button("disable");
+ }
+ },
+ onconfirm: function(item) {
+ if (item && item.label && !item.children) {
+ $("#red-ui-clipboard-dialog-ok").trigger("click");
+ }
+ }
+ })
+ loadFlowLibrary(examplesBrowser,"_examples_",RED._("library.types.examples"));
+
+
+ dialogContainer.i18n();
+
+ $("#red-ui-clipboard-dialog-ok").show();
+ $("#red-ui-clipboard-dialog-cancel").show();
+ $("#red-ui-clipboard-dialog-export").hide();
+ $("#red-ui-clipboard-dialog-download").hide();
+ $("#red-ui-clipboard-dialog-ok").button("disable");
+ $("#red-ui-clipboard-dialog-import-text").on("keyup", validateImport);
+ $("#red-ui-clipboard-dialog-import-text").on('paste',function() { setTimeout(validateImport,10)});
+
+ $("#red-ui-clipboard-dialog-import-opt > a").on("click", function(evt) {
+ evt.preventDefault();
+ if ($(this).hasClass('disabled') || $(this).hasClass('selected')) {
+ return;
+ }
+ $(this).parent().children().removeClass('selected');
+ $(this).addClass('selected');
+ });
+
+ $("#red-ui-clipboard-dialog-import-file-upload").on("change", function() {
+ var fileReader = new FileReader();
+ fileReader.onload = function () {
+ $("#red-ui-clipboard-dialog-import-text").val(fileReader.result);
+ validateImport();
+ };
+ fileReader.readAsText($(this).prop('files')[0]);
+ })
+ $("#red-ui-clipboard-dialog-import-file-upload-btn").on("click", function(evt) {
+ evt.preventDefault();
+ $("#red-ui-clipboard-dialog-import-file-upload").trigger("click");
+ })
+
+ tabs.activateTab("red-ui-clipboard-dialog-import-tab-"+mode);
+ if (mode === 'clipboard') {
+ setTimeout(function() {
+ $("#red-ui-clipboard-dialog-import-text").trigger("focus");
+ },100)
+ }
+
+
+ dialog.dialog("option","title",RED._("clipboard.importNodes")).dialog("open");
+ popover = RED.popover.create({
+ target: $("#red-ui-clipboard-dialog-import-text"),
+ trigger: "manual",
+ direction: "bottom",
+ content: ""
+ });
+ }
+
+ function exportNodes(mode) {
+ if (disabled) {
+ return;
+ }
+
+ mode = mode || "clipboard";
+
+ dialogContainer.empty();
+ dialogContainer.append($(exportNodesDialog));
+
+ var tabs = RED.tabs.create({
+ id: "red-ui-clipboard-dialog-export-tabs",
+ vertical: true,
+ onchange: function(tab) {
+ $("#red-ui-clipboard-dialog-export-tabs-content").children().hide();
+ $("#" + tab.id).show();
+ activeTab = tab.id;
+ if (tab.id === "red-ui-clipboard-dialog-export-tab-clipboard") {
+ $("#red-ui-clipboard-dialog-export").button("option","label", RED._("clipboard.export.copy"))
+ $("#red-ui-clipboard-dialog-download").show();
+ } else {
+ $("#red-ui-clipboard-dialog-export").button("option","label", RED._("clipboard.export.export"))
+ $("#red-ui-clipboard-dialog-download").hide();
+ libraryBrowser.focus();
+ }
+
+ }
+ });
+ tabs.addTab({
+ id: "red-ui-clipboard-dialog-export-tab-clipboard",
+ label: RED._("clipboard.clipboard")
+ });
+ tabs.addTab({
+ id: "red-ui-clipboard-dialog-export-tab-library",
+ label: RED._("library.library")
+ });
+
+ $("#red-ui-clipboard-dialog-tab-library-name").on("keyup", validateExportFilename);
+ $("#red-ui-clipboard-dialog-tab-library-name").on('paste',function() { setTimeout(validateExportFilename,10)});
+ $("#red-ui-clipboard-dialog-export").button("enable");
+
+ libraryBrowser = RED.library.createBrowser({
+ container: $("#red-ui-clipboard-dialog-export-tab-library-browser"),
+ folderTools: true,
+ onselect: function(file) {
+ if (file && file.label && !file.children) {
+ $("#red-ui-clipboard-dialog-tab-library-name").val(file.label);
+ }
+ }
+ })
+ loadFlowLibrary(libraryBrowser,"local",RED._("library.types.local"));
+
+ $("#red-ui-clipboard-dialog-tab-library-name").val("flows.json").select();
+
+ dialogContainer.i18n();
+ var format = RED.settings.flowFilePretty ? "red-ui-clipboard-dialog-export-fmt-full" : "red-ui-clipboard-dialog-export-fmt-mini";
+
+ $("#red-ui-clipboard-dialog-export-fmt-group > a").on("click", function(evt) {
+ evt.preventDefault();
+ if ($(this).hasClass('disabled') || $(this).hasClass('selected')) {
+ $("#red-ui-clipboard-dialog-export-text").trigger("focus");
+ return;
+ }
+ $(this).parent().children().removeClass('selected');
+ $(this).addClass('selected');
+
+ var flow = $("#red-ui-clipboard-dialog-export-text").val();
+ if (flow.length > 0) {
+ var nodes = JSON.parse(flow);
+
+ format = $(this).attr('id');
+ if (format === 'red-ui-clipboard-dialog-export-fmt-full') {
+ flow = JSON.stringify(nodes,null,4);
+ } else {
+ flow = JSON.stringify(nodes);
+ }
+ $("#red-ui-clipboard-dialog-export-text").val(flow);
+ setTimeout(function() { $("#red-ui-clipboard-dialog-export-text").scrollTop(0); },50);
+
+ $("#red-ui-clipboard-dialog-export-text").trigger("focus");
+ }
+ });
+
+ $("#red-ui-clipboard-dialog-export-rng-group > a").on("click", function(evt) {
+ evt.preventDefault();
+ if ($(this).hasClass('disabled') || $(this).hasClass('selected')) {
+ return;
+ }
+ $(this).parent().children().removeClass('selected');
+ $(this).addClass('selected');
+ var type = $(this).attr('id');
+ var flow = "";
+ var nodes = null;
+ if (type === 'red-ui-clipboard-dialog-export-rng-selected') {
+ var selection = RED.workspaces.selection();
+ if (selection.length > 0) {
+ nodes = [];
+ selection.forEach(function(n) {
+ nodes.push(n);
+ nodes = nodes.concat(RED.nodes.filterNodes({z:n.id}));
+ });
+ } else {
+ nodes = RED.view.selection().nodes||[];
+ }
+ // Don't include the subflow meta-port nodes in the exported selection
+ nodes = RED.nodes.createExportableNodeSet(nodes.filter(function(n) { return n.type !== 'subflow'}));
+ } else if (type === 'red-ui-clipboard-dialog-export-rng-flow') {
+ var activeWorkspace = RED.workspaces.active();
+ nodes = RED.nodes.filterNodes({z:activeWorkspace});
+ var parentNode = RED.nodes.workspace(activeWorkspace)||RED.nodes.subflow(activeWorkspace);
+ nodes.unshift(parentNode);
+ nodes = RED.nodes.createExportableNodeSet(nodes);
+ } else if (type === 'red-ui-clipboard-dialog-export-rng-full') {
+ nodes = RED.nodes.createCompleteNodeSet(false);
+ }
+ if (nodes !== null) {
+ if (format === "red-ui-clipboard-dialog-export-fmt-full") {
+ flow = JSON.stringify(nodes,null,4);
+ } else {
+ flow = JSON.stringify(nodes);
+ }
+ }
+ if (flow.length > 0) {
+ $("#red-ui-clipboard-dialog-export").removeClass('disabled');
+ } else {
+ $("#red-ui-clipboard-dialog-export").addClass('disabled');
+ }
+ $("#red-ui-clipboard-dialog-export-text").val(flow);
+ setTimeout(function() { $("#red-ui-clipboard-dialog-export-text").scrollTop(0); },50);
+ $("#red-ui-clipboard-dialog-export-text").trigger("focus");
+ })
+
+ $("#red-ui-clipboard-dialog-ok").hide();
+ $("#red-ui-clipboard-dialog-cancel").hide();
+ $("#red-ui-clipboard-dialog-export").hide();
+ var selection = RED.workspaces.selection();
+ if (selection.length > 0) {
+ $("#red-ui-clipboard-dialog-export-rng-selected").trigger("click");
+ } else {
+ selection = RED.view.selection();
+ if (selection.nodes) {
+ $("#red-ui-clipboard-dialog-export-rng-selected").trigger("click");
+ } else {
+ $("#red-ui-clipboard-dialog-export-rng-selected").addClass('disabled').removeClass('selected');
+ $("#red-ui-clipboard-dialog-export-rng-flow").trigger("click");
+ }
+ }
+ if (format === "red-ui-clipboard-dialog-export-fmt-full") {
+ $("#red-ui-clipboard-dialog-export-fmt-full").trigger("click");
+ } else {
+ $("#red-ui-clipboard-dialog-export-fmt-mini").trigger("click");
+ }
+ tabs.activateTab("red-ui-clipboard-dialog-export-tab-"+mode);
+ dialog.dialog("option","title",RED._("clipboard.exportNodes")).dialog( "open" );
+
+ $("#red-ui-clipboard-dialog-export-text").trigger("focus");
+ $("#red-ui-clipboard-dialog-cancel").show();
+ $("#red-ui-clipboard-dialog-export").show();
+ $("#red-ui-clipboard-dialog-download").show();
+
+ }
+
+ function loadFlowLibrary(browser,library,label) {
+ // if (includeExamples) {
+ // listing.push({
+ // library: "_examples_",
+ // type: "flows",
+ // icon: 'fa fa-hdd-o',
+ // label: RED._("library.types.examples"),
+ // path: "",
+ // children: function(done,item) {
+ // RED.library.loadLibraryFolder("_examples_","flows","",function(children) {
+ // item.children = children;
+ // done(children);
+ // })
+ // }
+ // })
+ // }
+ browser.data([{
+ library: library,
+ type: "flows",
+ icon: 'fa fa-hdd-o',
+ label: label,
+ path: "",
+ expanded: true,
+ children: function(done, item) {
+ RED.library.loadLibraryFolder(library,"flows","",function(children) {
+ item.children = children;
+ done(children);
+ })
+ }
+ }], true);
+
+ }
+
+ function hideDropTarget() {
+ $("#red-ui-drop-target").hide();
+ RED.keyboard.remove("escape");
+ }
+ function copyText(value,element,msg) {
+ var truncated = false;
+ if (typeof value !== "string" ) {
+ value = JSON.stringify(value, function(key,value) {
+ if (value !== null && typeof value === 'object') {
+ if (value.__enc__) {
+ if (value.hasOwnProperty('data') && value.hasOwnProperty('length')) {
+ truncated = value.data.length !== value.length;
+ return value.data;
+ }
+ if (value.type === 'function' || value.type === 'internal') {
+ return undefined
+ }
+ if (value.type === 'number') {
+ // Handle NaN and Infinity - they are not permitted
+ // in JSON. We can either substitute with a String
+ // representation or null
+ return null;
+ }
+ }
+ }
+ return value;
+ });
+ }
+ if (truncated) {
+ msg += "_truncated";
+ }
+ $("#red-ui-clipboard-hidden").val(value).select();
+ var result = document.execCommand("copy");
+ if (result && element) {
+ var popover = RED.popover.create({
+ target: element,
+ direction: 'left',
+ size: 'small',
+ content: RED._(msg)
+ });
+ setTimeout(function() {
+ popover.close();
+ },1000);
+ popover.open();
+ }
+ return result;
+ }
+ return {
+ init: function() {
+ setupDialogs();
+
+ $('').appendTo("#red-ui-editor");
+
+ RED.actions.add("core:show-export-dialog",exportNodes);
+ RED.actions.add("core:show-import-dialog",importNodes);
+
+ RED.actions.add("core:show-library-export-dialog",function() { exportNodes('library') });
+ RED.actions.add("core:show-library-import-dialog",function() { importNodes('library') });
+
+ RED.events.on("editor:open",function() { disabled = true; });
+ RED.events.on("editor:close",function() { disabled = false; });
+ RED.events.on("search:open",function() { disabled = true; });
+ RED.events.on("search:close",function() { disabled = false; });
+ RED.events.on("actionList:open",function() { disabled = true; });
+ RED.events.on("actionList:close",function() { disabled = false; });
+ RED.events.on("type-search:open",function() { disabled = true; });
+ RED.events.on("type-search:close",function() { disabled = false; });
+
+ $('
').appendTo('#red-ui-editor');
+
+ $('#red-ui-workspace-chart').on("dragenter",function(event) {
+ if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1 ||
+ $.inArray("Files",event.originalEvent.dataTransfer.types) != -1) {
+ $("#red-ui-drop-target").css({display:'table'});
+ RED.keyboard.add("*", "escape" ,hideDropTarget);
+ }
+ });
+
+ $('#red-ui-drop-target').on("dragover",function(event) {
+ if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1 ||
+ $.inArray("Files",event.originalEvent.dataTransfer.types) != -1) {
+ event.preventDefault();
+ }
+ })
+ .on("dragleave",function(event) {
+ hideDropTarget();
+ })
+ .on("drop",function(event) {
+ if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1) {
+ var data = event.originalEvent.dataTransfer.getData("text/plain");
+ data = data.substring(data.indexOf('['),data.lastIndexOf(']')+1);
+ RED.view.importNodes(data);
+ } else if ($.inArray("Files",event.originalEvent.dataTransfer.types) != -1) {
+ var files = event.originalEvent.dataTransfer.files;
+ if (files.length === 1) {
+ var file = files[0];
+ var reader = new FileReader();
+ reader.onload = (function(theFile) {
+ return function(e) {
+ RED.view.importNodes(e.target.result);
+ };
+ })(file);
+ reader.readAsText(file);
+ }
+ }
+ hideDropTarget();
+ event.preventDefault();
+ });
+
+ },
+ import: importNodes,
+ export: exportNodes,
+ copyText: copyText
+ }
+})();
diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/checkboxSet.js b/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/checkboxSet.js
new file mode 100644
index 0000000..157c1e4
--- /dev/null
+++ b/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/checkboxSet.js
@@ -0,0 +1,131 @@
+/**
+ * Copyright JS Foundation and other contributors, http://js.foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+(function($) {
+ $.widget( "nodered.checkboxSet", {
+ _create: function() {
+ var that = this;
+ this.uiElement = this.element.wrap( "" ).parent();
+ this.uiElement.addClass("red-ui-checkboxSet");
+ if (this.options.parent) {
+ this.parent = this.options.parent;
+ this.parent.checkboxSet('addChild',this.element);
+ }
+ this.children = [];
+ this.partialFlag = false;
+ this.stateValue = 0;
+ var initialState = this.element.prop('checked');
+ this.options = [
+ $('" )
+ .parent();
+
+ if (this.options.header) {
+ this.options.header.addClass("red-ui-editableList-header");
+ this.borderContainer = this.uiContainer.wrap("").parent();
+ this.borderContainer.prepend(this.options.header);
+ this.topContainer = this.borderContainer.wrap("").parent();
+ } else {
+ this.topContainer = this.uiContainer.wrap("").parent();
+ }
+ this.topContainer.addClass('red-ui-editableList');
+ if (this.options.class) {
+ this.topContainer.addClass(this.options.class);
+ }
+
+ if (this.options.addButton !== false) {
+ var addLabel;
+ if (typeof this.options.addButton === 'string') {
+ addLabel = this.options.addButton
+ } else {
+ if (RED && RED._) {
+ addLabel = RED._("editableList.add");
+ } else {
+ addLabel = 'add';
+ }
+ }
+ $(' '+addLabel+'')
+ .appendTo(this.topContainer)
+ .on("click", function(evt) {
+ evt.preventDefault();
+ that.addItem({});
+ });
+ }
+ if (this.element.css("position") === "absolute") {
+ ["top","left","bottom","right"].forEach(function(s) {
+ var v = that.element.css(s);
+ if (v!=="auto" && v!=="") {
+ that.topContainer.css(s,v);
+ that.uiContainer.css(s,"0");
+ that.element.css(s,'auto');
+ }
+ })
+ this.element.css("position","static");
+ this.topContainer.css("position","absolute");
+ this.uiContainer.css("position","absolute");
+
+ }
+ if (this.options.header) {
+ this.borderContainer.addClass("red-ui-editableList-border");
+ } else {
+ this.uiContainer.addClass("red-ui-editableList-border");
+ }
+ this.uiContainer.addClass("red-ui-editableList-container");
+
+ this.uiHeight = this.element.height();
+
+ this.activeFilter = this.options.filter||null;
+ this.activeSort = this.options.sort||null;
+ this.scrollOnAdd = this.options.scrollOnAdd;
+ if (this.scrollOnAdd === undefined) {
+ this.scrollOnAdd = true;
+ }
+ var minHeight = this.element.css("minHeight");
+ if (minHeight !== '0px') {
+ this.uiContainer.css("minHeight",minHeight);
+ this.element.css("minHeight",0);
+ }
+ var maxHeight = this.element.css("maxHeight");
+ if (maxHeight !== '0px') {
+ this.uiContainer.css("maxHeight",maxHeight);
+ this.element.css("maxHeight",null);
+ }
+ if (this.options.height !== 'auto') {
+ this.uiContainer.css("overflow-y","scroll");
+ if (!isNaN(this.options.height)) {
+ this.uiHeight = this.options.height;
+ }
+ }
+ this.element.height('auto');
+
+ var attrStyle = this.element.attr('style');
+ var m;
+ if ((m = /width\s*:\s*(\d+%)/i.exec(attrStyle)) !== null) {
+ this.element.width('100%');
+ this.uiContainer.width(m[1]);
+ }
+ if (this.options.sortable) {
+ var handle = (typeof this.options.sortable === 'string')?
+ this.options.sortable :
+ ".red-ui-editableList-item-handle";
+ var sortOptions = {
+ axis: "y",
+ update: function( event, ui ) {
+ if (that.options.sortItems) {
+ that.options.sortItems(that.items());
+ }
+ },
+ handle:handle,
+ cursor: "move",
+ tolerance: "pointer",
+ forcePlaceholderSize:true,
+ placeholder: "red-ui-editabelList-item-placeholder",
+ start: function(e, ui){
+ ui.placeholder.height(ui.item.height()-4);
+ }
+ };
+ if (this.options.connectWith) {
+ sortOptions.connectWith = this.options.connectWith;
+ }
+
+ this.element.sortable(sortOptions);
+ }
+
+ this._resize();
+
+ // this.menu = this._createMenu(this.types, function(v) { that.type(v) });
+ // this.type(this.options.default||this.types[0].value);
+ },
+ _resize: function() {
+ var currentFullHeight = this.topContainer.height();
+ var innerHeight = this.uiContainer.height();
+ var delta = currentFullHeight - innerHeight;
+ if (this.uiHeight !== 0) {
+ this.uiContainer.height(this.uiHeight-delta);
+ }
+ if (this.options.resize) {
+ this.options.resize();
+ }
+ if (this.options.resizeItem) {
+ var that = this;
+ this.element.children().each(function(i) {
+ that.options.resizeItem($(this).find(".red-ui-editableList-item-content"),i);
+ });
+ }
+ },
+ _destroy: function() {
+ if (this.topContainer) {
+ var tc = this.topContainer;
+ delete this.topContainer;
+ tc.remove();
+ }
+ },
+ _refreshFilter: function() {
+ var that = this;
+ var count = 0;
+ if (!this.activeFilter) {
+ return this.element.children().show();
+ }
+ var items = this.items();
+ items.each(function (i,el) {
+ var data = el.data('data');
+ try {
+ if (that.activeFilter(data)) {
+ el.parent().show();
+ count++;
+ } else {
+ el.parent().hide();
+ }
+ } catch(err) {
+ console.log(err);
+ el.parent().show();
+ count++;
+ }
+ });
+ return count;
+ },
+ _refreshSort: function() {
+ if (this.activeSort) {
+ var items = this.element.children();
+ var that = this;
+ items.sort(function(A,B) {
+ return that.activeSort($(A).find(".red-ui-editableList-item-content").data('data'),$(B).find(".red-ui-editableList-item-content").data('data'));
+ });
+ $.each(items,function(idx,li) {
+ that.element.append(li);
+ })
+ }
+ },
+ width: function(desiredWidth) {
+ this.uiWidth = desiredWidth;
+ this._resize();
+ },
+ height: function(desiredHeight) {
+ this.uiHeight = desiredHeight;
+ this._resize();
+ },
+ getItemAt: function(index) {
+ var items = this.items();
+ if (index >= 0 && index < items.length) {
+ return $(items[index]).data('data');
+ } else {
+ return;
+ }
+ },
+ indexOf: function(data) {
+ var items = this.items();
+ for (var i=0;i');
+ var added = false;
+ if (this.activeSort) {
+ var items = this.items();
+ var skip = false;
+ items.each(function(i,el) {
+ if (added) { return }
+ var itemData = el.data('data');
+ if (that.activeSort(data,itemData) < 0) {
+ li.insertBefore(el.closest("li"));
+ added = true;
+ }
+ });
+ }
+ if (!added) {
+ if (index <= 0) {
+ li.prependTo(this.element);
+ } else if (index > that.element.children().length-1) {
+ li.appendTo(this.element);
+ } else {
+ li.insertBefore(this.element.children().eq(index));
+ }
+ }
+ var row = $('').addClass("red-ui-editableList-item-content").appendTo(li);
+ row.data('data',data);
+ if (this.options.sortable === true) {
+ $('').appendTo(li);
+ li.addClass("red-ui-editableList-item-sortable");
+ }
+ if (this.options.removable) {
+ var deleteButton = $('',{href:"#",class:"red-ui-editableList-item-remove red-ui-button red-ui-button-small"}).appendTo(li);
+ $('',{class:"fa fa-remove"}).appendTo(deleteButton);
+ li.addClass("red-ui-editableList-item-removable");
+ deleteButton.on("click", function(evt) {
+ evt.preventDefault();
+ var data = row.data('data');
+ li.addClass("red-ui-editableList-item-deleting")
+ li.fadeOut(300, function() {
+ $(this).remove();
+ if (that.options.removeItem) {
+ that.options.removeItem(data);
+ }
+ });
+ });
+ }
+ if (this.options.addItem) {
+ var index = that.element.children().length-1;
+ setTimeout(function() {
+ that.options.addItem(row,index,data);
+ if (that.activeFilter) {
+ try {
+ if (!that.activeFilter(data)) {
+ li.hide();
+ }
+ } catch(err) {
+ }
+ }
+
+ if (!that.activeSort && that.scrollOnAdd) {
+ setTimeout(function() {
+ that.uiContainer.scrollTop(that.element.height());
+ },0);
+ }
+ },0);
+ }
+ },
+ addItem: function(data) {
+ this.insertItemAt(data,this.element.children().length)
+ },
+ addItems: function(items) {
+ for (var i=0; i 0) {
+ this.uiContainer.scrollTop(this.uiContainer.scrollTop()+items.position().top)
+ }
+ },
+ getItem: function(li) {
+ var el = li.find(".red-ui-editableList-item-content");
+ if (el.length) {
+ return el.data('data');
+ } else {
+ return null;
+ }
+ }
+ });
+})(jQuery);
diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js b/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js
new file mode 100644
index 0000000..e73c822
--- /dev/null
+++ b/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js
@@ -0,0 +1,289 @@
+/**
+ * Copyright JS Foundation and other contributors, http://js.foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+RED.menu = (function() {
+
+ var menuItems = {};
+
+ function createMenuItem(opt) {
+ var item;
+
+ if (opt !== null && opt.id) {
+ var themeSetting = RED.settings.theme("menu."+opt.id);
+ if (themeSetting === false) {
+ return null;
+ }
+ }
+
+ function setInitialState() {
+ var savedStateActive = RED.settings.get("menu-" + opt.id);
+ if (opt.setting) {
+ // May need to migrate pre-0.17 setting
+
+ if (savedStateActive !== null) {
+ RED.settings.set(opt.setting,savedStateActive);
+ RED.settings.remove("menu-" + opt.id);
+ } else {
+ savedStateActive = RED.settings.get(opt.setting);
+ }
+ }
+ if (savedStateActive) {
+ link.addClass("active");
+ triggerAction(opt.id,true);
+ } else if (savedStateActive === false) {
+ link.removeClass("active");
+ triggerAction(opt.id,false);
+ } else if (opt.hasOwnProperty("selected")) {
+ if (opt.selected) {
+ link.addClass("active");
+ } else {
+ link.removeClass("active");
+ }
+ triggerAction(opt.id,opt.selected);
+ }
+ }
+
+ if (opt === null) {
+ item = $('');
+ } else {
+ item = $('');
+
+ if (opt.group) {
+ item.addClass("red-ui-menu-group-"+opt.group);
+
+ }
+ var linkContent = '';
+ if (opt.toggle) {
+ linkContent += '';
+ linkContent += '';
+
+ }
+ if (opt.icon !== undefined) {
+ if (/\.(png|svg)/.test(opt.icon)) {
+ linkContent += ' ';
+ } else {
+ linkContent += ' ';
+ }
+ }
+
+ if (opt.sublabel) {
+ linkContent += '';
+
+ var link = $(linkContent).appendTo(item);
+
+ menuItems[opt.id] = opt;
+
+ if (opt.onselect) {
+ link.on("click", function(e) {
+ e.preventDefault();
+ if ($(this).parent().hasClass("disabled")) {
+ return;
+ }
+ if (opt.toggle) {
+ if (opt.toggle === true) {
+ setSelected(opt.id, !isSelected(opt.id));
+ } else {
+ setSelected(opt.id, true);
+ }
+ } else {
+ triggerAction(opt.id);
+ }
+ });
+ if (opt.toggle) {
+ setInitialState();
+ }
+ } else if (opt.href) {
+ link.attr("target","_blank").attr("href",opt.href);
+ } else if (!opt.options) {
+ item.addClass("disabled");
+ link.on("click", function(event) {
+ event.preventDefault();
+ });
+ }
+ if (opt.options) {
+ item.addClass("red-ui-menu-dropdown-submenu pull-left");
+ var submenu = $(' '
+ } else {
+ linkContent += ' '
+ }
+
+ linkContent += ' ').appendTo(item);
+
+ for (var i=0;i",{class:"red-ui-menu red-ui-menu-dropdown pull-right"});
+
+ if (options.id) {
+ topMenu.attr({id:options.id+"-submenu"});
+ var menuParent = $("#"+options.id);
+ if (menuParent.length === 1) {
+ topMenu.insertAfter(menuParent);
+ menuParent.on("click", function(evt) {
+ evt.stopPropagation();
+ evt.preventDefault();
+ if (topMenu.is(":visible")) {
+ $(document).off("click.red-ui-menu");
+ topMenu.hide();
+ } else {
+ $(document).on("click.red-ui-menu", function(evt) {
+ $(document).off("click.red-ui-menu");
+ activeMenu = null;
+ topMenu.hide();
+ });
+ $(".red-ui-menu").hide();
+ topMenu.show();
+ }
+ })
+ }
+ }
+
+ var lastAddedSeparator = false;
+ for (var i=0;i ').insertAfter(children[0]);
+ var startPosition;
+ var panelSizes = [];
+ var modifiedSizes = false;
+ var panelRatio = 0.5;
+ separator.draggable({
+ axis: vertical?"y":"x",
+ containment: container,
+ scroll: false,
+ start:function(event,ui) {
+ startPosition = vertical?ui.position.top:ui.position.left;
+
+ panelSizes = [
+ vertical?$(children[0]).height():$(children[0]).width(),
+ vertical?$(children[1]).height():$(children[1]).width()
+ ];
+ },
+ drag: function(event,ui) {
+ var size = vertical?container.height():container.width();
+ var delta = (vertical?ui.position.top:ui.position.left)-startPosition;
+ var newSizes = [panelSizes[0]+delta,panelSizes[1]-delta];
+ if (vertical) {
+ $(children[0]).height(newSizes[0]);
+ $(children[1]).height(newSizes[1]);
+ ui.position.top -= delta;
+ } else {
+ $(children[0]).width(newSizes[0]);
+ $(children[1]).width(newSizes[1]);
+ ui.position.left -= delta;
+ }
+ if (options.resize) {
+ options.resize(newSizes[0],newSizes[1]);
+ }
+ panelRatio = newSizes[0]/(size-8);
+ },
+ stop:function(event,ui) {
+ modifiedSizes = true;
+ }
+ });
+
+ var panel = {
+ ratio: function(ratio) {
+ panelRatio = ratio;
+ modifiedSizes = true;
+ if (ratio === 0 || ratio === 1) {
+ separator.hide();
+ } else {
+ separator.show();
+ }
+ if (vertical) {
+ panel.resize(container.height());
+ } else {
+ panel.resize(container.width());
+ }
+ },
+ resize: function(size) {
+ var panelSizes;
+ if (vertical) {
+ panelSizes = [$(children[0]).outerHeight(),$(children[1]).outerHeight()];
+ container.height(size);
+ } else {
+ panelSizes = [$(children[0]).outerWidth(),$(children[1]).outerWidth()];
+ container.width(size);
+ }
+ if (modifiedSizes) {
+ var topPanelSize = panelRatio*(size-8);
+ var bottomPanelSize = size - topPanelSize - 8;
+ panelSizes = [topPanelSize,bottomPanelSize];
+ if (vertical) {
+ $(children[0]).outerHeight(panelSizes[0]);
+ $(children[1]).outerHeight(panelSizes[1]);
+ } else {
+ $(children[0]).outerWidth(panelSizes[0]);
+ $(children[1]).outerWidth(panelSizes[1]);
+ }
+ }
+ if (options.resize) {
+ if (vertical) {
+ panelSizes = [$(children[0]).height(),$(children[1]).height()];
+ } else {
+ panelSizes = [$(children[0]).width(),$(children[1]).width()];
+ }
+ options.resize(panelSizes[0],panelSizes[1]);
+ }
+ }
+ }
+ return panel;
+ }
+
+ return {
+ create: createPanel
+ }
+})();
diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js b/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js
new file mode 100644
index 0000000..fca2f26
--- /dev/null
+++ b/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js
@@ -0,0 +1,329 @@
+/**
+ * Copyright JS Foundation and other contributors, http://js.foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+
+RED.popover = (function() {
+ var deltaSizes = {
+ "default": {
+ top: 10,
+ topTop: 30,
+ leftRight: 17,
+ leftLeft: 25,
+ leftBottom: 8,
+ leftTop: 11
+ },
+ "small": {
+ top: 6,
+ topTop: 20,
+ leftRight: 8,
+ leftLeft: 26,
+ leftBottom: 8,
+ leftTop: 9
+ }
+ }
+ function createPopover(options) {
+ var target = options.target;
+ var direction = options.direction || "right";
+ var trigger = options.trigger;
+ var content = options.content;
+ var delay = options.delay || { show: 750, hide: 50 };
+ var autoClose = options.autoClose;
+ var width = options.width||"auto";
+ var size = options.size||"default";
+ if (!deltaSizes[size]) {
+ throw new Error("Invalid RED.popover size value:",size);
+ }
+
+ var timer = null;
+ var active;
+ var div;
+
+ var openPopup = function(instant) {
+ if (active) {
+ var existingPopover = target.data("red-ui-popover");
+ if (options.tooltip && existingPopover) {
+ active = false;
+ return;
+ }
+ div = $('');
+ if (size !== "default") {
+ div.addClass("red-ui-popover-size-"+size);
+ }
+ if (typeof content === 'function') {
+ var result = content.call(res);
+ if (result === null) {
+ return;
+ }
+ if (typeof result === 'string') {
+ div.text(result);
+ } else {
+ div.append(result);
+ }
+ } else {
+ div.html(content);
+ }
+ if (width !== "auto") {
+ div.width(width);
+ }
+ div.appendTo("body");
+
+ var targetPos = target.offset();
+ var targetWidth = target.outerWidth();
+ var targetHeight = target.outerHeight();
+ var divHeight = div.height();
+ var divWidth = div.width();
+
+ var viewportTop = $(window).scrollTop();
+ var viewportLeft = $(window).scrollLeft();
+ var viewportBottom = viewportTop + $(window).height();
+ var viewportRight = viewportLeft + $(window).width();
+ var top = 0;
+ var left = 0;
+ var d = direction;
+ if (d === 'right') {
+ top = targetPos.top+targetHeight/2-divHeight/2-deltaSizes[size].top;
+ left = targetPos.left+targetWidth+deltaSizes[size].leftRight;
+ } else if (d === 'left') {
+ top = targetPos.top+targetHeight/2-divHeight/2-deltaSizes[size].top;
+ left = targetPos.left-deltaSizes[size].leftLeft-divWidth;
+ } else if (d === 'bottom') {
+ top = targetPos.top+targetHeight+deltaSizes[size].top;
+ left = targetPos.left+targetWidth/2-divWidth/2 - deltaSizes[size].leftBottom;
+ if (left < 0) {
+ d = "right";
+ top = targetPos.top+targetHeight/2-divHeight/2-deltaSizes[size].top;
+ left = targetPos.left+targetWidth+deltaSizes[size].leftRight;
+ } else if (left+divWidth > viewportRight) {
+ d = "left";
+ top = targetPos.top+targetHeight/2-divHeight/2-deltaSizes[size].top;
+ left = targetPos.left-deltaSizes[size].leftLeft-divWidth;
+ if (top+divHeight+targetHeight/2 + 5 > viewportBottom) {
+ top -= (top+divHeight+targetHeight/2 - viewportBottom + 5)
+ }
+ } else if (top+divHeight > viewportBottom) {
+ d = 'top';
+ top = targetPos.top-deltaSizes[size].topTop-divHeight;
+ left = targetPos.left+targetWidth/2-divWidth/2 - deltaSizes[size].leftTop;
+ }
+ } else if (d === 'top') {
+ top = targetPos.top-deltaSizes[size].topTop-divHeight;
+ left = targetPos.left+targetWidth/2-divWidth/2 - deltaSizes[size].leftTop;
+ if (top < 0) {
+ d = 'bottom';
+ top = targetPos.top+targetHeight+deltaSizes[size].top;
+ left = targetPos.left+targetWidth/2-divWidth/2 - deltaSizes[size].leftBottom;
+ }
+ }
+ div.addClass('red-ui-popover-'+d).css({top: top, left: left});
+ if (existingPopover) {
+ existingPopover.close(true);
+ }
+ target.data("red-ui-popover",res)
+ if (options.tooltip) {
+ div.on("mousedown", function(evt) {
+ closePopup(true);
+ });
+ }
+ if (instant) {
+ div.show();
+ } else {
+ div.fadeIn("fast");
+ }
+ }
+ }
+ var closePopup = function(instant) {
+ $(document).off('mousedown.red-ui-popover');
+ if (!active) {
+ if (div) {
+ if (instant) {
+ div.remove();
+ } else {
+ div.fadeOut("fast",function() {
+ $(this).remove();
+ });
+ }
+ div = null;
+ target.removeData("red-ui-popover",res)
+ }
+ }
+ }
+
+ if (trigger === 'hover') {
+ target.on('mouseenter',function(e) {
+ clearTimeout(timer);
+ active = true;
+ timer = setTimeout(openPopup,delay.show);
+ });
+ target.on('mouseleave disabled', function(e) {
+ if (timer) {
+ clearTimeout(timer);
+ }
+ if (active) {
+ active = false;
+ setTimeout(closePopup,delay.hide);
+ }
+ });
+ } else if (trigger === 'click') {
+ target.on("click", function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ active = !active;
+ if (!active) {
+ closePopup();
+ } else {
+ openPopup();
+ }
+ });
+ if (autoClose) {
+ target.on('mouseleave disabled', function(e) {
+ if (timer) {
+ clearTimeout(timer);
+ }
+ if (active) {
+ active = false;
+ setTimeout(closePopup,autoClose);
+ }
+ });
+ }
+
+ } else if (trigger === 'modal') {
+ $(document).on('mousedown.red-ui-popover', function (event) {
+ var target = event.target;
+ while (target.nodeName !== 'BODY' && target !== div[0]) {
+ target = target.parentElement;
+ }
+ if (target.nodeName === 'BODY') {
+ active = false;
+ closePopup();
+ }
+ });
+ } else if (autoClose) {
+ setTimeout(function() {
+ active = false;
+ closePopup();
+ },autoClose);
+ }
+ var res = {
+ setContent: function(_content) {
+ content = _content;
+ return res;
+ },
+ open: function (instant) {
+ active = true;
+ openPopup(instant);
+ return res;
+ },
+ close: function (instant) {
+ active = false;
+ closePopup(instant);
+ return res;
+ }
+ }
+ return res;
+
+ }
+
+ return {
+ create: createPopover,
+ tooltip: function(target,content, action) {
+ var label = content;
+ if (action) {
+ label = function() {
+ var label = content;
+ var shortcut = RED.keyboard.getShortcut(action);
+ if (shortcut && shortcut.key) {
+ label = $(''+content+' '+RED.keyboard.formatKey(shortcut.key, true)+'');
+ }
+ return label;
+ }
+ }
+ return RED.popover.create({
+ tooltip: true,
+ target:target,
+ trigger: "hover",
+ size: "small",
+ direction: "bottom",
+ content: label,
+ delay: { show: 750, hide: 50 }
+ });
+ },
+ panel: function(content) {
+ var panel = $('');
+ panel.css({ display: "none" });
+ panel.appendTo(document.body);
+ content.appendTo(panel);
+ var closeCallback;
+
+ function hide() {
+ $(document).off("mousedown.red-ui-popover-panel-close");
+ panel.hide();
+ panel.css({
+ height: "auto"
+ });
+ panel.remove();
+ }
+ function show(options) {
+ var closeCallback = options.onclose;
+ var target = options.target;
+ var align = options.align || "left";
+
+ var pos = target.offset();
+ var targetWidth = target.width();
+ var targetHeight = target.height();
+ var panelHeight = panel.height();
+ var panelWidth = panel.width();
+
+ var top = (targetHeight+pos.top);
+ if (top+panelHeight > $(window).height()) {
+ top -= (top+panelHeight)-$(window).height() + 5;
+ }
+ if (top < 0) {
+ panelHeight.height(panelHeight+top)
+ top = 0;
+ }
+ if (align === "left") {
+ panel.css({
+ top: top+"px",
+ left: (pos.left)+"px",
+ });
+ } else if(align === "right") {
+ panel.css({
+ top: top+"px",
+ left: (pos.left-panelWidth)+"px",
+ });
+ }
+ panel.slideDown(100);
+
+ $(document).on("mousedown.red-ui-popover-panel-close", function(event) {
+ if(!$(event.target).closest(panel).length && !$(event.target).closest(".red-ui-editor-dialog").length) {
+ if (closeCallback) {
+ closeCallback();
+ }
+ hide();
+ }
+ // if ($(event.target).closest(target).length) {
+ // event.preventDefault();
+ // }
+ })
+ }
+ return {
+ container: panel,
+ show:show,
+ hide:hide
+ }
+ }
+ }
+
+})();
diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/searchBox.js b/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/searchBox.js
new file mode 100644
index 0000000..b707ccb
--- /dev/null
+++ b/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/searchBox.js
@@ -0,0 +1,117 @@
+/**
+ * Copyright JS Foundation and other contributors, http://js.foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+(function($) {
+
+/**
+ * options:
+ * - minimumLength : the minimum length of text before firing a change event
+ * - delay : delay, in ms, after a keystroke before firing change event
+ *
+ * methods:
+ * - value([val]) - gets the current value, or, if `val` is provided, sets the value
+ * - count - sets or clears a sub-label on the input. This can be used to provide
+ * a feedback on the number of matches, or number of available entries to search
+ * - change - trigger a change event
+ *
+ */
+
+ $.widget( "nodered.searchBox", {
+ _create: function() {
+ var that = this;
+
+ this.currentTimeout = null;
+ this.lastSent = "";
+ this.element.val("");
+ this.element.addClass("red-ui-searchBox-input");
+ this.uiContainer = this.element.wrap("").parent();
+ this.uiContainer.addClass("red-ui-searchBox-container");
+ if (this.element.parents("form").length === 0) {
+ var form = this.element.wrap(" ').appendTo(this.uiElement),
+ $(' ').appendTo(this.uiElement),
+ $(' ').appendTo(this.uiElement)
+ ];
+ if (initialState) {
+ this.options[1].show();
+ } else {
+ this.options[0].show();
+ }
+
+ this.element.on("change", function() {
+ if (this.checked) {
+ that.options[0].hide();
+ that.options[1].show();
+ that.options[2].hide();
+ } else {
+ that.options[1].hide();
+ that.options[0].show();
+ that.options[2].hide();
+ }
+ var isChecked = this.checked;
+ that.children.forEach(function(child) {
+ child.checkboxSet('state',isChecked,false,true);
+ })
+ })
+ this.uiElement.on("click", function(e) {
+ e.stopPropagation();
+ // state returns null for a partial state. Clicking on that should
+ // result in false.
+ that.state((that.state()===false)?true:false);
+ })
+ if (this.parent) {
+ this.parent.checkboxSet('updateChild',this);
+ }
+ },
+ _destroy: function() {
+ if (this.parent) {
+ this.parent.checkboxSet('removeChild',this.element);
+ }
+ },
+ addChild: function(child) {
+ var that = this;
+ this.children.push(child);
+ },
+ removeChild: function(child) {
+ var index = this.children.indexOf(child);
+ if (index > -1) {
+ this.children.splice(index,1);
+ }
+ },
+ updateChild: function(child) {
+ var checkedCount = 0;
+ this.children.forEach(function(c,i) {
+ if (c.checkboxSet('state') === true) {
+ checkedCount++;
+ }
+ });
+ if (checkedCount === 0) {
+
+ this.state(false,true);
+ } else if (checkedCount === this.children.length) {
+ this.state(true,true);
+ } else {
+ this.state(null,true);
+ }
+ },
+ disable: function() {
+ this.uiElement.addClass('disabled');
+ },
+ state: function(state,suppressEvent,suppressParentUpdate) {
+
+ if (arguments.length === 0) {
+ return this.partialFlag?null:this.element.is(":checked");
+ } else {
+ this.partialFlag = (state === null);
+ var trueState = this.partialFlag||state;
+ this.element.prop('checked',trueState);
+ if (state === true) {
+ this.options[0].hide();
+ this.options[1].show();
+ this.options[2].hide();
+ } else if (state === false) {
+ this.options[2].hide();
+ this.options[1].hide();
+ this.options[0].show();
+ } else if (state === null) {
+ this.options[0].hide();
+ this.options[1].hide();
+ this.options[2].show();
+ }
+ if (!suppressEvent) {
+ this.element.trigger('change',null);
+ }
+ if (!suppressParentUpdate && this.parent) {
+ this.parent.checkboxSet('updateChild',this);
+ }
+ }
+ }
+ })
+
+})(jQuery);
diff --git a/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js b/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js
new file mode 100644
index 0000000..06ccc97
--- /dev/null
+++ b/packages/connector/packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js
@@ -0,0 +1,383 @@
+/**
+ * Copyright JS Foundation and other contributors, http://js.foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+(function($) {
+
+/**
+ * options:
+ * - addButton : boolean|string - text for add label, default 'add'
+ * - height : number|'auto'
+ * - resize : function - called when list as a whole is resized
+ * - resizeItem : function(item) - called to resize individual item
+ * - sortable : boolean|string - string is the css selector for handle
+ * - sortItems : function(items) - when order of items changes
+ * - connectWith : css selector of other sortables
+ * - removable : boolean - whether to display delete button on items
+ * - addItem : function(row,index,itemData) - when an item is added
+ * - removeItem : function(itemData) - called when an item is removed
+ * - filter : function(itemData) - called for each item to determine if it should be shown
+ * - sort : function(itemDataA,itemDataB) - called to sort items
+ * - scrollOnAdd : boolean - whether to scroll to newly added items
+ * methods:
+ * - addItem(itemData)
+ * - insertItemAt : function(data,index) - add an item at the specified index
+ * - removeItem(itemData)
+ * - getItemAt(index)
+ * - indexOf(itemData)
+ * - width(width)
+ * - height(height)
+ * - items()
+ * - empty()
+ * - filter(filter)
+ * - sort(sort)
+ * - length()
+ */
+ $.widget( "nodered.editableList", {
+ _create: function() {
+ var that = this;
+
+ this.element.addClass('red-ui-editableList-list');
+ this.uiWidth = this.element.width();
+ this.uiContainer = this.element
+ .wrap( "