1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00

Merge branch 'master' into dev

This commit is contained in:
Nick O'Leary 2020-02-10 11:07:50 +00:00
commit 1f8ed9dcb9
No known key found for this signature in database
GPG Key ID: 4F2157149161A6C9
70 changed files with 4667 additions and 136 deletions

View File

@ -26,6 +26,10 @@ module.exports = function(grunt) {
nodemonArgs.push(flowFile); nodemonArgs.push(flowFile);
} }
var browserstack = grunt.option('browserstack');
if (browserstack) {
process.env.BROWSERSTACK = true;
}
var nonHeadless = grunt.option('non-headless'); var nonHeadless = grunt.option('non-headless');
if (nonHeadless) { if (nonHeadless) {
process.env.NODE_RED_NON_HEADLESS = true; process.env.NODE_RED_NON_HEADLESS = true;

View File

@ -47,7 +47,7 @@
"is-utf8": "0.2.1", "is-utf8": "0.2.1",
"js-yaml": "3.13.1", "js-yaml": "3.13.1",
"json-stringify-safe": "5.0.1", "json-stringify-safe": "5.0.1",
"jsonata": "1.7.0", "jsonata": "1.8.0",
"media-typer": "1.1.0", "media-typer": "1.1.0",
"memorystore": "1.6.1", "memorystore": "1.6.1",
"mime": "2.4.4", "mime": "2.4.4",

View File

@ -1008,6 +1008,7 @@
"en-US": "English", "en-US": "English",
"ja": "Japanese", "ja": "Japanese",
"ko": "Korean", "ko": "Korean",
"zh-CN": "Chinese(Simplified)" "zh-CN": "Chinese(Simplified)",
"zh-TW": "Chinese(Traditional)"
} }
} }

View File

@ -262,5 +262,9 @@
"$distinct": { "$distinct": {
"args": "array", "args": "array",
"desc": "Returns an array with duplicate values removed from `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`"
} }
} }

View File

@ -803,9 +803,9 @@
"expandItems": "要素を展開", "expandItems": "要素を展開",
"collapseItems": "要素を折り畳む", "collapseItems": "要素を折り畳む",
"duplicate": "複製", "duplicate": "複製",
"error": { "error": {
"invalidJSON": "不正なJSON: " "invalidJSON": "不正なJSON: "
} }
}, },
"markdownEditor": { "markdownEditor": {
"title": "マークダウンエディタ", "title": "マークダウンエディタ",
@ -1007,6 +1007,7 @@
"en-US": "英語", "en-US": "英語",
"ja": "日本語", "ja": "日本語",
"ko": "韓国語", "ko": "韓国語",
"zh-CN": "中国語(簡体)" "zh-CN": "中国語(簡体)",
"zh-TW": "中国語(繁体)"
} }
} }

View File

@ -245,11 +245,11 @@
}, },
"$encodeUrl": { "$encodeUrl": {
"args": "str", "args": "str",
"desc": "Uniform Resource Locator (URL)を構成する文字を1、、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": { "$encodeUrlComponent": {
"args": "str", "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": { "$decodeUrl": {
"args": "str", "args": "str",
@ -262,5 +262,9 @@
"$distinct": { "$distinct": {
"args": "array", "args": "array",
"desc": "配列`array`から重複要素を削除した配列を返します。" "desc": "配列`array`から重複要素を削除した配列を返します。"
},
"$type": {
"args": "value",
"desc": "`value` の型を文字列として返します。もし `value` が未定義の場合、 `undefined` が返されます。"
} }
} }

View File

@ -10,7 +10,22 @@
"load": "读取", "load": "读取",
"save": "保存", "save": "保存",
"import": "导入", "import": "导入",
"export": "导出" "export": "导出",
"back": "后退",
"next": "下一个",
"clone": "克隆项目",
"cont": "继续"
},
"type": {
"string": "字符串",
"number": "数字",
"boolean": "布尔值",
"array": "数组",
"buffer": "buffer",
"object": "对象",
"jsonString": "JSON字符串",
"undefined": "为定义",
"null": "空"
} }
}, },
"workspace": { "workspace": {
@ -19,10 +34,13 @@
"confirmDelete": "确认删除", "confirmDelete": "确认删除",
"delete": "你确定想删除 '__label__'?", "delete": "你确定想删除 '__label__'?",
"dropFlowHere": "把流程放到这里", "dropFlowHere": "把流程放到这里",
"addFlow": "添加流程",
"listFlows": "流程一览",
"status": "状态", "status": "状态",
"enabled": "有效", "enabled": "有效",
"disabled": "无效", "disabled": "无效",
"info": "详细描述" "info": "详细描述",
"selectNodes": "点击节点来选择"
}, },
"menu": { "menu": {
"label": { "label": {
@ -36,11 +54,16 @@
"defaultDir": "默认方向", "defaultDir": "默认方向",
"ltr": "从左到右", "ltr": "从左到右",
"rtl": "从右到左", "rtl": "从右到左",
"auto": "上下文" "auto": "上下文",
"language": "语言",
"browserDefault": "浏览器默认"
}, },
"sidebar": { "sidebar": {
"show": "显示侧边栏" "show": "显示侧边栏"
}, },
"palette": {
"show": "显示控制板"
},
"settings": "设置", "settings": "设置",
"userSettings": "用户设置", "userSettings": "用户设置",
"nodes": "节点", "nodes": "节点",
@ -60,11 +83,23 @@
"keyboardShortcuts": "键盘快捷方式", "keyboardShortcuts": "键盘快捷方式",
"login": "登陆", "login": "登陆",
"logout": "退出", "logout": "退出",
"editPalette":"节点管理", "editPalette": "节点管理",
"other": "其他", "other": "其他",
"showTips": "显示小提示" "showTips": "显示小提示",
"help": "Node-RED网页",
"projects": "项目",
"projects-new": "新建",
"projects-open": "打开",
"projects-settings": "项目设定",
"showNodeLabelDefault": "显示新添加的节点的标签"
} }
}, },
"actions": {
"toggle-navigator": "切换导航器",
"zoom-out": "缩小",
"zoom-reset": "重设缩放",
"zoom-in": "放大"
},
"user": { "user": {
"loggedInAs": "作为__name__登陆", "loggedInAs": "作为__name__登陆",
"username": "账号", "username": "账号",
@ -82,29 +117,73 @@
"warning": "<strong>警告</strong>: __message__", "warning": "<strong>警告</strong>: __message__",
"warnings": { "warnings": {
"undeployedChanges": "节点中存在未部署的更改", "undeployedChanges": "节点中存在未部署的更改",
"nodeActionDisabled": "节点操作已禁用",
"nodeActionDisabledSubflow": "节点动作在子流程中被禁用", "nodeActionDisabledSubflow": "节点动作在子流程中被禁用",
"missing-types": "流程由于缺少节点类型而停止。请检查日志的详细信息", "missing-types": "流程由于缺少节点类型而停止。请检查日志的详细信息",
"restartRequired": "Node-RED必须重新启动以启用升级的模块" "safe-mode": "<p>流程以安全模式停止。</p><p>您可以修改流程并部署更改以重新启动。</p>",
"restartRequired": "Node-RED必须重新启动以启用升级的模块",
"credentials_load_failed": "<p>由于无法解密凭据,因此流程停止。</p><p>流程凭据文件已加密,但是项目的加密密钥丢失或无效。</p>",
"credentials_load_failed_reset": "<p>凭据无法解密</p><p>流凭据文件已加密,但是项目的加密密钥丢失或无效。</p><p>流凭据文件将在下一次部署时重置。任何现有的流凭证将被清除。</p>",
"missing_flow_file": "<p>找不到项目流程文件。</p><p>该项目未配置流程文件。</p>",
"missing_package_file": "<p>找不到项目包文件。</p><p>项目缺少package.json文件。</p>",
"project_empty": "<p>该项目为空。</p><p>是否要创建一组默认的项目文件?<br/>否则,您将必须在编辑器外部手动将文件添加到项目中。</p>",
"project_not_found": "<p>未找到项目'__project__'。</p>",
"git_merge_conflict": "<p>自动合并更改失败。</p><p>修复未合并的冲突,然后提交结果。</p>"
}, },
"error": "<strong>Error</strong>: __message__", "error": "<strong>错误</strong>: __message__",
"errors": { "errors": {
"lostConnection": "丢失与服务器的连接,重新连接...", "lostConnection": "丢失与服务器的连接,重新连接...",
"lostConnectionReconnect": "丢失与服务器的连接__time__秒后重新连接", "lostConnectionReconnect": "丢失与服务器的连接__time__秒后重新连接",
"lostConnectionTry": "现在尝试", "lostConnectionTry": "现在尝试",
"cannotAddSubflowToItself": "无法向其自身添加子流程", "cannotAddSubflowToItself": "无法向其自身添加子流程",
"cannotAddCircularReference": "无法添加子流程 - 循环引用", "cannotAddCircularReference": "无法添加子流程 - 循环引用",
"unsupportedVersion": "您正在使用不受支持的Node.js版本<br/>请升级到最新版本的Node.js LTS" "unsupportedVersion": "您正在使用不受支持的Node.js版本<br/>请升级到最新版本的Node.js LTS",
"failedToAppendNode": "<p>'__module__'加载失败</p><p>__error__</p>"
},
"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": {
"clipboard": "剪贴板", "clipboard": "剪贴板",
"nodes": "节点", "nodes": "节点",
"node": "__count__节点",
"node_plural": "__count__节点",
"configNode": "__count__配置节点",
"configNode_plural": "__count__配置节点",
"flow": "__count__流程",
"flow_plural": "__count__流程",
"subflow": "__count__子流程",
"subflow_plural": "__count__子流程",
"pasteNodes": "在这里粘贴节点", "pasteNodes": "在这里粘贴节点",
"selectFile": "选择要导入的文件",
"importNodes": "导入节点", "importNodes": "导入节点",
"exportNodes": "导出节点至剪贴板", "exportNodes": "导出节点至剪贴板",
"download": "下载",
"importUnrecognised": "导入了无法识别的类型:", "importUnrecognised": "导入了无法识别的类型:",
"importUnrecognised_plural": "导入了无法识别的类型:", "importUnrecognised_plural": "导入了无法识别的类型:",
"nodesExported": "节点导出到了剪贴板", "nodesExported": "节点导出到了剪贴板",
"nodesImported": "导入:",
"nodeCopied": "已复制__count__个节点", "nodeCopied": "已复制__count__个节点",
"nodeCopied_plural": "已复制__count__个节点", "nodeCopied_plural": "已复制__count__个节点",
"invalidFlow": "无效的流程: __message__", "invalidFlow": "无效的流程: __message__",
@ -114,11 +193,21 @@
"all": "所有流程", "all": "所有流程",
"compact": "紧凑", "compact": "紧凑",
"formatted": "已格式化", "formatted": "已格式化",
"copy": "导出到剪贴板" "copy": "导出到剪贴板",
"export": "到处到库",
"exportAs": "导出为",
"overwrite": "替换",
"exists": "<p><b>\"__file__\"</b>已存在</p><p>是否要替换它?</p>"
}, },
"import": { "import": {
"import": "导入到", "import": "导入到",
"newFlow": "新流程" "newFlow": "新流程",
"errors": {
"notArray": "输入的不是JSON数组",
"itemNotObject": "输入的流无效 - 项目__index__不是节点对象",
"missingId": "输入的流无效-项 __index__ 缺少'id'属性",
"missingType": "输入的流程无效-项__index__缺少'类型'属性"
}
}, },
"copyMessagePath": "已复制路径", "copyMessagePath": "已复制路径",
"copyMessageValue": "已复制数值", "copyMessageValue": "已复制数值",
@ -132,7 +221,10 @@
"modifiedFlowsDesc": "只部署包含已更改节点的流", "modifiedFlowsDesc": "只部署包含已更改节点的流",
"modifiedNodes": "已更改的节点", "modifiedNodes": "已更改的节点",
"modifiedNodesDesc": "只部署已经更改的节点", "modifiedNodesDesc": "只部署已经更改的节点",
"restartFlows": "重启流程",
"restartFlowsDesc": "重新启动当前部署的流程",
"successfulDeploy": "部署成功", "successfulDeploy": "部署成功",
"successfulRestart": "成功重启流程",
"deployFailed": "部署失败: __message__", "deployFailed": "部署失败: __message__",
"unusedConfigNodes": "您有一些未使用的配置节点", "unusedConfigNodes": "您有一些未使用的配置节点",
"unusedConfigNodesLink": "点击此处查看它们", "unusedConfigNodesLink": "点击此处查看它们",
@ -152,16 +244,24 @@
"improperlyConfigured": "工作区包含一些未正确配置的节点:", "improperlyConfigured": "工作区包含一些未正确配置的节点:",
"unknown": "工作区包含一些未知的节点类型:", "unknown": "工作区包含一些未知的节点类型:",
"confirm": "你确定要部署吗?", "confirm": "你确定要部署吗?",
"doNotWarn": "不要再对此发出警告",
"conflict": "服务器正在运行较新的一组流程。", "conflict": "服务器正在运行较新的一组流程。",
"backgroundUpdate": "服务器上的流程已更新。", "backgroundUpdate": "服务器上的流程已更新。",
"conflictChecking": "检查是否可以自动合并更改", "conflictChecking": "检查是否可以自动合并更改",
"conflictAutoMerge": "此更改不包括冲突,可以自动合并", "conflictAutoMerge": "此更改不包括冲突,可以自动合并",
"conflictManualMerge": "这些更改包括了在部署之前必须解决的冲突。" "conflictManualMerge": "这些更改包括了在部署之前必须解决的冲突。",
"plusNMore": "+ __count__更多"
} }
}, },
"eventLog": {
"title": "事件记录日志",
"view": "查看日志"
},
"diff": { "diff": {
"unresolvedCount": "__count__个未解决的冲突", "unresolvedCount": "__count__个未解决的冲突",
"unresolvedCount_plural": "__count__个未解决的冲突", "unresolvedCount_plural": "__count__个未解决的冲突",
"globalNodes": "全局节点",
"flowProperties": "流程属性",
"type": { "type": {
"added": "已添加", "added": "已添加",
"changed": "已更改", "changed": "已更改",
@ -175,9 +275,19 @@
"nodeCount": "__count__个节点", "nodeCount": "__count__个节点",
"nodeCount_plural": "__count__个节点", "nodeCount_plural": "__count__个节点",
"local": "本地", "local": "本地",
"remote": "远程" "remote": "远程",
"reviewChanges": "查看变更",
"noBinaryFileShowed": "无法显示二进制文件内容",
"viewCommitDiff": "查看提交更改",
"compareChanges": "比较变更",
"saveConflict": "保存冲突解决",
"conflictHeader": "已解决<span>__unresolved__</span>中的<span>__resolved__</span>个冲突",
"commonVersionError": "通用版本不包含有效的JSON",
"oldVersionError": "旧版本不包含有效的JSON",
"newVersionError": "新版本不包含有效的JSON"
}, },
"subflow": { "subflow": {
"editSubflowInstance": "编辑子流实例__name__",
"editSubflow": "编辑流程模板: __name__", "editSubflow": "编辑流程模板: __name__",
"edit": "编辑流程模板", "edit": "编辑流程模板",
"subflowInstances": "这个子流程模板有__count__个实例", "subflowInstances": "这个子流程模板有__count__个实例",
@ -185,8 +295,14 @@
"editSubflowProperties": "编辑属性", "editSubflowProperties": "编辑属性",
"input": "输入:", "input": "输入:",
"output": "输出:", "output": "输出:",
"status": "状态节点",
"deleteSubflow": "删除子流程", "deleteSubflow": "删除子流程",
"info": "详细描述", "info": "详细描述",
"category": "类别",
"env": {
"restore": "恢复为默认子流",
"remove": "删除环境变量"
},
"errors": { "errors": {
"noNodesSelected": "<strong>无法创建子流程</strong>: 未选择节点", "noNodesSelected": "<strong>无法创建子流程</strong>: 未选择节点",
"multipleInputsToSelection": "<strong>无法创建子流程</strong>: 多个输入到了选择" "multipleInputsToSelection": "<strong>无法创建子流程</strong>: 多个输入到了选择"
@ -204,18 +320,68 @@
"editConfig": "编辑__type__配置", "editConfig": "编辑__type__配置",
"addNewType": "添加新的__type__节点", "addNewType": "添加新的__type__节点",
"nodeProperties": "节点属性", "nodeProperties": "节点属性",
"label": "标签",
"color": "颜色",
"portLabels": "端口标签", "portLabels": "端口标签",
"labelInputs": "输入", "labelInputs": "输入",
"labelOutputs": "输出", "labelOutputs": "输出",
"settingIcon": "图标",
"default": "默认",
"noDefaultLabel": "无", "noDefaultLabel": "无",
"defaultLabel": "使用默认标签", "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": { "errors": {
"scopeChange": "更改范围将使其他流中的节点无法使用" "scopeChange": "更改范围将使其他流中的节点无法使用",
"invalidProperties": "无效的属性:"
} }
}, },
"keyboard": { "keyboard": {
"title": "键盘快捷键", "title": "键盘快捷键",
"keyboard": "键盘",
"filterActions": "筛选动作",
"shortcut": "快捷键",
"scope": "范围",
"unassigned": "未分配", "unassigned": "未分配",
"global": "全局",
"workspace": "工作组",
"selectAll": "选择所有节点", "selectAll": "选择所有节点",
"selectAllConnected": "选择所有连接的节点", "selectAllConnected": "选择所有连接的节点",
"addRemoveNode": "从选择中添加/删除节点", "addRemoveNode": "从选择中添加/删除节点",
@ -226,12 +392,14 @@
"nudgeNode": "移动所选节点(1px)", "nudgeNode": "移动所选节点(1px)",
"moveNode": "移动所选节点(20px)", "moveNode": "移动所选节点(20px)",
"toggleSidebar": "切换侧边栏", "toggleSidebar": "切换侧边栏",
"togglePalette": "切换控制板",
"copyNode": "复制所选节点", "copyNode": "复制所选节点",
"cutNode": "剪切所选节点", "cutNode": "剪切所选节点",
"pasteNode": "粘贴节点", "pasteNode": "粘贴节点",
"undoChange": "撤消上次执行的更改", "undoChange": "撤消上次执行的更改",
"searchBox": "打开搜索框", "searchBox": "打开搜索框",
"managePalette": "管理面板" "managePalette": "管理面板",
"actionList": "动作列表"
}, },
"library": { "library": {
"library": "库", "library": "库",
@ -239,30 +407,42 @@
"saveToLibrary": "保存到库...", "saveToLibrary": "保存到库...",
"typeLibrary": "__type__类型库", "typeLibrary": "__type__类型库",
"unnamedType": "无名__type__", "unnamedType": "无名__type__",
"exportToLibrary": "节点导出到库", "exportedToLibrary": "节点导出到库",
"dialogSaveOverwrite": "一个叫做__libraryName__的__libraryType__已经存在您需要覆盖么", "dialogSaveOverwrite": "一个叫做__libraryName__的__libraryType__已经存在您需要覆盖么",
"invalidFilename": "无效的文件名", "invalidFilename": "无效的文件名",
"savedNodes": "保存的节点", "savedNodes": "保存的节点",
"savedType": "已保存__type__", "savedType": "已保存__type__",
"saveFailed": "保存失败: __message__", "saveFailed": "保存失败: __message__",
"newFolder": "新文件夹",
"types": { "types": {
"local": "本地的",
"examples": "例子" "examples": "例子"
} },
"exportToLibrary": "将节点导出到库"
}, },
"palette": { "palette": {
"noInfo": "无可用信息", "noInfo": "无可用信息",
"filter": "过滤节点", "filter": "过滤节点",
"search": "搜索模块", "search": "搜索模块",
"addCategory": "添加新的...",
"label": { "label": {
"subflows": "子流程", "subflows": "子流程",
"network": "网络",
"common": "共通",
"input": "输入", "input": "输入",
"output": "输出", "output": "输出",
"function": "功能", "function": "功能",
"sequence": "序列",
"parser": "解析",
"social": "社交", "social": "社交",
"storage": "存储", "storage": "存储",
"analysis": "分析", "analysis": "分析",
"advanced": "高级" "advanced": "高级"
}, },
"actions": {
"collapse-all": "收起所有类别",
"expand-all": "展开所有类别"
},
"event": { "event": {
"nodeAdded": "添加到面板中的节点:", "nodeAdded": "添加到面板中的节点:",
"nodeAdded_plural": "添加到面板中的多个节点", "nodeAdded_plural": "添加到面板中的多个节点",
@ -276,6 +456,7 @@
}, },
"editor": { "editor": {
"title": "面板管理", "title": "面板管理",
"palette": "控制板",
"times": { "times": {
"seconds": "秒前", "seconds": "秒前",
"minutes": "分前", "minutes": "分前",
@ -309,6 +490,8 @@
"updated": "已更新", "updated": "已更新",
"install": "安装", "install": "安装",
"installed": "已安装", "installed": "已安装",
"conflict": "冲突",
"conflictTip": "<p>无法安装此模块,因为它包含已安装的<br/>节点类型</p><p>与<code>__module__</code>冲突</p>",
"loading": "加载目录...", "loading": "加载目录...",
"tab-nodes": "节点", "tab-nodes": "节点",
"tab-install": "安装", "tab-install": "安装",
@ -356,6 +539,7 @@
"label": "信息", "label": "信息",
"node": "节点", "node": "节点",
"type": "类型", "type": "类型",
"module": "模组",
"id": "ID", "id": "ID",
"status": "状态", "status": "状态",
"enabled": "启用", "enabled": "启用",
@ -364,17 +548,18 @@
"instances": "实例", "instances": "实例",
"properties": "属性", "properties": "属性",
"info": "信息", "info": "信息",
"desc": "描述",
"blank": "空白", "blank": "空白",
"null": "空", "null": "空",
"showMore": "展开", "showMore": "展开",
"showLess": "收起", "showLess": "收起",
"flow": "流程", "flow": "流程",
"selection":"选择", "selection": "选择",
"nodes":"__count__ 个节点", "nodes": "__count__ 个节点",
"flowDesc": "流程描述", "flowDesc": "流程描述",
"subflowDesc": "子流程描述", "subflowDesc": "子流程描述",
"nodeHelp": "节点帮助", "nodeHelp": "节点帮助",
"none":"无", "none": "无",
"arrayItems": "__count__个项目", "arrayItems": "__count__个项目",
"showTips": "您可以从设置面板启用提示信息" "showTips": "您可以从设置面板启用提示信息"
}, },
@ -386,9 +571,25 @@
"subflows": "子流程", "subflows": "子流程",
"flows": "流程", "flows": "流程",
"filterAll": "所有", "filterAll": "所有",
"showAllConfigNodes": "显示所有配置节点",
"filterUnused": "未使用", "filterUnused": "未使用",
"showAllUnusedConfigNodes": "显示所有未使用的配置节点",
"filtered": "__count__ 个隐藏" "filtered": "__count__ 个隐藏"
}, },
"context": {
"name": "上下文数据",
"label": "上下午",
"none": "未选择",
"refresh": "刷新以加载",
"empty": "空",
"node": "节点",
"flow": "流程",
"global": "全局",
"deleteConfirm": "你确定要删除这个项目吗?",
"autoRefresh": "刷新选择更改",
"refrsh": "刷新",
"delete": "删除"
},
"palette": { "palette": {
"name": "节点管理", "name": "节点管理",
"label": "节点" "label": "节点"
@ -399,8 +600,151 @@
"description": "描述", "description": "描述",
"dependencies": "依赖", "dependencies": "依赖",
"settings": "设置", "settings": "设置",
"noSummaryAvailable": "无可用摘要",
"editDescription": "编辑项目描述", "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": "<p>无法提取远程更改;您未暂存的本地更改将被覆盖。</p><p>请先提交更改,然后重试。</p>",
"showUnstagedChanges": "显示未暂存的更改",
"connectionFailed": "无法连接到远程存储库:",
"pullUnrelatedHistory": "<p>远程有无关的提交历史</p><p>您确定要将这些更改拉入本地仓库吗?</p>",
"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": { "typedInput": {
@ -408,10 +752,12 @@
"str": "文字列", "str": "文字列",
"num": "数字", "num": "数字",
"re": "正则表达式", "re": "正则表达式",
"bool": "布尔", "bool": "布尔",
"json": "JSON", "json": "JSON",
"bin": "二进制流", "bin": "二进制流",
"date": "时间戳" "date": "时间戳",
"jsonata": "表达式",
"env": "环境变量"
} }
}, },
"editableList": { "editableList": {
@ -423,8 +769,10 @@
}, },
"expressionEditor": { "expressionEditor": {
"functions": "功能", "functions": "功能",
"functionReference": "功能reference",
"insert": "插入", "insert": "插入",
"title": "JSONata表达式编辑器", "title": "JSONata表达式编辑器",
"test": "测试",
"data": "示例消息", "data": "示例消息",
"result": "结果", "result": "结果",
"format": "格式表达方法", "format": "格式表达方法",
@ -438,14 +786,228 @@
"eval": "评估表达式错误:\n __message__" "eval": "评估表达式错误:\n __message__"
} }
}, },
"jsEditor": {
"title": "JavaScript编辑器"
},
"textEditor": {
"title": "文本编辑器"
},
"jsonEditor": { "jsonEditor": {
"title": "JSON编辑器", "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": { "bufferEditor": {
"title": "缓冲区编辑器", "title": "缓冲区编辑器",
"modeString": "作为UTF-8字符串处理", "modeString": "作为UTF-8字符串处理",
"modeArray": "作为JSON数组处理", "modeArray": "作为JSON数组处理",
"modeDesc": "<h3>缓冲区编辑器</h3><p>缓冲区类型被存储为字节值的JSON数组。编辑器将尝试将输入的数值解析为JSON数组。如果它不是有效的JSON它将被视为UTF-8字符串并被转换为单个字符代码点的数组。</p><p>例如,<code>Hello World</code>的值会被转换为JSON数组<pre>[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]</pre></p>" "modeDesc": "<h3>缓冲区编辑器</h3><p>缓冲区类型被存储为字节值的JSON数组。编辑器将尝试将输入的数值解析为JSON数组。如果它不是有效的JSON它将被视为UTF-8字符串并被转换为单个字符代码点的数组。</p><p>例如,<code>Hello World</code>的值会被转换为JSON数组<pre>[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]</pre></p>"
},
"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": "<p>您有未部署的更改,这些更改将丢失。</p><p>您要继续吗?</p>"
},
"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": "简体中文"
} }
} }

View File

@ -214,5 +214,53 @@
"$toMillis": { "$toMillis": {
"args": "timestamp", "args": "timestamp",
"desc": "将ISO 8601格式的字符串`timestamp`转换为从UNIX时间 (1970年1月1日 UTC/GMT的午夜开始到现在的毫秒数。如果该字符串的格式不正确则抛出错误。" "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 规范中的fnformat-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应在以下签名中提供函数`functionvalue [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": "返回一个数组,其中重复的值已从`数组`中删除"
} }
} }

