From 58f3a76da76e65cc53f8d8ca7ff60b3e1579083e Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Sat, 15 Jan 2022 20:39:05 +0900 Subject: [PATCH 1/3] fix to make actions list i18n ready and Japanese translation --- .../editor-client/locales/ja/editor.json | 132 ++++++++++++++++++ .../editor-client/src/js/ui/actionList.js | 19 ++- .../editor-client/src/js/ui/keyboard.js | 45 ++++-- 3 files changed, 184 insertions(+), 12 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json index 17054c0d3..2bee33955 100644 --- a/packages/node_modules/@node-red/editor-client/locales/ja/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/ja/editor.json @@ -1151,5 +1151,137 @@ "ru": "ロシア語", "zh-CN": "中国語(簡体)", "zh-TW": "中国語(繁体)" + }, + "action-list": { + "toggle-show-tips" : "ヒント表示切替", + "show-about" : "Node-REDの説明を表示", + "show-welcome-tour": "ウェルカムツアー表示", + "show-next-tab": "次のタブを表示", + "show-previous-tab": "前のタブを表示", + "add-flow": "フローを追加", + "add-flow-to-right": "フローを右に追加", + "edit-flow": "フローを編集", + "remove-flow": "フローを削除", + "enable-flow": "フローを有効化", + "disable-flow": "フローを無効化", + "hide-flow": "フローを隠す", + "hide-other-flows": "他のフローを非表示", + "hide-all-flows": "全てのフローを非表示", + "show-all-flows": "全てのフローを表示", + "show-last-hidden-flow": "最後に非表示にしたフローを表示", + "list-hidden-flows": "非表示フローを表示", + "list-flows": "フロー一覧", + "list-subflows": "サブフロー一覧", + "go-to-previous-location": "前の位置に移動", + "go-to-next-location": "次の位置に移動", + "copy-selection-to-internal-clipboard": "選択をクリップボードにコピー", + "cut-selection-to-internal-clipboard": "選択をクリップボードに切り取り", + "paste-from-internal-clipboard": "クリップボードから貼り付け", + "detach-selected-nodes": "選択ノードを接続から外す", + "delete-selection": "選択を削除", + "delete-selection-and-reconnect": "選択を削除し再接続", + "edit-selected-node": "選択したノードを編集", + "go-to-selection": "選択に移動", + "undo": "変更操作を戻す", + "redo": "変更操作をやり直し", + "select-all-nodes": "全てのノードを選択", + "select-none": "ノードを選択", + "enable-selected-nodes": "選択ノードを有効化", + "disable-selected-nodes": "選択ノードを無効化", + "toggle-show-grid": "グリッド表示切替", + "toggle-snap-grid": "ノードの配置補助切替", + "toggle-status": "ステータス表示切替", + "show-selected-node-labels": "選択したノードのラベルを表示", + "hide-selected-node-labels": "選択したノードのラベルを非表示", + "scroll-view-up": "上スクロール", + "scroll-view-right": "右スクロール", + "scroll-view-down": "下スクロール", + "scroll-view-left": "左スクロール", + "step-view-up": "一単位上スクロール", + "step-view-right": "一単位右スクロール", + "step-view-down": "一単位下スクロール", + "step-view-left": "一単位左スクロール", + "move-selection-up": "選択を上移動", + "move-selection-right": "選択を右移動", + "move-selection-down": "選択を下移動", + "move-selection-left": "選択を左移動", + "move-selection-forwards": "選択を前面に移動", + "move-selection-backwards": "選択を背面に移動", + "move-selection-to-front": "選択を最前面に移動", + "move-selection-to-back": "選択を最背面に移動", + "step-selection-up": "選択を一単位上移動", + "step-selection-right": "選択を一単位右移動", + "step-selection-down": "選択を一単位下移動", + "step-selection-left": "選択を一単位左移動", + "select-connected-nodes": "接続されたノードを選択", + "select-downstream-nodes": "後方に接続されたノードを選択", + "select-upstream-nodes": "前方に接続されたノードを選択", + "go-to-next-node": "次のノードに移動", + "go-to-previous-node": "前のノードに移動", + "go-to-next-sibling": "次の兄弟ノードに移動", + "go-to-previous-sibling": "前の兄弟ノードに移動", + "go-to-nearest-node-on-left": "最も近い左側ノードに移動", + "go-to-nearest-node-on-right": "最も近い右側ノードに移動", + "go-to-nearest-node-above": "最も近い上側ノードに移動", + "go-to-nearest-node-below": "最も近い下側ノードに移動", + "align-selection-to-grid": "選択を整列", + "align-selection-to-left": "選択を左揃え", + "align-selection-to-right": "選択を右揃え", + "align-selection-to-top": "選択を上揃え", + "align-selection-to-bottom": "選択を下揃え", + "align-selection-to-middle": "選択を上下中央揃え", + "align-selection-to-center": "選択を左右中央揃え", + "distribute-selection-horizontally": "選択を左右に整列", + "distribute-selection-vertically": "選択を上下に整列", + "wire-series-of-nodes": "ノードを一続きに接続", + "wire-node-to-multiple": "ノードを複数に接続", + "show-user-settings": "ユーザ設定を表示", + "show-help": "ヘルプを表示", + "toggle-palette": "パレットの表示切替", + "show-event-log": "イベントログを表示", + "manage-palette": "パレットの管理", + "toggle-sidebar": "サイドバーの表示切替", + "show-info-tab": "ノード情報タブの表示", + "show-help-tab": "ノードヘルプタブの表示", + "show-config-tab": "設定ノードタブの表示", + "select-all-config-nodes": "全ての設定ノードを選択", + "delete-config-selection": "選択した設定ノードを削除", + "show-context-tab": "コンテクキストデータタブを表示", + "create-subflow": "サブフローを作成", + "convert-to-subflow": "選択をサブフローに変換", + "group-selection": "選択をグループ化", + "ungroup-selection": "選択をグループ解除", + "merge-selection-to-group": "選択をグループにマージ", + "remove-selection-from-group": "選択をグループから削除", + "copy-group-style": "グループのスタイルをコピー", + "paste-group-style": "グループのスタイルを貼り付け", + "show-export-dialog": "書き出しダイアログを表示", + "show-import-dialog": "読み込みダイアログを表示", + "show-library-export-dialog": "ライブラリ書き出しダイアログを表示", + "show-library-import-dialog": "ライブラリ読み込みダイアログを表示", + "show-examples-import-dialog": "サンプル読み込みダイアログを表示", + "search": "検索", + "show-action-list": "アクション一覧を表示", + "confirm-edit-tray": "編集を完了", + "cancel-edit-tray": "編集をキャンセル", + "show-remote-diff": "リモートとの変更差分を表示", + "deploy-flows": "フローをデプロイ", + "restart-flows": "フローを再起動", + "set-deploy-type-to-full": "デプロイを「全て」に設定", + "set-deploy-type-to-modified-flows": "デプロイを「変更したフロー」に設定", + "set-deploy-type-to-modified-nodes": "デプロイを「変更したノード」に設定", + "show-debug-tab": "デバッグタブを表示", + "clear-debug-messages": "デバッグメッセージをクリア", + "clear-filtered-debug-messages": "フィルタしたデバッグメッセージをクリア", + "activate-selected-debug-nodes": "選択したデバッグノードを有効化", + "activate-all-debug-nodes": "全てのデバッグノードを有効化", + "activate-all-flow-debug-nodes" : "フロー内の全デバッグノードを有効化", + "deactivate-selected-debug-nodes": "選択したデバッグノードを無効化", + "deactivate-all-debug-nodes": "全てのデバッグノードを無効化", + "deactivate-all-flow-debug-nodes": "フロー内の全デバッグノードを無効化", + "zoom-in": "ズームイン", + "zoom-out": "ズームアウト", + "zoom-reset": "ズームリセット", + "toggle-navigator": "ナビゲータ表示切替" } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js index a1ed26afb..5496ee1f4 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js @@ -164,11 +164,26 @@ RED.actionList = (function() { searchResults.editableList('empty'); results = []; var actions = RED.actions.list(); + actions.forEach(function (sc) { + var id = sc.id.replace(/^.*:/,""); + var key = "action-list."+id; + var translation = RED._(key); + if (translation !== key) { + sc.translation = translation; + } + }); actions.sort(function(A,B) { - return A.id.localeCompare(B.id); + var Aid = A.translation ? A.translation : A.id; + var Bid = B.translation ? B.translation : B.id; + return Aid.localeCompare(Bid); }); actions.forEach(function(action) { - action.label = action.id.replace(/:/,": ").replace(/-/g," ").replace(/(^| )./g,function() { return arguments[0].toUpperCase()}); + if (action.translation) { + action.label = action.translation; + } + else { + action.label = action.id.replace(/:/,": ").replace(/-/g," ").replace(/(^| )./g,function() { return arguments[0].toUpperCase()}); + } action._label = action.label.toLowerCase(); searchResults.editableList('addItem',action) }) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js index 5c1be9c2b..c722d0411 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js @@ -588,13 +588,16 @@ RED.keyboard = (function() { var item = $('
').appendTo(container); container.data('data',object); - var text = object.id.replace(/(^.+:([a-z]))|(-([a-z]))/g,function() { - if (arguments[5] === 0) { - return arguments[2].toUpperCase(); - } else { - return " "+arguments[4].toUpperCase(); - } - }); + var text = object.translation; + if (!object.translation) { + text = object.id.replace(/(^.+:([a-z]))|(-([a-z]))/g,function() { + if (arguments[5] === 0) { + return arguments[2].toUpperCase(); + } else { + return " "+arguments[4].toUpperCase(); + } + }); + } var label = $('
').addClass("keyboard-shortcut-entry-text").text(text).appendTo(item); var user = $('').prependTo(label); @@ -635,7 +638,14 @@ RED.keyboard = (function() { } else { filterValue = filterValue.replace(/\s/g,""); shortcutList.editableList('filter', function(data) { - return data.id.toLowerCase().replace(/^.*:/,"").replace("-","").indexOf(filterValue) > -1; + var label; + if (data.translation) { + label = data.translation.toLowerCase(); + } + else { + label = data.id.toLowerCase().replace(/^.*:/,"").replace("-",""); + } + return label.indexOf(filterValue) > -1; }) } } @@ -656,9 +666,24 @@ RED.keyboard = (function() { }); var shortcuts = RED.actions.list(); + var missing = []; + shortcuts.forEach(function (sc) { + var id = sc.id.replace(/^.*:/,""); + var key = "action-list."+id; + var translation = RED._(key); + + if (translation !== key) { + sc.translation = translation; + } + else { + missing.push(id); + } + }); + // console.log("; missing:", missing); + shortcuts.sort(function(A,B) { - var Aid = A.id.replace(/^.*:/,"").replace(/[ -]/g,"").toLowerCase(); - var Bid = B.id.replace(/^.*:/,"").replace(/[ -]/g,"").toLowerCase(); + var Aid = A.translation ? A.translation : A.id.replace(/^.*:/,"").replace(/[ -]/g,"").toLowerCase(); + var Bid = B.translation ? B.translation : B.id.replace(/^.*:/,"").replace(/[ -]/g,"").toLowerCase(); return Aid.localeCompare(Bid); }); knownShortcuts = new Set(); From 6657b2629f8c459990b2291f115cb13368588443 Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Sun, 16 Jan 2022 12:10:19 +0900 Subject: [PATCH 2/3] move i18n code to action list according to PR comment --- .../editor-client/src/js/ui/actionList.js | 26 ++--- .../editor-client/src/js/ui/actions.js | 49 +++++++-- .../editor-client/src/js/ui/keyboard.js | 100 +++++++----------- 3 files changed, 82 insertions(+), 93 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js index 5496ee1f4..4886deabb 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js @@ -160,33 +160,19 @@ RED.actionList = (function() { createDialog(); } dialog.slideDown(300); - searchInput.searchBox('value',v) + searchInput.searchBox('value',v); searchResults.editableList('empty'); results = []; var actions = RED.actions.list(); - actions.forEach(function (sc) { - var id = sc.id.replace(/^.*:/,""); - var key = "action-list."+id; - var translation = RED._(key); - if (translation !== key) { - sc.translation = translation; - } - }); actions.sort(function(A,B) { - var Aid = A.translation ? A.translation : A.id; - var Bid = B.translation ? B.translation : B.id; - return Aid.localeCompare(Bid); + var Akey = A.label; + var Bkey = B.label; + return Akey.localeCompare(Bkey); }); actions.forEach(function(action) { - if (action.translation) { - action.label = action.translation; - } - else { - action.label = action.id.replace(/:/,": ").replace(/-/g," ").replace(/(^| )./g,function() { return arguments[0].toUpperCase()}); - } action._label = action.label.toLowerCase(); - searchResults.editableList('addItem',action) - }) + searchResults.editableList('addItem',action); + }); RED.events.emit("actionList:open"); visible = true; } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/actions.js b/packages/node_modules/@node-red/editor-client/src/js/ui/actions.js index c7c5dd950..4f0379adf 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/actions.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/actions.js @@ -1,33 +1,39 @@ RED.actions = (function() { var actions = { - } + }; - function addAction(name,handler) { + function addAction(name,handler,options) { if (typeof handler !== 'function') { throw new Error("Action handler not a function"); } if (actions[name]) { throw new Error("Cannot override existing action"); } - actions[name] = handler; + actions[name] = { + handler: handler, + options: options, + }; } function removeAction(name) { - delete actions[name]; + delete actions[name].handler; } function getAction(name) { - return actions[name]; + return actions[name].handler; } function invokeAction() { var args = Array.prototype.slice.call(arguments); var name = args.shift(); if (actions.hasOwnProperty(name)) { - actions[name].apply(null, args); + var handler = actions[name].handler; + handler.apply(null, args); } } function listActions() { var result = []; + var missing = []; Object.keys(actions).forEach(function(action) { + var def = actions[action]; var shortcut = RED.keyboard.getShortcut(action); var isUser = false; if (shortcut) { @@ -35,13 +41,38 @@ RED.actions = (function() { } else { isUser = !!RED.keyboard.getUserShortcut(action); } + if (!def.label) { + var name = action; + var options = def.options; + var key = options ? options.label : undefined; + if (!key) { + key = "action-list." +name.replace(/^.*:/,""); + } + var label = RED._(key); + if (label === key) { + // no translation. convert `name` to description + label = name.replace(/(^.+:([a-z]))|(-([a-z]))/g, function() { + if (arguments[5] === 0) { + return arguments[2].toUpperCase(); + } else { + return " "+arguments[4].toUpperCase(); + } + }); + missing.push(key); + } + def.label = label; + } + //console.log("; missing:", missing); + result.push({ id:action, scope:shortcut?shortcut.scope:undefined, key:shortcut?shortcut.key:undefined, - user:isUser - }) - }) + user:isUser, + label: def.label, + options: def.options, + }); + }); return result; } return { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js index c722d0411..cecb408bd 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js @@ -49,15 +49,15 @@ RED.keyboard = (function() { "]": 221, "{": 219,// <- QWERTY specific "}": 221 // <- QWERTY specific - } + }; var metaKeyCodes = { 16: true, 17: true, 18: true, 91: true, 93: true - } - var actionToKeyMap = {} + }; + var actionToKeyMap = {}; var defaultKeyMap = {}; // FF generates some different keycodes because reasons. @@ -65,7 +65,7 @@ RED.keyboard = (function() { 59:186, 61:187, 173:189 - } + }; function migrateOldKeymap() { // pre-0.18 @@ -80,7 +80,7 @@ RED.keyboard = (function() { } function getUserKey(action) { - return RED.settings.get('editor.keymap',{})[action] + return RED.settings.get('editor.keymap',{})[action]; } function mergeKeymaps(defaultKeymap, themeKeymap) { @@ -105,7 +105,7 @@ RED.keyboard = (function() { scope:scope, key:key, user:false - }) + }); } } } @@ -115,13 +115,13 @@ RED.keyboard = (function() { if (themeKeymap.hasOwnProperty(action)) { if (!themeKeymap[action].key) { // No key for this action - default is no keybinding - delete mergedKeymap[action] + delete mergedKeymap[action]; } else { mergedKeymap[action] = [{ scope: themeKeymap[action].scope || "*", key: themeKeymap[action].key, user: false - }] + }]; if (mergedKeymap[action][0].scope === "workspace") { mergedKeymap[action][0].scope = "red-ui-workspace"; } @@ -179,7 +179,7 @@ RED.keyboard = (function() { close: function() { RED.menu.refreshShortcuts(); } - }) + }); } function revertToDefault(action) { @@ -327,7 +327,7 @@ RED.keyboard = (function() { scope:scope, key:key, user:false - } + }; } if (!ondown) { var userAction = getUserKey(cbdown); @@ -350,7 +350,7 @@ RED.keyboard = (function() { } } } else { - keys.push([key,mod]) + keys.push([key,mod]); } var slot = handlers; for (i=0;i').appendTo(scope); scopeSelect.i18n(); @@ -495,7 +494,7 @@ RED.keyboard = (function() { scopeSelect.val(object.scope||'*'); scopeSelect.on("change", function() { keyInput.trigger("change"); - }) + }); var div = $('
').appendTo(scope); var okButton = $('').appendTo(div); @@ -521,10 +520,13 @@ RED.keyboard = (function() { id:object.id, scope:shortcut?shortcut.scope:undefined, key:shortcut?shortcut.key:undefined, - user:shortcut?shortcut.user:undefined - } + user:shortcut?shortcut.user:undefined, + + label: object.label, + options: object.options, + }; buildShortcutRow(container,obj); - }) + }); keyInput.trigger("focus"); } @@ -559,7 +561,7 @@ RED.keyboard = (function() { delete object.scope; } else { keyDiv.parent().removeClass("keyboard-shortcut-entry-unassigned"); - keyDiv.append(RED.keyboard.formatKey(key)) + keyDiv.append(RED.keyboard.formatKey(key)); $("").text(scope).appendTo(scopeDiv); object.key = key; object.scope = scope; @@ -572,7 +574,7 @@ RED.keyboard = (function() { userKeymap[object.id] = { scope:shortcut.scope, key:shortcut.key - } + }; RED.settings.set('editor.keymap',userKeymap); } } @@ -588,16 +590,7 @@ RED.keyboard = (function() { var item = $('
').appendTo(container); container.data('data',object); - var text = object.translation; - if (!object.translation) { - text = object.id.replace(/(^.+:([a-z]))|(-([a-z]))/g,function() { - if (arguments[5] === 0) { - return arguments[2].toUpperCase(); - } else { - return " "+arguments[4].toUpperCase(); - } - }); - } + var text = object.label; var label = $('
').addClass("keyboard-shortcut-entry-text").text(text).appendTo(item); var user = $('').prependTo(label); @@ -638,15 +631,9 @@ RED.keyboard = (function() { } else { filterValue = filterValue.replace(/\s/g,""); shortcutList.editableList('filter', function(data) { - var label; - if (data.translation) { - label = data.translation.toLowerCase(); - } - else { - label = data.id.toLowerCase().replace(/^.*:/,"").replace("-",""); - } + var label = data.label.toLowerCase(); return label.indexOf(filterValue) > -1; - }) + }); } } }); @@ -666,25 +653,10 @@ RED.keyboard = (function() { }); var shortcuts = RED.actions.list(); - var missing = []; - shortcuts.forEach(function (sc) { - var id = sc.id.replace(/^.*:/,""); - var key = "action-list."+id; - var translation = RED._(key); - - if (translation !== key) { - sc.translation = translation; - } - else { - missing.push(id); - } - }); - // console.log("; missing:", missing); - shortcuts.sort(function(A,B) { - var Aid = A.translation ? A.translation : A.id.replace(/^.*:/,"").replace(/[ -]/g,"").toLowerCase(); - var Bid = B.translation ? B.translation : B.id.replace(/^.*:/,"").replace(/[ -]/g,"").toLowerCase(); - return Aid.localeCompare(Bid); + var Akey = A.label; + var Bkey = B.label; + return Akey.localeCompare(Bkey); }); knownShortcuts = new Set(); shortcuts.forEach(function(s) { From 2da9161f290a3fa6897815e328e39245f549db8c Mon Sep 17 00:00:00 2001 From: Hiroyasu Nishiyama Date: Tue, 25 Jan 2022 21:21:39 +0900 Subject: [PATCH 3/3] Update packages/node_modules/@node-red/editor-client/src/js/ui/actions.js Oh, I'm sorry about this. Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/editor-client/src/js/ui/actions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/actions.js b/packages/node_modules/@node-red/editor-client/src/js/ui/actions.js index 4f0379adf..2273ae9ab 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/actions.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/actions.js @@ -16,7 +16,7 @@ RED.actions = (function() { }; } function removeAction(name) { - delete actions[name].handler; + delete actions[name]; } function getAction(name) { return actions[name].handler;