diff --git a/Gruntfile.js b/Gruntfile.js index 1e421f62d..cbf70f4dc 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -26,6 +26,10 @@ module.exports = function(grunt) { nodemonArgs.push(flowFile); } + var browserstack = grunt.option('browserstack'); + if (browserstack) { + process.env.BROWSERSTACK = true; + } var nonHeadless = grunt.option('non-headless'); if (nonHeadless) { process.env.NODE_RED_NON_HEADLESS = true; diff --git a/package.json b/package.json index 9aaeb8f9e..a6c4c5091 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "is-utf8": "0.2.1", "js-yaml": "3.13.1", "json-stringify-safe": "5.0.1", - "jsonata": "1.7.0", + "jsonata": "1.8.0", "media-typer": "1.1.0", "memorystore": "1.6.1", "mime": "2.4.4", diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 72af1d38b..a5f232aa6 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -1008,6 +1008,7 @@ "en-US": "English", "ja": "Japanese", "ko": "Korean", - "zh-CN": "Chinese(Simplified)" + "zh-CN": "Chinese(Simplified)", + "zh-TW": "Chinese(Traditional)" } } diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json b/packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json index 8f516a289..d777d1919 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/jsonata.json @@ -262,5 +262,9 @@ "$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/node_modules/@node-red/editor-client/locales/ja/editor.json b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json index 8290ca1c1..cf04ced1d 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json @@ -803,9 +803,9 @@ "expandItems": "要素を展開", "collapseItems": "要素を折り畳む", "duplicate": "複製", - "error": { - "invalidJSON": "不正なJSON: " - } + "error": { + "invalidJSON": "不正なJSON: " + } }, "markdownEditor": { "title": "マークダウンエディタ", @@ -1007,6 +1007,7 @@ "en-US": "英語", "ja": "日本語", "ko": "韓国語", - "zh-CN": "中国語(簡体)" + "zh-CN": "中国語(簡体)", + "zh-TW": "中国語(繁体)" } } diff --git a/packages/node_modules/@node-red/editor-client/locales/ja/jsonata.json b/packages/node_modules/@node-red/editor-client/locales/ja/jsonata.json index ba873c448..659cf66df 100755 --- a/packages/node_modules/@node-red/editor-client/locales/ja/jsonata.json +++ b/packages/node_modules/@node-red/editor-client/locales/ja/jsonata.json @@ -245,11 +245,11 @@ }, "$encodeUrl": { "args": "str", - "desc": "Uniform Resource Locator (URL)を構成する文字を1、2、3、もしくは、4文字エスケープシーケンスのUTF-8文字エンコーディングで置換します。\n\n例: `$encodeUrlComponent(\"?x=test\")` => `\"%3Fx%3Dtest\"`" + "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\"`" + "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", @@ -262,5 +262,9 @@ "$distinct": { "args": "array", "desc": "配列`array`から重複要素を削除した配列を返します。" + }, + "$type": { + "args": "value", + "desc": "`value` の型を文字列として返します。もし `value` が未定義の場合、 `undefined` が返されます。" } } diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json index a45f37f66..3695eb263 100644 --- a/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/zh-CN/editor.json @@ -10,7 +10,22 @@ "load": "读取", "save": "保存", "import": "导入", - "export": "导出" + "export": "导出", + "back": "后退", + "next": "下一个", + "clone": "克隆项目", + "cont": "继续" + }, + "type": { + "string": "字符串", + "number": "数字", + "boolean": "布尔值", + "array": "数组", + "buffer": "buffer", + "object": "对象", + "jsonString": "JSON字符串", + "undefined": "为定义", + "null": "空" } }, "workspace": { @@ -19,10 +34,13 @@ "confirmDelete": "确认删除", "delete": "你确定想删除 '__label__'?", "dropFlowHere": "把流程放到这里", + "addFlow": "添加流程", + "listFlows": "流程一览", "status": "状态", "enabled": "有效", "disabled": "无效", - "info": "详细描述" + "info": "详细描述", + "selectNodes": "点击节点来选择" }, "menu": { "label": { @@ -36,11 +54,16 @@ "defaultDir": "默认方向", "ltr": "从左到右", "rtl": "从右到左", - "auto": "上下文" + "auto": "上下文", + "language": "语言", + "browserDefault": "浏览器默认" }, "sidebar": { "show": "显示侧边栏" }, + "palette": { + "show": "显示控制板" + }, "settings": "设置", "userSettings": "用户设置", "nodes": "节点", @@ -60,11 +83,23 @@ "keyboardShortcuts": "键盘快捷方式", "login": "登陆", "logout": "退出", - "editPalette":"节点管理", + "editPalette": "节点管理", "other": "其他", - "showTips": "显示小提示" + "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": "账号", @@ -82,29 +117,73 @@ "warning": "警告: __message__", "warnings": { "undeployedChanges": "节点中存在未部署的更改", + "nodeActionDisabled": "节点操作已禁用", "nodeActionDisabledSubflow": "节点动作在子流程中被禁用", "missing-types": "流程由于缺少节点类型而停止。请检查日志的详细信息", - "restartRequired": "Node-RED必须重新启动,以启用升级的模块" + "safe-mode": "

流程以安全模式停止。

您可以修改流程并部署更改以重新启动。

", + "restartRequired": "Node-RED必须重新启动,以启用升级的模块", + "credentials_load_failed": "

由于无法解密凭据,因此流程停止。

流程凭据文件已加密,但是项目的加密密钥丢失或无效。

", + "credentials_load_failed_reset": "

凭据无法解密

流凭据文件已加密,但是项目的加密密钥丢失或无效。

流凭据文件将在下一次部署时重置。任何现有的流凭证将被清除。

", + "missing_flow_file": "

找不到项目流程文件。

该项目未配置流程文件。

", + "missing_package_file": "

找不到项目包文件。

项目缺少package.json文件。

", + "project_empty": "

该项目为空。

是否要创建一组默认的项目文件?
否则,您将必须在编辑器外部手动将文件添加到项目中。

", + "project_not_found": "

未找到项目'__project__'。

", + "git_merge_conflict": "

自动合并更改失败。

修复未合并的冲突,然后提交结果。

" }, - "error": "Error: __message__", + "error": "错误: __message__", "errors": { "lostConnection": "丢失与服务器的连接,重新连接...", "lostConnectionReconnect": "丢失与服务器的连接,__time__秒后重新连接", "lostConnectionTry": "现在尝试", "cannotAddSubflowToItself": "无法向其自身添加子流程", "cannotAddCircularReference": "无法添加子流程 - 循环引用", - "unsupportedVersion": "您正在使用不受支持的Node.js版本
请升级到最新版本的Node.js LTS" + "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": "在这里粘贴节点", + "selectFile": "选择要导入的文件", "importNodes": "导入节点", "exportNodes": "导出节点至剪贴板", + "download": "下载", "importUnrecognised": "导入了无法识别的类型:", "importUnrecognised_plural": "导入了无法识别的类型:", "nodesExported": "节点导出到了剪贴板", + "nodesImported": "导入:", "nodeCopied": "已复制__count__个节点", "nodeCopied_plural": "已复制__count__个节点", "invalidFlow": "无效的流程: __message__", @@ -114,11 +193,21 @@ "all": "所有流程", "compact": "紧凑", "formatted": "已格式化", - "copy": "导出到剪贴板" + "copy": "导出到剪贴板", + "export": "到处到库", + "exportAs": "导出为", + "overwrite": "替换", + "exists": "

\"__file__\"已存在

是否要替换它?

" }, "import": { "import": "导入到", - "newFlow": "新流程" + "newFlow": "新流程", + "errors": { + "notArray": "输入的不是JSON数组", + "itemNotObject": "输入的流无效 - 项目__index__不是节点对象", + "missingId": "输入的流无效-项 __index__ 缺少'id'属性", + "missingType": "输入的流程无效-项__index__缺少'类型'属性" + } }, "copyMessagePath": "已复制路径", "copyMessageValue": "已复制数值", @@ -132,7 +221,10 @@ "modifiedFlowsDesc": "只部署包含已更改节点的流", "modifiedNodes": "已更改的节点", "modifiedNodesDesc": "只部署已经更改的节点", + "restartFlows": "重启流程", + "restartFlowsDesc": "重新启动当前部署的流程", "successfulDeploy": "部署成功", + "successfulRestart": "成功重启流程", "deployFailed": "部署失败: __message__", "unusedConfigNodes": "您有一些未使用的配置节点", "unusedConfigNodesLink": "点击此处查看它们", @@ -152,16 +244,24 @@ "improperlyConfigured": "工作区包含一些未正确配置的节点:", "unknown": "工作区包含一些未知的节点类型:", "confirm": "你确定要部署吗?", + "doNotWarn": "不要再对此发出警告", "conflict": "服务器正在运行较新的一组流程。", "backgroundUpdate": "服务器上的流程已更新。", "conflictChecking": "检查是否可以自动合并更改", "conflictAutoMerge": "此更改不包括冲突,可以自动合并", - "conflictManualMerge": "这些更改包括了在部署之前必须解决的冲突。" + "conflictManualMerge": "这些更改包括了在部署之前必须解决的冲突。", + "plusNMore": "+ __count__更多" } }, + "eventLog": { + "title": "事件记录日志", + "view": "查看日志" + }, "diff": { "unresolvedCount": "__count__个未解决的冲突", "unresolvedCount_plural": "__count__个未解决的冲突", + "globalNodes": "全局节点", + "flowProperties": "流程属性", "type": { "added": "已添加", "changed": "已更改", @@ -175,9 +275,19 @@ "nodeCount": "__count__个节点", "nodeCount_plural": "__count__个节点", "local": "本地", - "remote": "远程" + "remote": "远程", + "reviewChanges": "查看变更", + "noBinaryFileShowed": "无法显示二进制文件内容", + "viewCommitDiff": "查看提交更改", + "compareChanges": "比较变更", + "saveConflict": "保存冲突解决", + "conflictHeader": "已解决__unresolved__中的__resolved__个冲突", + "commonVersionError": "通用版本不包含有效的JSON:", + "oldVersionError": "旧版本不包含有效的JSON:", + "newVersionError": "新版本不包含有效的JSON:" }, "subflow": { + "editSubflowInstance": "编辑子流实例:__name__", "editSubflow": "编辑流程模板: __name__", "edit": "编辑流程模板", "subflowInstances": "这个子流程模板有__count__个实例", @@ -185,8 +295,14 @@ "editSubflowProperties": "编辑属性", "input": "输入:", "output": "输出:", + "status": "状态节点", "deleteSubflow": "删除子流程", "info": "详细描述", + "category": "类别", + "env": { + "restore": "恢复为默认子流", + "remove": "删除环境变量" + }, "errors": { "noNodesSelected": "无法创建子流程: 未选择节点", "multipleInputsToSelection": "无法创建子流程: 多个输入到了选择" @@ -204,18 +320,68 @@ "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": "更改范围将使其他流中的节点无法使用" + "scopeChange": "更改范围将使其他流中的节点无法使用", + "invalidProperties": "无效的属性:" } }, "keyboard": { "title": "键盘快捷键", + "keyboard": "键盘", + "filterActions": "筛选动作", + "shortcut": "快捷键", + "scope": "范围", "unassigned": "未分配", + "global": "全局", + "workspace": "工作组", "selectAll": "选择所有节点", "selectAllConnected": "选择所有连接的节点", "addRemoveNode": "从选择中添加/删除节点", @@ -226,12 +392,14 @@ "nudgeNode": "移动所选节点(1px)", "moveNode": "移动所选节点(20px)", "toggleSidebar": "切换侧边栏", + "togglePalette": "切换控制板", "copyNode": "复制所选节点", "cutNode": "剪切所选节点", "pasteNode": "粘贴节点", "undoChange": "撤消上次执行的更改", "searchBox": "打开搜索框", - "managePalette": "管理面板" + "managePalette": "管理面板", + "actionList": "动作列表" }, "library": { "library": "库", @@ -239,30 +407,42 @@ "saveToLibrary": "保存到库...", "typeLibrary": "__type__类型库", "unnamedType": "无名__type__", - "exportToLibrary": "将节点导出到库", + "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": "添加到面板中的多个节点", @@ -276,6 +456,7 @@ }, "editor": { "title": "面板管理", + "palette": "控制板", "times": { "seconds": "秒前", "minutes": "分前", @@ -309,6 +490,8 @@ "updated": "已更新", "install": "安装", "installed": "已安装", + "conflict": "冲突", + "conflictTip": "

无法安装此模块,因为它包含已安装的
节点类型

__module__冲突

", "loading": "加载目录...", "tab-nodes": "节点", "tab-install": "安装", @@ -356,6 +539,7 @@ "label": "信息", "node": "节点", "type": "类型", + "module": "模组", "id": "ID", "status": "状态", "enabled": "启用", @@ -364,17 +548,18 @@ "instances": "实例", "properties": "属性", "info": "信息", + "desc": "描述", "blank": "空白", "null": "空", "showMore": "展开", "showLess": "收起", "flow": "流程", - "selection":"选择", - "nodes":"__count__ 个节点", + "selection": "选择", + "nodes": "__count__ 个节点", "flowDesc": "流程描述", "subflowDesc": "子流程描述", "nodeHelp": "节点帮助", - "none":"无", + "none": "无", "arrayItems": "__count__个项目", "showTips": "您可以从设置面板启用提示信息" }, @@ -386,9 +571,25 @@ "subflows": "子流程", "flows": "流程", "filterAll": "所有", + "showAllConfigNodes": "显示所有配置节点", "filterUnused": "未使用", + "showAllUnusedConfigNodes": "显示所有未使用的配置节点", "filtered": "__count__ 个隐藏" }, + "context": { + "name": "上下文数据", + "label": "上下午", + "none": "未选择", + "refresh": "刷新以加载", + "empty": "空", + "node": "节点", + "flow": "流程", + "global": "全局", + "deleteConfirm": "你确定要删除这个项目吗?", + "autoRefresh": "刷新选择更改", + "refrsh": "刷新", + "delete": "删除" + }, "palette": { "name": "节点管理", "label": "节点" @@ -399,8 +600,151 @@ "description": "描述", "dependencies": "依赖", "settings": "设置", + "noSummaryAvailable": "无可用摘要", "editDescription": "编辑项目描述", - "editDependencies": "编辑项目依赖" + "editDependencies": "编辑项目依赖", + "noDescriptionAvailable": "没有可用的描述", + "editReadme": "编辑README.md", + "showProjectSettings": "显示项目设置", + "projectSettings": { + "title": "项目设置", + "edit": "编辑", + "none": "空", + "install": "安装", + "removeFromProject": "从项目中删除", + "addToProject": "添加到项目", + "files": "文件", + "package": "包", + "flow": "流程", + "credentials": "证书", + "packageCreate": "保存更改后将创建文件", + "fileNotExist": "文件不存在", + "selectFile": "选择文件", + "invalidEncryptionKey": "无效的加密密钥", + "encryptionEnabled": "启用加密", + "encryptionDisabled": "加密已禁用", + "setTheEncryptionKey": "设置加密密钥", + "resetTheEncryptionKey": "重置加密密钥", + "changeTheEncryptionKey": "更改加密密钥", + "currentKey": "当前密钥", + "newKey": "新密钥", + "credentialsAlert": "这将删除所有现有凭证", + "versionControl": "版本控制", + "branches": "分支", + "noBranches": "没有分支", + "deleteConfirm": "您确定要删除本地分支'__name__'吗? 这不能被撤消。", + "unmergedConfirm": "本地分支'__name__'具有未合并的更改,这些更改将丢失。你确定要删除吗?", + "deleteUnmergedBranch": "删除未合并的分支", + "gitRemotes": "Git远程仓库", + "addRemote": "添加远程仓库", + "addRemote2": "添加远程仓库", + "remoteName": "远程仓库名", + "nameRule": "只能包含A-Z 0-9 _ -", + "url": "URL", + "urlRule": "https://, ssh:// or file://", + "urlRule2": "网址中不能包含用户名/密码", + "noRemotes": "没有远程仓库", + "deleteRemoteConfrim": "您确定要删除远程仓库'__name__'吗?", + "deleteRemote": "删除远程仓库" + }, + "userSettings": { + "committerDetail": "提交者详细信息", + "committerTip": "保留空白以使用系统默认值", + "userName": "用户名", + "email": "电子邮件", + "sshKeys": "SSH密钥", + "sshKeysTip": "允许您创建到远程git存储库的安全连接。", + "add": "添加密钥", + "addSshKey": "添加SSH密钥", + "addSshKeyTip": "生成新的公钥/私钥对", + "name": "名字", + "nameRule": "只能包含A-Z 0-9 _ -", + "passphrase": "密码短语", + "passphraseShort": "密码短语过短", + "optional": "可选的", + "cancel": "取消", + "generate": "生成密钥", + "noSshKeys": "没有SSH密钥", + "copyPublicKey": "将公钥复制到剪贴板", + "delete": "删除密钥", + "gitConfig": "Git配置", + "deleteConfirm": "您确定要删除SSH密钥__name__吗?这不能被撤消。" + }, + "versionControl": { + "unstagedChanges": "未暂存的变更", + "stagedChanges": "暂存的变更", + "unstageChange": "取消变更的暂存", + "stageChange": "暂存变更", + "unstageAllChange": "取消所有变更的暂存", + "stageAllChange": "暂存所有变更", + "commitChanges": "提交变更", + "resolveConflicts": "解决冲突", + "head": "HEAD", + "staged": "暂存的", + "unstaged": "未暂存的", + "local": "本地的", + "remote": "远程的", + "revert": "您确定要将更改恢复为'__file__'吗?这不能被撤消。", + "revertChanges": "还原变更", + "localChanges": "本地变更", + "none": "None", + "conflictResolve": "解决所有冲突。提交更改以完成合并。", + "localFiles": "本地文件", + "all": "所有的", + "unmergedChanges": "未合并的更改", + "abortMerge": "中止合并", + "commit": "提交", + "changeToCommit": "提交变更", + "commitPlaceholder": "输入您的提交信息", + "cancelCapital": "取消", + "commitCapital": "提交", + "commitHistory": "提交历史", + "branch": "分支:", + "moreCommits": "更多提交", + "changeLocalBranch": "变更本地分支", + "createBranchPlaceholder": "查找或创建分支", + "upstream": "上游", + "localOverwrite": "切换分支会覆盖您现有的本地更改。您必须先提交或撤消那些更改。", + "manageRemoteBranch": "管理远程分支", + "unableToAccess": "无法访问远程存储库", + "retry": "重试", + "setUpstreamBranch": "设置为上游分支", + "createRemoteBranchPlaceholder": "查找或创建远程分支", + "trackedUpstreamBranch": "创建的分支将被设置为跟踪的上游分支。", + "selectUpstreamBranch": "分支将被创建。 在下面选择以将其设置为被跟踪的上游分支。", + "pushFailed": "推送失败,因为远程具有更多的最新提交。请先拉取并合并,然后再尝试推送。", + "push": "推送", + "pull": "拉取", + "unablePull": "

无法提取远程更改;您未暂存的本地更改将被覆盖。

请先提交更改,然后重试。

", + "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": { @@ -408,10 +752,12 @@ "str": "文字列", "num": "数字", "re": "正则表达式", - "bool": "布尔", + "bool": "布尔值", "json": "JSON", "bin": "二进制流", - "date": "时间戳" + "date": "时间戳", + "jsonata": "表达式", + "env": "环境变量" } }, "editableList": { @@ -423,8 +769,10 @@ }, "expressionEditor": { "functions": "功能", + "functionReference": "功能reference", "insert": "插入", "title": "JSONata表达式编辑器", + "test": "测试", "data": "示例消息", "result": "结果", "format": "格式表达方法", @@ -438,14 +786,228 @@ "eval": "评估表达式错误:\n __message__" } }, + "jsEditor": { + "title": "JavaScript编辑器" + }, + "textEditor": { + "title": "文本编辑器" + }, "jsonEditor": { "title": "JSON编辑器", - "format": "格式化JSON" + "format": "格式化JSON", + "rawMode": "编辑 JSON", + "uiMode": "Visual编辑器", + "insertAbove": "在上方插入", + "insertBelow": "在下方插入", + "addItem": "添加项目", + "copyPath": "复制路径到项目", + "expandItems": "展开项目", + "collapseItems": "收合项目", + "duplicate": "重复", + "error": { + "invalidJSON": "无效的JSON: " + } + }, + "markdownEditor": { + "title": "Markdown编辑器", + "expand": "展开", + "format": "格式化为markdown", + "heading1": "标题 1", + "heading2": "标题 2", + "heading3": "标题 3", + "bold": "粗体", + "italic": "斜体", + "code": "代码", + "ordered-list": "排序的列表", + "unordered-list": "非排序的列表", + "quote": "引用", + "link": "链接", + "horizontal-rule": "水平线", + "toggle-preview": "切换预览" }, "bufferEditor": { "title": "缓冲区编辑器", "modeString": "作为UTF-8字符串处理", "modeArray": "作为JSON数组处理", "modeDesc": "

缓冲区编辑器

缓冲区类型被存储为字节值的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": "简体中文" } } diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-CN/jsonata.json b/packages/node_modules/@node-red/editor-client/locales/zh-CN/jsonata.json index 669a7683a..56ede1b4e 100644 --- a/packages/node_modules/@node-red/editor-client/locales/zh-CN/jsonata.json +++ b/packages/node_modules/@node-red/editor-client/locales/zh-CN/jsonata.json @@ -214,5 +214,53 @@ "$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": "返回一个数组,其中重复的值已从`数组`中删除" } } diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json b/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json new file mode 100644 index 000000000..492fce58c --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/locales/zh-TW/editor.json @@ -0,0 +1,945 @@ +{ + "common": { + "label": { + "name": "名稱", + "ok": "確認", + "done": "完成", + "cancel": "取消", + "delete": "刪除", + "close": "關閉", + "load": "讀取", + "save": "保存", + "import": "匯入", + "export": "匯出", + "back": "返回", + "next": "下一步", + "clone": "複製專案", + "cont": "Continue" + } + }, + "workspace": { + "defaultName": "流程__number__", + "editFlow": "編輯流程: __name__", + "confirmDelete": "確認刪除", + "delete": "確定想要刪除 '__label__'?", + "dropFlowHere": "把流程放到這裡", + "addFlow": "新增流程", + "listFlows": "流程列表", + "status": "狀態", + "enabled": "有效", + "disabled": "無效", + "info": "詳細描述", + "selectNodes": "點擊節點用於選擇", + "tip": "詳細描述支援Markdown羽量級標記語言,並將出現在資訊標籤中。" + }, + "menu": { + "label": { + "view": { + "view": "顯示", + "grid": "格線", + "showGrid": "顯示格線", + "snapGrid": "對齊格線", + "gridSize": "格線尺寸", + "textDir": "文本方向", + "defaultDir": "默認方向", + "ltr": "從左到右", + "rtl": "從右到左", + "auto": "上下文", + "language": "Language", + "browserDefault": "Browser default" + }, + "sidebar": { + "show": "顯示側邊欄" + }, + "palette": { + "show": "Show palette" + }, + "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": "顯示新添加節點的標籤", + "clipboard": "剪貼簿", + "library": "庫", + "examples": "範例" + } + }, + "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_not_found": "

找不到項目的'__project__'

", + "git_merge_conflict": "

自動合併更改失敗。

修復未合併的衝突,然後提交結果。

" + }, + "error": "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": "在這裡粘貼節點", + "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": "已複製捨棄的數值", + "selectNodes": "選擇上面的文本並複製到剪貼簿" + }, + "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": "無法創建子流程: 多個輸入到了選擇" + }, + "format": "標記格式" + }, + "editor": { + "configEdit": "編輯", + "configAdd": "添加", + "configUpdate": "更新", + "configDelete": "刪除", + "nodesUse": "__count__個節點使用此配置", + "nodesUse_plural": "__count__個節點使用此配置", + "addNewConfig": "添加新的__type__配置", + "editNode": "編輯__type__節點", + "editConfig": "編輯__type__配置", + "addNewType": "添加新的__type__節點", + "nodeProperties": "節點屬性", + "label": "Label", + "portLabels": "埠標籤", + "labelInputs": "輸入", + "labelOutputs": "輸出", + "settingIcon": "Icon", + "noDefaultLabel": "無", + "defaultLabel": "使用默認標籤", + "searchIcons": "搜尋 icons", + "useDefault": "使用默認", + "description": "描述", + "show": "顯示", + "hide": "隱藏", + "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": "管理面板" + }, + "library": { + "library": "庫", + "openLibrary": "打開庫...", + "saveToLibrary": "保存到庫...", + "typeLibrary": "__type__型別程式庫", + "unnamedType": "無名__type__", + "exportedToLibrary": "節點導出到庫", + "dialogSaveOverwrite": "一個叫做__libraryName__的__libraryType__已經存在,您需要覆蓋麼?", + "invalidFilename": "無效的檔案名", + "savedNodes": "保存的節點", + "savedType": "已保存__type__", + "saveFailed": "保存失敗: __message__", + "types": { + "local": "本地", + "examples": "例子" + }, + "exportToLibrary": "將節點匯出到庫", + "filename": "檔案名", + "folder": "資料夾", + "filenamePlaceholder": "文件", + "fullFilenamePlaceholder": "a/b/文件", + "folderPlaceholder": "a/b", + "breadcrumb": "庫" + }, + "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": "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__衝突

", + "loading": "載入目錄...", + "tab-nodes": "節點", + "tab-install": "安裝", + "sort": "排序:", + "sortAZ": "a-z順序", + "sortRecent": "日期順序", + "more": "增加__count__個", + "errors": { + "catalogLoadFailed": "無法載入節點目錄。
查看瀏覽器控制台瞭解更多資訊", + "installFailed": "無法安裝: __module__
__message__
查看日誌瞭解更多資訊", + "removeFailed": "無法刪除: __module__
__message__
查看日誌瞭解更多資訊", + "updateFailed": "無法更新: __module__
__message__
查看日誌瞭解更多資訊", + "enableFailed": "無法啟用: __module__
__message__
查看日誌瞭解更多資訊", + "disableFailed": "無法禁用: __module__
__message__
查看日誌瞭解更多資訊" + }, + "confirm": { + "install": { + "body": "在安裝之前,請閱讀節點的文檔,某些節點的依賴關係不能自動解決,可能需要重新啟動Node-RED。", + "title": "安裝節點" + }, + "remove": { + "body": "刪除節點將從Node-RED卸載它。節點可能會繼續使用資源,直到重新啟動Node-RED。", + "title": "刪除節點" + }, + "update": { + "body": "更新節點將需要重新啟動Node-RED來完成更新,該過程必須由手動完成。", + "title": "更新節點" + }, + "cannotUpdate": { + "body": "此節點的更新可用,但不會安裝在面板管理器可以更新的位置。

請參閱有關如何更新此節點的文檔。" + }, + "button": { + "review": "打開節點資訊", + "install": "安裝", + "remove": "刪除", + "update": "更新" + } + } + } + }, + "sidebar": { + "info": { + "name": "節點信息", + "tabName": "名稱", + "label": "信息", + "node": "節點", + "type": "類型", + "module": "Module", + "id": "ID", + "status": "狀態", + "enabled": "啟用", + "disabled": "禁用", + "subflow": "子流程", + "instances": "實例", + "properties": "屬性", + "info": "信息", + "desc": "描述", + "blank": "空白", + "null": "空", + "showMore": "展開", + "showLess": "收起", + "flow": "流程", + "selection": "選擇", + "nodes": "__count__ 個節點", + "flowDesc": "流程描述", + "subflowDesc": "子流程描述", + "nodeHelp": "節點幫助", + "none": "無", + "arrayItems": "__count__個項目", + "showTips": "您可以從設置面板啟用提示資訊" + }, + "config": { + "name": "配置節點", + "label": "配置", + "global": "所有流程", + "none": "無", + "subflows": "子流程", + "flows": "流程", + "filterUnused": "未使用", + "filterAll": "所有", + "filtered": "__count__ 個隱藏" + }, + "context": { + "name": "上下文數據", + "label": "上下文", + "none": "未選擇", + "refresh": "刷新以加載", + "empty": "空", + "node": "節點", + "flow": "流程", + "global": "全局的", + "deleteConfirm": "你確定要刪除這個項目嗎?", + "autoRefresh": "自動刷新" + }, + "palette": { + "name": "節點管理", + "label": "節點" + }, + "project": { + "label": "項目", + "name": "名稱", + "description": "描述", + "dependencies": "依賴", + "settings": "設置", + "noSummaryAvailable": "無可用摘要", + "editDescription": "編輯專案描述", + "editDependencies": "編輯項目依賴", + "editReadme": "Edit README.md", + "showProjectSettings": "顯示項目設置", + "projectSettings": { + "title": "項目設定", + "edit": "編輯", + "none": "None", + "install": "安裝", + "removeFromProject": "從項目中刪除", + "addToProject": "添加到項目", + "files": "文件", + "package": "包", + "flow": "流程", + "credentials": "證書", + "packageCreate": "保存更改後將創建文件", + "fileNotExist": "文件不存在", + "selectFile": "選擇文件", + "invalidEncryptionKey": "無效的加密密鑰", + "encryptionEnabled": "啟用加密", + "encryptionDisabled": "禁用加密", + "setTheEncryptionKey": "設置加密密鑰", + "resetTheEncryptionKey": "重置加密密鑰", + "changeTheEncryptionKey": "更改加密密鑰", + "currentKey": "當前密鑰", + "newKey": "新密鑰", + "credentialsAlert": "這將刪除所有現有證書", + "versionControl": "版本控制", + "branches": "分支", + "noBranches": "沒有分支", + "deleteConfirm": "您確定要刪除本地分支'__name__'嗎?這不能被撤消。", + "unmergedConfirm": "本地分支'__name__'具有未合併的更改,這些更改將丟失。你確定要刪除嗎?", + "deleteUnmergedBranch": "刪除未合併的分支", + "gitRemotes": "Git遠程倉庫", + "addRemote": "添加遠程倉庫", + "addRemote2": "添加遠程倉庫", + "remoteName": "遠程倉庫名", + "nameRule": "必須僅包含A-Z 0-9 _ -", + "url": "URL", + "urlRule": "https://, ssh:// or file://", + "urlRule2": "網址中不要包含用戶名/密碼", + "noRemotes": "沒有遠程倉庫", + "deleteRemoteConfrim": "確定要刪除遠程倉庫'__name__'嗎?", + "deleteRemote": "刪除遠程倉庫" + }, + "userSettings": { + "committerDetail": "提交者詳細信息", + "committerTip": "保留空白以使用系統默認值", + "userName": "用戶名", + "email": "電子郵件", + "sshKeys": "SSH密鑰", + "sshKeysTip": "允許您創建到遠程git存儲庫的安全連接。", + "add": "添加密鑰", + "addSshKey": "添加SSH密鑰", + "addSshKeyTip": "生成新的公鑰/私鑰對", + "name": "名字", + "nameRule": "必須僅包含A-Z 0-9 _ -", + "passphrase": "密碼短語", + "passphraseShort": "密碼短語太短", + "optional": "可選的", + "cancel": "取消", + "generate": "產生密鑰", + "noSshKeys": "沒有SSH密鑰", + "copyPublicKey": "將公鑰複製到剪貼板", + "delete": "刪除密鑰", + "gitConfig": "Git配置", + "deleteConfirm": "您確定要刪除SSH密鑰__name__嗎? 這不能被撤消。" + }, + "versionControl": { + "unstagedChanges": "未暫存的更改", + "stagedChanges": "已暫存的更改", + "unstageChange": "取消暫存更改", + "stageChange": "暫存更改", + "unstageAllChange": "取消暫存所有更改", + "stageAllChange": "暫存所有更改", + "commitChanges": "提交變更", + "resolveConflicts": "解決衝突", + "head": "HEAD", + "staged": "以暫存", + "unstaged": "未暫存", + "local": "本地的", + "remote": "遠程的", + "revert": "您確定要將更改恢復為'__file__'嗎? 這不能被撤消。", + "revertChanges": "還原變更", + "localChanges": "當地變化", + "none": "None", + "conflictResolve": "解決所有衝突。 提交更改以完成合併。", + "localFiles": "本地文件", + "all": "所有的", + "unmergedChanges": "未合併的更改", + "abortMerge": "合併中止", + "commit": "提交", + "changeToCommit": "提交變更", + "commitPlaceholder": "輸入您的提交信息", + "cancelCapital": "取消", + "commitCapital": "提交", + "commitHistory": "提交歷史", + "branch": "分支:", + "moreCommits": "更多提交", + "changeLocalBranch": "變更當地分支", + "createBranchPlaceholder": "查找或創建分支", + "upstream": "上游的", + "localOverwrite": "您有可通过切换分支覆盖的本地更改。您必须先提交或撤销那些更改。", + "manageRemoteBranch": "管理遠程分支", + "unableToAccess": "無法訪問遠程存儲庫", + "retry": "重試", + "setUpstreamBranch": "設置為上游分支", + "createRemoteBranchPlaceholder": "查找或創建遠程分支", + "trackedUpstreamBranch": "創建的分支將被設置為跟踪的上游分支。", + "selectUpstreamBranch": "分支將被創建。 在下面選擇以將其設置為被跟踪的上游分支。", + "pushFailed": "Push失敗,因為遠程具有更多的最新提交。請先進行pull與merge,然後再嘗試push。", + "push": "push", + "pull": "pull", + "unablePull": "

無法提取遠程更改;您未進行的暫存本地更改將被覆蓋。

提交更改,然後重試。

", + "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": "

JSONata的相容模式

目前的運算式仍然參考msg,所以將以相容性模式進行評估。請更新運算式,使其不使用msg,因為此模式將在將來刪除。

當JSONata支持首次添加到Node-RED時,它需要運算式引用msg物件。例如msg.payload將用於訪問有效負載。

這樣便不再需要運算式直接針對消息進行評估。要訪問有效負載,運算式應該只是payload.

", + "noMatch": "無匹配結果", + "errors": { + "invalid-expr": "無效的JSONata運算式:\n __message__", + "invalid-msg": "無效的示例JSON消息:\n __message__", + "context-unsupported": "無法測試上下文函數\n $flowContext 或 $globalContext", + "eval": "評估運算式錯誤:\n __message__" + } + }, + "jsEditor": { + "title": "JavaScript 編輯器" + }, + "textEditor": { + "title": "Text 編輯器" + }, + "jsonEditor": { + "title": "JSON編輯器", + "format": "格式化JSON" + }, + "markdownEditor": { + "title": "Markdown 編輯器", + "format": "F使用markdown格式化", + "heading1": "Heading 1", + "heading2": "Heading 2", + "heading3": "Heading 3", + "bold": "粗體", + "italic": "斜體", + "code": "程式碼", + "ordered-list": "編號清單", + "unordered-list": "符號清單", + "quote": "引用", + "link": "連結", + "horizontal-rule": "分隔線", + "toggle-preview": "預覽" + }, + "bufferEditor": { + "title": "緩衝區編輯器", + "modeString": "作為UTF-8字串處理", + "modeArray": "作為JSON陣列處理", + "modeDesc": "

緩衝區編輯器

緩衝區類型被存儲為位元組值的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": "屬性", + "description": "描述", + "appearance": "外觀", + "env": "環境變量" + } +} diff --git a/packages/node_modules/@node-red/editor-client/locales/zh-TW/infotips.json b/packages/node_modules/@node-red/editor-client/locales/zh-TW/infotips.json new file mode 100644 index 000000000..f783f2e8b --- /dev/null +++ b/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/node_modules/@node-red/editor-client/locales/zh-TW/jsonata.json b/packages/node_modules/@node-red/editor-client/locales/zh-TW/jsonata.json new file mode 100644 index 000000000..ae62fe068 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/locales/zh-TW/jsonata.json @@ -0,0 +1,218 @@ +{ + "$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的午夜)開始到現在的毫秒數。如果該字串的格式不正確,則拋出錯誤。" + } +} diff --git a/packages/node_modules/@node-red/editor-client/src/ace/bin/snippets/nrjavascript.js b/packages/node_modules/@node-red/editor-client/src/ace/bin/snippets/nrjavascript.js index d11f3fc6a..c0f5c2e0d 100644 --- a/packages/node_modules/@node-red/editor-client/src/ace/bin/snippets/nrjavascript.js +++ b/packages/node_modules/@node-red/editor-client/src/ace/bin/snippets/nrjavascript.js @@ -1,4 +1,4 @@ -ace.define("ace/snippets/nrjavascript",[],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="nrjavascript"}); +ace.define("ace/snippets/nrjavascript",[],function(e,t,n){"use strict";t.snippetText='# Prototype\nsnippet proto\n ${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\n ${4:// body...}\n };\n# Function\nsnippet fun\n function ${1?:function_name}(${2:argument}) {\n ${3:// body...}\n }\n# Anonymous Function\nregex /((=)\\s*|(:)\\s*|(\\()|\\b)/f/(\\))?/\nsnippet f\n function${M1?: ${1:functionName}}($2) {\n ${0:$TM_SELECTED_TEXT}\n }${M2?;}${M3?,}${M4?)}\n# Immediate function\ntrigger \\(?f\\(\nendTrigger \\)?\nsnippet f(\n (function(${1}) {\n ${0:${TM_SELECTED_TEXT:/* code */}}\n }(${1}));\n# if\nsnippet if\n if (${1:true}) {\n ${0}\n }\n# if ... else\nsnippet ife\n if (${1:true}) {\n ${2}\n } else {\n ${0}\n }\n# tertiary conditional\nsnippet ter\n ${1:/* condition */} ? ${2:a} : ${3:b}\n# switch\nsnippet switch\n switch (${1:expression}) {\n case \'${3:case}\':\n ${4:// code}\n break;\n ${5}\n default:\n ${2:// code}\n }\n# case\nsnippet case\n case \'${1:case}\':\n ${2:// code}\n break;\n ${3}\n\n# while (...) {...}\nsnippet wh\n while (${1:/* condition */}) {\n ${0:/* code */}\n }\n# try\nsnippet try\n try {\n ${0:/* code */}\n } catch (e) {}\n# do...while\nsnippet do\n do {\n ${2:/* code */}\n } while (${1:/* condition */});\n# Object Method\nsnippet :f\nregex /([,{[])|^\\s*/:f/\n ${1:method_name}: function(${2:attribute}) {\n ${0}\n }${3:,}\n# setTimeout function\nsnippet setTimeout\nregex /\\b/st|timeout|setTimeo?u?t?/\n setTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\n# console.log (Firebug)\nsnippet cl\n console.log(${1});\n# return\nsnippet ret\n return ${1:result}\n# for (property in object ) { ... }\nsnippet fori\n for (var ${1:prop} in ${2:Things}) {\n ${0:$2[$1]}\n }\n# hasOwnProperty\nsnippet has\n hasOwnProperty(${1})\n# docstring\nsnippet /**\n /**\n * ${1:description}\n *\n */\nsnippet @par\nregex /^\\s*\\*\\s*/@(para?m?)?/\n @param {${1:type}} ${2:name} ${3:description}\nsnippet @ret\n @return {${1:type}} ${2:description}\n# JSON.parse\nsnippet jsonp\n JSON.parse(${1:jstr});\n# JSON.stringify\nsnippet jsons\n JSON.stringify(${1:object});\n# self-defining function\nsnippet sdf\n var ${1:function_name} = function(${2:argument}) {\n ${3:// initial code ...}\n\n $1 = function($2) {\n ${4:// main code}\n };\n }\n# \nsnippet for-\n for (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\n ${0:${2:Things}[${1:i}];}\n }\n# for (...) {...}\nsnippet for\n for (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\n ${3:$2[$1]}$0\n }\n# for (...) {...} (Improved Native For-Loop)\nsnippet forr\n for (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\n ${3:$2[$1]}$0\n }\n# Node-RED Specific Funcs\nsnippet nodes\n node.send(${1:msg})\nsnippet clone\n RED.util.cloneMessage(${1:msg})\nsnippet nodel\n node.log($1)\nsnippet nodew\n node.warn($1)\nsnippet nodee\n node.error($1)\nsnippet noded\n node.debug($1)\nsnippet done\n node.done($1)\nsnippet flowg\n flow.get($1)\nsnippet flows\n flow.set($1, $2)\nsnippet globalg\n global.get($1)\nsnippet globals\n global.set($1, $2)\n',t.scope="nrjavascript"}); (function() { ace.require(["ace/snippets/nrjavascript"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { @@ -6,4 +6,3 @@ ace.define("ace/snippets/nrjavascript",[],function(e,t,n){"use strict";t.snippet } }); })(); - \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js index cdf84d02f..9e91410a9 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js @@ -334,8 +334,7 @@ RED.deploy = (function() { var invalidNodes = []; RED.nodes.eachNode(function(node) { - hasInvalid = hasInvalid || !node.valid; - if (!node.valid) { + if (!node.valid && !node.d) { invalidNodes.push(getNodeInfo(node)); } if (node.type === "unknown") { @@ -345,6 +344,7 @@ RED.deploy = (function() { } }); hasUnknown = unknownNodes.length > 0; + hasInvalid = invalidNodes.length > 0; var unusedConfigNodes = []; RED.nodes.eachConfig(function(node) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js index 5f8379aa1..9fb29833a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editor.js @@ -582,11 +582,12 @@ RED.editor = (function() { // Add dummy fields to prevent 'Enter' submitting the form in some // cases, and also prevent browser auto-fill of password - // Add in reverse order as they are prepended... - $('').prependTo(dialogForm); - $('').prependTo(dialogForm); + // - the elements cannot be hidden otherwise Chrome will ignore them. + // - the elements need to have id's that imply password/username + $('
').prependTo(dialogForm); + $('
').prependTo(dialogForm); dialogForm.on("submit", function(e) { e.preventDefault();}); - dialogForm.find('input').attr("autocomplete","disable"); + dialogForm.find('input').attr("autocomplete","off"); return dialogForm; } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js index 3b83e3089..67b5850c4 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js @@ -106,7 +106,7 @@ options.push({id:"red-ui-editor-type-json-menu-duplicate", icon:"fa fa-copy", label:RED._("jsonEditor.duplicate"),onselect:function(){ var newKey = item.key; if (item.parent.type === 'array') { - newKey = parent.children.length; + newKey = item.parent.children.length; } else { var m = /^(.*?)(-(\d+))?$/.exec(newKey); var usedKeys = {}; diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 9961cbf2b..967a61f51 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -92,8 +92,11 @@ RED.palette = (function() { var lineHeight = 20; var portHeight = 10; + el.attr("data-palette-label",label); + label = RED.utils.sanitize(label); + var words = label.split(/[ -]/); var displayLines = []; @@ -469,7 +472,7 @@ RED.palette = (function() { function filterChange(val) { var re = new RegExp(val.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'),'i'); $("#red-ui-palette-container .red-ui-palette-node").each(function(i,el) { - var currentLabel = $(el).find(".red-ui-palette-label").text(); + var currentLabel = $(el).attr("data-palette-label"); var type = $(el).attr("data-palette-type"); if (val === "" || re.test(type) || re.test(currentLabel)) { $(this).show(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js index 7069be6b7..e367e9c95 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js @@ -336,7 +336,7 @@ RED.sidebar.versionControl = (function() { var unstagedContent = $('
').appendTo(localChanges.content); var header = $('
'+RED._("sidebar.project.versionControl.localFiles")+'
').appendTo(unstagedContent); - stageAllButton = $('') + stageAllButton = $('') .appendTo(header) .on("click", function(evt) { evt.preventDefault(); @@ -368,7 +368,7 @@ RED.sidebar.versionControl = (function() { unmergedContent = $('
').appendTo(localChanges.content); header = $('
'+RED._("sidebar.project.versionControl.unmergedChanges")+'
').appendTo(unmergedContent); - bg = $('
').appendTo(header); + bg = $('
').appendTo(header); var abortMergeButton = $('') .appendTo(bg) .on("click", function(evt) { @@ -433,7 +433,7 @@ RED.sidebar.versionControl = (function() { header = $('
'+RED._("sidebar.project.versionControl.changeToCommit")+'
').appendTo(stagedContent); - bg = $('
').appendTo(header); + bg = $('
').appendTo(header); var showCommitBox = function() { commitMessage.val(""); submitCommitButton.prop("disabled",true); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/debug.scss b/packages/node_modules/@node-red/editor-client/src/sass/debug.scss index d767aaed3..c92c43320 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/debug.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/debug.scss @@ -160,6 +160,7 @@ .red-ui-debug-msg-element { color: $debug-message-text-color; line-height: 1.3em; + overflow-wrap: break-word; } .red-ui-debug-msg-object-key { color: $debug-message-text-color-object-key; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss index 46b09de43..4be9761f7 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tab-context.scss @@ -27,9 +27,22 @@ display: none; } } + + .red-ui-info-table { + table-layout: fixed; + } + + table.red-ui-info-table tr:not(.blank) td:first-child { + width: 30%; + } + table.red-ui-info-table tr:not(.blank) td:last-child { + vertical-align: top; + } + } .red-ui-sidebar-context-property { + overflow-wrap: break-word; position: relative; .red-ui-debug-msg-tools { right: 0px; diff --git a/packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js b/packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js index 0cc69715a..382537be3 100644 --- a/packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js +++ b/packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js @@ -171,6 +171,7 @@ '$sum':{ args:[ 'array' ]}, '$toMillis':{args:['timestamp']}, // <------------- '$trim':{ args:[ 'str' ]}, + '$type':{ args:['value']}, '$uppercase':{ args:[ 'str' ]}, '$zip':{ args:[ 'array1' ]} } diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html index 91555fb5c..aecb8eeb9 100644 --- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html +++ b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.html @@ -22,6 +22,7 @@ + diff --git a/packages/node_modules/@node-red/nodes/core/parsers/70-HTML.html b/packages/node_modules/@node-red/nodes/core/parsers/70-HTML.html index dd16d395f..4509dd054 100644 --- a/packages/node_modules/@node-red/nodes/core/parsers/70-HTML.html +++ b/packages/node_modules/@node-red/nodes/core/parsers/70-HTML.html @@ -1,7 +1,7 @@ diff --git a/packages/node_modules/@node-red/nodes/core/sequence/19-batch.html b/packages/node_modules/@node-red/nodes/core/sequence/19-batch.html index f3cb47a54..418ac605b 100644 --- a/packages/node_modules/@node-red/nodes/core/sequence/19-batch.html +++ b/packages/node_modules/@node-red/nodes/core/sequence/19-batch.html @@ -60,8 +60,8 @@
- - + +
diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/common/20-inject.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/20-inject.html new file mode 100644 index 000000000..78b218083 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/20-inject.html @@ -0,0 +1,34 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/common/21-debug.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/21-debug.html new file mode 100644 index 000000000..e3137c50d --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/21-debug.html @@ -0,0 +1,25 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/common/24-complete.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/24-complete.html new file mode 100644 index 000000000..e69ebc6a0 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/24-complete.html @@ -0,0 +1,24 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/common/25-catch.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/25-catch.html new file mode 100644 index 000000000..5b2b4c3b2 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/25-catch.html @@ -0,0 +1,36 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/common/25-status.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/25-status.html new file mode 100644 index 000000000..7d9504c9f --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/25-status.html @@ -0,0 +1,33 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/common/60-link.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/60-link.html new file mode 100644 index 000000000..6f2bc5f99 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/60-link.html @@ -0,0 +1,31 @@ + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/common/90-comment.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/90-comment.html new file mode 100644 index 000000000..f98577ff4 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/90-comment.html @@ -0,0 +1,21 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/common/98-unknown.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/98-unknown.html new file mode 100644 index 000000000..108e19228 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/common/98-unknown.html @@ -0,0 +1,24 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/function/10-function.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/10-function.html new file mode 100644 index 000000000..035ccc81f --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/10-function.html @@ -0,0 +1,51 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/function/10-switch.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/10-switch.html new file mode 100644 index 000000000..7ad25c24f --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/10-switch.html @@ -0,0 +1,37 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/function/15-change.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/15-change.html new file mode 100644 index 000000000..fcba3fed4 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/15-change.html @@ -0,0 +1,33 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/function/16-range.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/16-range.html new file mode 100644 index 000000000..b5d2d033f --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/16-range.html @@ -0,0 +1,40 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/function/80-template.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/80-template.html new file mode 100644 index 000000000..938a77818 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/80-template.html @@ -0,0 +1,46 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/function/89-delay.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/89-delay.html new file mode 100644 index 000000000..690bddaea --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/89-delay.html @@ -0,0 +1,32 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/function/89-trigger.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/89-trigger.html new file mode 100644 index 000000000..5f27a5002 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/89-trigger.html @@ -0,0 +1,33 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/function/90-exec.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/90-exec.html new file mode 100644 index 000000000..27c421160 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/function/90-exec.html @@ -0,0 +1,74 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json b/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json index 9202bb3a7..46560d181 100644 --- a/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json @@ -6,7 +6,9 @@ "name": "名称", "username": "用户名", "password": "密码", - "property": "属性" + "property": "属性", + "selectNodes": "选择节点...", + "expand": "扩展" }, "status": { "connected": "已连接", @@ -35,7 +37,22 @@ "stopped": "停止", "failed": "注入失败: __error__", "label": { - "repeat": "重复" + "repeat": "重复", + "flow": "流上下午", + "global": "全局上下文", + "str": "字符串", + "num": "数值", + "bool": "布尔值", + "json": "JSON对象", + "bin": "buffer", + "date": "时间戳", + "env": "环境变量", + "object": "对象", + "string": "字符串", + "boolean": "布尔值", + "number": "数值", + "Array": "数组", + "invalid": "无效的JSON对象" }, "timestamp": "时间戳", "none": "无", @@ -70,15 +87,13 @@ } }, "catch": { - "catch": "监测所有节点", - "catchNodes": "监测__number__个节点", + "catch": "捕获:所有节点", + "catchNodes": "捕获:__number__个节点", + "catchUncaught": "捕获:未捕获", "label": { - "source": "监测范围", - "node": "节点", - "type": "类型", + "source": "捕获范围", "selectAll": "全选", - "sortByLabel": "按名称排序", - "sortByType": "按类型排序" + "uncaught": "忽略其他捕获节点处理的错误" }, "scope": { "all": "所有节点", @@ -90,10 +105,6 @@ "statusNodes": "报告__number__个节点状态", "label": { "source": "报告状态范围", - "node": "节点", - "type": "类型", - "selectAll": "全选", - "sortByLabel": "按名称排序", "sortByType": "按类型排序" }, "scope": { @@ -101,8 +112,13 @@ "selected": "指定节点" } }, + "complete": { + "completeNodes": "完成: __number__个节点" + }, "debug": { "output": "输出", + "none": "None", + "invalid-exp": "无效的JSONata表达式: __error__", "msgprop": "信息属性", "msgobj": "完整信息", "to": "目标", @@ -124,7 +140,11 @@ "filterCurrent": "当前流程", "debugNodes": "调试节点", "clearLog": "清空日志", - "openWindow": "在新窗口打开" + "filterLog": "过滤日志", + "openWindow": "在新窗口打开", + "copyPath": "复制路径", + "copyPayload": "复制值", + "pinPath": "固定展开" }, "messageMenu": { "collapseAll": "折叠所有路径", @@ -146,26 +166,33 @@ "key": "私钥", "passphrase": "密码", "ca": "CA证书", - "verify-server-cert":"验证服务器证书" + "verify-server-cert":"验证服务器证书", + "servername": "服务器名" }, "placeholder": { "cert":"证书路径 (PEM 格式)", "key":"私钥路径 (PEM 格式)", "ca":"CA证书路径 (PEM 格式)", - "passphrase":"私钥密码 (可选)" + "passphrase":"私钥密码 (可选)", + "servername":"用于SNI" }, "error": { "missing-file": "未提供证书/密钥文件" } }, "exec": { + "exec": "exec", + "spawn": "spawn", "label": { "command": "命令", "append": "追加", "timeout": "超时", "timeoutplace": "可选填", "return": "输出", - "seconds": "秒" + "seconds": "秒", + "stdout": "标准输出", + "stderr": "标准错误输出", + "retcode": "返回码" }, "placeholder": { "extraparams": "额外的输入参数" @@ -177,6 +204,7 @@ "oldrc": "使用旧式输出 (兼容模式)" }, "function": { + "function": "函数", "label": { "function": "函数", "outputs": "输出" @@ -187,6 +215,7 @@ } }, "template": { + "template": "模板", "label": { "template": "模版", "property": "属性", @@ -199,7 +228,7 @@ "yaml": "YAML", "none": "无" }, - "templatevalue": "This is the payload: {{payload}} !" + "templatevalue": "这是有效载荷: {{payload}} !" }, "delay": { "action": "行为设置", @@ -272,6 +301,9 @@ "wait-reset": "等待被重置", "wait-for": "等待", "wait-loop": "周期性重发", + "for": "处理", + "bytopics": "每个msg.topic", + "alltopics": "所有消息", "duration": { "ms": "毫秒", "s": "秒", @@ -290,6 +322,7 @@ } }, "comment": { + "comment": "注释" }, "unknown": { "label": { @@ -300,9 +333,10 @@ "mqtt": { "label": { "broker": "服务端", - "example": "e.g. localhost", + "example": "比如:本地主机", "output": "输出", "qos": "QoS", + "retain": "保持", "clientid": "客户端ID", "port": "端口", "keepalive": "Keepalive计时(秒)", @@ -312,17 +346,22 @@ "verify-server-cert":"验证服务器证书", "compatmode": "使用旧式MQTT 3.1支持" }, + "sections-label":{ + "birth-message": "连接时发送的消息(出生消息)", + "will-message":"意外断开连接时的发送消息(Will消息)", + "close-message":"断开连接前发送的消息(关闭消息)" + }, "tabs-label": { "connection": "连接", "security": "安全", - "will": "Will信息", - "birth": "Birth信息" + "messages": "消息" }, "placeholder": { "clientid": "留白则自动生成", "clientid-nonclean":"如非新会话,必须设置客户端ID", "will-topic": "留白将禁止Will信息", - "birth-topic": "留白将禁止Birth信息" + "birth-topic": "留白将禁止Birth信息", + "close-topic": "留白以禁用关闭消息" }, "state": { "connected": "已连接到服务端: __broker__", @@ -333,7 +372,9 @@ "output": { "buffer": "Buffer", "string": "字符串", - "base64": "Base64编码字符串" + "base64": "Base64编码字符串", + "auto": "自动检测 (字符串或buffer)", + "json": "解析的JSON对象" }, "true": "是", "false": "否", @@ -342,7 +383,9 @@ "not-defined": "主题未设置", "missing-config": "未设置服务端", "invalid-topic": "主题无效", - "nonclean-missingclientid": "客户端ID未设定,使用新会话" + "nonclean-missingclientid": "客户端ID未设定,使用新会话", + "invalid-json-string": "无效的JSON字符串", + "invalid-json-parse": "无法解析JSON字符串" } }, "httpin": { @@ -353,13 +396,27 @@ "return": "返回", "upload": "接受文件上传?", "status": "状态码", - "headers": "Header", - "other": "其他" + "headers": "头", + "other": "其他", + "paytoqs" : "将msg.payload附加为查询字符串参数", + "utf8String": "UTF8格式的字符串", + "binaryBuffer": "二进制buffer", + "jsonObject": "解析的JSON对象", + "authType": "类型", + "bearerToken": "Token" }, "setby": "- 用 msg.method 设定 -", "basicauth": "基本认证", "use-tls": "使用安全连接 (SSL/TLS) ", "tls-config":"TLS 设置", + "basic": "基本认证", + "digest": "摘要认证", + "bearer": "bearer认证", + "use-proxy": "使用代理服务器", + "persist": "对连接启用keep-alive", + "proxy-config": "代理服务器设置", + "use-proxyauth": "使用代理身份验证", + "noproxy-hosts": "代理例外", "utf8": "UTF-8 字符串", "binary": "二进制数据", "json": "JSON对象", @@ -376,7 +433,10 @@ "json-error": "JSON 解析错误", "no-url": "未设定 URL", "deprecated-call":"__method__方法已弃用", - "invalid-transport":"非HTTP传输请求" + "invalid-transport":"非HTTP传输请求", + "timeout-isnan": "超时值不是有效数字,忽略", + "timeout-isnegative": "超时值为负,忽略", + "invalid-payload": "无效的有效载荷" }, "status": { "requesting": "请求中" @@ -399,13 +459,19 @@ "url1": "URL 应该使用ws://或者wss://方案并指向现有的websocket侦听器.", "url2": "默认情况下,payload 将包含要发送或从Websocket接收的数据。可以将客户端配置为以JSON格式的字符串发送或接收整个消息对象." }, + "status": { + "connected": "连接数 __count__", + "connected_plural": "连接数 __count__" + }, "errors": { "connect-error": "ws连接发生了错误: ", "send-error": "发送时发生了错误: ", - "missing-conf": "未设置服务器" + "missing-conf": "未设置服务器", + "duplicate-path": "同一路径上不能有两个WebSocket侦听器: __path__" } }, "watch": { + "watch": "watch", "label": { "files": "文件", "recursive": "递归所有子文件夹" @@ -421,7 +487,7 @@ "output": "输出", "port": "端口", "host": "主机地址", - "payload": "的有效载荷", + "payload": "有效载荷", "delimited": "分隔符号", "close-connection": "是否在成功发送每条信息后断开连接?", "decode-base64": "用 Base64 解码信息?", @@ -480,7 +546,6 @@ "output": "输出", "group": "组", "interface": "本地IP", - "interfaceprompt": "(可选)本地 IP 绑定到", "send": "发送一个", "toport": "到端口", "address": "地址", @@ -488,6 +553,7 @@ }, "placeholder": { "interface": "(可选)eth0的IP地址", + "interfaceprompt": "(可选) 要绑定的本地接口或地址", "address": "目标IP地址" }, "udpmsgs": "udp信息", @@ -529,15 +595,18 @@ "ip-notset": "udp: IP地址未设定", "port-notset": "udp: 端口未设定", "port-invalid": "udp: 无效端口号码", - "alreadyused": "udp: 端口已被占用" + "alreadyused": "udp: 端口已被占用", + "ifnotfound": "udp: 接口 __iface__ 未发现" } }, "switch": { + "switch": "switch", "label": { "property": "属性", "rule": "规则", "repair" : "重建信息队列" }, + "previous": "先前值", "and": "与", "checkall": "全选所有规则", "stopfirst": "接受第一条匹配信息后停止", @@ -550,11 +619,15 @@ "false":"为假", "null":"为空", "nnull":"非空", - "head":"head", - "tail":"tail", - "index":"index between", + "istype": "类型是", + "empty": "为空", + "nempty": "非空", + "head":"头", + "tail":"尾", + "index":"索引在..中间", "exp":"JSONata表达式", - "else":"除此以外" + "else":"除此以外", + "hask": "拥有键" }, "errors": { "invalid-expr": "无效的JSONata表达式: __error__", @@ -588,6 +661,7 @@ } }, "range": { + "range": "range", "label": { "action": "操作", "inputrange": "映射输入数据", @@ -623,7 +697,8 @@ "firstrow": "第一行包含列名", "output": "输出", "includerow": "包含列名行", - "newline": "换行符" + "newline": "换行符", + "usestrings": "parse numerical values" }, "placeholder": { "columns": "用逗号分割列名" @@ -654,7 +729,8 @@ "html": { "label": { "select": "选取项", - "output": "输出" + "output": "输出", + "in": "in" }, "output": { "html": "选定元素的html内容", @@ -670,7 +746,9 @@ "errors": { "dropped-object": "忽略非对象格式的有效负载", "dropped": "忽略不支持格式的有效负载类型", - "dropped-error": "转换有效负载失败" + "dropped-error": "转换有效负载失败", + "schema-error": "JSON架构错误", + "schema-error-compile": "JSON架构错误: 未能编译架构" }, "label": { "o2j": "对象至JSON", @@ -713,7 +791,10 @@ "breaklines": "分拆成行", "filelabel": "文件", "sendError": "发生错误时发送消息(传统模式)", - "deletelabel": "删除 __file__" + "deletelabel": "删除 __file__", + "encoding": "编码", + "utf8String": "UTF8字符串", + "binaryBuffer": "二进制buffer" }, "action": { "append": "追加至文件", @@ -731,6 +812,21 @@ "deletedfile": "删除文件: __file__", "appendedfile": "追加至文件: __file__" }, + "encoding": { + "none": "默认", + "native": "Native", + "unicode": "Unicode", + "japanese": "日本", + "chinese": "中国", + "korean": "韩国", + "taiwan": "台湾/香港", + "windows": "Windows代码页", + "iso": "ISO代码页", + "ibm": "IBM代码页", + "mac": "Mac代码页", + "koi8": "KOI8代码页", + "misc": "其它" + }, "errors": { "nofilename": "未指定文件名", "invaliddelete": "警告:无效删除。请在配置对话框中使用特定的删除选项", @@ -742,6 +838,7 @@ "tip": "提示: 文件名应该是绝对路径,否则它将相对于Node-RED进程的工作目录。" }, "split": { + "split": "split", "intro":"基于以下类型拆分msg.payload:", "object":"对象", "objectSend":"每个键值对作为单个消息发送", @@ -753,6 +850,7 @@ "addname":" 复制键到 " }, "join":{ + "join": "join", "mode":{ "mode":"模式", "auto":"自动", @@ -761,6 +859,7 @@ "custom":"手动" }, "combine":"合并每个", + "completeMessage": "完整的消息", "create":"输出为", "type":{ "string":"字符串", @@ -799,6 +898,7 @@ } }, "sort" : { + "sort": "sort", "target" : "排序属性", "seq" : "信息队列", "key" : "键值", @@ -812,6 +912,7 @@ "clear" : "清空sort节点中的待定信息" }, "batch" : { + "batch": "batch", "mode": { "label" : "模式", "num-msgs" : "按指定数量分组", diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/network/05-tls.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/05-tls.html new file mode 100644 index 000000000..5a9603946 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/05-tls.html @@ -0,0 +1,19 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/network/06-httpproxy.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/06-httpproxy.html new file mode 100644 index 000000000..e84971973 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/06-httpproxy.html @@ -0,0 +1,22 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/10-mqtt.html new file mode 100644 index 000000000..520d7f4ef --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/10-mqtt.html @@ -0,0 +1,71 @@ + + + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/network/21-httpin.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/21-httpin.html new file mode 100644 index 000000000..0fb52efd1 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/21-httpin.html @@ -0,0 +1,81 @@ + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/21-httprequest.html new file mode 100644 index 000000000..3c7b163e2 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/21-httprequest.html @@ -0,0 +1,78 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/network/22-websocket.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/22-websocket.html new file mode 100644 index 000000000..d2ee29dfa --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/22-websocket.html @@ -0,0 +1,35 @@ + + + + + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/network/31-tcpin.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/31-tcpin.html new file mode 100644 index 000000000..2f00ed5f5 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/31-tcpin.html @@ -0,0 +1,35 @@ + + + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/network/32-udp.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/32-udp.html new file mode 100644 index 000000000..1e01aa0a3 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/network/32-udp.html @@ -0,0 +1,28 @@ + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-CSV.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-CSV.html new file mode 100644 index 000000000..5657f4cd3 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-CSV.html @@ -0,0 +1,43 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-HTML.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-HTML.html new file mode 100644 index 000000000..73b365600 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-HTML.html @@ -0,0 +1,33 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-JSON.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-JSON.html new file mode 100644 index 000000000..2e574a0bf --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-JSON.html @@ -0,0 +1,43 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-XML.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-XML.html new file mode 100644 index 000000000..04a7783ef --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-XML.html @@ -0,0 +1,48 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-YAML.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-YAML.html new file mode 100644 index 000000000..e65d1b87d --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/parsers/70-YAML.html @@ -0,0 +1,34 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/sequence/17-split.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/sequence/17-split.html new file mode 100644 index 000000000..22f01832a --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/sequence/17-split.html @@ -0,0 +1,133 @@ + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/sequence/18-sort.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/sequence/18-sort.html new file mode 100644 index 000000000..226355a8c --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/sequence/18-sort.html @@ -0,0 +1,41 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/sequence/19-batch.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/sequence/19-batch.html new file mode 100644 index 000000000..012f20816 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/sequence/19-batch.html @@ -0,0 +1,34 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/storage/10-file.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/storage/10-file.html new file mode 100644 index 000000000..4ec78cdb4 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/storage/10-file.html @@ -0,0 +1,59 @@ + + + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/storage/23-watch.html b/packages/node_modules/@node-red/nodes/locales/zh-CN/storage/23-watch.html new file mode 100644 index 000000000..eec611429 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/storage/23-watch.html @@ -0,0 +1,25 @@ + + + diff --git a/packages/node_modules/@node-red/nodes/locales/zh-TW/messages.json b/packages/node_modules/@node-red/nodes/locales/zh-TW/messages.json new file mode 100644 index 000000000..153a88300 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/locales/zh-TW/messages.json @@ -0,0 +1,910 @@ +{ + "common": { + "label": { + "payload": "內容", + "topic": "主題", + "name": "名稱", + "username": "使用者名稱", + "password": "密碼", + "property": "屬性" + }, + "status": { + "connected": "已連接", + "not-connected": "未連接", + "disconnected": "已斷開", + "connecting": "連接中", + "error": "錯誤", + "ok": "確定" + }, + "notification": { + "error": "錯誤: __message__", + "errors": { + "not-deployed": "節點未部署", + "no-response": "伺服器無反應", + "unexpected": "發生意外錯誤 (__status__) __message__" + } + }, + "errors": { + "nooverride": "警告: 資訊的屬性已經不可以改寫節點的屬性. 詳情參考 bit.ly/nr-override-msg-props" + } + }, + "inject": { + "inject": "注入", + "repeat": "重複 = __repeat__", + "crontab": "crontab = __crontab__", + "stopped": "停止", + "failed": "注入失敗: __error__", + "label": { + "repeat": "重複" + }, + "timestamp": "時間戳記", + "none": "無", + "interval": "週期性執行", + "interval-time": "指定時間段並週期性執行", + "time": "指定時間", + "seconds": "秒", + "minutes": "分鐘", + "hours": "小時", + "between": "介於", + "previous": "之前數值", + "at": "在", + "and": "至", + "every": "每隔", + "days": [ + "星期一", + "星期二", + "星期三", + "星期四", + "星期五", + "星期六", + "星期天" + ], + "on": "在", + "onstart": "立刻執行於", + "onceDelay": "秒後, 此後", + "tip": "注意: \"指定時間段並週期性執行\" 和 \"指定時間\" 會使用cron系統.
詳情查看信息頁.", + "success": "成功注入: __label__", + "errors": { + "failed": "注入失敗, 請查看日誌", + "toolong": "週期過長" + } + }, + "catch": { + "catch": "監測所有節點", + "catchNodes": "監測__number__個節點", + "label": { + "source": "監測範圍", + "node": "節點", + "type": "類型", + "selectAll": "全選", + "sortByLabel": "按名稱排序", + "sortByType": "按類型排序" + }, + "scope": { + "all": "所有節點", + "selected": "指定節點" + } + }, + "status": { + "status": "報告所有節點狀態", + "statusNodes": "報告__number__個節點狀態", + "label": { + "source": "報告狀態範圍", + "node": "節點", + "type": "類型", + "selectAll": "全選", + "sortByLabel": "按名稱排序", + "sortByType": "按類型排序" + }, + "scope": { + "all": "所有節點", + "selected": "指定節點" + } + }, + "debug": { + "output": "輸出", + "msgprop": "資訊屬性", + "msgobj": "完整資訊", + "to": "目標", + "debtab": "除錯窗口", + "tabcon": "除錯窗口及Console", + "toSidebar": "除錯窗口", + "toConsole": "Console", + "toStatus": "節點狀態 (32位元字元)", + "severity": "級別", + "notification": { + "activated": "成功啟動: __label__", + "deactivated": "成功取消: __label__" + }, + "sidebar": { + "label": "除錯窗口", + "name": "名稱", + "filterAll": "所有節點", + "filterSelected": "已選節點", + "filterCurrent": "當前流程", + "debugNodes": "除錯節點", + "clearLog": "清空日誌", + "openWindow": "在新視窗打開" + }, + "messageMenu": { + "collapseAll": "折疊所有路徑", + "clearPinned": "清空已固定路徑", + "filterNode": "過濾此節點", + "clearFilter": "清空過濾條件" + } + }, + "link": { + "linkIn": "輸入", + "linkOut": "輸出" + }, + "tls": { + "tls": "TLS設置", + "label": { + "use-local-files": "使用本地密鑰及證書檔", + "upload": "上傳", + "cert": "證書", + "key": "私密金鑰", + "passphrase": "密碼", + "ca": "CA證書", + "verify-server-cert":"驗證伺服器憑證" + }, + "placeholder": { + "cert":"憑證路徑 (PEM 格式)", + "key":"私密金鑰路徑 (PEM 格式)", + "ca":"CA憑證路徑 (PEM 格式)", + "passphrase":"私密金鑰密碼 (可選)" + }, + "error": { + "missing-file": "未提供證書/金鑰檔案" + } + }, + "exec": { + "label": { + "command": "命令", + "append": "追加", + "timeout": "超時", + "timeoutplace": "可選填", + "return": "輸出", + "seconds": "秒" + }, + "placeholder": { + "extraparams": "額外的輸入參數" + }, + "opt": { + "exec": "當命令完成時 - exec模式", + "spawn": "當命令進行時 - spawn模式" + }, + "oldrc": "使用舊式輸出 (相容模式)" + }, + "function": { + "label": { + "function": "函數", + "outputs": "輸出" + }, + "error": { + "inputListener":"無法在函數中監聽對'注入'事件", + "non-message-returned":"函數節點嘗試返回類型為 __type__ 的資訊" + } + }, + "template": { + "label": { + "template": "模版", + "property": "屬性", + "format": "語法高亮", + "syntax": "格式", + "output": "輸出為", + "mustache": "Mustache 模版", + "plain": "純文字", + "json": "JSON", + "yaml": "YAML", + "none": "無" + }, + "templatevalue": "This is the payload: {{payload}} !" + }, + "delay": { + "action": "行為設置", + "for": "時長", + "delaymsg": "延遲每一條資訊", + "delayfixed": "固定延遲時間", + "delayvarmsg": "允許msg.delay複寫延遲時長", + "randomdelay": "隨機延遲", + "limitrate": "限制資訊頻率", + "limitall": "所有資訊", + "limittopic": "每一個msg.topic", + "fairqueue": "依次發送每一個topic", + "timedqueue": "發所有topic", + "milisecs": "毫秒", + "secs": "秒", + "sec": "秒", + "mins": "分", + "min": "分", + "hours": "小時", + "hour": "小時", + "days": "天", + "day": "天", + "between": "介於", + "and": "至", + "rate": "速度", + "msgper": "信息 每", + "dropmsg": "不傳輸中間資訊", + "label": { + "delay": "延遲", + "variable": "變數", + "limit": "限制", + "limitTopic": "限制主題", + "random": "隨機", + "units" : { + "second": { + "plural" : "秒", + "singular": "秒" + }, + "minute": { + "plural" : "分鐘", + "singular": "分鐘" + }, + "hour": { + "plural" : "小時", + "singular": "小時" + }, + "day": { + "plural" : "天", + "singular": "天" + } + } + }, + "error": { + "buffer": "緩衝了超過 1000 條資訊", + "buffer1": "緩衝了超過 10000 條資訊" + } + }, + "trigger": { + "send": "發送", + "then": "然後", + "then-send": "然後發送", + "output": { + "string": "字串", + "number": "數字", + "existing": "現有資訊物件", + "original": "原本資訊物件", + "latest": "最新資訊物件", + "nothing": "無" + }, + "wait-reset": "等待被重置", + "wait-for": "等待", + "wait-loop": "週期性重發", + "duration": { + "ms": "毫秒", + "s": "秒", + "m": "分鐘", + "h": "小時" + }, + "extend": " 如有新資訊,延長延遲", + "label": { + "trigger": "觸發", + "trigger-block": "觸發並阻止", + "trigger-loop": "週期性重發", + "reset": "重置觸發節點條件 如果:", + "resetMessage":"msg.reset已設置", + "resetPayload":"msg.payload等於", + "resetprompt": "可選填" + } + }, + "comment": { + }, + "unknown": { + "label": { + "unknown": "未知" + }, + "tip": "

此節點是您安裝,但Node-RED所不知道的類型。

如果在此狀態下部署節點,那麼它的配置將被保留,但是流程將不會啟動,直到安裝缺少的節點。

有關更多説明,請參閱資訊側欄

" + }, + "mqtt": { + "label": { + "broker": "服務端", + "example": "e.g. localhost", + "output": "輸出", + "qos": "QoS", + "clientid": "使用者端ID", + "port": "埠", + "keepalive": "Keepalive計時(秒)", + "cleansession": "使用新的會話", + "use-tls": "使用安全連接 (SSL/TLS)", + "tls-config":"TLS 設置", + "verify-server-cert":"驗證伺服器憑證", + "compatmode": "使用舊式MQTT 3.1支援" + }, + "tabs-label": { + "connection": "連接", + "security": "安全", + "will": "Will信息", + "birth": "Birth信息" + }, + "placeholder": { + "clientid": "留白則自動隨機生成", + "clientid-nonclean":"如非新會話,必須設置使用者端ID", + "will-topic": "留白將禁止Will資訊", + "birth-topic": "留白將禁止Birth資訊" + }, + "state": { + "connected": "已連接到服務端: __broker__", + "disconnected": "已斷開與服務端 __broker__ 的連結", + "connect-failed": "與服務端 __broker__ 的連接失敗" + }, + "retain": "保留", + "output": { + "buffer": "Buffer", + "string": "字串", + "base64": "Base64編碼字串" + }, + "true": "是", + "false": "否", + "tip": "提示: 若希望通過msg屬性對topic(資訊), qos及retain(保留)進行設置, 則將上述項留白", + "errors": { + "not-defined": "主題未設置", + "missing-config": "未設置服務端", + "invalid-topic": "主題無效", + "nonclean-missingclientid": "使用者端ID未設定,使用新會話" + } + }, + "httpin": { + "label": { + "method": "請求方式", + "url": "URL", + "doc": "文字檔", + "return": "返回", + "upload": "接受檔案上傳?", + "status": "狀態碼", + "headers": "Header", + "other": "其他" + }, + "setby": "- 用 msg.method 設定 -", + "basicauth": "基本認證", + "use-tls": "使用安全連接 (SSL/TLS) ", + "tls-config":"TLS 設置", + "utf8": "UTF-8 字串", + "binary": "二進位資料", + "json": "JSON對象", + "tip": { + "in": "相對URL", + "res": "發送到此節點的消息必須來自http input節點", + "req": "提示:如果JSON解析失敗,則獲取的字串將按原樣返回." + }, + "httpreq": "http 請求", + "errors": { + "not-created": "當httpNodeRoot為否時,無法創建http-in節點", + "missing-path": "無路徑", + "no-response": "無響應物件", + "json-error": "JSON 解析錯誤", + "no-url": "未設定 URL", + "deprecated-call":"__method__方法已棄用", + "invalid-transport":"非HTTP傳輸請求" + }, + "status": { + "requesting": "請求中" + } + }, + "websocket": { + "label": { + "type": "類型", + "path": "路徑", + "url": "URL" + }, + "listenon": "監聽", + "connectto": "連接", + "sendrec": "發送/接受", + "payload": "有效載荷", + "message": "完整資訊", + "tip": { + "path1": "預設情況下,payload將包含要發送或從Websocket接收的資料。偵聽器可以配置為以JSON格式的字串發送或接收整個消息物件.", + "path2": "這條路徑將相對於 ", + "url1": "URL 應該使用ws://或者wss://方案並指向現有的websocket監聽器.", + "url2": "預設情況下,payload 將包含要發送或從Websocket接收的資料。可以將使用者端配置為以JSON格式的字串發送或接收整個消息物件." + }, + "errors": { + "connect-error": "ws連接發生了錯誤: ", + "send-error": "發送時發生了錯誤: ", + "missing-conf": "未設置伺服器" + } + }, + "watch": { + "label": { + "files": "文件", + "recursive": "遞迴所有子資料夾" + }, + "placeholder": { + "files": "逗號分開文件或資料夾" + }, + "tip": "在Windows上,請務必使用雙斜杠 \\\\ 來隔開資料夾名字" + }, + "tcpin": { + "label": { + "type": "類型", + "output": "輸出", + "port": "埠", + "host": "主機位址", + "payload": "的有效載荷", + "delimited": "分隔符號號", + "close-connection": "是否在成功發送每條資訊後斷開連接?", + "decode-base64": "用 Base64 解碼信息?", + "server": "伺服器", + "return": "返回", + "ms": "毫秒", + "chars": "字元" + }, + "type": { + "listen": "監聽", + "connect": "連接", + "reply": "回應 TCP" + }, + "output": { + "stream": "字串流", + "single": "單一", + "buffer": "Buffer", + "string": "字串", + "base64": "Base64 字串" + }, + "return": { + "timeout": "指定時間後", + "character": "當收到某個字元為", + "number": "指定字元數", + "never": "永不 - 保持連接", + "immed": "馬上 - 不需要等待回復" + }, + "status": { + "connecting": "正在連接到 __host__:__port__", + "connected": "已經連接到 __host__:__port__", + "listening-port": "監聽埠 __port__", + "stopped-listening": "已停止監聽埠", + "connection-from": "連接來自 __host__:__port__", + "connection-closed": "連接已關閉 __host__:__port__", + "connections": "__count__ 個連接", + "connections_plural": "__count__ 個連接" + + }, + "errors": { + "connection-lost": "連接中斷 __host__:__port__", + "timeout": "超時關閉通訊端連接,埠 __port__", + "cannot-listen": "無法監聽埠 __port__, 錯誤: __error__", + "error": "錯誤: __error__", + + "socket-error": "通訊端連接錯誤來自 __host__:__port__", + "no-host": "主機位址或埠未設定", + "connect-timeout": "連接逾時", + "connect-fail": "連接失敗" + } + }, + "udp": { + "label": { + "listen": "監聽", + "onport": "埠", + "using": "使用", + "output": "輸出", + "group": "組", + "interface": "本地IP", + "interfaceprompt": "(可選)本地 IP 綁定到", + "send": "發送一個", + "toport": "到埠", + "address": "地址", + "decode-base64": "是否解碼Base64編碼的資訊?" + }, + "placeholder": { + "interface": "(可選)eth0的IP地址", + "address": "目標IP位址" + }, + "udpmsgs": "udp信息", + "mcmsgs": "群播信息", + "udpmsg": "udp信息", + "bcmsg": "廣播資訊", + "mcmsg": "群播信息", + "output": { + "buffer": "Buffer", + "string": "字串", + "base64": "Base64編碼字串" + }, + "bind": { + "random": "綁定到任意本地埠", + "local": "綁定到本地埠", + "target": "綁定到目標埠" + }, + "tip": { + "in": "提示:確保您的防火牆將允許資料進入", + "out": "提示:如果要使用msg.ipmsg.port設置,請將位址和埠留空", + "port": "正在使用埠: " + }, + "status": { + "listener-at": "udp 監聽器正在監聽 __host__:__port__", + "mc-group": "udp 群播到 __group__", + "listener-stopped": "udp 監聽器已停止", + "output-stopped": "udp 輸出已停止", + "mc-ready": "udp 群播已準備好: __outport__ -> __host__:__port__", + "bc-ready": "udp 廣播已準備好: __outport__ -> __host__:__port__", + "ready": "udp 已準備好: __outport__ -> __host__:__port__", + "ready-nolocal": "udp 已準備好: __host__:__port__", + "re-use": "udp 重用通訊端: __outport__ -> __host__:__port__" + }, + "errors": { + "access-error": "UDP 訪問錯誤, 你可能需要root許可權才能接入1024以下的埠", + "error": "錯誤: __error__", + "bad-mcaddress": "無效的群播地址", + "interface": "必須是指定介面的IP位址", + "ip-notset": "udp: IP地址未設定", + "port-notset": "udp: 埠未設定", + "port-invalid": "udp: 無效埠號碼", + "alreadyused": "udp: 埠已被佔用" + } + }, + "switch": { + "label": { + "property": "屬性", + "rule": "規則", + "repair" : "重建資訊佇列" + }, + "and": "與", + "checkall": "全選所有規則", + "stopfirst": "接受第一條匹配資訊後停止", + "ignorecase": "忽略大小寫", + "rules": { + "btwn":"在之間", + "cont":"包含", + "regex":"匹配規則運算式", + "true":"為真", + "false":"為假", + "null":"為空", + "nnull":"非空", + "head":"head", + "tail":"tail", + "index":"index between", + "exp":"JSONata運算式", + "else":"除此以外" + }, + "errors": { + "invalid-expr": "無效的JSONata運算式: __error__", + "too-many" : "Switch節點中有太多待定信息" + } + }, + "change": { + "label": { + "rules": "規則", + "rule": "規則", + "set": "設定 __property__", + "change": "修改 __property__", + "delete": "刪除 __property__", + "move": "移動 __property__", + "changeCount": "修改: __count__條規矩", + "regex": "使用規則運算式" + }, + "action": { + "set": "設定", + "change": "修改", + "delete": "刪除", + "move": "轉移", + "to": "到", + "search": "搜索", + "replace": "替代為" + }, + "errors": { + "invalid-from": "無效的'from'屬性: __error__", + "invalid-json": "無效的'to'JSON 屬性", + "invalid-expr": "無效的JSONata運算式: __error__" + } + }, + "range": { + "label": { + "action": "操作", + "inputrange": "映射輸入資料", + "resultrange": "至目標範圍", + "from": "從", + "to": "到", + "roundresult": "取最接近整數?" + }, + "placeholder": { + "min": "e.g. 0", + "maxin": "e.g. 99", + "maxout": "e.g. 255" + }, + "scale": { + "payload": "按比例msg.payload", + "limit": "按比例並設定界限至目標範圍", + "wrap": "按比例並包含在目標範圍內" + }, + "tip": "提示: 此節點僅對數字有效", + "errors": { + "notnumber": "不是一個數字" + } + }, + "csv": { + "label": { + "columns": "列", + "separator": "分隔符號", + "c2o": "CSV至對象", + "o2c": "對象至CSV", + "input": "輸入", + "skip-s": "忽略前", + "skip-e": "行", + "firstrow": "第一行包含列名", + "output": "輸出", + "includerow": "包含列名行", + "newline": "分行符號" + }, + "placeholder": { + "columns": "用逗號分割列名" + }, + "separator": { + "comma": "逗號", + "tab": "Tab", + "space": "空格", + "semicolon": "分號", + "colon": "冒號", + "hashtag": "井號", + "other": "其他..." + }, + "output": { + "row": "每行一條信息", + "array": "僅一條資訊 [陣列]" + }, + "newline": { + "linux": "Linux (\\n)", + "mac": "Mac (\\r)", + "windows": "Windows (\\r\\n)" + }, + "errors": { + "csv_js": "此節點僅處理CSV字串或JS物件", + "obj_csv": "對象->CSV轉換未設定列模版" + } + }, + "html": { + "label": { + "select": "選取項", + "output": "輸出" + }, + "output": { + "html": "選定元素的html內容", + "text": "選定元素的純文字內容", + "attr": "包含選定元素的所有屬性的物件" + }, + "format": { + "single": "一條資訊 [陣列]", + "multi": "多條資訊,每條一個元素" + } + }, + "json": { + "errors": { + "dropped-object": "忽略非物件格式的有效負載", + "dropped": "忽略不支援格式的有效負載類型", + "dropped-error": "轉換有效負載失敗" + }, + "label": { + "o2j": "對象至JSON", + "pretty": "格式化JSON字串", + "action": "操作", + "property": "屬性", + "actions": { + "toggle": "JSON字串與物件互轉", + "str":"總是轉為JSON字串", + "obj":"總是轉為JS對象" + } + } + }, + "yaml": { + "errors": { + "dropped-object": "忽略非物件格式的有效負載", + "dropped": "忽略不支援格式的有效負載類型", + "dropped-error": "轉換有效負載失敗" + } + }, + "xml": { + "label": { + "represent": "XML標籤屬性的屬性名稱", + "prefix": "標籤文本內容的屬性名稱", + "advanced": "高級選項", + "x2o": "XML到物件選項" + }, + "errors": { + "xml_js": "此節點僅處理XML字串或JS物件." + } + }, + "rpi-gpio": { + "label": { + "gpiopin": "GPIO", + "selectpin": "選擇引腳", + "resistor": "電阻?", + "readinitial": "在部署/重啟時讀取引腳的初始狀態?", + "type": "類型", + "initpin": "初始化引腳狀態?", + "debounce": "去抖動", + "freq": "頻率", + "button": "按鈕", + "pimouse": "Pi滑鼠", + "pikeyboard": "Pi鍵盤", + "left": "左", + "right": "右", + "middle": "中" + }, + "resistor": { + "none": "無", + "pullup": "上拉電阻", + "pulldown": "下拉電阻" + }, + "digout": "數位輸出", + "pwmout": "PWM輸出", + "servo": "伺服輸出", + "initpin0": "初始引腳電平 - 低(0)", + "initpin1": "初始引腳電平 - 高(1)", + "left": "左", + "right": "右", + "middle": "中", + "any": "任何", + "pinname": "引腳", + "alreadyuse": "已被使用", + "alreadyset": "已被設為", + "tip": { + "pin": "正在使用引腳: ", + "in": "提示: 僅接受數位輸入 - 輸出必須為0或1.", + "dig": "提示: 如用數位輸出 - 輸入必須為0或1.", + "pwm": "提示: 如用PWM輸出 - 輸入必須為0至100之間; 如用高頻率可能會比預期佔用更多CPU資源.", + "ser": "提示: 如用伺服輸出 - 輸入必須為0至100之間. 50為中間值." + }, + "types": { + "digout": "數位輸出", + "input": "輸入", + "pullup": "含有上拉電阻的輸入", + "pulldown": "含有下拉電阻的輸入", + "pwmout": "PWM輸出", + "servo": "伺服輸出" + }, + "status": { + "stopped": "已停止", + "closed": "已關閉", + "not-running": "不運行" + }, + "errors": { + "ignorenode": "忽略樹莓派的特定節點", + "version": "版本命令失敗", + "sawpitype": "查看Pi類型", + "libnotfound": "找不到樹莓派RPi.GPIO的python庫", + "alreadyset": "GPIO引腳 __pin__ 已經被設定為類型: __type__", + "invalidpin": "無效GPIO引腳", + "invalidinput": "無效輸入", + "needtobeexecutable": "__command__須為可運行命令", + "mustbeexecutable": "nrgpio須為可運行", + "commandnotfound": "nrgpio命令不存在", + "commandnotexecutable": "nrgpio命令不可運行", + "error": "錯誤: __error__", + "pythoncommandnotfound": "nrpgio python命令未處於運行狀態" + } + }, + "file": { + "label": { + "filename": "檔案名", + "action": "行為", + "addnewline": "向每個有效載荷添加分行符號(\\n)?", + "createdir": "創建目錄(如果不存在)?", + "outputas": "輸出", + "breakchunks": "分拆成塊", + "breaklines": "分拆成行", + "filelabel": "文件", + "sendError": "發生錯誤時發送消息(傳統模式)", + "deletelabel": "刪除 __file__" + }, + "action": { + "append": "追加至文件", + "overwrite": "複寫文件", + "delete": "刪除檔" + }, + "output": { + "utf8": "一個utf8字串", + "buffer": "一個Buffer物件", + "lines": "每行一條信息", + "stream": "一個Buffer流" + }, + "status": { + "wrotefile": "寫入至文件: __file__", + "deletedfile": "刪除檔: __file__", + "appendedfile": "追加至文件: __file__" + }, + "errors": { + "nofilename": "未指定檔案名", + "invaliddelete": "警告:無效刪除。請在配置對話方塊中使用特定的刪除選項", + "deletefail": "無法刪除檔: __error__", + "writefail": "無法寫入文件: __error__", + "appendfail": "無法追加到文件: __error__", + "createfail": "檔創建失敗: __error__" + }, + "tip": "提示: 檔案名應該是絕對路徑,否則它將相對於Node-RED進程的工作目錄。" + }, + "split": { + "intro":"基於以下類型拆分msg.payload:", + "object":"對象", + "objectSend":"每個鍵值對作為單個消息發送", + "strBuff":"字串 / Buffer", + "array":"陣列", + "splitUsing":"拆分使用", + "splitLength":"固定長度", + "stream":"作為消息流處理", + "addname":" 複製鍵到 " + }, + "join":{ + "mode":{ + "mode":"模式", + "auto":"自動", + "merge":"合併序列", + "reduce":"縮減序列", + "custom":"手動" + }, + "combine":"合併每個", + "create":"輸出為", + "type":{ + "string":"字串", + "array":"陣列", + "buffer":"Buffer", + "object":"鍵值對對象", + "merged":"合併對象" + }, + "using":"使用此值", + "key":"作為鍵", + "joinedUsing":"合併符號", + "send":"發送資訊:", + "afterCount":"達到一定數量的資訊時", + "count":"數量", + "subsequent":"和每個後續的消息", + "afterTimeout":"第一條消息的若干時間後", + "seconds":"秒", + "complete":"在收到存在msg.complete的消息後", + "tip":"此模式假定此節點與split相連, 或者接收到的消息有正確配置的msg.parts屬性.", + "too-many" : "join節點中有太多待定信息", + "merge": { + "topics-label":"合併主題", + "topics":"主題", + "topic" : "主題", + "on-change":"當收到一個新主題時發送已合併資訊" + }, + "reduce": { + "exp": "Reduce運算式", + "exp-value": "exp", + "init": "初始值", + "right": "反向求值(從後往前)", + "fixup": "Fix-up exp" + }, + "errors": { + "invalid-expr": "無效的JSONata運算式: __error__" + } + }, + "sort" : { + "target" : "排序屬性", + "seq" : "資訊佇列", + "key" : "鍵值", + "elem" : "元素值", + "order" : "順序", + "ascending" : "昇冪", + "descending" : "降冪", + "as-number" : "作為數值", + "invalid-exp" : "sort節點中存在無效的JSONata運算式", + "too-many" : "sort節點中有太多待定信息", + "clear" : "清空sort節點中的待定資訊" + }, + "batch" : { + "mode": { + "label" : "模式", + "num-msgs" : "按指定數量分組", + "interval" : "按時間間隔分組", + "concat" : "按主題分組" + }, + "count": { + "label" : "分組數量", + "overlap" : "隊末隊首重疊數量", + "count" : "數量", + "invalid" : "無效的分組數量或重疊數量" + }, + "interval": { + "label" : "時間間隔", + "seconds" : "秒", + "empty" : "無數據到達時發送空資訊" + }, + "concat": { + "topics-label": "主題", + "topic" : "主題" + }, + "too-many" : "batch節點中有太多待定信息", + "unexpected" : "未知模式", + "no-parts" : "資訊中沒有parts屬性" + } +} diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/context/localfilesystem.js b/packages/node_modules/@node-red/runtime/lib/nodes/context/localfilesystem.js index 0f83573e8..cf1769700 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/context/localfilesystem.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/context/localfilesystem.js @@ -245,7 +245,7 @@ LocalFileSystem.prototype.get = function(scope, key, callback) { return this.cache.get(scope,key,callback); } if(typeof callback !== "function"){ - throw new Error("Callback must be a function"); + throw new Error("File Store cache disabled - only asynchronous access supported"); } var storagePath = getStoragePath(this.storageBaseDir ,scope); loadFile(storagePath + ".json").then(function(data){ @@ -304,7 +304,7 @@ LocalFileSystem.prototype.set = function(scope, key, value, callback) { }, this.flushInterval); } } else if (callback && typeof callback !== 'function') { - throw new Error("Callback must be a function"); + throw new Error("File Store cache disabled - only asynchronous access supported"); } else { self.writePromise = self.writePromise.then(function() { return loadFile(storagePath + ".json") }).then(function(data){ var obj = data ? JSON.parse(data) : {} diff --git a/packages/node_modules/@node-red/runtime/locales/zh-CN/runtime.json b/packages/node_modules/@node-red/runtime/locales/zh-CN/runtime.json new file mode 100644 index 000000000..d0813f476 --- /dev/null +++ b/packages/node_modules/@node-red/runtime/locales/zh-CN/runtime.json @@ -0,0 +1,174 @@ +{ + "runtime": { + "welcome": "欢迎使用Node-RED", + "version": "__component__ 版本: __version__", + "unsupported_version": "__component__的不受支持的版本。要求: __requires__ 找到: __version__", + "paths": { + "settings": "设置文件 : __path__", + "httpStatic": "HTTP Static : __path__" + } + }, + + "server": { + "loading": "加载控制板节点", + "palette-editor": { + "disabled": "控制板编辑器已禁用:用户设置", + "npm-not-found": "控制板编辑器已禁用:找不到npm命令", + "npm-too-old": "控制板编辑器已禁用: npm版本太旧。需要版本npm >= 3.x" + }, + "errors": "无法注册__count__节点类型", + "errors_plural": "无法注册__count__个节点类型", + "errors-help": "使用-v运行以获取详细信息", + "missing-modules": "缺少节点模块:", + "node-version-mismatch": "无法在此版本上加载节点模块。要求:__ version__", + "type-already-registered": "'__type__'已由模块__module__注册", + "removing-modules": "从配置中删除模块", + "added-types": "添加的节点类型:", + "removed-types": "删除的节点类型:", + "install": { + "invalid": "无效的模块名称", + "installing": "安装模块:__ name__,版本:__ version__", + "installed": "已安装的模块:__ name__", + "install-failed": "安装失败", + "install-failed-long": "模块__name__安装失败:", + "install-failed-not-found": "$t(server.install.install-failed-long) 模块未发现", + "upgrading": "更新模块: __name__ 至版本: __version__", + "upgraded": "更新模块: __name__。 重新启动Node-RED以使用新版本", + "upgrade-failed-not-found": "$t(server.install.install-failed-long) 未发现版本", + "uninstalling": "卸载模块: __name__", + "uninstall-failed": "卸载失败", + "uninstall-failed-long": "卸载模块__name__失败:", + "uninstalled": "卸载模块: __name__" + }, + "unable-to-listen": "无法在__listenpath__上收听", + "port-in-use": "错误: 端口正在使用中", + "uncaught-exception": "未捕获的异常:", + "admin-ui-disabled": "管理员界面已禁用", + "now-running": "服务器现在在__listenpath__上运行", + "failed-to-start": "无法启动服务器:", + "headless-mode": "在headless模式下运行", + "httpadminauth-deprecated": "不建议使用httpAdminAuth。请改用adminAuth" + }, + + "api": { + "flows": { + "error-save": "保存流程错误: __message__", + "error-reload": "重载流程错误: __message__" + }, + "library": { + "error-load-entry": "加载库条目'__path__'时出错:__message__", + "error-save-entry": "保存库条目'__path__'时出错:__ message__", + "error-load-flow": "加载流程'__path__'时出错:__ message__", + "error-save-flow": "保存流'__path__'时出错:__ message__" + }, + "nodes": { + "enabled": "启用的节点类型:", + "disabled": "禁用的节点类型:", + "error-enable": "无法启用节点:" + } + }, + + "comms": { + "error": "通讯渠道错误:__ message__", + "error-server": "通信服务器错误:__ message__", + "error-send": "通讯发送错误:__ message__" + }, + + "settings": { + "user-not-available": "无法保存用户设置:__ message__", + "not-available": "设置不可用", + "property-read-only": "属性“ __prop__”是只读的" + }, + + "nodes": { + "credentials": { + "error":"加载证书时出错:__ message__", + "error-saving":"保存证书时出错:__ message__", + "not-registered": "证书类型'__type__'未注册", + "system-key-warning": "\n\n---------------------------------------------------------------------\n您的流程证书文件是使用系统生成的密钥加密的。\n\n如果系统生成的密钥由于任何原因丢失,则您的证书文件将无法恢复,您将必须删除它并重新输入您的证书。\n\n您应该使用您的设置文件中的'credentialSecret'选项设置自己的密钥。然后,下次部署更改时,Node-RED将使用选择的密钥重新加密您的证书文件。\n---------------------------------------------------------------------\n" + }, + "flows": { + "safe-mode": "流程在安全模式下停止。部署开始。", + "registered-missing": "缺少注册的类型:__ type__", + "error": "错误加载流程:__ message__", + "starting-modified-nodes": "启动修改的节点", + "starting-modified-flows": "启动修改的流程", + "starting-flows": "启动流程", + "started-modified-nodes": "修改的节点已启动", + "started-modified-flows": "修改的流程已启动", + "started-flows": "流程已启动", + "stopping-modified-nodes": "停止修改的节点", + "stopping-modified-flows": "停止修改的流程", + "stopping-flows": "停止流程", + "stopped-modified-nodes": "修改的节点已停止", + "stopped-modified-flows": "修改的流程已停止", + "stopped-flows": "流程已停止", + "stopped": "已停止", + "stopping-error": "错误停止节点:__ message__", + "added-flow": "流程已添加: __label__", + "updated-flow": "流程已更新: __label__", + "removed-flow": "流程已移除: __label__", + "missing-types": "等待缺少的类型被注册:", + "missing-type-provided": " - __type__ (由npm模块__module__提供)", + "missing-type-install-1": "要安装所有缺少的模块,请运行:", + "missing-type-install-2": "在目录中:" + }, + "flow": { + "unknown-type": "未知类型: __type__", + "missing-types": "缺少类型", + "error-loop": "邮件已超过最大捕获数" + }, + "index": { + "unrecognised-id": "无法识别的ID: __id__", + "type-in-use": "使用中的类型: __msg__", + "unrecognised-module": "无法识别的模块: __module__" + }, + "registry": { + "localfilesystem": { + "module-not-found": "找不到模块:'__module__'" + } + } + }, + + "storage": { + "index": { + "forbidden-flow-name": "禁止流程名称" + }, + "localfilesystem": { + "user-dir": "用户目录: __path__", + "flows-file": "流程文件: __path__", + "create": "创建新__type__文件", + "empty": "现有__type__文件为空", + "invalid": "现有__type__文件为无效json", + "restore": "恢复__type__文件备份:__path__", + "restore-fail": "恢复__type__文件备份失败:__ message__", + "fsync-fail": "将文件__path__刷新到磁盘失败:__message__", + "projects": { + "changing-project": "设置活动项目:__ project__", + "active-project": "活动项目:__ project__", + "project-not-found": "找不到项目:__ project__", + "no-active-project": "没有活动的项目:使用默认流文件", + "disabled": "项目已禁用:editorTheme.projects.enabled = false", + "disabledNoFlag": "项目已禁用:设置editorTheme.projects.enabled = true来启用", + "git-not-found": "项目已禁用:找不到git命令", + "git-version-old": "项目已禁用:不支持的git __version__。 需要的git版本为2.x", + "summary": "一个Node-RED项目", + "readme": "### 关于\n\n这是您项目的README.md文件。它可以帮助用户了解您的项目,如何使用它以及他们可能需要知道的其他任何信息。" + } + } + }, + + "context": { + "log-store-init": "上下文储存: '__name__' [__info__]", + "error-loading-module": "加载上下文存储时出错: __message__", + "error-loading-module2": "加载上下文存储时出错 '__module__': __message__", + "error-module-not-defined": "上下文存储库'__storage__'缺少“模块”选项", + "error-invalid-module-name": "无效的上下文存储名称:'__ name__'", + "error-invalid-default-module": "无效的默认的上下文存储库: '__storage__'", + "unknown-store": "指定了未知的上下文存储库'__name__'。 使用默认存储库。", + "localfilesystem": { + "error-circular": "上下文__scope__包含无法保留的循环引用", + "error-write": "编写上下文时出错:__ message__" + } + } +} diff --git a/packages/node_modules/@node-red/util/lib/util.js b/packages/node_modules/@node-red/util/lib/util.js index ef43739e6..45a33be14 100644 --- a/packages/node_modules/@node-red/util/lib/util.js +++ b/packages/node_modules/@node-red/util/lib/util.js @@ -81,22 +81,25 @@ function ensureBuffer(o) { * @memberof @node-red/util_util */ function cloneMessage(msg) { - // Temporary fix for #97 - // TODO: remove this http-node-specific fix somehow - var req = msg.req; - var res = msg.res; - delete msg.req; - delete msg.res; - var m = clone(msg); - if (req) { - m.req = req; - msg.req = req; + if (typeof msg !== "undefined") { + // Temporary fix for #97 + // TODO: remove this http-node-specific fix somehow + var req = msg.req; + var res = msg.res; + delete msg.req; + delete msg.res; + var m = clone(msg); + if (req) { + m.req = req; + msg.req = req; + } + if (res) { + m.res = res; + msg.res = res; + } + return m; } - if (res) { - m.res = res; - msg.res = res; - } - return m; + return msg; } /** diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 174db5bfd..411c35a7c 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -18,7 +18,7 @@ "clone": "2.1.2", "i18next": "15.1.2", "json-stringify-safe": "5.0.1", - "jsonata": "1.7.0", + "jsonata": "1.8.0", "when": "3.7.8" } } diff --git a/scripts/install-ui-test-dependencies.sh b/scripts/install-ui-test-dependencies.sh index 0e13f0b4f..155d2b275 100755 --- a/scripts/install-ui-test-dependencies.sh +++ b/scripts/install-ui-test-dependencies.sh @@ -3,5 +3,7 @@ npm install --no-save \ wdio-chromedriver-service@^0.1.5 \ wdio-mocha-framework@^0.6.4 \ wdio-spec-reporter@^0.1.5 \ - webdriverio@^4.14.1 \ - chromedriver@^78.0.1 + webdriverio@^4.14.4 \ + chromedriver@^79.0.0 \ + wdio-browserstack-service@^0.1.19 \ + browserstack-local@^1.4.4 diff --git a/test/editor/pageobjects/util/key_page.js b/test/editor/pageobjects/util/key_page.js index 509af9e22..497a8a141 100644 --- a/test/editor/pageobjects/util/key_page.js +++ b/test/editor/pageobjects/util/key_page.js @@ -27,6 +27,12 @@ var shortCutKeyMapForMac = { }; function getShortCutKey(type) { + if (process.env.BROWSERSTACK) { + if (browser.desiredCapabilities.os === 'OS X') { + return shortCutKeyMapForMac[type]; + } + return shortCutKeyMap[type]; + } if (os.type() === 'Darwin') { return shortCutKeyMapForMac[type]; } diff --git a/test/editor/wdio.conf.js b/test/editor/wdio.conf.js index 7bbfcbe24..4e5a602e0 100644 --- a/test/editor/wdio.conf.js +++ b/test/editor/wdio.conf.js @@ -14,6 +14,7 @@ * limitations under the License. **/ +var browserstack = require('browserstack-local'); exports.config = { // @@ -48,27 +49,20 @@ exports.config = { // and 30 processes will get spawned. The property handles how many capabilities // from the same test should run tests. // - maxInstances: 10, + // maxInstances: 10, // // If you have trouble getting all important capabilities together, check out the // Sauce Labs platform configurator - a great tool to configure your capabilities: // https://docs.saucelabs.com/reference/platforms-configurator // - capabilities: [{ + // capabilities: [{ // maxInstances can get overwritten per capability. So if you have an in-house Selenium // grid with only 5 firefox instances available you can make sure that not more than // 5 instances get started at a time. - maxInstances: 2, + // maxInstances: 5, // - browserName: 'chrome', - 'goog:chromeOptions': { - args: process.env.NODE_RED_NON_HEADLESS - // Runs tests with opening a browser. - ? ['--disable-gpu', '--no-sandbox'] - // Runs tests without opening a browser. - : ['--headless', '--disable-gpu', 'window-size=1920,1080', '--no-sandbox'] - }, - }], + // browserName: 'firefox' + // }], // // =================== // Test Configurations @@ -103,7 +97,7 @@ exports.config = { baseUrl: 'http://localhost', // // Default timeout for all waitFor* commands. - waitforTimeout: 10000, + waitforTimeout: 20000, // // Default timeout in milliseconds for request // if Selenium Grid doesn't send response @@ -134,9 +128,7 @@ exports.config = { // Services take over a specific job you don't want to take care of. They enhance // your test setup with almost no effort. Unlike plugins, they don't add new // commands. Instead, they hook themselves up into the test process. - port: 9515, - path: '/', - services: ['chromedriver'], + //services: ['chromedriver'], // // Framework you want to run your specs with. // The following are supported: Mocha, Jasmine, and Cucumber @@ -155,7 +147,7 @@ exports.config = { // Options to be passed to Mocha. // See the full list at http://mochajs.org/ mochaOpts: { - timeout: 100000, + timeout: 1000000, ui: 'bdd' }, // @@ -171,8 +163,44 @@ exports.config = { * @param {Object} config wdio configuration object * @param {Array.} capabilities list of capabilities details */ - // onPrepare: function (config, capabilities) { - // }, + onPrepare: function (config, capabilities) { + if (process.env.BROWSERSTACK) { + return new Promise(function (resolve, reject) { + var options = { key: exports.config.key }; + var proxy = process.env.http_proxy || process.env.HTTP_PROXY; + if (proxy) { + var proxyConfigs = proxy.match(/^(https?):\/\/(([^:@\/]+):([^:@\/]+)@)?([^:@\/]+)(:([^:@\/]+))?\/?$/); + if (proxyConfigs) { + var protocol = proxyConfigs[1]; + var user = proxyConfigs[3]; + var pass = proxyConfigs[4]; + var host = proxyConfigs[5]; + var port = proxyConfigs[7]; + if (!port) { + if (protocol === 'http') { + port = 80; + } else if (protocol === 'https') { + port = 443; + } + } + if (host) { options.proxyHost = host; } + if (port) { options.proxyPort = port; } + if (user) { options.proxyUser = user; } + if (pass) { options.proxyPass = pass; } + } else { + reject('error in parsing the environment variable, http_proxy'); + } + } + exports.bs_local = new browserstack.Local(); + exports.bs_local.start(options, function (error) { + if (error) { + return reject(error); + } + resolve(); + }); + }); + } + }, /** * Gets executed just before initialising the webdriver session and test framework. It allows you * to manipulate configurations depending on the capability or spec. @@ -267,6 +295,44 @@ exports.config = { * @param {Object} config wdio configuration object * @param {Array.} capabilities list of capabilities details */ - // onComplete: function(exitCode, config, capabilities) { - // } + onComplete: function(exitCode, config, capabilities) { + if (process.env.BROWSERSTACK) { + exports.bs_local.stop(function () {}); + } + } +}; + +if (process.env.BROWSERSTACK) { + exports.config.maxInstances = 1; + if (process.env.BROWSERSTACK_USERNAME && process.env.BROWSERSTACK_ACCESS_KEY) { + exports.config.user = process.env.BROWSERSTACK_USERNAME; + exports.config.key = process.env.BROWSERSTACK_ACCESS_KEY; + } else { + console.log('You need to set the following environment variables.'); + console.log('BROWSERSTACK_USERNAME='); + console.log('BROWSERSTACK_ACCESS_KEY='); + } + exports.config.services = ['browserstack']; + var capabilities = []; + capabilities.push({ os: 'Windows', os_version: '10', browser: 'Chrome', resolution: '1920x1080', 'browserstack.local': true }); + capabilities.push({ os: 'Windows', os_version: '10', browser: 'Firefox', resolution: '1920x1080', 'browserstack.local': true }); + capabilities.push({ os: 'OS X', os_version: 'Catalina', browser: 'Chrome', resolution: '1920x1080', 'browserstack.local': true }); + capabilities.push({ os: 'OS X', os_version: 'Catalina', browser: 'Firefox', resolution: '1920x1080', 'browserstack.local': true }); + exports.config.capabilities = capabilities; +} else { + exports.config.maxInstances = 10; + exports.config.port = 9515; + exports.config.path = '/'; + exports.config.services = ['chromedriver']; + exports.config.capabilities = [{ + maxInstances: 2, + browserName: 'chrome', + 'goog:chromeOptions': { + args: process.env.NODE_RED_NON_HEADLESS + // Runs tests with opening a browser. + ? ['--disable-gpu', '--no-sandbox'] + // Runs tests without opening a browser. + : ['--headless', '--disable-gpu', 'window-size=1920,1080', '--no-sandbox'] + } + }]; } diff --git a/test/unit/@node-red/util/lib/util_spec.js b/test/unit/@node-red/util/lib/util_spec.js index cf59df55e..261dbc531 100644 --- a/test/unit/@node-red/util/lib/util_spec.js +++ b/test/unit/@node-red/util/lib/util_spec.js @@ -143,6 +143,10 @@ describe("@node-red/util/util", function() { cloned.req.should.equal(msg.req); cloned.res.should.equal(msg.res); }); + it('handles undefined values without throwing an error', function() { + var result = util.cloneMessage(undefined); + should.not.exist(result); + }) }); describe('getObjectProperty', function() { it('gets a property beginning with "msg."', function() { @@ -840,11 +844,11 @@ describe("@node-red/util/util", function() { }, } }; - + for (var i = 0; i < 1000; i++) { msg.msg.obj.big += 'some more string '; } - + var result = util.encodeObject(msg); result.format.should.eql("error"); var resultJson = JSON.parse(result.msg); @@ -862,7 +866,7 @@ describe("@node-red/util/util", function() { throw new Error('Exception in toString - should have been caught'); } msg.msg.constructor = { name: "strangeobj" }; - + var result = util.encodeObject(msg); var success = (result.msg.indexOf('[Type not printable]') >= 0); success.should.eql(true); @@ -872,11 +876,11 @@ describe("@node-red/util/util", function() { var msg = { msg: { mystrangeobj:"hello", - constructor: { + constructor: { get name(){ throw new Error('Exception in constructor name'); } - } + } }, }; var result = util.encodeObject(msg);