View File

@ -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": "<strong>警告</strong>: __message__",
"warnings": {
"undeployedChanges": "節點中存在未部署的更改",
"nodeActionDisabled": "節點動作在子流程中被禁用",
"nodeActionDisabledSubflow": "子流程中禁用了節點操作",
"missing-types": "流程由於缺少節點類型而停止。請檢查日誌的詳細資訊",
"safe-mode": "<p>流程在安全模式下停止。</p><p>您可以修改流程並部署更改以重新啟動。</p>",
"restartRequired": "Node-RED必須重新啟動以啟用升級的模組",
"credentials_load_failed": "<p>流程由於無法解密證書而停止。</p> <p>流程證書文件已加密,但是項目的加密密鑰丟失或無效。</p>",
"credentials_load_failed_reset": "<p>證書無法解密</p><p>流程證書文件已加密,但是項目的加密密鑰丟失或無效。</p><p>流程證書文件將在下一次部署時重置。任何現有的流程證書將被清除。</p>",
"missing_flow_file": "<p>找不到項目流程文件。</p><p>該項目未配置流程文件。</p>",
"missing_package_file": "<p>找不到項目包文件。</p><p>項目缺少package.json文件。</p>",
"project_empty": "<p>該項目為空。</p><p>是否要創建一組默認的項目文件?<br/>否則,您將不得不在編輯器外部手動將文件添加到項目中。</p>",
"project_not_found": "<p>找不到項目的'__project__'</p>",
"git_merge_conflict": "<p>自動合併更改失敗。</p><p>修復未合併的衝突,然後提交結果。</p>"
},
"error": "<strong>Error</strong>: __message__",
"errors": {
"lostConnection": "丟失與伺服器的連接,重新連接...",
"lostConnectionReconnect": "丟失與伺服器的連接__time__秒後重新連接",
"lostConnectionTry": "現在嘗試",
"cannotAddSubflowToItself": "無法向其自身添加子流程",
"cannotAddCircularReference": "無法添加子流程 - 迴圈引用",
"unsupportedVersion": "您正在使用不受支持的Node.js版本<br/>請升級到最新版本的Node.js LTS",
"failedToAppendNode": "<p>加載'__module__'失敗</p><p>__error__</p>"
},
"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": "<p><b>\"__file__\"</b> 已經存在.</p><p>是否要取代?</p>"
},
"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": "已解決<span>__unresolved__</span>中的<span>__resolved__</span>個衝突",
"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": "<strong>無法創建子流程</strong>: 未選擇節點",
"multipleInputsToSelection": "<strong>無法創建子流程</strong>: 多個輸入到了選擇"
},
"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": "<p>無法安裝此模塊,因為它包含已安裝的<br/>節點類型</p><p>與<code>__module__</code>衝突</p>",
"loading": "載入目錄...",
"tab-nodes": "節點",
"tab-install": "安裝",
"sort": "排序:",
"sortAZ": "a-z順序",
"sortRecent": "日期順序",
"more": "增加__count__個",
"errors": {
"catalogLoadFailed": "無法載入節點目錄。<br>查看瀏覽器控制台瞭解更多資訊",
"installFailed": "無法安裝: __module__<br>__message__<br>查看日誌瞭解更多資訊",
"removeFailed": "無法刪除: __module__<br>__message__<br>查看日誌瞭解更多資訊",
"updateFailed": "無法更新: __module__<br>__message__<br>查看日誌瞭解更多資訊",
"enableFailed": "無法啟用: __module__<br>__message__<br>查看日誌瞭解更多資訊",
"disableFailed": "無法禁用: __module__<br>__message__<br>查看日誌瞭解更多資訊"
},
"confirm": {
"install": {
"body": "在安裝之前請閱讀節點的文檔某些節點的依賴關係不能自動解決可能需要重新啟動Node-RED。",
"title": "安裝節點"
},
"remove": {
"body": "刪除節點將從Node-RED卸載它。節點可能會繼續使用資源直到重新啟動Node-RED。",
"title": "刪除節點"
},
"update": {
"body": "更新節點將需要重新啟動Node-RED來完成更新該過程必須由手動完成。",
"title": "更新節點"
},
"cannotUpdate": {
"body": "此節點的更新可用,但不會安裝在面板管理器可以更新的位置。<br/><br/>請參閱有關如何更新此節點的文檔。"
},
"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": "<p>無法提取遠程更改;您未進行的暫存本地更改將被覆蓋。</p><p>提交更改,然後重試。</p>",
"showUnstagedChanges": "顯示未分階段的更改",
"connectionFailed": "無法連接到遠程存儲庫:",
"pullUnrelatedHistory": "<p>遠程服務器具有不相關的提交歷史記錄。</p><p>您確定要將更改保存到本地存儲庫中嗎?</p>",
"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": "<h3>JSONata的相容模式</h3><p> 目前的運算式仍然參考<code>msg</code>,所以將以相容性模式進行評估。請更新運算式,使其不使用<code>msg</code>,因為此模式將在將來刪除。</p><p> 當JSONata支持首次添加到Node-RED時它需要運算式引用<code>msg</code>物件。例如<code>msg.payload</code>將用於訪問有效負載。</p><p> 這樣便不再需要運算式直接針對消息進行評估。要訪問有效負載,運算式應該只是<code>payload</code>.</p>",
"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": "<h3>緩衝區編輯器</h3><p>緩衝區類型被存儲為位元組值的JSON陣列。編輯器將嘗試將輸入的數值解析為JSON陣列。如果它不是有效的JSON它將被視為UTF-8字串並被轉換為單個字元代碼點的陣列。</p><p>例如,<code>Hello World</code>的值會被轉換為JSON陣列<pre>[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]</pre></p>"
},
"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": "<p>您有未部署的更改,這些更改將丟失。</p><p>您要繼續嗎?</p>"
},
"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": "環境變量"
}
}

