via 中文化

中文化 via 界面部分菜单和按键注释

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         via 中文化
// @namespace    cc.kayanouriko.via.syringe
// @version      1.0.0
// @author       kayanouriko
// @description  中文化 via 界面部分菜单和按键注释
// @license      MIT
// @icon         https://www.caniusevia.com/favicon-32x32.png
// @match        https://usevia.app/*
// ==/UserScript==

(function() {
  "use strict";
  const configure = {
    "Authorize device": "授权设备",
    "Searching for devices...": "正在搜索设置...",
    Keymap: "键映射",
    Macros: "宏设置",
    "Save + Load": "保存 / 加载",
    Lighting: "灯效修改",
    Layer: "层",
    "Authorize New": "授权新设备",
    Basic: "基础按键",
    Media: "多媒体按键",
    Macro: "宏相关",
    Layers: "层相关",
    Special: "特殊按键",
    "QMK Lighting": "QMK 灯效",
    Custom: "自定义按键",
    // 宏
    "Enter text directly, or wrap": "请输入文本, 或者使用",
    "in ": "",
    "{}": "",
    "Basic Keycodes": "基本键码",
    "Single tap: ": "单击按键: ",
    "Chord: ": "连续输入: ",
    "Delay (ms): ": "延时 (单位毫秒): ",
    "Tap 'Enter' at end of macro": "执行完宏后自动回车",
    "Type ? to search for keycodes": "按键格式? 请搜索 qmk basic keycodes.",
    // 加载保存
    "Save Current Layout": "保存当前布局的配置文件到本地",
    Save: "保存",
    "Load Saved Layout": "导入本地的布局配置文件",
    // 灯效
    Backlight: "背景灯效",
    Brightness: "亮度",
    Effect: "灯效类型",
    "Effect Speed": "灯效速度",
    Color: "灯光颜色"
  };
  const design = {
    "Load Draft Definition": "导入原定设计的布局配置",
    Load: "导入",
    "Use V2 definitions (deprecated)": "使用 V2 版本的布局配置 (已弃用)",
    "Draft Definitions": "已有的布局配置"
  };
  const global = {
    "Loading...": "加载中..."
  };
  const keycodes = {
    // 基础键码中的特殊按键
    "KC_NO: Nothing": "KC_NO: 忽略这个按键",
    "KC_TRNS: Pass-through": "KC_TRNS: 响应低一层不是 KC_TRNS 状态的按键",
    // 数字键盘
    "KC_P1: Numpad 1": "KC_P1: 数字键盘 1",
    "KC_P2: Numpad 2": "KC_P2: 数字键盘 2",
    "KC_P3: Numpad 3": "KC_P3: 数字键盘 3",
    "KC_P4: Numpad 4": "KC_P4: 数字键盘 4",
    "KC_P5: Numpad 5": "KC_P5: 数字键盘 5",
    "KC_P6: Numpad 6": "KC_P6: 数字键盘 6",
    "KC_P7: Numpad 7": "KC_P7: 数字键盘 7",
    "KC_P8: Numpad 8": "KC_P8: 数字键盘 8",
    "KC_P9: Numpad 9": "KC_P9: 数字键盘 9",
    "KC_P0: Numpad 0": "KC_P0: 数字键盘 0",
    "KC_PSLS: Numpad /": "KC_PSLS: 数字键盘 /",
    "KC_PAST: Numpad *": "KC_PAST: 数字键盘 *",
    "KC_PMNS: Numpad -": "KC_PMNS: 数字键盘 -",
    "KC_PPLS: Numpad +": "KC_PPLS: 数字键盘 +",
    "KC_PDOT: Numpad .": "KC_PDOT: 数字键盘 .",
    "KC_PENT: Numpad Enter": "KC_PENT: 数字键盘 Enter",
    // 多媒体
    "KC_VOLD: Volume Down": "KC_VOLD: 音量减小",
    "KC_VOLU: Volume Up": "KC_VOLU: 音量增大",
    "KC_MUTE: Mute Audio": "KC_MUTE: 全局静音 / 取消",
    "KC_MPLY: Play/Pause": "KC_MPLY: 播放 / 暂停",
    "KC_MSTP: Media Stop": "KC_MSTP: 停止播放",
    "KC_MPRV: Media Previous": "KC_MPRV: 播放上一曲目",
    "KC_MNXT: Media Next": "KC_MNXT: 播放下一曲目",
    "KC_MFFD: Fast Forward": "KC_MFFD: 播放快进",
    "KC_MRWD: Rewind": "KC_MRWD: 播放倒退",
    "KC_MSEL: Media Select": "KC_MSEL: 启动播放器",
    "KC_EJCT: Media Eject": "KC_EJCT: 退出播放器",
    // layer
    "FN_MO13: Hold = Layer 1, Hold with Fn2 = Layer 3": "FN_MO13: 长按切换至层1, 和 fn2 一起长按切换至层3.",
    "FN_MO23: Hold = Layer 2, Hold with Fn1 = Layer 3": "FN_MO23: 长按切换至层2, 和 fn1 一起长按切换至层3.",
    "SPC_FN1: Hold = Layer 1, Tap = Space": 'SPC_FN1: 长按切换至层1, 单击为 "空格".',
    "SPC_FN2: Hold = Layer 2, Tap = Space": 'SPC_FN2: 长按切换至层2, 单击为 "空格".',
    "SPC_FN3: Hold = Layer 3, Tap = Space": 'SPC_FN3: 长按切换至层3, 单击为 "空格".',
    "MO(0): Momentary turn layer 0 on": "MO(0): 按下时将层0设置为开启状态, 松开按键后则层0回到关闭状态.",
    "MO(1): Momentary turn layer 1 on": "MO(1): 按下时将层1设置为开启状态, 松开按键后则层1回到关闭状态.",
    "MO(2): Momentary turn layer 2 on": "MO(2): 按下时将层2设置为开启状态, 松开按键后则层2回到关闭状态.",
    "MO(3): Momentary turn layer 3 on": "MO(3): 按下时将层3设置为开启状态, 松开按键后则层3回到关闭状态.",
    "MO(4): Momentary turn layer 4 on": "MO(4): 按下时将层4设置为开启状态, 松开按键后则层4回到关闭状态.",
    "MO(5): Momentary turn layer 5 on": "MO(5): 按下时将层5设置为开启状态, 松开按键后则层5回到关闭状态.",
    "MO(6): Momentary turn layer 6 on": "MO(6): 按下时将层6设置为开启状态, 松开按键后则层6回到关闭状态.",
    "MO(7): Momentary turn layer 7 on": "MO(7): 按下时将层7设置为开启状态, 松开按键后则层7回到关闭状态.",
    "MO(8): Momentary turn layer 8 on": "MO(8): 按下时将层8设置为开启状态, 松开按键后则层8回到关闭状态.",
    "MO(9): Momentary turn layer 9 on": "MO(9): 按下时将层9设置为开启状态, 松开按键后则层9回到关闭状态.",
    "TG(0): Toggle layer 0 on/off": "TG(0): 如果层0时关闭状态, 按下后则变成开启状态, 反之亦然.",
    "TG(1): Toggle layer 1 on/off": "TG(1): 如果层1时关闭状态, 按下后则变成开启状态, 反之亦然.",
    "TG(2): Toggle layer 2 on/off": "TG(2): 如果层2时关闭状态, 按下后则变成开启状态, 反之亦然.",
    "TG(3): Toggle layer 3 on/off": "TG(3): 如果层3时关闭状态, 按下后则变成开启状态, 反之亦然.",
    "TG(4): Toggle layer 4 on/off": "TG(4): 如果层4时关闭状态, 按下后则变成开启状态, 反之亦然.",
    "TG(5): Toggle layer 5 on/off": "TG(5): 如果层5时关闭状态, 按下后则变成开启状态, 反之亦然.",
    "TG(6): Toggle layer 6 on/off": "TG(6): 如果层6时关闭状态, 按下后则变成开启状态, 反之亦然.",
    "TG(7): Toggle layer 7 on/off": "TG(7): 如果层7时关闭状态, 按下后则变成开启状态, 反之亦然.",
    "TG(8): Toggle layer 8 on/off": "TG(8): 如果层8时关闭状态, 按下后则变成开启状态, 反之亦然.",
    "TG(9): Toggle layer 9 on/off": "TG(9): 如果层9时关闭状态, 按下后则变成开启状态, 反之亦然.",
    "TT(0): Normally acts like MO unless it's tapped multple times which toggles layer 0 on": "TT(0): 功能与 MO(0) 类似, 不同的是多次点击后, 则将层0设置为开启状态, 松开后并不会恢复关闭状态, 默认需要连续按5次.",
    "TT(1): Normally acts like MO unless it's tapped multple times which toggles layer 1 on": "TT(1): 功能与 MO(1) 类似, 不同的是多次点击后, 则将层1设置为开启状态, 松开后并不会恢复关闭状态, 默认需要连续按5次.",
    "TT(2): Normally acts like MO unless it's tapped multple times which toggles layer 2 on": "TT(2): 功能与 MO(2) 类似, 不同的是多次点击后, 则将层2设置为开启状态, 松开后并不会恢复关闭状态, 默认需要连续按5次.",
    "TT(3): Normally acts like MO unless it's tapped multple times which toggles layer 3 on": "TT(3): 功能与 MO(3) 类似, 不同的是多次点击后, 则将层3设置为开启状态, 松开后并不会恢复关闭状态, 默认需要连续按5次.",
    "TT(4): Normally acts like MO unless it's tapped multple times which toggles layer 4 on": "TT(4): 功能与 MO(4) 类似, 不同的是多次点击后, 则将层4设置为开启状态, 松开后并不会恢复关闭状态, 默认需要连续按5次.",
    "TT(5): Normally acts like MO unless it's tapped multple times which toggles layer 5 on": "TT(5): 功能与 MO(5) 类似, 不同的是多次点击后, 则将层5设置为开启状态, 松开后并不会恢复关闭状态, 默认需要连续按5次.",
    "TT(6): Normally acts like MO unless it's tapped multple times which toggles layer 6 on": "TT(6): 功能与 MO(6) 类似, 不同的是多次点击后, 则将层6设置为开启状态, 松开后并不会恢复关闭状态, 默认需要连续按5次.",
    "TT(7): Normally acts like MO unless it's tapped multple times which toggles layer 7 on": "TT(7): 功能与 MO(7) 类似, 不同的是多次点击后, 则将层7设置为开启状态, 松开后并不会恢复关闭状态, 默认需要连续按5次.",
    "TT(8): Normally acts like MO unless it's tapped multple times which toggles layer 8 on": "TT(8): 功能与 MO(8) 类似, 不同的但是多次点击后, 则将层8设置为开启状态, 松开后并不会恢复关闭状态, 默认需要连续按5次.",
    "TT(9): Normally acts like MO unless it's tapped multple times which toggles layer 9 on": "TT(9): 功能与 MO(9) 类似, 不同的是多次点击后, 则将层9设置为开启状态, 松开后并不会恢复关闭状态, 默认需要连续按5次.",
    "OSL(0): Switch to layer 0 for one keypress": "OSL(0): 暂时切换至层0, 直到按下下一个键.",
    "OSL(1): Switch to layer 1 for one keypress": "OSL(1): 暂时切换至层1, 直到按下下一个键.",
    "OSL(2): Switch to layer 2 for one keypress": "OSL(2): 暂时切换至层2, 直到按下下一个键.",
    "OSL(3): Switch to layer 3 for one keypress": "OSL(3): 暂时切换至层3, 直到按下下一个键.",
    "OSL(4): Switch to layer 4 for one keypress": "OSL(4): 暂时切换至层4, 直到按下下一个键.",
    "OSL(5): Switch to layer 5 for one keypress": "OSL(5): 暂时切换至层5, 直到按下下一个键.",
    "OSL(6): Switch to layer 6 for one keypress": "OSL(6): 暂时切换至层6, 直到按下下一个键.",
    "OSL(7): Switch to layer 7 for one keypress": "OSL(7): 暂时切换至层7, 直到按下下一个键.",
    "OSL(8): Switch to layer 8 for one keypress": "OSL(8): 暂时切换至层8, 直到按下下一个键.",
    "OSL(9): Switch to layer 9 for one keypress": "OSL(9): 暂时切换至层9, 直到按下下一个键.",
    "TO(0): Turn on layer 0 when pressed": "TO(0): 切换到层0, 并且停用其余所有层数(除了默认层)",
    "TO(1): Turn on layer 1 when pressed": "TO(1): 切换到层1, 并且停用其余所有层数(除了默认层)",
    "TO(2): Turn on layer 2 when pressed": "TO(2): 切换到层2, 并且停用其余所有层数(除了默认层)",
    "TO(3): Turn on layer 3 when pressed": "TO(3): 切换到层3, 并且停用其余所有层数(除了默认层)",
    "TO(4): Turn on layer 4 when pressed": "TO(4): 切换到层4, 并且停用其余所有层数(除了默认层)",
    "TO(5): Turn on layer 5 when pressed": "TO(5): 切换到层5, 并且停用其余所有层数(除了默认层)",
    "TO(6): Turn on layer 6 when pressed": "TO(6): 切换到层6, 并且停用其余所有层数(除了默认层)",
    "TO(7): Turn on layer 7 when pressed": "TO(7): 切换到层7, 并且停用其余所有层数(除了默认层)",
    "TO(8): Turn on layer 8 when pressed": "TO(8): 切换到层8, 并且停用其余所有层数(除了默认层)",
    "TO(9): Turn on layer 9 when pressed": "TO(9): 切换到层9, 并且停用其余所有层数(除了默认层)",
    "DF(0): Sets the default layer 0": "DF(0): 切换至层0并设置成默认层",
    "DF(1): Sets the default layer 1": "DF(1): 切换至层1并设置成默认层",
    "DF(2): Sets the default layer 2": "DF(2): 切换至层2并设置成默认层",
    "DF(3): Sets the default layer 3": "DF(3): 切换至层3并设置成默认层",
    "DF(4): Sets the default layer 4": "DF(4): 切换至层4并设置成默认层",
    "DF(5): Sets the default layer 5": "DF(5): 切换至层5并设置成默认层",
    "DF(6): Sets the default layer 6": "DF(6): 切换至层6并设置成默认层",
    "DF(7): Sets the default layer 7": "DF(7): 切换至层7并设置成默认层",
    "DF(8): Sets the default layer 8": "DF(8): 切换至层8并设置成默认层",
    "DF(9): Sets the default layer 9": "DF(9): 切换至层9并设置成默认层",
    // 特殊按键
    "KC_GESC: Esc normally, but ` when Shift or Win is pressed": 'KC_GESC: 通常为 Esc, 和 Shift 或者 Win 长按时为 "`"',
    "KC_LSPO: Left Shift when held, ( when tapped": 'KC_LSPO: 长按为 "左Shift", 单击为 "("',
    "KC_RSPC: Right Shift when held, ) when tapped": 'KC_RSPC: 长按为 "右Shift", 单击为 ")"',
    "KC_LCPO: Left Control when held, ( when tapped": 'KC_LCPO: 长按为 "左Control", 单击为 "("',
    "KC_RCPC: Right Control when held, ) when tapped": 'KC_RCPC: 长按为 "右Control", 单击为 ")"',
    "KC_LAPO: Left Alt when held, ( when tapped": 'KC_LAPO: 长按为 "左Alt", 单击为 "("',
    "KC_RAPC: Right Alt when held, ) when tapped": 'KC_RAPC: 长按为 "右Alt", 单击为 ")"',
    "KC_SFTENT: Right Shift when held, Enter when tapped": 'KC_SFTENT: 长按为 "右Shift", 单击为 "Enter"',
    "Enter any QMK Keycode": "输入任意 QMK 键码",
    "RESET: Reset the keyboard": "RESET: 重置键盘",
    "MAGIC_TOGGLE_NKRO: Toggle NKRO": "MAGIC_TOGGLE_NKRO: 全键无冲 开启 / 关闭",
    KC_PWR: "KC_PWR: Windows 关机",
    KC_POWER: "KC_POWER: macOS 关机",
    KC_SLEP: "KC_SLEP: 睡眠",
    KC_WAKE: "KC_WAKE: 唤醒",
    KC_CALC: "KC_CALC: 打开应用 计算器",
    KC_MAIL: "KC_MAIL: 打开应用 邮件",
    KC_HELP: "KC_HELP: 打开应用 帮助",
    KC_MS_BTN1: "KC_MS_BTN1: 鼠标左键",
    KC_MS_BTN2: "KC_MS_BTN2: 鼠标右键",
    KC_MS_WH_UP: "KC_MS_WH_UP: 鼠标滚轮向上滚动",
    KC_MS_WH_DOWN: "KC_MS_WH_DOWN: 鼠标滚轮向下滚动",
    KC_MS_WH_LEFT: "KC_MS_WH_LEFT: 鼠标滚轮向左滚动",
    KC_MS_WH_RIGHT: "KC_MS_WH_RIGHT: 鼠标滚动向右滚动",
    "Please enter your desired QMK keycode or hex code:": "请输入您想要的 QMK 键码或十六进制代码:",
    Confirm: "确定",
    Cancel: "取消",
    // qmk 灯效
    BL_TOGG: "BL_TOGG: 背光 打开 / 关闭",
    BL_STEP: "BL_STEP: 循环切换背光等级",
    BL_ON: "BL_ON: 将背光设置为最大等级",
    BL_OFF: "BL_OFF: 关闭背光",
    BL_UP: "BL_UP: 增加背光级别",
    BL_DOWN: "BL_DOWN: 降低背光级别",
    BL_BRTG: "BL_BRTG: 切换背光级别",
    RGB_TOG: "RGB_TOG: RGB灯效 打开 / 关闭",
    RGB_MOD: "RGB_MOD: 正向循环切换RGB灯效模式, 按住 Shift 时反向循环",
    RGB_RMOD: "RGB_RMOD: 反向循环切换RGB灯效模式, 按住 Shift 时正向循环",
    RGB_HUI: "RGB_HUI: 增加色相(改变颜色), 按住 Shift 时降低色相(改变颜色)",
    RGB_HUD: "RGB_HUD: 降低色相(改变颜色), 按住 Shift 时增加色相(改变颜色)",
    RGB_SAI: "RGB_SAI: 增加饱和度, 按住 Shift 时降低饱和度",
    RGB_SAD: "RGB_SAD: 降低饱和度, 按住 Shift 时增加饱和度",
    RGB_VAI: "RGB_VAI: 增加亮度, 按住 Shift 时降低亮度",
    RGB_VAD: "RGB_VAD: 降低亮度, 按住 Shift 时增加亮度",
    RGB_SPI: "RGB_SPI: 提高灯效速度, 按住 Shift 时降低灯效速度",
    RGB_SPD: "RGB_SPD: 降低灯效速度, 按住 Shift 时提高灯效速度",
    "RGB_M_P: Plain": "RGB_M_P: 静态(无动画)模式",
    "RGB_M_B: Breathe": "RGB_M_B: 呼吸动画模式",
    "RGB_M_R: Rainbow": "RGB_M_R: 彩虹动画模式",
    "RGB_M_SW: Swirl": "RGB_M_SW: 漩涡动画模式",
    "RGB_M_SN: Snake": "RGB_M_SN: 蛇形动画模式",
    "RGB_M_K: Knight": "RGB_M_K: 霹雳游侠动画模式",
    "RGB_M_X: Xmas": "RGB_M_X: 圣诞动画模式",
    "RGB_M_G: Gradient": "RGB_M_G: 渐变动画模式"
  };
  const keytester = {
    "Reset Keyboard": "重置按键测试状态",
    "Test Matrix": "使用键盘实际布局"
  };
  const settings = {
    "Show Design tab": "显示设计标签"
  };
  const tab = {
    Configure: "配置布局",
    "Key Tester": "按键测试",
    Design: "设计",
    Settings: "设置"
  };
  const datas = {
    ...configure,
    ...design,
    ...global,
    ...keycodes,
    ...keytester,
    ...settings,
    ...tab
  };
  function getTranslateText(key) {
    return datas[key];
  }
  function start() {
    const nodeIterator = document.createNodeIterator(document.body);
    translate(nodeIterator);
    addObserver();
  }
  function addObserver() {
    const observer = new MutationObserver((mutations) => {
      mutations.forEach((mutation) => {
        mutation.addedNodes.forEach((node) => {
          translateNode(node);
          if (node.childNodes) {
            const nodeIterator = document.createNodeIterator(node);
            translate(nodeIterator);
          }
        });
      });
    });
    observer.observe(document, {
      childList: true,
      subtree: true
    });
  }
  function translate(nodeIterator) {
    let node = nodeIterator.nextNode();
    while (node) {
      translateNode(node);
      node = nodeIterator.nextNode();
    }
  }
  function translateNode(node) {
    if (!node.nodeName) {
      return;
    }
    if (isText(node)) {
      const text = node.textContent;
      if (!text) {
        return;
      }
      const translateText = getTranslateText(text);
      if (translateText === void 0) {
        return;
      }
      node.textContent = translateText;
    }
  }
  function isText(node) {
    return node != null && node.nodeType === Node.TEXT_NODE;
  }
  function ready(callback) {
    if (document.readyState === "loading") {
      document.addEventListener("DOMContentLoaded", callback, { passive: true, once: true });
    } else {
      callback();
    }
  }
  const version = "1.0.0";
  function startLog() {
    const usName = "via 中文化";
    console.log(
      `%c ${usName} %c v${version} `,
      "padding: 2px 1px; border-radius: 3px 0 0 3px; color: #fff; background: #606060; font-weight: bold;",
      "padding: 2px 1px; border-radius: 0 3px 3px 0; color: #fff; background: #42c02e; font-weight: bold;",
      `脚本已注入网页!`
    );
  }
  ready(() => {
    startLog();
    start();
  });
})();