diff --git a/src/components/keyboard/KeyBoard.vue b/src/components/keyboard/KeyBoard.vue index c5cd027..3bafcad 100644 --- a/src/components/keyboard/KeyBoard.vue +++ b/src/components/keyboard/KeyBoard.vue @@ -18,7 +18,9 @@ import { useGlobalStore } from "../../store/global"; import { DropdownOption, NDropdown, useDialog, useMessage } from "naive-ui"; import { onBeforeRouteLeave } from "vue-router"; import { useKeyboardStore } from "../../store/keyboard"; +import { useI18n } from "vue-i18n"; +const { t } = useI18n(); const store = useGlobalStore(); const keyboardStore = useKeyboardStore(); const dialog = useDialog(); @@ -27,27 +29,27 @@ const message = useMessage(); const addButtonPos = ref({ x: 0, y: 0 }); const addButtonOptions: DropdownOption[] = [ { - label: "普通点击", + label: () => t("pages.KeyBoard.addButton.Tap"), key: "Tap", }, { - label: "键盘行走", + label: () => t("pages.KeyBoard.addButton.SteeringWheel"), key: "SteeringWheel", }, { - label: "技能", + label: () => t("pages.KeyBoard.addButton.Skill"), key: "DirectionalSkill", }, { - label: "技能取消", + label: () => t("pages.KeyBoard.addButton.CancelSkill"), key: "CancelSkill", }, { - label: "观察视角", + label: () => t("pages.KeyBoard.addButton.Observation"), key: "Observation", }, { - label: "宏", + label: () => t("pages.KeyBoard.addButton.Macro"), key: "Macro", }, ]; @@ -83,7 +85,7 @@ function onAddButtonSelect( } else if (type === "DirectionalSkill") { (keyMapping as unknown as KeyDirectionalSkill).range = 30; } else if (type === "CancelSkill") { - keyMapping.note = "取消技能"; + keyMapping.note = t("pages.KeyBoard.addButton.CancelSkill"); } else if (type === "Observation") { (keyMapping as unknown as KeyMappingObservation).scale = 0.6; } else if (type === "Macro") { @@ -141,7 +143,7 @@ function setCurButtonKey(curKey: string) { return; if (!isKeyUnique(curKey)) { - message.error("按键重复:" + curKey); + message.error(t("pages.KeyBoard.buttonKeyRepeat", [curKey])); return; } @@ -250,16 +252,16 @@ onBeforeRouteLeave(() => { document.removeEventListener("wheel", handleMouseWheel); if (keyboardStore.edited) { dialog.warning({ - title: "Warning", - content: "当前方案尚未保存,是否保存?", - positiveText: "保存", - negativeText: "取消", + title: t("pages.KeyBoard.noSaveDialog.title"), + content: t("pages.KeyBoard.noSaveDialog.content"), + positiveText: t("pages.KeyBoard.noSaveDialog.positiveText"), + negativeText: t("pages.KeyBoard.noSaveDialog.negativeText"), onPositiveClick: () => { if (store.applyEditKeyMappingList()) { keyboardStore.edited = false; resolve(true); } else { - message.error("存在重复按键,无法保存"); + message.error(t("pages.KeyBoard.noSaveDialog.keyRepeat")); resolve(false); } }, diff --git a/src/components/keyboard/KeyCommon.vue b/src/components/keyboard/KeyCommon.vue index bf82a83..381e188 100644 --- a/src/components/keyboard/KeyCommon.vue +++ b/src/components/keyboard/KeyCommon.vue @@ -16,6 +16,7 @@ import { import { CloseCircle, Settings } from "@vicons/ionicons5"; import { KeyCommon, KeyMacro, KeyMacroList } from "../../keyMappingConfig"; import { useKeyboardStore } from "../../store/keyboard"; +import { useI18n } from "vue-i18n"; const props = defineProps<{ index: number; @@ -23,6 +24,7 @@ const props = defineProps<{ const keyboardStore = useKeyboardStore(); +const { t } = useI18n(); const store = useGlobalStore(); const message = useMessage(); const elementRef = ref(null); @@ -139,10 +141,10 @@ function saveMacro() { (keyMapping.value as KeyMacro).macro = macro; showMacroModal.value = false; keyboardStore.edited = true; - message.success("宏代码解析成功,但不保证代码正确性,请自行测试"); + message.success(t("pages.KeyBoard.KeyCommon.macroParseSuccess")); } catch (e) { console.error(e); - message.error("宏代码保存失败,请检查代码格式是否正确"); + message.error(t("pages.KeyBoard.KeyCommon.macroParseFailed")); } } @@ -213,29 +215,40 @@ function showSetting() { ? "普通点击" : "宏" }} - - 编辑代码 + + + {{ $t("pages.KeyBoard.KeyCommon.editMacro") }} + - + - + - + @@ -245,33 +258,36 @@ function showSetting() { v-model:show="showMacroModal" @before-leave="saveMacro" > - + -
按下按键执行
+
{{ $t("pages.KeyBoard.KeyCommon.macroModal.down") }}
-
按住执行
+
{{ $t("pages.KeyBoard.KeyCommon.macroModal.loop") }}
-
抬起执行
+
{{ $t("pages.KeyBoard.KeyCommon.macroModal.up") }}
- Key Info + {{ $t('pages.KeyBoard.KeyInfo.title') }}
{{ mouseX }}, {{ mouseY }}
-
Press any key
+
{{ $t('pages.KeyBoard.KeyInfo.note') }}
{{ code }}
diff --git a/src/components/keyboard/KeyObservation.vue b/src/components/keyboard/KeyObservation.vue index e9f7232..07efc09 100644 --- a/src/components/keyboard/KeyObservation.vue +++ b/src/components/keyboard/KeyObservation.vue @@ -124,27 +124,27 @@ function showSetting() { top: `${settingPosY}px`, }" > - 观察视角 - + {{ $t("pages.KeyBoard.Observation.observation") }} + - + - + diff --git a/src/components/keyboard/KeySetting.vue b/src/components/keyboard/KeySetting.vue index 4184df7..aecafba 100644 --- a/src/components/keyboard/KeySetting.vue +++ b/src/components/keyboard/KeySetting.vue @@ -18,7 +18,9 @@ import { Store } from "@tauri-apps/plugin-store"; import { loadDefaultKeyconfig } from "../../invoke"; import { KeyMappingConfig } from "../../keyMappingConfig"; import { useKeyboardStore } from "../../store/keyboard"; +import { useI18n } from "vue-i18n"; +const { t } = useI18n(); const store = useGlobalStore(); const keyboardStore = useKeyboardStore(); const localStore = new Store("store.bin"); @@ -126,7 +128,7 @@ function dragHandler(downEvent: MouseEvent) { keyboardStore.showSettingFlag && store.keyMappingConfigList.length === 1 ) { - message.info("当前仅有一个按键方案,点击导入默认,可导入预设方案"); + message.info(t("pages.KeyBoard.KeySetting.onlyOneConfig")); } } }; @@ -139,14 +141,14 @@ function importKeyMappingConfig() { keyMappingConfig = JSON.parse(importModalInputValue.value); } catch (e) { console.error(e); - message.error("导入失败"); + message.error(t("pages.KeyBoard.KeySetting.importFailed")); return; } store.keyMappingConfigList.push(keyMappingConfig); store.setKeyMappingIndex(store.keyMappingConfigList.length - 1); showImportModal.value = false; localStore.set("keyMappingConfigList", store.keyMappingConfigList); - message.success("按键方案已导入"); + message.success(t("pages.KeyBoard.KeySetting.importSuccess")); } async function importDefaultKeyMappingConfig() { @@ -161,17 +163,17 @@ async function importDefaultKeyMappingConfig() { } } catch (e) { console.error(e); - message.error("默认按键方案导入失败"); + message.error(t("pages.KeyBoard.KeySetting.importDefaultFailed")); return; } localStore.set("keyMappingConfigList", store.keyMappingConfigList); - message.success(`已导入${count}个默认方案`); + message.success(t("pages.KeyBoard.KeySetting.importDefaultSuccess", [count])); } function createKeyMappingConfig() { if (keyboardStore.edited) { - message.error("请先保存或还原当前方案"); + message.error(t("pages.KeyBoard.KeySetting.configEdited")); return; } @@ -179,7 +181,7 @@ function createKeyMappingConfig() { "keyboardElement" ) as HTMLElement; const newConfig: KeyMappingConfig = { - title: "新方案", + title: t("pages.KeyBoard.KeySetting.newConfig"), relativeSize: { w: keyboardElement.clientWidth, h: keyboardElement.clientHeight, @@ -189,18 +191,21 @@ function createKeyMappingConfig() { store.keyMappingConfigList.push(newConfig); store.setKeyMappingIndex(store.keyMappingConfigList.length - 1); localStore.set("keyMappingConfigList", store.keyMappingConfigList); - message.success("新方案已创建"); + message.success(t("pages.KeyBoard.KeySetting.newConfigSuccess")); } function copyCurKeyMappingConfig() { if (keyboardStore.edited) { - message.error("请先保存或还原当前方案"); + message.error(t("pages.KeyBoard.KeySetting.configEdited")); return; } const curConfig = store.keyMappingConfigList[store.curKeyMappingIndex]; + const newTitle = t("pages.KeyBoard.KeySetting.copyConfigTitle", [ + curConfig.title, + ]); const newConfig: KeyMappingConfig = { - title: curConfig.title + "-副本", + title: newTitle, relativeSize: curConfig.relativeSize, list: curConfig.list, }; @@ -209,12 +214,12 @@ function copyCurKeyMappingConfig() { keyboardStore.activeSteeringWheelButtonKeyIndex = -1; store.setKeyMappingIndex(store.keyMappingConfigList.length - 1); localStore.set("keyMappingConfigList", store.keyMappingConfigList); - message.success("方案已复制为:" + curConfig.title + "-副本"); + message.success(t("pages.KeyBoard.KeySetting.copyConfigSuccess", [newTitle])); } function delCurKeyMappingConfig() { if (store.keyMappingConfigList.length <= 1) { - message.error("至少保留一个方案"); + message.error(t("pages.KeyBoard.KeySetting.delConfigLeast")); return; } const title = store.keyMappingConfigList[store.curKeyMappingIndex].title; @@ -228,7 +233,7 @@ function delCurKeyMappingConfig() { store.curKeyMappingIndex > 0 ? store.curKeyMappingIndex - 1 : 0 ); localStore.set("keyMappingConfigList", store.keyMappingConfigList); - message.success("方案已删除:" + title); + message.success(t("pages.KeyBoard.KeySetting.delSuccess", [title])); } function renameKeyMappingConfig() { @@ -237,9 +242,9 @@ function renameKeyMappingConfig() { if (newTitle !== "") { store.keyMappingConfigList[store.curKeyMappingIndex].title = newTitle; localStore.set("keyMappingConfigList", store.keyMappingConfigList); - message.success("方案已重命名为:" + newTitle); + message.success(t("pages.KeyBoard.KeySetting.renameSuccess", [newTitle])); } else { - message.error("方案名不能为空"); + message.error(t("pages.KeyBoard.KeySetting.renameEmpty")); } } @@ -249,11 +254,11 @@ function exportKeyMappingConfig() { navigator.clipboard .writeText(data) .then(() => { - message.success("当前按键方案已导出到剪切板"); + message.success(t("pages.KeyBoard.KeySetting.exportSuccess")); }) .catch((e) => { console.error(e); - message.error("按键方案导出失败"); + message.error(t("pages.KeyBoard.KeySetting.exportFailed")); }); } @@ -261,7 +266,7 @@ function saveKeyMappingConfig() { if (store.applyEditKeyMappingList()) { keyboardStore.edited = false; } else { - message.error("存在重复按键,无法保存"); + message.error(t("pages.KeyBoard.KeySetting.saveKeyRepeat")); } } @@ -278,14 +283,16 @@ function checkConfigSize() { keyboardElement.clientHeight !== relativeSize.h ) { message.warning( - `请注意当前按键方案"${curKeyMappingConfig.title}"与蒙版尺寸不一致,若有需要可进行迁移` + t("pages.KeyBoard.KeySetting.checkConfigSizeWarning", [ + curKeyMappingConfig.title, + ]) ); } } function migrateKeyMappingConfig() { if (keyboardStore.edited) { - message.error("请先保存或还原当前按键方案"); + message.error(t("pages.KeyBoard.KeySetting.configEdited")); return; } @@ -313,25 +320,29 @@ function migrateKeyMappingConfig() { keyMapping.posY = Math.round((keyMapping.posY / relativeSize.h) * sizeH); } // migrate title - newConfig.title += "-迁移"; + newConfig.title = t("pages.KeyBoard.KeySetting.migrateConfigTitle", [ + newConfig.title, + ]); store.keyMappingConfigList.splice( store.curKeyMappingIndex + 1, 0, newConfig ); - message.success("已迁移到新方案:" + newConfig.title); + message.success( + t("pages.KeyBoard.KeySetting.migrateConfigSuccess", [newConfig.title]) + ); keyboardStore.activeButtonIndex = -1; keyboardStore.activeSteeringWheelButtonKeyIndex = -1; store.setKeyMappingIndex(store.curKeyMappingIndex + 1); } else { - message.info("当前方案符合蒙版尺寸,无需迁移"); + message.info(t("pages.KeyBoard.KeySetting.migrateConfigNeedless")); } } function selectKeyMappingConfig(index: number) { if (keyboardStore.edited) { - message.error("请先保存或还原当前按键方案"); + message.error(t("pages.KeyBoard.KeySetting.configEdited")); return; } @@ -355,7 +366,7 @@ function resetKeyMappingConfig() { size="large" class="key-setting-btn" id="keySettingBtn" - title="长按可拖动" + :title="$t('pages.KeyBoard.KeySetting.buttonDrag')" @mousedown="dragHandler" :style="{ left: keySettingPos.x + 'px', @@ -381,50 +392,73 @@ function resetKeyMappingConfig() { > - 按键方案 + {{ $t("pages.KeyBoard.KeySetting.config") }} - Relative Size:{{ curRelativeSize.w }}x{{ curRelativeSize.h }} + {{ + $t("pages.KeyBoard.KeySetting.configRelativeSize", [ + curRelativeSize.w, + curRelativeSize.h, + ]) + }} - 新建方案 - 复制方案 - 迁移方案 - 删除方案 + {{ + $t("pages.KeyBoard.KeySetting.createConfig") + }} + {{ + $t("pages.KeyBoard.KeySetting.copyConfig") + }} + {{ + $t("pages.KeyBoard.KeySetting.migrateConfig") + }} + {{ + $t("pages.KeyBoard.KeySetting.delConfig") + }} 重命名{{ $t("pages.KeyBoard.KeySetting.renameConfig") }} - 其他 + {{ $t("pages.KeyBoard.KeySetting.others") }} 导入方案{{ $t("pages.KeyBoard.KeySetting.importConfig") }} - 导出方案 - 导入默认 + {{ + $t("pages.KeyBoard.KeySetting.exportConfig") + }} + {{ + $t("pages.KeyBoard.KeySetting.importDefaultConfig") + }} 按键信息{{ $t("pages.KeyBoard.KeySetting.keyInfo") }} - 提示:右键空白区域可添加按键 + {{ + $t("pages.KeyBoard.KeySetting.addButtonTip") + }}
@@ -432,24 +466,27 @@ function resetKeyMappingConfig() { - 导入 + {{ + $t("pages.KeyBoard.KeySetting.import") + }} - + - 重命名 + {{ + $t("pages.KeyBoard.KeySetting.renameConfig") + }} diff --git a/src/components/keyboard/KeySkill.vue b/src/components/keyboard/KeySkill.vue index b886eb0..2b886b5 100644 --- a/src/components/keyboard/KeySkill.vue +++ b/src/components/keyboard/KeySkill.vue @@ -260,27 +260,30 @@ function updateRangeIndicator(element?: HTMLElement) { top: `${settingPosY}px`, }" > - 技能 - + {{ $t("pages.KeyBoard.KeySkill.skill") }} + 双击施放{{ $t("pages.KeyBoard.KeySkill.double") }} 无方向技能{{ $t("pages.KeyBoard.KeySkill.directionless") }} 按下时触发{{ $t("pages.KeyBoard.KeySkill.triggerWhenPressed") }} - + - + - + diff --git a/src/components/keyboard/KeySteeringWheel.vue b/src/components/keyboard/KeySteeringWheel.vue index ed8cc86..d8b0754 100644 --- a/src/components/keyboard/KeySteeringWheel.vue +++ b/src/components/keyboard/KeySteeringWheel.vue @@ -184,26 +184,28 @@ function showSetting() { top: `${settingPosY}px`, }" > - 键盘行走 - + {{ + $t("pages.KeyBoard.SteeringWheel.steeringWheel") + }} + - + - + diff --git a/src/i18n/en-US.json b/src/i18n/en-US.json index 8978b1e..888fedd 100644 --- a/src/i18n/en-US.json +++ b/src/i18n/en-US.json @@ -110,6 +110,108 @@ "curVersion": "Current version: {0}", "checkUpdate": "Check for updates" } + }, + "KeyBoard": { + "noSaveDialog": { + "title": "Warning", + "content": "The current plan has not been saved. Do you want to save it?", + "positiveText": "Save", + "negativeText": "Cancel", + "keyRepeat": "There are duplicate keystrokes and cannot be saved." + }, + "addButton": { + "SteeringWheel": "SteeringWheel", + "Tap": "Tap", + "Skill": "Skill", + "CancelSkill": "CancelSkill", + "Observation": "Observation", + "Macro": "Macro" + }, + "buttonKeyRepeat": "Key repeat: {0}", + "KeyCommon": { + "macroParseSuccess": "The macro code is parsed successfully, but the correctness of the code is not guaranteed. Please test by yourself.", + "macroParseFailed": "Macro code failed to save, please check whether the code format is correct.", + "macro": "Macro code", + "editMacro": "Edit macro", + "macroModal": { + "title": "Macro editor", + "down": "Macro executed on key press", + "placeholder": "JSON macro code, can be empty", + "loop": "Macro executed on key press and hold", + "up": "Macro executed on key up" + } + }, + "setting": { + "touchTime": "Touch duration", + "touchTimePlaceholder": "Touch duration (ms)", + "pointerID": "Pointer ID", + "pointerIDPlaceholder": "Please enter Pointer ID", + "note": "Note", + "notePlaceholder": "Please enter note" + }, + "KeyInfo": { + "title": "按键信息", + "note": "按下任意键" + }, + "Observation": { + "observation": "Observation", + "scale": "Sensitivity", + "scalePlaceholder": "Please enter sensitivity" + }, + "KeySetting": { + "onlyOneConfig": "There is currently only one config. Click Import Default to import the preset configs.", + "importFailed": "Import failed", + "importSuccess": "Key config has been imported", + "importDefaultFailed": "Import of default key config failed", + "importDefaultSuccess": "{0} default configs have been imported", + "configEdited": "Please save or reset the current config first", + "newConfig": "New Config", + "newConfigSuccess": "New config has been created", + "copyConfigTitle": "{0}-Copy", + "copyConfigSuccess": "The config has been copied as: {0}", + "delConfigLeast": "Keep at least one config", + "delSuccess": "Config deleted: {0}", + "renameSuccess": "Config has been renamed: {0}", + "renameEmpty": "Config name cannot be empty", + "exportSuccess": "The current key config has been exported to the clipboard", + "exportFailed": "Key config export failed", + "saveKeyRepeat": "There are duplicate key and cannot be saved.", + "checkConfigSizeWarning": "Please note that the current key config \"{0}\" is inconsistent with the mask size. You can migrate it if necessary.", + "migrateConfigTitle": "{0}-Migrate", + "migrateConfigSuccess": "Migrated to new config: {0}", + "migrateConfigNeedless": "The current config conforms to the mask size and does not need to be migrated", + "buttonDrag": "Long press to drag", + "config": "Key mapping config", + "configRelativeSize": "Relative Mask Size: {0}x{1}", + "saveConfig": "Save config", + "resetConfig": "Reset config", + "renameConfig": "Rename", + "renameTitle": "Rename key config", + "import": "import", + "importPlaceholder": "Paste the JSON text of a key mapping config (the legality of the key mapping config cannot be judged here, please ensure that the JSON content is correct)", + "addButtonTip": "Tip: Right-click on the blank area to add buttons", + "keyInfo": "Key Info", + "importDefaultConfig": "Import default", + "exportConfig": "Export config", + "importConfig": "Import config", + "others": "Others", + "delConfig": "Delete config", + "migrateConfig": "Migration config", + "copyConfig": "Copy config", + "createConfig": "Create config" + }, + "KeySkill": { + "skill": "Skill", + "options": "Options", + "double": "Double click to cast", + "directionless": "Directionless skills", + "triggerWhenPressed": "Trigger when pressed", + "range": "Range" + }, + "SteeringWheel": { + "steeringWheel": "SteeringWheel", + "offset": "Offset" + } } }, "sidebar": { diff --git a/src/i18n/zh-CN.json b/src/i18n/zh-CN.json index d043492..008a1be 100644 --- a/src/i18n/zh-CN.json +++ b/src/i18n/zh-CN.json @@ -110,6 +110,108 @@ "checkUpdate": "检查更新", "checkUpdateOnStartup": "启动时检查软件更新" } + }, + "KeyBoard": { + "addButton": { + "Tap": "普通点击", + "SteeringWheel": "键盘行走", + "Skill": "技能", + "CancelSkill": "技能取消", + "Observation": "观察视角", + "Macro": "宏" + }, + "buttonKeyRepeat": "按键重复: {0}", + "noSaveDialog": { + "title": "警告", + "content": "当前方案尚未保存,是否保存?", + "positiveText": "保存", + "negativeText": "取消", + "keyRepeat": "存在重复按键,无法保存" + }, + "KeyCommon": { + "macroParseSuccess": "宏代码解析成功,但不保证代码正确性,请自行测试", + "macroParseFailed": "宏代码保存失败,请检查代码格式是否正确", + "macro": "宏代码", + "editMacro": "编辑宏代码", + "macroModal": { + "title": "宏编辑", + "down": "按下按键执行的宏", + "loop": "按住执行的宏", + "placeholder": "JSON宏代码, 可为空", + "up": "抬起执行的宏" + } + }, + "setting": { + "touchTime": "触摸时长", + "touchTimePlaceholder": "请输入触摸时长(ms)", + "pointerID": "触点ID", + "pointerIDPlaceholder": "请输入触点ID", + "note": "备注", + "notePlaceholder": "请输入备注" + }, + "KeyInfo": { + "title": "Key Info", + "note": "Press any key" + }, + "Observation": { + "observation": "观察视角", + "scale": "灵敏度", + "scalePlaceholder": "请输入灵敏度" + }, + "KeySetting": { + "onlyOneConfig": "当前仅有一个按键方案,点击导入默认,可导入预设方案", + "importFailed": "导入失败", + "importSuccess": "按键方案已导入", + "importDefaultFailed": "默认按键方案导入失败", + "importDefaultSuccess": "已导入{0}个默认方案", + "configEdited": "请先保存或还原当前方案", + "newConfig": "新方案", + "newConfigSuccess": "新方案已创建", + "copyConfigTitle": "{0}-副本", + "copyConfigSuccess": "方案已复制为:{0}", + "exportSuccess": "当前按键方案已导出到剪切板", + "exportFailed": "按键方案导出失败", + "checkConfigSizeWarning": "请注意当前按键方案\"{0}\"与蒙版尺寸不一致,若有需要可进行迁移", + "migrateConfigTitle": "{0}-迁移", + "migrateConfigSuccess": "已迁移到新方案:{0}", + "migrateConfigNeedless": "当前方案符合蒙版尺寸,无需迁移", + "buttonDrag": "长按可拖动", + "config": "按键映射方案", + "configRelativeSize": "相对蒙版尺寸: {0}x{1}", + "saveConfig": "保存方案", + "resetConfig": "还原方案", + "createConfig": "新建方案", + "copyConfig": "复制方案", + "migrateConfig": "迁移方案", + "delConfig": "删除方案", + "renameConfig": "重命名", + "others": "其他", + "importConfig": "导入方案", + "exportConfig": "导出方案", + "importDefaultConfig": "导入默认", + "keyInfo": "按键信息", + "addButtonTip": "提示:右键空白区域可添加按键", + "importPlaceholder": "粘贴单个按键方案的JSON文本 (此处无法对按键方案的合法性进行判断, 请确保JSON内容正确)", + "import": "导入", + "renameTitle": "重命名按键方案", + "delConfigLeast": "至少保留一个方案", + "delSuccess": "方案已删除:{0}", + "renameSuccess": "方案已重命名为:{0}", + "renameEmpty": "方案名不能为空", + "saveKeyRepeat": "存在重复按键,无法保存" + }, + "KeySkill": { + "skill": "技能", + "options": "选项", + "double": "双击施放", + "directionless": "无方向技能", + "triggerWhenPressed": "按下时触发", + "range": "范围" + }, + "SteeringWheel": { + "steeringWheel": "键盘行走", + "offset": "偏移" + } } }, "sidebar": {