View File

@ -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}} 來顯示被選中節點的屬性設置畫面。"
}
}

View File

@ -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&lt;object&gt;",
"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`值必須在236之間否則拋出錯誤。"
},
"$toMillis": {
"args": "timestamp",
"desc": "將ISO 8601格式的字串`timestamp`轉換為從UNIX時間 (1970年1月1日 UTC/GMT的午夜開始到現在的毫秒數。如果該字串的格式不正確則拋出錯誤。"
}
}

View File

@ -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() { (function() {
ace.require(["ace/snippets/nrjavascript"], function(m) { ace.require(["ace/snippets/nrjavascript"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) { 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
} }
}); });
})(); })();

View File

@ -334,8 +334,7 @@ RED.deploy = (function() {
var invalidNodes = []; var invalidNodes = [];
RED.nodes.eachNode(function(node) { RED.nodes.eachNode(function(node) {
hasInvalid = hasInvalid || !node.valid; if (!node.valid && !node.d) {
if (!node.valid) {
invalidNodes.push(getNodeInfo(node)); invalidNodes.push(getNodeInfo(node));
} }
if (node.type === "unknown") { if (node.type === "unknown") {
@ -345,6 +344,7 @@ RED.deploy = (function() {
} }
}); });
hasUnknown = unknownNodes.length > 0; hasUnknown = unknownNodes.length > 0;
hasInvalid = invalidNodes.length > 0;
var unusedConfigNodes = []; var unusedConfigNodes = [];
RED.nodes.eachConfig(function(node) { RED.nodes.eachConfig(function(node) {

View File

@ -582,11 +582,12 @@ RED.editor = (function() {
// Add dummy fields to prevent 'Enter' submitting the form in some // Add dummy fields to prevent 'Enter' submitting the form in some
// cases, and also prevent browser auto-fill of password // cases, and also prevent browser auto-fill of password
// Add in reverse order as they are prepended... // - the elements cannot be hidden otherwise Chrome will ignore them.
$('<input type="password" style="display: none;" />').prependTo(dialogForm); // - the elements need to have id's that imply password/username
$('<input type="text" style="display: none;" />').prependTo(dialogForm); $('<div style="position: absolute; top: -2000px;"><input id="red-ui-trap-password" type="password"/></div>').prependTo(dialogForm);
$('<div style="position: absolute; top: -2000px;"><input id="red-ui-trap-username" type="text"/></div>').prependTo(dialogForm);
dialogForm.on("submit", function(e) { e.preventDefault();}); dialogForm.on("submit", function(e) { e.preventDefault();});
dialogForm.find('input').attr("autocomplete","disable"); dialogForm.find('input').attr("autocomplete","off");
return dialogForm; return dialogForm;
} }

View File

@ -106,7 +106,7 @@
options.push({id:"red-ui-editor-type-json-menu-duplicate", icon:"fa fa-copy", label:RED._("jsonEditor.duplicate"),onselect:function(){ options.push({id:"red-ui-editor-type-json-menu-duplicate", icon:"fa fa-copy", label:RED._("jsonEditor.duplicate"),onselect:function(){
var newKey = item.key; var newKey = item.key;
if (item.parent.type === 'array') { if (item.parent.type === 'array') {
newKey = parent.children.length; newKey = item.parent.children.length;
} else { } else {
var m = /^(.*?)(-(\d+))?$/.exec(newKey); var m = /^(.*?)(-(\d+))?$/.exec(newKey);
var usedKeys = {}; var usedKeys = {};

View File

@ -92,8 +92,11 @@ RED.palette = (function() {
var lineHeight = 20; var lineHeight = 20;
var portHeight = 10; var portHeight = 10;
el.attr("data-palette-label",label);
label = RED.utils.sanitize(label); label = RED.utils.sanitize(label);
var words = label.split(/[ -]/); var words = label.split(/[ -]/);
var displayLines = []; var displayLines = [];
@ -469,7 +472,7 @@ RED.palette = (function() {
function filterChange(val) { function filterChange(val) {
var re = new RegExp(val.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'),'i'); var re = new RegExp(val.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'),'i');
$("#red-ui-palette-container .red-ui-palette-node").each(function(i,el) { $("#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"); var type = $(el).attr("data-palette-type");
if (val === "" || re.test(type) || re.test(currentLabel)) { if (val === "" || re.test(type) || re.test(currentLabel)) {
$(this).show(); $(this).show();

View File

@ -336,7 +336,7 @@ RED.sidebar.versionControl = (function() {
var unstagedContent = $('<div class="red-ui-sidebar-vc-change-container"></div>').appendTo(localChanges.content); var unstagedContent = $('<div class="red-ui-sidebar-vc-change-container"></div>').appendTo(localChanges.content);
var header = $('<div class="red-ui-sidebar-vc-change-header">'+RED._("sidebar.project.versionControl.localFiles")+'</div>').appendTo(unstagedContent); var header = $('<div class="red-ui-sidebar-vc-change-header">'+RED._("sidebar.project.versionControl.localFiles")+'</div>').appendTo(unstagedContent);
stageAllButton = $('<button class="red-ui-button red-ui-button-small" style="float: right"><i class="fa fa-plus"></i> '+RED._("sidebar.project.versionControl.all")+'</button>') stageAllButton = $('<button class="red-ui-button red-ui-button-small" style="position: absolute; right: 5px; top: 5px;"><i class="fa fa-plus"></i> '+RED._("sidebar.project.versionControl.all")+'</button>')
.appendTo(header) .appendTo(header)
.on("click", function(evt) { .on("click", function(evt) {
evt.preventDefault(); evt.preventDefault();
@ -368,7 +368,7 @@ RED.sidebar.versionControl = (function() {
unmergedContent = $('<div class="red-ui-sidebar-vc-change-container"></div>').appendTo(localChanges.content); unmergedContent = $('<div class="red-ui-sidebar-vc-change-container"></div>').appendTo(localChanges.content);
header = $('<div class="red-ui-sidebar-vc-change-header">'+RED._("sidebar.project.versionControl.unmergedChanges")+'</div>').appendTo(unmergedContent); header = $('<div class="red-ui-sidebar-vc-change-header">'+RED._("sidebar.project.versionControl.unmergedChanges")+'</div>').appendTo(unmergedContent);
bg = $('<div style="float: right"></div>').appendTo(header); bg = $('<div style="position: absolute; right: 5px; top: 5px;"></div>').appendTo(header);
var abortMergeButton = $('<button class="red-ui-button red-ui-button-small" style="margin-right: 5px;">'+RED._("sidebar.project.versionControl.abortMerge")+'</button>') var abortMergeButton = $('<button class="red-ui-button red-ui-button-small" style="margin-right: 5px;">'+RED._("sidebar.project.versionControl.abortMerge")+'</button>')
.appendTo(bg) .appendTo(bg)
.on("click", function(evt) { .on("click", function(evt) {
@ -433,7 +433,7 @@ RED.sidebar.versionControl = (function() {
header = $('<div class="red-ui-sidebar-vc-change-header">'+RED._("sidebar.project.versionControl.changeToCommit")+'</div>').appendTo(stagedContent); header = $('<div class="red-ui-sidebar-vc-change-header">'+RED._("sidebar.project.versionControl.changeToCommit")+'</div>').appendTo(stagedContent);
bg = $('<div style="float: right"></div>').appendTo(header); bg = $('<div style="position: absolute; right: 5px; top: 5px;"></div>').appendTo(header);
var showCommitBox = function() { var showCommitBox = function() {
commitMessage.val(""); commitMessage.val("");
submitCommitButton.prop("disabled",true); submitCommitButton.prop("disabled",true);

View File

@ -160,6 +160,7 @@
.red-ui-debug-msg-element { .red-ui-debug-msg-element {
color: $debug-message-text-color; color: $debug-message-text-color;
line-height: 1.3em; line-height: 1.3em;
overflow-wrap: break-word;
} }
.red-ui-debug-msg-object-key { .red-ui-debug-msg-object-key {
color: $debug-message-text-color-object-key; color: $debug-message-text-color-object-key;

View File

@ -27,9 +27,22 @@
display: none; 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 { .red-ui-sidebar-context-property {
overflow-wrap: break-word;
position: relative; position: relative;
.red-ui-debug-msg-tools { .red-ui-debug-msg-tools {
right: 0px; right: 0px;

View File

@ -171,6 +171,7 @@
'$sum':{ args:[ 'array' ]}, '$sum':{ args:[ 'array' ]},
'$toMillis':{args:['timestamp']}, // <------------- '$toMillis':{args:['timestamp']}, // <-------------
'$trim':{ args:[ 'str' ]}, '$trim':{ args:[ 'str' ]},
'$type':{ args:['value']},
'$uppercase':{ args:[ 'str' ]}, '$uppercase':{ args:[ 'str' ]},
'$zip':{ args:[ 'array1' ]} '$zip':{ args:[ 'array1' ]}
} }

View File

@ -22,6 +22,7 @@
<option value="POST">POST</option> <option value="POST">POST</option>
<option value="PUT">PUT</option> <option value="PUT">PUT</option>
<option value="DELETE">DELETE</option> <option value="DELETE">DELETE</option>
<option value="HEAD">HEAD</option>
<option value="use" data-i18n="httpin.setby"></option> <option value="use" data-i18n="httpin.setby"></option>
</select> </select>
</div> </div>

View File

@ -1,7 +1,7 @@
<script type="text/html" data-template-name="html"> <script type="text/html" data-template-name="html">
<div class="form-row"> <div class="form-row">
<label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="node-red:common.label.property"></span></label> <label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="common.label.property"></span></label>
<input type="text" id="node-input-property" style="width:70%"> <input type="text" id="node-input-property" style="width:70%">
</div> </div>
<div class="form-row"> <div class="form-row">

View File

@ -1,7 +1,7 @@
<script type="text/html" data-template-name="xml"> <script type="text/html" data-template-name="xml">
<div class="form-row"> <div class="form-row">
<label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="node-red:common.label.property"></span></label> <label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="common.label.property"></span></label>
<input type="text" id="node-input-property" style="width:70%;"/> <input type="text" id="node-input-property" style="width:70%;"/>
</div> </div>
<div class="form-row"> <div class="form-row">

View File

@ -1,7 +1,7 @@
<script type="text/html" data-template-name="yaml"> <script type="text/html" data-template-name="yaml">
<div class="form-row"> <div class="form-row">
<label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="node-red:common.label.property"></span></label> <label for="node-input-property"><i class="fa fa-ellipsis-h"></i> <span data-i18n="common.label.property"></span></label>
<input type="text" id="node-input-property" style="width:70%;"/> <input type="text" id="node-input-property" style="width:70%;"/>
</div> </div>
<div class="form-row"> <div class="form-row">

View File

@ -53,8 +53,8 @@
</div> </div>
<div class="form-row"> <div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="node-red:common.label.name"></span></label> <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
<input type="text" id="node-input-name" data-i18n="[placeholder]node-red:common.label.name"> <input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
</div> </div>
</script> </script>

View File

@ -60,8 +60,8 @@
</div> </div>
<div class="form-row"> <div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="node-red:common.label.name"></span></label> <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label>
<input type="text" id="node-input-name" data-i18n="[placeholder]node-red:common.label.name"> <input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">
</div> </div>
</script> </script>

View File

@ -0,0 +1,34 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="inject">
<p>手动或定期得将消息注入流中。消息的有效荷载可以为多种类型包括字符串JavaScript对象或当前时间。</p>
<h3>输出</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">various</span></dt>
<dd>指定的消息的有效荷载。</dd>
<dt class="optional">topic <span class="property-type">字符串</span></dt>
<dd>可以在节点中配置的可选属性。</dd>
</dl>
<h3>详细</h3>
<p>通过使用特定的有效荷载注入节点可以启动流。默认有效荷载是当前时间的时间戳以毫秒为单位自1970年1月1日起</p>
<p>该节点还支持注入字符串数字布尔值JavaScript对象或流/全局上下文值。</p>
<p>默认情况下,节点可以通过在编辑器中单击节点按钮来手动触发。同时也可以被设置为定期或按计划注入。</p>
<p>另一个可选的设置是在每次启动流时注入一次。</p>
<p>可以指定的最大<i>间隔</i>约为596小时/24天。 但是如果对于间隔超过一天的那些间隔建议您使用scheduler节点来应对断电或重启。</p>
<p><b>注意</b>:选项<i>“时间间隔” </i><i>“特定时间” </i>使用了标准cron系统。这意味着因此“20分钟”并不表示在此之后20分钟而是每小时的20分钟40分钟。如果您希望设定为从现在开始的每20分钟那么请使用<i>“间隔” </i>选项。</p>
<p><b>注意</b>: 如果您想在字符串中包含换行符,必须使用“功能”节点创建有效荷载。</p>
</script>

View File

@ -0,0 +1,25 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="debug">
<p>在“调试”侧边栏选项卡和运行时日志中显示选定的消息属性。 默认情况下,它会显示<code>msg.payload</code>的值但您也可以将其设置成显示任意属性完整消息或JSONata表达式的结果。</p>
<h3>详细</h3>
<p>调试侧边栏会提供已发消息的结构化视图,方便您查询消息的结构。</p>
<p>JavaScript对象和数组可以根据需要来折叠或扩展。缓冲区对象可以显示为原始数据也可以显示为字符串。</p>
<p>对任意条消息调试侧边栏还会显示接收消息的时间发送消息的节点以及消息类型等信息。单击源节点ID将在工作区中显示该节点。</p>
<p>节点上的按钮可用于启用或禁用其输出。建议禁用或删除所有未使用的调试节点。</p>
<p>还可以通过配置节点将所有消息发送到运行时的日志或将简短的数据32个字符内在调试节点下的状态文本上显示。</p>
</script>

View File

@ -0,0 +1,24 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="complete">
<p>当另一个节点完成对消息的处理时触发流。</p>
<h3>详细</h3>
<p>如果一个节点通知运行时它已完成消息的处理,该节点可用于触发第二个流。</p>
<p>这个节点可以与没有输出端口的节点一起使用,例如在使用电子邮件发送节点来发送邮件后触发一个流。</p>
<p>此节点只能被设置为处理流中某个所选节点的事件。与Catch节点不同您不能指定“所有节点”模式并以流中的所有节点为目标。</p>
<p>并非所有节点都会触发此事件。这取决于它们是否支持于Node-RED 1.0中引入的此功能。</p>
</script>

View File

@ -0,0 +1,36 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="catch">
<p>捕获由同一标签页上的节点引发的错误。</p>
<h3>输出</h3>
<dl class="message-properties">
<dt>error.message <span class="property-type">字符串</span></dt>
<dd>错误消息。</dd>
<dt>error.source.id <span class="property-type">字符串</span></dt>
<dd>引发错误的节点的ID。</dd>
<dt>error.source.type <span class="property-type">字符串</span></dt>
<dd>引发错误的节点的类型。</dd>
<dt>error.source.name <span class="property-type">字符串</span></dt>
<dd>引发错误的节点的名称。(如果已设置)</dd>
</dl>
<h3>详细</h3>
<p>如果节点在处理消息时抛出错误,则流程通常会停止。该节点可用于捕获那些错误并通过专用流程进行处理。</p>
<p>默认情况下,该节点将捕获同一标签页上任何节点抛出的错误。或者,它可以针对特定节点,或配置为仅捕获另一个“目标”捕获节点尚未捕获的错误。</p>
<p>当错误发生时所有匹配的catch节点都会收到错误消息。</p>
<p>如果在子流中发送了错误,则该错误将由子流中的任意捕获节点处理。如果子流中不存在捕获节点,则那错误将被传播到子流实例所在的标签页。</p>
<p>如果消息已经具有<code>error</code>属性,则将该<code>error</code>复制为<code>_error</code></p>
</script>

View File

@ -0,0 +1,33 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="status">
<p>获取在同一标签页上的其他节点的状态消息。</p>
<h3>输出</h3>
<dl class="message-properties">
<dt>status.text <span class="property-type">字符串</span></dt>
<dd>状态文本。</dd>
<dt>status.source.type <span class="property-type">字符串</span></dt>
<dd>报告状态的节点的类型。</dd>
<dt>status.source.id <span class="property-type">字符串</span></dt>
<dd>报告状态的节点的ID。</dd>
<dt>status.source.name <span class="property-type">字符串</span></dt>
<dd>报告状态的节点的名称(如果已设置)。</dd>
</dl>
<h3>详细</h3>
<p>该节点不包含<code>有效荷载</code></p>
<p>默认情况下,节点会获取同一工作空间标签页上报告所有节点的状态。可以通过配置来设定目标节点。</p>
</script>

View File

@ -0,0 +1,31 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="link in">
<p>在流之间创建虚拟连线。</p>
<h3>详细</h3>
<p>该节点可以连接到任何标签页上存在的任何<code>link out</code>节点。连接后,它们的行为就像连接在一起。</p>
<p>仅当选择链接节点时,才会显示链接节点之间的链接。如果有指向另一个选项卡的链接,则显示一个虚拟节点。单击该虚拟节点将带您到相应的选项卡。</p>
<p><b>注意:</b>无法创建进入或离开子流的链接。</p>
</script>
<script type="text/x-red" data-help-name="link out">
<p>在流之间创建虚拟连线。</p>
<h3>详细</h3>
<p>该节点可以连接到任何标签页上存在的任何<code>link in</code>节点。连接后,它们的行为就像连接在一起。</p>
<p>仅当选择链接节点时,才会显示链接节点之间的链接。如果有指向另一个选项卡的链接,则显示一个虚拟节点。单击该虚拟节点将带您到相应的选项卡。</p>
<p><b>注意:</b>无法创建进入或离开子流的链接。</p>
</script>

View File

@ -0,0 +1,21 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="comment">
<p>可用于向流添加注释的节点。</p>
<h3>详细</h3>
<p>编辑面板接受Markdown语法。输入的文本将在信息侧面板中显示。</p>
</script>

View File

@ -0,0 +1,24 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="unknown">
<p>您安装的Node-RED无法识别该节点的类型。</p>
<h3>详细</h3>
<p><i>如果在此状态下部署节点,其配置会被保存。但是在安装缺少的类型之前,流不会开始。</i></p>
<p>使用<code> Menu-Manage Palette </code>选项来搜索并安装节点,或者使用<b>npm install &lt;module&gt;</b>来安装所有缺少的节点并重新启动Node-Red来导入这些节点。</p>
<p>另一种可能是您已经安装了此节点类型但是缺少必须的依赖项。您应检查Node-RED的启动日志中是否有与缺少节点有关的错误消息。</p>
<p>以上方法都不适用时,您可以联系该流的作者以获取缺少的节点类型的副本。</p>
</script>

View File

@ -0,0 +1,51 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="function">
<p>定义对接收到的消息进行处理的JavaScript代码函数的主体</p>
<p>输入消息在名为<code>msg</code>的JavaScript对象中传递。</p>
<p>通常,<code>msg</code>对象将消息正文保留在<code>msg.payload</code>属性中。</p>
<p>该函数一般会返回一个消息对象(或多个消息对象),但也可以为了停止流而什么都不返回。</p>
<h3>详细</h3>
<p>请参见<a target="_blank" href="http://nodered.org/docs/writing-functions.html">在线文档</a>来获得更多有关编写函数的信息。</p>
<h4>传送消息</h4>
<p>要将消息传递到流中的下一个节点,请返回消息或调用<code>node.send(messages)</code></p>
<p>它将返回/send:</p>
<ul>
<li>单个消息对象 - 传递给连接到第一个输出的节点</li>
<li>消息对象数组,传递给连接到相应输出的节点</li>
</ul>
<p>如果数组元素是数组,则将多个消息发送到相应的输出。</p>
<p>无论return方法是单个值还是数组元素如果返回值为null则不会发送任何消息。</p>
<h4>日志输出和错误处理</h4>
<p>使用以下功能输出日志信息和输出错误:</p>
<ul>
<li><code>node.log("Log message")</code></li>
<li><code>node.warn("Warning")</code></li>
<li><code>node.error("Error")</code></li>
</ul>
</p>
<p>使用catch节点可以进行错误处理。 要由catch节点处理请将<code>msg</code>作为<code>node.error</code>的第二个参数传递:</p>
<pre>node.error("Error",msg);</pre>
<h4>访问节点信息</h4>
<p>您可以使用以下属性来在代码中引用节点ID和名称</p>
<ul>
<li><code>node.id</code> - 节点的ID</li>
<li><code>node.name</code> - 节点的名称</li>
</ul>
<h4>使用环境变量</h4>
<p>环境变量可以通过<code>env.get("MY_ENV_VAR")</code>来进行访问。</p>
</script>

View File

@ -0,0 +1,37 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="switch">
<p>按属性值来分配消息的传送路线。</p>
<h3>详细</h3>
<p>根据接收到的消息评估指定的规则,然后将消息发送到与匹配的规则相对应的输出端口。</p>
<p>可以将节点设置为一旦发现一个匹配的规则,则停止后续的匹配。</p>
<p>对于评估规则,可以使用消息属性,流上下文/全局上下文属性环境变量和JSONata表达式的评估结果。</p>
<h4>规则</h4>
<p>有四种规则:</p>
<ol>
<li><b></b>根据配置的属性评估规则</li>
<li><b>顺序</b>可用于消息序列的规则,例如由“拆分”节点生成的规则</li>
<li><b>JSONata表达式</b>评估整个消息,如果结果为真,则匹配。</li>
<li><b>其他</b>上述规则都不匹配时适用</li>
</ol>
<h4>注释</h4>
<p><code>is true/false</code><code>is null</code> 规则将对类型进行严格的匹配。匹配之前的类型转化不会发生。</p>
<p><code>is empty</code>规则与零字节的字符串,数组,缓冲区或没有属性的对象相匹配。与<code>null</code>或者<code>undefined</code>等不匹配。</p>
<h4>处理消息序列</h4>
<p>默认情况下,节点不会修改<code>msg.parts</code>属性。</p>
<p>可以启用<b>重建消息序列</b>选项来为每条匹配的规则生成新的消息序列。在这种模式下,节点将在发送新序列之前对整个传入序列进行缓存。运行时的设定<code>nodeMessageBufferMaxLength</code>可以用来限制可缓存的消息数目。</p>
</script>

View File

@ -0,0 +1,33 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="change">
<p>设置,更改,删除或移动消息,流上下文或全局上下文的属性。</p>
<p>如果指定了多个规则,则将按定义的顺序来应用它们。</p>
<h3>详细</h3>
<p>可用的操作有:</p>
<dl class="message-properties">
<dt>设置</dt>
<dd>设置一个属性。该值可以是多种不同类型,也可以从现有消息或上下文属性中获取。</dd>
<dt>置换</dt>
<dd>搜索并替换属性。 如果启用了正则表达式则可以为“replace with”属性指定捕获组例如<code>$1</code>。 在替换过程中,仅当规则完全匹配时才能更改属性类型。</dd>
<dt>删除</dt>
<dd>删除一个属性</dd>
<dt>移动</dt>
<dd>移动或者重命名一个属性</dd>
</dl>
<p>类型"expression"使用<a href="http://jsonata.org/" target="_new">JSONata</a>语言。</p>
</script>

View File

@ -0,0 +1,40 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="range">
<p>将数值映射为另一个区间的数值</p>
<h3>输入</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">数值</span></dt>
<dd>有效荷载<i>一定</i>得是一个数值. 否则则会映射失败。</dd>
</dl>
<h3>输出</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">数值</span></dt>
<dd>被映射到新区间的数值。</dd>
</dl>
<h3>详细</h3>
<p>该节点将线性缩放所接收到的数值。在默认情况下,结果不限于节点中定义的范围。</p>
<p><i>缩放并限制到目标范围</i>表示结果永远不会超出目标范围内指定的范围。</p>
<p><i>在目标范围内缩放并折叠</i>表示结果将会被限制(折叠)在目标范围内。</p>
<p>例如输入0-10映射到0-100。</p>
<table style="outline-width:#888 solid thin">
<tr><th width="80px">模式</th><th width="80px">输入</th><th width="80px">输出</th></tr>
<tr><td><center>scale</center></td><td><center>12</center></td><td><center>120</center></td></tr>
<tr><td><center>limit</center></td><td><center>12</center></td><td><center>100</center></td></tr>
<tr><td><center>wrap</center></td><td><center>12</center></td><td><center>20</center></td></tr>
</table>
</script>

View File

@ -0,0 +1,46 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="template">
<p>根据提供的模板设置属性。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt>msg <span class="property-type">object</span></dt>
<dd>一个msg对象其中包含着用于填充模板的信息。</dd>
<dt class="optional">template <span class="property-type">string</span></dt>
<dd><code>msg.payload</code>填充的模板。如果未在编辑面板中配置则可以将设为msg的属性。</dd>
</dl>
<h3>Outputs</h3>
<dl class="message-properties">
<dt>msg <span class="property-type">object</span></dt>
<dd>由来自传入msg的属性来填充已配置的模板后输出的带有属性的msg。</dd>
</dl>
<h3>详细</h3>
<p>默认情况下使用<i><a href="http://mustache.github.io/mustache.5.html" target="_blank">mustache</a></i>格式。如有需要也可以切换其他格式。</p>
<p>例如:
<pre>Hello {{payload.name}}. Today is {{date}}</pre>
<p>receives a message containing:
<pre>{
date: "Monday",
payload: {
name: "Fred"
}
}</pre>
<p>输出的消息将会是:
<pre>Hello Fred. Today is Monday</pre>
<p>也可以使用流上下文或全局上下文中的属性:<code>{{flow.name}}</code>或者<code>{{global.name}}</code>,或者为了持久储存<code>store</code>,可以使用<code>{{flow[store].name}}</code><code>{{global[store].name}}</code>
<p><b>注意:</b>默认情况下,<i>mustache</i>将在其替换的值中转义任何非字母数字或HTML实体。为了防止这种情况请使用<code>{{{triple}}}</code>大括号。
</script>

View File

@ -0,0 +1,32 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="delay">
<p>对通过节点的消息进行延迟发送或限制。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt class="optional">delay <span class="property-type">数值</span></dt>
<dd>设置要应用于消息的延迟(以毫秒为单位)。仅当节点配置为允许消息去覆盖配置的默认延迟间隔时,此选项才适用。</dd>
<dt class="optional">reset</dt>
<dd>如果接收到的消息将此属性设置为任何值,则将清空该节点保留的所有的未发送消息。</dd>
<dt class="optional">flush</dt>
<dd>如果接收到的消息的此属性设置为任何值,则将立即发送该节点保留的所有未发送消息。</dd>
</dl>
<h3>详细</h3>
<p>当配置为延迟发送消息时,延迟间隔可以是一个固定值,一个范围内的随机值或为每个消息动态设置。</p>
<p>当配置为对消息进行限制时,它们的传递将分散在配置的时间段内。状态显示队列中当前的消息数。可以选择在中间消息到达时丢弃它们。</p>
<p>速率限制可以应用于所有消息,也可以根据<code>msg.topic</code>的值来进行分组。分组时,中间消息将会被自动删除。在每个时间间隔,节点可以释放所有主题的最新消息,或释放下一个主题的最新消息。</p>
</script>

View File

@ -0,0 +1,33 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="trigger">
<p>触发后,将会发送一条消息。如果被拓展或重置,则可以选择发送第二条消息。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt class="optional">reset</dt>
<dd>如果收到带有此属性的消息,则将清除当前正在进行的任何超时或重复,且不会触发任何消息。</dd>
</dl>
<h3>详细</h3>
<p>该节点可用于在流中创建一个超时。 默认情况下,当它收到一条消息时,它将发送一条带有<code>1</code>的有效荷载的消息。然后它将等待250毫秒再发送第二条消息其有效荷载为<code>0</code>。这可以用于使连接到Raspberry Pi GPIO引脚的LED闪烁等例子上。</p>
<p>可以将发送的每个消息的有效荷载配置为各种值,包括不发送任何内容的选项。例如,将初始消息设置为<i>nothing</i>,然后选择将计时器与每个收到的消息一起扩展的选项,则该节点将充当看门狗计时器;仅在设置的间隔内未收到任何消息时才发送消息。</p>
<p>如果设置为<i>字符串</i>类型,则该节点支持<i>mustache</i>模板语法。</p>
<p>如果节点收到具有<code>reset</code>属性或与节点中配置的匹配的<code>有效荷载</code>的消息,则将清除当前正在进行的任何超时或重复,并且不会触发任何消息。</p>
<p>可以将节点配置为以固定的时间间隔重新发送消息,直到被收到的消息重置为止。</p>
<p>(可选)可以将节点配置为将带有<code>msg.topic</code>的消息视为独立的流。</p>
</script>

View File

@ -0,0 +1,74 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="exec">
<p>运行系统命令并返回其输出。</p>
<p>可以将节点配置为等待命令完成,或者在命令生成时发送其输出。</p>
<p>运行的命令可以在节点中配置,也可以由收到的消息提供。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt class="optional">payload <span class="property-type">字符串</span></dt>
<dd>如果这样配置,则将被附加到执行命令中。</dd>
<dt class="optional">kill <span class="property-type">字符串</span></dt>
<dd>指定发送到现有的exec节点进程的kill信号类型。</dd>
<dt class="optional">pid <span class="property-type">数值|字符串</span></dt>
<dd>要杀死的现有exec节点进程的进程ID</dd>
</dl>
<h3>输出</h3>
<ol class="node-ports">
<li>标准输出(stdout)
<dl class="message-properties">
<dt>payload <span class="property-type">字符串</span></dt>
<dd>命令的标准输出。</dd>
</dl>
<dl class="message-properties">
<dt>rc <span class="property-type">object</span></dt>
<dd>仅执行模式一个返回代码对象的副本在端口3上也可用</dd>
</dl>
</li>
<li>标准error输出(stderr)
<dl class="message-properties">
<dt>payload <span class="property-type">字符串</span></dt>
<dd>命令的标准错误输出。</dd>
</dl>
<dl class="message-properties">
<dt>rc <span class="property-type">object</span></dt>
<dd>仅执行模式一个返回代码对象的副本在端口3上也可用</dd>
</dl>
</li>
<li>返回代码
<dl class="message-properties">
<dt>payload <span class="property-type">object</span></dt>
<dd>一个包含返回代码以及<code>message</code><code>signal</code>属性的对象。</dd>
</dl>
</li>
</ol>
<h3>详细</h3>
<p>默认情况下,使用<code>exec</code>系统调用来调用命令,等待命令完成,然后返回输出。例如,成功的命令的返回码应为<code>{code0}</code></p>
<p>(可选)可以选择使用<code>spawn</code>代替它会在命令运行时从stdout和stderr返回输出通常一次一行。完成后它将在第三个端口上返回一个对象。例如成功的命令应返回<code>{code0}</code></p>
<p>错误可能会在第三个端口<code>msg.payload</code>上返回额外的信息,例如<code>message</code>字符串,<code>signal</code>字符串。</p>
<p>运行的命令是在节点内定义的,带有附加<code>msg.payload</code>的选项和另外一组参数。</p>
<p>带空格的命令或参数应该用引号引起来:<code>“这是一个参数”</code></p>
<p>返回的<code>有效荷载</code>通常是<i>字符串</i>类型除非检测到非UTF8字符在这种情况下它会是<i>buffer</i>类型。</p>
<p>节点处于活动状态时该节点的状态图标和PID将可见。对此更改可以通过<code>Status</code>节点读取。</p>
<h4>杀死进程</h4>
<p>发送<code>msg.kill</code>将杀死一个活动进程。<code>msg.kill</code>应该是包含要发送的信号类型的字符串,例如<code>SIGINT</code><code>SIGQUIT</code><code>SIGHUP</code>。如果设置为空字符串,则默认为<code>SIGTERM</code></p>
<p>如果节点有多个进程在运行,则还必须设置<code>msg.pid</code>并设置要杀死的PID的值。</p>
<p>如果<code>超时</code>字段提供了一个值,则如果在指定的秒数过去后进程尚未完成,则该进程将自动终止。</p>
<p>提示如果运行Python应用程序则可能需要使用<code>-u</code>参数来停止对输出进行缓存。</p>
</script>

View File

@ -6,7 +6,9 @@
"name": "名称", "name": "名称",
"username": "用户名", "username": "用户名",
"password": "密码", "password": "密码",
"property": "属性" "property": "属性",
"selectNodes": "选择节点...",
"expand": "扩展"
}, },
"status": { "status": {
"connected": "已连接", "connected": "已连接",
@ -35,7 +37,22 @@
"stopped": "停止", "stopped": "停止",
"failed": "注入失败: __error__", "failed": "注入失败: __error__",
"label": { "label": {
"repeat": "重复" "repeat": "重复",
"flow": "流上下午",
"global": "全局上下文",
"str": "字符串",
"num": "数值",
"bool": "布尔值",
"json": "JSON对象",
"bin": "buffer",
"date": "时间戳",
"env": "环境变量",
"object": "对象",
"string": "字符串",
"boolean": "布尔值",
"number": "数值",
"Array": "数组",
"invalid": "无效的JSON对象"
}, },
"timestamp": "时间戳", "timestamp": "时间戳",
"none": "无", "none": "无",
@ -70,15 +87,13 @@
} }
}, },
"catch": { "catch": {
"catch": "监测所有节点", "catch": "捕获:所有节点",
"catchNodes": "监测__number__个节点", "catchNodes": "捕获__number__个节点",
"catchUncaught": "捕获:未捕获",
"label": { "label": {
"source": "监测范围", "source": "捕获范围",
"node": "节点",
"type": "类型",
"selectAll": "全选", "selectAll": "全选",
"sortByLabel": "按名称排序", "uncaught": "忽略其他捕获节点处理的错误"
"sortByType": "按类型排序"
}, },
"scope": { "scope": {
"all": "所有节点", "all": "所有节点",
@ -90,10 +105,6 @@
"statusNodes": "报告__number__个节点状态", "statusNodes": "报告__number__个节点状态",
"label": { "label": {
"source": "报告状态范围", "source": "报告状态范围",
"node": "节点",
"type": "类型",
"selectAll": "全选",
"sortByLabel": "按名称排序",
"sortByType": "按类型排序" "sortByType": "按类型排序"
}, },
"scope": { "scope": {
@ -101,8 +112,13 @@
"selected": "指定节点" "selected": "指定节点"
} }
}, },
"complete": {
"completeNodes": "完成: __number__个节点"
},
"debug": { "debug": {
"output": "输出", "output": "输出",
"none": "None",
"invalid-exp": "无效的JSONata表达式: __error__",
"msgprop": "信息属性", "msgprop": "信息属性",
"msgobj": "完整信息", "msgobj": "完整信息",
"to": "目标", "to": "目标",
@ -124,7 +140,11 @@
"filterCurrent": "当前流程", "filterCurrent": "当前流程",
"debugNodes": "调试节点", "debugNodes": "调试节点",
"clearLog": "清空日志", "clearLog": "清空日志",
"openWindow": "在新窗口打开" "filterLog": "过滤日志",
"openWindow": "在新窗口打开",
"copyPath": "复制路径",
"copyPayload": "复制值",
"pinPath": "固定展开"
}, },
"messageMenu": { "messageMenu": {
"collapseAll": "折叠所有路径", "collapseAll": "折叠所有路径",
@ -146,26 +166,33 @@
"key": "私钥", "key": "私钥",
"passphrase": "密码", "passphrase": "密码",
"ca": "CA证书", "ca": "CA证书",
"verify-server-cert":"验证服务器证书" "verify-server-cert":"验证服务器证书",
"servername": "服务器名"
}, },
"placeholder": { "placeholder": {
"cert":"证书路径 (PEM 格式)", "cert":"证书路径 (PEM 格式)",
"key":"私钥路径 (PEM 格式)", "key":"私钥路径 (PEM 格式)",
"ca":"CA证书路径 (PEM 格式)", "ca":"CA证书路径 (PEM 格式)",
"passphrase":"私钥密码 (可选)" "passphrase":"私钥密码 (可选)",
"servername":"用于SNI"
}, },
"error": { "error": {
"missing-file": "未提供证书/密钥文件" "missing-file": "未提供证书/密钥文件"
} }
}, },
"exec": { "exec": {
"exec": "exec",
"spawn": "spawn",
"label": { "label": {
"command": "命令", "command": "命令",
"append": "追加", "append": "追加",
"timeout": "超时", "timeout": "超时",
"timeoutplace": "可选填", "timeoutplace": "可选填",
"return": "输出", "return": "输出",
"seconds": "秒" "seconds": "秒",
"stdout": "标准输出",
"stderr": "标准错误输出",
"retcode": "返回码"
}, },
"placeholder": { "placeholder": {
"extraparams": "额外的输入参数" "extraparams": "额外的输入参数"
@ -177,6 +204,7 @@
"oldrc": "使用旧式输出 (兼容模式)" "oldrc": "使用旧式输出 (兼容模式)"
}, },
"function": { "function": {
"function": "函数",
"label": { "label": {
"function": "函数", "function": "函数",
"outputs": "输出" "outputs": "输出"
@ -187,6 +215,7 @@
} }
}, },
"template": { "template": {
"template": "模板",
"label": { "label": {
"template": "模版", "template": "模版",
"property": "属性", "property": "属性",
@ -199,7 +228,7 @@
"yaml": "YAML", "yaml": "YAML",
"none": "无" "none": "无"
}, },
"templatevalue": "This is the payload: {{payload}} !" "templatevalue": "这是有效载荷: {{payload}} !"
}, },
"delay": { "delay": {
"action": "行为设置", "action": "行为设置",
@ -272,6 +301,9 @@
"wait-reset": "等待被重置", "wait-reset": "等待被重置",
"wait-for": "等待", "wait-for": "等待",
"wait-loop": "周期性重发", "wait-loop": "周期性重发",
"for": "处理",
"bytopics": "每个msg.topic",
"alltopics": "所有消息",
"duration": { "duration": {
"ms": "毫秒", "ms": "毫秒",
"s": "秒", "s": "秒",
@ -290,6 +322,7 @@
} }
}, },
"comment": { "comment": {
"comment": "注释"
}, },
"unknown": { "unknown": {
"label": { "label": {
@ -300,9 +333,10 @@
"mqtt": { "mqtt": {
"label": { "label": {
"broker": "服务端", "broker": "服务端",
"example": "e.g. localhost", "example": "比如:本地主机",
"output": "输出", "output": "输出",
"qos": "QoS", "qos": "QoS",
"retain": "保持",
"clientid": "客户端ID", "clientid": "客户端ID",
"port": "端口", "port": "端口",
"keepalive": "Keepalive计时(秒)", "keepalive": "Keepalive计时(秒)",
@ -312,17 +346,22 @@
"verify-server-cert":"验证服务器证书", "verify-server-cert":"验证服务器证书",
"compatmode": "使用旧式MQTT 3.1支持" "compatmode": "使用旧式MQTT 3.1支持"
}, },
"sections-label":{
"birth-message": "连接时发送的消息(出生消息)",
"will-message":"意外断开连接时的发送消息Will消息",
"close-message":"断开连接前发送的消息(关闭消息)"
},
"tabs-label": { "tabs-label": {
"connection": "连接", "connection": "连接",
"security": "安全", "security": "安全",
"will": "Will信息", "messages": "消息"
"birth": "Birth信息"
}, },
"placeholder": { "placeholder": {
"clientid": "留白则自动生成", "clientid": "留白则自动生成",
"clientid-nonclean":"如非新会话必须设置客户端ID", "clientid-nonclean":"如非新会话必须设置客户端ID",
"will-topic": "留白将禁止Will信息", "will-topic": "留白将禁止Will信息",
"birth-topic": "留白将禁止Birth信息" "birth-topic": "留白将禁止Birth信息",
"close-topic": "留白以禁用关闭消息"
}, },
"state": { "state": {
"connected": "已连接到服务端: __broker__", "connected": "已连接到服务端: __broker__",
@ -333,7 +372,9 @@
"output": { "output": {
"buffer": "Buffer", "buffer": "Buffer",
"string": "字符串", "string": "字符串",
"base64": "Base64编码字符串" "base64": "Base64编码字符串",
"auto": "自动检测 (字符串或buffer)",
"json": "解析的JSON对象"
}, },
"true": "是", "true": "是",
"false": "否", "false": "否",
@ -342,7 +383,9 @@
"not-defined": "主题未设置", "not-defined": "主题未设置",
"missing-config": "未设置服务端", "missing-config": "未设置服务端",
"invalid-topic": "主题无效", "invalid-topic": "主题无效",
"nonclean-missingclientid": "客户端ID未设定使用新会话" "nonclean-missingclientid": "客户端ID未设定使用新会话",
"invalid-json-string": "无效的JSON字符串",
"invalid-json-parse": "无法解析JSON字符串"
} }
}, },
"httpin": { "httpin": {
@ -353,13 +396,27 @@
"return": "返回", "return": "返回",
"upload": "接受文件上传?", "upload": "接受文件上传?",
"status": "状态码", "status": "状态码",
"headers": "Header", "headers": "头",
"other": "其他" "other": "其他",
"paytoqs" : "将msg.payload附加为查询字符串参数",
"utf8String": "UTF8格式的字符串",
"binaryBuffer": "二进制buffer",
"jsonObject": "解析的JSON对象",
"authType": "类型",
"bearerToken": "Token"
}, },
"setby": "- 用 msg.method 设定 -", "setby": "- 用 msg.method 设定 -",
"basicauth": "基本认证", "basicauth": "基本认证",
"use-tls": "使用安全连接 (SSL/TLS) ", "use-tls": "使用安全连接 (SSL/TLS) ",
"tls-config":"TLS 设置", "tls-config":"TLS 设置",
"basic": "基本认证",
"digest": "摘要认证",
"bearer": "bearer认证",
"use-proxy": "使用代理服务器",
"persist": "对连接启用keep-alive",
"proxy-config": "代理服务器设置",
"use-proxyauth": "使用代理身份验证",
"noproxy-hosts": "代理例外",
"utf8": "UTF-8 字符串", "utf8": "UTF-8 字符串",
"binary": "二进制数据", "binary": "二进制数据",
"json": "JSON对象", "json": "JSON对象",
@ -376,7 +433,10 @@
"json-error": "JSON 解析错误", "json-error": "JSON 解析错误",
"no-url": "未设定 URL", "no-url": "未设定 URL",
"deprecated-call":"__method__方法已弃用", "deprecated-call":"__method__方法已弃用",
"invalid-transport":"非HTTP传输请求" "invalid-transport":"非HTTP传输请求",
"timeout-isnan": "超时值不是有效数字,忽略",
"timeout-isnegative": "超时值为负,忽略",
"invalid-payload": "无效的有效载荷"
}, },
"status": { "status": {
"requesting": "请求中" "requesting": "请求中"
@ -399,13 +459,19 @@
"url1": "URL 应该使用ws:&#47;&#47;或者wss:&#47;&#47;方案并指向现有的websocket侦听器.", "url1": "URL 应该使用ws:&#47;&#47;或者wss:&#47;&#47;方案并指向现有的websocket侦听器.",
"url2": "默认情况下,<code>payload</code> 将包含要发送或从Websocket接收的数据。可以将客户端配置为以JSON格式的字符串发送或接收整个消息对象." "url2": "默认情况下,<code>payload</code> 将包含要发送或从Websocket接收的数据。可以将客户端配置为以JSON格式的字符串发送或接收整个消息对象."
}, },
"status": {
"connected": "连接数 __count__",
"connected_plural": "连接数 __count__"
},
"errors": { "errors": {
"connect-error": "ws连接发生了错误: ", "connect-error": "ws连接发生了错误: ",
"send-error": "发送时发生了错误: ", "send-error": "发送时发生了错误: ",
"missing-conf": "未设置服务器" "missing-conf": "未设置服务器",
"duplicate-path": "同一路径上不能有两个WebSocket侦听器: __path__"
} }
}, },
"watch": { "watch": {
"watch": "watch",
"label": { "label": {
"files": "文件", "files": "文件",
"recursive": "递归所有子文件夹" "recursive": "递归所有子文件夹"
@ -421,7 +487,7 @@
"output": "输出", "output": "输出",
"port": "端口", "port": "端口",
"host": "主机地址", "host": "主机地址",
"payload": "有效载荷", "payload": "有效载荷",
"delimited": "分隔符号", "delimited": "分隔符号",
"close-connection": "是否在成功发送每条信息后断开连接?", "close-connection": "是否在成功发送每条信息后断开连接?",
"decode-base64": "用 Base64 解码信息?", "decode-base64": "用 Base64 解码信息?",
@ -480,7 +546,6 @@
"output": "输出", "output": "输出",
"group": "组", "group": "组",
"interface": "本地IP", "interface": "本地IP",
"interfaceprompt": "(可选)本地 IP 绑定到",
"send": "发送一个", "send": "发送一个",
"toport": "到端口", "toport": "到端口",
"address": "地址", "address": "地址",
@ -488,6 +553,7 @@
}, },
"placeholder": { "placeholder": {
"interface": "可选eth0的IP地址", "interface": "可选eth0的IP地址",
"interfaceprompt": "(可选) 要绑定的本地接口或地址",
"address": "目标IP地址" "address": "目标IP地址"
}, },
"udpmsgs": "udp信息", "udpmsgs": "udp信息",
@ -529,15 +595,18 @@
"ip-notset": "udp: IP地址未设定", "ip-notset": "udp: IP地址未设定",
"port-notset": "udp: 端口未设定", "port-notset": "udp: 端口未设定",
"port-invalid": "udp: 无效端口号码", "port-invalid": "udp: 无效端口号码",
"alreadyused": "udp: 端口已被占用" "alreadyused": "udp: 端口已被占用",
"ifnotfound": "udp: 接口 __iface__ 未发现"
} }
}, },
"switch": { "switch": {
"switch": "switch",
"label": { "label": {
"property": "属性", "property": "属性",
"rule": "规则", "rule": "规则",
"repair" : "重建信息队列" "repair" : "重建信息队列"
}, },
"previous": "先前值",
"and": "与", "and": "与",
"checkall": "全选所有规则", "checkall": "全选所有规则",
"stopfirst": "接受第一条匹配信息后停止", "stopfirst": "接受第一条匹配信息后停止",
@ -550,11 +619,15 @@
"false":"为假", "false":"为假",
"null":"为空", "null":"为空",
"nnull":"非空", "nnull":"非空",
"head":"head", "istype": "类型是",
"tail":"tail", "empty": "为空",
"index":"index between", "nempty": "非空",
"head":"头",
"tail":"尾",
"index":"索引在..中间",
"exp":"JSONata表达式", "exp":"JSONata表达式",
"else":"除此以外" "else":"除此以外",
"hask": "拥有键"
}, },
"errors": { "errors": {
"invalid-expr": "无效的JSONata表达式: __error__", "invalid-expr": "无效的JSONata表达式: __error__",
@ -588,6 +661,7 @@
} }
}, },
"range": { "range": {
"range": "range",
"label": { "label": {
"action": "操作", "action": "操作",
"inputrange": "映射输入数据", "inputrange": "映射输入数据",
@ -623,7 +697,8 @@
"firstrow": "第一行包含列名", "firstrow": "第一行包含列名",
"output": "输出", "output": "输出",
"includerow": "包含列名行", "includerow": "包含列名行",
"newline": "换行符" "newline": "换行符",
"usestrings": "parse numerical values"
}, },
"placeholder": { "placeholder": {
"columns": "用逗号分割列名" "columns": "用逗号分割列名"
@ -654,7 +729,8 @@
"html": { "html": {
"label": { "label": {
"select": "选取项", "select": "选取项",
"output": "输出" "output": "输出",
"in": "in"
}, },
"output": { "output": {
"html": "选定元素的html内容", "html": "选定元素的html内容",
@ -670,7 +746,9 @@
"errors": { "errors": {
"dropped-object": "忽略非对象格式的有效负载", "dropped-object": "忽略非对象格式的有效负载",
"dropped": "忽略不支持格式的有效负载类型", "dropped": "忽略不支持格式的有效负载类型",
"dropped-error": "转换有效负载失败" "dropped-error": "转换有效负载失败",
"schema-error": "JSON架构错误",
"schema-error-compile": "JSON架构错误: 未能编译架构"
}, },
"label": { "label": {
"o2j": "对象至JSON", "o2j": "对象至JSON",
@ -713,7 +791,10 @@
"breaklines": "分拆成行", "breaklines": "分拆成行",
"filelabel": "文件", "filelabel": "文件",
"sendError": "发生错误时发送消息(传统模式)", "sendError": "发生错误时发送消息(传统模式)",
"deletelabel": "删除 __file__" "deletelabel": "删除 __file__",
"encoding": "编码",
"utf8String": "UTF8字符串",
"binaryBuffer": "二进制buffer"
}, },
"action": { "action": {
"append": "追加至文件", "append": "追加至文件",
@ -731,6 +812,21 @@
"deletedfile": "删除文件: __file__", "deletedfile": "删除文件: __file__",
"appendedfile": "追加至文件: __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": { "errors": {
"nofilename": "未指定文件名", "nofilename": "未指定文件名",
"invaliddelete": "警告:无效删除。请在配置对话框中使用特定的删除选项", "invaliddelete": "警告:无效删除。请在配置对话框中使用特定的删除选项",
@ -742,6 +838,7 @@
"tip": "提示: 文件名应该是绝对路径否则它将相对于Node-RED进程的工作目录。" "tip": "提示: 文件名应该是绝对路径否则它将相对于Node-RED进程的工作目录。"
}, },
"split": { "split": {
"split": "split",
"intro":"基于以下类型拆分<code>msg.payload</code>:", "intro":"基于以下类型拆分<code>msg.payload</code>:",
"object":"<b>对象</b>", "object":"<b>对象</b>",
"objectSend":"每个键值对作为单个消息发送", "objectSend":"每个键值对作为单个消息发送",
@ -753,6 +850,7 @@
"addname":" 复制键到 " "addname":" 复制键到 "
}, },
"join":{ "join":{
"join": "join",
"mode":{ "mode":{
"mode":"模式", "mode":"模式",
"auto":"自动", "auto":"自动",
@ -761,6 +859,7 @@
"custom":"手动" "custom":"手动"
}, },
"combine":"合并每个", "combine":"合并每个",
"completeMessage": "完整的消息",
"create":"输出为", "create":"输出为",
"type":{ "type":{
"string":"字符串", "string":"字符串",
@ -799,6 +898,7 @@
} }
}, },
"sort" : { "sort" : {
"sort": "sort",
"target" : "排序属性", "target" : "排序属性",
"seq" : "信息队列", "seq" : "信息队列",
"key" : "键值", "key" : "键值",
@ -812,6 +912,7 @@
"clear" : "清空sort节点中的待定信息" "clear" : "清空sort节点中的待定信息"
}, },
"batch" : { "batch" : {
"batch": "batch",
"mode": { "mode": {
"label" : "模式", "label" : "模式",
"num-msgs" : "按指定数量分组", "num-msgs" : "按指定数量分组",

View File

@ -0,0 +1,19 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="tls-config">
<p>TLS连接的配置选项。</p>
</script>

View File

@ -0,0 +1,22 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="http proxy">
<p>HTTP代理的配置选项。</p>
<h3>详细</h3>
<p>访问代理例外列表中的主机时,将不使用任何代理。</p>
</script>

View File

@ -0,0 +1,71 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="mqtt in">
<p>连接到MQTT代理并订阅来自指定主题的消息。</p>
<h3>输出</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">字符串 | buffer</span></dt>
<dd>如果不是二进制buffer的话就是字符串</dd>
<dt>topic <span class="property-type">字符串</span></dt>
<dd>MQTT主题使用<code>/</code>作为层次结构分隔符。</dd>
<dt>qos <span class="property-type">数值</span> </dt>
<dd>QoS服务质量0, 最多一次; 1, 最少一次; 2, 只一次。</dd>
<dt>retain <span class="property-type">布尔值</span></dt>
<dd>值为true时表示消息已保留且可能是旧的。</dd>
</dl>
<h3>详细</h3>
<p>订阅主题可以包括MQTT通配符+:一个级别,#:多个级别)。</p>
<p>使用该节点您首先需要建立与MQTT代理的连接。通过单击铅笔图标来进行配置。</p>
<p>如有需要几个MQTT节点输入或输出可以共享相同的代理连接。</p>
</script>
<script type="text/x-red" data-help-name="mqtt out">
<p>连接到MQTT代理并发布消息。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">字符串 | buffer</span></dt>
<dd>要发布的有效负载。如果未设置此属性,则不会发送任何消息。要发送空白消息,请将此属性设置为空字符串。</dd>
<dt class="optional">topic <span class="property-type">字符串</span></dt>
<dd>要发布的MQTT主题。</dd>
<dt class="optional">qos <span class="property-type">number</span></dt>
<dd>QoS服务质量0, 最多一次; 1, 最少一次; 2, 只一次。默认值为0。</dd>
<dt class="optional">retain <span class="property-type">布尔值</span></dt>
<dd>设置为<code>true</code>来将消息保留在代理上。默认值为<code>false</code></dd>
</dl>
<h3>详细</h3>
<p><code>msg.payload</code>用作已发布消息的有效载荷。如果包含Object则会在发送之前将其转换为JSON字符串。如果它包含二进制buffer则消息将按原样发布。</p>
<p>可以在节点中配置所使用的主题,或者如果留为空白,则可以通过<code>msg.topic</code>进行设置。</p>
<p>同样可以在节点中配置QoS和保留值或者如果保留空白则分别由<code>msg.qos</code><code>msg.retain</code>设置。要清除先前存储在代理中的主题,请设置保留标志并向该主题发布空消息。</p>
<p>该节点需要与要配置的MQTT代理的连接。通过单击铅笔图标进行配置。</p>
<p>如果需要几个MQTT节点输入或输出可以共享相同的代理连接。</p>
</script>
<script type="text/x-red" data-help-name="mqtt-broker">
<p>与MQTT代理的连接设置。</p>
<p>创建与代理的连接设置。可以在<code>MQTT In</code><code>MQTT Out</code>节点中重复利用这些设置。</p>
<p>如果未为该节点设置客户端ID并且设置了会话初始化则将生成一个随机客户端ID。设置客户端ID时请确保它对于连接目标处的代理是唯一的。</p>
<h4>Birth Message</h4>
<p>建立连接后发布在以配置主题中的消息。</p>
<h4>Close Message</h4>
<p>在连接正常结束之前重新部署或者关闭了节点时,发布在以配置主题中的消息。</p>
<h4>Will Message</h4>
<p>当节点意外丢失连接时由代理发布的消息</p>
<h4>WebSockets</h4>
<p>可以将节点配置成使用WebSocket连接。使用WebSocket时请在服务器字段中以完整格式描述连接目标的URI。 例如:</p>
<pre>ws://example.com:4000/mqtt</pre>
</script>

View File

@ -0,0 +1,81 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="http in">
<p>创建用于创建Web服务的HTTP端点。</p>
<h3>输出</h3>
<dl class="message-properties">
<dt>payload</dt>
<dd>GET请求包含任何查询字符串参数的对象。或者包含HTTP请求正文。</dd>
<dt>req<span class="property-type">object</span></dt>
<dd>HTTP请求对象。该对象包含有关请求信息的多个属性。
<ul>
<li><code>body</code> - 传入请求的正文。格式将取决于请求。</li>
<li><code>headers</code> - 包含HTTP请求标头的对象。</li>
<li><code>query</code> - 包含任何查询字符串参数的对象。</li>
<li><code>params</code> - 包含任何路由参数的对象。</li>
<li><code>cookies</code> - 包含请求cookie的对象。</li>
<li><code>files</code> - 如果节点启用了文件上传,则为包含了上传的文件的对象。</li>
</ul>
</dd>
<dt>res<span class="property-type">object</span></dt>
<dd>HTTP响应对象。此属性不应直接使用<code>HTTP Response</code>节点记录了如何响应请求。该属性必须保留在传递给响应节点的消息上。</dd>
</dl>
<h3>详细</h3>
<p>节点将在配置的路径上监听特定类型的请求。路径可以完全指定,例如<code>/user</code>,或包括可以接受任何值的命名参数,例如<code>/user/:name</code>。 使用命名参数时,可以在<code>msg.req.params</code>下访问其在请求中的实际值。</p>
<p>对于包含正文的请求例如POST或PUT请求的内容将作为<code>msg.payload</code>提供。</p>
<p>如果可以确定请求的内容类型,则正文将被解析为任何适当的类型。例如,<code>application/json</code>将被解析为其JavaScript对象表示。</p>
<p><b>注意:</b>该节点不发送对请求的任何响应。该流必须包含HTTP响应节点才能完成请求。</p>
</script>
<script type="text/x-red" data-help-name="http response">
<p>将响应发送回从HTTP输入节点接收的请求。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">string</span></dt>
<dd>响应的正文。</dd>
<dt class="optional">statusCode <span class="property-type">数值</span></dt>
<dd>如果设置则用作响应状态代码。默认值200。</dd>
<dt class="optional">headers <span class="property-type">object</span></dt>
<dd>如果设置则提供HTTP头以包含在响应中。</dd>
<dt class="optional">cookies <span class="property-type">object</span></dt>
<dd>如果设置则可用于设置或删除cookie。</dd>
</dl>
<h3>详细</h3>
<p>还可以在节点本身内设置<code>statusCode</code><code>headers</code>。如果在节点内设置了属性则不能被相应的message属性覆盖。</p>
<h4>Cookie处理</h4>
<p><code>cookies</code>属性必须是名称/值对的对象。该值可以是使用默认选项设置cookie值的字符串也可以是options对象。<p>
<p>下面的示例设置两个cookie-一个名为<code>name</code>的值为<code>nick</code>,另一个名为<code>session</code>的值为<code>1234</code>并且有效期设置为15分钟。</p>
<pre>
msg.cookies = {
name: 'nick',
session: {
value: '1234',
maxAge: 900000
}
}</pre>
<p>有效选项包括:</p>
<ul>
<li><code>domain</code> - (字符串) Cookie的域名</li>
<li><code>expires</code> - (日期) GMT标准时间的到期日。如果未指定或设置为0则创建会话cookie</li>
<li><code>maxAge</code> - (字符串) 相对于当前时间的到期日期(以毫秒为单位)</li>
<li><code>path</code> - (字符串) Cookie的路径。默认为/</li>
<li><code>value</code> - (字符串) Cookie使用的值</li>
</ul>
<p>要删除Cookie请将其<code>value</code>设置为<code>null</code></p>
</script>

View File

@ -0,0 +1,78 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="http request">
<p>发送HTTP请求并返回响应。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt class="optional">url <span class="property-type">字符串</span></dt>
<dd>如果未在节点中配置则此可选属性设置请求的url。</dd>
<dt class="optional">method <span class="property-type">字符串</span></dt>
<dd>如果未在节点中配置则此可选属性设置请求的HTTP方法。必须是<code>GET</code>,<code>PUT</code>,<code>POST</code>,<code>PATCH</code><code>DELETE</code>之一。</dd>
<dt class="optional">headers <span class="property-type">object</span></dt>
<dd>设置请求的HTTP头。</dd>
<dt class="optional">cookies <span class="property-type">object</span></dt>
<dd>如果设置则可用于发送带有请求的cookie。</dd>
<dt class="optional">payload</dt>
<dd>发送为请求的正文。</dd>
<dt class="optional">rejectUnauthorized</dt>
<dd>如果设置为<code>false</code>则允许对使用自签名证书的https站点进行请求。</dd>
<dt class="optional">followRedirects</dt>
<dd>如果设置为<code>false</code>则阻止遵循重定向HTTP 301。默认情况下为<code>true</code></dd>
<dt class="optional">requestTimeout</dt>
<dd>如果设置为正数毫秒,将覆盖全局设置的<code>httpRequestTimeout</code>参数。</dd>
</dl>
<h3>输出</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">字符串 | object | buffer</span></dt>
<dd>响应的正文。可以将节点配置为以字符串形式返回主体尝试将其解析为JSON字符串或将其保留为二进制buffer。</dd>
<dt>statusCode <span class="property-type">数值</span></dt>
<dd>响应的状态码,如果请求无法完成,则返回错误码。</dd>
<dt>headers <span class="property-type">object</span></dt>
<dd>包含响应头的对象。</dd>
<dt>responseUrl <span class="property-type">字符串</span></dt>
<dd>如果在处理请求时发生任何重定向则此属性为最终重定向的URL。否则则为原始请求的URL。</dd>
<dt>responseCookies <span class="property-type">object</span></dt>
<dd>如果响应包含cookie则此属性是每个cookie的名称/值’键值对的对象。</dd>
<dt>redirectList <span class="property-type">数组</span></dt>
<dd>如果请求被重定向了一次或多次则累积的信息将被添加到此属性。“location”是下一个重定向目标。cookie是从重定向源返回的cookie。</dd>
</dl>
<h3>详细</h3>
<p>在节点内配置后URL属性可以包含<a href="http://mustache.github.io/mustache.5.html" target="_blank">mustache样式</a>标签。 这些标签允许使用传入消息的值来构造url。例如如果url设置为<code>example.com/{{{{topic}}}</code>,它将自动插入<code>msg.topic</code>的值。使用{{{...}}}可以防止mustache转义/ &等字符。</p>
<p>节点可以选择自动将<code>msg.payload</code>编码为GET请求的查询字符串参数在这种情况下<code>msg.payload</code>必须是一个对象。</p>
<p><b>注意:</b>如果使用了代理,则应设置<code>http_proxy=...</code>环境变量并重新启动Node-RED或使用“代理配置”。如果设置了代理配置则配置优先于环境变量。</p>
<h4>使用多个HTTP请求节点</h4>
<p>为了在一个流程中多次使用该节点,必须要注意<code>msg.headers</code>属性的处理。通常在第一个节点在响应头中设置此属性,而不期望在下一个节点的请求头中使用此属性。如果节点之间的<code>msg.headers</code>属性保持不变,则第二个节点将忽略它。要设置自定义标题,首先应删除<code>msg.headers</code>或将其重置为空对象:<code>{}</code></p>
<h4>Cookie处理</h4>
<p>传递给节点的<code>cookies</code>属性必须是‘名称/值键值对的对象。该值可以是设置cookie值的字符串也可以是具有单个<code>value</code>属性的对象。</p>
<p>请求返回的所有cookie都将在<code>responseCookies</code>属性下传递回去。</p>
<h4>内容类型处理</h4>
<p>如果<code>msg.payload</code>是一个对象,则节点将自动将请求的内容类型设置为<code>application/json</code>并对其进行编码。</p>
<p>要将请求编码为表单数据,应将<code>msg.headers[“content-type”]</code>设置为<code>application/x-www-form-urlencoded</code></p>
<h4>文件上传</h4>
<p>要执行文件上传,应将<code>msg.headers["content-type"]</code>设置为<code>multipart/form-data</code><code>msg.payload</code>传递给节点的必须是具有以下结构的对象:</p>
<pre><code>{
"KEY": {
"value": FILE_CONTENTS,
"options": {
"filename": "FILENAME"
}
}
}</code></pre>
<p><code>KEY</code>,<code>FILE_CONTENTS</code><code>FILENAME</code>的值应设置为适当的值。</p>
</script>

View File

@ -0,0 +1,35 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="websocket in">
<p>WebSocket输入节点。</p>
<p>默认情况下从WebSocket接收的数据将位于<code>msg.payload</code>中。可以将套接字配置为期望格式正确的JSON字符串在这种情况下它将解析JSON并将结果对象作为整个消息发送。</p>
</script>
<script type="text/x-red" data-help-name="websocket out">
<p>WebSocket输出节点。</p>
<p>默认情况下,<code>msg.payload</code>将通过WebSocket发送。可以将套接字配置为将整个<code>msg</code>对象编码为JSON字符串然后通过WebSocket发送。</p>
<p>如果到达此节点的消息是从WebSocket In节点开始的则该消息将发送回触发流程的客户端。否则消息将广播给所有连接的客户端。</p>
<p>如果要广播从“WebSocket输入”节点开始的消息则可以应该删除流中的<code>msg._session</code>属性。</p>
</script>
<script type="text/x-red" data-help-name="websocket-listener">
<p>此配置节点使用指定的路径创建WebSocket服务器端点。</p>
</script>
<script type="text/x-red" data-help-name="websocket-client">
<p>此配置节点将WebSocket客户端连接到指定的URL。</p>
</script>

View File

@ -0,0 +1,35 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="tcp in">
<p>提供TCP输入选择。可以连接到远程TCP端口或接受传入连接。</p>
<p><b>注意:</b>在某些系统上您可能需要root或管理员权限来访问低于1024的端口。</p>
</script>
<script type="text/x-red" data-help-name="tcp out">
<p>提供TCP输出的选择。可以连接到远程TCP端口接受传入的连接或回复从TCP In节点收到的消息。</p>
<p>仅发送<code>msg.payload</code></p>
<p>如果<code>msg.payload</code>是包含二进制数据的Base64编码的字符串则Base64解码选项将导致它在发送之前先转换回二进制。</p>
<p>如果不存在<code>msg._session</code>,则有效负载将发送到<b>所有</b>连接的客户端。</p>
<p><b>注意:</b>在某些系统上您可能需要root或管理员权限来访问低于1024的端口。</p>
</script>
<script type="text/x-red" data-help-name="tcp request">
<p>一个简单的TCP请求节点。将<code>msg.payload</code>发送到服务器tcp端口并期望得到响应。</p>
<p>连接到服务器,发送“请求”并接收“响应”。 可以从固定数量的字符,与指定字符匹配的字符中选择操作,从第一个答复到达起等待指定的时间,等待数据到达,发送数据并立即取消连接而无需等待答复等操作中进行选择。</p>
<p>响应将在<code>msg.payload</code>中作为buffer输出因此您可能需要对它进行<code>.toString()</code>操作。</p>
<p>如果将tcp主机或端口留空则必须使用<code>msg.host</code><code>msg.port</code>属性进行设置。</p>
</script>

View File

@ -0,0 +1,28 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="udp in">
<p>UDP输入节点。在<code>msg.payload</code>中生成Buffer字符串或Base64编码的字符串。支持组播。</p>
<p><code>msg.ip</code><code>msg.port</code>中设置接收到的消息的IP地址和端口。</p>
<p><b>注意:</b>在某些系统上您可能需要root或管理员权限才能使用低于1024的端口或广播。</p>
</script>
<script type="text/x-red" data-help-name="udp out">
<p>该节点将<code>msg.payload</code>发送到指定的UDP主机和端口。支持组播。</p>
<p>您也可以使用<code>msg.ip</code><code>msg.port</code>设置目标值,但是静态配置的值具有优先权。</p>
<p>如果选择广播则将地址设置为本地广播IP地址。或者也可以尝试使用全局广播地址255.255.255.255。</p>
<p><b>注意:</b>在某些系统上您可能需要root或管理员权限才能使用低于1024的端口或广播。</p>
</script>

View File

@ -0,0 +1,43 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="csv">
<p>在CSV格式的字符串及其JavaScript对象表示形式之间进行相互转换。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">object | 数组 | 字符串</span></dt>
<dd>JavaScript对象数组或CSV字符串。</dd>
</dl>
<h3>输出</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">object | 数组 | 字符串</span></dt>
<dd>
<ul>
<li>如果输入是字符串它将尝试将其解析为CSV并为每行创建键/值对的JavaScript对象。然后该节点将为每行发送一条消息或者发送一条包含对象数组的消息。</li>
<li>如果输入是JavaScript对象它将尝试构建CSV字符串。</li>
<li>如果输入是简单值的数组则将构建单行CSV字符串。</li>
<li>如果输入是数组数组或对象数组则会创建多行CSV字符串。</li>
</ul>
</dd>
</dl>
<h3>详细</h3>
<p>列模板可以包含列名称的有序列表。将CSV转换为对象时列名将用作属性名称。或者也可以从CSV的第一行中获取列名称。</p>
<p>转换为CSV时列模板用于标识从对象中提取的属性以及提取的顺序。</p>
<p>如果输入是数组,则列模板仅用于有选择地生成一行列标题。</p>
<p>只要正确设置<code>parts</code>属性,该节点就可以接受多部分输入。</p>
<p>如果输出多个消息,则将设置其<code>parts</code>属性并形成完整的消息序列。</p>
<p><b>注意:</b>列模板必须用逗号分隔,即使数据中已有了其他分隔符。</p>
</script>

View File

@ -0,0 +1,33 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="html">
<p>使用CSS选择器从<code>msg.payload</code>中保存的html文档中提取元素。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">字符串</span></dt>
<dd>从中提取元素的html字符串。</dd>
<dt class="optional">select <span class="property-type">字符串</span></dt>
<dd>如果未在编辑面板中配置则可以将选择器设置为msg的属性。</dd>
</dl>
<h3>Output</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">数组 | 字符串</span></dt>
<dd>结果可以是有效载荷中包含匹配元素的数组的单个消息;也可以是多条消息,每条消息都包含匹配元素。发送多条消息时,需要为消息设置<code>parts</code></dd>
</dl>
<h3>详细</h3>
<p>该节点支持CSS和jQuery选择器的组合。查看<a href="https://github.com/fb55/CSSselect#user-content-supported-selectors" target="_blank">css-select documentation</a> 来获得更多信息。</p>
</script>

View File

@ -0,0 +1,43 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="json">
<p>在JSON字符串及其JavaScript对象表示形式之间相互转换。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">object | 字符串</span></dt>
<dd>JavaScript对象或JSON字符串。</dd>
<dt>schema<span class="property-type">object</span></dt>
<dd>可选的JSON Schema对象用于验证有效负载。在将<code>msg</code>发送到下一个节点之前,将删除该属性。</dd>
</dl>
<h3>Outputs</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">object | 字符串</span></dt>
<dd>
<ul>
<li>如果输入是JSON字符串它将尝试将其解析为JavaScript对象。</li>
<li>如果输入是JavaScript对象它将创建一个JSON字符串。并可以选择对此JSON字符串进行整形。</li>
</ul>
</dd>
<dt>schemaError<span class="property-type">数组</span></dt>
<dd>如果JSON模式验证失败则catch节点将具有包含错误数组的<code>schemaError</code>属性。</dd>
</dl>
<h3>详细</h3>
<p>默认的转换目标是<code>msg.payload</code>,但是也可以转换消息的其它属性。</p>
<p>您可以将其设置为仅执行特定的转换,而不是自动选择双向转换。例如,即使对<code>HTTP In</code>节点的请求未正确设置content-type也可以使用它来确保JSON节点的转换结果是JavaScript对象</p>
<p>如果指定了转换为JSON字符串则不会对收到的字符串进行进一步的检查。也就是说即使指定了格式化选项它也不会检查字符串是否正确为JSON或对JSON执行整形。</p>
<p>有关JSON模式的更多详细信息请查阅<a href="http://json-schema.org/latest/json-schema-validation.html">规范</a>.</p>
</script>

View File

@ -0,0 +1,48 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="xml">
<p>在XML字符串及其JavaScript对象表示形式之间进行相互转换。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">object | 字符串</span></dt>
<dd>JavaScript对象或XML字符串。</dd>
</dl>
<h3>输出</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">object | 字符串</span></dt>
<dd>
<ul>
<li>如果输入是字符串它将尝试将其解析为XML并创建一个JavaScript对象。</li>
<li>如果输入是JavaScript对象它将尝试构建XML字符串。</li>
</ul>
</dd>
<dt class="optional">options <span class="property-type">object</span></dt>
<dd>可以将选项传递给内部使用的XML转换库。请参见<a href="https://github.com/Leonidas-from-XIV/node-xml2js/blob/master/README.md#options" target="_blank"> xml2js文档</a> 来获取更多信息。</dd>
</dl>
<h3>详细</h3>
<p>在XML和对象之间进行转换时默认情况下XML属性会添加到名为<code>$</code>的属性中。将文本内容添加到名为<code>_</code>的属性中。这些属性名称可以在节点设置中更改。</p>
<p>例如将如下所示转换以下XML</p>
<pre>&lt;p class="tag"&gt;Hello World&lt;/p&gt;</pre>
<pre>{
"p": {
"$": {
"class": "tag"
},
"_": "Hello World"
}
}</pre>
</script>

View File

@ -0,0 +1,34 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="yaml">
<p>在YAML格式的字符串及其JavaScript对象表示形式之间相互转换。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">object | 字符串</span></dt>
<dd>JavaScript对象或YAML字符串。</dd>
</dl>
<h3>Outputs</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">object | 字符串</span></dt>
<dd>
<ul>
<li>如果输入是YAML字符串它将尝试将其解析为JavaScript对象。</li>
<li>如果输入是JavaScript对象它将创建一个YAML字符串。</li>
</ul>
</dd>
</dl>
</script>

View File

@ -0,0 +1,133 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="split">
<p>将一条消息拆分为一系列消息。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt>payload<span class="property-type">object | 字符串 | 数组 | buffer</span></dt>
<dd>节点的行为由<code>msg.payload</code>的类型决定:
<ul>
<li><b>字符串</b>/<b>buffer</b> - 使用指定的字符(默认值:<code>\n</code>),缓冲区序列或固定长度将消息拆分。</li>
<li><b>数组</b> - 消息被拆分为单个数组元素或固定长度的数组。</li>
<li><b>object</b> - 将为对象的每个键/值对发送一条消息。</li>
</ul>
</dd>
</dl>
<h3>输出</h3>
<dl class="message-properties">
<dt>parts<span class="property-type">object</span></dt>
<dd>此属性包含有关如何将消息与原始消息分开的信息。如果传递给<b>join</b>节点,则可以将序列重组为单个消息。该属性具有以下属性:
<ul>
<li><code>id</code> - 一组消息的标识符</li>
<li><code>index</code> - 组中的位置</li>
<li><code>count</code> - 如果已知组中的邮件总数。请参阅下面的“流媒体模式”</li>
<li><code>type</code> - 消息的类型-字符串/数组/对象/buffer</li>
<li><code>ch</code> - 对于字符串或buffer用于将消息拆分为字符串或字节数组的数据</li>
<li><code>key</code> - 对于对象,创建此消息的属性的键。可以将节点配置为也将此值复制到另一个消息属性,例如<code>msg.topic</code></li>
<li><code>len</code> - 使用固定长度值拆分消息时,每段子消息的长度</li>
</ul>
</dd>
</dl>
<h3>详细</h3>
<p>在使用<b>join</b>节点将序列重新组合为单个消息之前,推荐使用此节点来轻松地创建跨消息序列,执行通用操作的流。</p>
<p>它使用<code>msg.parts</code>属性跟踪序列的各个部分。</p>
<h4>流媒体模式</h4>
<p>该节点还可以用于重排消息流。例如,发送换行符终止命令的串行设备可能会传递一条消息,并在其末尾带有部分命令。 在“流模式”下,此节点将拆分一条消息并发送每个完整的段。如果末尾有部分片段,则该节点将保留该片段,并将其添加到收到的下一条消息之前。</p>
<p>在此模式下运行时,该节点将不会设置<code>msg.parts.count</code>属性,因为流中期望的消息数还是未知的。这意味着它不能在自动模式下与<b>join</b>节点一起使用。</p>
</script>
<script type="text/x-red" data-help-name="join">
<p>将消息序列合并为一条消息.</p>
<p>共有三种模式:</p>
<dl>
<dt>自动模式</dt>
<dd><b>split</b>节点配对时,它将自动将已被拆分的消息进行合并。</dd>
<dt>手动模式</dt>
<dd>手动地以各种方式合并消息序列。</dd>
<dt>列聚合模式</dt>
<dd>对消息列中的所有消息应用表达式以将其简化为单个消息。</dd>
</dl>
<h3>输入</h3>
<dl class="message-properties">
<dt class="optional">parts<span class="property-type">object</span></dt>
<dd>使用自动模式时,所有的消息都应包含此属性。<b>split</b>节点会生成此属性,但也可以手动进行设置。该属性具有以下属性:
<ul>
<li><code>id</code> - 消息组的标识符</li>
<li><code>index</code> - 组中的位置</li>
<li><code>count</code> - 如果已知组中的邮件总数。请参阅下面的“流媒体模式”</li>
<li><code>type</code> - 消息的类型-字符串/数组/对象/buffer</li>
<li><code>ch</code> - 对于字符串或buffer用于将消息拆分为字符串或字节数组的数据</li>
<li><code>key</code> - 对于对象,创建此消息的属性的键。可以将节点配置为也将此值复制到另一个消息属性,例如<code>msg.topic</code>/li>
<li><code>len</code> - 使用固定长度值拆分消息时,每段子消息的长度</li>
</ul>
</dd>
<dt class="optional">complete</dt>
<dd>如果设置,则节点将以其当前状态发送其输出消息。</dd>
</dl>
<h3>详细</h3>
<h4>自动模式</h4>
<p>自动模式使用传入消息的<code>parts</code>属性来确定应如何连接序列。这使它可以自动逆转<b>split</b>节点的操作。</p>
<h4>手动模式</h4>
<p>设置为以手动模式时,该节点能以各种不同的方法来处理消息:</p>
<ul>
<li><b>字符串</b><b>缓冲区</b>-通过将每条消息的选定属性与指定的连接字符或缓冲区连接起来。</li>
<li><b>数组</b> - 通过将每个选定的属性或整个消息添加到输出数组</li>
<li><b>键/值对象</b> - 通过使用每个消息的属性来确定存储所需值的键。</li>
<li><b>merged object</b> - 通过将每个消息的属性合并到一个对象下。</li>
</ul>
<p>输出消息的其他属性都取自发送结果前的最后一条消息。</p>
<p>可以用<i>计数</i>来确定应接收多少条消息来进行合并。对于对象输出,可以设置为达到此计数后的每条后续消息都发送一条输出。</p>
<p>可以用<i>超时</i>来设置发送新消息之前的等待时间。</p>
<p>如果收到设置了<b>msg.complete</b>属性的消息时发送输出消息并重置消息列数。</p>
<p>如果收到设置了<b>msg.reset</b>属性的消息,则部分收到的消息将被删除而不发送,同时重置消息列数。</p>
<h4>列聚合模式</h4>
<p>选择列聚合模式时,将表达式应用于组成消息列的每条消息,并使用聚合值组成一条消息。</p>
<dl class="message-properties">
<dt>初始值</dt>
<dd>累积值的初始值(<code>$A</code>)。</dd>
<dt>聚合表达式</dt>
<dd>序列中的每个消息调用的JSONata表达式。结果将作为累加值传递到表达式的下一个调用。在表达式中可以使用以下特殊变量
<ul>
<li><code>$A</code>: 累计值 </li>
<li><code>$I</code>: 消息在序列中的索引</li>
<li><code>$N</code>: 序列中的消息数</li>
</ul>
</dd>
<dt>最终调整式子</dt>
<dd>可选的JSONata表达式在将聚合表达式应用于序列中的所有消息之后应用。在表达式中可以使用以下特殊变量
<ul>
<li><code>$A</code>: 累计值</li>
<li><code>$N</code>: 消息在序列中的索引</li>
</ul>
</dd>
<p>默认情况下,按顺序从序列的第一条消息到最后一条消息应用聚合表达式。也可以选择以相反的顺序应用聚合表达式。</p>
</dl>
<p><b>例子:</b>给定一系列数字值,以下设置将计算平均值:
<ul>
<li><b>聚合表达式</b>: <code>$A+payload</code></li>
<li><b>初始值</b>: <code>0</code></li>
<li><b>最终调整式</b>: <code>$A/$N</code></li>
</ul>
</p>
<h4>储存讯息</h4>
<p>该节点将在内部缓存消息,以便跨序列工作。运行时设置<code>nodeMessageBufferMaxLength</code>可用于设定缓存的消息数。</p>
</script>

View File

@ -0,0 +1,41 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="sort">
<p>对消息属性或消息序列进行排序的函数。</p>
<p>当配置为对消息属性进行排序时,节点将对指定消息属性所指向的数组数据进行排序。</p>
<p>当配置为对消息序列排序时,它将对消息重新排序。</p>
<p>排序顺序可以是:</p>
<ul>
<li><b>升序</b></li>
<li><b>降序</b></li>
</ul>
<p>对于数字,可以通过复选框指定数字顺序。</p>
<p>排序键可以是元素值也可以是JSONata表达式来对属性值进行排序还可以是message属性或JSONata表达式来对消息序列进行排序。<p>
<p>在对消息序列进行排序时,排序节点依赖于接收到的消息来设置<code>msg.parts</code>。拆分节点将生成此属性,但也可以手动创建。它具有以下属性:</p>
<p>
<ul>
<li><code>id</code> - 消息组的标识符</li>
<li><code>index</code> - 组中的位置</li>
<li><code>count</code> - 群组中的邮件总数</li>
</ul>
</p>
<p><b>注意:</b>在此节点的处理中,消息在内部存储。通过指定要累积的最大消息数,可以防止意外的高内存使用。默认设置是不限制消息数量。
<ul>
<li><code>nodeMessageBufferMaxLength</code>属性在<b>settings.js</b>中设置。</li>
</ul>
</p>
</script>

View File

@ -0,0 +1,34 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="batch">
<p>根据各种规则创建消息序列。</p>
<h3>详细</h3>
<p>有三种创建消息序列的模式:</p>
<dl>
<dt>讯息数</dt>
<dd>将消息分组为给定长度的序列。 <b>overlap</b>(重叠)选项指定在一个序列的末尾应重复多少消息。</dd>
<dt>时间间隔</dt>
<dd>对在指定时间间隔内到达的邮件进行分组。如果在该时间间隔内没有消息到达,则该节点可以选择发送空消息。</dd>
<dt>串联序列</dt>
<dd>通过串联输入序列来创建消息序列。每条消息必须具有<code>msg.topic</code>属性和标识其序列的<code>msg.parts</code>属性。该节点配置有<code>topic</code>值列表,以标识所连接的顺序序列。
</dd>
</dl>
<h4>储存讯息</h4>
<p>该节点将在内部缓冲消息,以便跨序列工作。运行时设置<code>nodeMessageBufferMaxLength</code>可用于限制节点将缓存多少消息。</p>
</script>

View File

@ -0,0 +1,59 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="file">
<p><code>msg.payload</code>写入文件,添加到末尾或替换现有内容。或者,它也可以删除文件。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt class="optional">filename<span class="property-type">字符串</span></dt>
<dd>如果未在节点中配置,则此可选属性可以设置文件名。</dd>
</dl>
<h3>输出</h3>
<p>写入完成后,输入消息将发送到输出端口。</p>
<h3>详细</h3>
<p>每个消息的有效荷载将添加到文件的末尾,可以选择在每个消息之间添加一个换行符(\n</p>
<p>如果使用<code>msg.filename</code>,则每次写入后文件都会关闭。为了获得最佳体验,请使用固定的文件名。</p>
<p>可以将其配置为覆盖整个文件,而不是在文件后添加段落。例如,在将二进制数据写入文件(例如图像)时,应使用此选项,并且应禁用添加换行符的选项。</p>
<p>可以从编码列表中指定写入文件的数据的编码。</p>
<p>您可以将此节点配置为删除文件。</p>
</script>
<script type="text/x-red" data-help-name="file in">
<p>以字符串或二进制缓冲区的形式读取文件的内容。</p>
<h3>输入</h3>
<dl class="message-properties">
<dt class="optional">filename<span class="property-type">字符串</span></dt>
<dd>如果未在节点配置中设置,该属性可以选择要读取的文件名。</dd>
</dl>
<h3>输出</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">字符串 | buffer</span></dt>
<dd>文件的内容可以是字符串也可以是二进制的buffer。</dd>
<dt class="optional">filename <span class="property-type">字符串</span></dt>
<dd>如果未在节点配置中设置,该属性可以选择要读取的文件名。</dd>
<dt class="optional">error <span class="property-type">object</span></dt>
<dd><i>已不推荐使用</i>: 如果在节点中启用,则当节点在读取文件时遇到错误时,它将发送一条没有<code>有效荷载</code>的消息,且将消息的<code>error</code>属性设置为错误的详细信息。在默认情况下,此行为模式已弃用且未启用。 请参阅下面的详细信息。</dd>
</dl>
<h3>详细</h3>
<p>文件名应该是绝对路径否则将相对于Node-RED进程的工作目录。</p>
<p>在Windows上可能需要使用转义路径分隔符例如<code>\\Users\\myUser</code></p>
<p>可以选择将文本文件拆分为几行每行输出一条消息或者将二进制文件拆分为较小的buffer块-块大小取决于操作系统但通常为64kLinux/Mac或41kWindows</p>
<p>当拆分为多条消息时,每条消息将具有<code>parts</code>属性集,从而形成完整的消息序列。</p>
<p>如果输出格式为字符串,则可以从编码列表中指定输入数据的编码。</p>
<h4>旧版的错误处理</h4>
<p>在Node-RED 0.17之前,如果此节点在读取文件时遇到错误,它将发送一条不包含<code>msg.payload</code>,但包含<code>msg.error</code>的消息。在<code>msg.error</code>中记录详细的错误内容。但这是模式已被弃用,默认未启用。如有需要,您可以在节点配置中重新启用该模式。</p>
<p>应该使用Catch节点来捕获并处理错误。</p>
</script>

View File

@ -0,0 +1,25 @@
<!--
Copyright JS Foundation and other contributors, http://js.foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-help-name="watch">
<p>监视目录或文件中的更改。</p>
<p>您可以输入用逗号分隔的目录和/或文件的列表。您需要在所有带有空格的地方加上引号“...”。</p>
<p>在Windows上必须在任何目录名称中使用双反斜杠<code>\\</code></p>
<p>实际更改的文件的完整文件名将放入<code>msg.payload</code><code>msg.filename</code>中,而监视列表的字符串化版本将在<code>msg.topic</code>中返回。</p>
<p><code>msg.file</code>仅包含已更改文件的短文件名。<code>msg.type</code>更改了事物的类型,通常是<i>file</i><i>directory</i>,而<code>msg.size</code>保留了文件的大小(以字节为单位)。</p>
<p>当然在Linux中<i>everything</i>也是一个文件,因此可以监视</p>
<p><b>注意:</b>该目录或文件必须存在才能被监视。如果文件或目录被删除,即使重新创建它也可能不再被监视。</p>
</script>

View File

@ -0,0 +1,910 @@
{
"common": {
"label": {
"payload": "內容",
"topic": "主題",
"name": "名稱",
"username": "使用者名稱",
"password": "密碼",
"property": "屬性"
},
"status": {
"connected": "已連接",
"not-connected": "未連接",
"disconnected": "已斷開",
"connecting": "連接中",
"error": "錯誤",
"ok": "確定"
},
"notification": {
"error": "<strong>錯誤</strong>: __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": "<b>注意:</b> \"指定時間段並週期性執行\" 和 \"指定時間\" 會使用cron系統.<br/> 詳情查看信息頁.",
"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": "<p>此節點是您安裝但Node-RED所不知道的類型。</p><p><i>如果在此狀態下部署節點,那麼它的配置將被保留,但是流程將不會啟動,直到安裝缺少的節點。</i></p><p>有關更多説明,請參閱資訊側欄</p>"
},
"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": "發送到此節點的消息<b>必須</b>來自<i>http input</i>節點",
"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": "預設情況下,<code>payload</code>將包含要發送或從Websocket接收的資料。偵聽器可以配置為以JSON格式的字串發送或接收整個消息物件.",
"path2": "這條路徑將相對於 ",
"url1": "URL 應該使用ws:&#47;&#47;或者wss:&#47;&#47;方案並指向現有的websocket監聽器.",
"url2": "預設情況下,<code>payload</code> 將包含要發送或從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": "提示:如果要使用<code>msg.ip</code>和<code>msg.port</code>設置,請將位址和埠留空",
"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": "<b>正在使用引腳</b>: ",
"in": "提示: 僅接受數位輸入 - 輸出必須為0或1.",
"dig": "提示: 如用數位輸出 - 輸入必須為0或1.",
"pwm": "提示: 如用PWM輸出 - 輸入必須為0至100之間; 如用高頻率可能會比預期佔用更多CPU資源.",
"ser": "<b>提示</b>: 如用伺服輸出 - 輸入必須為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":"基於以下類型拆分<code>msg.payload</code>:",
"object":"<b>對象</b>",
"objectSend":"每個鍵值對作為單個消息發送",
"strBuff":"<b>字串</b> / <b>Buffer</b>",
"array":"<b>陣列</b>",
"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":"在收到存在<code>msg.complete</code>的消息後",
"tip":"此模式假定此節點與<i>split</i>相連, 或者接收到的消息有正確配置的<code>msg.parts</code>屬性.",
"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屬性"
}
}

View File

@ -245,7 +245,7 @@ LocalFileSystem.prototype.get = function(scope, key, callback) {
return this.cache.get(scope,key,callback); return this.cache.get(scope,key,callback);
} }
if(typeof callback !== "function"){ 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); var storagePath = getStoragePath(this.storageBaseDir ,scope);
loadFile(storagePath + ".json").then(function(data){ loadFile(storagePath + ".json").then(function(data){
@ -304,7 +304,7 @@ LocalFileSystem.prototype.set = function(scope, key, value, callback) {
}, this.flushInterval); }, this.flushInterval);
} }
} else if (callback && typeof callback !== 'function') { } 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 { } else {
self.writePromise = self.writePromise.then(function() { return loadFile(storagePath + ".json") }).then(function(data){ self.writePromise = self.writePromise.then(function() { return loadFile(storagePath + ".json") }).then(function(data){
var obj = data ? JSON.parse(data) : {} var obj = data ? JSON.parse(data) : {}

View File

@ -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__"
}
}
}

View File

@ -81,22 +81,25 @@ function ensureBuffer(o) {
* @memberof @node-red/util_util * @memberof @node-red/util_util
*/ */
function cloneMessage(msg) { function cloneMessage(msg) {
// Temporary fix for #97 if (typeof msg !== "undefined") {
// TODO: remove this http-node-specific fix somehow // Temporary fix for #97
var req = msg.req; // TODO: remove this http-node-specific fix somehow
var res = msg.res; var req = msg.req;
delete msg.req; var res = msg.res;
delete msg.res; delete msg.req;
var m = clone(msg); delete msg.res;
if (req) { var m = clone(msg);
m.req = req; if (req) {
msg.req = req; m.req = req;
msg.req = req;
}
if (res) {
m.res = res;
msg.res = res;
}
return m;
} }
if (res) { return msg;
m.res = res;
msg.res = res;
}
return m;
} }
/** /**

View File

@ -18,7 +18,7 @@
"clone": "2.1.2", "clone": "2.1.2",
"i18next": "15.1.2", "i18next": "15.1.2",
"json-stringify-safe": "5.0.1", "json-stringify-safe": "5.0.1",
"jsonata": "1.7.0", "jsonata": "1.8.0",
"when": "3.7.8" "when": "3.7.8"
} }
} }

View File

@ -3,5 +3,7 @@ npm install --no-save \
wdio-chromedriver-service@^0.1.5 \ wdio-chromedriver-service@^0.1.5 \
wdio-mocha-framework@^0.6.4 \ wdio-mocha-framework@^0.6.4 \
wdio-spec-reporter@^0.1.5 \ wdio-spec-reporter@^0.1.5 \
webdriverio@^4.14.1 \ webdriverio@^4.14.4 \
chromedriver@^78.0.1 chromedriver@^79.0.0 \
wdio-browserstack-service@^0.1.19 \
browserstack-local@^1.4.4

View File

@ -27,6 +27,12 @@ var shortCutKeyMapForMac = {
}; };
function getShortCutKey(type) { function getShortCutKey(type) {
if (process.env.BROWSERSTACK) {
if (browser.desiredCapabilities.os === 'OS X') {
return shortCutKeyMapForMac[type];
}
return shortCutKeyMap[type];
}
if (os.type() === 'Darwin') { if (os.type() === 'Darwin') {
return shortCutKeyMapForMac[type]; return shortCutKeyMapForMac[type];
} }

View File

@ -14,6 +14,7 @@
* limitations under the License. * limitations under the License.
**/ **/
var browserstack = require('browserstack-local');
exports.config = { exports.config = {
// //
@ -48,27 +49,20 @@ exports.config = {
// and 30 processes will get spawned. The property handles how many capabilities // and 30 processes will get spawned. The property handles how many capabilities
// from the same test should run tests. // from the same test should run tests.
// //
maxInstances: 10, // maxInstances: 10,
// //
// If you have trouble getting all important capabilities together, check out the // If you have trouble getting all important capabilities together, check out the
// Sauce Labs platform configurator - a great tool to configure your capabilities: // Sauce Labs platform configurator - a great tool to configure your capabilities:
// https://docs.saucelabs.com/reference/platforms-configurator // https://docs.saucelabs.com/reference/platforms-configurator
// //
capabilities: [{ // capabilities: [{
// maxInstances can get overwritten per capability. So if you have an in-house Selenium // 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 // grid with only 5 firefox instances available you can make sure that not more than
// 5 instances get started at a time. // 5 instances get started at a time.
maxInstances: 2, // maxInstances: 5,
// //
browserName: 'chrome', // browserName: 'firefox'
'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']
},
}],
// //
// =================== // ===================
// Test Configurations // Test Configurations
@ -103,7 +97,7 @@ exports.config = {
baseUrl: 'http://localhost', baseUrl: 'http://localhost',
// //
// Default timeout for all waitFor* commands. // Default timeout for all waitFor* commands.
waitforTimeout: 10000, waitforTimeout: 20000,
// //
// Default timeout in milliseconds for request // Default timeout in milliseconds for request
// if Selenium Grid doesn't send response // 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 // 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 // your test setup with almost no effort. Unlike plugins, they don't add new
// commands. Instead, they hook themselves up into the test process. // commands. Instead, they hook themselves up into the test process.
port: 9515, //services: ['chromedriver'],
path: '/',
services: ['chromedriver'],
// //
// Framework you want to run your specs with. // Framework you want to run your specs with.
// The following are supported: Mocha, Jasmine, and Cucumber // The following are supported: Mocha, Jasmine, and Cucumber
@ -155,7 +147,7 @@ exports.config = {
// Options to be passed to Mocha. // Options to be passed to Mocha.
// See the full list at http://mochajs.org/ // See the full list at http://mochajs.org/
mochaOpts: { mochaOpts: {
timeout: 100000, timeout: 1000000,
ui: 'bdd' ui: 'bdd'
}, },
// //
@ -171,8 +163,44 @@ exports.config = {
* @param {Object} config wdio configuration object * @param {Object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details * @param {Array.<Object>} 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 * Gets executed just before initialising the webdriver session and test framework. It allows you
* to manipulate configurations depending on the capability or spec. * to manipulate configurations depending on the capability or spec.
@ -267,6 +295,44 @@ exports.config = {
* @param {Object} config wdio configuration object * @param {Object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details * @param {Array.<Object>} 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=<BrowserStack user name>');
console.log('BROWSERSTACK_ACCESS_KEY=<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']
}
}];
} }

View File

@ -143,6 +143,10 @@ describe("@node-red/util/util", function() {
cloned.req.should.equal(msg.req); cloned.req.should.equal(msg.req);
cloned.res.should.equal(msg.res); 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() { describe('getObjectProperty', function() {
it('gets a property beginning with "msg."', 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++) { for (var i = 0; i < 1000; i++) {
msg.msg.obj.big += 'some more string '; msg.msg.obj.big += 'some more string ';
} }
var result = util.encodeObject(msg); var result = util.encodeObject(msg);
result.format.should.eql("error"); result.format.should.eql("error");
var resultJson = JSON.parse(result.msg); 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'); throw new Error('Exception in toString - should have been caught');
} }
msg.msg.constructor = { name: "strangeobj" }; msg.msg.constructor = { name: "strangeobj" };
var result = util.encodeObject(msg); var result = util.encodeObject(msg);
var success = (result.msg.indexOf('[Type not printable]') >= 0); var success = (result.msg.indexOf('[Type not printable]') >= 0);
success.should.eql(true); success.should.eql(true);
@ -872,11 +876,11 @@ describe("@node-red/util/util", function() {
var msg = { var msg = {
msg: { msg: {
mystrangeobj:"hello", mystrangeobj:"hello",
constructor: { constructor: {
get name(){ get name(){
throw new Error('Exception in constructor name'); throw new Error('Exception in constructor name');
} }
} }
}, },
}; };
var result = util.encodeObject(msg); var result = util.encodeObject(msg);