Files
liuzhuohua 6df3a94b90 适配 arm64 Debian(Armbian 26.8.1 trixie):去掉架构假设
有用户要在 arm64 的 Debian 上跑 drouter。这一轮只对一个发行版做了适配
—— Armbian 26.8.1 trixie(Debian 13.6)/ aarch64 / 内核 6.18.35-ophub
(Amlogic S912 板),别的 arm64 发行版未验证,验证范围与实测数据全部
写在 docs/07-arm64-适配说明.md。

改掉的四处 x86 假设:

1. helper._read_bios():ARM 板既无 /sys/firmware/efi 也无 /sys/class/dmi,
   原代码把它们一律落到 else 分支,系统概览显示「传统 BIOS」(错的,
   这类机器根本没有 BIOS)。新增设备树分支,判据顺序 EFI → 设备树 → BIOS
   (树莓派 4 这类两可的机器要优先认 EFI);读 /proc/device-tree 与
   /sys/firmware/devicetree 两个候选路径,compatible 按 NUL 切开取第一条;
   没有 DMI 厂商时拿设备树板名顶上,厂商格不再空白。返回结构加 fw_type
   / is_dt / compat,旧字段一个没动。

2. update.py:离线包资源名原先写死 -offline-amd64,arm64 机器点一键更新
   会下载 x86 离线包,传几十 MB 才在装包阶段炸依赖。改为按
   dpkg --print-architecture 拼名(_deb_arch / build_assets),并为带架构
   后缀的附件在下载前先拿官方 SHA256SUMS 核对存在性,没有就明确报错。

3. packaging:离线包说明里两处写死的 amd64 换成 $ARCH(包名早就是变量拼的,
   但包里那份 README 还在教用户核对 amd64);build-docker.sh 新增可选的
   第 2 个参数 [arch],交叉构建时加 --platform 并给标签加 -<arch> 后缀,
   不传第二参数时行为与改动前逐字节一致。

4. web/i18n.js:给新增的「设备树 (Device Tree)」展示串登记英文,
   否则英文界面漏中文。

配套:
- _dev/t-arch.py(31 条判据)+ _dev/t-arch-inject.py(20 例反向验证)。
  反向验证抓出一条假绿:i18n 词条的 n/d 判据用了 300 字符松弛窗口,
  会跨到下一条词条,删掉本词条的 d 之后照样绿 —— 已收紧为本词条花括号内。
- _dev/run-static.py 的 EXCL 补上 t-update-inject —— 它名字也是 t- 前缀,
  之前一直被全量回归自动执行,会在回归过程中反复改写 backend/ 与 web/。
- devtools/verify-arm64.py:只读验收脚本,方便他人在自己的板子上复验。
- README 支持矩阵里 arm64 从「理论可用」改为「已实测 1 个发行版」。

本机全量静态回归 71 个检查器 / 0 失败;目标机上只读验证 12 条全通
(构建 753 396 字节的 deb / depcheck 73 项 / 8 个渲染模块 / 架构感知清单)。
目标机未安装 drouter,未启用任何服务,未改动网络。
2026-10-16 06:16:31 +08:00

7462 lines
711 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================ i18n 框架 ============================
多语言基础设施。设计目标:
① 零依赖、零构建 —— 静态文件直接引,与项目「不用打包器」的现状一致
② 切换语言**不刷新页面** —— 已渲染的 DOM 也要跟着变
③ 缺词**有可见降级** —— 显示中文原文并在控制台警告,不显示空白
④ 支持 {0} {1} 占位符,避免为拼接句子写死一堆变体
⑤ 持久化到 localStorage,下次打开记住选择
用法:
t('nav.dash') → '系统概览' / 'System Overview'
t('kv.version') → '版本' / 'Version'
t('upd.count', [n]) → '共 12 条' / '12 items'
t('unknown.key') → 'unknown.key'(并 warn)
⚠️ 为什么不用 data-i18n 属性遍历 DOM:
那样只能替换静态属性,**innerHTML 里拼出来的文案管不到** ——
而本项目大量文案是模板字符串里拼的。
所以这里用「t() 显式调用」,由代码来决定哪里需要翻译。
------------------------------------------------------------------------ */
(function () {
'use strict';
if (window.__drouterI18n) return;
window.__drouterI18n = true;
const STORE_KEY = 'drouter_lang';
const DEFAULT_LANG = 'zh-CN';
/* 字典。分组按页面/模块,方便分批补。
⚠️ 命名规则:点分路径 = 层级,值 = {zh, en}。
英文缺失时**必须**回落到中文(见 t() 的 pick)。 */
const DICT = {
/* == RAW == 批量补的词条(1.0.10):key 就是**中文原文**
(有些是整段 HTML)。由 _dev/apply-i18n.py 从 _dev/i18n-en*.py 生成,
改文案请改那几个数据文件再重跑脚本,不要手改这里。
lookup() 会先查 rawIndex()(中文原文直查),再查点分路径。 */
raw: {
' · 15 分钟 ': { zh: ' · 15 分钟 ', en: ' · 15 min ' },
' · 5 分钟 ': { zh: ' · 5 分钟 ', en: ' · 5 min ' },
' · 丢包 ': { zh: ' · 丢包 ', en: ' · packet loss ' },
' · 包名 ': { zh: ' · 包名 ', en: ' · Package name ' },
' · 含自定义 CSS': { zh: ' · 含自定义 CSS', en: ' · Includes custom CSS' },
' · 已截断': { zh: ' · 已截断', en: ' · Truncated' },
' · 已用 ': { zh: ' · 已用 ', en: ' · used ' },
' —— 救援页上所有的还原操作都要填它。只显示这一次,': { zh: ' —— 救援页上所有的还原操作都要填它。只显示这一次,', en: ' — every restore action on the rescue page needs it. It is shown only this once,' },
' ℃(来源 ': { zh: ' ℃(来源 ', en: ' °C (source ' },
' 个文件': { zh: ' 个文件', en: ' files' },
' 个文件与清单不符 —— 这个包在传输中损坏过,': { zh: ' 个文件与清单不符 —— 这个包在传输中损坏过,', en: ' files do not match the manifest — this package was corrupted during transfer,' },
' 个文件,': { zh: ' 个文件,', en: ' files,' },
' 个来源项在本机不存在(已跳过)': { zh: ' 个来源项在本机不存在(已跳过)', en: ' source items do not exist on this host (skipped)' },
' 副本': { zh: ' 副本', en: ' copy' },
' 加入 SMB 共享,请点击保存并应用': { zh: ' 加入 SMB 共享,请点击保存并应用', en: ' added to SMB shares; click Save & Apply' },
' 容器': { zh: ' 容器', en: ' containers' },
' 小时 ': { zh: ' 小时 ', en: ' h ' },
' 已连接': { zh: ' 已连接', en: ' connected' },
' 未连接': { zh: ' 未连接', en: ' disconnected' },
' 次日 ': { zh: ' 次日 ', en: ' next day ' },
' 步': { zh: ' 步', en: ' steps' },
' 的延迟': { zh: ' 的延迟', en: ' latency' },
' 秒检测一次': { zh: ' 秒检测一次', en: ' seconds' },
' 网关 ': { zh: ' 网关 ', en: ' Gateway ' },
' 转为静态绑定,请点击保存并应用': { zh: ' 转为静态绑定,请点击保存并应用', en: ' — converted to a static binding; click Save & Apply' },
' 镜像 · ': { zh: ' 镜像 · ', en: ' Mirror · ' },
' 项敏感内容': { zh: ' 项敏感内容', en: ' sensitive items' },
' 项未包含': { zh: ' 项未包含', en: ' items not included' },
' 项未包含(见下)': { zh: ' 项未包含(见下)', en: ' items not included (see below)' },
'%(剩余 ': { zh: '%(剩余 ', en: '% (free ' },
'%(可用 ': { zh: '%(可用 ', en: '% (available ' },
'/* ---- 作者自定义 CSS ---- */': { zh: '/* ---- 作者自定义 CSS ---- */', en: '/* ---- author custom CSS ---- */' },
'/kernel/drivers/net/wireguard</span> 下的模块文件是在的,': { zh: '/kernel/drivers/net/wireguard</span> 下的模块文件是在的,', en: 'The module file under /kernel/drivers/net/wireguard</span> is present,' },
'1 / 5 / 15 分钟': { zh: '1 / 5 / 15 分钟', en: '1 / 5 / 15 min' },
'1 分钟': { zh: '1 分钟', en: '1 min' },
'1 分钟 ': { zh: '1 分钟 ', en: '1 min ' },
'1 分钟 / 5 分钟 / 15 分钟': { zh: '1 分钟 / 5 分钟 / 15 分钟', en: '1 min / 5 min / 15 min' },
'1. modprobe wireguard(加载内核模块,本地操作)\\n': { zh: '1. modprobe wireguard(加载内核模块,本地操作)\\n', en: '1. modprobe wireguard (load the kernel module; local)\\n' },
'1. modprobe wireguard(加载内核模块,本地操作)\n': { zh: '1. modprobe wireguard(加载内核模块,本地操作)\n', en: '1. modprobe wireguard (load the kernel module; local)\\n' },
'1. modprobe wireguard(加载内核模块,本地操作)\\\\n': { zh: '1. modprobe wireguard(加载内核模块,本地操作)\\\\n', en: '1. modprobe wireguard (load the kernel module; local)\\n' },
'12 小时制': { zh: '12 小时制', en: '12-hour clock' },
'15 分钟': { zh: '15 分钟', en: '15 min' },
'2. 写 /etc/modules-load.d/drouter-wireguard.conf(开机自动加载)\\n': { zh: '2. 写 /etc/modules-load.d/drouter-wireguard.conf(开机自动加载)\\n', en: '2. write /etc/modules-load.d/drouter-wireguard.conf (load at boot)\\n' },
'2. 写 /etc/modules-load.d/drouter-wireguard.conf(开机自动加载)\n': { zh: '2. 写 /etc/modules-load.d/drouter-wireguard.conf(开机自动加载)\n', en: '2. write /etc/modules-load.d/drouter-wireguard.conf (load at boot)\\n' },
'2. 写 /etc/modules-load.d/drouter-wireguard.conf(开机自动加载)\\\\n': { zh: '2. 写 /etc/modules-load.d/drouter-wireguard.conf(开机自动加载)\\\\n', en: '2. write /etc/modules-load.d/drouter-wireguard.conf (load at boot)\\n' },
'24 小时制': { zh: '24 小时制', en: '24-hour clock' },
'3. 如果还没装,apt-get install wireguard-tools(需要联网下载)\\n\\n': { zh: '3. 如果还没装,apt-get install wireguard-tools(需要联网下载)\\n\\n', en: '3. apt-get install wireguard-tools if it is not installed yet (needs network access)\\n\\n' },
'3. 如果还没装,apt-get install wireguard-tools(需要联网下载)\n\n': { zh: '3. 如果还没装,apt-get install wireguard-tools(需要联网下载)\n\n', en: '3. apt-get install wireguard-tools if it is not installed yet (needs network access)\\n\\n' },
'3. 如果还没装,apt-get install wireguard-tools(需要联网下载)\\\\n\\\\n': { zh: '3. 如果还没装,apt-get install wireguard-tools(需要联网下载)\\\\n\\\\n', en: '3. apt-get install wireguard-tools if it is not installed yet (needs network access)\\n\\n' },
'465 走 SSL,587 走 STARTTLS,25 一般是明文': { zh: '465 走 SSL,587 走 STARTTLS,25 一般是明文', en: '465 uses SSL, 587 uses STARTTLS, 25 is usually plaintext' },
'5 分钟': { zh: '5 分钟', en: '5 min' },
'</span> 里没有 wireguard 模块,无法启动服务。': { zh: '</span> 里没有 wireguard 模块,无法启动服务。', en: ' has no wireguard module, so the service cannot start.' },
'<b>还没加载</b>,所以服务起不来。': { zh: '<b>还没加载</b>,所以服务起不来。', en: '<b>not loaded yet</b>, so the service cannot start.' },
'AC/AP 管理中心': { zh: 'AC/AP 管理中心', en: 'AC / AP Management' },
'CA 证书管理:建自己的 CA · 签发服务器证书 · 导入 · 部署给管理后台;附带 SSL/TLS 握手体检工具': { zh: 'CA 证书管理:建自己的 CA · 签发服务器证书 · 导入 · 部署给管理后台;附带 SSL/TLS 握手体检工具', en: 'CA management: build your own CA, sign server certificates, import them, deploy to the admin panel — plus an SSL/TLS handshake diagnostic' },
'CAKE 智能模式': { zh: 'CAKE 智能模式', en: 'CAKE smart mode' },
'CPU 温度': { zh: 'CPU 温度', en: 'CPU temperature' },
'CPU 温度 ': { zh: 'CPU 温度 ', en: 'CPU Temperature ' },
'CSS 已复制到剪贴板': { zh: 'CSS 已复制到剪贴板', en: 'CSS copied to clipboard' },
'CUPS 打印服务器': { zh: 'CUPS 打印服务器', en: 'CUPS Print Server' },
'CUPS 打印服务器 / USB 打印机 RAW 直通(互斥二选一),共享给手机与电脑': { zh: 'CUPS 打印服务器 / USB 打印机 RAW 直通(互斥二选一),共享给手机与电脑', en: 'CUPS print server / USB printer RAW passthrough (mutually exclusive), shared with phones and PCs' },
'Cloudflare 代理(1=开 / 0=关)': { zh: 'Cloudflare 代理(1=开 / 0=关)', en: 'Cloudflare proxy (1=on / 0=off)' },
'DDNS 已修改,点击下方「保存配置」生效': { zh: 'DDNS 已修改,点击下方「保存配置」生效', en: 'DDNS changed; click "Save settings" below to apply' },
'DHCP 服务': { zh: 'DHCP 服务', en: 'DHCP Service' },
'DHCP 服务与 Options': { zh: 'DHCP 服务与 Options', en: 'DHCP Service & Options' },
'DHCP 自动获取': { zh: 'DHCP 自动获取', en: 'DHCP (automatic)' },
'DHCP 自动(IPoE)': { zh: 'DHCP 自动(IPoE)', en: 'DHCP (IPoE)' },
'DHCPv6 / 前缀委派': { zh: 'DHCPv6 / 前缀委派', en: 'DHCPv6 / Prefix Delegation' },
'DHCPv6 与前缀委派': { zh: 'DHCPv6 与前缀委派', en: 'DHCPv6 & Prefix Delegation' },
'DMZ(对外暴露)': { zh: 'DMZ(对外暴露)', en: 'DMZ (exposed to the internet)' },
'DNS 服务': { zh: 'DNS 服务', en: 'DNS Service' },
'DNS 来源已改为「': { zh: 'DNS 来源已改为「', en: 'The DNS source has been changed to "' },
'Debian 官方内核与 PVE / KVM 虚拟机都自带。</span></div>': { zh: 'Debian 官方内核与 PVE / KVM 虚拟机都自带。</span></div>', en: 'Debian official kernels and PVE / KVM virtual machines ship with it.</span></div>' },
'Debian 走 udev 按需加载,/etc/modules 默认不写它。': { zh: 'Debian 走 udev 按需加载,/etc/modules 默认不写它。', en: 'Debian loads it on demand via udev, so it is not written to /etc/modules by default.' },
'Docker 与 Docker Compose 管理面板': { zh: 'Docker 与 Docker Compose 管理面板', en: 'Docker & Docker Compose Management' },
'Docker 引擎配置': { zh: 'Docker 引擎配置', en: 'Docker Engine Configuration' },
'IP 转发 · 出向伪装 · MSS 钳制 · BBR · SNMP,五项内核级开关(每项附说明与联动影响)': { zh: 'IP 转发 · 出向伪装 · MSS 钳制 · BBR · SNMP,五项内核级开关(每项附说明与联动影响)', en: 'IP forwarding · outbound masquerading · MSS clamping · BBR · SNMP — five kernel-level switches, each with an explanation of side effects' },
'IP 转发已开启': { zh: 'IP 转发已开启', en: 'IP forwarding enabled' },
'IP 转发未开启': { zh: 'IP 转发未开启', en: 'IP forwarding disabled' },
'IPoE + DHCPv6-PD(双栈)': { zh: 'IPoE + DHCPv6-PD(双栈)', en: 'IPoE + DHCPv6-PD (dual stack)' },
'IPv4 走 PPPoE、IPv6 通过 DHCPv6-PD 下发前缀,国内主流双栈方式。': { zh: 'IPv4 走 PPPoE、IPv6 通过 DHCPv6-PD 下发前缀,国内主流双栈方式。', en: 'IPv4 over PPPoE, IPv6 prefix delegated via DHCPv6-PD — the mainstream dual-stack setup in China.' },
'IPv4 防火墙': { zh: 'IPv4 防火墙', en: 'IPv4 Firewall' },
'IPv4/IPv6 均由上级自动下发,适用于光猫路由模式 + IPv6 直连。': { zh: 'IPv4/IPv6 均由上级自动下发,适用于光猫路由模式 + IPv6 直连。', en: 'Both IPv4 and IPv6 are handed down by the upstream device; suits an ONT in routing mode plus direct IPv6.' },
'IPv6 与路由通告': { zh: 'IPv6 与路由通告', en: 'IPv6 & Route Announcements' },
'IPv6 状态': { zh: 'IPv6 状态', en: 'IPv6 status' },
'IPv6 环境就绪': { zh: 'IPv6 环境就绪', en: 'IPv6 environment ready' },
'IPv6 连通性测试': { zh: 'IPv6 连通性测试', en: 'IPv6 Connectivity Test' },
'IPv6 防火墙': { zh: 'IPv6 防火墙', en: 'IPv6 Firewall' },
'IoT 设备专网': { zh: 'IoT 设备专网', en: 'Dedicated IoT network' },
'LAN 口设置': { zh: 'LAN 口设置', en: 'LAN Port' },
'LAN(局域网主口)': { zh: 'LAN(局域网主口)', en: 'LAN (main LAN port)' },
'MAC 地址格式不正确,应为 AA:BB:CC:DD:EE:FF': { zh: 'MAC 地址格式不正确,应为 AA:BB:CC:DD:EE:FF', en: 'Invalid MAC address format; it should be AA:BB:CC:DD:EE:FF' },
'NTP 时间同步': { zh: 'NTP 时间同步', en: 'NTP Time Sync' },
'OpenSOHO 无线控制器:集中管理 OpenWRT AP 的 Wi-Fi · VLAN · PoE': { zh: 'OpenSOHO 无线控制器:集中管理 OpenWRT AP 的 Wi-Fi · VLAN · PoE', en: 'OpenSOHO wireless controller: centrally manage OpenWRT APs — Wi-Fi · VLAN · PoE' },
'PPPoE + DHCPv6-PD(双栈)': { zh: 'PPPoE + DHCPv6-PD(双栈)', en: 'PPPoE + DHCPv6-PD (dual stack)' },
'PPPoE 多拨': { zh: 'PPPoE 多拨', en: 'PPPoE Multi-dial' },
'PPPoE 多拨 / 多会话聚合': { zh: 'PPPoE 多拨 / 多会话聚合', en: 'PPPoE Multi-dial / Session Aggregation' },
'PPPoE 拨号': { zh: 'PPPoE 拨号', en: 'PPPoE Dial-up' },
'SMTP 服务器': { zh: 'SMTP 服务器', en: 'SMTP server' },
'Token / 更新密钥': { zh: 'Token / 更新密钥', en: 'Token / update key' },
'USB RAW 直通': { zh: 'USB RAW 直通', en: 'USB RAW Passthrough' },
'VLAN ID 必须在 1–4094 之间': { zh: 'VLAN ID 必须在 1–4094 之间', en: 'The VLAN ID must be between 1 and 4094' },
'VLAN 与 IPTV 划分': { zh: 'VLAN 与 IPTV 划分', en: 'VLAN & IPTV Segmentation' },
'WAN 口': { zh: 'WAN 口', en: 'WAN port' },
'WAN 口设置': { zh: 'WAN 口设置', en: 'WAN Port' },
'WAN 地址 / 前缀委派(PD)/ 邻居表': { zh: 'WAN 地址 / 前缀委派(PD)/ 邻居表', en: 'WAN address / prefix delegation (PD) / neighbour table' },
'WAN 接入': { zh: 'WAN 接入', en: 'WAN uplink' },
'WAN 接入方式已选为「': { zh: 'WAN 接入方式已选为「', en: 'WAN access type set to "' },
'WAN(上行 / 光猫)': { zh: 'WAN(上行 / 光猫)', en: 'WAN (uplink / ONT)' },
'Web SSH 终端与文件管理器': { zh: 'Web SSH 终端与文件管理器', en: 'Web SSH Terminal & File Manager' },
'Web 服务会重启,你需要重新登录。': { zh: 'Web 服务会重启,你需要重新登录。', en: 'The web service will restart and you will need to sign in again.' },
'Web 服务正在重启,10 秒后自动刷新(需要重新登录一次)': { zh: 'Web 服务正在重启,10 秒后自动刷新(需要重新登录一次)', en: 'The web service is restarting; the page refreshes in 10 seconds (you will have to sign in again)' },
'Web 终端 / 文件': { zh: 'Web 终端 / 文件', en: 'Web Terminal / Files' },
'Webhook 地址': { zh: 'Webhook 地址', en: 'Webhook URL' },
'WireGuard 就绪': { zh: 'WireGuard 就绪', en: 'WireGuard ready' },
'\\r\\n[shell 已结束,退出码 ': { zh: '\\r\\n[shell 已结束,退出码 ', en: '\\r\\n[shell exited, code ' },
'\\r\n[shell 已结束,退出码 ': { zh: '\\r\n[shell 已结束,退出码 ', en: '\\r\\n[shell exited, code ' },
'\\\\r\\\\n[shell 已结束,退出码 ': { zh: '\\\\r\\\\n[shell 已结束,退出码 ', en: '\\r\\n[shell exited, code ' },
'\\r\\\\n[shell 已结束,退出码 ': { zh: '\\r\\\\n[shell 已结束,退出码 ', en: '\\r\\n[shell exited, code ' },
'\\r\\n[连接中断] ': { zh: '\\r\\n[连接中断] ', en: '\\r\\n[connection lost] ' },
'\\r\n[连接中断] ': { zh: '\\r\n[连接中断] ', en: '\\r\\n[connection lost] ' },
'\\\\r\\\\n[连接中断] ': { zh: '\\\\r\\\\n[连接中断] ', en: '\\r\\n[connection lost] ' },
'\\r\\\\n[连接中断] ': { zh: '\\r\\\\n[连接中断] ', en: '\\r\\n[connection lost] ' },
'\\r\\n—— 已断开 ——': { zh: '\\r\\n—— 已断开 ——', en: '\\r\\n—— disconnected ——' },
'\\r\n—— 已断开 ——': { zh: '\\r\n—— 已断开 ——', en: '\\r\\n—— disconnected ——' },
'\\\\r\\\\n—— 已断开 ——': { zh: '\\\\r\\\\n—— 已断开 ——', en: '\\r\\n—— disconnected ——' },
'\\r\\\\n—— 已断开 ——': { zh: '\\r\\\\n—— 已断开 ——', en: '\\r\\n—— disconnected ——' },
'daemon.json 可视化配置:IPv6 一键开启 · 国内镜像源切换与测速 · 日志滚动 · 默认网桥网段': { zh: 'daemon.json 可视化配置:IPv6 一键开启 · 国内镜像源切换与测速 · 日志滚动 · 默认网桥网段', en: 'Visual daemon.json configuration: one-click IPv6 · mirror switching with speed test · log rotation · default bridge subnet' },
'disabled title="请先卸载再格式化"': { zh: 'disabled title="请先卸载再格式化"', en: 'disabled title="Please unmount before formatting"' },
'miniupnpd 未在运行': { zh: 'miniupnpd 未在运行', en: 'miniupnpd is not running' },
'var() 引用写法不正确': { zh: 'var() 引用写法不正确', en: 'The var() reference is not written correctly' },
'· Web 服务会重启,你需要重新登录一次\\n': { zh: '· Web 服务会重启,你需要重新登录一次\\n', en: '· The web service will restart; you will need to sign in again\\n' },
'· Web 服务会重启,你需要重新登录一次\n': { zh: '· Web 服务会重启,你需要重新登录一次\n', en: '· The web service will restart; you will need to sign in again\\n' },
'· Web 服务会重启,你需要重新登录一次\\\\n': { zh: '· Web 服务会重启,你需要重新登录一次\\\\n', en: '· The web service will restart; you will need to sign in again\\n' },
'· 换上后如果握手不通过,会自动还原原来的证书\\n': { zh: '· 换上后如果握手不通过,会自动还原原来的证书\\n', en: '· If the handshake fails after switching, the original certificate is restored automatically\\n' },
'· 换上后如果握手不通过,会自动还原原来的证书\n': { zh: '· 换上后如果握手不通过,会自动还原原来的证书\n', en: '· If the handshake fails after switching, the original certificate is restored automatically\\n' },
'· 换上后如果握手不通过,会自动还原原来的证书\\\\n': { zh: '· 换上后如果握手不通过,会自动还原原来的证书\\\\n', en: '· If the handshake fails after switching, the original certificate is restored automatically\\n' },
'· 探测源:': { zh: '· 探测源:', en: ' · probe source: ' },
'· 自签证书浏览器仍会提示,那是正常的(加密是生效的)': { zh: '· 自签证书浏览器仍会提示,那是正常的(加密是生效的)', en: '· Browsers still warn about self-signed certificates — that is normal (encryption is active)' },
'· 最新发布:': { zh: '· 最新发布:', en: ' · latest release: ' },
'— 新建一条记录 —': { zh: '— 新建一条记录 —', en: '— Create a new record —' },
'— 还没有 CA,先创建一张 —': { zh: '— 还没有 CA,先创建一张 —', en: '— No CA yet, create one first —' },
'••••••(留空表示不修改)': { zh: '••••••(留空表示不修改)', en: '•••••• (leave blank to keep unchanged)' },
'ℹ 本地时间跨零点(': { zh: 'ℹ 本地时间跨零点(', en: 'ℹ The local time crosses midnight (' },
'ℹ 该时段横跨本地 08:00(UTC 日分界),会自动拆成两段写入内核。': { zh: 'ℹ 该时段横跨本地 08:00(UTC 日分界),会自动拆成两段写入内核。', en: 'ℹ This period spans the local 08:00 (UTC day boundary), so it is split into two segments in the kernel.' },
'── IFB 下行队列 ──': { zh: '── IFB 下行队列 ──', en: '── IFB downlink queue ──' },
'── 入口重定向 / 上行根队列 ──': { zh: '── 入口重定向 / 上行根队列 ──', en: '── ingress redirect / uplink root queue ──' },
'⚠ 以下共享目录还不存在:': { zh: '⚠ 以下共享目录还不存在:', en: '⚠ The following shared directories do not exist yet:' },
'⚠ 未选择任何星期,该时间组不会命中任何流量。': { zh: '⚠ 未选择任何星期,该时间组不会命中任何流量。', en: '⚠ No weekday selected — this time group will never match any traffic.' },
' 官方直连不通,已自动改用镜像;': { zh: ' 官方直连不通,已自动改用镜像;', en: ' Direct connection to the official source failed; a mirror is used instead;' },
' 接口 ': { zh: ' 接口 ', en: ' Interface ' },
'、WAN/LAN、IPv6 与 RA、UPnP、NTP': { zh: '、WAN/LAN、IPv6 与 RA、UPnP、NTP', en: ', WAN/LAN, IPv6 and RA, UPnP, NTP' },
'、云主机,或手机开热点连着的电脑)上执行它, 本机能收到就说明外网确实可以主动访问进来。': { zh: '、云主机,或手机开热点连着的电脑)上执行它, 本机能收到就说明外网确实可以主动访问进来。', en: ', a cloud host, or a PC connected through a phone hotspot) run it; if this machine can receive it, the public network really can reach in.' },
'、共享密钥填上面这串。 重新生成后,': { zh: '、共享密钥填上面这串。 重新生成后,', en: ', enter the shared secret shown above. After regenerating,' },
'、工单系统、': { zh: '、工单系统、', en: ', ticketing system,' },
'、应用与系统日志': { zh: '、应用与系统日志', en: ', application and system logs' },
'、是否开启转发、默认路由是否就绪。': { zh: '、是否开启转发、默认路由是否就绪。', en: ', whether forwarding is enabled, and whether the default route is ready.' },
'、本地显示器、': { zh: '、本地显示器、', en: ', local display,' },
'、端口、中文描述': { zh: '、端口、中文描述', en: ', port, description' },
'、端口、流量特征做推测。这是行业共同限制,不是实现缺陷。': { zh: '、端口、流量特征做推测。这是行业共同限制,不是实现缺陷。', en: ', port, or traffic patterns. This is a common industry limitation, not an implementation defect.' },
'、网卡角色、访问范围与': { zh: '、网卡角色、访问范围与', en: ', NIC role, access scope and' },
'、转发、': { zh: '、转发、', en: ', forwarding,' },
'、重命名、删除、复制路径。删除会移入回收站。': { zh: '、重命名、删除、复制路径。删除会移入回收站。', en: ', rename, delete, copy path. Deleting moves the item to the trash.' },
'、防火墙': { zh: '、防火墙', en: ', firewall' },
'、防火墙规则、限速与识别、访问控制、 共享与打印、': { zh: '、防火墙规则、限速与识别、访问控制、 共享与打印、', en: ', firewall rules, rate limiting and identification, access control, sharing and printing,' },
'、默认网桥网段也纳管进来。': { zh: '、默认网桥网段也纳管进来。', en: ', the subnet of the default bridge is brought under management as well.' },
'。 中文提示便于人工排查,原始信息保留便于': { zh: '。 中文提示便于人工排查,原始信息保留便于', en: '. The Chinese message makes manual troubleshooting easier, while the original message is preserved for' },
'。 保存时它们会': { zh: '。 保存时它们会', en: '. When saving, they will' },
'。 修改后需要重启管理后台,然后用新地址重新访问(例如': { zh: '。 修改后需要重启管理后台,然后用新地址重新访问(例如', en: '. After the change you need to restart the management backend, then visit the new address (e.g.' },
'。 只看「地址是不是公网段」会误判': { zh: '。 只看「地址是不是公网段」会误判', en: '. Looking only at whether the address falls in a public range leads to false judgements' },
'。 如果你的局域网或': { zh: '。 如果你的局域网或', en: '. If your LAN or' },
'。 导出规则写入': { zh: '。 导出规则写入', en: '. Exported rules are written to' },
'。 手机丢了就删掉对应那一条': { zh: '。 手机丢了就删掉对应那一条', en: '. If the phone is lost, delete the corresponding entry' },
'。 若系统未安装': { zh: '。 若系统未安装', en: '. If the system does not have' },
'。 识别结果可交给': { zh: '。 识别结果可交给', en: '. The identification result can be handed to' },
'。 这一步决定用谁的': { zh: '。 这一步决定用谁的', en: '. This step determines whose' },
'。 这里只是配置阈值、添加通知通道、查看历史。': { zh: '。 这里只是配置阈值、添加通知通道、查看历史。', en: '. Here you only configure thresholds, add notification channels, and view history.' },
'。 配 DDNS': { zh: '。 配 DDNS', en: '. Configure DDNS' },
'。你在文件里自己写的、本页不管的键(例如': { zh: '。你在文件里自己写的、本页不管的键(例如', en: '. Keys you write yourself in the file and that this page does not manage (for example' },
'。写完之后请到相关页面确认, 再点一次「保存并应用」让改动真正生效。': { zh: '。写完之后请到相关页面确认, 再点一次「保存并应用」让改动真正生效。', en: '. After writing, go to the relevant page to confirm, then click "Save & Apply" again to make the change take effect.' },
'。可在下方共享项里点「创建」按钮一键建立。': { zh: '。可在下方共享项里点「创建」按钮一键建立。', en: '. Click the "Create" button in the share item below to create it in one go.' },
'。可选组件(': { zh: '。可选组件(', en: '. Optional components (' },
'。对一台跑着常驻服务的路由器来说很值。': { zh: '。对一台跑着常驻服务的路由器来说很值。', en: '. Worth it for a router that always runs services.' },
'。标记为高危的包可能影响桌面环境与': { zh: '。标记为高危的包可能影响桌面环境与', en: '. Packages marked as high risk may affect the desktop environment and' },
'。浏览器访问时,地址必须出现在': { zh: '。浏览器访问时,地址必须出现在', en: '. When accessing it from a browser, the address must appear in' },
'。若容器未运行才会成功, 数据卷不会被删除。': { zh: '。若容器未运行才会成功, 数据卷不会被删除。', en: '. It only succeeds when the container is not running; data volumes are not deleted.' },
'。请到「系统 → 依赖自检与安装」安装后再回来开启。': { zh: '。请到「系统 → 依赖自检与安装」安装后再回来开启。', en: '. Please go to "System → Dependency Check & Install", install it, then come back and enable it.' },
'。请查看下方「安装日志」。': { zh: '。请查看下方「安装日志」。', en: '. See the "Install Log" below.' },
'。请确认使用 Debian 官方内核。': { zh: '。请确认使用 Debian 官方内核。', en: '. Please make sure you are using the official Debian kernel.' },
'。这是': { zh: '。这是', en: '. This is' },
'。这是构建阶段的安全保险,可放心填完所有配置而不影响正在运行的局域网与 RealVNC 会话。': { zh: '。这是构建阶段的安全保险,可放心填完所有配置而不影响正在运行的局域网与 RealVNC 会话。', en: '. This is a safety net for the build phase — you can safely fill in all settings without affecting the running LAN and RealVNC sessions.' },
'「一键安装」只装必需项': { zh: '「一键安装」只装必需项', en: '"One-click install" installs only the required items' },
'「从文件或二维码导入」': { zh: '「从文件或二维码导入」', en: '"Import from file or QR code"' },
'「半夜别吵我」不包括「家里断网了」。': { zh: '「半夜别吵我」不包括「家里断网了」。', en: '"Do not disturb me at night" does not cover "the home network is down".' },
'「多源回显一致性」与「首跳链路」两条复用了上一次探测的结果(30 分钟内)。 刚改过网络、宽带或端口转发的话,点上方': { zh: '「多源回显一致性」与「首跳链路」两条复用了上一次探测的结果(30 分钟内)。 刚改过网络、宽带或端口转发的话,点上方', en: 'The "multi-source echo consistency" and "first-hop link" checks reused the results of the previous probe (within 30 minutes). If you have just changed the network, the broadband line or port forwarding, click' },
'「安全': { zh: '「安全', en: '"Security' },
'「应用并连接」会真正发起拨号并改变出网默认路由。请在确认账号无误后执行。': { zh: '「应用并连接」会真正发起拨号并改变出网默认路由。请在确认账号无误后执行。', en: '"Apply and connect" really starts dialing and changes the default route for outbound traffic. Run it after confirming the account is correct.' },
'「手动快照」是按创建方式自动识别的全局策略(在「自动快照」卡片里可关),': { zh: '「手动快照」是按创建方式自动识别的全局策略(在「自动快照」卡片里可关),', en: '"Manual snapshot" is a global policy detected automatically by creation method (can be disabled in the "Auto snapshot" card),' },
'「手动快照不参与自动清理」是': { zh: '「手动快照不参与自动清理」是', en: '"Manual snapshots are excluded from auto-cleanup"' },
'「最低级别」按严重程度过滤:选「警告」会同时显示错误与警告。 关键字对中文描述与原始行同时匹配。': { zh: '「最低级别」按严重程度过滤:选「警告」会同时显示错误与警告。 关键字对中文描述与原始行同时匹配。', en: '"Minimum level" filters by severity: selecting "Warning" shows errors and warnings together. Keywords match both the description and the raw line.' },
'「连接方式」显示的是总线类型': { zh: '「连接方式」显示的是总线类型', en: '"Connection type" shows the bus type' },
'」。可显著降低': { zh: '」。可显著降低', en: '". Can significantly reduce' },
'」与「IPv6 / RA': { zh: '」与「IPv6 / RA', en: '" and "IPv6 / RA' },
'」吗?': { zh: '」吗?', en: '"?' },
'」形式;禁止': { zh: '」形式;禁止', en: '" form; prohibits' },
'」页打开「记录被拒绝的包」。': { zh: '」页打开「记录被拒绝的包」。', en: 'page and turn on "Log rejected packets".' },
'」页面的地址池)。': { zh: '」页面的地址池)。', en: '" page\'s address pool).' },
'」页面里的「': { zh: '」页面里的「', en: '" page\'s "' },
'」,填完内容记得点「保存设置」': { zh: '」,填完内容记得点「保存设置」', en: '" — fill it in and remember to click "Save settings"' },
'」,点「保存设置」后生效': { zh: '」,点「保存设置」后生效', en: '" — takes effect after you click "Save settings"' },
'」,留一点余量让': { zh: '」,留一点余量让', en: '", leaving some headroom so that' },
'」,请点击保存并应用': { zh: '」,请点击保存并应用', en: '" — click Save & Apply' },
'」,请点击右上角「保存并应用」': { zh: '」,请点击右上角「保存并应用」', en: '" — click "Save and apply" at the top right' },
'一': { zh: '一', en: '1st' },
'一句话描述': { zh: '一句话描述', en: 'One-line description' },
'一句话说明': { zh: '一句话说明', en: 'One-line explanation' },
'一律不在清理范围内': { zh: '一律不在清理范围内', en: 'are never within the cleanup scope' },
'一律拒绝并给出中文提示。': { zh: '一律拒绝并给出中文提示。', en: 'are always rejected with an explanation in Chinese.' },
'一次配好统一下发。': { zh: '一次配好统一下发。', en: 'Configure once, deliver to everything at once.' },
'一键修复会做这几件事:\\n\\n': { zh: '一键修复会做这几件事:\\n\\n', en: 'The one-click fix will do the following:\\n\\n' },
'一键修复会做这几件事:\n\n': { zh: '一键修复会做这几件事:\n\n', en: 'The one-click fix will do the following:\\n\\n' },
'一键修复会做这几件事:\\\\n\\\\n': { zh: '一键修复会做这几件事:\\\\n\\\\n', en: 'The one-click fix will do the following:\\n\\n' },
'一键修复(加载模块并配置开机自启)': { zh: '一键修复(加载模块并配置开机自启)', en: 'One-click fix (load the module and enable it at boot)' },
'一键修复(安装 wireguard-tools)': { zh: '一键修复(安装 wireguard-tools)', en: 'One-click fix (install wireguard-tools)' },
'一键安装缺失的必需项': { zh: '一键安装缺失的必需项', en: 'Install the missing required items in one click' },
'一键开关': { zh: '一键开关', en: 'One-click toggle' },
'一键开启软加速': { zh: '一键开启软加速', en: 'Enable software acceleration with one click' },
'一键检测本机与互联网的': { zh: '一键检测本机与互联网的', en: 'One-click check between this machine and the Internet' },
'一键测速': { zh: '一键测速', en: 'One-click speed test' },
'一键还原后自动重启': { zh: '一键还原后自动重启', en: 'Reboot automatically after one-click restore' },
'一键配色主色': { zh: '一键配色主色', en: 'One-click primary color scheme' },
'丁': { zh: '丁', en: 'Ding' },
'七': { zh: '七', en: '7th' },
'万一失联,可以通过 虚拟机平台的控制台,或者物理机的': { zh: '万一失联,可以通过 虚拟机平台的控制台,或者物理机的', en: 'If you lose access, you can use the hypervisor\'s console, or a physical machine\'s' },
'三': { zh: '三', en: '3rd' },
'三十': { zh: '三十', en: '30th' },
'三种路径,按「省事': { zh: '三种路径,按「省事', en: 'Three paths, choose by "how hands-off' },
'上传中…': { zh: '上传中…', en: 'Uploading…' },
'上传文件': { zh: '上传文件', en: 'Upload file' },
'上午': { zh: '上午', en: 'AM' },
'上对应': { zh: '上对应', en: 'on the corresponding' },
'上次': { zh: '上次', en: 'Last' },
'上次执行': { zh: '上次执行', en: 'Last run' },
'上次更新': { zh: '上次更新', en: 'Last updated' },
'上次更新:': { zh: '上次更新:', en: 'Last updated:' },
'上次检查:': { zh: '上次检查:', en: 'Last checked: ' },
'上次检测': { zh: '上次检测', en: 'Last check' },
'上次检测:': { zh: '上次检测:', en: 'Last checked: ' },
'上次测试时间': { zh: '上次测试时间', en: 'Last test time' },
'上次结果': { zh: '上次结果', en: 'Last result' },
'上次聚合': { zh: '上次聚合', en: 'Last aggregation' },
'上次部署(': { zh: '上次部署(', en: 'Last deployed (' },
'上游来源': { zh: '上游来源', en: 'Upstream source' },
'上级': { zh: '上级', en: 'Upstream' },
'上网方式': { zh: '上网方式', en: 'Internet access method' },
'上网:': { zh: '上网:', en: 'Internet:' },
'上行': { zh: '上行', en: 'Up' },
'上行峰值': { zh: '上行峰值', en: 'Uplink peak' },
'上行带宽': { zh: '上行带宽', en: 'Upload bandwidth' },
'上行直接在': { zh: '上行直接在', en: 'For upstream, directly on the' },
'上装': { zh: '上装', en: 'install on' },
'上运行': { zh: '上运行', en: 'run on' },
'上锁': { zh: '上锁', en: 'Lock' },
'上锁只挡自动清理,不挡你手动删。确定要删掉它吗?此操作不可恢复。': { zh: '上锁只挡自动清理,不挡你手动删。确定要删掉它吗?此操作不可恢复。', en: 'Locking only blocks automatic cleanup, not manual deletion. Are you sure you want to delete it? This action cannot be undone.' },
'上锁的那份在任何自动清理下都不会被删,且不占用「最多保留份数」的额度。': { zh: '上锁的那份在任何自动清理下都不会被删,且不占用「最多保留份数」的额度。', en: 'The locked one is never deleted by any automatic cleanup, and does not count against the "maximum number of snapshots to keep" quota.' },
'上限': { zh: '上限', en: 'Upper limit' },
'上面三项只在': { zh: '上面三项只在', en: 'The three options above take effect only under' },
'上面几个都是可以直接用的公共': { zh: '上面几个都是可以直接用的公共', en: 'The ones above are all ready-to-use public' },
'下午': { zh: '下午', en: 'PM' },
'下发的': { zh: '下发的', en: 'delivered' },
'下发给客户端的': { zh: '下发给客户端的', en: 'delivered to clients' },
'下发给设备的': { zh: '下发给设备的', en: 'delivered to devices' },
'下发给设备的网关': { zh: '下发给设备的网关', en: 'gateway delivered to devices' },
'下方是隔离沙箱中的真实渲染效果,随左侧改动实时更新。': { zh: '下方是隔离沙箱中的真实渲染效果,随左侧改动实时更新。', en: 'Below is the real rendering inside an isolated sandbox; it updates live as you change the options on the left.' },
'下次执行': { zh: '下次执行', en: 'Next run' },
'下次检查': { zh: '下次检查', en: 'Next check' },
'下次自动快照': { zh: '下次自动快照', en: 'Next automatic snapshot' },
'下游地址分配': { zh: '下游地址分配', en: 'Downstream address assignment' },
'下生效。用系统自带的': { zh: '下生效。用系统自带的', en: 'and take effect. Use the system\'s built-in' },
'下行': { zh: '下行', en: 'Down' },
'下行 / 上行': { zh: '下行 / 上行', en: 'Down / Up' },
'下行峰值': { zh: '下行峰值', en: 'Downlink peak' },
'下行带宽': { zh: '下行带宽', en: 'Download bandwidth' },
'下行速率': { zh: '下行速率', en: 'Download rate' },
'下表里重复写同一个': { zh: '下表里重复写同一个', en: 'the same entry twice in the table below' },
'下载': { zh: '下载', en: 'Download' },
'下载全程会在进度区显示': { zh: '下载全程会在进度区显示', en: 'The entire download is shown in the progress area' },
'下载全程都会显示实际用的是哪一个': { zh: '下载全程都会显示实际用的是哪一个', en: 'The entire download shows which one is actually being used' },
'下载同样官方优先,连不上时自动改用镜像,': { zh: '下载同样官方优先,连不上时自动改用镜像,', en: 'Downloads also prefer the official source and automatically switch to a mirror when it cannot be reached,' },
'下载地址': { zh: '下载地址', en: 'Download address' },
'下载失败': { zh: '下载失败', en: 'Download failed' },
'下载失败:': { zh: '下载失败:', en: 'Download failed: ' },
'下载工具': { zh: '下载工具', en: 'Download tool' },
'下载源:': { zh: '下载源:', en: 'Source: ' },
'下载配置': { zh: '下载配置', en: 'Download configuration' },
'下载配置文件': { zh: '下载配置文件', en: 'Download the config file' },
'下载阶段': { zh: '下载阶段', en: 'download stage' },
'下面会启动一次监听,然后给你一条命令。 在': { zh: '下面会启动一次监听,然后给你一条命令。 在', en: 'A listener will be started below, then you will be given a command. In' },
'下面是当前配置渲染出的': { zh: '下面是当前配置渲染出的', en: 'Below is what the current configuration renders' },
'下面的命令可以直接复制使用,把': { zh: '下面的命令可以直接复制使用,把', en: 'The command below can be copied and used directly; it' },
'下面这份快照列表就是救援通道的「还原材料」。': { zh: '下面这份快照列表就是救援通道的「还原材料」。', en: 'The snapshot list below is the "restore material" of the rescue channel.' },
'下面这份清单与「系统设置': { zh: '下面这份清单与「系统设置', en: 'This list below and "System Settings' },
'下面这份配置': { zh: '下面这份配置', en: 'This configuration below' },
'下面这段代码随上面的选项实时变化,和点「保存」后真正落盘的内容': { zh: '下面这段代码随上面的选项实时变化,和点「保存」后真正落盘的内容', en: 'The code below changes live with the options above and matches what "Save" actually writes to disk' },
'下, 每个项目一个子目录,可一键启动': { zh: '下, 每个项目一个子目录,可一键启动', en: 'below, one subdirectory per project, startable with one click' },
'不主动获取(without-acquire)': { zh: '不主动获取(without-acquire)', en: 'Do not acquire (without-acquire)' },
'不会': { zh: '不会', en: 'will not' },
'不会为容器 生成': { zh: '不会为容器 生成', en: 'will not generate for the container' },
'不会再自动创建快照': { zh: '不会再自动创建快照', en: 'No more snapshots will be created automatically' },
'不会加载到内核': { zh: '不会加载到内核', en: 'are not loaded into the kernel' },
'不会启动服务': { zh: '不会启动服务', en: 'will not start the service' },
'不会启动服务、不会改变网络': { zh: '不会启动服务、不会改变网络', en: 'Will not start any service or change the network' },
'不会报错, 会与专属字段': { zh: '不会报错, 会与专属字段', en: 'does not report an error, and will be combined with the dedicated field' },
'不会改动你的网络接口、防火墙和现有 VPN 配置。\\n要继续吗?': { zh: '不会改动你的网络接口、防火墙和现有 VPN 配置。\\n要继续吗?', en: 'It will not touch your network interfaces, firewall or existing VPN configuration.\\nContinue?' },
'不会改动你的网络接口、防火墙和现有 VPN 配置。\n要继续吗?': { zh: '不会改动你的网络接口、防火墙和现有 VPN 配置。\n要继续吗?', en: 'It will not touch your network interfaces, firewall or existing VPN configuration.\\nContinue?' },
'不会改动你的网络接口、防火墙和现有 VPN 配置。\\\\n要继续吗?': { zh: '不会改动你的网络接口、防火墙和现有 VPN 配置。\\\\n要继续吗?', en: 'It will not touch your network interfaces, firewall or existing VPN configuration.\\nContinue?' },
'不会自动安装': { zh: '不会自动安装', en: 'is not installed automatically' },
'不会自动安装,避免影响你现有环境。': { zh: '不会自动安装,避免影响你现有环境。', en: 'are not installed automatically, so your existing environment stays untouched.' },
'不会被使用,这里给的都是合法默认值。': { zh: '不会被使用,这里给的都是合法默认值。', en: 'is not used; the values given here are valid defaults.' },
'不会覆盖它': { zh: '不会覆盖它', en: 'will not overwrite it' },
'不会重启': { zh: '不会重启', en: 'will not restart' },
'不修改当前运行的配置': { zh: '不修改当前运行的配置', en: 'does not modify the currently running configuration' },
'不允许使用外部引用(url / expression / import)': { zh: '不允许使用外部引用(url / expression / import)', en: 'External references are not allowed (url / expression / import)' },
'不允许出现注释符号': { zh: '不允许出现注释符号', en: 'Comment markers are not allowed' },
'不允许引用未开放的变量': { zh: '不允许引用未开放的变量', en: 'referencing unexported variables is not allowed' },
'不包含敏感文件': { zh: '不包含敏感文件', en: 'contains no sensitive files' },
'不受影响。': { zh: '不受影响。', en: 'unaffected.' },
'不可用': { zh: '不可用', en: 'Unavailable' },
'不可达': { zh: '不可达', en: 'Unreachable' },
'不存在(保存时创建)': { zh: '不存在(保存时创建)', en: 'Does not exist (will be created on save)' },
'不存在,点上面的「创建目录」即可建立。': { zh: '不存在,点上面的「创建目录」即可建立。', en: 'does not exist; click "Create Directory" above to create it.' },
'不少宽带给的是公网地址却在入向做了封锁, 从别的': { zh: '不少宽带给的是公网地址却在入向做了封锁, 从别的', en: 'Many broadband providers hand out a public address yet block inbound traffic, so from another' },
'不少宽带给的是公网地址却在入向做了封锁,那种情况域名解析得到、 但别人就是连不上。': { zh: '不少宽带给的是公网地址却在入向做了封锁,那种情况域名解析得到、 但别人就是连不上。', en: 'Many broadband providers hand out a public address yet block inbound traffic; in that case the domain resolves fine but nobody else can connect.' },
'不开也不影响上网': { zh: '不开也不影响上网', en: 'leaving it off does not affect Internet access' },
'不按时间)': { zh: '不按时间)', en: 'not by time)' },
'不推荐': { zh: '不推荐', en: 'Not recommended' },
'不支持': { zh: '不支持', en: 'Unsupported' },
'不支持的具名取值,请用 #rrggbb 或 rgb() 形式': { zh: '不支持的具名取值,请用 #rrggbb 或 rgb() 形式', en: 'Unsupported named value; use #rrggbb or rgb() instead' },
'不是': { zh: '不是', en: 'No' },
'不用点这个按钮': { zh: '不用点这个按钮', en: 'you do not need to click this button' },
'不用装驱动': { zh: '不用装驱动', en: 'No driver installation needed' },
'不看校验结果,只要握手能通就行': { zh: '不看校验结果,只要握手能通就行', en: 'Ignore the verification result, as long as the handshake succeeds' },
'不等待服务停止': { zh: '不等待服务停止', en: 'Do not wait for the service to stop' },
'不能同时开': { zh: '不能同时开', en: 'Cannot be enabled at the same time' },
'不能说明外网能不能连进来': { zh: '不能说明外网能不能连进来', en: 'does not tell you whether the public network can reach in' },
'不要还原': { zh: '不要还原', en: 'Do not restore' },
'不通': { zh: '不通', en: 'No' },
'不通。': { zh: '不通。', en: 'unreachable.' },
'不通过': { zh: '不通过', en: 'Failed' },
'不限': { zh: '不限', en: 'Unlimited' },
'不限制)': { zh: '不限制)', en: 'unlimited)' },
'不限速': { zh: '不限速', en: 'No rate limit' },
'不限(防止一次删太多)': { zh: '不限(防止一次删太多)', en: 'unlimited (prevents deleting too many at once)' },
'不限)': { zh: '不限)', en: 'unlimited)' },
'不需要你打开这个页面': { zh: '不需要你打开这个页面', en: 'you do not need to open this page' },
'与': { zh: '与', en: 'and' },
'与 DHCP 页 Option 3': { zh: '与 DHCP 页 Option 3', en: 'Same source as Option 3 on the DHCP page' },
'与 DNS': { zh: '与 DNS', en: 'and DNS' },
'与上面的端口转发可同时存在;同名端口以端口转发规则优先。': { zh: '与上面的端口转发可同时存在;同名端口以端口转发规则优先。', en: 'can coexist with the port forwarding above; for the same port, the port forwarding rule takes precedence.' },
'与主界面使用同一套': { zh: '与主界面使用同一套', en: 'uses the same set as the main interface' },
'与内网网段': { zh: '与内网网段', en: 'and internal network segments' },
'与后端连接中断,请检查管理服务是否在运行': { zh: '与后端连接中断,请检查管理服务是否在运行', en: 'The connection to the backend dropped; check that the admin service is running' },
'与客户端概况': { zh: '与客户端概况', en: 'and the client overview' },
'与网络配置。': { zh: '与网络配置。', en: 'and the network configuration.' },
'与路由器管理服务的 HTTPS 证书协商失败,请确认访问的是正确地址': { zh: '与路由器管理服务的 HTTPS 证书协商失败,请确认访问的是正确地址', en: 'The TLS certificate negotiation with the admin service failed; make sure you are using the correct address' },
'丑': { zh: '丑', en: 'Chou' },
'丙': { zh: '丙', en: 'Bing' },
'丢包 ': { zh: '丢包 ', en: 'loss ' },
'丢弃': { zh: '丢弃', en: 'Discard' },
'丢弃的包(推荐)': { zh: '丢弃的包(推荐)', en: 'dropped packets (recommended)' },
'两个生命期决定客户端保留这份': { zh: '两个生命期决定客户端保留这份', en: 'The two lifetimes determine how long clients keep this' },
'两次输入的新密码不一致': { zh: '两次输入的新密码不一致', en: 'The new passwords entered twice do not match' },
'两种模式到底差在哪': { zh: '两种模式到底差在哪', en: 'What exactly is the difference between the two modes' },
'两者': { zh: '两者', en: 'Both' },
'两者不能同时生效。': { zh: '两者不能同时生效。', en: 'The two cannot take effect at the same time.' },
'两者合并': { zh: '两者合并', en: 'Merge the two' },
'两者同时': { zh: '两者同时', en: 'Both at the same time' },
'严格按池范围分配,池用尽时不分新地址': { zh: '严格按池范围分配,池用尽时不分新地址', en: 'Allocate strictly from the pool; once it is empty no new addresses are handed out' },
'严格(strict)': { zh: '严格(strict)', en: 'Strict (strict)' },
'严重': { zh: '严重', en: 'Critical' },
'严重告警(外网中断)永远会推送': { zh: '严重告警(外网中断)永远会推送', en: 'Critical alerts (WAN outage) are always pushed' },
'个': { zh: '个', en: '' }, // i18n-en-empty(英文不需要量词:3 个 → 3)
'个变量': { zh: '个变量', en: 'variables' },
'个变量会被接受。其它变量、': { zh: '个变量会被接受。其它变量、', en: 'variables are accepted. Other variables,' },
'个可定制变量': { zh: '个可定制变量', en: 'customizable variables' },
'个文件': { zh: '个文件', en: 'files' },
'个文件写入本机。': { zh: '个文件写入本机。', en: 'files are written to this machine.' },
'个文件校验不通过,': { zh: '个文件校验不通过,', en: 'files failed verification,' },
'个文件)': { zh: '个文件)', en: 'files)' },
'个本页不管的键:': { zh: '个本页不管的键:', en: 'keys not managed by this page:' },
'个来源项 (约': { zh: '个来源项 (约', en: 'source entries (about' },
'个进程': { zh: '个进程', en: 'processes' },
'个配色变量': { zh: '个配色变量', en: 'color variables' },
'中': { zh: '中', en: 'Medium' },
'中国广电': { zh: '中国广电', en: 'China Broadnet' },
'中国广电。 实际认证方式与是否需要服务名取决于当地运营商,请以实测为准。': { zh: '中国广电。 实际认证方式与是否需要服务名取决于当地运营商,请以实测为准。', en: 'China Broadcasting Network. The actual authentication method and whether a service name is required depend on the local ISP; please verify with a real test.' },
'中国电信': { zh: '中国电信', en: 'China Telecom' },
'中国移动': { zh: '中国移动', en: 'China Mobile' },
'中国联通': { zh: '中国联通', en: 'China Unicom' },
'中断': { zh: '中断', en: 'disruption' },
'中断、 方向键翻历史也都有效。': { zh: '中断、 方向键翻历史也都有效。', en: 'interrupt; browsing history with the arrow keys works as well.' },
'中断所有正在运行的容器': { zh: '中断所有正在运行的容器', en: 'Stop all running containers' },
'为 IPv6)': { zh: '为 IPv6)', en: 'is IPv6)' },
'为安全起见本页': { zh: '为安全起见本页', en: 'For safety, this page' },
'为该客户端下发 DHCP Options': { zh: '为该客户端下发 DHCP Options', en: 'Send DHCP Options to this client' },
'为避免误操作,定时重启需在服务器上用': { zh: '为避免误操作,定时重启需在服务器上用', en: 'To avoid accidental operations, scheduled reboots must be triggered on the server with' },
'主域名': { zh: '主域名', en: 'Primary domain' },
'主按钮渐变': { zh: '主按钮渐变', en: 'Primary button gradient' },
'主文字': { zh: '主文字', en: 'Primary text' },
'主机': { zh: '主机', en: 'Host' },
'主机名': { zh: '主机名', en: 'Hostname' },
'主机名:': { zh: '主机名:', en: 'Hostname:' },
'主机记录': { zh: '主机记录', en: 'Host record' },
'主机(': { zh: '主机(', en: 'Host (' },
'主机(内网': { zh: '主机(内网', en: 'Host (LAN' },
'主色与状态色': { zh: '主色与状态色', en: 'Primary and status colours' },
'主色加深': { zh: '主色加深', en: 'Primary colour, darker' },
'主色浅底': { zh: '主色浅底', en: 'Primary colour tint' },
'主色(文字用)': { zh: '主色(文字用)', en: 'Primary colour (for text)' },
'主配置': { zh: '主配置', en: 'main configuration' },
'主题': { zh: '主题', en: 'Theme' },
'主题主色': { zh: '主题主色', en: 'Theme primary colour' },
'主题之家': { zh: '主题之家', en: 'Theme Studio' },
'主题之家(Web 设计 · 离线预览 · 导入导出)': { zh: '主题之家(Web 设计 · 离线预览 · 导入导出)', en: 'Theme Gallery (web design · offline preview · import / export)' },
'主题代码': { zh: '主题代码', en: 'Theme code' },
'主题包': { zh: '主题包', en: 'Theme package' },
'主题包。 系统会逐项校验(结构、变量白名单、取值合法性、': { zh: '主题包。 系统会逐项校验(结构、变量白名单、取值合法性、', en: 'theme package. The system validates every item (structure, variable whitelist, value legality,' },
'主题包已导出': { zh: '主题包已导出', en: 'Theme package exported' },
'主题包格式说明': { zh: '主题包格式说明', en: 'Theme package format' },
'主题名称': { zh: '主题名称', en: 'Theme name' },
'主题名称只能包含中文、字母、数字、空格与 - _ . ( )': { zh: '主题名称只能包含中文、字母、数字、空格与 - _ . ( )', en: 'The theme name may only contain Chinese, letters, digits, spaces and - _ . ( )' },
'主题导入成功': { zh: '主题导入成功', en: 'Theme imported' },
'主题广场': { zh: '主题广场', en: 'Theme Gallery' },
'主题校验未通过,已拒绝应用': { zh: '主题校验未通过,已拒绝应用', en: 'Theme validation failed; applying it was refused' },
'主题离线预览': { zh: '主题离线预览', en: 'Offline theme preview' },
'主题设计器': { zh: '主题设计器', en: 'Theme designer' },
'主题:': { zh: '主题:', en: 'Theme:' },
'之下,避免误写系统关键目录。': { zh: '之下,避免误写系统关键目录。', en: 'and below, to avoid accidentally writing into critical system directories.' },
'之前建议先做一次入向实测': { zh: '之前建议先做一次入向实测', en: 'it is recommended to run an inbound reachability test first' },
'之后某些内网地址访问不了」。留空表示不动,用': { zh: '之后某些内网地址访问不了」。留空表示不动,用', en: 'afterwards certain LAN addresses become unreachable". Leave blank to leave it unchanged; use' },
'之后每个请求带': { zh: '之后每个请求带', en: 'then every request carries' },
'之外的省略形式': { zh: '之外的省略形式', en: 'the abbreviated form other than' },
'之间,性能更高)': { zh: '之间,性能更高)', en: 'and beyond, with better performance)' },
'乙': { zh: '乙', en: 'Yi' },
'九': { zh: '九', en: '9th' },
'也原生支持。 配置会写入': { zh: '也原生支持。 配置会写入', en: 'is also supported natively. The configuration is written to' },
'也可以自己填(多个之间用英文逗号分隔)': { zh: '也可以自己填(多个之间用英文逗号分隔)', en: 'You can also fill this in yourself (separate multiple entries with commas)' },
'书房': { zh: '书房', en: 'Study' },
'二': { zh: '二', en: '2nd' },
'二十': { zh: '二十', en: '20th' },
'互斥二选一': { zh: '互斥二选一', en: 'Mutually exclusive, pick one' },
'互相访问。默认': { zh: '互相访问。默认', en: 'access each other. By default' },
'互联网测速': { zh: '互联网测速', en: 'Internet speed test' },
'五': { zh: '五', en: '5th' },
'交换机端口需开启': { zh: '交换机端口需开启', en: 'requires the switch port to enable' },
'亥': { zh: '亥', en: 'Hai' },
'人在外面想回内网拿文件、访问家里的': { zh: '人在外面想回内网拿文件、访问家里的', en: 'You are away and want to fetch files from the LAN or reach the' },
'什么应用(': { zh: '什么应用(', en: 'which apps (' },
'什么时候选它:': { zh: '什么时候选它:', en: 'When to pick it: ' },
'什么都不用改:三平台连接方式': { zh: '什么都不用改:三平台连接方式', en: 'Nothing needs to be changed: connection methods for the three platforms' },
'仅 IPv4': { zh: '仅 IPv4', en: 'IPv4 only' },
'仅 IPv6': { zh: '仅 IPv6', en: 'IPv6 only' },
'仅使用已有前缀,不主动向运营商索取新的 PD': { zh: '仅使用已有前缀,不主动向运营商索取新的 PD', en: 'Use only the prefix already held; never ask the ISP for a new PD' },
'仅保存': { zh: '仅保存', en: 'Save only' },
'仅做二层透传/旁路,不参与拨号,WAN 状态由上级设备决定。': { zh: '仅做二层透传/旁路,不参与拨号,WAN 状态由上级设备决定。', en: 'Layer-2 passthrough / bypass only; no dial-up here, and the WAN state is determined by the upstream device.' },
'仅定时触发': { zh: '仅定时触发', en: 'Timer only' },
'仅对当前客户端生效,等价于': { zh: '仅对当前客户端生效,等价于', en: 'Applies to the current client only, equivalent to' },
'仅本机': { zh: '仅本机', en: 'Local only' },
'仅水位触发': { zh: '仅水位触发', en: 'Watermark only' },
'仅自定义': { zh: '仅自定义', en: 'Custom only' },
'仅记录。 应用分类直接复用': { zh: '仅记录。 应用分类直接复用', en: 'record only. App categories are reused directly from' },
'仅语法检查(不应用)': { zh: '仅语法检查(不应用)', en: 'Syntax check only (do not apply)' },
'仅运营商下发': { zh: '仅运营商下发', en: 'Delivered by the ISP only' },
'仅限局域网(推荐,': { zh: '仅限局域网(推荐,', en: 'LAN only (recommended,' },
'仍在等待外网报文,还剩': { zh: '仍在等待外网报文,还剩', en: 'is still waiting for external packets,' },
'仍是「复制」,否则是「中断当前命令」。': { zh: '仍是「复制」,否则是「中断当前命令」。', en: 'is still "Copy"; otherwise it is "Interrupt current command".' },
'仍要删除': { zh: '仍要删除', en: 'Delete anyway' },
'从下面三个按钮里挑一个开始 —— 手机推送最省事。</p>': { zh: '从下面三个按钮里挑一个开始 —— 手机推送最省事。</p>', en: 'Pick one of the three buttons below to start — phone push is the least trouble.</p>' },
'从地址池分配(': { zh: '从地址池分配(', en: 'allocated from the address pool (' },
'从未更新': { zh: '从未更新', en: 'Never updated' },
'从本机已有文件安装(机器访问不了': { zh: '从本机已有文件安装(机器访问不了', en: 'Install from a file that already exists on this machine (the machine cannot reach' },
'从证书机构买的、别处签好的,直接粘进来(或填这台机器上的文件路径)。 证书和私钥可以粘在同一个框里,会自动拆开。': { zh: '从证书机构买的、别处签好的,直接粘进来(或填这台机器上的文件路径)。 证书和私钥可以粘在同一个框里,会自动拆开。', en: 'Bought from a certificate authority or issued elsewhere: just paste it in (or enter the file path on this machine). The certificate and the private key can be pasted into the same box and will be split automatically.' },
'仓库': { zh: '仓库', en: 'repository' },
'仓库:标签': { zh: '仓库:标签', en: 'Repository:Tag' },
'代理, 否则包出得去回不来,家用环境多半搞不定': { zh: '代理, 否则包出得去回不来,家用环境多半搞不定', en: 'a proxy; otherwise packets go out but cannot get back, which most home setups cannot handle' },
'以上,过低会影响浏览器': { zh: '以上,过低会影响浏览器', en: 'or higher; too low a value will affect the browser' },
'以下内容': { zh: '以下内容', en: 'The following' },
'以下按钮会真正改变网络状态,导致当前连接短暂中断。请在填写并保存凭据、且确认': { zh: '以下按钮会真正改变网络状态,导致当前连接短暂中断。请在填写并保存凭据、且确认', en: 'The buttons below actually change network state and cause the current connection to be briefly interrupted. Please fill in and save the credentials first, and confirm' },
'以下文件按设计跳过:': { zh: '以下文件按设计跳过:', en: 'The following files are skipped by design:' },
'以下文件系统缺少格式化工具:': { zh: '以下文件系统缺少格式化工具:', en: 'Formatting tools are missing for the following file systems:' },
'以此为基础': { zh: '以此为基础', en: 'Build on this' },
'以确认:': { zh: '以确认:', en: 'to confirm:' },
'以继续:': { zh: '以继续:', en: 'to continue:' },
'任何一项不通过都会给出中文原因并拒绝应用': { zh: '任何一项不通过都会给出中文原因并拒绝应用', en: 'If any item fails, the reason is reported in Chinese and the change is rejected' },
'任务': { zh: '任务', en: 'Task' },
'份已上锁': { zh: '份已上锁', en: 'locked' },
'份快照': { zh: '份快照', en: 'snapshots' },
'份(0': { zh: '份(0', en: 'copies (0' },
'份, 目录': { zh: '份, 目录', en: 'copies; directory' },
'休眠中唤醒。': { zh: '休眠中唤醒。', en: 'Wake from sleep.' },
'优先从': { zh: '优先从', en: 'prefer' },
'优先级': { zh: '优先级', en: 'Priority' },
'优先级标记与连接数限制。': { zh: '优先级标记与连接数限制。', en: 'Priority marks and connection count limits.' },
'优先级规则(': { zh: '优先级规则(', en: 'Priority rules (' },
'会': { zh: '会', en: 'will' },
'会作为上下文随防火墙 / DHCP 等模块一起生效)': { zh: '会作为上下文随防火墙 / DHCP 等模块一起生效)', en: 'its settings take effect as context together with modules such as firewall and DHCP)' },
'会写入配置文件并重启对应的共享服务:': { zh: '会写入配置文件并重启对应的共享服务:', en: 'writes the configuration file and restarts the corresponding sharing service:' },
'会删除': { zh: '会删除', en: 'will delete' },
'会删除已聚合的历史数据与聚合游标,统计将从零重新开始。 这一步': { zh: '会删除已聚合的历史数据与聚合游标,统计将从零重新开始。 这一步', en: 'deletes the aggregated historical data and the aggregation cursor; statistics restart from zero. This step' },
'会删除所有已停止的容器。不会影响正在运行的容器与镜像。': { zh: '会删除所有已停止的容器。不会影响正在运行的容器与镜像。', en: 'It deletes all stopped containers. Running containers and images are not affected.' },
'会删除未被任何容器引用的悬空镜像(dangling)。': { zh: '会删除未被任何容器引用的悬空镜像(dangling)。', en: 'It deletes dangling images that are not referenced by any container.' },
'会删除没有被容器使用的数据卷,': { zh: '会删除没有被容器使用的数据卷,', en: 'It deletes volumes that are not used by any container,' },
'会删除项目': { zh: '会删除项目', en: 'will delete the project' },
'会同时写入': { zh: '会同时写入', en: 'will also write' },
'会同时重算背景、文字、状态色与按钮渐变,保证对比度': { zh: '会同时重算背景、文字、状态色与按钮渐变,保证对比度', en: 'recomputes the background, text, status colors and button gradients at the same time, ensuring sufficient contrast' },
'会把': { zh: '会把', en: 'will put' },
'会把它插到前面转发': { zh: '会把它插到前面转发', en: 'inserts it ahead for forwarding' },
'会改变流量转发行为': { zh: '会改变流量转发行为', en: 'changes how traffic is forwarded' },
'会更快、更直接。 拿不准就开着,出问题的概率很低。': { zh: '会更快、更直接。 拿不准就开着,出问题的概率很低。', en: 'is faster and more direct. Leave it on if you are unsure; the chance of a problem is very low.' },
'会消耗双倍带宽,也会被上游运营商看到。': { zh: '会消耗双倍带宽,也会被上游运营商看到。', en: 'which doubles the bandwidth used and is visible to your upstream ISP.' },
'会用备份': { zh: '会用备份', en: 'will use the backup' },
'会给默认网桥分配一个': { zh: '会给默认网桥分配一个', en: 'will assign the default bridge a' },
'会让「已建立连接」绕过 netfilter 钩子,导致 DSCP 打标与 IP 限速完全失效。 请先到「概览': { zh: '会让「已建立连接」绕过 netfilter 钩子,导致 DSCP 打标与 IP 限速完全失效。 请先到「概览', en: 'it makes "established connections" bypass the netfilter hooks, so DSCP marking and IP rate limiting stop working entirely. Please go to the "Overview' },
'会话': { zh: '会话', en: 'Session' },
'会话。': { zh: '会话。', en: 'session.' },
'会话已失效,请重新连接': { zh: '会话已失效,请重新连接', en: 'The session is no longer valid; please reconnect' },
'会话数量': { zh: '会话数量', en: 'Number of sessions' },
'会话状态与排错': { zh: '会话状态与排错', en: 'Session status and troubleshooting' },
'会话账号': { zh: '会话账号', en: 'Session account' },
'会话超时': { zh: '会话超时', en: 'Session timeout' },
'会话,把总带宽叠加起来(爱快「多拨」的等效实现)。 每条会话是一张独立的': { zh: '会话,把总带宽叠加起来(爱快「多拨」的等效实现)。 每条会话是一张独立的', en: 'sessions, stacking the total bandwidth (the equivalent of iKuai "multi-dial"). Each session is an independent' },
'传到': { zh: '传到', en: 'forwarded to' },
'似乎已获取委派前缀': { zh: '似乎已获取委派前缀', en: 'A delegated prefix appears to have been obtained' },
'但不会重启 Docker(避免影响正在运行的局域网与 RealVNC 会话)': { zh: '但不会重启 Docker(避免影响正在运行的局域网与 RealVNC 会话)', en: 'but Docker will not be restarted (to avoid disturbing the running LAN and any RealVNC session)' },
'但打不开网页」。这个功能就叫': { zh: '但打不开网页」。这个功能就叫', en: 'but web pages will not open". This feature is called' },
'位置': { zh: '位置', en: 'Location' },
'位)': { zh: '位)', en: 'bits)' },
'体检': { zh: '体检', en: 'Health check' },
'体检失败,请稍后重试': { zh: '体检失败,请稍后重试', en: 'Health check failed, please try again later' },
'何时(时间组)': { zh: '何时(时间组)', en: 'When (time group)' },
'作用范围': { zh: '作用范围', en: 'Scope' },
'作者': { zh: '作者', en: 'Author' },
'作者名': { zh: '作者名', en: 'Author name' },
'作者:': { zh: '作者:', en: 'Author:' },
'你可以先继续使用其他已完成的模块。如果你希望优先开发这一项, 欢迎到项目主页反馈:': { zh: '你可以先继续使用其他已完成的模块。如果你希望优先开发这一项, 欢迎到项目主页反馈:', en: 'You can keep using the other completed modules for now. If you would like this one built first, please leave feedback on the project homepage:' },
'你在浏览器里输入的是网址(比如': { zh: '你在浏览器里输入的是网址(比如', en: 'What you type in the browser is a URL (for example' },
'你的Key': { zh: '你的Key', en: 'Your Key' },
'你的宽带是哪一种?': { zh: '你的宽带是哪一种?', en: 'Which kind of broadband connection do you have?' },
'你这台路由器的全部设置': { zh: '你这台路由器的全部设置', en: 'All settings of this router' },
'使用': { zh: '使用', en: 'Use' },
'使用上级下发的': { zh: '使用上级下发的', en: 'use the value delivered by upstream' },
'使用中': { zh: '使用中', en: 'In use' },
'使用率': { zh: '使用率', en: 'Utilization' },
'使用率超过就清': { zh: '使用率超过就清', en: 'clear when utilization exceeds' },
'使用系统按参数生成的默认规则(含': { zh: '使用系统按参数生成的默认规则(含', en: 'Use the default rules the system generates from the parameters (including' },
'使用须知': { zh: '使用须知', en: 'Usage notes' },
'例如': { zh: '例如', en: 'For example' },
'例如 上学日': { zh: '例如 上学日', en: 'e.g. school day' },
'例如 全家共享': { zh: '例如 全家共享', en: 'e.g. shared by the whole family' },
'例如 夜间断娱乐': { zh: '例如 夜间断娱乐', en: 'e.g. cut off entertainment at night' },
'例如 孩子的设备': { zh: '例如 孩子的设备', en: 'e.g. the child\'s devices' },
'例如 影音库': { zh: '例如 影音库', en: 'e.g. media library' },
'例如 电信': { zh: '例如 电信', en: 'e.g. China Telecom' },
'例如 群晖': { zh: '例如 群晖', en: 'e.g. Synology' },
'例如:': { zh: '例如:', en: 'For example:' },
'例如:切换前备份': { zh: '例如:切换前备份', en: 'For example: back up before switching' },
'依赖自检与安装': { zh: '依赖自检与安装', en: 'Dependency Check & Install' },
'依赖自检与安装」安装,或执行': { zh: '依赖自检与安装」安装,或执行', en: 'Dependency Check & Install" to install it, or run' },
'依赖自检与安装」或直接': { zh: '依赖自检与安装」或直接', en: 'Dependency Check & Install", or just' },
'依赖自检与安装」页一键安装。': { zh: '依赖自检与安装」页一键安装。', en: 'Dependency Check & Install" page and install them with one click.' },
'侧 IPv6': { zh: '侧 IPv6', en: 'side IPv6' },
'侧不开放)': { zh: '侧不开放)', en: 'side is not exposed)' },
'侧全部流量': { zh: '侧全部流量', en: 'all traffic on that side' },
'侧如何把前缀下发给内网设备(配合「': { zh: '侧如何把前缀下发给内网设备(配合「', en: 'side how to push the prefix down to LAN devices (together with "' },
'侧开放': { zh: '侧开放', en: 'open on that side' },
'侧栏宽度': { zh: '侧栏宽度', en: 'Sidebar width' },
'侧栏折叠宽度': { zh: '侧栏折叠宽度', en: 'Sidebar collapsed width' },
'侧装': { zh: '侧装', en: 'installed on that side' },
'侧靠': { zh: '侧靠', en: 'side relies on' },
'侧靠内核': { zh: '侧靠内核', en: 'side relies on the kernel' },
'侧)': { zh: '侧)', en: 'side)' },
'保存与应用': { zh: '保存与应用', en: 'Save and apply' },
'保存为': { zh: '保存为', en: 'Save as' },
'保存到': { zh: '保存到', en: 'Save to' },
'保存只写配置文件,': { zh: '保存只写配置文件,', en: 'Save only writes the configuration file,' },
'保存后需点击「保存并应用」才会写入': { zh: '保存后需点击「保存并应用」才会写入', en: 'After saving you must click "Save & Apply" for it to be written' },
'保存后需点击「保存并应用」;应用时才会真正创建子接口。': { zh: '保存后需点击「保存并应用」;应用时才会真正创建子接口。', en: 'After saving you must click "Save & Apply"; the sub-interface is only created when the change is applied.' },
'保存失败': { zh: '保存失败', en: 'Save failed' },
'保存失败:': { zh: '保存失败:', en: 'Save failed: ' },
'保存并应用': { zh: '保存并应用', en: 'Save & Apply' },
'保存并生效': { zh: '保存并生效', en: 'Save and take effect' },
'保存并重启': { zh: '保存并重启', en: 'Save and reboot' },
'保存并重启后台': { zh: '保存并重启后台', en: 'Save and restart the backend' },
'保存救援通道设置': { zh: '保存救援通道设置', en: 'Save rescue channel settings' },
'保存策略': { zh: '保存策略', en: 'Save policy' },
'保存自动备份设置': { zh: '保存自动备份设置', en: 'Save automatic backup settings' },
'保存自动快照策略': { zh: '保存自动快照策略', en: 'Save automatic snapshot policy' },
'保存设置': { zh: '保存设置', en: 'Save settings' },
'保存配置': { zh: '保存配置', en: 'Save settings' },
'保存项目': { zh: '保存项目', en: 'Save project' },
'保护': { zh: '保护', en: 'Protection' },
'保护状态': { zh: '保护状态', en: 'Protection status' },
'保活间隔': { zh: '保活间隔', en: 'Keepalive interval' },
'保留': { zh: '保留', en: 'Keep' },
'保留 / 未接线': { zh: '保留 / 未接线', en: 'Reserved / not connected' },
'保留份数': { zh: '保留份数', en: 'Number of copies to keep' },
'保留天数': { zh: '保留天数', en: 'Retention days' },
'保留策略与导出': { zh: '保留策略与导出', en: 'Retention policy and export' },
'保证': { zh: '保证', en: 'Guarantee' },
'信息': { zh: '信息', en: 'Information' },
'信息浅底': { zh: '信息浅底', en: 'Info tint' },
'信息色': { zh: '信息色', en: 'Info colour' },
'修复失败': { zh: '修复失败', en: 'Fix failed' },
'修复完成': { zh: '修复完成', en: 'Fix finished' },
'修改': { zh: '修改', en: 'Modify' },
'修改后请点击右上角「保存并应用」才会写入规则并生效。': { zh: '修改后请点击右上角「保存并应用」才会写入规则并生效。', en: 'After making changes, click "Save and Apply" in the top-right corner to write the rules and make them take effect.' },
'修改时间': { zh: '修改时间', en: 'Modification time' },
'修改管理后台的': { zh: '修改管理后台的', en: 'modify the management backend\'s' },
'修改管理密码': { zh: '修改管理密码', en: 'Change admin password' },
'候选:': { zh: '候选:', en: 'Candidates: ' },
'值得留意。': { zh: '值得留意。', en: 'Worth noting.' },
'值(Value)': { zh: '值(Value)', en: 'Value' },
'值)': { zh: '值)', en: 'value)' },
'偏高': { zh: '偏高', en: 'Slightly high' },
'停掉所有打印相关服务,631 / 9100 都不再监听': { zh: '停掉所有打印相关服务,631 / 9100 都不再监听', en: 'Stop all print-related services; 631 / 9100 will no longer be listening' },
'停止': { zh: '停止', en: 'Stop' },
'停止容器': { zh: '停止容器', en: 'Stop container' },
'停止服务': { zh: '停止服务', en: 'Stop service' },
'停止(': { zh: '停止(', en: 'Stop (' },
'停用': { zh: '停用', en: 'Disable' },
'健康检查': { zh: '健康检查', en: 'Health check' },
'允许同步的网段': { zh: '允许同步的网段', en: 'Subnets allowed to sync' },
'允许局域网设备向本机同步时间': { zh: '允许局域网设备向本机同步时间', en: 'Allow LAN devices to sync time from this machine' },
'允许局域网设备自动申请端口映射。出于安全考虑,': { zh: '允许局域网设备自动申请端口映射。出于安全考虑,', en: 'Allow LAN devices to request port mappings automatically. For security reasons,' },
'允许局域网访问(推荐)': { zh: '允许局域网访问(推荐)', en: 'Allow LAN access (recommended)' },
'允许所有来源(含': { zh: '允许所有来源(含', en: 'Allow all sources (including' },
'允许的用户(逗号分隔,需系统里已存在)': { zh: '允许的用户(逗号分隔,需系统里已存在)', en: 'Allowed users (comma-separated; they must already exist in the system)' },
'允许网段已修改,请点击保存并应用': { zh: '允许网段已修改,请点击保存并应用', en: 'Allowed network segments have been modified, please click Save & Apply' },
'允许网段(留空': { zh: '允许网段(留空', en: 'Allowed subnets (leave blank' },
'允许访问的网段(逗号分隔,': { zh: '允许访问的网段(逗号分隔,', en: 'Networks allowed to access (comma-separated,' },
'先「测速」挑最快的,再更新。': { zh: '先「测速」挑最快的,再更新。', en: 'Run "Speed Test" first and pick the fastest, then update.' },
'先告诉这台机器「宽带从哪里进来」。这一步做完,本机自己就能上网; 要让内网设备也上,还要做完第': { zh: '先告诉这台机器「宽带从哪里进来」。这一步做完,本机自己就能上网; 要让内网设备也上,还要做完第', en: 'First tell this machine "where the broadband comes in". Once this step is done the machine itself can access the Internet; to bring LAN devices online as well, step' },
'先在「': { zh: '先在「', en: 'First, in "' },
'先把最快的那个勾上(可以多选几个当备用),再回上面点保存。': { zh: '先把最快的那个勾上(可以多选几个当备用),再回上面点保存。', en: 'Tick the fastest one first (you can select several as backups), then go back up and click Save.' },
'先查一次用量报表,': { zh: '先查一次用量报表,', en: 'Check the usage report first,' },
'先自动备份': { zh: '先自动备份', en: 'automatically back up first' },
'光猫已拨号,下挂设备自动获取地址;也用于部分地区「IPoE 免拨号」接入。': { zh: '光猫已拨号,下挂设备自动获取地址;也用于部分地区「IPoE 免拨号」接入。', en: 'The ONT already dialled; downstream devices get their addresses automatically. Also used for "IPoE, no dial-up" access in some regions.' },
'光猫桥接 + 本机拨号,需要宽带账号密码(电信/联通/移动/广电均常见)。': { zh: '光猫桥接 + 本机拨号,需要宽带账号密码(电信/联通/移动/广电均常见)。', en: 'ONT in bridge mode + dial-up on this host; needs your broadband account and password (common with China Telecom / Unicom / Mobile / CBN).' },
'免打扰': { zh: '免打扰', en: 'Do not disturb' },
'免打扰只压「警告」和「提示」,': { zh: '免打扰只压「警告」和「提示」,', en: 'Do Not Disturb only suppresses "Warning" and "Notice",' },
'免打扰时段': { zh: '免打扰时段', en: 'Do Not Disturb schedule' },
'兔': { zh: '兔', en: 'Rabbit' },
'入向不可达': { zh: '入向不可达', en: 'Inbound unreachable' },
'入向可达': { zh: '入向可达', en: 'Inbound reachable' },
'入向实测成功:外网确实能连进来': { zh: '入向实测成功:外网确实能连进来', en: 'Inbound test succeeded: the internet really can reach this host' },
'入向实测(唯一能拍板的一步)': { zh: '入向实测(唯一能拍板的一步)', en: 'Inbound reachability test (the only decisive step)' },
'全不选': { zh: '全不选', en: 'Select none' },
'全局地址': { zh: '全局地址', en: 'Global address' },
'全局开关': { zh: '全局开关', en: 'Global switch' },
'全端口映射」。 常用于游戏主机、监控': { zh: '全端口映射」。 常用于游戏主机、监控', en: 'full port mapping". Often used for game consoles, cameras' },
'全网广播': { zh: '全网广播', en: 'Broadcast to the whole network' },
'全选': { zh: '全选', en: 'Select all' },
'全部': { zh: '全部', en: 'All' },
'全部下载在': { zh: '全部下载在', en: 'All downloads are in' },
'全部主题(': { zh: '全部主题(', en: 'All themes (' },
'全部依赖均已就绪,无需安装。': { zh: '全部依赖均已就绪,无需安装。', en: 'All dependencies are ready; nothing needs to be installed.' },
'全部依赖已安装完成': { zh: '全部依赖已安装完成', en: 'All dependencies have been installed' },
'全部动作': { zh: '全部动作', en: 'All actions' },
'全部数据,且无法恢复': { zh: '全部数据,且无法恢复', en: 'all data, and it cannot be recovered' },
'全部来源': { zh: '全部来源', en: 'All sources' },
'全部流量经过本机(': { zh: '全部流量经过本机(', en: 'all traffic passes through this machine (' },
'全部测试': { zh: '全部测试', en: 'Test all' },
'全部物理口': { zh: '全部物理口', en: 'All physical interfaces' },
'全部设备': { zh: '全部设备', en: 'All devices' },
'全部(如': { zh: '全部(如', en: 'all (such as' },
'八': { zh: '八', en: '8th' },
'公网': { zh: '公网', en: 'Public network' },
'公网 IPv6 地址': { zh: '公网 IPv6 地址', en: 'Public IPv6 address' },
'公网地址': { zh: '公网地址', en: 'Public address' },
'公网能力检测': { zh: '公网能力检测', en: 'Public network capability check' },
'公钥数': { zh: '公钥数', en: 'Number of public keys' },
'公钥文件(': { zh: '公钥文件(', en: 'Public key file (' },
'公钥登录': { zh: '公钥登录', en: 'Public key login' },
'公钥认证': { zh: '公钥认证', en: 'Public key authentication' },
'六': { zh: '六', en: '6th' },
'共': { zh: '共', en: 'Total' },
'共享': { zh: '共享', en: 'Share' },
'共享。': { zh: '共享。', en: 'Shared.' },
'共享上网)': { zh: '共享上网)', en: 'shared Internet access)' },
'共享名': { zh: '共享名', en: 'Share name' },
'共享后其他设备才能发现这台打印机': { zh: '共享后其他设备才能发现这台打印机', en: 'After sharing, other devices can discover this printer' },
'共享密钥': { zh: '共享密钥', en: 'Share password' },
'共享此目录': { zh: '共享此目录', en: 'Share this directory' },
'共享目录': { zh: '共享目录', en: 'Shared directory' },
'共开放': { zh: '共开放', en: 'Open in total' },
'关掉': { zh: '关掉', en: 'Turn off' },
'关掉再开启会换一个。请抄到另一台机器上保存。': { zh: '关掉再开启会换一个。请抄到另一台机器上保存。', en: 'Turning it off and on again generates a new one. Copy it to another machine and keep it there.' },
'关掉后仍然会探测,但不会推送任何消息': { zh: '关掉后仍然会探测,但不会推送任何消息', en: 'Detection still runs after it is turned off, but no messages will be pushed.' },
'关键字': { zh: '关键字', en: 'Keyword' },
'关闭': { zh: '关闭', en: 'Close' },
'关闭 WOL': { zh: '关闭 WOL', en: 'Disable WOL' },
'关闭中…': { zh: '关闭中…', en: 'Turning off…' },
'关闭会带来什么': { zh: '关闭会带来什么', en: 'What turning it off entails' },
'关闭会带来什么」看清楚再动。': { zh: '关闭会带来什么」看清楚再动。', en: 'What turning it off entails」read it carefully before making changes.' },
'关闭保护': { zh: '关闭保护', en: 'Turn off protection' },
'关闭保护,允许配置生效': { zh: '关闭保护,允许配置生效', en: 'Disable protection and let the configuration take effect' },
'关闭后,所有「保存并应用」操作将': { zh: '关闭后,所有「保存并应用」操作将', en: 'Once disabled, all「Save and Apply」operations will' },
'关闭打印服务': { zh: '关闭打印服务', en: 'Disable print service' },
'关闭时仅做': { zh: '关闭时仅做', en: 'When disabled, only' },
'关闭构建保护模式': { zh: '关闭构建保护模式', en: 'Turn off build protection mode' },
'关闭软加速': { zh: '关闭软加速', en: 'Disable software acceleration' },
'其中某一份': { zh: '其中某一份', en: 'One of them' },
'其中的数据会永久丢失': { zh: '其中的数据会永久丢失', en: 'the data in them will be lost permanently' },
'其他': { zh: '其他', en: 'Other' },
'其它': { zh: '其它', en: 'Other' },
'其它域名(逗号分隔)': { zh: '其它域名(逗号分隔)', en: 'Other domains (comma-separated)' },
'其设置会作为上下文随防火墙 / DHCP 等模块一起生效)': { zh: '其设置会作为上下文随防火墙 / DHCP 等模块一起生效)', en: 'its settings take effect as context together with modules such as firewall and DHCP)' },
'内存': { zh: '内存', en: 'Memory' },
'内存为': { zh: '内存为', en: 'Memory is' },
'内存占用': { zh: '内存占用', en: 'Memory usage' },
'内存的机器上会直接把进程打死)。': { zh: '内存的机器上会直接把进程打死)。', en: 'on low-memory machines the process is killed outright).' },
'内容': { zh: '内容', en: 'Content' },
'内核': { zh: '内核', en: 'Kernel' },
'内核不提供该信息': { zh: '内核不提供该信息', en: 'Not provided by the kernel' },
'内核可用拥塞算法': { zh: '内核可用拥塞算法', en: 'Available kernel congestion control algorithms' },
'内核无模块': { zh: '内核无模块', en: 'No kernel module' },
'内核模块': { zh: '内核模块', en: 'Kernel modules' },
'内核模块已加载,但缺少': { zh: '内核模块已加载,但缺少', en: 'Kernel module is loaded, but missing' },
'内核自带的': { zh: '内核自带的', en: 'Built into the kernel' },
'内核表': { zh: '内核表', en: 'kernel table' },
'内核转发与加速': { zh: '内核转发与加速', en: 'Kernel Forwarding & Acceleration' },
'内核里有 wireguard 模块,但当前': { zh: '内核里有 wireguard 模块,但当前', en: 'The wireguard module exists in the kernel, but it is currently' },
'内网': { zh: '内网', en: 'LAN' },
'内网地址': { zh: '内网地址', en: 'LAN address' },
'内网文件共享': { zh: '内网文件共享', en: 'LAN file sharing' },
'内网文件共享(SMB / NFS,跨平台模板)': { zh: '内网文件共享(SMB / NFS,跨平台模板)', en: 'LAN File Sharing (SMB / NFS, cross-platform templates)' },
'内网测速': { zh: '内网测速', en: 'LAN speed test' },
'内网测速使用': { zh: '内网测速使用', en: 'The LAN speed test uses' },
'内网端口': { zh: '内网端口', en: 'LAN port' },
'内网网卡': { zh: '内网网卡', en: 'LAN interface' },
'内网这边': { zh: '内网这边', en: 'the LAN side' },
'内置': { zh: '内置', en: 'Built-in' },
'内置主题不可修改或删除;想改的话点「以此为基础」复制到设计器里。': { zh: '内置主题不可修改或删除;想改的话点「以此为基础」复制到设计器里。', en: 'Built-in themes cannot be modified or deleted; to customize one, click「Use as Basis」to copy it into the designer.' },
'内置磁盘(': { zh: '内置磁盘(', en: 'Internal disks (' },
'内置默认': { zh: '内置默认', en: 'Built-in default' },
'再次检测': { zh: '再次检测', en: 'Detect again' },
'写入公钥': { zh: '写入公钥', en: 'Write public key' },
'写入磁盘': { zh: '写入磁盘', en: 'Write to disk' },
'写死数值': { zh: '写死数值', en: 'Hard-coded values' },
'农历八月': { zh: '农历八月', en: 'The eighth lunar month' },
'冬': { zh: '冬', en: '11' },
'冬至': { zh: '冬至', en: 'Winter Solstice' },
'冲突、路由环路、防火墙锁死、': { zh: '冲突、路由环路、防火墙锁死、', en: 'conflicts, routing loops, a locked-up firewall,' },
'冲突。': { zh: '冲突。', en: 'conflict.' },
'决定「什么时候自动动手」。清理哪些内容、各留多久,在下面一张卡片里单独设置。': { zh: '决定「什么时候自动动手」。清理哪些内容、各留多久,在下面一张卡片里单独设置。', en: 'Determines「when the automatic action runs」. Which content is cleaned up and how long each item is kept are configured separately in the card below.' },
'决定多条会话如何共同承载流量。': { zh: '决定多条会话如何共同承载流量。', en: 'Determines how multiple sessions share the traffic load together.' },
'冷却状态也会一并清空,所以清完之后下一次命中会立刻推送。': { zh: '冷却状态也会一并清空,所以清完之后下一次命中会立刻推送。', en: 'The cooldown state is cleared as well, so the next match is pushed immediately after the reset.' },
'凭据保存在本机': { zh: '凭据保存在本机', en: 'Credentials are saved locally on this machine' },
'凭据保存在本机数据库,仅用于向该服务商发起更新请求。': { zh: '凭据保存在本机数据库,仅用于向该服务商发起更新请求。', en: 'The credentials are stored in the local database and are used only to send update requests to that provider.' },
'出口': { zh: '出口', en: 'Egress' },
'出口地址': { zh: '出口地址', en: 'Egress address' },
'出口排队;下行必须先把入口流量重定向到': { zh: '出口排队;下行必须先把入口流量重定向到', en: 'egress queuing; for downstream, ingress traffic must first be redirected to' },
'出口网卡': { zh: '出口网卡', en: 'Egress interface' },
'出向地址伪装与': { zh: '出向地址伪装与', en: 'Outbound address masquerading and' },
'出站': { zh: '出站', en: 'Outbound' },
'分': { zh: '分', en: 'min' },
'分布统计': { zh: '分布统计', en: 'Distribution statistics' },
'分执行': { zh: '分执行', en: 'executed separately' },
'分摊比例(可选)': { zh: '分摊比例(可选)', en: 'Allocation ratio (optional)' },
'分析。': { zh: '分析。', en: 'analysis.' },
'分类库,时间规则按': { zh: '分类库,时间规则按', en: 'classification database, time rules follow' },
'分类库:': { zh: '分类库:', en: 'Classification database:' },
'分类)': { zh: '分类)', en: 'classification)' },
'分类,可多选):': { zh: '分类,可多选):', en: 'categories, multiple selections allowed):' },
'分配方式': { zh: '分配方式', en: 'Allocation method' },
'分配结束子网': { zh: '分配结束子网', en: 'allocation end subnet' },
'分配起始子网': { zh: '分配起始子网', en: 'allocation start subnet' },
'分钟': { zh: '分钟', en: 'min' },
'分钟聚合一次。这里点查询': { zh: '分钟聚合一次。这里点查询', en: 'minutes to aggregate once. Click Query here' },
'分钟自动回收。 有选中文字时': { zh: '分钟自动回收。 有选中文字时', en: 'min automatically reclaimed. When text is selected,' },
'分钟,对在家办公的人差别巨大。': { zh: '分钟,对在家办公的人差别巨大。', en: 'min; the difference is huge for people who work from home.' },
'切换到这个模式': { zh: '切换到这个模式', en: 'Switch to this mode' },
'切换模式时本页会自动把另一边停干净,不用你手工去': { zh: '切换模式时本页会自动把另一边停干净,不用你手工去', en: 'When switching modes this page automatically shuts the other side down cleanly, so you do not need to manually' },
'列出可升级包': { zh: '列出可升级包', en: 'List upgradable packages' },
'列表。': { zh: '列表。', en: 'list.' },
'列表见下方': { zh: '列表见下方', en: 'The list is shown below' },
'则是你对': { zh: '则是你对', en: 'then it is your' },
'创建': { zh: '创建', en: 'Create' },
'创建后上锁': { zh: '创建后上锁', en: 'Lock after creation' },
'创建失败': { zh: '创建失败', en: 'Creation failed' },
'创建时间': { zh: '创建时间', en: 'Created' },
'创建目录': { zh: '创建目录', en: 'Create directory' },
'创建自己的': { zh: '创建自己的', en: 'create your own' },
'初': { zh: '初', en: '1st' },
'初十': { zh: '初十', en: '10th' },
'初始化未完全成功,部分数据可能未加载:': { zh: '初始化未完全成功,部分数据可能未加载:', en: 'Initialisation did not fully succeed; some data may be missing: ' },
'删': { zh: '删', en: 'Delete' },
'删除': { zh: '删除', en: 'Delete' },
'删除中': { zh: '删除中', en: 'Deleting' },
'删除主题': { zh: '删除主题', en: 'Delete theme' },
'删除全部': { zh: '删除全部', en: 'Delete all' },
'删除全部 VPN 配置': { zh: '删除全部 VPN 配置', en: 'Delete the whole VPN configuration' },
'删除后无法恢复。若你还想保留,建议先点「导出」备份。': { zh: '删除后无法恢复。若你还想保留,建议先点「导出」备份。', en: 'This cannot be recovered after deletion. If you still want to keep it, click「Export」to back it up first.' },
'删除备份包': { zh: '删除备份包', en: 'Delete backup package' },
'删除失败': { zh: '删除失败', en: 'Delete failed' },
'删除客户端': { zh: '删除客户端', en: 'Delete client' },
'删除容器': { zh: '删除容器', en: 'Delete container' },
'删除所选': { zh: '删除所选', en: 'Delete selected' },
'删除打印队列': { zh: '删除打印队列', en: 'Delete print queue' },
'删除文件并中止': { zh: '删除文件并中止', en: 'delete the file and abort' },
'删除用户': { zh: '删除用户', en: 'Delete user' },
'删除行首的': { zh: '删除行首的', en: 'delete the leading' },
'删除项目': { zh: '删除项目', en: 'Delete project' },
'判定': { zh: '判定', en: 'Decision' },
'判定出口': { zh: '判定出口', en: 'Determine the egress' },
'判定出口 IP 是不是真的能被外网连进来(入向可达性实测)': { zh: '判定出口 IP 是不是真的能被外网连进来(入向可达性实测)', en: 'Check whether the egress IP can actually be reached from the internet (live inbound reachability test)' },
'判定和推送都由后台定时任务完成,': { zh: '判定和推送都由后台定时任务完成,', en: 'Both the decision and the push are handled by a background scheduled task,' },
'判定失败': { zh: '判定失败', en: 'Failed' },
'判定时间:': { zh: '判定时间:', en: 'Decision time:' },
'利用内核': { zh: '利用内核', en: 'Use the kernel' },
'别名': { zh: '别名', en: 'Alias' },
'到 ': { zh: '到 ', en: 'to ' },
'刷新': { zh: '刷新', en: 'Refresh' },
'刷新同步状态': { zh: '刷新同步状态', en: 'Refresh sync status' },
'刷新快照列表': { zh: '刷新快照列表', en: 'Refresh snapshot list' },
'刷新日志': { zh: '刷新日志', en: 'Refresh logs' },
'刷新映射表': { zh: '刷新映射表', en: 'Refresh the mapping table' },
'刷新本页面,确认能正常登录': { zh: '刷新本页面,确认能正常登录', en: 'Refresh this page, and confirm that you can log in normally' },
'刷新状态': { zh: '刷新状态', en: 'Refresh status' },
'刷新租约': { zh: '刷新租约', en: 'Refresh leases' },
'前提:运营商必须允许并发拨号': { zh: '前提:运营商必须允许并发拨号', en: 'Prerequisite: the ISP must allow concurrent dialing' },
'前缀': { zh: '前缀', en: 'Prefix' },
'前缀下发(': { zh: '前缀下发(', en: 'prefix delegation (' },
'前缀分配给内网。类似': { zh: '前缀分配给内网。类似', en: 'prefix is assigned to the LAN. Similar to' },
'前缀备注已修改,请点击保存并应用': { zh: '前缀备注已修改,请点击保存并应用', en: 'Prefix note modified, please click Save & Apply' },
'前缀委派(': { zh: '前缀委派(', en: 'Prefix delegation (' },
'前缀有效生命期': { zh: '前缀有效生命期', en: 'Prefix valid lifetime' },
'前缀留空即可': { zh: '前缀留空即可', en: 'leave the prefix empty' },
'前缀的规则命中记录,已逐条翻译。 开启自动滚动后可当作实时监控窗口使用。': { zh: '前缀的规则命中记录,已逐条翻译。 开启自动滚动后可当作实时监控窗口使用。', en: 'rule hit records for the prefix, already translated line by line. Once auto-scrolling is enabled it can be used as a live monitoring window.' },
'前缀长度': { zh: '前缀长度', en: 'Prefix length' },
'前缀首选生命期': { zh: '前缀首选生命期', en: 'Prefix preferred lifetime' },
'前缀(可留空)': { zh: '前缀(可留空)', en: 'Prefix (may be left empty)' },
'前缀(如': { zh: '前缀(如', en: 'Prefix (e.g.' },
'前缀(实时)': { zh: '前缀(实时)', en: 'prefix (live)' },
'剩': { zh: '剩', en: 'Remaining' },
'剩余': { zh: '剩余', en: 'Remaining' },
'剩余时间': { zh: '剩余时间', en: 'Remaining time' },
'剩余有效期': { zh: '剩余有效期', en: 'Remaining validity' },
'办理宽带时给的密码': { zh: '办理宽带时给的密码', en: 'The password provided when the broadband service was activated' },
'功能最全:免驱打印、AirPrint / Mopria、队列管理、Web 管理界面': { zh: '功能最全:免驱打印、AirPrint / Mopria、队列管理、Web 管理界面', en: 'Most complete feature set: driverless printing, AirPrint / Mopria, queue management, web admin interface' },
'加入': { zh: '加入', en: 'Add' },
'加完通道记得点一次「保存设置」。': { zh: '加完通道记得点一次「保存设置」。', en: 'After adding a channel, remember to click "Save Settings".' },
'加密': { zh: '加密', en: 'Encryption' },
'加密套件': { zh: '加密套件', en: 'Cipher suites' },
'加密存放': { zh: '加密存放', en: 'Stored encrypted' },
'加密流量的固有限制': { zh: '加密流量的固有限制', en: 'The inherent overhead of encrypting traffic' },
'加载失败:': { zh: '加载失败:', en: 'Failed to load: ' },
'加速': { zh: '加速', en: 'Accelerate' },
'加速」关闭软加速,再启用 QoS。': { zh: '加速」关闭软加速,再启用 QoS。', en: 'page to turn off software acceleration, then enable QoS.' },
'加速前缀': { zh: '加速前缀', en: 'Acceleration prefix' },
'加速影响说明': { zh: '加速影响说明', en: 'Notes on the impact of acceleration' },
'动作': { zh: '动作', en: 'Action' },
'动态': { zh: '动态', en: 'Dynamic' },
'动态域名': { zh: '动态域名', en: 'Dynamic DNS' },
'动态域名 DDNS': { zh: '动态域名 DDNS', en: 'Dynamic DNS (DDNS)' },
'动态域名解析 DDNS(IPv4 / IPv6,国内外服务商)': { zh: '动态域名解析 DDNS(IPv4 / IPv6,国内外服务商)', en: 'Dynamic DNS (DDNS) — IPv4 / IPv6, domestic and overseas providers' },
'动态获取': { zh: '动态获取', en: 'Dynamic' },
'勾上之后包里的文件权限会收紧到仅': { zh: '勾上之后包里的文件权限会收紧到仅', en: 'After it is checked, file permissions inside the package are tightened to' },
'勾选后,匹配的流量会被标记更高的': { zh: '勾选后,匹配的流量会被标记更高的', en: 'When checked, matching traffic is tagged with a higher' },
'勾选表示「包含在主题里」。取消勾选的变量不会写进主题, 应用到管理台时会回落到默认值。': { zh: '勾选表示「包含在主题里」。取消勾选的变量不会写进主题, 应用到管理台时会回落到默认值。', en: 'Checked means「included in the theme」. Unchecked variables are not written into the theme; when applied to the console they fall back to the default values.' },
'包/': { zh: '包/', en: 'packets/' },
'包/秒': { zh: '包/秒', en: 'packets/s' },
'包内': { zh: '包内', en: 'inside the package' },
'包名': { zh: '包名', en: 'Package name' },
'包名(逗号分隔)': { zh: '包名(逗号分隔)', en: 'Package names (comma-separated)' },
'包名,如': { zh: '包名,如', en: 'Package name, e.g.' },
'包含敏感文件(私钥': { zh: '包含敏感文件(私钥', en: 'Contains sensitive files (private key' },
'包含非法字符「': { zh: '包含非法字符「', en: 'Contains an illegal character "' },
'包数': { zh: '包数', en: 'Package count' },
'北京时间(': { zh: '北京时间(', en: 'Beijing time (' },
'匹配)': { zh: '匹配)', en: 'match)' },
'区域(如 cn-north-4)': { zh: '区域(如 cn-north-4)', en: 'Zone (e.g. cn-north-4)' },
'区间:': { zh: '区间:', en: 'Range:' },
'十': { zh: '十', en: '10th' },
'卅': { zh: '卅', en: '30' },
'升级': { zh: '升级', en: 'Upgrade' },
'升级与保护': { zh: '升级与保护', en: 'Upgrade & Protection' },
'升级到 1.0.8 后本页会明确告诉你是模块没加载、工具没装,': { zh: '升级到 1.0.8 后本页会明确告诉你是模块没加载、工具没装,', en: 'As of 1.0.8 this page tells you explicitly whether the module is not loaded, the tools are not installed,' },
'升级后验证清单': { zh: '升级后验证清单', en: 'Post-upgrade verification checklist' },
'午': { zh: '午', en: 'Wu' },
'协议': { zh: '协议', en: 'Protocol' },
'协议」识别流量(爱快的杀手锏)。': { zh: '协议」识别流量(爱快的杀手锏)。', en: 'protocol」to identify traffic (the killer feature of iKuai).' },
'协议族': { zh: '协议族', en: 'Protocol family' },
'单 IP': { zh: '单 IP', en: 'Single IP' },
'单个文件上限': { zh: '单个文件上限', en: 'Per-file size limit' },
'单元并重启服务, 已注册的': { zh: '单元并重启服务, 已注册的', en: 'unit and restart the service; the registered' },
'单文件上限': { zh: '单文件上限', en: 'Single-file size limit' },
'单次上限': { zh: '单次上限', en: 'Per-run limit' },
'单独测试': { zh: '单独测试', en: 'Test separately' },
'单账号多拨(所有会话用同一个账号)': { zh: '单账号多拨(所有会话用同一个账号)', en: 'Multi-dial with a single account (all sessions use the same account)' },
'占比': { zh: '占比', en: 'Share' },
'占用、提升吞吐。': { zh: '占用、提升吞吐。', en: 'occupancy and improve throughput.' },
'卡片圆角': { zh: '卡片圆角', en: 'Card corner radius' },
'卡片背景': { zh: '卡片背景', en: 'Card background' },
'卡片阴影': { zh: '卡片阴影', en: 'Card shadow' },
'卯': { zh: '卯', en: 'Mao' },
'危险操作': { zh: '危险操作', en: 'Dangerous operation' },
'即可启用该条规则;改完点击下方「仅语法检查」再「保存并应用」。': { zh: '即可启用该条规则;改完点击下方「仅语法检查」再「保存并应用」。', en: 'to activate this rule; after editing, click「Syntax check only」below and then「Save and Apply」.' },
'即将回收客户端': { zh: '即将回收客户端', en: 'Clients to be reclaimed soon' },
'即将导出包含私钥与宽带密码的备份包。\\n\\n': { zh: '即将导出包含私钥与宽带密码的备份包。\\n\\n', en: 'You are about to export a backup package containing private keys and your broadband password.\\n\\n' },
'即将导出包含私钥与宽带密码的备份包。\n\n': { zh: '即将导出包含私钥与宽带密码的备份包。\n\n', en: 'You are about to export a backup package containing private keys and your broadband password.\\n\\n' },
'即将导出包含私钥与宽带密码的备份包。\\\\n\\\\n': { zh: '即将导出包含私钥与宽带密码的备份包。\\\\n\\\\n', en: 'You are about to export a backup package containing private keys and your broadband password.\\n\\n' },
'即将把': { zh: '即将把', en: 'is about to' },
'卷标': { zh: '卷标', en: 'Volume label' },
'卷标(可留空)': { zh: '卷标(可留空)', en: 'Volume label (may be left empty)' },
'卸载': { zh: '卸载', en: 'Uninstall' },
'卸载 /dev/': { zh: '卸载 /dev/', en: 'Unmount /dev/' },
'卸载网卡': { zh: '卸载网卡', en: 'Offloaded NICs' },
'厂商': { zh: '厂商', en: 'Vendor' },
'原因': { zh: '原因', en: 'Reason' },
'原因:': { zh: '原因:', en: 'Reason:' },
'原始日志内容': { zh: '原始日志内容', en: 'Raw log content' },
'原密码': { zh: '原密码', en: 'Current password' },
'原样保留': { zh: '原样保留', en: 'preserved as is' },
'原生协议,局域网内传输性能通常优于': { zh: '原生协议,局域网内传输性能通常优于', en: 'native protocol; transfer performance within the LAN is usually better than' },
'去做真': { zh: '去做真', en: 'go do real' },
'去扫原始日志 (那会有几百': { zh: '去扫原始日志 (那会有几百', en: 'go scan the raw logs (there will be hundreds of' },
'参数、': { zh: '参数、', en: 'parameters,' },
'参数直达还原页)。': { zh: '参数直达还原页)。', en: 'parameter directly to the restore page).' },
'参考': { zh: '参考', en: 'Reference' },
'参考源': { zh: '参考源', en: 'Reference source' },
'及以上就别勾, 个别版本见到这一项会直接拒绝启动': { zh: '及以上就别勾, 个别版本见到这一项会直接拒绝启动', en: 'and above, do not check it; some versions refuse to start as soon as they see this item' },
'及其家目录?此操作不可恢复。': { zh: '及其家目录?此操作不可恢复。', en: 'and its home directory? This action cannot be undone.' },
'双击': { zh: '双击', en: 'Double-click' },
'双击就能用': { zh: '双击就能用', en: 'works with a double-click' },
'双击选择 DHCP Options': { zh: '双击选择 DHCP Options', en: 'Double-click to select DHCP Options' },
'双重 NAT 或运营商级 NAT': { zh: '双重 NAT 或运营商级 NAT', en: 'Double NAT or carrier-grade NAT' },
'发一条测试消息': { zh: '发一条测试消息', en: 'Send a test message' },
'发件人': { zh: '发件人', en: 'Sender' },
'发现': { zh: '发现', en: 'discovered' },
'发现新版本 ': { zh: '发现新版本 ', en: 'New version found: ' },
'发现服务': { zh: '发现服务', en: 'discovered services' },
'发行版': { zh: '发行版', en: 'Distribution' },
'发起,反映的是': { zh: '发起,反映的是', en: 'is initiated; what it reflects is' },
'发送唤醒包': { zh: '发送唤醒包', en: 'Send a magic packet' },
'发送失败': { zh: '发送失败', en: 'Send failed' },
'取 token': { zh: '取 token', en: 'Get token' },
'取值': { zh: '取值', en: 'Allowed values' },
'取值不合法:': { zh: '取值不合法:', en: 'Invalid value:' },
'取值不能为空': { zh: '取值不能为空', en: 'The value must not be empty' },
'取值含非法字符:': { zh: '取值含非法字符:', en: 'The value contains illegal characters: ' },
'取值格式无法识别': { zh: '取值格式无法识别', en: 'The value format could not be recognised' },
'取值过长(最多 220 字符)': { zh: '取值过长(最多 220 字符)', en: 'The value is too long (at most 220 characters)' },
'取其他配置)': { zh: '取其他配置)', en: 'take other configuration)' },
'取地址)': { zh: '取地址)', en: 'take the address)' },
'取消': { zh: '取消', en: 'Cancel' },
'取消共享': { zh: '取消共享', en: 'Unshare' },
'取消开机挂载': { zh: '取消开机挂载', en: 'Disable mount at boot' },
'取消开机自动挂载': { zh: '取消开机自动挂载', en: 'Disable auto-mount on boot' },
'受保护用户不可删除': { zh: '受保护用户不可删除', en: 'Protected users cannot be deleted' },
'受限': { zh: '受限', en: 'Restricted' },
'变量': { zh: '变量', en: 'variable' },
'变量调整': { zh: '变量调整', en: 'Variable adjustment' },
'变量,所见即所得。': { zh: '变量,所见即所得。', en: 'variable; what you see is what you get.' },
'口': { zh: '口', en: 'port' },
'口 / LAN': { zh: '口 / LAN', en: 'port / LAN' },
'口会自动获取地址;': { zh: '口会自动获取地址;', en: 'port acquires its address automatically;' },
'口就绪后再执行。': { zh: '口就绪后再执行。', en: 'port is ready, then execute it.' },
'口并确认无误后,再一次性切换。': { zh: '口并确认无误后,再一次性切换。', en: 'port and confirm it is correct, then switch over in one go.' },
'口径一:按实际用量分摊': { zh: '口径一:按实际用量分摊', en: 'Method 1: allocate by actual usage' },
'口径二:按预设比例分摊': { zh: '口径二:按预设比例分摊', en: 'Method 2: allocate by preset ratio' },
'口接到这台机器的这张网卡上就行。 光猫要是已经在拨号(大多数家庭就是这样),选这个最省事。': { zh: '口接到这台机器的这张网卡上就行。 光猫要是已经在拨号(大多数家庭就是这样),选这个最省事。', en: 'port to this machine\'s network interface. If the ONT is already dialing (which is the case in most homes), this option is the least hassle.' },
'口的应急入口: 它会在网卡上额外绑定一组虚拟地址,因此': { zh: '口的应急入口: 它会在网卡上额外绑定一组虚拟地址,因此', en: 'Emergency entry point for the port: it additionally binds a set of virtual addresses on the NIC, so' },
'另一台能上外网的主机': { zh: '另一台能上外网的主机', en: 'Another host that can reach the Internet' },
'另有': { zh: '另有', en: 'plus another' },
'只允许指定': { zh: '只允许指定', en: 'Only the specified' },
'只写文件、不重启服务': { zh: '只写文件、不重启服务', en: 'Write files only, do not restart the service' },
'只列出清单,不自动执行': { zh: '只列出清单,不自动执行', en: 'List the manifest only, do not run automatically' },
'只听本机 127.0.0.1': { zh: '只听本机 127.0.0.1', en: 'Listen on 127.0.0.1 only' },
'只在「人在国外、需要借用家里的宽带」时才该开。': { zh: '只在「人在国外、需要借用家里的宽带」时才该开。', en: 'Only turn this on when you are abroad and want to borrow your home bandwidth.' },
'只在地址变化时才下发': { zh: '只在地址变化时才下发', en: 'Push only when the address changes' },
'只影响': { zh: '只影响', en: 'Only affects' },
'只接受「选择器': { zh: '只接受「选择器', en: 'Only accepts「selectors' },
'只是保存账号密码的话,': { zh: '只是保存账号密码的话,', en: 'If you only want to save the account and password,' },
'只是插头形状,电气上仍归': { zh: '只是插头形状,电气上仍归', en: 'are merely plug shapes; electrically they still belong to' },
'只是暂时不生效;等运营商下发后它会自动开始工作。': { zh: '只是暂时不生效;等运营商下发后它会自动开始工作。', en: 'It just does not take effect for now; once the ISP assigns it, it will start working automatically.' },
'只显示前 15 项。': { zh: '只显示前 15 项。', en: 'Only the first 15 items are shown.' },
'只有': { zh: '只有', en: 'Only' },
'只监听 127.0.0.1:631': { zh: '只监听 127.0.0.1:631', en: 'Listen on 127.0.0.1:631 only' },
'只监控不下发配置': { zh: '只监控不下发配置', en: 'Monitor only, do not push the configuration' },
'只看缺失': { zh: '只看缺失', en: 'Show missing only' },
'只统计不删除,用来先看清楚会清掉多少;确认无误再点「立即清理」。': { zh: '只统计不删除,用来先看清楚会清掉多少;确认无误再点「立即清理」。', en: 'It only counts and does not delete, so you can first see how much will be cleared; click「Clean now」once you are sure.' },
'只要把这张': { zh: '只要把这张', en: 'As long as this' },
'只读公开': { zh: '只读公开', en: 'Read-only, public' },
'可为该客户端选择': { zh: '可为该客户端选择', en: 'You can select for this client' },
'可以': { zh: '可以', en: 'Yes' },
'可以上网了': { zh: '可以上网了', en: 'You can access the Internet now' },
'可写入': { zh: '可写入', en: 'Writable' },
'可减少局域网广播;若局域网里有老旧设备(': { zh: '可减少局域网广播;若局域网里有老旧设备(', en: 'can reduce LAN broadcasts; if there are legacy devices on the LAN (' },
'可到「系统': { zh: '可到「系统', en: 'You can go to "System' },
'可升级软件包': { zh: '可升级软件包', en: 'Upgradable packages' },
'可同时承载双栈,实际是否卸载取决于规则里的': { zh: '可同时承载双栈,实际是否卸载取决于规则里的', en: 'can carry both address families at the same time; whether it is actually removed depends on the' },
'可回滚的快照': { zh: '可回滚的快照', en: 'Snapshots that can be rolled back' },
'可回滚的快照」里给它单独上锁即可': { zh: '可回滚的快照」里给它单独上锁即可', en: 'lock it on its own in a "rollback snapshot"' },
'可在下方填写宽带账号与密码。点击「仅保存」只写入配置,不会拨号。 需要正式拨号时,先解除构建保护模式,再点「开始拨号」。': { zh: '可在下方填写宽带账号与密码。点击「仅保存」只写入配置,不会拨号。 需要正式拨号时,先解除构建保护模式,再点「开始拨号」。', en: 'You can enter the broadband username and password below. Clicking "Save only" writes the configuration without dialing. When you need to actually dial, turn off build protection mode first, then click "Start dialing".' },
'可沿用上级下发,也可在「': { zh: '可沿用上级下发,也可在「', en: 'can inherit the upstream setting, or you can set it under「' },
'可点击右上角「刷新」重试,或到「日志」页查看详细信息。': { zh: '可点击右上角「刷新」重试,或到「日志」页查看详细信息。', en: 'You can click「Refresh」in the top-right corner to retry, or open the「Logs」page for details.' },
'可生效模式': { zh: '可生效模式', en: 'Changes take effect' },
'可用': { zh: '可用', en: 'Available' },
'可用占位符:': { zh: '可用占位符:', en: 'Available placeholders:' },
'可用,但': { zh: '可用,但', en: 'Available, but' },
'可留空': { zh: '可留空', en: 'Can be left blank' },
'可直接': { zh: '可直接', en: 'can be used directly to' },
'可直接读写:': { zh: '可直接读写:', en: 'can be read and written directly:' },
'可签发': { zh: '可签发', en: 'Can issue' },
'可继承运营商通过': { zh: '可继承运营商通过', en: 'can inherit what the ISP delegates via' },
'可自定义时间服务器地址,支持多个(逗号分隔)。': { zh: '可自定义时间服务器地址,支持多个(逗号分隔)。', en: 'You can customize the time server addresses; multiple entries are supported (comma-separated).' },
'可装': { zh: '可装', en: 'Installable' },
'可读。含私钥的包请不要丢在共享目录里。': { zh: '可读。含私钥的包请不要丢在共享目录里。', en: 'readable. Do not leave packages that contain private keys in the share directory.' },
'可读)': { zh: '可读)', en: 'readable)' },
'可选': { zh: '可选', en: 'Optional' },
'可选,': { zh: '可选,', en: 'Optional,' },
'可选,导入时会被重新生成': { zh: '可选,导入时会被重新生成', en: 'Optional; it is regenerated during import' },
'可选,追加的自定义': { zh: '可选,追加的自定义', en: 'Optional; additional custom' },
'可释放': { zh: '可释放', en: 'Can free up' },
'台': { zh: '台', en: '' }, // i18n-en-empty(英文不需要量词:3 个 → 3)
'台 USB 打印机:': { zh: '台 USB 打印机:', en: 'USB printers:' },
'叶子证书 SHA256:': { zh: '叶子证书 SHA256:', en: 'Leaf certificate SHA256:' },
'合并成一行': { zh: '合并成一行', en: 'merged into a single line' },
'同一条规则最短重复间隔': { zh: '同一条规则最短重复间隔', en: 'Minimum repeat interval for the same rule' },
'同外网': { zh: '同外网', en: 'Same as the WAN' },
'同时会清掉每条规则的冷却状态,所以清完之后下一次命中会立刻推送 (而不是继续等冷却期走完)。': { zh: '同时会清掉每条规则的冷却状态,所以清完之后下一次命中会立刻推送 (而不是继续等冷却期走完)。', en: 'It also clears the cooldown state of every rule, so after the reset the next match is pushed immediately (instead of waiting out the cooldown period).' },
'同时保存为常用设备': { zh: '同时保存为常用设备', en: 'Also save as a favorite device' },
'同时写入': { zh: '同时写入', en: 'Also written to' },
'同时删除数据目录(': { zh: '同时删除数据目录(', en: 'Also delete the data directory (' },
'同时启用': { zh: '同时启用', en: 'Enable at the same time' },
'同时记录被放通的包(数据量大)': { zh: '同时记录被放通的包(数据量大)', en: 'Also log allowed packets (large data volume)' },
'同时请求接口地址(': { zh: '同时请求接口地址(', en: 'also request the interface address (' },
'同时转为静态绑定': { zh: '同时转为静态绑定', en: 'Also convert to a static binding' },
'同步状态': { zh: '同步状态', en: 'Sync status' },
'同源': { zh: '同源', en: 'Same origin' },
'名称': { zh: '名称', en: 'Name' },
'名称不能为空': { zh: '名称不能为空', en: 'Name must not be empty' },
'名称(显示用)': { zh: '名称(显示用)', en: 'Name (for display)' },
'后': { zh: '后', en: 'after' },
'后台采集:': { zh: '后台采集:', en: 'Collected in the background:' },
'后执行': { zh: '后执行', en: 'and is executed afterwards' },
'后端拒绝了保存:': { zh: '后端拒绝了保存:', en: 'The backend refused the save:' },
'后端接口无响应,请检查': { zh: '后端接口无响应,请检查', en: 'The backend API is not responding, please check' },
'后端版本较旧,': { zh: '后端版本较旧,', en: 'The backend version is older,' },
'后缀': { zh: '后缀', en: 'suffix' },
'后缀」是同一个值 (原先这里写的是': { zh: '后缀」是同一个值 (原先这里写的是', en: 'suffix」is the same value (this previously read' },
'后进入目录执行': { zh: '后进入目录执行', en: 'then enter the directory and execute' },
'后面的设备需要它才能保持在线,': { zh: '后面的设备需要它才能保持在线,', en: 'the following devices need it to stay online,' },
'后,': { zh: '后,', en: 'after,' },
'向局域网设备通告': { zh: '向局域网设备通告', en: 'advertise to LAN devices' },
'向运营商申请': { zh: '向运营商申请', en: 'Request from the ISP' },
'吗?': { zh: '吗?', en: '?' },
'吗?改完后需要用': { zh: '吗?改完后需要用', en: '? After changing it you need to use' },
'吞吐测试': { zh: '吞吐测试', en: 'Throughput test' },
'否': { zh: '否', en: 'No' },
'否则迁移配置里缺少 WAN 网卡,无法生成。</p>': { zh: '否则迁移配置里缺少 WAN 网卡,无法生成。</p>', en: 'otherwise the migration config has no WAN NIC and none can be generated.</p>' },
'否则这里永远不会有数据。</div>': { zh: '否则这里永远不会有数据。</div>', en: 'otherwise there will never be any data here.</div>' },
'否(自动生成,未入库)': { zh: '否(自动生成,未入库)', en: 'No (automatically generated, not stored)' },
'否,仅下发': { zh: '否,仅下发', en: 'No, push only' },
'含敏感文件': { zh: '含敏感文件', en: 'Contains sensitive files' },
'含私钥': { zh: '含私钥', en: 'Contains a private key' },
'含私钥,请妥善保管': { zh: '含私钥,请妥善保管', en: 'Contains a private key; store it securely' },
'启动': { zh: '启动', en: 'Start' },
'启动。': { zh: '启动。', en: 'start up.' },
'启动中': { zh: '启动中', en: 'Starting' },
'启动失败': { zh: '启动失败', en: 'Start failed' },
'启动更新失败': { zh: '启动更新失败', en: 'Failed to start the update' },
'启动(': { zh: '启动(', en: 'Start (' },
'启用': { zh: '启用', en: 'Enable' },
'启用 WOL': { zh: '启用 WOL', en: 'Enable WOL' },
'启用动态域名解析': { zh: '启用动态域名解析', en: 'Enable dynamic DNS resolution' },
'启用后访问方式:': { zh: '启用后访问方式:', en: 'Access method after enabling:' },
'启用告警': { zh: '启用告警', en: 'Enable alerts' },
'启用地址池(从池中分配地址给内网接口)': { zh: '启用地址池(从池中分配地址给内网接口)', en: 'Enable address pool (assign addresses from the pool to internal interfaces)' },
'启用失败': { zh: '启用失败', en: 'Enable failed' },
'启用状态': { zh: '启用状态', en: 'Enablement status' },
'启用统一日志': { zh: '启用统一日志', en: 'Enable unified logging' },
'启用自动清理': { zh: '启用自动清理', en: 'Enable automatic cleanup' },
'启用自动聚合': { zh: '启用自动聚合', en: 'Enable automatic aggregation' },
'启用规则': { zh: '启用规则', en: 'Enable the rule' },
'启用访问控制': { zh: '启用访问控制', en: 'Enable access control' },
'启用连接数限制': { zh: '启用连接数限制', en: 'Enable connection count limits' },
'告警与通知': { zh: '告警与通知', en: 'Alerts & Notifications' },
'告警历史': { zh: '告警历史', en: 'Alert history' },
'告警总开关': { zh: '告警总开关', en: 'Master alert switch' },
'告警要送到哪里去。至少配一个并勾上「启用」,否则规则命中了也只 出现在下面的历史记录里。建议手机推送与邮件各配一个作为双保险。': { zh: '告警要送到哪里去。至少配一个并勾上「启用」,否则规则命中了也只 出现在下面的历史记录里。建议手机推送与邮件各配一个作为双保险。', en: 'Where alerts should be delivered. Configure at least one channel and check「Enable」; otherwise a rule match only shows up in the history below. It is recommended to configure one mobile push channel and one email channel as redundancy.' },
'告警规则与阈值': { zh: '告警规则与阈值', en: 'Alert rules and thresholds' },
'周一': { zh: '周一', en: 'Mon' },
'周三': { zh: '周三', en: 'Wed' },
'周二': { zh: '周二', en: 'Tue' },
'周五': { zh: '周五', en: 'Fri' },
'周六': { zh: '周六', en: 'Sat' },
'周四': { zh: '周四', en: 'Thu' },
'周日': { zh: '周日', en: 'Sun' },
'周期': { zh: '周期', en: 'Interval' },
'命中': { zh: '命中', en: 'Hit' },
'命中内容': { zh: '命中内容', en: 'Matched content' },
'命中的包记录到内核日志,并在下面实时滚动显示(已翻译成简体中文)。 记录本身会占用少量': { zh: '命中的包记录到内核日志,并在下面实时滚动显示(已翻译成简体中文)。 记录本身会占用少量', en: 'Hit packets are recorded to the kernel log and scrolled live below (already translated into Simplified Chinese). The records themselves take up a small amount of' },
'命令': { zh: '命令', en: 'Command' },
'命令不存在)。 这不影响你在这里预先把配置写好': { zh: '命令不存在)。 这不影响你在这里预先把配置写好', en: 'command not found). This does not stop you from writing the configuration here in advance' },
'命令已复制,可粘贴到 Web 终端执行': { zh: '命令已复制,可粘贴到 Web 终端执行', en: 'Command copied — paste it into the web terminal to run' },
'命令粘贴进来,自动生成等价的': { zh: '命令粘贴进来,自动生成等价的', en: 'Paste the command here, and an equivalent' },
'和': { zh: '和', en: 'and' },
'响应格式': { zh: '响应格式', en: 'Response format' },
'哪一份是你要的': { zh: '哪一份是你要的', en: 'Which one do you want' },
'唤醒': { zh: '唤醒', en: 'Wake' },
'唤醒指定设备': { zh: '唤醒指定设备', en: 'Wake the specified device' },
'四': { zh: '四', en: '4th' },
'四条判定依据': { zh: '四条判定依据', en: 'The four decision criteria' },
'回到底部,继续跟随最新输出': { zh: '回到底部,继续跟随最新输出', en: 'Return to the bottom, and keep following the latest output' },
'回到默认': { zh: '回到默认', en: 'Reset to default' },
'回地址池。': { zh: '回地址池。', en: 'back to the address pool.' },
'回收 IP': { zh: '回收 IP', en: 'Reclaim IP' },
'回收 IP 地址': { zh: '回收 IP 地址', en: 'Reclaim the IP address' },
'回收日志 / 缓存 / 临时文件,可设定阈值自动清理,防止小硬盘被占满': { zh: '回收日志 / 缓存 / 临时文件,可设定阈值自动清理,防止小硬盘被占满', en: 'Reclaim logs / cache / temporary files, with optional threshold-based automatic cleanup so a small disk never fills up' },
'回显公网 IP': { zh: '回显公网 IP', en: 'Echoed public IP' },
'回显地址': { zh: '回显地址', en: 'Hairpin address' },
'回显端口': { zh: '回显端口', en: 'Echoed port' },
'回滚': { zh: '回滚', en: 'Roll back' },
'回滚会同时还原界面配置数据库与系统配置文件,并重启相关服务。回滚前系统会自动再拍一张': { zh: '回滚会同时还原界面配置数据库与系统配置文件,并重启相关服务。回滚前系统会自动再拍一张', en: 'A rollback restores both the UI configuration database and the system configuration files, and restarts the relevant services. Before rolling back, the system automatically takes another' },
'回滚过程中网络可能短暂中断。': { zh: '回滚过程中网络可能短暂中断。', en: 'The network may be interrupted briefly during the rollback.' },
'回滚预案': { zh: '回滚预案', en: 'Rollback plan' },
'因为开了不等于能上': { zh: '因为开了不等于能上', en: 'Because enabling it does not mean it works' },
'团体名(只读口令)': { zh: '团体名(只读口令)', en: 'Community name (read-only password)' },
'固定': { zh: '固定', en: 'Fixed' },
'固定分配': { zh: '固定分配', en: 'Fixed allocation' },
'国内': { zh: '国内', en: 'Domestic' },
'国内直连': { zh: '国内直连', en: 'Direct connection for domestic traffic' },
'国内镜像源切换与测速': { zh: '国内镜像源切换与测速', en: 'Domestic mirror switching and speed test' },
'国家授时中心': { zh: '国家授时中心', en: 'National Time Service Center' },
'国际': { zh: '国际', en: 'International' },
'图形会话': { zh: '图形会话', en: 'Graphical session' },
'圆角 / 阴影 / 渐变': { zh: '圆角 / 阴影 / 渐变', en: 'Radius / shadow / gradient' },
'在 AP 的 OpenWRT': { zh: '在 AP 的 OpenWRT', en: 'On the AP\'s OpenWRT,' },
'在 Web 终端里执行': { zh: '在 Web 终端里执行', en: 'Run in the web terminal' },
'在下面「分摊比例」里给设备填百分比。 没填的会归到「未指定」。': { zh: '在下面「分摊比例」里给设备填百分比。 没填的会归到「未指定」。', en: 'Fill in a percentage for each device under "Allocation ratio" below. Devices left blank fall under "Unspecified".' },
'在下面勾上「启用自动聚合」并保存。</div>': { zh: '在下面勾上「启用自动聚合」并保存。</div>', en: 'Tick "Enable automatic aggregation" below and save.</div>' },
'在光猫上开启': { zh: '在光猫上开启', en: 'Enable it on the ONT' },
'在内网启用': { zh: '在内网启用', en: 'Enable on the LAN' },
'在同一物理网口上并发多条': { zh: '在同一物理网口上并发多条', en: 'Multiple concurrent connections on the same physical port' },
'在新窗口打开预览': { zh: '在新窗口打开预览', en: 'Open the preview in a new window' },
'在服务器上执行以下命令可配置每日': { zh: '在服务器上执行以下命令可配置每日', en: 'Run the following commands on the server to configure the daily' },
'在本版尚未接入真实下发': { zh: '在本版尚未接入真实下发', en: ' is not wired up for real updates in this version' },
'在此之前,这套系统是「坏了你自己来看」': { zh: '在此之前,这套系统是「坏了你自己来看」', en: 'Before that, this system was「broken, come and look yourself」' },
'在浏览器里直接打开本机': { zh: '在浏览器里直接打开本机', en: 'Open the local machine directly in the browser' },
'在物理网卡上划分': { zh: '在物理网卡上划分', en: 'Carve up on the physical interface' },
'在线': { zh: '在线', en: 'Online' },
'在线安装(最新版)': { zh: '在线安装(最新版)', en: 'Online installation (latest version)' },
'在线终端': { zh: '在线终端', en: 'Online terminal' },
'在证书库里': { zh: '在证书库里', en: 'In the certificate store' },
'在路由器上创建该目录': { zh: '在路由器上创建该目录', en: 'Create this directory on the router' },
'在这里挑选、设计并把玩界面外观。所有变更': { zh: '在这里挑选、设计并把玩界面外观。所有变更', en: 'Choose, design and play with the interface appearance here. All changes' },
'地址': { zh: '地址', en: 'Address' },
'地址、也能用': { zh: '地址、也能用', en: 'address, and you can also use' },
'地址、网关和': { zh: '地址、网关和', en: 'address, gateway and' },
'地址。把它们翻译过来的服务就叫': { zh: '地址。把它们翻译过来的服务就叫', en: 'address. The services that translate them are called' },
'地址与网关': { zh: '地址与网关', en: 'Address and gateway' },
'地址分类': { zh: '地址分类', en: 'Address classification' },
'地址列表(逗号或空格分隔)': { zh: '地址列表(逗号或空格分隔)', en: 'Address list (comma or space separated)' },
'地址常为动态前缀,建议间隔': { zh: '地址常为动态前缀,建议间隔', en: 'addresses are often dynamic prefixes; it is recommended to set the interval to' },
'地址有效': { zh: '地址有效', en: 'Address valid' },
'地址来源': { zh: '地址来源', en: 'Address source' },
'地址池': { zh: '地址池', en: 'Address pool' },
'地址池怎么填?(照着抄就行)': { zh: '地址池怎么填?(照着抄就行)', en: 'How should the address pool be filled in? (Just copy it)' },
'地址池设置已修改,请点击保存并应用': { zh: '地址池设置已修改,请点击保存并应用', en: 'Address pool settings modified, please click Save & Apply' },
'地址获取': { zh: '地址获取', en: 'Address acquisition' },
'地址,发送「魔术包」将其从关机': { zh: '地址,发送「魔术包」将其从关机', en: 'address and send a「magic packet」to wake it from a powered-off state,' },
'地址,由本机再转发到上游,': { zh: '地址,由本机再转发到上游,', en: 'address, which this device then forwards to the upstream,' },
'均值': { zh: '均值', en: 'avg' },
'均合法。': { zh: '均合法。', en: 'are all valid.' },
'型号': { zh: '型号', en: 'Model' },
'域名': { zh: '域名', en: 'Domain name' },
'域名后缀': { zh: '域名后缀', en: 'Domain suffix' },
'域名(多个用逗号分隔)': { zh: '域名(多个用逗号分隔)', en: 'Domains (comma-separated for multiple)' },
'基本设置': { zh: '基本设置', en: 'Basic settings' },
'基础配色': { zh: '基础配色', en: 'Base palette' },
'填上游': { zh: '填上游', en: 'fill in the upstream' },
'填了「月租」之后这里会算出费用分摊。': { zh: '填了「月租」之后这里会算出费用分摊。', en: 'Once "Monthly fee" is filled in, the cost allocation is calculated here.' },
'填了套餐流量和月租之后,下面会算出总费用和两种分摊口径。 「按用量分摊」是各设备实际占比;「按预设比例分摊」是你给每台设备 指定应承担的百分比(老板按人头、机器按台数这种)。': { zh: '填了套餐流量和月租之后,下面会算出总费用和两种分摊口径。 「按用量分摊」是各设备实际占比;「按预设比例分摊」是你给每台设备 指定应承担的百分比(老板按人头、机器按台数这种)。', en: 'After you enter the plan quota and the monthly fee, the total cost and the two allocation methods are calculated below.「Allocate by usage」uses each device\'s actual share;「Allocate by preset ratio」uses the percentage you assign to each device (per person for staff, per machine for devices).' },
'填入上方项目': { zh: '填入上方项目', en: 'Fill into the project above' },
'填写了任何一条': { zh: '填写了任何一条', en: 'If any one of the following is filled in' },
'填写地址池': { zh: '填写地址池', en: 'Enter the address pool' },
'填好主机点「开始测试」。': { zh: '填好主机点「开始测试」。', en: 'Fill in the host and click "Start Test".' },
'壬': { zh: '壬', en: 'Ren' },
'声明缺少冒号:': { zh: '声明缺少冒号:', en: 'Declaration is missing a colon:' },
'处暑': { zh: '处暑', en: 'End of Heat' },
'处问题': { zh: '处问题', en: 'has a problem' },
'处问题,已阻止提交:': { zh: '处问题,已阻止提交:', en: 'encountered a problem, the submission has been blocked:' },
'处问题,未保存': { zh: '处问题,未保存', en: 'has a problem, not saved' },
'备份再覆盖,所以这一操作本身是可退的。': { zh: '备份再覆盖,所以这一操作本身是可退的。', en: 'backed up and then overwritten, so this operation itself can be undone.' },
'备份已导出': { zh: '备份已导出', en: 'Backup exported' },
'备份目录': { zh: '备份目录', en: 'Backup directory' },
'备份覆盖范围': { zh: '备份覆盖范围', en: 'Backup coverage' },
'备注': { zh: '备注', en: 'Remark' },
'备用救援地址(同网段直连用)': { zh: '备用救援地址(同网段直连用)', en: 'Backup rescue address (for direct connection on the same subnet)' },
'复制': { zh: '复制', en: 'Copy' },
'复制代码': { zh: '复制代码', en: 'Copy code' },
'复制内容': { zh: '复制内容', en: 'Copy content' },
'复制可见内容': { zh: '复制可见内容', en: 'Copy visible content' },
'复制命令': { zh: '复制命令', en: 'Copy command' },
'复制失败': { zh: '复制失败', en: 'Copy failed' },
'复制失败,请手动复制': { zh: '复制失败,请手动复制', en: 'Copy failed — please copy it manually' },
'复制失败,请手动选中': { zh: '复制失败,请手动选中', en: 'Copy failed — please select it manually' },
'复制失败,请手动选择文本': { zh: '复制失败,请手动选择文本', en: 'Copy failed — please select the text manually' },
'复制日志': { zh: '复制日志', en: 'Copy logs' },
'复制路径': { zh: '复制路径', en: 'Copy path' },
'夏至': { zh: '夏至', en: 'Summer Solstice' },
'外网': { zh: '外网', en: 'WAN' },
'外网端口': { zh: '外网端口', en: 'WAN port' },
'外网端口都转发到指定的一台内网主机,等价于「': { zh: '外网端口都转发到指定的一台内网主机,等价于「', en: 'WAN ports are all forwarded to a designated LAN host, which is equivalent to「' },
'外网连通性': { zh: '外网连通性', en: 'Internet reachability' },
'外网, 还得上游路由器配合。': { zh: '外网, 还得上游路由器配合。', en: 'WAN; the upstream router has to cooperate as well.' },
'外置存储 ': { zh: '外置存储 ', en: 'External storage ' },
'外置存储设备(': { zh: '外置存储设备(', en: 'external storage device (' },
'外置设备(': { zh: '外置设备(', en: 'External devices (' },
'外部端口': { zh: '外部端口', en: 'External port' },
'多个用逗号分隔': { zh: '多个用逗号分隔', en: 'Separate multiple ones with commas' },
'多久。': { zh: '多久。', en: 'how long.' },
'多拨': { zh: '多拨', en: 'Multi-dial' },
'多数地区留空': { zh: '多数地区留空', en: 'Leave blank in most regions' },
'多次探测的端口一致': { zh: '多次探测的端口一致', en: 'Ports consistent across multiple probes' },
'大多数家庭宽带会在拨号后 自动把运营商的前缀交给内网用。要手工填的话, 运营商给的前缀一般是': { zh: '大多数家庭宽带会在拨号后 自动把运营商的前缀交给内网用。要手工填的话, 运营商给的前缀一般是', en: 'Most home broadband connections hand the ISP prefix to the LAN automatically after dialing. If you have to fill it in manually, the prefix the ISP provides is usually' },
'大寒': { zh: '大寒', en: 'Major Cold' },
'大小': { zh: '大小', en: 'Size' },
'大暑': { zh: '大暑', en: 'Major Heat' },
'大雪': { zh: '大雪', en: 'Major Snow' },
'天': { zh: '天', en: 'days' },
'天内的文件': { zh: '天内的文件', en: 'days of files' },
'天就删(': { zh: '天就删(', en: 'days before it is deleted (' },
'天)。 建议现在换一张,否则浏览器会彻底拒绝连接。': { zh: '天)。 建议现在换一张,否则浏览器会彻底拒绝连接。', en: 'days). We recommend replacing it now, otherwise browsers will reject the connection outright.' },
'失败': { zh: '失败', en: 'Failed' },
'失败原因:': { zh: '失败原因:', en: 'Failure reason:' },
'失败:': { zh: '失败:', en: 'Failed: ' },
'头': { zh: '头', en: 'header' },
'套用目录模板': { zh: '套用目录模板', en: 'Apply directory template' },
'套用设备组模板': { zh: '套用设备组模板', en: 'Apply a device group template' },
'套用预设名称': { zh: '套用预设名称', en: 'Apply a preset name' },
'套餐与费用分摊': { zh: '套餐与费用分摊', en: 'Plan and cost sharing' },
'套餐流量': { zh: '套餐流量', en: 'Plan traffic' },
'如 90': { zh: '如 90', en: 'e.g. 90' },
'如 900': { zh: '如 900', en: 'e.g. 900' },
'如安装失败,可复制以下日志用于排查。': { zh: '如安装失败,可复制以下日志用于排查。', en: 'If the installation fails, you can copy the following log for troubleshooting.' },
'如实报错': { zh: '如实报错', en: 'report errors faithfully' },
'如果你想手工写主题,包的结构非常简单:': { zh: '如果你想手工写主题,包的结构非常简单:', en: 'If you want to write a theme by hand, the package structure is very simple:' },
'如果你有正式域名并想用公共证书机构签发的证书:在这里生成': { zh: '如果你有正式域名并想用公共证书机构签发的证书:在这里生成', en: 'If you have a real domain and want a certificate issued by a public certificate authority: generate one here' },
'如果容器没有设': { zh: '如果容器没有设', en: 'If the container has no' },
'如果规则写得不严谨,可能阻断目标设备的正常上网,但不影响路由器本身与其他设备。': { zh: '如果规则写得不严谨,可能阻断目标设备的正常上网,但不影响路由器本身与其他设备。', en: 'If the rules are not written rigorously, they may block the target device\'s normal internet access, but will not affect the router itself or other devices.' },
'如果这个包已经下载到本地电脑,删掉不影响你手上的那份。': { zh: '如果这个包已经下载到本地电脑,删掉不影响你手上的那份。', en: 'If the package has already been downloaded to the local computer, deleting it does not affect the copy you have.' },
'如需': { zh: '如需', en: 'If you need' },
'如需端口转发(把外网': { zh: '如需端口转发(把外网', en: 'If you need port forwarding (map the WAN' },
'始终生效': { zh: '始终生效', en: 'always takes effect' },
'子': { zh: '子', en: 'Zi' },
'子接口,常用于': { zh: '子接口,常用于', en: 'sub-interface, commonly used for' },
'子接口,父网卡选连接光猫的那张网卡。': { zh: '子接口,父网卡选连接光猫的那张网卡。', en: 'sub-interface; for the parent interface pick the NIC connected to the ONT.' },
'子网': { zh: '子网', en: 'Subnet' },
'子网前缀长度': { zh: '子网前缀长度', en: 'Subnet prefix length' },
'子网掩码': { zh: '子网掩码', en: 'Subnet mask' },
'字': { zh: '字', en: 'characters' },
'字段:': { zh: '字段:', en: 'Field:' },
'字节': { zh: '字节', en: 'bytes' },
'存储驱动': { zh: '存储驱动', en: 'Storage driver' },
'存在': { zh: '存在', en: 'Exists' },
'存备注': { zh: '存备注', en: 'Save note' },
'存放的。': { zh: '存放的。', en: 'stored.' },
'它们抢的是同一个': { zh: '它们抢的是同一个', en: 'they compete for the same' },
'它们是数字输入框,': { zh: '它们是数字输入框,', en: 'They are numeric input boxes,' },
'它们装完会拉起常驻服务或占用大量空间, 不该因为一次点错就被全部装上。': { zh: '它们装完会拉起常驻服务或占用大量空间, 不该因为一次点错就被全部装上。', en: 'once installed they start resident services or take up a lot of space; a single misclick should not install all of them.' },
'它会带上本机所有 IP 与 localhost,有效期十年。': { zh: '它会带上本机所有 IP 与 localhost,有效期十年。', en: 'It will carry every IP on this host plus localhost, valid for ten years.' },
'它的密钥会被清除,': { zh: '它的密钥会被清除,', en: 'its key will be cleared,' },
'它解决什么问题': { zh: '它解决什么问题', en: 'What problem does it solve' },
'守护进程时': { zh: '守护进程时', en: 'the daemon' },
'安全': { zh: '安全', en: 'Security' },
'安全与可中断性': { zh: '安全与可中断性', en: 'Safety and interruptibility' },
'安全关机': { zh: '安全关机', en: 'Safe shut down' },
'安全性),': { zh: '安全性),', en: 'security),' },
'安全操作': { zh: '安全操作', en: 'Safe operation' },
'安全模式(仅允许映射到内网地址)': { zh: '安全模式(仅允许映射到内网地址)', en: 'Safe mode (only internal addresses may be mapped)' },
'安全确认未通过:请输入设备名 ': { zh: '安全确认未通过:请输入设备名 ', en: 'Safety confirmation failed: please type the device name ' },
'安全说明': { zh: '安全说明', en: 'Security notes' },
'安全重启': { zh: '安全重启', en: 'Safe reboot' },
'安装': { zh: '安装', en: 'Install' },
'安装中…(可能需要几分钟)': { zh: '安装中…(可能需要几分钟)', en: 'Installing… (this may take a few minutes)' },
'安装后可在这里改监听地址、端口与几个开关。': { zh: '安装后可在这里改监听地址、端口与几个开关。', en: 'Once installed, you can change the listen address, port and a few switches here.' },
'安装后执行': { zh: '安装后执行', en: 'run after installation' },
'安装后这里会显示 AP 注册用的共享密钥。': { zh: '安装后这里会显示 AP 注册用的共享密钥。', en: 'Once installed, the shared key used for AP registration is shown here.' },
'安装失败': { zh: '安装失败', en: 'Installation failed' },
'安装失败:': { zh: '安装失败:', en: 'Installation failed:' },
'安装完成,仍有': { zh: '安装完成,仍有', en: 'Installation finished, there are still' },
'安装方式': { zh: '安装方式', en: 'Installation method' },
'安装日志': { zh: '安装日志', en: 'Installation log' },
'完全不碰打印数据': { zh: '完全不碰打印数据', en: 'Does not touch print data at all' },
'完成': { zh: '完成', en: 'Done' },
'完整域名': { zh: '完整域名', en: 'Fully qualified domain name' },
'完整日志可用上方「查看日志」按钮获取,便于复制反馈。': { zh: '完整日志可用上方「查看日志」按钮获取,便于复制反馈。', en: 'The full log can be obtained with the "View Log" button above, ready to be copied when reporting an issue.' },
'官方': { zh: '官方', en: 'Official' },
'官方下载': { zh: '官方下载', en: 'official download' },
'官方文档:': { zh: '官方文档:', en: 'Official docs: ' },
'官方明确要求固定某版本时, 对该单个包执行锁定。': { zh: '官方明确要求固定某版本时, 对该单个包执行锁定。', en: 'When the official source explicitly requires a fixed version, lock that single package.' },
'官方源的版本:': { zh: '官方源的版本:', en: 'Version in the official repository:' },
'官方连不上时自动改用 镜像': { zh: '官方连不上时自动改用 镜像', en: 'automatically switches to a mirror when the official source cannot be reached' },
'定时任务在后台跑,没人盯着的时候把私钥写出去不是好主意。': { zh: '定时任务在后台跑,没人盯着的时候把私钥写出去不是好主意。', en: 'A scheduled job running in the background writing out the private key while nobody is watching is not a good idea.' },
'定时器': { zh: '定时器', en: 'Timer' },
'定时器固定在设定时刻之后的': { zh: '定时器固定在设定时刻之后的', en: 'The timer is fixed at' },
'定时器每小时被拉起一次,自己判断该不该真动手': { zh: '定时器每小时被拉起一次,自己判断该不该真动手', en: 'The timer is invoked once per hour and decides on its own whether it should really act' },
'定时器状态': { zh: '定时器状态', en: 'Timer status' },
'定时检测': { zh: '定时检测', en: 'Scheduled check' },
'定时重启模板': { zh: '定时重启模板', en: 'Scheduled reboot templates' },
'定时重启(可选)': { zh: '定时重启(可选)', en: 'Scheduled reboot (optional)' },
'定时(推荐)': { zh: '定时(推荐)', en: 'Scheduled (recommended)' },
'实时': { zh: '实时', en: 'Live' },
'实时交互终端': { zh: '实时交互终端', en: 'Interactive terminal' },
'实时展示哪个内网设备申请了哪个端口,便于安全审查。': { zh: '实时展示哪个内网设备申请了哪个端口,便于安全审查。', en: 'Shows in real time which internal device requested which port, which makes security review easier.' },
'实时探测值': { zh: '实时探测值', en: 'Live probe value' },
'实时状态': { zh: '实时状态', en: 'Live status' },
'实时读取,无需手动刷新': { zh: '实时读取,无需手动刷新', en: 'Read in real time, no manual refresh needed' },
'实时速率': { zh: '实时速率', en: 'Live rate' },
'实现,不需要额外装包。': { zh: '实现,不需要额外装包。', en: 'implementation, no extra package needed.' },
'实际用的是哪一个源': { zh: '实际用的是哪一个源', en: 'which source is actually used' },
'实际监听': { zh: '实际监听', en: 'actually listening' },
'实际监听端口': { zh: '实际监听端口', en: 'Actual listening port' },
'客厅打印机': { zh: '客厅打印机', en: 'Living Room Printer' },
'客户端': { zh: '客户端', en: 'Client' },
'客户端 DNS': { zh: '客户端 DNS', en: 'Client DNS' },
'客户端与权限:': { zh: '客户端与权限:', en: 'Client and permissions:' },
'客户端地址池': { zh: '客户端地址池', en: 'Client address pool' },
'客户端地址池与本机内网网段': { zh: '客户端地址池与本机内网网段', en: 'Client Address Pool and Local LAN Subnet' },
'客户端已创建 —— 请立即下载配置': { zh: '客户端已创建 —— 请立即下载配置', en: 'Client created — download the config now' },
'客户端网关': { zh: '客户端网关', en: 'Client gateway' },
'客户端获取地址与前缀委派(': { zh: '客户端获取地址与前缀委派(', en: 'client address and prefix delegation (' },
'客户端设备': { zh: '客户端设备', en: 'Client device' },
'客户端该用哪台': { zh: '客户端该用哪台', en: 'which one the client should use' },
'客户端配置(': { zh: '客户端配置(', en: 'Client configuration (' },
'客户端:': { zh: '客户端:', en: 'Client:' },
'家国内外主流服务商,接口依据': { zh: '家国内外主流服务商,接口依据', en: 'major domestic and international providers; the interface is based on' },
'家目录': { zh: '家目录', en: 'home directory' },
'家里的根证书': { zh: '家里的根证书', en: 'Home Root Certificate' },
'家长时间组': { zh: '家长时间组', en: 'Parental time group' },
'容器': { zh: '容器', en: 'Container' },
'容器日志 · ': { zh: '容器日志 · ', en: 'Container log · ' },
'容器日志滚动(强烈建议开)': { zh: '容器日志滚动(强烈建议开)', en: 'Container log rotation (strongly recommended)' },
'容器详情 · ': { zh: '容器详情 · ', en: 'Container details · ' },
'容量': { zh: '容量', en: 'Capacity' },
'宽带密码': { zh: '宽带密码', en: 'Broadband password' },
'宽带拨号': { zh: '宽带拨号', en: 'Broadband Dial-Up' },
'宽带拨号」卡片中填写账号密码与网卡': { zh: '宽带拨号」卡片中填写账号密码与网卡', en: 'Broadband Dialing" card, fill in the account, password and interface' },
'宽带账号': { zh: '宽带账号', en: 'Broadband account' },
'宽带账号(如': { zh: '宽带账号(如', en: 'Broadband account (e.g.' },
'宽带那边': { zh: '宽带那边', en: 'on the broadband side' },
'寅': { zh: '寅', en: 'Yin' },
'密码': { zh: '密码', en: 'Password' },
'密码 / DDNS Key': { zh: '密码 / DDNS Key', en: 'Password / DDNS key' },
'密码等敏感项': { zh: '密码等敏感项', en: 'passwords and other sensitive items' },
'密码等敏感项在磁盘上是': { zh: '密码等敏感项在磁盘上是', en: 'passwords and other sensitive items on disk are' },
'密码,是宽带密码,忘了就打运营商客服重置。 不确定的话先按上面格式填,保存后再点「立即拨号测试」看结果。': { zh: '密码,是宽带密码,忘了就打运营商客服重置。 不确定的话先按上面格式填,保存后再点「立即拨号测试」看结果。', en: 'password, i.e. the broadband password; if you forgot it, call the ISP support to reset it. If you are unsure, fill in using the format above first, then click 「Dial Now Test」 after saving to see the result.' },
'寒露': { zh: '寒露', en: 'Cold Dew' },
'对一台正在跑': { zh: '对一台正在跑', en: 'for a device that is currently running' },
'对任意主机的任意端口做一次真实握手,看协议版本、加密套件、证书链和校验结论。 默认测本机管理后台;也可以测局域网里其它设备、或者外网站点。': { zh: '对任意主机的任意端口做一次真实握手,看协议版本、加密套件、证书链和校验结论。 默认测本机管理后台;也可以测局域网里其它设备、或者外网站点。', en: 'Performs a real handshake against any host on any port to show the protocol version, cipher suites, certificate chain and validation verdict. Targets this management backend by default; you can also test other devices on the LAN or an external site.' },
'对外地址': { zh: '对外地址', en: 'External address' },
'对外通用': { zh: '对外通用', en: 'externally universal' },
'对外通用 API 接口与调用范例': { zh: '对外通用 API 接口与调用范例', en: 'General-purpose API endpoints and examples' },
'对应': { zh: '对应', en: 'corresponds to' },
'对称型 NAT。': { zh: '对称型 NAT。', en: 'symmetric NAT.' },
'对称型 NAT,穿透较难': { zh: '对称型 NAT,穿透较难', en: 'Symmetric NAT — harder to traverse' },
'对称)。 检测过程完全自动完成,约需': { zh: '对称)。 检测过程完全自动完成,约需', en: 'symmetric). The detection process is fully automatic and takes about' },
'对端地址': { zh: '对端地址', en: 'Peer address' },
'对端网关': { zh: '对端网关', en: 'Peer gateway' },
'寻址与路由': { zh: '寻址与路由', en: 'Addressing & Routing' },
'导入': { zh: '导入', en: 'Import' },
'导入主题包': { zh: '导入主题包', en: 'Import theme package' },
'导入失败,主题未应用。': { zh: '导入失败,主题未应用。', en: 'Import failed, the theme was not applied.' },
'导入已有证书': { zh: '导入已有证书', en: 'Import an existing certificate' },
'导入成功': { zh: '导入成功', en: 'Import succeeded' },
'导出': { zh: '导出', en: 'Export' },
'选择文件': { zh: '选择文件', en: 'Choose file' },
'导出为': { zh: '导出为', en: 'Export as' },
'导出于': { zh: '导出于', en: 'Exported from' },
'导出会逐个文件计算校验值,几十': { zh: '导出会逐个文件计算校验值,几十', en: 'Export computes a checksum for each file; dozens of' },
'导出备份包': { zh: '导出备份包', en: 'Export backup package' },
'导出失败': { zh: '导出失败', en: 'Export failed' },
'导出失败:': { zh: '导出失败:', en: 'Export failed: ' },
'导出当前主题': { zh: '导出当前主题', en: 'Export current theme' },
'导出时间': { zh: '导出时间', en: 'Export time' },
'导出目录': { zh: '导出目录', en: 'Export Directory' },
'将从': { zh: '将从', en: 'will be taken from' },
'将停止容器': { zh: '将停止容器', en: 'will stop the container' },
'将写入': { zh: '将写入', en: 'will write' },
'将删除容器': { zh: '将删除容器', en: 'will delete the container' },
'将删除队列': { zh: '将删除队列', en: 'will delete the queue' },
'将把以下': { zh: '将把以下', en: 'will append the following' },
'将把配置整体恢复到快照': { zh: '将把配置整体恢复到快照', en: 'will restore the entire configuration to the snapshot' },
'将新建': { zh: '将新建', en: 'will be created' },
'将覆盖': { zh: '将覆盖', en: 'will overwrite' },
'小写字母开头': { zh: '小写字母开头', en: 'starts with a lowercase letter' },
'小寒': { zh: '小寒', en: 'Minor Cold' },
'小时': { zh: '小时', en: 'hours' },
'小时 ': { zh: '小时 ', en: 'hours ' },
'小时和断': { zh: '小时和断', en: 'hours and dis' },
'小暑': { zh: '小暑', en: 'Minor Heat' },
'尚无探测数据。点一次「立即检测」就会刷新。': { zh: '尚无探测数据。点一次「立即检测」就会刷新。', en: 'No probe data yet. Click "Check Now" once and it will refresh.' },
'尚未分配 WAN 口': { zh: '尚未分配 WAN 口', en: 'No WAN Port Assigned' },
'尚未创建,首次导出会自动建': { zh: '尚未创建,首次导出会自动建', en: 'Not created yet; the first export creates it automatically' },
'尚未安装。': { zh: '尚未安装。', en: 'Not installed yet.' },
'尚未安装。执行下面的命令即可安装': { zh: '尚未安装。执行下面的命令即可安装', en: 'is not installed yet. Run the command below to install it' },
'尚未安装。请先到「系统': { zh: '尚未安装。请先到「系统', en: 'Not installed yet. Please go to "System' },
'尚未安装的软件包可用下面的命令安装(Debian 13 官方源):': { zh: '尚未安装的软件包可用下面的命令安装(Debian 13 官方源):', en: 'Packages that are not yet installed can be installed with the following command (Debian 13 official repo):' },
'尚未就绪': { zh: '尚未就绪', en: 'Not ready yet' },
'尚未应用自定义主题': { zh: '尚未应用自定义主题', en: 'No custom theme applied yet' },
'尚未开始累计统计': { zh: '尚未开始累计统计', en: 'Statistics have not started accumulating yet' },
'尚未测试': { zh: '尚未测试', en: 'Not yet tested' },
'尚未添加 IP 限速规则 —— 当前使用 CAKE 智能模式,所有设备自动公平分流。': { zh: '尚未添加 IP 限速规则 —— 当前使用 CAKE 智能模式,所有设备自动公平分流。', en: 'No IP rate-limit rules have been added yet — CAKE smart mode is currently in use, and all devices share the bandwidth fairly and automatically.' },
'尚未配置任何会话': { zh: '尚未配置任何会话', en: 'No sessions have been configured yet' },
'尚未配置任何公钥。': { zh: '尚未配置任何公钥。', en: 'No public keys have been configured yet.' },
'局域网': { zh: '局域网', en: 'LAN' },
'局域网接口': { zh: '局域网接口', en: 'LAN interface' },
'局域网里的设备连不上。 在下面把「允许局域网访问」打开并保存即可。': { zh: '局域网里的设备连不上。 在下面把「允许局域网访问」打开并保存即可。', en: 'Devices on the LAN cannot connect. Turn on "Allow LAN access" below and save.' },
'层级': { zh: '层级', en: 'Level' },
'屏幕是空的': { zh: '屏幕是空的', en: 'The screen is empty' },
'属性': { zh: '属性', en: 'Attributes' },
'属性名不合法:': { zh: '属性名不合法:', en: 'Illegal property name: ' },
'峰值': { zh: '峰值', en: 'peak' },
'工作方式': { zh: '工作方式', en: 'How it works' },
'工作方式是:给每台设备(手机': { zh: '工作方式是:给每台设备(手机', en: 'How it works: every device (phone' },
'工作模式': { zh: '工作模式', en: 'Working mode' },
'工作组': { zh: '工作组', en: 'Workgroup' },
'工具': { zh: '工具', en: 'Tools' },
'工具或未开启连接跟踪,此页会为空。': { zh: '工具或未开启连接跟踪,此页会为空。', en: 'tool, or connection tracking is not enabled, this page will be empty.' },
'左下角的「退出登录」按钮已移除(避免与其它入口重复),登出操作统一放在这里。': { zh: '左下角的「退出登录」按钮已移除(避免与其它入口重复),登出操作统一放在这里。', en: 'The 「Log Out」 button in the lower left has been removed (to avoid duplication with other entry points); the logout action is unified here.' },
'左侧调整参数,右侧即时预览。': { zh: '左侧调整参数,右侧即时预览。', en: 'Adjust the parameters on the left, preview instantly on the right.' },
'己': { zh: '己', en: 'Ji' },
'已上锁的快照': { zh: '已上锁的快照', en: 'Locked Snapshot' },
'已上锁,': { zh: '已上锁,', en: 'Locked,' },
'已为该客户端配置 Options,请点击保存并应用': { zh: '已为该客户端配置 Options,请点击保存并应用', en: 'Options set for this client; click Save & Apply' },
'已传输': { zh: '已传输', en: 'Transferred' },
'已保存': { zh: '已保存', en: 'Saved' },
'已保存的唤醒目标,可一键唤醒。': { zh: '已保存的唤醒目标,可一键唤醒。', en: 'Saved wake targets, one click to wake.' },
'已保存,点击「保存并应用」后生效': { zh: '已保存,点击「保存并应用」后生效', en: 'Saved; takes effect after you click "Save & Apply"' },
'已保存:<code>': { zh: '已保存:<code>', en: 'Saved to: <code>' },
'已修改': { zh: '已修改', en: 'Modified' },
'已修改,点击下方保存': { zh: '已修改,点击下方保存', en: 'Changed — click Save below' },
'已修改,请点击保存并应用': { zh: '已修改,请点击保存并应用', en: 'Changed — click Save & Apply to make it take effect' },
'已停止': { zh: '已停止', en: 'Stopped' },
'已停用': { zh: '已停用', en: 'Disabled' },
'已共享': { zh: '已共享', en: 'Shared' },
'已关闭': { zh: '已关闭', en: 'Disabled' },
'已关闭。此后「保存并应用」会': { zh: '已关闭。此后「保存并应用」会', en: 'Disabled. From now on, "Save & Apply" will' },
'已关闭自动滚动': { zh: '已关闭自动滚动', en: 'Auto-scrolling is off' },
'已内置': { zh: '已内置', en: 'built-in' },
'已写入': { zh: '已写入', en: 'Written' },
'已分配地址': { zh: '已分配地址', en: 'Assigned address' },
'已分配的客户端,类似': { zh: '已分配的客户端,类似', en: 'assigned clients, such as' },
'已切到系统设置页,快照列表在「紧急救援通道」里': { zh: '已切到系统设置页,快照列表在「紧急救援通道」里', en: 'Switched to the System Settings page; the snapshot list is in "Emergency Rescue Channel"' },
'已切换为 ': { zh: '已切换为 ', en: 'Switched to ' },
'已切换为按参数自动生成默认规则': { zh: '已切换为按参数自动生成默认规则', en: 'Switched to auto-generating default rules from parameters' },
'已切换服务商,请填写对应凭据后保存': { zh: '已切换服务商,请填写对应凭据后保存', en: 'Provider switched; fill in the matching credentials and save' },
'已创建': { zh: '已创建', en: 'Created' },
'已删除': { zh: '已删除', en: 'Deleted' },
'已删除一条规则,请点击保存并应用': { zh: '已删除一条规则,请点击保存并应用', en: 'A rule was deleted; click Save & Apply' },
'已删除共享,请点击保存并应用': { zh: '已删除共享,请点击保存并应用', en: 'Share deleted; click Save & Apply' },
'已删除客户端,请点击保存并应用': { zh: '已删除客户端,请点击保存并应用', en: 'Client deleted; click Save & Apply' },
'已删除导出,请点击保存并应用': { zh: '已删除导出,请点击保存并应用', en: 'Export deleted; click Save & Apply' },
'已删除时间组,请点击保存并应用': { zh: '已删除时间组,请点击保存并应用', en: 'Time group deleted; click Save & Apply' },
'已删除规则,请点击保存并应用': { zh: '已删除规则,请点击保存并应用', en: 'Rule deleted; click Save & Apply' },
'已删除设备组,请点击保存并应用': { zh: '已删除设备组,请点击保存并应用', en: 'Device group deleted; click Save & Apply' },
'已判定为「有公网地址但入向被拦」': { zh: '已判定为「有公网地址但入向被拦」', en: 'Determined as "has public address but inbound is blocked"' },
'已刷新 DDNS 状态': { zh: '已刷新 DDNS 状态', en: 'DDNS status refreshed' },
'已刷新「': { zh: '已刷新「', en: 'Refreshed "' },
'已刷新接入日志': { zh: '已刷新接入日志', en: 'Refreshed access log' },
'已加入 SMB 共享列表:': { zh: '已加入 SMB 共享列表:', en: 'Added to the SMB share list: ' },
'已加密,任何': { zh: '已加密,任何', en: 'is encrypted; anyone' },
'已加载': { zh: '已加载', en: 'Loaded' },
'已卸载流': { zh: '已卸载流', en: 'Offloaded flows' },
'已发往:': { zh: '已发往:', en: 'Sent to:' },
'已同步': { zh: '已同步', en: 'Synchronized' },
'已含': { zh: '已含', en: 'Includes' },
'已启用': { zh: '已启用', en: 'Enabled' },
'已启用但未运行': { zh: '已启用但未运行', en: 'Enabled but not running' },
'已启用通道': { zh: '已启用通道', en: 'Enabled channels' },
'已启用(限速动作可用)': { zh: '已启用(限速动作可用)', en: 'Enabled (rate-limit actions available)' },
'已在用公网 IPv6': { zh: '已在用公网 IPv6', en: 'Already using public IPv6' },
'已填入下方 Compose 项目编辑器': { zh: '已填入下方 Compose 项目编辑器', en: 'Filled into the Compose project editor below' },
'已填入默认端口,请点击「保存并重启后台」': { zh: '已填入默认端口,请点击「保存并重启后台」', en: 'Default port filled in, please click "Save & Restart Backend"' },
'已复制': { zh: '已复制', en: 'Copied' },
'已复制到剪贴板': { zh: '已复制到剪贴板', en: 'Copied to clipboard' },
'已复制可见内容': { zh: '已复制可见内容', en: 'Visible content copied' },
'已套用模板「': { zh: '已套用模板「', en: 'Template "' },
'已套用模板名称,请补充地址后保存': { zh: '已套用模板名称,请补充地址后保存', en: 'Template applied; add the addresses and save' },
'已套用模板,请补充地址后保存': { zh: '已套用模板,请补充地址后保存', en: 'Template applied, please fill in the address and save' },
'已存在同名时间组「': { zh: '已存在同名时间组「', en: 'A time group named "' },
'已安装': { zh: '已安装', en: 'Installed' },
'已安装未运行': { zh: '已安装未运行', en: 'Installed but not running' },
'已安装的规则库': { zh: '已安装的规则库', en: 'Installed rule sets' },
'已导入该配置的设备立刻连不上': { zh: '已导入该配置的设备立刻连不上', en: 'devices that imported this configuration immediately lose connectivity' },
'已导出': { zh: '已导出', en: 'Exported' },
'已导出 ': { zh: '已导出 ', en: 'Exported: ' },
'已导出的备份包': { zh: '已导出的备份包', en: 'Exported backup packages' },
'已就绪': { zh: '已就绪', en: 'Ready' },
'已就绪(可选)': { zh: '已就绪(可选)', en: 'ready (optional)' },
'已就绪(必需)': { zh: '已就绪(必需)', en: 'ready (required)' },
'已应用': { zh: '已应用', en: 'Applied' },
'已建立': { zh: '已建立', en: 'Established' },
'已建立的 TCP': { zh: '已建立的 TCP', en: 'Established TCP' },
'已开启': { zh: '已开启', en: 'Enabled' },
'已开启自动滚动(每 3 秒)': { zh: '已开启自动滚动(每 3 秒)', en: 'Auto-scrolling is on (every 3 seconds)' },
'已开始下载 ': { zh: '已开始下载 ', en: 'Download started: ' },
'已开始下载快照 ': { zh: '已开始下载快照 ', en: 'Snapshot download started: ' },
'已开放': { zh: '已开放', en: 'Opened' },
'已执行': { zh: '已执行', en: 'Done' },
'已把 ': { zh: '已把 ', en: 'Converted ' },
'已挂载 /dev/': { zh: '已挂载 /dev/', en: 'Mounted /dev/' },
'已按主色生成': { zh: '已按主色生成', en: 'generated from the primary color' },
'已授权公钥': { zh: '已授权公钥', en: 'Authorized public keys' },
'已提交': { zh: '已提交', en: 'Submitted' },
'已收到入向报文 —— 外网可以主动访问本机': { zh: '已收到入向报文 —— 外网可以主动访问本机', en: 'Inbound packets received — the internet can reach this host' },
'已断开': { zh: '已断开', en: 'Disconnected' },
'已新增一个 NFS 导出,请填写后保存': { zh: '已新增一个 NFS 导出,请填写后保存', en: 'Added a new NFS export, please fill it in and save' },
'已新增一个共享,请填写后保存': { zh: '已新增一个共享,请填写后保存', en: 'Added a new share, please fill it in and save' },
'已新增一个空白时间组,请填写后保存': { zh: '已新增一个空白时间组,请填写后保存', en: 'A blank time group was added; fill it in and save' },
'已新增一个空白设备组,请填写后保存': { zh: '已新增一个空白设备组,请填写后保存', en: 'A blank device group was added; fill it in and save' },
'已新增一条空白规则,请填写后保存': { zh: '已新增一条空白规则,请填写后保存', en: 'A blank rule was added; fill it in and save' },
'已新增一条空白转发规则,请填写后保存': { zh: '已新增一条空白转发规则,请填写后保存', en: 'A blank forwarding rule was added; fill it in and save' },
'已是最新': { zh: '已是最新', en: 'Up to date' },
'已是最新版本': { zh: '已是最新版本', en: 'Already up to date' },
'已是最新版本 ': { zh: '已是最新版本 ', en: 'Already up to date: ' },
'已暂停': { zh: '已暂停', en: 'Paused' },
'已暂停自动刷新': { zh: '已暂停自动刷新', en: 'Auto-refresh paused' },
'已检测到 WAN 口:': { zh: '已检测到 WAN 口:', en: 'WAN port detected: ' },
'已注册的': { zh: '已注册的', en: 'registered' },
'已添加「': { zh: '已添加「', en: 'Added "' },
'已添加客户端,请填写后保存': { zh: '已添加客户端,请填写后保存', en: 'Client added; fill it in and save' },
'已清空显示(不影响内核日志)。': { zh: '已清空显示(不影响内核日志)。', en: 'Display cleared (does not affect the kernel log).' },
'已清空端口转发规则,请点击保存并应用': { zh: '已清空端口转发规则,请点击保存并应用', en: 'Port forwarding rules cleared; click Save & Apply' },
'已生成': { zh: '已生成', en: 'Generated' },
'已用': { zh: '已用', en: 'Used' },
'已用 ': { zh: '已用 ', en: 'Used ' },
'已禁止远程登录。如遇失联,可通过虚拟机平台的控制台,或物理机的': { zh: '已禁止远程登录。如遇失联,可通过虚拟机平台的控制台,或物理机的', en: 'Remote login has been disabled. If you lose connectivity, use the hypervisor console, or on a physical machine the' },
'已禁止(PermitRootLogin no)': { zh: '已禁止(PermitRootLogin no)', en: 'Disabled (PermitRootLogin no)' },
'已移除「': { zh: '已移除「', en: 'Removed "' },
'已经挂载的客户端可能会短暂断开,一般会自动重连。': { zh: '已经挂载的客户端可能会短暂断开,一般会自动重连。', en: 'mounted clients may be briefly disconnected and will normally reconnect automatically.' },
'已经过期': { zh: '已经过期', en: 'Expired' },
'已读取公钥文件内容': { zh: '已读取公钥文件内容', en: 'Public key file contents read' },
'已超出套餐': { zh: '已超出套餐', en: 'Quota exceeded' },
'已转正。装的是': { zh: '已转正。装的是', en: 'has been made permanent. What is installed is' },
'已载入到设计器,改好后保存即为新主题': { zh: '已载入到设计器,改好后保存即为新主题', en: 'Loaded into the designer; save it to create a new theme' },
'已载入项目 ': { zh: '已载入项目 ', en: 'Project loaded: ' },
'已达单次上限': { zh: '已达单次上限', en: 'Single-run limit reached' },
'已过期': { zh: '已过期', en: 'Expired' },
'已连接': { zh: '已连接', en: 'Connected' },
'已连接终端': { zh: '已连接终端', en: 'Terminal connected' },
'已连接设备': { zh: '已连接设备', en: 'Connected devices' },
'已退出': { zh: '已退出', en: 'Exited' },
'已送达': { zh: '已送达', en: 'Delivered' },
'已选': { zh: '已选', en: 'Selected' },
'已配置开机自启': { zh: '已配置开机自启', en: 'Configured to start on boot' },
'已配置的': { zh: '已配置的', en: 'configured' },
'已重命名': { zh: '已重命名', en: 'Renamed' },
'已重新读取': { zh: '已重新读取', en: 'Reloaded' },
'已锁定': { zh: '已锁定', en: 'Locked' },
'已锁定包': { zh: '已锁定包', en: 'Locked packages' },
'巳': { zh: '巳', en: 'Si' },
'布局尺寸': { zh: '布局尺寸', en: 'Layout sizes' },
'带宽': { zh: '带宽', en: 'Bandwidth' },
'带宽与模式': { zh: '带宽与模式', en: 'Bandwidth and mode' },
'带宽建议填「实测速率的': { zh: '带宽建议填「实测速率的', en: 'for bandwidth, enter 「measured rate\'s' },
'常用公共': { zh: '常用公共', en: 'common public' },
'常用可选规则(取消注释后生效)': { zh: '常用可选规则(取消注释后生效)', en: 'Common optional rules (take effect after being uncommented)' },
'常用的作息模板已内置,点击即可套用,再按需微调。': { zh: '常用的作息模板已内置,点击即可套用,再按需微调。', en: 'Common schedule templates are built in — click to apply, then fine-tune as needed.' },
'常用设备': { zh: '常用设备', en: 'Common devices' },
'常用预设:': { zh: '常用预设:', en: 'Common presets:' },
'常见时间服务器': { zh: '常见时间服务器', en: 'Common time servers' },
'常见的家用级 NAT': { zh: '常见的家用级 NAT', en: 'Common consumer-grade NAT' },
'平台模板': { zh: '平台模板', en: 'Platform template' },
'平均负载是 Linux 跟踪系统资源占用的一项指标,数值等于「正在运行或等待 IO 的进程数」的 1/5/15 分钟均值。柱状图右侧是最新采样点。': { zh: '平均负载是 Linux 跟踪系统资源占用的一项指标,数值等于「正在运行或等待 IO 的进程数」的 1/5/15 分钟均值。柱状图右侧是最新采样点。', en: 'The load average is a Linux metric for system resource usage; it is the 1/5/15-minute average of the number of processes that are running or waiting for I/O. The rightmost bar is the newest sample.' },
'年': { zh: '年', en: 'year' },
'年9月28': { zh: '年9月28', en: ', Sep 28' },
'年现行公开文档整理。': { zh: '年现行公开文档整理。', en: 'year, compiled from currently available public documentation.' },
'并停住, 不会留下一个「看起来成功」的结果。': { zh: '并停住, 不会留下一个「看起来成功」的结果。', en: 'and stops there, instead of leaving behind an apparent "success" result.' },
'并用下面的共享密钥注册进来。': { zh: '并用下面的共享密钥注册进来。', en: 'and register it with the shared key below.' },
'并重载导出表': { zh: '并重载导出表', en: 'and reload the export table' },
'广播': { zh: '广播', en: 'Broadcast' },
'库': { zh: '库', en: 'Library' },
'应承担': { zh: '应承担', en: 'should bear' },
'应摊': { zh: '应摊', en: 'should be shared' },
'应用': { zh: '应用', en: 'Apply' },
'应用与连接': { zh: '应用与连接', en: 'Apps and connections' },
'应用分类」三段式匹配:命中后在转发链上执行阻断': { zh: '应用分类」三段式匹配:命中后在转发链上执行阻断', en: 'Application category」 three-stage matching: once matched, the block is enforced on the forwarding chain' },
'应用商店搜': { zh: '应用商店搜', en: 'search the app store for' },
'应用失败': { zh: '应用失败', en: 'Apply failed' },
'应用并连接': { zh: '应用并连接', en: 'apply and connect' },
'应用文件共享配置': { zh: '应用文件共享配置', en: 'Apply the file sharing configuration' },
'应用日志': { zh: '应用日志', en: 'App log' },
'应用范围(': { zh: '应用范围(', en: 'Application scope (' },
'应用访问控制规则': { zh: '应用访问控制规则', en: 'Apply access control rules' },
'应用识别': { zh: '应用识别', en: 'Application identification' },
'应用识别 DPI': { zh: '应用识别 DPI', en: 'App Detection (DPI)' },
'应用识别与规则库更新(nDPI)': { zh: '应用识别与规则库更新(nDPI)', en: 'App Detection & Signature Updates (nDPI)' },
'庚': { zh: '庚', en: 'Geng' },
'建议': { zh: '建议', en: 'Recommendation' },
'建议做法': { zh: '建议做法', en: 'Recommended practice' },
'建议选最快且可用的那个,然后点「更新规则库」。': { zh: '建议选最快且可用的那个,然后点「更新规则库」。', en: 'Pick the fastest one that works, then click 「Update Rule Sets」.' },
'廿': { zh: '廿', en: '20' },
'开了就多一个': { zh: '开了就多一个', en: 'turning it on adds another' },
'开关': { zh: '开关', en: 'Switch' },
'开启': { zh: '开启', en: 'Enable' },
'开启中…': { zh: '开启中…', en: 'Turning on…' },
'开启前请了解可能受影响的程序与协议': { zh: '开启前请了解可能受影响的程序与协议', en: 'Before enabling, understand which programs and protocols may be affected' },
'开启后由后台定时任务按下面设定的间隔检测公网地址,': { zh: '开启后由后台定时任务按下面设定的间隔检测公网地址,', en: 'Once enabled, a background scheduled task detects the public address at the interval set below,' },
'开启后,每台连上来的设备的所有上网流量都会从你家出去再出去,': { zh: '开启后,每台连上来的设备的所有上网流量都会从你家出去再出去,', en: 'Once enabled, all internet traffic from every connected device goes out through your home connection,' },
'开启后,重启': { zh: '开启后,重启', en: 'After enabling, restart' },
'开启时,所有「应用」操作只会把配置写入磁盘,': { zh: '开启时,所有「应用」操作只会把配置写入磁盘,', en: 'When enabled, all "Apply" operations only write the configuration to disk,' },
'开启紧急救援通道': { zh: '开启紧急救援通道', en: 'Enable Emergency Rescue Channel' },
'开启自动快照': { zh: '开启自动快照', en: 'Enable Auto Snapshot' },
'开启(推荐)': { zh: '开启(推荐)', en: 'Enable (recommended)' },
'开头的区号加号码; 密码不是': { zh: '开头的区号加号码; 密码不是', en: 'prefix plus number; the password is not' },
'开头(注释状态),不会生效。': { zh: '开头(注释状态),不会生效。', en: 'at the beginning (commented out); it does not take effect.' },
'开头)': { zh: '开头)', en: 'at the beginning)' },
'开始': { zh: '开始', en: 'Start' },
'开始 PPPoE 拨号': { zh: '开始 PPPoE 拨号', en: 'Start PPPoE dial-up' },
'开始入向实测': { zh: '开始入向实测', en: 'Start inbound measurement' },
'开始抓包': { zh: '开始抓包', en: 'Start packet capture' },
'开始拨号(': { zh: '开始拨号(', en: 'start dialing (' },
'开始更新': { zh: '开始更新', en: 'Start update' },
'开始检测': { zh: '开始检测', en: 'Start detection' },
'开始测试': { zh: '开始测试', en: 'Start Test' },
'开始(本地)': { zh: '开始(本地)', en: 'Start (local)' },
'开放到直连网段': { zh: '开放到直连网段', en: 'Open to Directly Connected Subnet' },
'开机挂载': { zh: '开机挂载', en: 'Mount on Boot' },
'开机自动挂载': { zh: '开机自动挂载', en: 'Mount automatically at boot' },
'开机自启': { zh: '开机自启', en: 'Start on boot' },
'异常': { zh: '异常', en: 'Abnormal' },
'引入。': { zh: '引入。', en: 'brought in.' },
'引擎': { zh: '引擎', en: 'Engine' },
'引擎版本': { zh: '引擎版本', en: 'Engine version' },
'引擎状态与容器列表': { zh: '引擎状态与容器列表', en: 'Engine status and container list' },
'引擎配置': { zh: '引擎配置', en: 'Engine configuration' },
'引擎配置(': { zh: '引擎配置(', en: 'Engine configuration (' },
'弱化文字': { zh: '弱化文字', en: 'Muted text' },
'强制': { zh: '强制', en: 'Force' },
'强制使用': { zh: '强制使用', en: 'Force use' },
'强制重启': { zh: '强制重启', en: 'Forced reboot' },
'强制重启(高风险)': { zh: '强制重启(高风险)', en: 'Force reboot (high risk)' },
'归档会按下面的策略自动清理(由后台定时任务执行)。开启归档后, 即使系统': { zh: '归档会按下面的策略自动清理(由后台定时任务执行)。开启归档后, 即使系统', en: 'Archives are cleaned up automatically by the policy below (executed by a background cron job). With archiving enabled, even if the system' },
'归档到磁盘': { zh: '归档到磁盘', en: 'Archive to Disk' },
'归档最低级别': { zh: '归档最低级别', en: 'Minimum Level to Archive' },
'当前': { zh: '当前', en: 'Current' },
'当前 ': { zh: '当前 ', en: 'Current ' },
'当前 bbr + ': { zh: '当前 bbr + ', en: 'Current bbr + ' },
'当前仅一个物理网口,无剩余口可桥接': { zh: '当前仅一个物理网口,无剩余口可桥接', en: 'There is currently only one physical NIC and no spare port to bridge' },
'当前值': { zh: '当前值', en: 'Current value' },
'当前共享密钥偏短,建议重新生成一个。': { zh: '当前共享密钥偏短,建议重新生成一个。', en: 'The current shared key is too short; generating a new one is recommended.' },
'当前命中中': { zh: '当前命中中', en: 'Currently matching' },
'当前地址池': { zh: '当前地址池', en: 'Current address pool' },
'当前地址池有问题:': { zh: '当前地址池有问题:', en: 'There is a problem with the current address pool:' },
'当前地址:': { zh: '当前地址:', en: 'Current Address:' },
'当前处于': { zh: '当前处于', en: 'Currently' },
'当前处于免打扰时段': { zh: '当前处于免打扰时段', en: 'Currently in the do-not-disturb period' },
'当前处于构建保护模式': { zh: '当前处于构建保护模式', en: 'Currently in build protection mode' },
'当前处于构建保护模式:配置已写入 /etc/docker/daemon.json,': { zh: '当前处于构建保护模式:配置已写入 /etc/docker/daemon.json,', en: 'Build protection mode is on: the configuration has been written to /etc/docker/daemon.json,' },
'当前安装:': { zh: '当前安装:', en: 'Currently installed: ' },
'当前文件会先另存一份新备份,不会丢。': { zh: '当前文件会先另存一份新备份,不会丢。', en: 'The current file is first saved as a new backup, so nothing is lost.' },
'当前无端口转发规则。': { zh: '当前无端口转发规则。', en: 'No port forwarding rules currently.' },
'当前映射表': { zh: '当前映射表', en: 'Current mapping table' },
'当前服务商': { zh: '当前服务商', en: 'Current provider' },
'当前条件下没有日志。可放宽时间范围或取消筛选条件;': { zh: '当前条件下没有日志。可放宽时间范围或取消筛选条件;', en: 'No log entries match the current conditions; widen the time range or clear the filters;' },
'当前来源': { zh: '当前来源', en: 'Current source' },
'当前模式': { zh: '当前模式', en: 'Current Mode' },
'当前没有任何被锁定的包。': { zh: '当前没有任何被锁定的包。', en: 'There are currently no locked packages.' },
'当前没有容器。': { zh: '当前没有容器。', en: 'There are currently no containers.' },
'当前没有容器。可在下方 Compose 项目中创建,或先在 Web 终端里运行 docker run。': { zh: '当前没有容器。可在下方 Compose 项目中创建,或先在 Web 终端里运行 docker run。', en: 'There are currently no containers. You can create one under the Compose projects below, or run docker run in the web terminal first.' },
'当前没有打印任务。': { zh: '当前没有打印任务。', en: 'There are currently no print jobs.' },
'当前环境没有 systemd(容器形态)。': { zh: '当前环境没有 systemd(容器形态)。', en: 'No systemd in the current environment (container mode).' },
'当前生效的规则': { zh: '当前生效的规则', en: 'Currently effective rules' },
'当前由': { zh: '当前由', en: 'currently by' },
'当前登录会话': { zh: '当前登录会话', en: 'Current login sessions' },
'当前租约(实时)': { zh: '当前租约(实时)', en: 'Current Leases (Live)' },
'当前筛选条件下没有匹配项(共': { zh: '当前筛选条件下没有匹配项(共', en: 'No matches under the current filter (total' },
'当前系统实际地址:': { zh: '当前系统实际地址:', en: 'Current actual system address:' },
'当前获取到的': { zh: '当前获取到的', en: 'currently obtained' },
'当前设置': { zh: '当前设置', en: 'Current settings' },
'当前设置是「不按份数、不按天数」清理,没有可清理的旧包': { zh: '当前设置是「不按份数、不按天数」清理,没有可清理的旧包', en: 'The current policy cleans up neither by count nor by age, so there is nothing to remove' },
'当前软加速与 QoS 冲突,是否仍要继续?': { zh: '当前软加速与 QoS 冲突,是否仍要继续?', en: 'Software acceleration currently conflicts with QoS. Continue anyway?' },
'当前连接': { zh: '当前连接', en: 'Current connections' },
'当前连接(': { zh: '当前连接(', en: 'Current connection (' },
'当前页面的「应用」按钮就在页面内部,无需全局应用': { zh: '当前页面的「应用」按钮就在页面内部,无需全局应用', en: 'The "Apply" button for this page is inside the page; no global apply is needed' },
'当前页面的操作按钮就在页面内部,无需全局保存': { zh: '当前页面的操作按钮就在页面内部,无需全局保存', en: 'The action buttons for this page are inside the page; no global save is needed' },
'当前页面的配置变更会': { zh: '当前页面的配置变更会', en: 'configuration changes on the current page will' },
'当前:': { zh: '当前:', en: 'Current:' },
'当配置失误把网络': { zh: '当配置失误把网络', en: 'if a misconfiguration takes the network' },
'影响与取舍': { zh: '影响与取舍', en: 'Impact and trade-offs' },
'待签回': { zh: '待签回', en: 'Pending Signature' },
'待聚合数据': { zh: '待聚合数据', en: 'Pending aggregated data' },
'待设置': { zh: '待设置', en: 'Pending setup' },
'必需': { zh: '必需', en: 'required' },
'必需,': { zh: '必需,', en: 'required,' },
'必需,建议保留启用):': { zh: '必需,建议保留启用):', en: 'required, keeping it enabled is recommended):' },
'必需,至少': { zh: '必需,至少', en: 'required, at least' },
'必须是私有网段,且不能和内网网段重叠': { zh: '必须是私有网段,且不能和内网网段重叠', en: 'must be a private network range and must not overlap with the LAN range' },
'快到期了': { zh: '快到期了', en: 'Expiring Soon' },
'快照': { zh: '快照', en: 'snapshot' },
'快照会': { zh: '快照会', en: 'Snapshots will' },
'快照列表,选择升级前的快照回滚': { zh: '快照列表,选择升级前的快照回滚', en: 'Snapshot list; pick a snapshot from before the upgrade to roll back' },
'快照创建后仍可随时改备注、随时上锁解锁': { zh: '快照创建后仍可随时改备注、随时上锁解锁', en: 'After a snapshot is created you can still edit the note and lock or unlock it at any time' },
'快照包含以下内容:': { zh: '快照包含以下内容:', en: 'Snapshots contain the following:' },
'快照占用': { zh: '快照占用', en: 'Snapshot usage' },
'快照备注': { zh: '快照备注', en: 'Snapshot Note' },
'快照存放路径': { zh: '快照存放路径', en: 'Snapshot Storage Path' },
'快照时间(小时一次)': { zh: '快照时间(小时一次)', en: 'Snapshot Time (hours)' },
'快照,万一不满意还能退回来。': { zh: '快照,万一不满意还能退回来。', en: 'the snapshot, so you can come back if you are not happy with it.' },
'快照,回滚完不满意还能退回来。': { zh: '快照,回滚完不满意还能退回来。', en: 'the snapshot, so if the rollback does not satisfy you you can return again.' },
'快速提交(': { zh: '快速提交(', en: 'Quick commit (' },
'怎么做(动作)。规则自上而下匹配,命中即止。': { zh: '怎么做(动作)。规则自上而下匹配,命中即止。', en: 'how it is done (action). Rules are matched from top to bottom and stop at the first hit.' },
'怎么用:': { zh: '怎么用:', en: 'How to use:' },
'怎么装': { zh: '怎么装', en: 'How to Install' },
'总开关': { zh: '总开关', en: 'Master switch' },
'总开关与推送策略': { zh: '总开关与推送策略', en: 'Master switch and push policy' },
'总开关已修改,请在下方点击「保存并应用」': { zh: '总开关已修改,请在下方点击「保存并应用」', en: 'The master switch has changed; click "Save & Apply" below' },
'总开关是开的,但定时器没在跑。': { zh: '总开关是开的,但定时器没在跑。', en: 'The master switch is on, but the timer is not running.' },
'恢复': { zh: '恢复', en: 'Restore' },
'恢复默认': { zh: '恢复默认', en: 'Restore defaults' },
'恢复默认主题': { zh: '恢复默认主题', en: 'Restore default theme' },
'悬停背景': { zh: '悬停背景', en: 'Hover background' },
'惊蛰': { zh: '惊蛰', en: 'Awakening of Insects' },
'想翻看历史用滚轮或': { zh: '想翻看历史用滚轮或', en: 'to browse the history use the scroll wheel or' },
'戊': { zh: '戊', en: 'Wu' },
'戌': { zh: '戌', en: 'Xu' },
'成功': { zh: '成功', en: 'Success' },
'成功浅底': { zh: '成功浅底', en: 'Success tint' },
'成功色': { zh: '成功色', en: 'Success colour' },
'成员口': { zh: '成员口', en: 'member port' },
'我了解启用': { zh: '我了解启用', en: 'I understand that enabling' },
'我准备好执行切换': { zh: '我准备好执行切换', en: 'I am ready to perform the switch' },
'我的主题': { zh: '我的主题', en: 'My themes' },
'我确认账号已填写正确,并了解该操作会改变当前网络的出网路由': { zh: '我确认账号已填写正确,并了解该操作会改变当前网络的出网路由', en: 'I confirm the account has been filled in correctly, and I understand that this action changes the egress routing of the current network' },
'或': { zh: '或', en: 'or' },
'或 *': { zh: '或 *', en: 'or *' },
'或 /tmp/opensoho': { zh: '或 /tmp/opensoho', en: 'or /tmp/opensoho' },
'或 0': { zh: '或 0', en: 'or 0' },
'或 13800000000': { zh: '或 13800000000', en: 'or 13800000000' },
'或 Compose': { zh: '或 Compose', en: 'or Compose' },
'或 DDNS': { zh: '或 DDNS', en: 'or DDNS' },
'或上游下发了前缀委派并配好路由': { zh: '或上游下发了前缀委派并配好路由', en: 'or the upstream has issued a prefix delegation and configured the route' },
'或内网': { zh: '或内网', en: 'or the LAN' },
'或文本': { zh: '或文本', en: 'or text' },
'或用这台机器上的文件': { zh: '或用这台机器上的文件', en: 'or use a file on this machine' },
'或直接粘贴公钥内容(以': { zh: '或直接粘贴公钥内容(以', en: 'or paste the public key content directly (starting with' },
'或者打开 cups-browsed 让它自动发现网络上的打印机。</p>': { zh: '或者打开 cups-browsed 让它自动发现网络上的打印机。</p>', en: 'or enable cups-browsed to auto-discover printers on the network.</p>' },
'或雷电, 所以按真实总线展示更准确。': { zh: '或雷电, 所以按真实总线展示更准确。', en: 'or Thunderbolt, so displaying the real bus is more accurate.' },
'所以列表直接放在这里,看得清每份快照的备注、体积和是否受保护,回滚按钮就在手边。': { zh: '所以列表直接放在这里,看得清每份快照的备注、体积和是否受保护,回滚按钮就在手边。', en: 'So the list is placed right here: you can clearly see the note, size and protection state of each snapshot, and the rollback button is always at hand.' },
'所在的端口即可正常收看。': { zh: '所在的端口即可正常收看。', en: 'the port it is on can be watched normally.' },
'所有': { zh: '所有', en: 'All' },
'所有「应用」只会写入磁盘,不会启动服务、不会改变网络。 这样可以安全地把配置准备好,等你添加好': { zh: '所有「应用」只会写入磁盘,不会启动服务、不会改变网络。 这样可以安全地把配置准备好,等你添加好', en: 'All 「Apply」 actions only write to disk; they do not start services and do not change the network. This lets you prepare the configuration safely, ready for you to add the' },
'所有人可访问': { zh: '所有人可访问', en: 'Everyone can access' },
'所有已导入配置的设备': { zh: '所有已导入配置的设备', en: 'All devices that imported the configuration' },
'所选安装包;': { zh: '所选安装包;', en: 'the selected package;' },
'所需的 全部依赖、组件、软件与内核模块。绿色为已就绪,红色为缺失(必需),黄色为可选。': { zh: '所需的 全部依赖、组件、软件与内核模块。绿色为已就绪,红色为缺失(必需),黄色为可选。', en: 'required all dependencies, components, software and kernel modules. Green means ready, red means missing (required), yellow means optional.' },
'手动快照': { zh: '手动快照', en: 'Manual Snapshot' },
'手动快照不参与自动清理': { zh: '手动快照不参与自动清理', en: 'Manual snapshots are not subject to automatic cleanup' },
'手动指定 IP / 掩码 / 网关 / DNS,适用于专线或固定 IP 场景。': { zh: '手动指定 IP / 掩码 / 网关 / DNS,适用于专线或固定 IP 场景。', en: 'Set the IP / prefix / gateway / DNS yourself; for leased lines or fixed IPs.' },
'手动指定前缀': { zh: '手动指定前缀', en: 'Manually Specify Prefix' },
'手动输入路径': { zh: '手动输入路径', en: 'Enter the path manually' },
'手机、电脑连上来之后要自动拿到': { zh: '手机、电脑连上来之后要自动拿到', en: 'phones and PCs must automatically receive once connected' },
'手机丢了就删掉那一条,比改密码快得多。': { zh: '手机丢了就删掉那一条,比改密码快得多。', en: 'if you lose the phone, just delete that entry — much faster than changing the password.' },
'手机推送': { zh: '手机推送', en: 'Phone push' },
'手机装': { zh: '手机装', en: 'app on the phone' },
'才生效,而且已有的容器要重建才会拿到': { zh: '才生效,而且已有的容器要重建才会拿到', en: 'only takes effect, and existing containers must be recreated to get' },
'才能获得可用的公网': { zh: '才能获得可用的公网', en: 'to obtain a usable public' },
'打包': { zh: '打包', en: 'Package' },
'打包前保存失败:': { zh: '打包前保存失败:', en: 'Saving before packaging failed: ' },
'打包失败': { zh: '打包失败', en: 'Packaging failed' },
'打包失败:': { zh: '打包失败:', en: 'Packaging failed: ' },
'打包并下载': { zh: '打包并下载', en: 'Package and download' },
'打包所选': { zh: '打包所选', en: 'Package the selected' },
'打印服务': { zh: '打印服务', en: 'Print Service' },
'打印机。': { zh: '打印机。', en: 'printer.' },
'打印机与可接入设备': { zh: '打印机与可接入设备', en: 'Printers and connectable devices' },
'打印队列': { zh: '打印队列', en: 'Print queue' },
'打崩': { zh: '打崩', en: 'crash' },
'打开': { zh: '打开', en: 'Open' },
'打开也不会坏': { zh: '打开也不会坏', en: 'Opening it will not break anything' },
'打开后': { zh: '打开后', en: 'After enabling it' },
'打开后会订阅 conntrack 实时事件流, 查询会多等几秒以捕捉这段时间内新建的连接。默认关闭以保证查询速度。': { zh: '打开后会订阅 conntrack 实时事件流, 查询会多等几秒以捕捉这段时间内新建的连接。默认关闭以保证查询速度。', en: 'Once enabled, it subscribes to the real-time conntrack event stream, and queries wait a few extra seconds to capture connections created during that window. Disabled by default to keep queries fast.' },
'打开这一项,客户端的所有上网流量都会从你家出去再出去(按两倍流量计费), 通常只在「人在国外需要用家里的宽带」时才开。': { zh: '打开这一项,客户端的所有上网流量都会从你家出去再出去(按两倍流量计费), 通常只在「人在国外需要用家里的宽带」时才开。', en: 'When enabled, all of the client\'s internet traffic goes out through your home link and back out again (billed as double traffic); normally you only turn it on when 「you are abroad and need the broadband at home」.' },
'打标限速,或直接封禁某类应用。': { zh: '打标限速,或直接封禁某类应用。', en: 'mark for rate limiting, or block a whole class of applications outright.' },
'打标)': { zh: '打标)', en: 'marking)' },
'执行中,请稍候…': { zh: '执行中,请稍候…', en: 'Executing, please wait…' },
'执行切换(请在我方确认后进行)': { zh: '执行切换(请在我方确认后进行)', en: 'Perform Switchover (please do so after confirmation from us)' },
'执行失败': { zh: '执行失败', en: 'Execution Failed' },
'执行时刻': { zh: '执行时刻', en: 'Execution time' },
'执行时间': { zh: '执行时间', en: 'Execution time' },
'执行时间(每日)': { zh: '执行时间(每日)', en: 'Execution time (daily)' },
'扩展': { zh: '扩展', en: 'Extensions' },
'扫描失败': { zh: '扫描失败', en: 'Scan Failed' },
'扫描完成': { zh: '扫描完成', en: 'Scan finished' },
'找回):': { zh: '找回):', en: 'retrieve it):' },
'技术细节:': { zh: '技术细节:', en: 'Technical details:' },
'把 nftables': { zh: '把 nftables', en: 'nftables' },
'把主题包拖到这里,或': { zh: '把主题包拖到这里,或', en: 'Drag the theme package here, or' },
'把主题打包成独立的': { zh: '把主题打包成独立的', en: 'Package the theme as a standalone' },
'把从运营商获取的': { zh: '把从运营商获取的', en: 'the one obtained from the ISP' },
'把任意': { zh: '把任意', en: 'any' },
'把全部设置导成一个能下载、能换机还原的包:带清单与逐文件校验,还原前先预检': { zh: '把全部设置导成一个能下载、能换机还原的包:带清单与逐文件校验,还原前先预检', en: 'Export all settings into a downloadable package that can be restored on another machine: it carries a manifest with per-file checksums, and a pre-flight check runs before restoring' },
'把外网访问的某个端口,转发到内网某台设备的端口。这是最主流、最稳定的做法: 只在': { zh: '把外网访问的某个端口,转发到内网某台设备的端口。这是最主流、最稳定的做法: 只在', en: 'forward a port reached from the WAN to a port on an internal device. This is the most mainstream and most stable approach: only when' },
'把它交给证书机构(点一下全选复制)': { zh: '把它交给证书机构(点一下全选复制)', en: 'hand it to the certificate authority (click select all to copy)' },
'把已建立的连接直接卸载到转发快路径, 等价于': { zh: '把已建立的连接直接卸载到转发快路径, 等价于', en: 'offload established connections straight to the fast forwarding path, which is equivalent to' },
'把文件拖到这里上传(或点击「上传文件」)': { zh: '把文件拖到这里上传(或点击「上传文件」)', en: 'drag the file here to upload (or click 「Upload File」)' },
'把界面配置与系统配置文件整体恢复到快照那一刻的状态,并重启相关服务。 动手前先看清': { zh: '把界面配置与系统配置文件整体恢复到快照那一刻的状态,并重启相关服务。 动手前先看清', en: 'Restores both the UI configuration and the system config files to their state at the moment of the snapshot, and restarts the relevant services. Read it carefully before you start' },
'把网线插到任意一个网口都能访问': { zh: '把网线插到任意一个网口都能访问', en: 'Plug the network cable into any port to access it' },
'把这台路由器变成打印服务器,让局域网里的电脑、手机直接打。 两种模式': { zh: '把这台路由器变成打印服务器,让局域网里的电脑、手机直接打。 两种模式', en: 'turn this router into a print server so PCs and phones on the LAN can print directly. Two modes' },
'把这张证书部署给管理后台?\\n\\n': { zh: '把这张证书部署给管理后台?\\n\\n', en: 'Deploy this certificate to the admin panel?\\n\\n' },
'把这张证书部署给管理后台?\n\n': { zh: '把这张证书部署给管理后台?\n\n', en: 'Deploy this certificate to the admin panel?\\n\\n' },
'把这张证书部署给管理后台?\\\\n\\\\n': { zh: '把这张证书部署给管理后台?\\\\n\\\\n', en: 'Deploy this certificate to the admin panel?\\n\\n' },
'把防火墙、连接跟踪、': { zh: '把防火墙、连接跟踪、', en: 'firewall, connection tracking,' },
'把需要统一管控的设备归到一组,支持': { zh: '把需要统一管控的设备归到一组,支持', en: 'group the devices that need unified control, supports' },
'抓包与连接状态': { zh: '抓包与连接状态', en: 'Capture and connection status' },
'抓包接口': { zh: '抓包接口', en: 'Capture interface' },
'抓实时连接事件(': { zh: '抓实时连接事件(', en: 'Capture real-time connection events (' },
'拉一次实时数据。': { zh: '拉一次实时数据。', en: 'pull one round of live data.' },
'拉取镜像': { zh: '拉取镜像', en: 'Pull image' },
'拉镜像时的真实链路 (已加': { zh: '拉镜像时的真实链路 (已加', en: 'real link used when pulling the image (' },
'拒绝': { zh: '拒绝', en: 'Reject' },
'拒绝网段(可选)': { zh: '拒绝网段(可选)', en: 'Reject ranges (optional)' },
'拨号': { zh: '拨号', en: 'Dial up' },
'拨号、': { zh: '拨号、', en: 'dial-up,' },
'拨号参数': { zh: '拨号参数', en: 'Dialing parameters' },
'拨号失败': { zh: '拨号失败', en: 'Dial Failed' },
'拨号指令已发出': { zh: '拨号指令已发出', en: 'Dial command issued' },
'拨号时自动获取': { zh: '拨号时自动获取', en: 'Obtain automatically when dialing' },
'拨号策略': { zh: '拨号策略', en: 'Dialing strategy' },
'拨号网卡已选为 ': { zh: '拨号网卡已选为 ', en: 'Dial-up NIC set to ' },
'拨号网卡(': { zh: '拨号网卡(', en: 'dial-up NIC (' },
'持久化文件': { zh: '持久化文件', en: 'Persistent files' },
'挂载': { zh: '挂载', en: 'Mount' },
'挂载点': { zh: '挂载点', en: 'Mount point' },
'指定本路由器在局域网中的地址。当前使用': { zh: '指定本路由器在局域网中的地址。当前使用', en: 'Set this router\'s address on the LAN. Currently using' },
'指纹': { zh: '指纹', en: 'Fingerprint' },
'按 IP 限速模式': { zh: '按 IP 限速模式', en: 'Per-IP rate limit mode' },
'按 MAC': { zh: '按 MAC', en: 'By MAC' },
'按 MTU': { zh: '按 MTU', en: 'By MTU' },
'按「应用': { zh: '按「应用', en: 'By 「Apply' },
'按会话数量生成': { zh: '按会话数量生成', en: 'generated by session count' },
'按内网': { zh: '按内网', en: 'By LAN' },
'按动作': { zh: '按动作', en: 'By Action' },
'按协议': { zh: '按协议', en: 'By Protocol' },
'按应用匹配能力,需自行编译': { zh: '按应用匹配能力,需自行编译', en: 'application matching capability depends on your own build' },
'按当前参数生成默认规则': { zh: '按当前参数生成默认规则', en: 'Generate Default Rules from Current Parameters' },
'按当前策略,勾选中的项目': { zh: '按当前策略,勾选中的项目', en: 'under the current policy, checked items' },
'按所选协议族重新应用': { zh: '按所选协议族重新应用', en: 're-applied according to the selected protocol family' },
'按服务': { zh: '按服务', en: 'By service' },
'按服务分类': { zh: '按服务分类', en: 'Classify by service' },
'按来源': { zh: '按来源', en: 'By Source' },
'按此主色生成整套配色': { zh: '按此主色生成整套配色', en: 'Generate a whole palette from this primary colour' },
'按用量': { zh: '按用量', en: 'By usage' },
'按策略立即执行一次': { zh: '按策略立即执行一次', en: 'Run once immediately according to the policy' },
'按级别': { zh: '按级别', en: 'By Level' },
'按设备与服务统计每月流量,工作室可按比例分摊话费;后台增量聚合,不会拖慢机器': { zh: '按设备与服务统计每月流量,工作室可按比例分摊话费;后台增量聚合,不会拖慢机器', en: 'Monthly traffic per device and per service; a studio can split the bill proportionally. Incremental aggregation in the background — no slowdown.' },
'按设备统计这个月用了多少流量、按什么服务用掉的。 工作室场景下还能按预设比例把话费分摊到人头或机器上。': { zh: '按设备统计这个月用了多少流量、按什么服务用掉的。 工作室场景下还能按预设比例把话费分摊到人头或机器上。', en: 'Break down this month\'s data usage by device and by the service it was used for. In a studio-style setup, the cost can also be split across people or machines by a preset ratio.' },
'按设定的时间间隔自动为当前配置拍一份快照,并在超过保留期后自动清理旧快照。默认': { zh: '按设定的时间间隔自动为当前配置拍一份快照,并在超过保留期后自动清理旧快照。默认', en: 'Automatically take a snapshot of the current configuration at the set interval, and automatically clean up old snapshots after the retention period. Default' },
'按需配置,例如每天凌晨自动重启以释放内存。': { zh: '按需配置,例如每天凌晨自动重启以释放内存。', en: 'Configure as needed, for example restart automatically in the early morning every day to release memory.' },
'按顺序': { zh: '按顺序', en: 'In order' },
'损坏': { zh: '损坏', en: 'Corrupted' },
'换成你的路由器地址即可。': { zh: '换成你的路由器地址即可。', en: 'just replace it with your router address.' },
'换机还原后,这些内容需要在新机器上重新生成': { zh: '换机还原后,这些内容需要在新机器上重新生成', en: 'After restoring on another machine, these items need to be regenerated on the new machine' },
'换算, 跨零点的时间段会自动拆成两段写入内核。': { zh: '换算, 跨零点的时间段会自动拆成两段写入内核。', en: 'After conversion, a period that crosses midnight is automatically split into two segments written into the kernel.' },
'授权码 / 密码': { zh: '授权码 / 密码', en: 'Authorisation code / password' },
'掉线 / 磁盘满 / 温度高主动推送:Bark · 邮件 · 群机器人,带冷却与免打扰': { zh: '掉线 / 磁盘满 / 温度高主动推送:Bark · 邮件 · 群机器人,带冷却与免打扰', en: 'Push alerts on disconnection / full disk / high temperature: Bark · email · bot webhooks, with cooldown and do-not-disturb' },
'排查:ls -l /dev/ptmx 修复:ln -sf pts/ptmx /dev/ptmx': { zh: '排查:ls -l /dev/ptmx 修复:ln -sf pts/ptmx /dev/ptmx', en: 'Check: ls -l /dev/ptmx Fix: ln -sf pts/ptmx /dev/ptmx' },
'探测项': { zh: '探测项', en: 'Probe item' },
'接上外网': { zh: '接上外网', en: 'Connect to the Internet' },
'接下来该怎么做': { zh: '接下来该怎么做', en: 'What to do next' },
'接入、': { zh: '接入、', en: 'access,' },
'接入方式': { zh: '接入方式', en: 'Connection Method' },
'接入方式实时状态与日志': { zh: '接入方式实时状态与日志', en: 'Access Method Live Status and Logs' },
'接受任务': { zh: '接受任务', en: 'Accept Task' },
'接口': { zh: '接口', en: 'Interfaces' },
'接口名': { zh: '接口名', en: 'Interface name' },
'接口(逗号分隔)': { zh: '接口(逗号分隔)', en: 'interface (comma-separated)' },
'接口,跨平台、跨语言、跨框架: 任意支持': { zh: '接口,跨平台、跨语言、跨框架: 任意支持', en: 'interface, cross-platform, cross-language, cross-framework: any supported' },
'接口,配独立的源地址策略路由': { zh: '接口,配独立的源地址策略路由', en: 'interface, with its own source-address policy routing' },
'接宽带的网卡': { zh: '接宽带的网卡', en: 'The NIC connected to the broadband line' },
'控制台': { zh: '控制台', en: 'Console' },
'控制台管理员:': { zh: '控制台管理员:', en: 'Console administrator:' },
'推荐(recommend)': { zh: '推荐(recommend)', en: 'Recommended (recommend)' },
'推送': { zh: '推送', en: 'Push' },
'推送地址 / Key': { zh: '推送地址 / Key', en: 'Push URL / key' },
'掩码': { zh: '掩码', en: 'Mask' },
'掩码长度': { zh: '掩码长度', en: 'Mask Length' },
'描述': { zh: '描述', en: 'Description' },
'描述(兼容老旧设备)': { zh: '描述(兼容老旧设备)', en: 'Description (compatible with legacy devices)' },
'提供': { zh: '提供', en: 'Provide' },
'提供统一的': { zh: '提供统一的', en: 'Provide a unified' },
'提示': { zh: '提示', en: 'Info' },
'提示:': { zh: '提示:', en: 'Note:' },
'提示:勾选「强制」会使用': { zh: '提示:勾选「强制」会使用', en: 'Tip: checking "Force" will use' },
'提示:这是': { zh: '提示:这是', en: 'Note: this is' },
'提示:这里勾了「立即检测」会绕过冷却期强制推送, 用来验证通道是否真的通。日常检测不需要这么做。': { zh: '提示:这里勾了「立即检测」会绕过冷却期强制推送, 用来验证通道是否真的通。日常检测不需要这么做。', en: 'Note: checking "Check now" here bypasses the cooldown period and forces a push, which is used to verify whether the channel really works. Routine checks do not need this.' },
'插上的外置盘会列在下面。可直接挂载、格式化、设为开机自动挂载, 并把挂载点一键加入上面的': { zh: '插上的外置盘会列在下面。可直接挂载、格式化、设为开机自动挂载, 并把挂载点一键加入上面的', en: 'Plugged-in external drives are listed below. You can mount them directly, format them, set them to mount automatically at boot, and add the mount point to the ones above with one click' },
'插任一口皆可访问救援页': { zh: '插任一口皆可访问救援页', en: 'Plug into any port to access the rescue page' },
'握手': { zh: '握手', en: 'Handshake' },
'握手失败': { zh: '握手失败', en: 'Handshake Failed' },
'握手时间是很久以前(比如几个月前)说明这台设备很久没连了, 或者配置已经失效。': { zh: '握手时间是很久以前(比如几个月前)说明这台设备很久没连了, 或者配置已经失效。', en: 'If the last handshake was a long time ago (for example several months ago), this device has not connected for a long time, or the configuration is no longer valid.' },
'搜索名称': { zh: '搜索名称', en: 'Search name' },
'操作': { zh: '操作', en: 'Actions' },
'操作与服务': { zh: '操作与服务', en: 'Actions and services' },
'操作失败': { zh: '操作失败', en: 'Operation failed' },
'操作完成': { zh: '操作完成', en: 'Operation finished' },
'操作审计': { zh: '操作审计', en: 'Action audit' },
'支持': { zh: '支持', en: 'Support' },
'支持上传(': { zh: '支持上传(', en: 'upload supported (' },
'支持中国大陆家庭宽带全部主流接入方式,日志每': { zh: '支持中国大陆家庭宽带全部主流接入方式,日志每', en: 'Supports all mainstream access methods for mainland China home broadband, the log every' },
'支持钉钉 / 企业微信 / 飞书,按地址自动选报文格式': { zh: '支持钉钉 / 企业微信 / 飞书,按地址自动选报文格式', en: 'Supports DingTalk / WeCom / Lark; the message format is chosen automatically from the URL' },
'收件人': { zh: '收件人', en: 'Recipient' },
'改了什么都不生效)。': { zh: '改了什么都不生效)。', en: 'nothing takes effect no matter what you change).' },
'改动后请点击「保存并应用」': { zh: '改动后请点击「保存并应用」', en: 'Changed — click "Save & Apply" to make it take effect' },
'改完必须': { zh: '改完必须', en: 'after making the change you must' },
'改密码': { zh: '改密码', en: 'Change password' },
'改监听地址或端口会重建': { zh: '改监听地址或端口会重建', en: 'changing the listen address or port rebuilds' },
'放行': { zh: '放行', en: 'Allow' },
'放行已建立连接(务必保留)': { zh: '放行已建立连接(务必保留)', en: 'Allow established connections (must be kept)' },
'放行本机回环': { zh: '放行本机回环', en: 'Allow local loopback' },
'放进包里(默认不导出敏感项):': { zh: '放进包里(默认不导出敏感项):', en: 'Include in the package (sensitive items are not exported by default):' },
'放通': { zh: '放通', en: 'Allow through' },
'敏感': { zh: '敏感', en: 'Sensitive' },
'敏感排除': { zh: '敏感排除', en: 'Sensitive exclusion' },
'救援地址(虚拟': { zh: '救援地址(虚拟', en: 'rescue address (virtual' },
'救援端口': { zh: '救援端口', en: 'Rescue Port' },
'数字': { zh: '数字', en: 'Number' },
'数据卷(': { zh: '数据卷(', en: 'volume (' },
'数据库中,应用时写入': { zh: '数据库中,应用时写入', en: 'in the database, written when applied' },
'数据来源是「连接与流日志」里的连接跟踪事件, 由后台每': { zh: '数据来源是「连接与流日志」里的连接跟踪事件, 由后台每', en: 'The data comes from connection tracking events in "Connections and Flow Logs", collected by the backend every' },
'数据来自 ': { zh: '数据来自 ', en: 'Data from ' },
'数据来自内核日志中带': { zh: '数据来自内核日志中带', en: 'data comes from kernel log lines carrying' },
'数据目录': { zh: '数据目录', en: 'Data directory' },
'数据维护': { zh: '数据维护', en: 'Data maintenance' },
'整个过程': { zh: '整个过程', en: 'the whole process' },
'整体判定': { zh: '整体判定', en: 'Overall verdict' },
'整体覆盖全部用户设置': { zh: '整体覆盖全部用户设置', en: 'Overwrite All User Settings' },
'文件': { zh: '文件', en: 'File' },
'文件。': { zh: '文件。', en: 'file.' },
'文件」把二进制或': { zh: '文件」把二进制或', en: 'file" converts binary or' },
'文件会照常保存到': { zh: '文件会照常保存到', en: 'Files will still be saved to' },
'文件共享': { zh: '文件共享', en: 'File Sharing' },
'文件共享 SMB/NFS': { zh: '文件共享 SMB/NFS', en: 'File Sharing (SMB/NFS)' },
'文件名': { zh: '文件名', en: 'File Name' },
'文件夹名称': { zh: '文件夹名称', en: 'Folder name' },
'文件完整性仍会按官方 SHA256 校验</span>': { zh: '文件完整性仍会按官方 SHA256 校验</span>', en: 'integrity is still verified against the official SHA256.</span>' },
'文件数': { zh: '文件数', en: 'Number of files' },
'文件是否存在': { zh: '文件是否存在', en: 'whether the file exists' },
'文件管理器': { zh: '文件管理器', en: 'File manager' },
'文件系统': { zh: '文件系统', en: 'Filesystem' },
'文件读取失败': { zh: '文件读取失败', en: 'Failed to read the file' },
'文件读取失败:': { zh: '文件读取失败:', en: 'Failed to read the file: ' },
'文件过大(': { zh: '文件过大(', en: 'File too large (' },
'文件预览': { zh: '文件预览', en: 'File preview' },
'文件(本地解析,不联网、不执行命令)。支持多行续行、引号、新版空格写法。': { zh: '文件(本地解析,不联网、不执行命令)。支持多行续行、引号、新版空格写法。', en: 'file (parsed locally, no network access, no command execution). Supports multi-line continuations, quotes, and the new space-separated syntax.' },
'断开': { zh: '断开', en: 'Disconnect' },
'断开 PPPoE 拨号': { zh: '断开 PPPoE 拨号', en: 'Disconnect PPPoE' },
'断开全部会话': { zh: '断开全部会话', en: 'Disconnect all sessions' },
'断开拨号(': { zh: '断开拨号(', en: 'disconnect the dial-up (' },
'断线自动重连(': { zh: '断线自动重连(', en: 'automatic reconnect after disconnection (' },
'新名称': { zh: '新名称', en: 'New name' },
'新增': { zh: '新增', en: 'Add' },
'新增一条转发': { zh: '新增一条转发', en: 'Add a forwarding entry' },
'新增共享': { zh: '新增共享', en: 'Add share' },
'新增导出': { zh: '新增导出', en: 'Add export' },
'新增时间组': { zh: '新增时间组', en: 'Add a time group' },
'新增规则': { zh: '新增规则', en: 'Add a rule' },
'新增设备组': { zh: '新增设备组', en: 'Add a device group' },
'新密码': { zh: '新密码', en: 'New password' },
'新密码(至少': { zh: '新密码(至少', en: 'New password (at least' },
'新建': { zh: '新建', en: 'Create' },
'新建主题': { zh: '新建主题', en: 'New Theme' },
'新建文件夹': { zh: '新建文件夹', en: 'New folder' },
'新建系统用户': { zh: '新建系统用户', en: 'New system user' },
'新手向导': { zh: '新手向导', en: 'Setup Wizard' },
'新端口': { zh: '新端口', en: 'New Port' },
'方向': { zh: '方向', en: 'Direction' },
'无': { zh: '无', en: 'None' },
'无公网前缀时回退使用 fe80:: 链路本地地址': { zh: '无公网前缀时回退使用 fe80:: 链路本地地址', en: 'Fall back to a fe80:: link-local address when there is no public prefix' },
'无应答': { zh: '无应答', en: 'No Response' },
'无数据': { zh: '无数据', en: 'No data' },
'无法启动服务。点下面的按钮自动安装。</div>': { zh: '无法启动服务。点下面的按钮自动安装。</div>', en: 'The service cannot start. Click the button below to install it automatically.</div>' },
'无法恢复': { zh: '无法恢复', en: 'Cannot be recovered' },
'无法检测新版本': { zh: '无法检测新版本', en: 'Cannot check for a new version' },
'无法获取预览': { zh: '无法获取预览', en: 'Unable to Get Preview' },
'无法解析路由器管理服务的地址,请确认 IP 或域名是否正确': { zh: '无法解析路由器管理服务的地址,请确认 IP 或域名是否正确', en: 'Cannot resolve the admin service address; check the IP or domain name' },
'无法诊断 WireGuard 环境(缺少内核模块 / 工具的分项检测)。': { zh: '无法诊断 WireGuard 环境(缺少内核模块 / 工具的分项检测)。', en: 'Cannot diagnose the WireGuard environment (per-item checks for a missing kernel module and missing tools).' },
'无法读取 Docker 状态': { zh: '无法读取 Docker 状态', en: 'Unable to Read Docker Status' },
'无法读取文件共享配置': { zh: '无法读取文件共享配置', en: 'Unable to Read File Sharing Configuration' },
'无法读取目录': { zh: '无法读取目录', en: 'Unable to Read Directory' },
'无法读取访问控制配置': { zh: '无法读取访问控制配置', en: 'Unable to Read Access Control Configuration' },
'无法连接到路由器管理服务': { zh: '无法连接到路由器管理服务', en: 'Cannot connect to the admin service' },
'无法连接到路由器管理服务,请确认地址可达、服务未停止': { zh: '无法连接到路由器管理服务,请确认地址可达、服务未停止', en: 'Cannot connect to the admin service; check that the address is reachable and the service is still running' },
'无法预览': { zh: '无法预览', en: 'Cannot preview' },
'无租约': { zh: '无租约', en: 'No Leases' },
'无线': { zh: '无线', en: 'Wireless' },
'无论走哪个源都会按官方': { zh: '无论走哪个源都会按官方', en: 'No matter which source is used, it follows the official' },
'无限)': { zh: '无限)', en: 'unlimited)' },
'无需清理': { zh: '无需清理', en: 'No cleanup needed' },
'无(需额外驱动)': { zh: '无(需额外驱动)', en: 'none (extra driver required)' },
'日': { zh: '日', en: 'day' },
'日 星期一': { zh: '日 星期一', en: 'Mon' },
'日志': { zh: '日志', en: 'Logs' },
'日志、快照、流日志 全都齐全,但没有任何东西会在你睡觉或出门的时候告诉你「家里断网了」。 断': { zh: '日志、快照、流日志 全都齐全,但没有任何东西会在你睡觉或出门的时候告诉你「家里断网了」。 断', en: 'Logs, snapshots, and flow logs are all complete, but nothing tells you "the Internet is down at home" while you are asleep or away. Dis' },
'日志与审计': { zh: '日志与审计', en: 'Logs & Audit' },
'日志已复制': { zh: '日志已复制', en: 'Log copied' },
'日志开关已关闭': { zh: '日志开关已关闭', en: 'Logging is disabled' },
'日志开关已开启': { zh: '日志开关已开启', en: 'Logging is enabled' },
'日志明细': { zh: '日志明细', en: 'Log details' },
'日志明细(': { zh: '日志明细(', en: 'Log details (' },
'日志查看': { zh: '日志查看', en: 'Log Viewer' },
'日志源': { zh: '日志源', en: 'Log Source' },
'日志滚动与其他': { zh: '日志滚动与其他', en: 'log rotation and other' },
'日志限速(包': { zh: '日志限速(包', en: 'Log rate limit (packets' },
'旧版': { zh: '旧版', en: 'Legacy' },
'时保住容器)': { zh: '时保住容器)', en: 'to keep containers alive)' },
'时用这个)': { zh: '时用这个)', en: 'use this)' },
'时看到的就是这张。 默认是一张自签证书': { zh: '时看到的就是这张。 默认是一张自签证书', en: 'what you see at that moment. By default it is a self-signed certificate' },
'时间': { zh: '时间', en: 'Time' },
'时间偏移': { zh: '时间偏移', en: 'Time offset' },
'时间同步': { zh: '时间同步', en: 'Time synchronization' },
'时间服务器': { zh: '时间服务器', en: 'Time server' },
'时间组': { zh: '时间组', en: 'Time group' },
'时间范围': { zh: '时间范围', en: 'Time Range' },
'时(网络风暴、': { zh: '时(网络风暴、', en: 'time (network storms,' },
'时:重启': { zh: '时:重启', en: 'at: restart' },
'明文': { zh: '明文', en: 'Plaintext' },
'星期一': { zh: '星期一', en: 'Monday' },
'星期三': { zh: '星期三', en: 'Wednesday' },
'星期二': { zh: '星期二', en: 'Tuesday' },
'星期五': { zh: '星期五', en: 'Friday' },
'星期六': { zh: '星期六', en: 'Saturday' },
'星期四': { zh: '星期四', en: 'Thursday' },
'星期日': { zh: '星期日', en: 'Sunday' },
'春分': { zh: '春分', en: 'Spring Equinox' },
'是': { zh: '是', en: 'Yes' },
'是 Linux': { zh: '是 Linux', en: 'Is Linux' },
'是「发证机构」。建好之后,你签的每一张证书都属于同一个信任体系': { zh: '是「发证机构」。建好之后,你签的每一张证书都属于同一个信任体系', en: 'is the "certificate authority". Once it is created, every certificate you sign belongs to the same trust hierarchy' },
'是一条完全独立于': { zh: '是一条完全独立于', en: 'is a completely independent' },
'是不是': { zh: '是不是', en: 'whether it is' },
'是否取得公网': { zh: '是否取得公网', en: 'whether a public address is obtained' },
'是否在运行': { zh: '是否在运行', en: 'whether it is running' },
'是新一代的网络地址。国内宽带基本都支持了。': { zh: '是新一代的网络地址。国内宽带基本都支持了。', en: 'is the next-generation network address. Basically all domestic broadband supports it now.' },
'是正常应答。': { zh: '是正常应答。', en: 'is a normal response.' },
'是直连路由,通常无需': { zh: '是直连路由,通常无需', en: 'is a direct route and usually needs no' },
'是阿里云的,国内速度快、出错少, 不知道选哪个就用它。填两个地址的作用是一个不通时自动换另一个。': { zh: '是阿里云的,国内速度快、出错少, 不知道选哪个就用它。填两个地址的作用是一个不通时自动换另一个。', en: 'is Alibaba Cloud\'s, which is fast in China and rarely fails; if you do not know which one to pick, use it. Entering two addresses means the other one is switched to automatically when the first is unreachable.' },
'是(': { zh: '是(', en: 'Yes (' },
'是(推荐)': { zh: '是(推荐)', en: 'Yes (recommended)' },
'显示': { zh: '显示', en: 'Show' },
'智能模式会被': { zh: '智能模式会被', en: 'smart mode will be' },
'智能限速': { zh: '智能限速', en: 'Smart rate limiting' },
'智能限速 QoS': { zh: '智能限速 QoS', en: 'Smart QoS' },
'智能限速与流量整形(CAKE / HTB)': { zh: '智能限速与流量整形(CAKE / HTB)', en: 'Smart Rate Limiting & Traffic Shaping (CAKE / HTB)' },
'暂停': { zh: '暂停', en: 'Pause' },
'暂停自动刷新': { zh: '暂停自动刷新', en: 'Pause Auto Refresh' },
'暂无 NFS 导出目录,点下面「新增导出」。': { zh: '暂无 NFS 导出目录,点下面「新增导出」。', en: 'No NFS export directories yet; click "Add export" below.' },
'暂无 VLAN 配置。': { zh: '暂无 VLAN 配置。', en: 'No VLAN configuration yet.' },
'暂无保存的设备。': { zh: '暂无保存的设备。', en: 'No saved devices yet.' },
'暂无共享目录,点下面「新增共享」或「套用目录模板」。': { zh: '暂无共享目录,点下面「新增共享」或「套用目录模板」。', en: 'No shared directories yet; click "Add share" or "Apply directory template" below.' },
'暂无可记录的前缀(运营商可能未下发公网 IPv6)。': { zh: '暂无可记录的前缀(运营商可能未下发公网 IPv6)。', en: 'No prefixes to record yet (the ISP may not have assigned a public IPv6).' },
'暂无审计记录。': { zh: '暂无审计记录。', en: 'No audit records yet.' },
'暂无快照。可在上方「配置快照与回滚」里立即创建一份,或等自动快照按计划生成。': { zh: '暂无快照。可在上方「配置快照与回滚」里立即创建一份,或等自动快照按计划生成。', en: 'No snapshots yet. You can create one now under "Configure Snapshots and Rollback" above, or wait for the automatic snapshot to be generated as scheduled.' },
'暂无数据': { zh: '暂无数据', en: 'No data yet' },
'暂无数据卷': { zh: '暂无数据卷', en: 'No data volumes yet' },
'暂无日志。': { zh: '暂无日志。', en: 'No logs yet.' },
'暂无日志记录。': { zh: '暂无日志记录。', en: 'No log records yet.' },
'暂无时间组,点击右上角「新增时间组」或直接点上面的模板。': { zh: '暂无时间组,点击右上角「新增时间组」或直接点上面的模板。', en: 'No time groups yet; click "Add time group" in the top-right corner, or click one of the templates above.' },
'暂无租约记录(DHCP 服务未启动或尚无客户端)。': { zh: '暂无租约记录(DHCP 服务未启动或尚无客户端)。', en: 'No lease records yet (the DHCP service is not running or there are no clients).' },
'暂无网络': { zh: '暂无网络', en: 'No networks yet' },
'暂无规则,点击下方「新增一条转发」开始添加。': { zh: '暂无规则,点击下方「新增一条转发」开始添加。', en: 'No rules yet; click "Add a forward rule" below to start adding.' },
'暂无规则,点击右上角「新增规则」开始。': { zh: '暂无规则,点击右上角「新增规则」开始。', en: 'No rules yet; click "Add rule" in the top-right corner to start.' },
'暂无记录': { zh: '暂无记录', en: 'No records yet' },
'暂无设备组,点击右上角「新增设备组」开始。': { zh: '暂无设备组,点击右上角「新增设备组」开始。', en: 'No device groups yet; click "Add device group" in the top-right corner to start.' },
'暂无说明(后端未返回影响清单)。': { zh: '暂无说明(后端未返回影响清单)。', en: 'No description (the backend did not return an impact list).' },
'暂无镜像。': { zh: '暂无镜像。', en: 'No images yet.' },
'暂未检测到 PD(需运营商支持)': { zh: '暂未检测到 PD(需运营商支持)', en: 'No PD detected yet (requires ISP support)' },
'更新': { zh: '更新', en: 'Update' },
'更新 通常是前几名。': { zh: '更新 通常是前几名。', en: 'updates are usually the top entries.' },
'更新中,可能需要 1-2 分钟…': { zh: '更新中,可能需要 1-2 分钟…', en: 'Updating, this may take 1-2 minutes…' },
'更新到 ': { zh: '更新到 ', en: 'Update to ' },
'更新前会做什么': { zh: '更新前会做什么', en: 'What happens before the update' },
'更新时间': { zh: '更新时间', en: 'Update time' },
'更新规则库': { zh: '更新规则库', en: 'Update rule database' },
'更新软件源索引': { zh: '更新软件源索引', en: 'Update package index' },
'最低': { zh: '最低', en: 'Minimum' },
'最低级别': { zh: '最低级别', en: 'Minimum Level' },
'最多': { zh: '最多', en: 'Maximum' },
'最多保留': { zh: '最多保留', en: 'Keep at most' },
'最多保留份数(': { zh: '最多保留份数(', en: 'Maximum number of copies to keep (' },
'最大失败次数(': { zh: '最大失败次数(', en: 'Maximum number of failures (' },
'最大条数': { zh: '最大条数', en: 'Max Entries' },
'最大通告间隔(秒)': { zh: '最大通告间隔(秒)', en: 'Maximum Advertisement Interval (seconds)' },
'最小通告间隔(秒)': { zh: '最小通告间隔(秒)', en: 'Minimum Advertisement Interval (seconds)' },
'最强」排列。选一个生成命令,复制到': { zh: '最强」排列。选一个生成命令,复制到', en: 'strongest" order. Pick one to generate the command and copy it to' },
'最新': { zh: '最新', en: 'Latest' },
'最新」按钮一键回到底部。 清屏只清本地显示,会话和正在跑的程序都不受影响。': { zh: '最新」按钮一键回到底部。 清屏只清本地显示,会话和正在跑的程序都不受影响。', en: 'latest" button to jump back to the bottom in one click. Clearing the screen only clears the local display; sessions and running programs are unaffected.' },
'最满的磁盘': { zh: '最满的磁盘', en: 'Fullest disk' },
'最理想的出口类型': { zh: '最理想的出口类型', en: 'Ideal egress type' },
'最省资源:把 USB 打印机原样映射成 TCP 9100,驱动全在客户端': { zh: '最省资源:把 USB 打印机原样映射成 TCP 9100,驱动全在客户端', en: 'Most resource-efficient: map the USB printer as-is to TCP 9100, with all drivers on the client' },
'最稳妥。': { zh: '最稳妥。', en: 'the safest option.' },
'最终写入': { zh: '最终写入', en: 'finally written to' },
'最近': { zh: '最近', en: 'Most recent' },
'最近 1 天': { zh: '最近 1 天', en: 'Last 1 day' },
'最近 12 小时': { zh: '最近 12 小时', en: 'Last 12 hours' },
'最近 2 小时': { zh: '最近 2 小时', en: 'Last 2 hours' },
'最近 30 分钟': { zh: '最近 30 分钟', en: 'Last 30 minutes' },
'最近 5 分钟': { zh: '最近 5 分钟', en: 'Last 5 minutes' },
'最近 7 天': { zh: '最近 7 天', en: 'Last 7 days' },
'最近一次探测:': { zh: '最近一次探测:', en: 'Last probe:' },
'最近一次:': { zh: '最近一次:', en: 'Last:' },
'最近握手': { zh: '最近握手', en: 'Last handshake' },
'最高': { zh: '最高', en: 'Highest' },
'月': { zh: '月', en: 'month' },
'月租': { zh: '月租', en: 'Monthly fee' },
'有': { zh: '有', en: 'Yes' },
'有可用更新': { zh: '有可用更新', en: 'Update available' },
'有意': { zh: '有意', en: 'Intentional' },
'有排队空间,抗延迟效果最好。': { zh: '有排队空间,抗延迟效果最好。', en: 'has queuing space and gives the best resistance to latency.' },
'有效期': { zh: '有效期', en: 'Validity' },
'有效期未知': { zh: '有效期未知', en: 'Validity Unknown' },
'有效期至': { zh: '有效期至', en: 'Valid Until' },
'有效期(天)': { zh: '有效期(天)', en: 'Validity (days)' },
'有状态': { zh: '有状态', en: 'Stateful' },
'有问题': { zh: '有问题', en: 'Problem' },
'服务': { zh: '服务', en: 'Services' },
'服务」页面自行指定。': { zh: '服务」页面自行指定。', en: 'service" page.' },
'服务会启动并占用': { zh: '服务会启动并占用', en: 'the service will start and occupy' },
'服务会由 drouter 直接管理接口,功能可用,但不能用 ': { zh: '服务会由 drouter 直接管理接口,功能可用,但不能用 ', en: 'drouter manages the interface directly, so it works, but it cannot use ' },
'服务名': { zh: '服务名', en: 'Service name' },
'服务名(可留空自动取)': { zh: '服务名(可留空自动取)', en: 'Service name (may be left empty to auto-detect)' },
'服务名(可留空)': { zh: '服务名(可留空)', en: 'Service Name (can be left empty)' },
'服务商': { zh: '服务商', en: 'Provider' },
'服务商与接入方式': { zh: '服务商与接入方式', en: 'Provider and access method' },
'服务器': { zh: '服务器', en: 'Server' },
'服务器。': { zh: '服务器。', en: 'server.' },
'服务器描述': { zh: '服务器描述', en: 'Server Description' },
'服务器自动探测当前出口的': { zh: '服务器自动探测当前出口的', en: 'The server automatically detects the current egress' },
'服务器获取': { zh: '服务器获取', en: 'Server fetch' },
'服务器证书': { zh: '服务器证书', en: 'Server Certificate' },
'服务器:': { zh: '服务器:', en: 'Server:' },
'服务地址:': { zh: '服务地址:', en: 'Service address:' },
'服务开关': { zh: '服务开关', en: 'Service switch' },
'服务未启动,暂无连接信息。': { zh: '服务未启动,暂无连接信息。', en: 'The service is not started; no connection information available.' },
'服务未运行': { zh: '服务未运行', en: 'Service not running' },
'服务状态': { zh: '服务状态', en: 'Service status' },
'服务端': { zh: '服务端', en: 'Server side' },
'服务端已放开跨域,浏览器端也可直接调用': { zh: '服务端已放开跨域,浏览器端也可直接调用', en: 'CORS is already enabled on the server side, so the browser can call it directly as well' },
'服务端设置': { zh: '服务端设置', en: 'Server settings' },
'服务端配置(只读)': { zh: '服务端配置(只读)', en: 'Server configuration (read-only)' },
'服务线程数': { zh: '服务线程数', en: 'Service Threads' },
'服务运行中': { zh: '服务运行中', en: 'Service running' },
'服务运行中,当前没有任何端口映射。': { zh: '服务运行中,当前没有任何端口映射。', en: 'Service running; there are currently no port mappings.' },
'服务返回的不是合法 JSON(HTTP ': { zh: '服务返回的不是合法 JSON(HTTP ', en: 'The service returned invalid JSON (HTTP ' },
'未': { zh: '未', en: 'Not' },
'未共享': { zh: '未共享', en: 'Not Shared' },
'未写入': { zh: '未写入', en: 'Not Written' },
'未分配': { zh: '未分配', en: 'Unassigned' },
'未创建': { zh: '未创建', en: 'Not Created' },
'未加载': { zh: '未加载', en: 'Not loaded' },
'未包含': { zh: '未包含', en: 'Not Included' },
'未同步': { zh: '未同步', en: 'Not Synced' },
'未启动': { zh: '未启动', en: 'Not started' },
'未启用': { zh: '未启用', en: 'Not enabled' },
'未启用(打开上方开关后生效)': { zh: '未启用(打开上方开关后生效)', en: 'Not Enabled (takes effect after turning on the switch above)' },
'未启用(限速动作不生效)': { zh: '未启用(限速动作不生效)', en: 'Not Enabled (rate-limit actions do not take effect)' },
'未安装': { zh: '未安装', en: 'Not installed' },
'未安装(应用识别不可用)': { zh: '未安装(应用识别不可用)', en: 'Not Installed (app identification unavailable)' },
'未完成:': { zh: '未完成:', en: 'Incomplete:' },
'未应用主题': { zh: '未应用主题', en: 'No Theme Applied' },
'未开启': { zh: '未开启', en: 'Not enabled' },
'未挂载': { zh: '未挂载', en: 'Not mounted' },
'未指定': { zh: '未指定', en: 'Unspecified' },
'未格式化': { zh: '未格式化', en: 'Unformatted' },
'未检测': { zh: '未检测', en: 'Not checked' },
'未检测到外置设备。插上 U 盘或移动硬盘后点「刷新」。': { zh: '未检测到外置设备。插上 U 盘或移动硬盘后点「刷新」。', en: 'No external device detected. Plug in a USB flash drive or external hard drive, then click "Refresh".' },
'未检测到物理网卡': { zh: '未检测到物理网卡', en: 'No physical NIC detected' },
'未测': { zh: '未测', en: 'Not Tested' },
'未生成任何文件': { zh: '未生成任何文件', en: 'No files generated' },
'未生效(内核未加载 tcp_bbr)': { zh: '未生效(内核未加载 tcp_bbr)', en: 'Not in effect (kernel has not loaded tcp_bbr)' },
'未监听': { zh: '未监听', en: 'Not Listening' },
'未知': { zh: '未知', en: 'Unknown' },
'未知状态': { zh: '未知状态', en: 'Unknown state' },
'未知错误': { zh: '未知错误', en: 'Unknown error' },
'未署名': { zh: '未署名', en: 'Unsigned' },
'未能拉起': { zh: '未能拉起', en: 'Failed to Start' },
'未能获取附件列表': { zh: '未能获取附件列表', en: 'Failed to get the attachment list' },
'未能读取主题列表,请确认后端服务正常后重试。': { zh: '未能读取主题列表,请确认后端服务正常后重试。', en: 'Failed to read the theme list. Please make sure the backend service is running and try again.' },
'未获取': { zh: '未获取', en: 'Not Obtained' },
'未获取公网地址': { zh: '未获取公网地址', en: 'No public address obtained' },
'未获取到公网映射信息': { zh: '未获取到公网映射信息', en: 'No public mapping information obtained' },
'未获取(运营商可能未下发 PD)': { zh: '未获取(运营商可能未下发 PD)', en: 'Not obtained (the ISP may not have delegated a PD)' },
'未落盘': { zh: '未落盘', en: 'Not Written to Disk' },
'未覆盖': { zh: '未覆盖', en: 'not covered' },
'未设置': { zh: '未设置', en: 'Not Set' },
'未识别': { zh: '未识别', en: 'Unrecognized' },
'未读取到温度传感器,仅显示进程数': { zh: '未读取到温度传感器,仅显示进程数', en: 'No temperature sensor found; only the process count is shown' },
'未运行': { zh: '未运行', en: 'Not Running' },
'未连接': { zh: '未连接', en: 'Not connected' },
'未连接 —— 点击上方「连接」开始。': { zh: '未连接 —— 点击上方「连接」开始。', en: 'Not connected — click "Connect" above to start.' },
'未选择应用分类 → 该规则匹配': { zh: '未选择应用分类 → 该规则匹配', en: 'No application category selected → this rule matches' },
'未配置开机自启': { zh: '未配置开机自启', en: 'Not configured to start on boot' },
'本地域名': { zh: '本地域名', en: 'Local domain' },
'本方案': { zh: '本方案', en: 'This scheme' },
'本月合计': { zh: '本月合计', en: 'This month\'s total' },
'本月已用': { zh: '本月已用', en: 'Used this month' },
'本月用量排行': { zh: '本月用量排行', en: 'Monthly usage ranking' },
'本月费用': { zh: '本月费用', en: 'This month\'s cost' },
'本机': { zh: '本机', en: 'Local machine' },
'本机充当': { zh: '本机充当', en: 'the local machine acts as' },
'本机内核': { zh: '本机内核', en: 'Local kernel' },
'本机内网地址': { zh: '本机内网地址', en: 'Local LAN address' },
'本机内网地址是': { zh: '本机内网地址是', en: 'The local LAN address is' },
'本机内网网段': { zh: '本机内网网段', en: 'Local LAN subnet' },
'本机出口地址': { zh: '本机出口地址', en: 'Local egress address' },
'本机名称': { zh: '本机名称', en: 'Host name' },
'本机地址': { zh: '本机地址', en: 'Local address' },
'本机当前不转发流量,通常是还没接管路由': { zh: '本机当前不转发流量,通常是还没接管路由', en: 'This machine is not forwarding traffic right now; usually this means it has not taken over routing yet' },
'本机现状': { zh: '本机现状', en: 'Current local status' },
'本机终端,不是': { zh: '本机终端,不是', en: 'a terminal on this machine, not' },
'本机缓存服务(dnsmasq)': { zh: '本机缓存服务(dnsmasq)', en: 'Local Cache Service (dnsmasq)' },
'本次将打包': { zh: '本次将打包', en: 'This run will package' },
'本次成功通信的服务器:': { zh: '本次成功通信的服务器:', en: 'Servers that communicated successfully this time:' },
'本端地址': { zh: '本端地址', en: 'Local end address' },
'本页有未保存的改动,已为你保留,记得「保存并应用」': { zh: '本页有未保存的改动,已为你保留,记得「保存并应用」', en: 'This page has unsaved changes; they are kept. Remember to click "Save & Apply".' },
'本项目不会接管': { zh: '本项目不会接管', en: 'This project does not take over' },
'机顶盒接入': { zh: '机顶盒接入', en: 'Set-top box access' },
'机顶盒通常通过': { zh: '机顶盒通常通过', en: 'A set-top box usually connects through' },
'权重': { zh: '权重', en: 'Weight' },
'权限': { zh: '权限', en: 'Permissions' },
'权限等同物理控制台, 开启与输入都会写审计日志,闲置': { zh: '权限等同物理控制台, 开启与输入都会写审计日志,闲置', en: 'Permissions are equivalent to a physical console; both enabling and input are written to the audit log, so an idle' },
'条': { zh: '条', en: '' }, // i18n-en-empty(英文不需要量词:3 个 → 3)
'条数': { zh: '条数', en: 'Count' },
'条确认账号能正常拨通,再逐步增加会话数。': { zh: '条确认账号能正常拨通,再逐步增加会话数。', en: 'entries to confirm the account can dial up normally, then increase the session count step by step.' },
'条记录, 文件名': { zh: '条记录, 文件名', en: 'records; the file name' },
'条,多余会话会反复重拨并显示为「未连接」,这是运营商的限制,不是程序故障。 建议先用': { zh: '条,多余会话会反复重拨并显示为「未连接」,这是运营商的限制,不是程序故障。 建议先用', en: 'sessions; extra sessions will keep redialing and be shown as "Not connected" — this is a limitation of the ISP, not a program fault. It is recommended to start with' },
'来源': { zh: '来源', en: 'Source' },
'来源地址': { zh: '来源地址', en: 'source address' },
'来源机器': { zh: '来源机器', en: 'Source machine' },
'来源:': { zh: '来源:', en: 'Source:' },
'来自内核': { zh: '来自内核', en: 'from the kernel' },
'构建保护模式': { zh: '构建保护模式', en: 'Build protection mode' },
'构建保护模式已开启': { zh: '构建保护模式已开启', en: 'Build protection mode is on' },
'构建保护模式:': { zh: '构建保护模式:', en: 'Build Protection Mode:' },
'查看原因': { zh: '查看原因', en: 'See why' },
'查看完整清单(': { zh: '查看完整清单(', en: 'View the full manifest (' },
'查看快照列表': { zh: '查看快照列表', en: 'View Snapshot List' },
'查看打印任务': { zh: '查看打印任务', en: 'View Print Jobs' },
'查看接口描述(': { zh: '查看接口描述(', en: 'View the interface description (' },
'查看日志': { zh: '查看日志', en: 'View logs' },
'查看更新内容并升级': { zh: '查看更新内容并升级', en: 'Show release notes & upgrade' },
'查看服务日志': { zh: '查看服务日志', en: 'View service log' },
'查看版本发布说明': { zh: '查看版本发布说明', en: 'Show release notes' },
'查看状态': { zh: '查看状态', en: 'View status' },
'查看状态。': { zh: '查看状态。', en: 'View status.' },
'查看系统当前': { zh: '查看系统当前', en: 'View the system\'s current' },
'查看系统当前生效规则': { zh: '查看系统当前生效规则', en: 'View Currently Effective System Rules' },
'查看系统日志': { zh: '查看系统日志', en: 'View system logs' },
'查看被排除的': { zh: '查看被排除的', en: 'View Excluded' },
'查询': { zh: '查询', en: 'Query' },
'查询中…': { zh: '查询中…', en: 'Querying…' },
'查询失败': { zh: '查询失败', en: 'Query failed' },
'查询拨号状态': { zh: '查询拨号状态', en: 'Query Dial Status' },
'查询日志(调试用,较占资源,默认关闭)': { zh: '查询日志(调试用,较占资源,默认关闭)', en: 'Query logs (for debugging, resource-intensive, disabled by default)' },
'标志(客户端用': { zh: '标志(客户端用', en: 'flag (used by the client' },
'校验': { zh: '校验', en: 'Verify' },
'校验与操作': { zh: '校验与操作', en: 'Verification and actions' },
'校验主题': { zh: '校验主题', en: 'Verify theme' },
'校验失败': { zh: '校验失败', en: 'Validation Failed' },
'校验失败、下载中断、网络超时都会': { zh: '校验失败、下载中断、网络超时都会', en: 'checksum failures, interrupted downloads and network timeouts all' },
'校验完整性一步都不省': { zh: '校验完整性一步都不省', en: 'never skip a single step of integrity verification' },
'校验结果': { zh: '校验结果', en: 'Verification result' },
'校验通过': { zh: '校验通过', en: 'Validation passed' },
'校验通过:主题结构、全部变量取值与自定义': { zh: '校验通过:主题结构、全部变量取值与自定义', en: 'Verification passed: theme structure, all variable values, and custom' },
'核对生成的': { zh: '核对生成的', en: 'verify the generated' },
'根分区': { zh: '根分区', en: 'root partition' },
'根本': { zh: '根本', en: 'at all' },
'格式化': { zh: '格式化', en: 'Format' },
'格式化 /dev/': { zh: '格式化 /dev/', en: 'Format /dev/' },
'格式化会清除': { zh: '格式化会清除', en: 'Formatting will erase' },
'格式化失败': { zh: '格式化失败', en: 'Formatting failed' },
'格式化完成': { zh: '格式化完成', en: 'Formatting finished' },
'格式)': { zh: '格式)', en: 'format)' },
'格式,字段:': { zh: '格式,字段:', en: 'format, fields:' },
'桌面': { zh: '桌面', en: 'Desktop' },
'桌面环境等) 需要你逐项点「安装」': { zh: '桌面环境等) 需要你逐项点「安装」', en: 'desktop environment, etc.) you need to click "Install" item by item' },
'桥接后在「网卡与桥接」页勾选成员口;此处显示当前桥接状态。': { zh: '桥接后在「网卡与桥接」页勾选成员口;此处显示当前桥接状态。', en: 'After bridging, check the member ports on the "NICs and Bridges" page; the current bridge status is shown here.' },
'桥接成员': { zh: '桥接成员', en: 'Bridge members' },
'桥接成员(并入网桥)': { zh: '桥接成员(并入网桥)', en: 'Bridge member (merged into the bridge)' },
'桥接旁路(不改': { zh: '桥接旁路(不改', en: 'Bridge bypass (without changing' },
'桥接旁路(不改 WAN)': { zh: '桥接旁路(不改 WAN)', en: 'Bridge / bypass (WAN untouched)' },
'检查中…': { zh: '检查中…', en: 'Checking…' },
'检测不可用': { zh: '检测不可用', en: 'Detection unavailable' },
'检测中…': { zh: '检测中…', en: 'Detecting…' },
'检测到': { zh: '检测到', en: 'Detected' },
'检测到冲突:软加速(flowtable)正在运行。': { zh: '检测到冲突:软加速(flowtable)正在运行。', en: 'Conflict detected: software acceleration (flowtable) is running.' },
'检测到新版本 ': { zh: '检测到新版本 ', en: 'New version detected: ' },
'检测到私钥内容!请勿上传私钥,只上传 .pub 公钥文件。': { zh: '检测到私钥内容!请勿上传私钥,只上传 .pub 公钥文件。', en: 'Private key content detected! Never upload a private key — upload only the .pub public key file.' },
'检测可用地址': { zh: '检测可用地址', en: 'Detect available addresses' },
'检测在一台全新安装的': { zh: '检测在一台全新安装的', en: 'Detection on a freshly installed' },
'检测失败': { zh: '检测失败', en: 'Detection failed' },
'检测失败:': { zh: '检测失败:', en: 'Check failed: ' },
'检测完成': { zh: '检测完成', en: 'Detection Complete' },
'检测时间': { zh: '检测时间', en: 'Detection time' },
'检测版本号会尝试多个源(官方优先)以保证大陆可达。': { zh: '检测版本号会尝试多个源(官方优先)以保证大陆可达。', en: 'Checking the version number tries multiple sources (official first) to stay reachable from mainland China.' },
'检测间隔': { zh: '检测间隔', en: 'Check interval' },
'检测间隔(秒)': { zh: '检测间隔(秒)', en: 'Check interval (seconds)' },
'概览': { zh: '概览', en: 'Overview' },
'概览页查看': { zh: '概览页查看', en: 'View on the overview page' },
'概览页查看接口地址与默认路由是否正常': { zh: '概览页查看接口地址与默认路由是否正常', en: 'On the overview page, check whether the interface address and the default route are normal' },
'模块': { zh: '模块', en: 'Module' },
'模块未加载': { zh: '模块未加载', en: 'Module Not Loaded' },
'模块的': { zh: '模块的', en: 'of the module' },
'模式': { zh: '模式', en: 'Mode' },
'模式下,': { zh: '模式下,', en: 'in this mode,' },
'模式设置': { zh: '模式设置', en: 'Mode settings' },
'模板': { zh: '模板', en: 'Template' },
'次': { zh: '次', en: '' }, // i18n-en-empty(英文不需要量词:3 个 → 3)
'次失败后锁定': { zh: '次失败后锁定', en: 'consecutive failures before locking' },
'次数': { zh: '次数', en: 'Times' },
'次要文字': { zh: '次要文字', en: 'Secondary text' },
'正': { zh: '正', en: '1st' },
'正在下发 QoS 规则…': { zh: '正在下发 QoS 规则…', en: 'Pushing the QoS rules…' },
'正在下发更新…': { zh: '正在下发更新…', en: 'Deploying update…' },
'正在下载并安装规则库,可能耗时较长(视网速而定)…': { zh: '正在下载并安装规则库,可能耗时较长(视网速而定)…', en: 'Downloading and installing the rule database; this may take a while (depending on network speed)…' },
'正在与 STUN 服务器通信…': { zh: '正在与 STUN 服务器通信…', en: 'Communicating with the STUN server…' },
'正在保存…': { zh: '正在保存…', en: 'Saving…' },
'正在保存并应用…': { zh: '正在保存并应用…', en: 'Saving and Applying…' },
'正在保存并生效…': { zh: '正在保存并生效…', en: 'Saving and applying…' },
'正在保存并重启后台…': { zh: '正在保存并重启后台…', en: 'Saving and Restarting Backend…' },
'正在修复 WireGuard 环境': { zh: '正在修复 WireGuard 环境', en: 'Repairing WireGuard Environment' },
'正在写入': { zh: '正在写入', en: 'Writing' },
'正在准备下载 ': { zh: '正在准备下载 ', en: 'Preparing download: ' },
'正在准备下载…': { zh: '正在准备下载…', en: 'Preparing the download…' },
'正在创建快照…': { zh: '正在创建快照…', en: 'Creating Snapshot…' },
'正在创建目录 ': { zh: '正在创建目录 ', en: 'Creating directory ' },
'正在判定': { zh: '正在判定', en: 'Evaluating' },
'正在判定(会并发查询多个外部回显服务,首次约需 10 秒,之后走缓存)…': { zh: '正在判定(会并发查询多个外部回显服务,首次约需 10 秒,之后走缓存)…', en: 'Determining (queries several external echo services concurrently; the first run takes about 10 seconds, subsequent runs use the cache)…' },
'正在发送测试消息…': { zh: '正在发送测试消息…', en: 'Sending test message…' },
'正在发送魔术包…': { zh: '正在发送魔术包…', en: 'Sending magic packet…' },
'正在启动…': { zh: '正在启动…', en: 'Starting…' },
'正在启动服务…': { zh: '正在启动服务…', en: 'Starting service…' },
'正在安装缺失依赖,请稍候…': { zh: '正在安装缺失依赖,请稍候…', en: 'Installing the missing dependencies, please wait…' },
'正在安装该组件…': { zh: '正在安装该组件…', en: 'Installing this component…' },
'正在导出备份包…': { zh: '正在导出备份包…', en: 'Exporting the backup package…' },
'正在应用并逐条拨号,请稍候…': { zh: '正在应用并逐条拨号,请稍候…', en: 'Applying and dialling one by one, please wait…' },
'正在打包…': { zh: '正在打包…', en: 'Packaging…' },
'正在打包快照 ': { zh: '正在打包快照 ', en: 'Packing snapshot ' },
'正在执行语法预检…': { zh: '正在执行语法预检…', en: 'Running Syntax Pre-check…' },
'正在扫描': { zh: '正在扫描', en: 'Scanning' },
'正在拨号,通常需要 5–20 秒…': { zh: '正在拨号,通常需要 5–20 秒…', en: 'Dialing, this usually takes 5–20 seconds…' },
'正在握手…': { zh: '正在握手…', en: 'Handshaking…' },
'正在校验包内每个文件的校验值…': { zh: '正在校验包内每个文件的校验值…', en: 'Verifying the checksum of each file in the package…' },
'正在校验并应用…': { zh: '正在校验并应用…', en: 'Validating and applying…' },
'正在校验并应用共享配置…': { zh: '正在校验并应用共享配置…', en: 'Validating and applying the share configuration…' },
'正在校验并应用访问控制规则…': { zh: '正在校验并应用访问控制规则…', en: 'Validating and applying the access control rules…' },
'正在检测…(含一次到网关的 ping,约 3 秒)': { zh: '正在检测…(含一次到网关的 ping,约 3 秒)', en: 'Detecting… (includes one ping to the gateway, about 3 seconds)' },
'正在测试…': { zh: '正在测试…', en: 'Testing…' },
'正在清理…': { zh: '正在清理…', en: 'Cleaning Up…' },
'正在渲染…': { zh: '正在渲染…', en: 'Rendering…' },
'正在用': { zh: '正在用', en: 'Using' },
'正在用的': { zh: '正在用的', en: 'currently in use' },
'正在累计': { zh: '正在累计', en: 'Accumulating' },
'正在给这台机器做体检…': { zh: '正在给这台机器做体检…', en: 'Running a health check on this machine…' },
'正在聚合…': { zh: '正在聚合…', en: 'Aggregating…' },
'正在自检…': { zh: '正在自检…', en: 'Running Self-check…' },
'正在试运行(只读扫描,不删除任何文件)…': { zh: '正在试运行(只读扫描,不删除任何文件)…', en: 'Running dry run (read-only scan, no files will be deleted)…' },
'正在读取': { zh: '正在读取', en: 'Reading' },
'正在读取主题列表…': { zh: '正在读取主题列表…', en: 'Reading the theme list…' },
'正在读取共享配置与依赖状态': { zh: '正在读取共享配置与依赖状态', en: 'Reading the shared configuration and dependency status' },
'正在读取块设备': { zh: '正在读取块设备', en: 'Reading block device' },
'正在读取块设备…': { zh: '正在读取块设备…', en: 'Reading Block Devices…' },
'正在读取并校验…': { zh: '正在读取并校验…', en: 'Reading and validating…' },
'正在读取接入日志': { zh: '正在读取接入日志', en: 'Reading access log' },
'正在读取日志…': { zh: '正在读取日志…', en: 'Reading logs…' },
'正在读取配置与联动状态': { zh: '正在读取配置与联动状态', en: 'Reading the configuration and linkage status' },
'正在载入': { zh: '正在载入', en: 'Loading' },
'正在载入…': { zh: '正在载入…', en: 'Loading…' },
'正在运行的容器不会被一起杀掉': { zh: '正在运行的容器不会被一起杀掉', en: 'Running containers will not be killed together with it' },
'正在还原…': { zh: '正在还原…', en: 'Restoring…' },
'正在连接 GitHub 查询最新版本…': { zh: '正在连接 GitHub 查询最新版本…', en: 'Connecting to GitHub to query the latest release…' },
'正在连接…': { zh: '正在连接…', en: 'Connecting…' },
'正在逐个探测,最多约一分钟…': { zh: '正在逐个探测,最多约一分钟…', en: 'Probing one by one, up to about one minute…' },
'正在逐个测试前缀连通性(每个最多 5 秒)…': { zh: '正在逐个测试前缀连通性(每个最多 5 秒)…', en: 'Testing prefix connectivity one by one (up to 5 seconds each)…' },
'正在采集各源日志': { zh: '正在采集各源日志', en: 'Collecting logs from each source' },
'正在重新检测公网能力…': { zh: '正在重新检测公网能力…', en: 'Re-detecting public network capability…' },
'正在预检…(第 1 步:读取包内容)': { zh: '正在预检…(第 1 步:读取包内容)', en: 'Prechecking… (step 1: reading the package contents)' },
'正在预检…(第 2 步:算出还原计划)': { zh: '正在预检…(第 2 步:算出还原计划)', en: 'Prechecking… (step 2: computing the restore plan)' },
'正好也是这个段,容器网络就会和它打架, 表现为「装了': { zh: '正好也是这个段,容器网络就会和它打架, 表现为「装了', en: 'is exactly this subnet, the container network will conflict with it, which shows up as "installed' },
'正常': { zh: '正常', en: 'Normal' },
'正常重启与关机,会先停止服务再断电,对文件系统安全。': { zh: '正常重启与关机,会先停止服务再断电,对文件系统安全。', en: 'A normal restart or shutdown stops the services before cutting power, which is safer for the filesystem.' },
'此地址不占用': { zh: '此地址不占用', en: 'This address does not occupy' },
'此处创建同': { zh: '此处创建同', en: 'Create the same here' },
'此操作会立即改变': { zh: '此操作会立即改变', en: 'This action will immediately change' },
'此账号仅用于登录本管理台,与': { zh: '此账号仅用于登录本管理台,与', en: 'This account is only used to log in to this console, and has nothing to do with' },
'步。': { zh: '步。', en: 'steps.' },
'每': { zh: '每', en: 'Every' },
'每 10': { zh: '每 10', en: 'Every 10' },
'每 3 秒采样 · 保留 3 分钟': { zh: '每 3 秒采样 · 保留 3 分钟', en: 'Sampled every 3 s · 3 minutes kept' },
'每 5': { zh: '每 5', en: 'Every 5' },
'每一项都可以单独开关,并自定义保留天数。': { zh: '每一项都可以单独开关,并自定义保留天数。', en: 'Each item can be enabled or disabled separately, with a custom retention period in days.' },
'每个包里都带一份清单(导出于哪台机器、什么版本、每个文件的校验值), 还原前会先校验,文件对不上就拒绝写入': { zh: '每个包里都带一份清单(导出于哪台机器、什么版本、每个文件的校验值), 还原前会先校验,文件对不上就拒绝写入', en: 'Every package carries a manifest (which machine it was exported from, which version, and the checksum of every file). It is verified before the restore, and the restore is refused if any file does not match' },
'每台设备一套独立密钥。删除某台设备等于吊销它的访问权限': { zh: '每台设备一套独立密钥。删除某台设备等于吊销它的访问权限', en: 'Each device has its own set of keys. Deleting a device is equivalent to revoking its access' },
'每周一': { zh: '每周一', en: 'Every Monday' },
'每天': { zh: '每天', en: 'Every day' },
'每天凌晨自动导出一份并清理旧包。默认': { zh: '每天凌晨自动导出一份并清理旧包。默认', en: 'Export one package automatically in the early morning every day and clean up old packages. By default' },
'每天自动导出': { zh: '每天自动导出', en: 'Automatic export every day' },
'每张网卡的': { zh: '每张网卡的', en: 'each NIC\'s' },
'每日': { zh: '每日', en: 'Daily' },
'每日趋势': { zh: '每日趋势', en: 'Daily trend' },
'每条会话一个账号。若运营商允许同账号并发,勾选上面的「单账号多拨」即可全部填同一个账号。': { zh: '每条会话一个账号。若运营商允许同账号并发,勾选上面的「单账号多拨」即可全部填同一个账号。', en: 'One account per session. If the ISP allows concurrent sessions on the same account, check "Multiple sessions per account" above and fill in the same account everywhere.' },
'每条规则下面都写了「为什么是这个数」。阈值太松会漏报, 太紧会变成每天几十条推送的噪音,最后你直接把通知静音': { zh: '每条规则下面都写了「为什么是这个数」。阈值太松会漏报, 太紧会变成每天几十条推送的噪音,最后你直接把通知静音', en: 'Each rule explains "why this number" below it. A threshold that is too loose misses events; one that is too tight turns into the noise of dozens of pushes a day, until you simply mute the notification' },
'每次「保存并应用」前自动拍一张': { zh: '每次「保存并应用」前自动拍一张', en: 'Automatically take one before each "Save & Apply"' },
'每次保存都会自动备份旧文件(保留最近': { zh: '每次保存都会自动备份旧文件(保留最近', en: 'Every save automatically backs up the old file (keeping the most recent' },
'每次进入本页或点击刷新都会重新检测;结果缓存': { zh: '每次进入本页或点击刷新都会重新检测;结果缓存', en: 'Detection runs again every time you enter this page or click refresh; the result is cached' },
'比例': { zh: '比例', en: 'Ratio' },
'比对, 不一致就': { zh: '比对, 不一致就', en: 'compared; if they do not match, then' },
'水位': { zh: '水位', en: 'Watermark' },
'水位 + 定时': { zh: '水位 + 定时', en: 'Watermark + timer' },
'水位没到、时间没到就什么都不做。当前定时器:': { zh: '水位没到、时间没到就什么都不做。当前定时器:', en: 'If the watermark and the time have not been reached, nothing is done. Current timer:' },
'水位阈值': { zh: '水位阈值', en: 'Watermark threshold' },
'永久丢失': { zh: '永久丢失', en: 'permanently lost' },
'池前缀(可留空,取自': { zh: '池前缀(可留空,取自', en: 'pool prefix (may be left empty, taken from' },
'池名称': { zh: '池名称', en: 'Pool Name' },
'池策略(': { zh: '池策略(', en: 'pool policy (' },
'没变不会去敲服务商的接口,避免触发频率限制)。': { zh: '没变不会去敲服务商的接口,避免触发频率限制)。', en: 'has not changed, the provider\'s API is not called, to avoid triggering rate limits).' },
'没填时跟随': { zh: '没填时跟随', en: 'when left empty, follows' },
'没应答(': { zh: '没应答(', en: 'No response (' },
'没有': { zh: '没有', en: 'No' },
'没有可升级的包': { zh: '没有可升级的包', en: 'No packages to upgrade' },
'没有可用的预设模板': { zh: '没有可用的预设模板', en: 'No preset templates available' },
'没有可用网卡': { zh: '没有可用网卡', en: 'No network interface available' },
'没有它': { zh: '没有它', en: 'Without it' },
'没有检测到 USB 打印机': { zh: '没有检测到 USB 打印机', en: 'No USB printer detected' },
'没有检测到 USB 打印机。 这是一台': { zh: '没有检测到 USB 打印机。 这是一台', en: 'No USB printer detected. This is a' },
'没有检测到块设备。虚拟机里没有直通硬盘时属于正常现象。': { zh: '没有检测到块设备。虚拟机里没有直通硬盘时属于正常现象。', en: 'No block device detected. This is normal in a virtual machine without a passthrough disk.' },
'没有读到连接记录': { zh: '没有读到连接记录', en: 'No connection records were read' },
'没有通道,告警只记历史不发出去': { zh: '没有通道,告警只记历史不发出去', en: 'No channel; alerts are only recorded in history and not sent out' },
'没有配置开机自动加载': { zh: '没有配置开机自动加载', en: 'Not configured to load automatically on boot' },
'没有项目被选中。': { zh: '没有项目被选中。', en: 'No item is selected.' },
'泛滥)拖垮整台路由。': { zh: '泛滥)拖垮整台路由。', en: 'flooding) can drag down the entire router.' },
'注意': { zh: '注意', en: 'Note' },
'注意:': { zh: '注意:', en: 'Note:' },
'注意:开启后该主机将完全暴露在公网, 安全性取决于该主机自身的防护,请谨慎使用。': { zh: '注意:开启后该主机将完全暴露在公网, 安全性取决于该主机自身的防护,请谨慎使用。', en: 'Note: once enabled, this host is fully exposed to the public Internet, and security depends on the host\'s own protection. Use it with care.' },
'注释包裹,删除注释符即可启用对应规则。': { zh: '注释包裹,删除注释符即可启用对应规则。', en: 'wrapped in comments; remove the comment markers to enable the corresponding rule.' },
'流量控制复刻爱快': { zh: '流量控制复刻爱快', en: 'Traffic control replicates iKuai' },
'浅分隔线': { zh: '浅分隔线', en: 'Light divider' },
'浅色': { zh: '浅色', en: 'Light' },
'测本机管理后台': { zh: '测本机管理后台', en: 'Test Local Management Backend' },
'测试': { zh: '测试', en: 'Test' },
'测试中,正在连接测试站点…': { zh: '测试中,正在连接测试站点…', en: 'Testing, connecting to the test site…' },
'测试失败': { zh: '测试失败', en: 'Test Failed' },
'测试结果': { zh: '测试结果', en: 'Test result' },
'测试解析(本机': { zh: '测试解析(本机', en: 'Test parsing (locally on this machine' },
'测试连通性(': { zh: '测试连通性(', en: 'Test connectivity (' },
'测试页': { zh: '测试页', en: 'Test Page' },
'测试(': { zh: '测试(', en: 'Test (' },
'测速从': { zh: '测速从', en: 'Speed test from' },
'测速并优选': { zh: '测速并优选', en: 'Speed test and pick the best' },
'测量中': { zh: '测量中', en: 'Measuring' },
'浏览器打开': { zh: '浏览器打开', en: 'open in the browser' },
'浏览器拒绝了该请求,请检查权限设置': { zh: '浏览器拒绝了该请求,请检查权限设置', en: 'The browser refused this request; check the permission settings' },
'浏览器拦截了弹出窗口,请允许后再试': { zh: '浏览器拦截了弹出窗口,请允许后再试', en: 'The browser blocked the pop-up; allow it and try again' },
'涉及文件': { zh: '涉及文件', en: 'Files Involved' },
'深色': { zh: '深色', en: 'Dark' },
'深色主题': { zh: '深色主题', en: 'Dark theme' },
'混合填写,也支持网段(如': { zh: '混合填写,也支持网段(如', en: 'can be mixed, and subnets are also supported (e.g.' },
'添加': { zh: '添加', en: 'Add' },
'添加客户端': { zh: '添加客户端', en: 'Add client' },
'添加群机器人': { zh: '添加群机器人', en: 'Add group bot' },
'添加自定义': { zh: '添加自定义', en: 'Add custom' },
'添加设备': { zh: '添加设备', en: 'Add device' },
'添加邮件': { zh: '添加邮件', en: 'Add email' },
'添加队列': { zh: '添加队列', en: 'Add queue' },
'添加静态绑定': { zh: '添加静态绑定', en: 'Add static binding' },
'清单与配置)': { zh: '清单与配置)', en: 'manifest and configuration)' },
'清屏': { zh: '清屏', en: 'Clear screen' },
'清屏:只清本地显示,不中断会话': { zh: '清屏:只清本地显示,不中断会话', en: 'Clear screen: only clears the local display, does not interrupt sessions' },
'清屏:只清本地显示,不中断会话(等价于命令': { zh: '清屏:只清本地显示,不中断会话(等价于命令', en: 'Clear screen: only clears the local display without interrupting sessions (equivalent to the command' },
'清明': { zh: '清明', en: 'Pure Brightness' },
'清理': { zh: '清理', en: 'Clean up' },
'清理已停止容器': { zh: '清理已停止容器', en: 'Clean up stopped containers' },
'清理悬空镜像': { zh: '清理悬空镜像', en: 'Clean up dangling images' },
'清理无用数据卷': { zh: '清理无用数据卷', en: 'Clean up unused volumes' },
'清理旧包': { zh: '清理旧包', en: 'Clean up old packages' },
'清理项': { zh: '清理项', en: 'Cleanup items' },
'清空': { zh: '清空', en: 'Clear' },
'清空全部': { zh: '清空全部', en: 'Clear all' },
'清空全部用量统计': { zh: '清空全部用量统计', en: 'Clear all usage statistics' },
'清空全部端口转发': { zh: '清空全部端口转发', en: 'Clear all port forwards' },
'清空全部统计': { zh: '清空全部统计', en: 'Clear all statistics' },
'清空历史': { zh: '清空历史', en: 'Clear history' },
'清空后从下一轮聚合重新开始,历史数据无法恢复。': { zh: '清空后从下一轮聚合重新开始,历史数据无法恢复。', en: 'After clearing, aggregation restarts from the next round; historical data cannot be recovered.' },
'清空告警历史': { zh: '清空告警历史', en: 'Clear alert history' },
'清空归档': { zh: '清空归档', en: 'Clear Archive' },
'清空日志归档': { zh: '清空日志归档', en: 'Clear the log archive' },
'清空显示': { zh: '清空显示', en: 'Clear Display' },
'渲染失败': { zh: '渲染失败', en: 'Render Failed' },
'源列表': { zh: '源列表', en: 'Source list' },
'源地址': { zh: '源地址', en: 'Source address' },
'源码更新': { zh: '源码更新', en: 'Source code update' },
'点「+」': { zh: '点「+」', en: 'Click "+"' },
'点「读取」从': { zh: '点「读取」从', en: 'Click "Read" to load from' },
'点一次「保存并应用」才会真正生效。': { zh: '点一次「保存并应用」才会真正生效。', en: 'It only takes effect after clicking "Save and Apply" once.' },
'点一次「保存设置」会重写单元并尝试启用。</div>': { zh: '点一次「保存设置」会重写单元并尝试启用。</div>', en: 'Clicking "Save settings" once rewrites the unit and tries to enable it.</div>' },
'点一次「保存设置」会重写单元并尝试启用;如果仍不生效,': { zh: '点一次「保存设置」会重写单元并尝试启用;如果仍不生效,', en: 'Clicking "Save Settings" once rewrites the unit and tries to enable it; if it still does not take effect,' },
'点上面的「保存并生效」就够了。': { zh: '点上面的「保存并生效」就够了。', en: 'just click "Save and apply" above.' },
'点下面的按钮加载一下即可(本地操作,几秒钟)。</div>': { zh: '点下面的按钮加载一下即可(本地操作,几秒钟)。</div>', en: 'just click the button below to load it (a local operation, a few seconds).</div>' },
'点任意一行看这台设备的明细。': { zh: '点任意一行看这台设备的明细。', en: 'Click any row to see the details of this device.' },
'点击「刷新日志」载入。': { zh: '点击「刷新日志」载入。', en: 'Click "Refresh logs" to load.' },
'点击「开始检测」以自动判定当前': { zh: '点击「开始检测」以自动判定当前', en: 'Click "Start detection" to automatically determine the current' },
'点击「开始检测」开始。': { zh: '点击「开始检测」开始。', en: 'Click "Start detection" to start.' },
'点击「载入接口清单与范例」查看。': { zh: '点击「载入接口清单与范例」查看。', en: 'Click "Load Interface List and Examples" to view.' },
'点击上方按钮开始。': { zh: '点击上方按钮开始。', en: 'Click the button above to start.' },
'点击上方按钮开始测试。': { zh: '点击上方按钮开始测试。', en: 'Click the button above to start the test.' },
'点击上方按钮查询。': { zh: '点击上方按钮查询。', en: 'Click the button above to query.' },
'点击模板会新建一个时间组;已存在同名则跳过。': { zh: '点击模板会新建一个时间组;已存在同名则跳过。', en: 'Clicking a template creates a new time group; if a group with the same name already exists, it is skipped.' },
'点击终端区域即可开始输入;窗口大小变化时会自动同步给服务端。 长回显会': { zh: '点击终端区域即可开始输入;窗口大小变化时会自动同步给服务端。 长回显会', en: 'Click the terminal area to start typing; when the window size changes, it is automatically synced to the server side. Long echo output will' },
'点右上角「读取」从 OpenSOHO 拉一次实时数据。': { zh: '点右上角「读取」从 OpenSOHO 拉一次实时数据。', en: 'Click "Read" in the top right corner to pull live data from OpenSOHO once.' },
'点开「打开': { zh: '点开「打开', en: 'Click "Open' },
'点文件名那一行的「校验」可以先看清包里有什么、哪些文件已损坏, 确认无误再还原。': { zh: '点文件名那一行的「校验」可以先看清包里有什么、哪些文件已损坏, 确认无误再还原。', en: 'Click "Verify" on the file name line to see first what the package contains and which files are corrupted, then restore after confirming everything is correct.' },
'点(0': { zh: '点(0', en: 'point (0' },
'然后': { zh: '然后', en: 'Then' },
'然后重启守护:systemctl restart drouter-shelld': { zh: '然后重启守护:systemctl restart drouter-shelld', en: 'Then restart the daemon: systemctl restart drouter-shelld' },
'父网卡': { zh: '父网卡', en: 'Parent NIC' },
'版本': { zh: '版本', en: 'Version' },
'版本发布说明': { zh: '版本发布说明', en: 'Release notes' },
'版本号(留空': { zh: '版本号(留空', en: 'Version number (leave empty' },
'版本锁定(': { zh: '版本锁定(', en: 'Version lock (' },
'牛': { zh: '牛', en: 'Ox' },
'物理接口': { zh: '物理接口', en: 'Physical interface' },
'物理网卡': { zh: '物理网卡', en: 'Physical NIC' },
'状态': { zh: '状态', en: 'Status' },
'状态,可用于确认规则是否真的挂上了。': { zh: '状态,可用于确认规则是否真的挂上了。', en: 'status, can be used to confirm whether the rule is really attached.' },
'狗': { zh: '狗', en: 'Dog' },
'猪': { zh: '猪', en: 'Pig' },
'猴': { zh: '猴', en: 'Monkey' },
'环境': { zh: '环境', en: 'Environment' },
'现代格式)': { zh: '现代格式)', en: 'modern format)' },
'现在': { zh: '现在', en: 'Now' },
'现在下载': { zh: '现在下载', en: 'Download now' },
'现在拨号试试?': { zh: '现在拨号试试?', en: 'Try dialling up now?' },
'现有同名文件会先被复制成': { zh: '现有同名文件会先被复制成', en: 'An existing file with the same name will first be copied to' },
'现有文件里有': { zh: '现有文件里有', en: 'The existing file contains' },
'现有的 daemon.json 无法解析:': { zh: '现有的 daemon.json 无法解析:', en: 'The existing daemon.json cannot be parsed:' },
'生命期(秒)': { zh: '生命期(秒)', en: 'Lifetime (seconds)' },
'生成': { zh: '生成', en: 'Generate' },
'生成中…': { zh: '生成中…', en: 'Generating…' },
'生成命令': { zh: '生成命令', en: 'Generated command' },
'生成失败': { zh: '生成失败', en: 'Generation failed' },
'生成定时任务说明': { zh: '生成定时任务说明', en: 'Generated cron job description' },
'生成证书签名请求(': { zh: '生成证书签名请求(', en: 'Generate a certificate signing request (' },
'生成迁移预览(不写入)': { zh: '生成迁移预览(不写入)', en: 'Generate Migration Preview (No Write)' },
'生成预览': { zh: '生成预览', en: 'Generate preview' },
'生效」一致。': { zh: '生效」一致。', en: 'take effect".' },
'生效星期:': { zh: '生效星期:', en: 'Effective days:' },
'生效网卡(留空=自动应用到所有物理网卡,插任一口皆可访问)': { zh: '生效网卡(留空=自动应用到所有物理网卡,插任一口皆可访问)', en: 'Effective NIC (leave empty = applied to all physical NICs automatically, reachable from any port)' },
'用 CA': { zh: '用 CA', en: 'Use CA' },
'用 Linux': { zh: '用 Linux', en: 'Use Linux' },
'用 OpenSOHO': { zh: '用 OpenSOHO', en: 'Use OpenSOHO' },
'用公共': { zh: '用公共', en: 'Use public' },
'用公网段(': { zh: '用公网段(', en: 'Use public subnet (' },
'用哪张': { zh: '用哪张', en: 'which one to use' },
'用户': { zh: '用户', en: 'User' },
'用户与密钥': { zh: '用户与密钥', en: 'Users & Keys' },
'用户名': { zh: '用户名', en: 'Username' },
'用途': { zh: '用途', en: 'Purpose' },
'用量': { zh: '用量', en: 'Usage' },
'用量与账单': { zh: '用量与账单', en: 'Usage & Billing' },
'由 CA 签发': { zh: '由 CA 签发', en: 'Issued by CA' },
'由上级光猫或路由器自动分配 IP,适用于光猫已拨号后再接本机的情况。': { zh: '由上级光猫或路由器自动分配 IP,适用于光猫已拨号后再接本机的情况。', en: 'The upstream ONT or router assigns the IP; suits connecting this host behind an ONT that has already dialled.' },
'由系统工具整体回收': { zh: '由系统工具整体回收', en: 'Reclaimed entirely by system tools' },
'由系统按页面顶部参数自动生成默认规则。': { zh: '由系统按页面顶部参数自动生成默认规则。', en: 'The system automatically generates default rules according to the parameters at the top of the page.' },
'甲': { zh: '甲', en: 'Jia' },
'申': { zh: '申', en: 'Shen' },
'电源控制': { zh: '电源控制', en: 'Power Control' },
'电脑一次,之后签的所有证书都不再提示不安全。': { zh: '电脑一次,之后签的所有证书都不再提示不安全。', en: 'your computer once; after that, every certificate you sign will no longer show an insecure warning.' },
'留空': { zh: '留空', en: 'Leave empty' },
'留空会当成只填 Key 处理,自动补成官方地址': { zh: '留空会当成只填 Key 处理,自动补成官方地址', en: 'Leaving it empty means only the key is given; the official URL is filled in' },
'留空则复用': { zh: '留空则复用', en: 'If left empty, reuse' },
'留空则按上面参数自动生成默认规则': { zh: '留空则按上面参数自动生成默认规则', en: 'If left empty, default rules are generated automatically from the parameters above' },
'留空则用全局网关': { zh: '留空则用全局网关', en: 'If left empty, use the global gateway' },
'留空则用客户端自己的': { zh: '留空则用客户端自己的', en: 'If left empty, use the client\'s own' },
'留空则用账号': { zh: '留空则用账号', en: 'Leaving it empty uses the account' },
'留空或': { zh: '留空或', en: 'Leave empty or' },
'留空推荐': { zh: '留空推荐', en: 'Recommended to leave empty' },
'留空整个文本框': { zh: '留空整个文本框', en: 'Leave the entire text box empty' },
'留空表示不修改已保存的密码': { zh: '留空表示不修改已保存的密码', en: 'Leaving it empty keeps the saved password' },
'留空表示不设。跨零点(如': { zh: '留空表示不设。跨零点(如', en: 'Leaving it empty means no limit is set. Crossing midnight (e.g.' },
'留空表示按实际用量算。填了数字就按你填的比例分, 适合「人头均摊」「按台数」这种和用量无关的算法。': { zh: '留空表示按实际用量算。填了数字就按你填的比例分, 适合「人头均摊」「按台数」这种和用量无关的算法。', en: 'Leaving it empty means it is calculated by actual usage. If a number is entered, it is split according to the ratio you entered, which suits allocation methods such as "split evenly per user" or "by device count" that are unrelated to actual usage.' },
'留空=保存时自动生成一个': { zh: '留空=保存时自动生成一个', en: 'Leave empty = one is automatically generated when saving' },
'留空=用': { zh: '留空=用', en: 'Leave empty = use' },
'癸': { zh: '癸', en: 'Gui' },
'登录失败锁定': { zh: '登录失败锁定', en: 'Login Failure Lockout' },
'登录已过期,请重新登录': { zh: '登录已过期,请重新登录', en: 'Your session has expired; please sign in again' },
'登录账号': { zh: '登录账号', en: 'Login account' },
'登录身份': { zh: '登录身份', en: 'Login identity' },
'登录)': { zh: '登录)', en: 'login)' },
'白露': { zh: '白露', en: 'White Dew' },
'的': { zh: '的', en: '' }, // i18n-en-empty(英文不需要量词:3 个 → 3)
'的 Lease': { zh: '的 Lease', en: 'Lease' },
'的 URL': { zh: '的 URL', en: 'URL' },
'的 VLAN': { zh: '的 VLAN', en: 'VLAN' },
'的 dhcp6s': { zh: '的 dhcp6s', en: 'dhcp6s' },
'的 pool-policy': { zh: '的 pool-policy', en: 'pool-policy' },
'的「软件流量分载': { zh: '的「软件流量分载', en: '"Software Traffic Offload in' },
'的值; 注意不要写成': { zh: '的值; 注意不要写成', en: 'value; note that you must not write it as' },
'的内容': { zh: '的内容', en: 'content of' },
'的内核': { zh: '的内核', en: 'kernel of' },
'的协议识别规则托管在': { zh: '的协议识别规则托管在', en: 'protocol identification rules are hosted on' },
'的单独决定,任何自动清理都跳过它。上锁不影响手动删除,只是删之前会多问一次。': { zh: '的单独决定,任何自动清理都跳过它。上锁不影响手动删除,只是删之前会多问一次。', en: 'alone; any automatic cleanup skips it. Locking does not prevent manual deletion, it just asks for confirmation once more before deleting.' },
'的反向)': { zh: '的反向)', en: 'reverse of)' },
'的固有约束,与爱快下行限速原理相同)。': { zh: '的固有约束,与爱快下行限速原理相同)。', en: 'inherent constraint of, the same principle as iKuai downstream rate limiting).' },
'的国内代理」:拉镜像时先问它要,能省下大量等待。 可以同时勾多个': { zh: '的国内代理」:拉镜像时先问它要,能省下大量等待。 可以同时勾多个', en: 'domestic proxy": when pulling images, ask it first, which saves a lot of waiting time. You can select multiple at the same time' },
'的完整内容,可直接复制到别处使用。': { zh: '的完整内容,可直接复制到别处使用。', en: 'full content, which can be copied elsewhere for direct use.' },
'的实时快照。': { zh: '的实时快照。', en: 'real-time snapshot.' },
'的密码': { zh: '的密码', en: 'password' },
'的并发连接数,抑制异常设备(中毒、': { zh: '的并发连接数,抑制异常设备(中毒、', en: 'concurrent connections, suppressing abnormal devices (infected,' },
'的所有引擎级设置都写在': { zh: '的所有引擎级设置都写在', en: 'All engine-level settings of are written in' },
'的探针本来就要求带凭证,回': { zh: '的探针本来就要求带凭证,回', en: 'probes inherently require credentials, so back' },
'的状态。': { zh: '的状态。', en: 'state.' },
'的环境(': { zh: '的环境(', en: 'environment (' },
'的设备吗? 正在读写该目录的程序会中断。': { zh: '的设备吗? 正在读写该目录的程序会中断。', en: 'devices? Programs currently reading or writing that directory will be interrupted.' },
'的配置文件目录。 正在运行的容器请先「停止」。': { zh: '的配置文件目录。 正在运行的容器请先「停止」。', en: 'configuration file directory. Please "Stop" running containers first.' },
'的配置通常一两秒内完成。': { zh: '的配置通常一两秒内完成。', en: 'configuration usually completes within one or two seconds.' },
'的防火墙': { zh: '的防火墙', en: 'firewall of' },
'监听。': { zh: '监听。', en: 'listening.' },
'监听地址': { zh: '监听地址', en: 'Listen address' },
'监听地址(': { zh: '监听地址(', en: 'Listen address (' },
'监听地址(留空=全部)': { zh: '监听地址(留空=全部)', en: 'Listen address (leave empty = all)' },
'监听端口': { zh: '监听端口', en: 'Listen port' },
'监听网卡': { zh: '监听网卡', en: 'Listening NIC' },
'监控': { zh: '监控', en: 'Monitoring' },
'盘': { zh: '盘', en: 'disk' },
'目前还没从运营商那里拿到 IPv6 地址。': { zh: '目前还没从运营商那里拿到 IPv6 地址。', en: 'No IPv6 address has been obtained from the ISP yet.' },
'目录': { zh: '目录', en: 'Directory' },
'目录为空': { zh: '目录为空', en: 'Directory is empty' },
'目录已有': { zh: '目录已有', en: 'directory already has' },
'目录路径': { zh: '目录路径', en: 'Directory path' },
'目标': { zh: '目标', en: 'Target' },
'目标 ': { zh: '目标 ', en: 'Target ' },
'目标地址': { zh: '目标地址', en: 'Target address' },
'目标用户': { zh: '目标用户', en: 'Target user' },
'目标网段': { zh: '目标网段', en: 'Target subnet' },
'目的地址': { zh: '目的地址', en: 'Destination address' },
'目的端口': { zh: '目的端口', en: 'destination port' },
'直接中止更新': { zh: '直接中止更新', en: 'abort the update directly' },
'直接发现并打印;还能把网络上已有的打印机收进来再共享出去': { zh: '直接发现并打印;还能把网络上已有的打印机收进来再共享出去', en: 'discover and print them directly; it can also collect printers already on the network and share them out' },
'直接触发内核': { zh: '直接触发内核', en: 'directly trigger the kernel' },
'直接读取内核里的': { zh: '直接读取内核里的', en: 'directly read the' },
'直达一键还原页)。': { zh: '直达一键还原页)。', en: 'go straight to the one-click restore page).' },
'直通': { zh: '直通', en: 'Passthrough' },
'直通模式': { zh: '直通模式', en: 'Passthrough mode' },
'直通设备': { zh: '直通设备', en: 'Passthrough device' },
'看原因。': { zh: '看原因。', en: 'to see the reason.' },
'看看流量主要花在什么上。视频流、网盘同步、': { zh: '看看流量主要花在什么上。视频流、网盘同步、', en: 'see where traffic is mainly spent. Video streaming, cloud drive sync,' },
'真': { zh: '真', en: 'Yes' },
'真·公网 IP 判定': { zh: '真·公网 IP 判定', en: 'Real Public IP Check' },
'真正执行可能中断网络连接': { zh: '真正执行可能中断网络连接', en: 'Actually running it may interrupt the network connection' },
'真正生效': { zh: '真正生效', en: 'actually takes effect' },
'真的能被外网主动连进来': { zh: '真的能被外网主动连进来', en: 'can really be reached by an inbound connection from the Internet' },
'知道了': { zh: '知道了', en: 'Got it' },
'硬件卸载': { zh: '硬件卸载', en: 'Hardware offload' },
'确定': { zh: '确定', en: 'OK' },
'确定停用 QoS?所有 CAKE / HTB 规则将被移除。': { zh: '确定停用 QoS?所有 CAKE / HTB 规则将被移除。', en: 'Disable QoS? All CAKE / HTB rules will be removed.' },
'确定删除': { zh: '确定删除', en: 'Confirm delete' },
'确定删除设备': { zh: '确定删除设备', en: 'Confirm device deletion' },
'确定删除这张证书?它的私钥会一起删除,不可恢复。': { zh: '确定删除这张证书?它的私钥会一起删除,不可恢复。', en: 'Delete this certificate? Its private key is deleted too and cannot be recovered.' },
'确定卸载 OpenSOHO 并删除数据目录?AP 清单与配置将一并清除,不可恢复。': { zh: '确定卸载 OpenSOHO 并删除数据目录?AP 清单与配置将一并清除,不可恢复。', en: 'Uninstall OpenSOHO and delete its data directory? The AP list and configuration will be erased too and cannot be recovered.' },
'确定卸载 OpenSOHO?数据目录会保留,下次重装可直接使用。': { zh: '确定卸载 OpenSOHO?数据目录会保留,下次重装可直接使用。', en: 'Uninstall OpenSOHO? The data directory is kept and can be reused on the next install.' },
'确定把管理后台端口改为': { zh: '确定把管理后台端口改为', en: 'confirm changing the management backend port to' },
'确定断开全部多拨会话?出网将恢复为单一默认路由。': { zh: '确定断开全部多拨会话?出网将恢复为单一默认路由。', en: 'Disconnect all multi-dial sessions? Routing will go back to a single default route.' },
'确定清空全部告警历史吗?': { zh: '确定清空全部告警历史吗?', en: 'Clear all alert history?' },
'确定清空吗?': { zh: '确定清空吗?', en: 'Confirm clearing?' },
'确定立即清理所有勾选的项目吗?被删的日志文件无法恢复。\\n\\n(建议先点「试运行」看清楚会清掉多少)': { zh: '确定立即清理所有勾选的项目吗?被删的日志文件无法恢复。\\n\\n(建议先点「试运行」看清楚会清掉多少)', en: 'Clear every ticked item now? Deleted log files cannot be recovered.\\n\\n(It is a good idea to run a dry run first to see how much there is.)' },
'确定立即清理所有勾选的项目吗?被删的日志文件无法恢复。\n\n(建议先点「试运行」看清楚会清掉多少)': { zh: '确定立即清理所有勾选的项目吗?被删的日志文件无法恢复。\n\n(建议先点「试运行」看清楚会清掉多少)', en: 'Clear every ticked item now? Deleted log files cannot be recovered.\\n\\n(It is a good idea to run a dry run first to see how much there is.)' },
'确定立即清理所有勾选的项目吗?被删的日志文件无法恢复。\\\\n\\\\n(建议先点「试运行」看清楚会清掉多少)': { zh: '确定立即清理所有勾选的项目吗?被删的日志文件无法恢复。\\\\n\\\\n(建议先点「试运行」看清楚会清掉多少)', en: 'Clear every ticked item now? Deleted log files cannot be recovered.\\n\\n(It is a good idea to run a dry run first to see how much there is.)' },
'确定要删除主题「': { zh: '确定要删除主题「', en: 'Are you sure you want to delete the theme "' },
'确定要卸载挂载在': { zh: '确定要卸载挂载在', en: 'Are you sure you want to unmount what is mounted at' },
'确定要启用「全部流量经过本机」吗?\\n\\n': { zh: '确定要启用「全部流量经过本机」吗?\\n\\n', en: 'Enable "route all traffic through this host"?\\n\\n' },
'确定要启用「全部流量经过本机」吗?\n\n': { zh: '确定要启用「全部流量经过本机」吗?\n\n', en: 'Enable "route all traffic through this host"?\\n\\n' },
'确定要启用「全部流量经过本机」吗?\\\\n\\\\n': { zh: '确定要启用「全部流量经过本机」吗?\\\\n\\\\n', en: 'Enable "route all traffic through this host"?\\n\\n' },
'确定要清空所有端口转发规则吗?此操作需在保存并应用后生效。': { zh: '确定要清空所有端口转发规则吗?此操作需在保存并应用后生效。', en: 'Are you sure you want to clear all port forwarding rules? This takes effect after saving and applying.' },
'确定要退出管理后台吗?未保存的配置改动会丢失。': { zh: '确定要退出管理后台吗?未保存的配置改动会丢失。', en: 'Are you sure you want to exit the admin panel? Unsaved configuration changes will be lost.' },
'确认停止': { zh: '确认停止', en: 'Confirm stop' },
'确认关机': { zh: '确认关机', en: 'Confirm shut down' },
'确认关闭保护': { zh: '确认关闭保护', en: 'Confirm turning off protection' },
'确认删除': { zh: '确认删除', en: 'Confirm delete' },
'确认删除用户': { zh: '确认删除用户', en: 'Confirm deleting user' },
'确认回收': { zh: '确认回收', en: 'Confirm reclaim' },
'确认回滚': { zh: '确认回滚', en: 'Confirm Rollback' },
'确认应用': { zh: '确认应用', en: 'Confirm apply' },
'确认强制重启': { zh: '确认强制重启', en: 'Confirm forced reboot' },
'确认拨号': { zh: '确认拨号', en: 'Confirm dial-up' },
'确认文字不正确': { zh: '确认文字不正确', en: 'The confirmation text does not match' },
'确认断开': { zh: '确认断开', en: 'Confirm disconnect' },
'确认新密码': { zh: '确认新密码', en: 'Confirm New Password' },
'确认格式化': { zh: '确认格式化', en: 'Confirm format' },
'确认清理': { zh: '确认清理', en: 'Confirm clean up' },
'确认清空': { zh: '确认清空', en: 'Confirm clear' },
'确认现在拨号,请输入': { zh: '确认现在拨号,请输入', en: 'Confirm dialing now, please enter' },
'确认继续?': { zh: '确认继续?', en: 'Continue?' },
'确认要执行「': { zh: '确认要执行「', en: 'Confirm you want to run "' },
'确认要把当前规则写入磁盘(暂不生效)?': { zh: '确认要把当前规则写入磁盘(暂不生效)?', en: 'Confirm writing the current rules to disk (not taking effect yet)?' },
'确认要把当前配置写入磁盘(暂不生效)?': { zh: '确认要把当前配置写入磁盘(暂不生效)?', en: 'Confirm writing the current configuration to disk (not taking effect yet)?' },
'确认要把当前页面的配置写入磁盘(暂不生效)?': { zh: '确认要把当前页面的配置写入磁盘(暂不生效)?', en: 'Write the configuration from the current page to disk (not applied yet)?' },
'确认请输入设备名': { zh: '确认请输入设备名', en: 'Confirm: please enter the device name' },
'确认还原': { zh: '确认还原', en: 'Confirm restore' },
'确认还原配置': { zh: '确认还原配置', en: 'Confirm restore' },
'确认重启': { zh: '确认重启', en: 'Confirm reboot' },
'确认重启 Docker': { zh: '确认重启 Docker', en: 'Confirm Docker restart' },
'磁盘': { zh: '磁盘', en: 'Disk' },
'磁盘 IO': { zh: '磁盘 IO', en: 'Disk I/O' },
'磁盘与日志清理': { zh: '磁盘与日志清理', en: 'Disk & Log Cleanup' },
'磁盘占用': { zh: '磁盘占用', en: 'Disk usage' },
'磁盘:剩余': { zh: '磁盘:剩余', en: 'Disk: remaining' },
'禁止某台设备使用': { zh: '禁止某台设备使用', en: 'Forbid a device from using' },
'禁止某台设备联网:': { zh: '禁止某台设备联网:', en: 'Block a device from accessing the network:' },
'离线包': { zh: '离线包', en: 'Offline package' },
'离线预览': { zh: '离线预览', en: 'Offline preview' },
'私有段': { zh: '私有段', en: 'Private range' },
'私有段(': { zh: '私有段(', en: 'Private range (' },
'私网地址(说明在 NAT 后)': { zh: '私网地址(说明在 NAT 后)', en: 'Private address (means it is behind NAT)' },
'私钥': { zh: '私钥', en: 'Private Key' },
'私钥算法': { zh: '私钥算法', en: 'Private Key Algorithm' },
'秋分': { zh: '秋分', en: 'Autumn Equinox' },
'秒': { zh: '秒', en: 's' },
'秒、TTL': { zh: '秒、TTL', en: 'seconds, TTL' },
'秒。': { zh: '秒。', en: 'seconds.' },
'秒。NAT': { zh: '秒。NAT', en: 'seconds. NAT' },
'秒以免频繁请求外部接口。': { zh: '秒以免频繁请求外部接口。', en: 'seconds to avoid frequent requests to external interfaces.' },
'秒自动刷新': { zh: '秒自动刷新', en: 'seconds auto-refresh' },
'秒自动刷新资源占用': { zh: '秒自动刷新资源占用', en: 'seconds to auto-refresh resource usage' },
'秒自动滚动刷新,全部中文呈现, 并针对每种方式给出排错提示。日志来源:': { zh: '秒自动滚动刷新,全部中文呈现, 并针对每种方式给出排错提示。日志来源:', en: 'seconds auto-scrolling refresh, all rendered in Chinese, with troubleshooting hints given for each method. Log sources:' },
'秒(60': { zh: '秒(60', en: 'seconds (60' },
'秒)': { zh: '秒)', en: 'seconds)' },
'秒),避免日志风暴拖垮小内存设备。': { zh: '秒),避免日志风暴拖垮小内存设备。', en: 'seconds), so that a log storm does not drag down a low-memory device.' },
'秒,以加快变更生效。': { zh: '秒,以加快变更生效。', en: 'seconds, to speed up the changes taking effect.' },
'租期(秒)': { zh: '租期(秒)', en: 'Lease duration (seconds)' },
'租约已刷新': { zh: '租约已刷新', en: 'Lease Refreshed' },
'移入回收站': { zh: '移入回收站', en: 'Moved to trash' },
'移动硬盘': { zh: '移动硬盘', en: 'removable hard drive' },
'移除该设备的条目。 原文件已备份在': { zh: '移除该设备的条目。 原文件已备份在', en: 'Remove this device\'s entry. The original file has been backed up to' },
'立冬': { zh: '立冬', en: 'Start of Winter' },
'立刻连不上': { zh: '立刻连不上', en: 'cannot connect immediately' },
'立即创建快照': { zh: '立即创建快照', en: 'Create Snapshot Now' },
'立即刷新': { zh: '立即刷新', en: 'Refresh Now' },
'立即导出': { zh: '立即导出', en: 'Export now' },
'立即执行一次': { zh: '立即执行一次', en: 'Run Once Now' },
'立即拨号测试': { zh: '立即拨号测试', en: 'Dial up now to test' },
'立即更新记录': { zh: '立即更新记录', en: 'Update record now' },
'立即检测一次': { zh: '立即检测一次', en: 'Run detection now' },
'立即清理': { zh: '立即清理', en: 'Clean Now' },
'立即清理过期快照': { zh: '立即清理过期快照', en: 'Clean Up Expired Snapshots Now' },
'立即清理选中项': { zh: '立即清理选中项', en: 'Clean selected items now' },
'立即聚合一次': { zh: '立即聚合一次', en: 'Aggregate now' },
'立即重启,': { zh: '立即重启,', en: 'Restart immediately,' },
'立夏': { zh: '立夏', en: 'Start of Summer' },
'立春': { zh: '立春', en: 'Start of Spring' },
'立秋': { zh: '立秋', en: 'Start of Autumn' },
'端口': { zh: '端口', en: 'Port' },
'端口。占用时会自动换一个(换完会明确告诉你)': { zh: '端口。占用时会自动换一个(换完会明确告诉你)', en: 'port. If it is occupied, another one is used automatically (you will be told explicitly after the switch)' },
'端口受限': { zh: '端口受限', en: 'Port-restricted' },
'端口固定为': { zh: '端口固定为', en: 'port is fixed to' },
'端口已改为 ': { zh: '端口已改为 ', en: 'Port changed to ' },
'端口必须是 1-65535 的数字': { zh: '端口必须是 1-65535 的数字', en: 'Port must be a number from 1 to 65535' },
'端口等)连同底层配置文件一起打包。回滚时数据库与配置文件一并还原,不会出现「只恢复了一半」的情况。': { zh: '端口等)连同底层配置文件一起打包。回滚时数据库与配置文件一并还原,不会出现「只恢复了一半」的情况。', en: 'ports, etc.) are packaged together with the underlying configuration files. On rollback the database and the configuration files are restored together, so you never end up with "only half of it restored".' },
'端口转发': { zh: '端口转发', en: 'Port forwarding' },
'端口转发 / DMZ': { zh: '端口转发 / DMZ', en: 'Port Forwarding / DMZ' },
'端口转发与 DMZ(nftables DNAT)': { zh: '端口转发与 DMZ(nftables DNAT)', en: 'Port Forwarding & DMZ (nftables DNAT)' },
'端口转发需要先有一个 WAN 口。': { zh: '端口转发需要先有一个 WAN 口。', en: 'Port forwarding needs a WAN port first.' },
'端口转发(': { zh: '端口转发(', en: 'Port forwarding (' },
'端口转发(把外网': { zh: '端口转发(把外网', en: 'Port forwarding (forward the public' },
'端口,避免与其他服务冲突。默认': { zh: '端口,避免与其他服务冲突。默认', en: 'port, to avoid conflicts with other services. By default' },
'端口,防火墙规则会立即加载。请确保这是你想要的。': { zh: '端口,防火墙规则会立即加载。请确保这是你想要的。', en: 'port, firewall rules are loaded immediately. Please make sure this is what you want.' },
'笔记本)生成一份独立配置, 导入对方的': { zh: '笔记本)生成一份独立配置, 导入对方的', en: 'laptop) generates an independent configuration, which you import into the other' },
'第 1 步': { zh: '第 1 步', en: 'Step 1' },
'第 2 步': { zh: '第 2 步', en: 'Step 2' },
'第 3 步': { zh: '第 3 步', en: 'Step 3' },
'第 4 步': { zh: '第 4 步', en: 'Step 4' },
'第一次用这台机器上网?四步走完:接上外网 · 给内网发地址 · 配 DNS · 要不要 IPv6。每一步都带范例和体检结果': { zh: '第一次用这台机器上网?四步走完:接上外网 · 给内网发地址 · 配 DNS · 要不要 IPv6。每一步都带范例和体检结果', en: 'First time setting up this router? Four steps: connect to the internet, assign addresses to the LAN, configure DNS, and decide on IPv6. Each step comes with examples and a health check.' },
'等外部引用。': { zh: '等外部引用。', en: 'and other external references.' },
'等待': { zh: '等待', en: 'Waiting' },
'等待作者完善': { zh: '等待作者完善', en: 'Waiting for the author to complete it' },
'等待超时,没有收到来自外网的报文': { zh: '等待超时,没有收到来自外网的报文', en: 'Timed out waiting; no packets arrived from the internet' },
'等方式登录救回。': { zh: '等方式登录救回。', en: 'and other methods to log in and recover access.' },
'等方式重新登录救回。 确认自己能救回来之后,再执行迁移。': { zh: '等方式重新登录救回。 确认自己能救回来之后,再执行迁移。', en: 'and other means to log back in and rescue it. Once you are sure you can rescue it, then perform the migration.' },
'等服务状态': { zh: '等服务状态', en: 'and other service statuses' },
'等需要大量端口的设备。': { zh: '等需要大量端口的设备。', en: 'and other devices that need many ports.' },
'等)。': { zh: '等)。', en: 'etc.).' },
'筛选与检索': { zh: '筛选与检索', en: 'Filter and Search' },
'签': { zh: '签', en: 'signed' },
'签一张服务器证书': { zh: '签一张服务器证书', en: 'to sign a server certificate' },
'签发': { zh: '签发', en: 'Issue' },
'签名算法': { zh: '签名算法', en: 'Signature algorithm' },
'签好的证书会带上你填的域名和': { zh: '签好的证书会带上你填的域名和', en: 'The signed certificate will carry the domain you entered and the' },
'算法': { zh: '算法', en: 'Algorithm' },
'管理中心': { zh: '管理中心', en: 'Management center' },
'管理口(仅管理访问)': { zh: '管理口(仅管理访问)', en: 'Management port (management traffic only)' },
'管理台': { zh: '管理台', en: 'Admin panel' },
'管理台外观': { zh: '管理台外观', en: 'Admin panel appearance' },
'管理台账号相互独立。': { zh: '管理台账号相互独立。', en: 'Admin panel accounts are independent of each other.' },
'管理后台正在用的证书': { zh: '管理后台正在用的证书', en: 'Certificate Currently in Use by the Admin Backend' },
'管理后台现在没有可用的证书:': { zh: '管理后台现在没有可用的证书:', en: 'The admin backend has no usable certificate right now:' },
'管理端口': { zh: '管理端口', en: 'Management port' },
'管理网卡。如需切换为': { zh: '管理网卡。如需切换为', en: 'management NIC. If you need to switch to' },
'管理账号': { zh: '管理账号', en: 'management account' },
'管理面板': { zh: '管理面板', en: 'Management panel' },
'管理页打不开等), 常规手段往往已经进不去路由器。': { zh: '管理页打不开等), 常规手段往往已经进不去路由器。', en: 'the management page cannot be opened, etc.), the usual means often can no longer get into the router.' },
'管理页面': { zh: '管理页面', en: 'Admin Page' },
'类型': { zh: '类型', en: 'Type' },
'类型。': { zh: '类型。', en: 'type.' },
'类型检测': { zh: '类型检测', en: 'Type detection' },
'精确限速取代': { zh: '精确限速取代', en: 'Precise rate limiting replaces' },
'精确限速(': { zh: '精确限速(', en: 'Precise rate limiting (' },
'精确限速,': { zh: '精确限速,', en: 'Precise rate limiting,' },
'精简容器镜像和自编内核会裁掉它;': { zh: '精简容器镜像和自编内核会裁掉它;', en: 'Minimal container images and custom-built kernels cut it out;' },
'系统': { zh: '系统', en: 'System' },
'系统会在应用前自动创建配置快照,失败时自动回滚。': { zh: '系统会在应用前自动创建配置快照,失败时自动回滚。', en: 'The system automatically creates a configuration snapshot before applying, and rolls back automatically on failure.' },
'系统升级与 RealVNC 保护': { zh: '系统升级与 RealVNC 保护', en: 'System Upgrade & RealVNC Protection' },
'系统日志': { zh: '系统日志', en: 'System Logs' },
'系统时间': { zh: '系统时间', en: 'System time' },
'系统更新默认': { zh: '系统更新默认', en: 'System update default' },
'系统概览': { zh: '系统概览', en: 'System Overview' },
'系统用户与 SSH 公钥': { zh: '系统用户与 SSH 公钥', en: 'System Users & SSH Public Keys' },
'系统用户完全独立。当前用户:': { zh: '系统用户完全独立。当前用户:', en: 'System users are completely independent. Current user:' },
'系统用户(用于': { zh: '系统用户(用于', en: 'System user (used for' },
'系统的真实用户,与': { zh: '系统的真实用户,与', en: 'the real user of the system, and' },
'系统自动探测,可在此为每个前缀添加备注(例如「电信': { zh: '系统自动探测,可在此为每个前缀添加备注(例如「电信', en: 'The system probes automatically; here you can add a note to each prefix (for example "China Telecom' },
'系统设置': { zh: '系统设置', en: 'System settings' },
'系统负载': { zh: '系统负载', en: 'System load' },
'系统里没有': { zh: '系统里没有', en: 'The system has no' },
'系统)': { zh: '系统)', en: 'system)' },
'紧张': { zh: '紧张', en: 'tight' },
'紧急救援通道': { zh: '紧急救援通道', en: 'Emergency Rescue Channel' },
'累计发送': { zh: '累计发送', en: 'Total sent' },
'累计接收': { zh: '累计接收', en: 'Total received' },
'级别': { zh: '级别', en: 'Level' },
'线程数决定并发处理能力,家用': { zh: '线程数决定并发处理能力,家用', en: 'Thread count determines concurrent processing capability; for a home' },
'组': { zh: '组', en: 'Group' },
'组件': { zh: '组件', en: 'Component' },
'组合。': { zh: '组合。', en: 'combination.' },
'组播': { zh: '组播', en: 'Multicast' },
'组播、访客隔离或多拨。': { zh: '组播、访客隔离或多拨。', en: 'multicast, guest isolation, or multi-WAN.' },
'组播注意事项': { zh: '组播注意事项', en: 'Multicast notes' },
'终端': { zh: '终端', en: 'Terminal' },
'终端守护没起来:systemctl start drouter-shelld(容器形态无 systemd,重启容器即可)': { zh: '终端守护没起来:systemctl start drouter-shelld(容器形态无 systemd,重启容器即可)', en: 'The terminal daemon is not running: systemctl start drouter-shelld (in a container there is no systemd — restarting the container is enough)' },
'终端执行即可。': { zh: '终端执行即可。', en: 'just run it in the terminal.' },
'终端输入': { zh: '终端输入', en: 'Terminal input' },
'终端输出': { zh: '终端输出', en: 'Terminal output' },
'终端(本机': { zh: '终端(本机', en: 'Terminal (local' },
'绑定地址': { zh: '绑定地址', en: 'Bind Address' },
'绑定,并记录其': { zh: '绑定,并记录其', en: 'binding, and record its' },
'结束地址': { zh: '结束地址', en: 'End address' },
'结束(本地)': { zh: '结束(本地)', en: 'End (local)' },
'结构化日志': { zh: '结构化日志', en: 'Structured Logs' },
'结构化日志(': { zh: '结构化日志(', en: 'Structured logs (' },
'结果': { zh: '结果', en: 'Result' },
'结论:': { zh: '结论:', en: 'Conclusion:' },
'给内网发地址': { zh: '给内网发地址', en: 'Hand out addresses to the LAN' },
'给指定设备设「保证带宽」与「峰值带宽」。保证带宽是该设备最低能拿到的速率,峰值是它在空闲时可借用的上限。': { zh: '给指定设备设「保证带宽」与「峰值带宽」。保证带宽是该设备最低能拿到的速率,峰值是它在空闲时可借用的上限。', en: 'Set the "Guaranteed Bandwidth" and "Peak Bandwidth" for a specified device. Guaranteed bandwidth is the lowest rate the device can get, and peak bandwidth is the upper limit it can borrow when bandwidth is idle.' },
'统一日志': { zh: '统一日志', en: 'Unified Logs' },
'统计': { zh: '统计', en: 'Statistics' },
'统计库大小': { zh: '统计库大小', en: 'Statistics database size' },
'缓存否定结果(': { zh: '缓存否定结果(', en: 'Cache negative results (' },
'缓存条数': { zh: '缓存条数', en: 'Cache entry count' },
'编辑': { zh: '编辑', en: 'Edit' },
'编辑主题': { zh: '编辑主题', en: 'Edit Subject' },
'缺失': { zh: '缺失', en: 'Missing' },
'缺失的一般是没启用的功能': { zh: '缺失的一般是没启用的功能', en: 'Missing ones are usually features that are not enabled' },
'缺失项': { zh: '缺失项', en: 'Missing items' },
'缺失(可选)': { zh: '缺失(可选)', en: 'missing (optional)' },
'缺失(必需)': { zh: '缺失(必需)', en: 'missing (required)' },
'缺密钥': { zh: '缺密钥', en: 'Missing key' },
'缺少内核模块:': { zh: '缺少内核模块:', en: 'Missing kernel modules:' },
'缺少工具': { zh: '缺少工具', en: 'Missing Tools' },
'网关': { zh: '网关', en: 'Gateway' },
'网关、': { zh: '网关、', en: 'gateway,' },
'网关地址(下发给客户端)': { zh: '网关地址(下发给客户端)', en: 'Gateway address (delivered to clients)' },
'网关(': { zh: '网关(', en: 'Gateway (' },
'网卡': { zh: '网卡', en: 'NIC' },
'网卡与桥接': { zh: '网卡与桥接', en: 'NICs & Bridge' },
'网卡唤醒能力': { zh: '网卡唤醒能力', en: 'NIC wake capability' },
'网卡远程唤醒 WOL': { zh: '网卡远程唤醒 WOL', en: 'Wake-on-LAN for NICs' },
'网卡(': { zh: '网卡(', en: 'NIC (' },
'网桥': { zh: '网桥', en: 'Bridge' },
'网桥、重新插入': { zh: '网桥、重新插入', en: 'bridge, re-insert' },
'网桥状态': { zh: '网桥状态', en: 'Bridge status' },
'网段(': { zh: '网段(', en: 'Subnet (' },
'网段, 容器就能拿到': { zh: '网段, 容器就能拿到', en: 'subnet, the container can obtain' },
'网络': { zh: '网络', en: 'Network' },
'网络上发现的设备(': { zh: '网络上发现的设备(', en: 'Devices Found on the Network (' },
'网络与数据卷': { zh: '网络与数据卷', en: 'Network and volumes' },
'网络后端迁移(高级)': { zh: '网络后端迁移(高级)', en: 'Network Backend Migration (Advanced)' },
'网络唤醒 (WOL)': { zh: '网络唤醒 (WOL)', en: 'Wake-on-LAN (WOL)' },
'网络已经打崩的时候,最怕的不是没有快照,是不知道该回滚哪一份': { zh: '网络已经打崩的时候,最怕的不是没有快照,是不知道该回滚哪一份', en: 'When the network is already broken, the worst thing is not having no snapshot, but not knowing which one to roll back to' },
'网络异常': { zh: '网络异常', en: 'Network error' },
'网络明细': { zh: '网络明细', en: 'Network detail' },
'网络状态': { zh: '网络状态', en: 'Network status' },
'网络状态 / 加速': { zh: '网络状态 / 加速', en: 'Network Status / Acceleration' },
'网络状态 · NAT 检测 · 软加速': { zh: '网络状态 · NAT 检测 · 软加速', en: 'Network Status · NAT Detection · Software Acceleration' },
'网络相关配置在服务重启瞬间可能短暂中断。': { zh: '网络相关配置在服务重启瞬间可能短暂中断。', en: 'Network-related configuration may be briefly interrupted at the moment the service restarts.' },
'网络类改动会导致连接中断': { zh: '网络类改动会导致连接中断', en: 'Network-related changes cause connection interruptions' },
'网络诊断工具': { zh: '网络诊断工具', en: 'Network Diagnostic Tools' },
'网络(': { zh: '网络(', en: 'Network (' },
'羊': { zh: '羊', en: 'Goat' },
'群机器人': { zh: '群机器人', en: 'Group bot' },
'老打印机)找不到共享,可尝试取消勾选。': { zh: '老打印机)找不到共享,可尝试取消勾选。', en: 'old printers) cannot find the share, try unchecking it.' },
'耗时': { zh: '耗时', en: 'Elapsed time' },
'联动影响': { zh: '联动影响', en: 'Interaction effects' },
'联系人': { zh: '联系人', en: 'Contact' },
'聚合定时器': { zh: '聚合定时器', en: 'Aggregation timer' },
'聚合间隔': { zh: '聚合间隔', en: 'Aggregation interval' },
'能 ping': { zh: '能 ping', en: 'can ping' },
'能互通但上不了': { zh: '能互通但上不了', en: 'can communicate with each other but cannot access the' },
'能加密,但浏览器不认识它,所以会提示「不安全」。 想消除提示,在下面建一个自己的': { zh: '能加密,但浏览器不认识它,所以会提示「不安全」。 想消除提示,在下面建一个自己的', en: 'can encrypt, but the browser does not recognize it, so it reports "Not secure". To remove that notice, create your own' },
'能打开网址': { zh: '能打开网址', en: 'can open websites' },
'腊': { zh: '腊', en: '12' },
'腾讯': { zh: '腾讯', en: 'Tencent' },
'腾讯云': { zh: '腾讯云', en: 'Tencent Cloud' },
'自': { zh: '自', en: 'Self-' },
'自动': { zh: '自动', en: 'Auto' },
'自动从上级': { zh: '自动从上级', en: 'Automatically from the upstream' },
'自动刷新日志(每': { zh: '自动刷新日志(每', en: 'to auto-refresh the log (every' },
'自动备份': { zh: '自动备份', en: 'Auto backup' },
'自动备份连续失败': { zh: '自动备份连续失败', en: 'Automatic backup failing repeatedly' },
'自动实时刷新(每': { zh: '自动实时刷新(每', en: 'Real-time auto refresh (every' },
'自动快照': { zh: '自动快照', en: 'Automatic Snapshots' },
'自动快照正在按计划运行': { zh: '自动快照正在按计划运行', en: 'Automatic snapshots are running on schedule' },
'自动快照连续失败': { zh: '自动快照连续失败', en: 'Automatic snapshot failing repeatedly' },
'自动接管新': { zh: '自动接管新', en: 'Automatically take over new' },
'自动更新定时器': { zh: '自动更新定时器', en: 'Auto update timer' },
'自动清理不会删除它': { zh: '自动清理不会删除它', en: 'Automatic cleanup will not delete it' },
'自动清理策略': { zh: '自动清理策略', en: 'Auto cleanup policy' },
'自动清理规则': { zh: '自动清理规则', en: 'Automatic Cleanup Rules' },
'自动滚动(每': { zh: '自动滚动(每', en: 'to auto-scroll (every' },
'自动算(推荐)': { zh: '自动算(推荐)', en: 'Auto-calculated (recommended)' },
'自动聚合已开启但定时器没在跑。': { zh: '自动聚合已开启但定时器没在跑。', en: 'Automatic aggregation is enabled but the timer is not running.' },
'自动聚合未启用,新流量不会被统计。': { zh: '自动聚合未启用,新流量不会被统计。', en: 'Automatic aggregation is not enabled, new traffic will not be counted.' },
'自动获取、静态地址三种模式,可一键切换(切换会影响全网)。': { zh: '自动获取、静态地址三种模式,可一键切换(切换会影响全网)。', en: 'automatic acquisition, and static address: three modes, switchable with one click (switching affects the whole network).' },
'自动跟随': { zh: '自动跟随', en: 'follow automatically' },
'自动跟随最新输出': { zh: '自动跟随最新输出', en: 'Automatically follow the latest output' },
'自动选择': { zh: '自动选择', en: 'Auto select' },
'自动链路本地(auto link-local)': { zh: '自动链路本地(auto link-local)', en: 'Auto link-local (auto link-local)' },
'自动(': { zh: '自动(', en: 'automatic (' },
'自定义': { zh: '自定义', en: 'Custom' },
'自定义 CSS 不允许使用 @ 规则(如 @import / @media)': { zh: '自定义 CSS 不允许使用 @ 规则(如 @import / @media)', en: 'Custom CSS may not use at-rules (such as @import / @media)' },
'自定义 CSS 不允许使用转义字符': { zh: '自定义 CSS 不允许使用转义字符', en: 'Custom CSS may not use escape characters' },
'自定义 CSS 不允许外部引用': { zh: '自定义 CSS 不允许外部引用', en: 'Custom CSS may not use external references' },
'自定义 CSS 存在空选择器': { zh: '自定义 CSS 存在空选择器', en: 'The custom CSS contains an empty selector' },
'自定义 CSS 结构过于复杂': { zh: '自定义 CSS 结构过于复杂', en: 'The custom CSS structure is too complex' },
'自定义 CSS 语法不正确:应为「选择器 { 属性: 取值; }」形式': { zh: '自定义 CSS 语法不正确:应为「选择器 { 属性: 取值; }」形式', en: 'Custom CSS syntax is wrong: it must look like "selector { prop: value; }"' },
'自定义 CSS 选择器包含非法字符': { zh: '自定义 CSS 选择器包含非法字符', en: 'A custom CSS selector contains illegal characters' },
'自定义 URL': { zh: '自定义 URL', en: 'Custom URL' },
'自定义允许的网段': { zh: '自定义允许的网段', en: 'Custom Allowed Subnets' },
'自定义公共': { zh: '自定义公共', en: 'Custom public' },
'自定义前缀': { zh: '自定义前缀', en: 'Custom prefix' },
'自定义前缀:填写你自己搭建或信任的加速服务地址,需以 / 结尾。': { zh: '自定义前缀:填写你自己搭建或信任的加速服务地址,需以 / 结尾。', en: 'Custom prefix: enter the address of an acceleration service you run yourself or trust; it must end with /.' },
'自定义镜像源': { zh: '自定义镜像源', en: 'Custom image registry' },
'自带': { zh: '自带', en: 'Built-in' },
'自签(浏览器会提示)': { zh: '自签(浏览器会提示)', en: 'Self-signed (the browser will warn)' },
'至': { zh: '至', en: 'to' },
'至少要改动 1 个变量': { zh: '至少要改动 1 个变量', en: 'Change at least one variable' },
'芒种': { zh: '芒种', en: 'Grain in Ear' },
'若「防火墙」源为空,请检查防火墙日志开关。</p></div>': { zh: '若「防火墙」源为空,请检查防火墙日志开关。</p></div>', en: 'if the "firewall" source is empty, check the firewall log switch.</p></div>' },
'若你依赖下列任一功能,建议先保持关闭。': { zh: '若你依赖下列任一功能,建议先保持关闭。', en: 'If you rely on any of the following features, it is recommended to keep it disabled for now.' },
'若提示 out of pty devices,通常是 /dev/ptmx 缺失(容器/虚拟化环境常见)。': { zh: '若提示 out of pty devices,通常是 /dev/ptmx 缺失(容器/虚拟化环境常见)。', en: 'If it says "out of pty devices", /dev/ptmx is usually missing (common in containers and virtualised environments).' },
'范例说明:': { zh: '范例说明:', en: 'Example notes:' },
'范例:': { zh: '范例:', en: 'Example:' },
'获取': { zh: '获取', en: 'Acquire' },
'获取的地址,建议在正式切换时改为静态。': { zh: '获取的地址,建议在正式切换时改为静态。', en: 'addresses obtained, it is recommended to change to static when officially switching.' },
'获取组播电视流,需要:': { zh: '获取组播电视流,需要:', en: 'To obtain multicast TV streams, you need:' },
'虎': { zh: '虎', en: 'Tiger' },
'虚拟机': { zh: '虚拟机', en: 'Virtual Machine' },
'虚拟网卡': { zh: '虚拟网卡', en: 'Virtual NIC' },
'虚拟设备再排队 (这是': { zh: '虚拟设备再排队 (这是', en: 'virtual device then queues again (this is' },
'蛇': { zh: '蛇', en: 'Snake' },
'行为(全锥型': { zh: '行为(全锥型', en: 'behavior (full cone' },
'补全:': { zh: '补全:', en: 'to complete:' },
'补到哪条记录(可选,用来补全': { zh: '补到哪条记录(可选,用来补全', en: 'which record to patch (optional, used to complete' },
'表': { zh: '表', en: 'Table' },
'表与链的骨架(一般保持启用)': { zh: '表与链的骨架(一般保持启用)', en: 'backbone of tables and chains (generally kept enabled)' },
'表头背景': { zh: '表头背景', en: 'Table header background' },
'表示主域名': { zh: '表示主域名', en: 'indicates the primary domain name' },
'表示关闭': { zh: '表示关闭', en: 'means disabled' },
'表示掩码是': { zh: '表示掩码是', en: 'means the mask is' },
'被跳过的': { zh: '被跳过的', en: 'skipped' },
'装包时可能要等十几秒。': { zh: '装包时可能要等十几秒。', en: 'Installing the package may take ten seconds or so.' },
'装进手机': { zh: '装进手机', en: 'to install on your phone' },
'要不要用': { zh: '要不要用', en: 'whether to use' },
'要导出的主题': { zh: '要导出的主题', en: 'themes to export' },
'覆盖当前的': { zh: '覆盖当前的', en: 'overwrite the current' },
'覆盖的名称:': { zh: '覆盖的名称:', en: 'Overridden Name:' },
'规则': { zh: '规则', en: 'rules' },
'规则会立即加载到内核(表': { zh: '规则会立即加载到内核(表', en: 'the rules will be loaded into the kernel immediately (table' },
'规则内容(可直接编辑)': { zh: '规则内容(可直接编辑)', en: 'Rule Content (Directly Editable)' },
'规则名称': { zh: '规则名称', en: 'Rule name' },
'规则后,': { zh: '规则后,', en: 'rules,' },
'规则已载入': { zh: '规则已载入', en: 'Rules loaded' },
'规则库': { zh: '规则库', en: 'ruleset' },
'规则未载入': { zh: '规则未载入', en: 'Rules not loaded' },
'规则片段,仅显示与端口转发相关的部分。': { zh: '规则片段,仅显示与端口转发相关的部分。', en: 'rules fragment, showing only the parts related to port forwarding.' },
'规则预览(将会写入内核)': { zh: '规则预览(将会写入内核)', en: 'Rules preview (will be written to the kernel)' },
'规则预览(将会写入防火墙)': { zh: '规则预览(将会写入防火墙)', en: 'Rules preview (will be written to the firewall)' },
'规则,可直接核对时间换算与星期映射是否正确。': { zh: '规则,可直接核对时间换算与星期映射是否正确。', en: 'rules, so you can directly verify whether the time conversion and weekday mapping are correct.' },
'规则,等于白开': { zh: '规则,等于白开', en: 'rule, which is equivalent to leaving it open' },
'规范化为同一种记录结构': { zh: '规范化为同一种记录结构', en: 'Normalize into a Unified Record Structure' },
'解析中…': { zh: '解析中…', en: 'Parsing…' },
'解析成功': { zh: '解析成功', en: 'Parsed Successfully' },
'解析测试': { zh: '解析测试', en: 'Resolution test' },
'解锁': { zh: '解锁', en: 'Unlock' },
'触发方式': { zh: '触发方式', en: 'Trigger method' },
'警告': { zh: '警告', en: 'Warning' },
'警告浅底': { zh: '警告浅底', en: 'Warning tint' },
'警告色': { zh: '警告色', en: 'Warning colour' },
'计数器, 累计值(本次开机以来)。「发送失败」「丢弃的包」非': { zh: '计数器, 累计值(本次开机以来)。「发送失败」「丢弃的包」非', en: 'counters, cumulative values (since the current boot). "Send failures" and "Dropped packets" are not' },
'让容器网络支持': { zh: '让容器网络支持', en: 'Make container networking support' },
'让网管软件能采集本机指标。默认关闭': { zh: '让网管软件能采集本机指标。默认关闭', en: 'allows network management software to collect local metrics. Disabled by default' },
'记录': { zh: '记录', en: 'Log' },
'记录类型': { zh: '记录类型', en: 'Record type' },
'记录被拒绝': { zh: '记录被拒绝', en: 'records rejected' },
'记录谁在什么时间改了什么配置。': { zh: '记录谁在什么时间改了什么配置。', en: 'record who changed which configuration at what time.' },
'设为默认': { zh: '设为默认', en: 'Set as Default' },
'设备': { zh: '设备', en: 'Device' },
'设备名称': { zh: '设备名称', en: 'Device name' },
'设备名称,比如「我的手机」': { zh: '设备名称,比如「我的手机」', en: 'Device name, e.g. "My Phone"' },
'设备地址': { zh: '设备地址', en: 'Device Address' },
'设备已创建。配置含私钥, 请点上方窗口里的「下载配置文件」保存到本地。': { zh: '设备已创建。配置含私钥, 请点上方窗口里的「下载配置文件」保存到本地。', en: 'Device created. The configuration contains the private key; click "Download Configuration File" in the window above to save it locally.' },
'设备组': { zh: '设备组', en: 'Device group' },
'设置已保存(该页面没有独立的配置文件需要渲染,': { zh: '设置已保存(该页面没有独立的配置文件需要渲染,', en: 'Settings saved (this page has no configuration file of its own to render,' },
'设置已保存,但定时器未成功启用(详见下方状态表)': { zh: '设置已保存,但定时器未成功启用(详见下方状态表)', en: 'The settings were saved, but the timer could not be enabled (see the status table below)' },
'设置已保存,但定时器未成功启用,请看页面顶部': { zh: '设置已保存,但定时器未成功启用,请看页面顶部', en: 'The settings were saved, but the timer could not be enabled; see the top of the page' },
'设置已保存,但定时器未成功启用,请看页面顶部的状态': { zh: '设置已保存,但定时器未成功启用,请看页面顶部的状态', en: 'The settings were saved, but the timer could not be enabled; see the status at the top of the page' },
'访客网络': { zh: '访客网络', en: 'Guest network' },
'访客隔离': { zh: '访客隔离', en: 'Guest isolation' },
'访问令牌': { zh: '访问令牌', en: 'Access Token' },
'访问控制': { zh: '访问控制', en: 'Access control' },
'访问控制 / 时间组': { zh: '访问控制 / 时间组', en: 'Access Control / Time Groups' },
'访问控制与家长时间组': { zh: '访问控制与家长时间组', en: 'Access Control & Parental Time Groups' },
'访问控制基于「设备组': { zh: '访问控制基于「设备组', en: 'Access control is based on "Device group' },
'访问方式': { zh: '访问方式', en: 'Access method' },
'访问范围': { zh: '访问范围', en: 'Access Scope' },
'访问范围仅影响管理后台的防火墙放行策略;改完请点击右上角「保存并应用」。': { zh: '访问范围仅影响管理后台的防火墙放行策略;改完请点击右上角「保存并应用」。', en: 'Access scope only affects the firewall allow policy of the management backend; after changing it, click "Save and Apply" in the top-right corner.' },
'访问范围已改为「': { zh: '访问范围已改为「', en: 'Access scope set to "' },
'访问规则': { zh: '访问规则', en: 'Access rules' },
'证书': { zh: '证书', en: 'Certificate' },
'证书 / SSL': { zh: '证书 / SSL', en: 'Certificates / SSL' },
'证书主体': { zh: '证书主体', en: 'Certificate subject' },
'证书主题': { zh: '证书主题', en: 'Certificate Subject' },
'证书库': { zh: '证书库', en: 'Certificate Library' },
'证书库是空的。先在下面「① 创建自己的 CA」建一张。': { zh: '证书库是空的。先在下面「① 创建自己的 CA」建一张。', en: 'The certificate library is empty. Create one under "① Create Your Own CA" below.' },
'证书库索引文件损坏,列表可能不完整。新建证书会重建它。': { zh: '证书库索引文件损坏,列表可能不完整。新建证书会重建它。', en: 'The certificate library index file is corrupted, so the list may be incomplete. Creating a certificate will rebuild it.' },
'证书文件缺失或无法解析': { zh: '证书文件缺失或无法解析', en: 'Certificate File Is Missing or Cannot Be Parsed' },
'证书用来签发;服务器证书可以直接部署给管理后台; 证书签名请求(': { zh: '证书用来签发;服务器证书可以直接部署给管理后台; 证书签名请求(', en: 'certificate is used to issue; server certificates can be deployed directly to the management backend; Certificate Signing Request (' },
'证书)': { zh: '证书)', en: 'certificate)' },
'识别具体应用, 只能靠': { zh: '识别具体应用, 只能靠', en: 'identify specific applications, which can only rely on' },
'识别引擎状态': { zh: '识别引擎状态', en: 'Recognition engine status' },
'试运行': { zh: '试运行', en: 'Dry run' },
'试,前一个失败就换下一个。': { zh: '试,前一个失败就换下一个。', en: 'try; if the previous one fails, switch to the next.' },
'该功能': { zh: '该功能', en: 'This feature' },
'该变量不支持 vh / vw 单位': { zh: '该变量不支持 vh / vw 单位', en: 'This variable does not support vh / vw units' },
'该客户端会暂时断网,下次续租时将重新分配地址。': { zh: '该客户端会暂时断网,下次续租时将重新分配地址。', en: 'This client will be temporarily disconnected, and a new address will be assigned at the next lease renewal.' },
'该服务商无需额外凭据。': { zh: '该服务商无需额外凭据。', en: 'This provider requires no additional credentials.' },
'该端口当前被其他程序占用': { zh: '该端口当前被其他程序占用', en: 'This port is currently in use by another program' },
'该范围内没有命中记录(这是好事:说明没有异常流量被拒绝)。': { zh: '该范围内没有命中记录(这是好事:说明没有异常流量被拒绝)。', en: 'There are no matching records in this range (which is good: it means no abnormal traffic was rejected).' },
'该设备尚未挂载': { zh: '该设备尚未挂载', en: 'This device is not mounted yet' },
'该设备组的全部流量': { zh: '该设备组的全部流量', en: 'All traffic of this device group' },
'详情': { zh: '详情', en: 'Details' },
'语法。应用前会自动执行': { zh: '语法。应用前会自动执行', en: 'syntax. Before applying, the system automatically runs a' },
'语法预检, 失败会阻止应用并保留现有规则;应用前自动创建快照,可一键回滚。': { zh: '语法预检, 失败会阻止应用并保留现有规则;应用前自动创建快照,可一键回滚。', en: 'syntax pre-check; a failure blocks the apply and keeps the existing rules; a snapshot is created automatically before applying and can be rolled back with one click.' },
'说明': { zh: '说明', en: 'Description' },
'说明:以下每一行都以': { zh: '说明:以下每一行都以', en: 'Note: each of the following lines starts with' },
'说服务在跑,但': { zh: '说服务在跑,但', en: 'says the service is running, but' },
'请上传公钥(': { zh: '请上传公钥(', en: 'Please upload the public key (' },
'请优先用上面的专属字段': { zh: '请优先用上面的专属字段', en: 'Please prefer the dedicated fields above' },
'请先修正问题再导出': { zh: '请先修正问题再导出', en: 'Fix the problems before exporting' },
'请先创建一张 CA 证书': { zh: '请先创建一张 CA 证书', en: 'Please Create a CA Certificate First' },
'请先到「日志与审计 → 连接与流日志」确认统一日志已启用,': { zh: '请先到「日志与审计 → 连接与流日志」确认统一日志已启用,', en: 'First go to "Logs & Audit → Connection & Flow Logs" and make sure unified logging is enabled,' },
'请先到「网卡与桥接」页把某个网口的角色设为 WAN,': { zh: '请先到「网卡与桥接」页把某个网口的角色设为 WAN,', en: 'Please go to the "NICs and Bridging" page first and set the role of one port to WAN,' },
'请先勾选确认项': { zh: '请先勾选确认项', en: 'Please tick the confirmation box first' },
'请先填写设备名称': { zh: '请先填写设备名称', en: 'Please fill in the device name' },
'请先填写项目名': { zh: '请先填写项目名', en: 'Please fill in the project name first' },
'请先生成至少 1 条会话': { zh: '请先生成至少 1 条会话', en: 'Please generate at least one session first' },
'请先粘贴或选择公钥内容': { zh: '请先粘贴或选择公钥内容', en: 'Please paste or select the public key first' },
'请先选择一个文件或填写路径': { zh: '请先选择一个文件或填写路径', en: 'Please select a file or enter a path first' },
'请先选择一份备份': { zh: '请先选择一份备份', en: 'Please select a backup first' },
'请先选择接宽带的网卡': { zh: '请先选择接宽带的网卡', en: 'Please select the NIC connected to the broadband line first' },
'请先选择父网卡': { zh: '请先选择父网卡', en: 'Please select a parent interface first' },
'请到「网卡与桥接」把外网网卡角色设为 WAN。配置可先保存,应用时会给出提示。': { zh: '请到「网卡与桥接」把外网网卡角色设为 WAN。配置可先保存,应用时会给出提示。', en: 'Go to "Interfaces and Bridges" and set the external network interface role to WAN. The configuration can be saved first; a prompt will be shown when applying.' },
'请在「紧急救援通道 → 可回滚的快照」里挑选并回滚': { zh: '请在「紧急救援通道 → 可回滚的快照」里挑选并回滚', en: 'Please pick one under "Emergency Rescue Channel → Rollbackable Snapshots" and roll back' },
'请在上方选择工具并执行。': { zh: '请在上方选择工具并执行。', en: 'Please select a tool above and run it.' },
'请在下方的「': { zh: '请在下方的「', en: 'please enter " below' },
'请在虚拟机平台中为该主机添加第二张网卡,然后在「网卡与桥接」页面将其角色设为 WAN。 在此之前,下面填写的 PPPoE 凭据只会被保存,不会执行拨号。': { zh: '请在虚拟机平台中为该主机添加第二张网卡,然后在「网卡与桥接」页面将其角色设为 WAN。 在此之前,下面填写的 PPPoE 凭据只会被保存,不会执行拨号。', en: 'Add a second network interface to this host in the virtual machine platform, then set its role to WAN on the "Interfaces and Bridges" page. Until then, the PPPoE credentials entered below will only be saved and no dialing will be performed.' },
'请填写主题名称': { zh: '请填写主题名称', en: 'Please fill in the theme name' },
'请填写包名': { zh: '请填写包名', en: 'Please fill in the package name' },
'请填写域名': { zh: '请填写域名', en: 'Please Enter a Domain Name' },
'请填写要测试的主机': { zh: '请填写要测试的主机', en: 'Please Enter the Host to Test' },
'请填写设备地址': { zh: '请填写设备地址', en: 'Please fill in the device address' },
'请填写队列名': { zh: '请填写队列名', en: 'Please fill in the queue name' },
'请换一个不重叠的地址池。</div>': { zh: '请换一个不重叠的地址池。</div>', en: 'Please pick a non-overlapping address pool.</div>' },
'请检查本机外网连通性': { zh: '请检查本机外网连通性', en: 'Check this host’s internet connectivity' },
'请求前缀委派(': { zh: '请求前缀委派(', en: 'Request prefix delegation (' },
'请求前缀长度': { zh: '请求前缀长度', en: 'Requested prefix length' },
'请求被中断,可能是在页面切换时自动取消': { zh: '请求被中断,可能是在页面切换时自动取消', en: 'The request was aborted — it was probably cancelled when the page changed' },
'请确认你已经准备好执行切换。': { zh: '请确认你已经准备好执行切换。', en: 'Please confirm that you are ready to perform the switch.' },
'请确认管理后台进程正常': { zh: '请确认管理后台进程正常', en: 'Please check that the admin service is running' },
'请输入': { zh: '请输入', en: 'Please enter' },
'请输入 docker run 命令': { zh: '请输入 docker run 命令', en: 'Please enter a docker run command' },
'请输入项目名以确认删除:': { zh: '请输入项目名以确认删除:', en: 'Please enter the project name to confirm deletion:' },
'请选择 .zip 主题包(由「导出」按钮生成的那种)': { zh: '请选择 .zip 主题包(由「导出」按钮生成的那种)', en: 'Please choose a .zip theme package (the kind produced by the "Export" button)' },
'请选择一个安装包': { zh: '请选择一个安装包', en: 'Please pick a package' },
'请选择网卡': { zh: '请选择网卡', en: 'Select a network interface' },
'读取': { zh: '读取', en: 'Read' },
'读取中': { zh: '读取中', en: 'Reading' },
'读取中…': { zh: '读取中…', en: 'Loading…' },
'读取主题失败:': { zh: '读取主题失败:', en: 'Failed to read the theme: ' },
'读取备份包失败': { zh: '读取备份包失败', en: 'Failed to Read the Backup Package' },
'读取失败': { zh: '读取失败', en: 'Failed to read' },
'读取失败:': { zh: '读取失败:', en: 'Failed to read: ' },
'读取日志失败': { zh: '读取日志失败', en: 'Failed to read the log' },
'读取本地文件失败': { zh: '读取本地文件失败', en: 'Failed to read the local file' },
'读取自动备份状态失败': { zh: '读取自动备份状态失败', en: 'Failed to Read the Automatic Backup Status' },
'读取连接表失败': { zh: '读取连接表失败', en: 'Failed to read the connection table' },
'谁用了多少流量': { zh: '谁用了多少流量', en: 'Who used how much traffic' },
'谁(设备组)': { zh: '谁(设备组)', en: 'Who (device group)' },
'调整。': { zh: '调整。', en: 'adjustment.' },
'谷雨': { zh: '谷雨', en: 'Grain Rain' },
'负责': { zh: '负责', en: 'Responsible for' },
'负责公平分流与抗': { zh: '负责公平分流与抗', en: 'Handles fair traffic splitting and anti-' },
'负责按': { zh: '负责按', en: 'Splits traffic according to' },
'负载 / 带宽 / 连接': { zh: '负载 / 带宽 / 连接', en: 'Load / Bandwidth / Connections' },
'负载策略': { zh: '负载策略', en: 'load balancing policy' },
'账号': { zh: '账号', en: 'Account' },
'账号通常是你办理宽带时的「宽带账号」或手机号, 电信多为': { zh: '账号通常是你办理宽带时的「宽带账号」或手机号, 电信多为', en: 'The account is usually the broadband account you used when signing up, or your mobile number. China Telecom is mostly' },
'起始地址': { zh: '起始地址', en: 'Starting address' },
'起累计': { zh: '起累计', en: ' onwards' },
'超时': { zh: '超时', en: 'Timed out' },
'超过': { zh: '超过', en: 'Exceeds' },
'足够;调大反而会占用内存。': { zh: '足够;调大反而会占用内存。', en: 'is enough; increasing it instead consumes memory.' },
'跟随 WAN 口': { zh: '跟随 WAN 口', en: 'Follow the WAN port' },
'跟随运营商下发': { zh: '跟随运营商下发', en: 'Follow the value pushed down by the ISP' },
'跨域支持': { zh: '跨域支持', en: 'Cross-domain support' },
'路径': { zh: '路径', en: 'Path' },
'路径仅允许位于': { zh: '路径仅允许位于', en: 'Path may only be located under' },
'路径已复制:': { zh: '路径已复制:', en: 'Path copied: ' },
'路由与地址前缀。': { zh: '路由与地址前缀。', en: 'routes and address prefixes.' },
'路由器常年不关机,日志与缓存会一直长。这里按「可再生产物」分类回收': { zh: '路由器常年不关机,日志与缓存会一直长。这里按「可再生产物」分类回收', en: 'The router stays on year-round, so logs and cache keep growing. They are reclaimed here by "reproducible artifact" category' },
'路由服务': { zh: '路由服务', en: 'Routing service' },
'路由表': { zh: '路由表', en: 'Routing table' },
'路由追踪': { zh: '路由追踪', en: 'Traceroute' },
'路由通告服务': { zh: '路由通告服务', en: 'Routing announcement service' },
'跳数限制': { zh: '跳数限制', en: 'Hop Limit' },
'跳板': { zh: '跳板', en: 'Jump host' },
'转为静态': { zh: '转为静态', en: 'Convert to Static' },
'转为项目并填入上方': { zh: '转为项目并填入上方', en: 'Convert to a project and fill in the field above' },
'转到内网': { zh: '转到内网', en: 'Forward to the LAN' },
'转发': { zh: '转发', en: 'Forwarding' },
'转发开关': { zh: '转发开关', en: 'Forwarding toggle' },
'转发用于上级做过前缀转换的场景。': { zh: '转发用于上级做过前缀转换的场景。', en: 'Forwarding applies to cases where the upstream has already done prefix translation.' },
'转发,不分配地址。构建阶段默认关闭,避免与现有网络中的': { zh: '转发,不分配地址。构建阶段默认关闭,避免与现有网络中的', en: 'forwarding without assigning addresses. Disabled by default at build time to avoid clashing with' },
'转换': { zh: '转换', en: 'Translate' },
'转换失败': { zh: '转换失败', en: 'Conversion failed' },
'轮转件': { zh: '轮转件', en: 'Rotated files' },
'轮转,历史连接与流量日志仍可追溯。': { zh: '轮转,历史连接与流量日志仍可追溯。', en: 'rotation, historical connections and traffic logs remain traceable.' },
'软件包': { zh: '软件包', en: 'packages' },
'软加速对 IPv4 / IPv6 的作用范围': { zh: '软加速对 IPv4 / IPv6 的作用范围', en: 'Scope of Software Acceleration for IPv4 / IPv6' },
'软加速已关闭': { zh: '软加速已关闭', en: 'Software Acceleration Is Disabled' },
'软加速已开启': { zh: '软加速已开启', en: 'Software Acceleration Is Enabled' },
'软加速(': { zh: '软加速(', en: 'Software acceleration (' },
'载入中': { zh: '载入中', en: 'Loading' },
'载入中…': { zh: '载入中…', en: 'Loading…' },
'载入失败': { zh: '载入失败', en: 'Failed to Load' },
'载入已有': { zh: '载入已有', en: 'Load existing' },
'载入接口清单与范例': { zh: '载入接口清单与范例', en: 'Load the interface list and examples' },
'输入': { zh: '输入', en: 'Input' },
'输入目标设备的': { zh: '输入目标设备的', en: 'Enter the target device\'s' },
'输出': { zh: '输出', en: 'Output' },
'输出结果': { zh: '输出结果', en: 'Output result' },
'辛': { zh: '辛', en: 'Xin' },
'辰': { zh: '辰', en: 'Chen' },
'边框': { zh: '边框', en: 'Border' },
'过期时间(天后自动删除)': { zh: '过期时间(天后自动删除)', en: 'Expiration Time (Auto-delete After N Days)' },
'运营商': { zh: '运营商', en: 'ISP' },
'运营商分配固定公网 IP,手动配置地址、网关与 DNS,常见于企业专线。': { zh: '运营商分配固定公网 IP,手动配置地址、网关与 DNS,常见于企业专线。', en: 'The ISP assigns a fixed public IP; configure the address, gateway and DNS yourself. Common on enterprise leased lines.' },
'运营商已下发 IPv6': { zh: '运营商已下发 IPv6', en: 'The ISP has assigned IPv6' },
'运营商已经给你的宽带下发了 IPv6 地址,可以放心打开。': { zh: '运营商已经给你的宽带下发了 IPv6 地址,可以放心打开。', en: 'Your ISP has already assigned an IPv6 address to your broadband connection, so you can safely turn this on.' },
'运营商提供的密码': { zh: '运营商提供的密码', en: 'Password Provided by the ISP' },
'运营商是否下发': { zh: '运营商是否下发', en: 'whether the carrier delivers' },
'运营商模板': { zh: '运营商模板', en: 'ISP Template' },
'运行中': { zh: '运行中', en: 'Running' },
'运行中(5900 监听)': { zh: '运行中(5900 监听)', en: 'Running (listening on 5900)' },
'运行依赖自检与一键安装': { zh: '运行依赖自检与一键安装', en: 'Run the dependency check and install in one click' },
'运行环境': { zh: '运行环境', en: 'Runtime environment' },
'运行环境依赖自检': { zh: '运行环境依赖自检', en: 'Runtime environment dependency self-check' },
'还原': { zh: '还原', en: 'Restore' },
'还原 daemon.json': { zh: '还原 daemon.json', en: 'Restore daemon.json' },
'还原失败': { zh: '还原失败', en: 'Restore failed' },
'还原完成': { zh: '还原完成', en: 'Restore finished' },
'还原这份备份': { zh: '还原这份备份', en: 'Restore this backup' },
'还原预检结果': { zh: '还原预检结果', en: 'Restore preflight result' },
'还差 ': { zh: '还差 ', en: 'Still missing ' },
'还差几步就能上网。按下面的顺序一步步来,每步做完都能看到结果。': { zh: '还差几步就能上网。按下面的顺序一步步来,每步做完都能看到结果。', en: 'A few steps left before you are online. Go through them in order — each one shows you the result as soon as it finishes.' },
'还是内核真不支持,并提供一键修复。</div>': { zh: '还是内核真不支持,并提供一键修复。</div>', en: 'or the kernel genuinely lacks support, and offers a one-click fix.</div>' },
'还没启用': { zh: '还没启用', en: 'Not enabled yet' },
'还没完成的:': { zh: '还没完成的:', en: 'Not finished yet:' },
'还没找到统一日志归档文件。': { zh: '还没找到统一日志归档文件。', en: 'No unified log archive file has been found yet.' },
'还没把它写进 printers.conf,重启 CUPS 或重启机器后才会固定下来': { zh: '还没把它写进 printers.conf,重启 CUPS 或重启机器后才会固定下来', en: 'It has not been written into printers.conf yet; it will only stick after restarting CUPS or rebooting the machine' },
'还没拿到 IPv6 地址': { zh: '还没拿到 IPv6 地址', en: 'No IPv6 address obtained yet' },
'还没指定': { zh: '还没指定', en: 'Not Specified Yet' },
'还没有 AP 注册进来。': { zh: '还没有 AP 注册进来。', en: 'No AP has registered yet.' },
'还没有任何告警记录。': { zh: '还没有任何告警记录。', en: 'There are no alert records yet.' },
'还没有任何打印队列。可以在下面添加一个,': { zh: '还没有任何打印队列。可以在下面添加一个,', en: 'There are no print queues yet. You can add one below,' },
'还没有安装 Docker': { zh: '还没有安装 Docker', en: 'Docker is not installed yet' },
'还没有客户端。在下面填个设备名称就能创建。': { zh: '还没有客户端。在下面填个设备名称就能创建。', en: 'There are no clients yet. Enter a device name below and one will be created.' },
'还没有导出过备份包。上面点一次「导出备份包」就会出现在这里。': { zh: '还没有导出过备份包。上面点一次「导出备份包」就会出现在这里。', en: 'No backup package has been exported yet. Click "Export backup package" above once and it will appear here.' },
'还没有添加任何通知通道。': { zh: '还没有添加任何通知通道。', en: 'No notification channels have been added yet.' },
'还没有项目。用下面的编辑框创建一个。': { zh: '还没有项目。用下面的编辑框创建一个。', en: 'There are no projects yet. Use the edit box below to create one.' },
'还没有(说明还没连上外网)': { zh: '还没有(说明还没连上外网)', en: 'Not yet (meaning the Internet connection is not up yet)' },
'还没装。它不是 apt 包,请在下面「安装」里装。': { zh: '还没装。它不是 apt 包,请在下面「安装」里装。', en: 'Not installed yet. It is not an apt package; please install it under "Install" below.' },
'还没设置': { zh: '还没设置', en: 'Not Set Yet' },
'建议开启': { zh: '建议开启', en: 'Recommended' },
'内网设备的地址由这里开始分配。填错了轻则上不了网,重则和上游路由器打架。': { zh: '内网设备的地址由这里开始分配。填错了轻则上不了网,重则和上游路由器打架。', en: 'This is where addresses for your LAN devices start being handed out. Get it wrong and clients either lose connectivity or fight with the upstream router.' },
'前三段必须和本机 LAN 地址一致,最后一段落在 2–254 之间。': { zh: '前三段必须和本机 LAN 地址一致,最后一段落在 2–254 之间。', en: 'The first three octets must match this host’s LAN address; the last must fall between 2 and 254.' },
'起始–结束这段不要包含本机自己的地址(否则会和本机抢 IP)。': { zh: '起始–结束这段不要包含本机自己的地址(否则会和本机抢 IP)。', en: 'The start-to-end range must not contain this host’s own address, or it will clash with the host.' },
'常见做法是让池子从 .100 开始,把 .2–.99 留给打印机、NAS 这类固定设备。': { zh: '常见做法是让池子从 .100 开始,把 .2–.99 留给打印机、NAS 这类固定设备。', en: 'A common choice is to start the pool at .100 and leave .2–.99 for fixed devices such as printers and a NAS.' },
'第 1 步:外网还没通': { zh: '第 1 步:外网还没通', en: 'Step 1 · the internet is not connected yet' },
'第 2 步:内网还没在发地址': { zh: '第 2 步:内网还没在发地址', en: 'Step 2 · the LAN is not handing out addresses yet' },
'第 3 步:DNS 还解析不出结果': { zh: '第 3 步:DNS 还解析不出结果', en: 'Step 3 · DNS lookups are not resolving yet' },
'第 4 步:IPv6 还没启用(可选)': { zh: '第 4 步:IPv6 还没启用(可选)', en: 'Step 4 · IPv6 is not enabled yet (optional)' },
'选了「跟随运营商」,但当前还没拿到运营商下发的 DNS(多半是还没拨号成功)': { zh: '选了「跟随运营商」,但当前还没拿到运营商下发的 DNS(多半是还没拨号成功)', en: 'You chose to follow the ISP, but no ISP-assigned DNS has arrived yet — most likely the line has not dialled successfully.' },
'阿里云 AliDNS': { zh: '阿里云 AliDNS', en: 'Alibaba Cloud AliDNS' },
'腾讯 DNSPod': { zh: '腾讯 DNSPod', en: 'Tencent DNSPod' },
'还没给 LAN 口配 IP 地址': { zh: '还没给 LAN 口配 IP 地址', en: 'No IP address configured on the LAN interface yet' },
'地址池起始地址({0})和本机 LAN 地址({1})不在同一个网段': { zh: '地址池起始地址({0})和本机 LAN 地址({1})不在同一个网段', en: 'The pool start address ({0}) and this host\u2019s LAN address ({1}) are not in the same subnet' },
'地址池结束地址({0})和本机 LAN 地址({1})不在同一个网段': { zh: '地址池结束地址({0})和本机 LAN 地址({1})不在同一个网段', en: 'The pool end address ({0}) and this host\u2019s LAN address ({1}) are not in the same subnet' },
'地址池把本机自己的地址({0})也包括进去了,会和本机抢 IP': { zh: '地址池把本机自己的地址({0})也包括进去了,会和本机抢 IP', en: 'The pool also contains this host\u2019s own address ({0}), which would clash with the host' },
'可以先不开': { zh: '可以先不开', en: 'Safe to skip for now' },
'还没配': { zh: '还没配', en: 'Not Configured Yet' },
'这': { zh: '这', en: 'This' },
'这一份': { zh: '这一份', en: 'This one' },
'这一步已完成': { zh: '这一步已完成', en: 'This step is done' },
'这一步没有全部成功': { zh: '这一步没有全部成功', en: 'This step did not fully succeed' },
'这一页在渲染时出错了,其余页面不受影响。': { zh: '这一页在渲染时出错了,其余页面不受影响。', en: 'This page failed to render. Other pages are unaffected.' },
'这三个值运营商都会在开通单上写给你, 照抄即可。': { zh: '这三个值运营商都会在开通单上写给你, 照抄即可。', en: 'The ISP writes all three values on the activation order for you, just copy them over.' },
'这两项最终写进防火墙规则集。本页改完后,需要到': { zh: '这两项最终写进防火墙规则集。本页改完后,需要到', en: 'These two values end up in the firewall rule set. After changing them here, go to' },
'这个包': { zh: '这个包', en: 'This package' },
'这个包已损坏,<b>已中止还原</b>。请重新导出。</div>': { zh: '这个包已损坏,<b>已中止还原</b>。请重新导出。</div>', en: 'This package is corrupted, so the restore has been <b>aborted</b>. Please export it again.</div>' },
'这个模块的界面框架已经就位,具体功能还在排期开发中。': { zh: '这个模块的界面框架已经就位,具体功能还在排期开发中。', en: 'The UI framework of this module is already in place; the actual features are still scheduled for development.' },
'这五个开关决定「这台机器到底是不是一台路由器」。 每一项都写了': { zh: '这五个开关决定「这台机器到底是不是一台路由器」。 每一项都写了', en: 'These five switches decide whether this machine really is a router. Each item documents' },
'这些': { zh: '这些', en: 'these' },
'这些是': { zh: '这些是', en: 'These are' },
'这份快照已上锁': { zh: '这份快照已上锁', en: 'This snapshot is locked' },
'这会删除服务端密钥、全部客户端配置 和防火墙放行规则。': { zh: '这会删除服务端密钥、全部客户端配置 和防火墙放行规则。', en: 'This deletes the server key, all client configurations and the firewall allow rules.' },
'这会真的向运营商发起一次拨号。如果这台机器正在承担现有网络, 拨号过程会让网络短暂中断几十秒。': { zh: '这会真的向运营商发起一次拨号。如果这台机器正在承担现有网络, 拨号过程会让网络短暂中断几十秒。', en: 'This really does initiate a dial-up to the carrier. If this machine is currently carrying the existing network, the dialing process will interrupt the network briefly for a few tens of seconds.' },
'这几种已验证可用,覆盖了绝大多数家庭宽带与 NAS 的需求。': { zh: '这几种已验证可用,覆盖了绝大多数家庭宽带与 NAS 的需求。', en: 'These have been verified to work and cover the needs of most home broadband and NAS setups.' },
'这台机器上': { zh: '这台机器上', en: 'On this machine' },
'这台机器上没有 Docker,无需重启。配置已保存,装好 Docker 后自动生效': { zh: '这台机器上没有 Docker,无需重启。配置已保存,装好 Docker 后自动生效', en: 'Docker is not installed on this machine, so no restart is needed. The configuration is saved and will take effect once Docker is installed.' },
'这台机器已经能把内网接到外网了。下面的步骤可以随时回来复查或调整。': { zh: '这台机器已经能把内网接到外网了。下面的步骤可以随时回来复查或调整。', en: 'This machine can already connect the LAN to the internet. You can come back to review or adjust the steps any time.' },
'这台路由器自己': { zh: '这台路由器自己', en: 'the router itself' },
'这就是「游戏优先」的实现方式。 注:加密流量(': { zh: '这就是「游戏优先」的实现方式。 注:加密流量(', en: 'This is how "gaming first" is implemented. Note: encrypted traffic (' },
'这张证书': { zh: '这张证书', en: 'This certificate' },
'这是「路由器磁盘莫名爆满」最常见的原因。': { zh: '这是「路由器磁盘莫名爆满」最常见的原因。', en: 'This is the most common cause of "the router\'s disk suddenly filling up".' },
'这是什么': { zh: '这是什么', en: 'What is this' },
'这是判定用的原始数据。阈值调之前先看看这里的实际数值合不合理。': { zh: '这是判定用的原始数据。阈值调之前先看看这里的实际数值合不合理。', en: 'This is the raw data used for the verdict. Before tuning the threshold, check whether the actual values here make sense.' },
'这是最常被忽略的一步。': { zh: '这是最常被忽略的一步。', en: 'This is the most commonly overlooked step.' },
'这是最快的吊销方式。': { zh: '这是最快的吊销方式。', en: 'This is the fastest way to revoke.' },
'这是本机 shell,输入以 root / ajeef / drouter 身份执行。': { zh: '这是本机 shell,输入以 root / ajeef / drouter 身份执行。', en: 'This is a local shell; input runs as root / ajeef / drouter.' },
'这是离线预览': { zh: '这是离线预览', en: 'This is an offline preview' },
'这样从某条会话出去的回包才会从原路返回。': { zh: '这样从某条会话出去的回包才会从原路返回。', en: 'Only this way will the reply packets of a given session come back along the original path.' },
'这看起来像私钥文件,请上传 .pub 公钥': { zh: '这看起来像私钥文件,请上传 .pub 公钥', en: 'This looks like a private key file; please upload the .pub public key' },
'这种方式不需要账号密码。 把网线从光猫的': { zh: '这种方式不需要账号密码。 把网线从光猫的', en: 'This method needs no account or password. Move the network cable from the ONT\'s' },
'这类包必须妥善保管 —— 拿到包的人等于拿到你的管理后台密码和宽带账号。\\n\\n确定继续吗?': { zh: '这类包必须妥善保管 —— 拿到包的人等于拿到你的管理后台密码和宽带账号。\\n\\n确定继续吗?', en: 'Such a package must be kept safely — whoever holds it effectively has your admin password and broadband account.\\n\\nContinue?' },
'这类包必须妥善保管 —— 拿到包的人等于拿到你的管理后台密码和宽带账号。\n\n确定继续吗?': { zh: '这类包必须妥善保管 —— 拿到包的人等于拿到你的管理后台密码和宽带账号。\n\n确定继续吗?', en: 'Such a package must be kept safely — whoever holds it effectively has your admin password and broadband account.\\n\\nContinue?' },
'这类包必须妥善保管 —— 拿到包的人等于拿到你的管理后台密码和宽带账号。\\\\n\\\\n确定继续吗?': { zh: '这类包必须妥善保管 —— 拿到包的人等于拿到你的管理后台密码和宽带账号。\\\\n\\\\n确定继续吗?', en: 'Such a package must be kept safely — whoever holds it effectively has your admin password and broadband account.\\n\\nContinue?' },
'这类常驻服务的路由器来说, 这意味着相关服务会有一次短暂中断。': { zh: '这类常驻服务的路由器来说, 这意味着相关服务会有一次短暂中断。', en: 'for a router with always-on services like this, this means the relevant services will be interrupted briefly.' },
'这类需要交互的程序都能正常用,': { zh: '这类需要交互的程序都能正常用,', en: 'Interactive programs of this kind all work normally,' },
'这类)时,还需要上游路由器做': { zh: '这类)时,还需要上游路由器做', en: 'for this kind), the upstream router also needs to do' },
'这说明要么一切正常,要么告警没启用 —— 看上面的总开关。</p>': { zh: '这说明要么一切正常,要么告警没启用 —— 看上面的总开关。</p>', en: 'This means either everything is fine, or alerting is not enabled — check the master switch above.</p>' },
'这里只能说明「地址是不是公网段」,': { zh: '这里只能说明「地址是不是公网段」,', en: 'Here this only indicates whether the address is in a public range,' },
'这里导出的不是「整机镜像」,而是': { zh: '这里导出的不是「整机镜像」,而是', en: 'What is exported here is not a "full-system image", but' },
'这里就能给每台设备填「应承担百分之多少」了。</p>': { zh: '这里就能给每台设备填「应承担百分之多少」了。</p>', en: 'Here you can set what percentage of the bill each device should bear.</p>' },
'这里的「子网': { zh: '这里的「子网', en: 'the "subnet' },
'这里默认用': { zh: '这里默认用', en: 'By default this uses' },
'远程会话。': { zh: '远程会话。', en: 'remote session.' },
'远程登录': { zh: '远程登录', en: 'Remote login' },
'远程连回家里': { zh: '远程连回家里', en: 'Connect back home remotely' },
'远程连回家里访问内网与 NAS:Debian 13 内核自带 WireGuard,逐台设备发放独立配置': { zh: '远程连回家里访问内网与 NAS:Debian 13 内核自带 WireGuard,逐台设备发放独立配置', en: 'Connect back home to reach the LAN and NAS: WireGuard ships with the Debian 13 kernel, and each device gets its own configuration.' },
'连上后就能直接访问内网地址了': { zh: '连上后就能直接访问内网地址了', en: 'Once connected you can directly access LAN addresses' },
'连接': { zh: '连接', en: 'Connections' },
'连接与流日志': { zh: '连接与流日志', en: 'Connection & Flow Logs' },
'连接失败': { zh: '连接失败', en: 'Connection failed' },
'连接失败:': { zh: '连接失败:', en: 'Connection failed: ' },
'连接数': { zh: '连接数', en: 'Connections' },
'连接数限制': { zh: '连接数限制', en: 'Connection limit' },
'连接方式': { zh: '连接方式', en: 'Connection method' },
'连接方式已改为「': { zh: '连接方式已改为「', en: 'Connection type set to "' },
'连接状态': { zh: '连接状态', en: 'Connection status' },
'连接状态,可能导致当前网络中断。': { zh: '连接状态,可能导致当前网络中断。', en: 'connection state, which may interrupt the current network.' },
'连接简表': { zh: '连接简表', en: 'Connection summary table' },
'连接表': { zh: '连接表', en: 'connection table' },
'连接被拒绝,路由器管理服务可能未在运行': { zh: '连接被拒绝,路由器管理服务可能未在运行', en: 'Connection refused — the admin service may not be running' },
'连接跟踪': { zh: '连接跟踪', en: 'Connection tracking' },
'连接跟踪与流量日志(统一日志系统)': { zh: '连接跟踪与流量日志(统一日志系统)', en: 'Connection tracking and traffic logs (unified logging)' },
'连接路由器管理服务超时,请检查网络或稍后重试': { zh: '连接路由器管理服务超时,请检查网络或稍后重试', en: 'Timed out connecting to the admin service; check the network and try again' },
'连续': { zh: '连续', en: 'Consecutive' },
'连通': { zh: '连通', en: 'Connectivity' },
'连通性测试': { zh: '连通性测试', en: 'Connectivity test' },
'连通性自检': { zh: '连通性自检', en: 'Connectivity Self-check' },
'连通情况。测试过程会实时回显结果。': { zh: '连通情况。测试过程会实时回显结果。', en: 'Connectivity. Results are echoed in real time during the test.' },
'退出': { zh: '退出', en: 'Log out' },
'退出登录': { zh: '退出登录', en: 'Log out' },
'退出系统': { zh: '退出系统', en: 'Shut down / log out' },
'适用于中国大陆运营商:中国电信': { zh: '适用于中国大陆运营商:中国电信', en: 'for mainland China carriers: China Telecom' },
'选一个': { zh: '选一个', en: 'Pick one' },
'选下面这份': { zh: '选下面这份', en: 'Choose this one below' },
'选填': { zh: '选填', en: 'Optional' },
'选填,会显示在主题卡片上': { zh: '选填,会显示在主题卡片上', en: 'Optional, shown on the theme card' },
'选择主题包': { zh: '选择主题包', en: 'Select a theme pack' },
'选择月份': { zh: '选择月份', en: 'Select a month' },
'选择月份…': { zh: '选择月份…', en: 'Select month…' },
'选择服务商': { zh: '选择服务商', en: 'Select a provider' },
'选择由「导出」生成的': { zh: '选择由「导出」生成的', en: 'Select the one generated by "Export"' },
'选择要下载的安装包': { zh: '选择要下载的安装包', en: 'Select the package to download' },
'选项(留空用模板默认)': { zh: '选项(留空用模板默认)', en: 'Options (leave empty to use the template defaults)' },
'逐字节一致': { zh: '逐字节一致', en: 'Byte-for-byte identical' },
'逐条查看会话的接口、获得的地址与对端网关;点「日志」看拨号过程与原因分析。': { zh: '逐条查看会话的接口、获得的地址与对端网关;点「日志」看拨号过程与原因分析。', en: 'Review each session\'s interface, assigned address and peer gateway; click "Log" to see the dialing process and cause analysis.' },
'通俗说明': { zh: '通俗说明', en: 'Plain-language explanation' },
'通吃)': { zh: '通吃)', en: 'works with everything)' },
'通告前缀(如运营商下发': { zh: '通告前缀(如运营商下发', en: 'advertised prefix (for example, delivered by the carrier' },
'通告接口': { zh: '通告接口', en: 'Advertising Interface' },
'通告时生效。': { zh: '通告时生效。', en: 'takes effect once advertised.' },
'通告(': { zh: '通告(', en: 'Advertisement (' },
'通外网': { zh: '通外网', en: 'Reach the internet' },
'通常超时或极慢': { zh: '通常超时或极慢', en: 'Usually times out or is extremely slow' },
'通用': { zh: '通用', en: 'General' },
'通用 API 接口': { zh: '通用 API 接口', en: 'General API' },
'通知通道': { zh: '通知通道', en: 'Notification channel' },
'通过': { zh: '通过', en: 'Pass' },
'通过公共': { zh: '通过公共', en: 'Via a public' },
'通过宽带账号密码拨号上网,适用于中国大陆运营商光猫桥接场景。': { zh: '通过宽带账号密码拨号上网,适用于中国大陆运营商光猫桥接场景。', en: 'Dial up with your broadband account and password; meant for ONT bridge mode used by mainland Chinese carriers.' },
'通道': { zh: '通道', en: 'Channel' },
'通道配置没保存也会导致发送失败': { zh: '通道配置没保存也会导致发送失败', en: 'An unsaved channel configuration can also cause sending to fail' },
'避免把一个损坏的包还原成半截配置。': { zh: '避免把一个损坏的包还原成半截配置。', en: 'Avoids restoring a damaged package into a half-broken configuration.' },
'那一段(比如把它写成': { zh: '那一段(比如把它写成', en: 'that section (for example, writing it as' },
'那就白配了。': { zh: '那就白配了。', en: 'then the configuration would be wasted.' },
'邮件通知': { zh: '邮件通知', en: 'Email notification' },
'邻居发现参数': { zh: '邻居发现参数', en: 'neighbor discovery parameters' },
'邻居数量': { zh: '邻居数量', en: 'Number of neighbors' },
'邻居表 / 路由表 / 规则表': { zh: '邻居表 / 路由表 / 规则表', en: 'Neighbours / routes / rules' },
'邻居表条数': { zh: '邻居表条数', en: 'Neighbor table entries' },
'部分省份限制同一账号只能拨': { zh: '部分省份限制同一账号只能拨', en: 'Some provinces limit a single account to' },
'部署': { zh: '部署', en: 'Deploy' },
'都不会被「自动快照」的过期清理删掉。 两者区别在于': { zh: '都不会被「自动快照」的过期清理删掉。 两者区别在于', en: 'are not removed by the expiration cleanup of "automatic snapshots". The difference between the two is' },
'都表示通': { zh: '都表示通', en: 'all mean reachable' },
'都要重填一次': { zh: '都要重填一次', en: 'must be filled in again' },
'酉': { zh: '酉', en: 'You' },
'配置': { zh: '配置', en: 'Configuration' },
'配置、主题外观。换机器、重装系统、或者改坏了想回到 某个时间点,从这里导出的包就能一键还原。': { zh: '配置、主题外观。换机器、重装系统、或者改坏了想回到 某个时间点,从这里导出的包就能一键还原。', en: 'configuration and theme appearance. When you change machines, reinstall the system, or want to return to a certain point after breaking it, the bundle exported here restores everything with one click.' },
'配置、密钥与放行规则。所有人立刻连不上。': { zh: '配置、密钥与放行规则。所有人立刻连不上。', en: 'configurations, keys and allow rules. Everyone immediately loses access.' },
'配置代码(就是将要写入的': { zh: '配置代码(就是将要写入的', en: 'configuration code (that is, the' },
'配置备份与还原': { zh: '配置备份与还原', en: 'Config Backup & Restore' },
'配置已写入但服务未启动。 点「保存并应用」才会真正开始监听。': { zh: '配置已写入但服务未启动。 点「保存并应用」才会真正开始监听。', en: 'The configuration has been written but the service is not running. Click "Save and Apply" to actually start listening.' },
'配置库': { zh: '配置库', en: 'Configuration Library' },
'配置开关': { zh: '配置开关', en: 'Configuration toggle' },
'配置开机自动加载': { zh: '配置开机自动加载', en: 'Load automatically at boot' },
'配置快照': { zh: '配置快照', en: 'Configuration Snapshots' },
'配置快照」同源,两边不会一份有一份没有。': { zh: '配置快照」同源,两边不会一份有一份没有。', en: 'configuration snapshot share the same source, so the two sides never get out of sync.' },
'配置快照与回滚': { zh: '配置快照与回滚', en: 'Configuration Snapshots and Rollback' },
'配置数据库': { zh: '配置数据库', en: 'configuration database' },
'配置文件': { zh: '配置文件', en: 'Configuration file' },
'配置文件、证书、代码、配置快照': { zh: '配置文件、证书、代码、配置快照', en: 'config files, certificates, code, configuration snapshots' },
'配置文件位置': { zh: '配置文件位置', en: 'Configuration File Location' },
'配置是否符合预期。': { zh: '配置是否符合预期。', en: 'whether the configuration is as expected.' },
'配置静态加密': { zh: '配置静态加密', en: 'Configure static encryption' },
'配置静态加密:': { zh: '配置静态加密:', en: 'Configure static encryption:' },
'配置预览(将会写入磁盘)': { zh: '配置预览(将会写入磁盘)', en: 'Configuration Preview (Will Be Written to Disk)' },
'配置,此处仅提供模板。': { zh: '配置,此处仅提供模板。', en: 'configuration; only a template is provided here.' },
'配色生成失败:': { zh: '配色生成失败:', en: 'Palette generation failed: ' },
'采集': { zh: '采集', en: 'Collect' },
'采集源开关': { zh: '采集源开关', en: 'Collection Source Toggles' },
'里。这一页把它变成可勾选的表单:': { zh: '里。这一页把它变成可勾选的表单:', en: 'in it. This page turns it into a checkable form:' },
'里的': { zh: '里的', en: 'in' },
'里,否则照样报「名称不匹配」': { zh: '里,否则照样报「名称不匹配」', en: 'otherwise it still reports "name mismatch"' },
'重传': { zh: '重传', en: 'Retransmits' },
'重叠,两套路由会互相打架,表现为「连上了但访问不了内网」。': { zh: '重叠,两套路由会互相打架,表现为「连上了但访问不了内网」。', en: 'overlap, otherwise the two sets of routes will fight and you will see "connected but the LAN is unreachable".' },
'重叠,会导致路由冲突': { zh: '重叠,会导致路由冲突', en: 'overlap, which causes routing conflicts' },
'重启': { zh: '重启', en: 'Restart' },
'重启 Docker 使配置生效': { zh: '重启 Docker 使配置生效', en: 'Restart Docker to apply the configuration' },
'重启中': { zh: '重启中', en: 'Restarting' },
'重启会': { zh: '重启会', en: 'Restarting will' },
'重启后模块不会被加载,VPN 会自己起不来。': { zh: '重启后模块不会被加载,VPN 会自己起不来。', en: 'The module is not loaded at boot, so the VPN will not come up by itself.' },
'重启:': { zh: '重启:', en: 'Restart:' },
'重命名': { zh: '重命名', en: 'Rename' },
'重命名失败': { zh: '重命名失败', en: 'Rename failed' },
'重建。': { zh: '重建。', en: 'rebuild.' },
'重拨': { zh: '重拨', en: 'Redial' },
'重拨间隔(秒)': { zh: '重拨间隔(秒)', en: 'Redial Interval (seconds)' },
'重新体检': { zh: '重新体检', en: 'Run health check again' },
'重新判定': { zh: '重新判定', en: 'Re-evaluate' },
'重新安装 / 升级': { zh: '重新安装 / 升级', en: 'Reinstall / Upgrade' },
'重新开启保护': { zh: '重新开启保护', en: 'Re-enable Protection' },
'重新扫描': { zh: '重新扫描', en: 'Rescan' },
'重新检查': { zh: '重新检查', en: 'Check again' },
'重新检测': { zh: '重新检测', en: 'Detect again' },
'重新渲染预览': { zh: '重新渲染预览', en: 'Re-render the preview' },
'重新生成': { zh: '重新生成', en: 'Regenerate' },
'重新生成一张默认自签证书': { zh: '重新生成一张默认自签证书', en: 'Regenerate a Default Self-signed Certificate' },
'重新生成一张默认自签证书并立即部署?\\n\\n': { zh: '重新生成一张默认自签证书并立即部署?\\n\\n', en: 'Generate a fresh default self-signed certificate and deploy it now?\\n\\n' },
'重新生成一张默认自签证书并立即部署?\n\n': { zh: '重新生成一张默认自签证书并立即部署?\n\n', en: 'Generate a fresh default self-signed certificate and deploy it now?\\n\\n' },
'重新生成一张默认自签证书并立即部署?\\\\n\\\\n': { zh: '重新生成一张默认自签证书并立即部署?\\\\n\\\\n', en: 'Generate a fresh default self-signed certificate and deploy it now?\\n\\n' },
'重新生成共享密钥后,已注册的 AP 都要用新密钥重新注册一次。确定继续?': { zh: '重新生成共享密钥后,已注册的 AP 都要用新密钥重新注册一次。确定继续?', en: 'After the shared secret is regenerated, every registered AP must re-register with the new secret. Continue?' },
'重新访问。': { zh: '重新访问。', en: 'access again.' },
'重新读取': { zh: '重新读取', en: 'Reload' },
'重测。': { zh: '重测。', en: 'Retest.' },
'重置': { zh: '重置', en: 'Reset' },
'重试': { zh: '重试', en: 'Retry' },
'鉴权方式': { zh: '鉴权方式', en: 'Authentication method' },
'钳制': { zh: '钳制', en: 'Clamp' },
'钳制(避免部分网站打不开)': { zh: '钳制(避免部分网站打不开)', en: 'Clamp (prevents some sites from failing to load)' },
'钳制)。 下方默认内容已用': { zh: '钳制)。 下方默认内容已用', en: 'clamping). The default content below already uses' },
'链。': { zh: '链。', en: 'chain.' },
'链做目的地址改写,并自动在': { zh: '链做目的地址改写,并自动在', en: 'chain to rewrite the destination address, and automatically in' },
'链接': { zh: '链接', en: 'Link' },
'链放通, 同时兼容内网回环访问(': { zh: '链放通, 同时兼容内网回环访问(', en: 'allow through the chain, while also supporting LAN loopback access (' },
'锁定': { zh: '锁定', en: 'Lock' },
'错开整点是为了不和磁盘清理、自动快照挤在同一分钟。': { zh: '错开整点是为了不和磁盘清理、自动快照挤在同一分钟。', en: 'Staggering the hour avoids landing in the same minute as disk cleanup and automatic snapshots.' },
'错误': { zh: '错误', en: 'Error' },
'错误浅底': { zh: '错误浅底', en: 'Error tint' },
'错误色': { zh: '错误色', en: 'Error colour' },
'锥形 NAT;每个目标端口都不同': { zh: '锥形 NAT;每个目标端口都不同', en: 'Cone NAT; each target port is different' },
'镜像': { zh: '镜像', en: 'Image' },
'镜像 ID': { zh: '镜像 ID', en: 'Image ID' },
'镜像源': { zh: '镜像源', en: 'Mirror' },
'镜像源就是「': { zh: '镜像源就是「', en: 'A mirror is "' },
'镜像源(国内加速)': { zh: '镜像源(国内加速)', en: 'Mirror (accelerated in China)' },
'镜像(': { zh: '镜像(', en: 'Mirror (' },
'长度(借用主机位做子网)': { zh: '长度(借用主机位做子网)', en: 'length (borrowing host bits for the subnet)' },
'长期冻结大批系统包。仅当': { zh: '长期冻结大批系统包。仅当', en: 'Long-term freeze of large batches of system packages. Only when' },
'闰': { zh: '闰', en: 'leap' },
'阈值': { zh: '阈值', en: 'Threshold' },
'队列': { zh: '队列', en: 'Queue' },
'队列名(英文数字)': { zh: '队列名(英文数字)', en: 'Queue Name (Letters and Digits)' },
'队列模式': { zh: '队列模式', en: 'Queue mode' },
'队列里未完成的任务会一起清掉。确认继续?': { zh: '队列里未完成的任务会一起清掉。确认继续?', en: 'Pending tasks in the queue will be cleared as well. Continue?' },
'防火墙': { zh: '防火墙', en: 'Firewall' },
'防火墙 IPv4': { zh: '防火墙 IPv4', en: 'Firewall IPv4' },
'防火墙 IPv6': { zh: '防火墙 IPv6', en: 'Firewall IPv6' },
'防火墙实时日志(滚动显示)': { zh: '防火墙实时日志(滚动显示)', en: 'Firewall Live Log (Scrolling Display)' },
'防火墙日志开关当前为关闭:规则里没有 log 语句,因此「防火墙」源不会有新记录。 可到「防火墙 IPv4': { zh: '防火墙日志开关当前为关闭:规则里没有 log 语句,因此「防火墙」源不会有新记录。 可到「防火墙 IPv4', en: 'Firewall logging is currently off: the rules contain no log statement, so the "Firewall" source will have no new records. You can go to "Firewall IPv4' },
'防火墙日志(滚动)': { zh: '防火墙日志(滚动)', en: 'Firewall Log (Scrolling)' },
'防火墙示例规则': { zh: '防火墙示例规则', en: 'Firewall example rules' },
'防火墙规则': { zh: '防火墙规则', en: 'Firewall Rules' },
'防火墙规则会立即加载': { zh: '防火墙规则会立即加载', en: 'Firewall rules load immediately' },
'阿里': { zh: '阿里', en: 'Alibaba' },
'阿里云': { zh: '阿里云', en: 'Alibaba Cloud' },
'限制单个内网': { zh: '限制单个内网', en: 'Restrict a single LAN' },
'限制某端口仅内网访问:': { zh: '限制某端口仅内网访问:', en: 'Restrict a certain port to LAN access only:' },
'限制每个容器日志文件的大小和份数。 不开的话,一个死循环打印日志的容器能在几小时内把小硬盘写满': { zh: '限制每个容器日志文件的大小和份数。 不开的话,一个死循环打印日志的容器能在几小时内把小硬盘写满', en: 'Limits the size and number of each container\'s log files. Without it, a container stuck in a log-printing loop can fill a small disk within a few hours' },
'限速': { zh: '限速', en: 'Rate limit' },
'随时可中断': { zh: '随时可中断', en: 'can be interrupted at any time' },
'随机生成一个私有段': { zh: '随机生成一个私有段', en: 'Randomly generate a private range' },
'随系统一起启动': { zh: '随系统一起启动', en: 'Start together with the system' },
'集中管理家里的': { zh: '集中管理家里的', en: 'Centrally manage your home' },
'雨水': { zh: '雨水', en: 'Rain Water' },
'雷电)': { zh: '雷电)', en: 'Thunderbolt)' },
'需先格式化': { zh: '需先格式化', en: 'Needs to be formatted first' },
'需实测,有链路地址不代表能拿到可分配给内网的前缀。': { zh: '需实测,有链路地址不代表能拿到可分配给内网的前缀。', en: 'requires real testing; having a link address does not mean you can get a prefix assignable to the LAN.' },
'需要先把 USB 打印机在 PVE 的硬件设置里 直通(USB Host Device)给这台虚拟机,插好之后这里才会出现设备节点。': { zh: '需要先把 USB 打印机在 PVE 的硬件设置里 直通(USB Host Device)给这台虚拟机,插好之后这里才会出现设备节点。', en: 'You need to first pass the USB printer through to this virtual machine in the PVE hardware settings (USB Host Device); after it is plugged in, the device node will appear here.' },
'需要先把 USB 打印机在 PVE 里 直通给这台虚拟机,插上之后设备节点才会出现。': { zh: '需要先把 USB 打印机在 PVE 里 直通给这台虚拟机,插上之后设备节点才会出现。', en: 'You need to first pass the USB printer through to this virtual machine in PVE; after plugging it in, the device node will appear.' },
'需要它来解锁': { zh: '需要它来解锁', en: 'requires it to unlock' },
'需要用新地址重新注册。': { zh: '需要用新地址重新注册。', en: 'It needs to re-register with the new address.' },
'需账号密码': { zh: '需账号密码', en: 'Requires username and password' },
'霜降': { zh: '霜降', en: 'Frost Descent' },
'静态': { zh: '静态', en: 'Static' },
'静态地址': { zh: '静态地址', en: 'Static address' },
'静态地址绑定': { zh: '静态地址绑定', en: 'Static Address Binding' },
'静态地址需与上级网络同网段,否则无法上网。填写后可点下方「测试连通性」验证。': { zh: '静态地址需与上级网络同网段,否则无法上网。填写后可点下方「测试连通性」验证。', en: 'The static address must be in the same subnet as the upstream network, otherwise the Internet cannot be reached. After filling it in, click "Test Connectivity" below to verify.' },
'静态地址(专线': { zh: '静态地址(专线', en: 'static address (dedicated line' },
'静态地址(专线 / 固定 IP)': { zh: '静态地址(专线 / 固定 IP)', en: 'Static address (leased line / fixed IP)' },
'静态地址(静态模式时生效)': { zh: '静态地址(静态模式时生效)', en: 'static address (effective in static mode)' },
'面向全平台,兼容性最好。': { zh: '面向全平台,兼容性最好。', en: 'Targets all platforms, with the best compatibility.' },
'页 做了': { zh: '页 做了', en: 'page does' },
'页面渲染失败': { zh: '页面渲染失败', en: 'Page failed to render' },
'页面渲染失败,请点右上角「刷新」重试': { zh: '页面渲染失败,请点右上角「刷新」重试', en: 'Failed to render the page; click "Refresh" at the top right to retry' },
'页面背景': { zh: '页面背景', en: 'Page background' },
'页:': { zh: '页:', en: 'page:' },
'项': { zh: '项', en: ' items' },
'项目': { zh: '项目', en: 'Project' },
'项目名(小写字母': { zh: '项目名(小写字母', en: 'Project name (lowercase letters' },
'项目统一放在': { zh: '项目统一放在', en: 'Projects are stored in' },
'项目(': { zh: '项目(', en: 'Project (' },
'项移入回收站(可在服务器': { zh: '项移入回收站(可在服务器', en: 'items to the trash (on the server' },
'项缺失': { zh: '项缺失', en: 'item is missing' },
'项被拒绝': { zh: '项被拒绝', en: 'items rejected' },
'项)': { zh: '项)', en: 'items)' },
'项)。试试清空搜索或切换到「全部」。': { zh: '项)。试试清空搜索或切换到「全部」。', en: 'items). Try clearing the search or switching to "All".' },
'颁发者': { zh: '颁发者', en: 'Issuer' },
'预检与应用': { zh: '预检与应用', en: 'Precheck and Apply' },
'预检失败': { zh: '预检失败', en: 'Precheck Failed' },
'预览完全在本地完成': { zh: '预览完全在本地完成', en: 'The preview is completed entirely locally' },
'颜色函数格式不正确(示例:rgba(31,111,235,.35),RGB 需在 0-255 内)': { zh: '颜色函数格式不正确(示例:rgba(31,111,235,.35),RGB 需在 0-255 内)', en: 'Incorrect colour function format (e.g. rgba(31,111,235,.35); RGB values must be within 0-255)' },
'颜色格式不正确(支持 #rgb / #rrggbb / #rrggbbaa)': { zh: '颜色格式不正确(支持 #rgb / #rrggbb / #rrggbbaa)', en: 'Incorrect colour format (supports #rgb / #rrggbb / #rrggbbaa)' },
'风格)': { zh: '风格)', en: 'style)' },
'首选期 ': { zh: '首选期 ', en: 'Preferred Lifetime ' },
'马': { zh: '马', en: 'Horse' },
'驱动': { zh: '驱动', en: 'Driver' },
'验证方式': { zh: '验证方式', en: 'Verification method' },
'高危包:': { zh: '高危包:', en: 'High-risk packages:' },
'高危操作确认': { zh: '高危操作确认', en: 'Confirm a high-risk operation' },
'魔术包已发送': { zh: '魔术包已发送', en: 'Magic Packet Sent' },
'鸡': { zh: '鸡', en: 'Rooster' },
'默认': { zh: '默认', en: 'Default' },
'默认保留数据目录,下次重装直接接着用。': { zh: '默认保留数据目录,下次重装直接接着用。', en: 'The data directory is kept by default, so the next reinstall can continue using it.' },
'默认值。': { zh: '默认值。', en: 'default value.' },
'默认关闭': { zh: '默认关闭', en: 'Disabled by Default' },
'默认用': { zh: '默认用', en: 'By default' },
'默认禁止在': { zh: '默认禁止在', en: 'Forbidden by default on' },
'默认策略,优先选用推荐前缀,兼容性最好': { zh: '默认策略,优先选用推荐前缀,兼容性最好', en: 'The default policy — prefer the recommended prefix for best compatibility' },
'默认网关,': { zh: '默认网关,', en: 'default gateway,' },
'默认网桥网段(': { zh: '默认网桥网段(', en: 'Default bridge subnet (' },
'默认路由': { zh: '默认路由', en: 'Default route' },
'默认路由出口': { zh: '默认路由出口', en: 'Default route egress' },
'默认路由生命期': { zh: '默认路由生命期', en: 'Default Route Lifetime' },
'鼠': { zh: '鼠', en: 'Rat' },
'龙': { zh: '龙', en: 'Dragon' },
'(5 次)': { zh: '(5 次)', en: '(5 times)' },
'(CA 私钥、宽带密码等)。配置本身能还原,但这些需要还原后重新生成。': { zh: '(CA 私钥、宽带密码等)。配置本身能还原,但这些需要还原后重新生成。', en: '(CA private key, broadband password, etc.). The configuration itself can be restored, but these need to be regenerated after restoring.' },
'(chrony 未运行)': { zh: '(chrony 未运行)', en: '(chrony is not running)' },
'(一般填': { zh: '(一般填', en: '(usually fill in' },
'(下发': { zh: '(下发', en: '(delivered' },
'(不影响系统': { zh: '(不影响系统', en: '(does not affect the system' },
'(且当前与软加速冲突)': { zh: '(且当前与软加速冲突)', en: '(currently conflicts with software acceleration)' },
'(严重告警仍会推送)': { zh: '(严重告警仍会推送)', en: '(critical alerts are still pushed)' },
'(也可用': { zh: '(也可用', en: '(you can also use' },
'(也支持': { zh: '(也支持', en: '(also supports' },
'(仅建议本机调试使用)。 当前生效端口:': { zh: '(仅建议本机调试使用)。 当前生效端口:', en: '(only recommended for local debugging on this machine). Currently effective port:' },
'(从面板首次记录该接口在线时开始计,非插线时刻)': { zh: '(从面板首次记录该接口在线时开始计,非插线时刻)', en: ' (counted from when this panel first recorded the link as up, not from the moment it was plugged in)' },
'(你的': { zh: '(你的', en: '(your' },
'(使用者可选名称)': { zh: '(使用者可选名称)', en: '(optional user-chosen name)' },
'(保留不删)': { zh: '(保留不删)', en: '(kept, not deleted)' },
'(内核的 usblp 模块当前未加载,插上设备后会自动加载)': { zh: '(内核的 usblp 模块当前未加载,插上设备后会自动加载)', en: '(the kernel usblp module is not currently loaded; it will be loaded automatically when a device is plugged in)' },
'(内置)': { zh: '(内置)', en: '(built-in)' },
'(前缀': { zh: '(前缀', en: '(prefix' },
'(剩': { zh: '(剩', en: '(remaining' },
'(包括爱快)都无法': { zh: '(包括爱快)都无法', en: '(including iKuai) cannot' },
'(占位,请用下面的自定义源)': { zh: '(占位,请用下面的自定义源)', en: ' (placeholder — use the custom mirror below)' },
'(双栈)': { zh: '(双栈)', en: '(dual stack)' },
'(可含私钥)': { zh: '(可含私钥)', en: '(may include the private key)' },
'(可填': { zh: '(可填', en: '(can be' },
'(可用': { zh: '(可用', en: '(available' },
'(可留空)': { zh: '(可留空)', en: '(may be left blank)' },
'(右侧不显示滚动条)': { zh: '(右侧不显示滚动条)', en: '(no scrollbar shown on the right)' },
'(含超出部分估算)': { zh: '(含超出部分估算)', en: '(including an estimate for the excess part)' },
'(域名)': { zh: '(域名)', en: '(domain name)' },
'(多个用逗号分隔)': { zh: '(多个用逗号分隔)', en: '(multiple, separated by commas)' },
'(大陆网络常见,探测版本号时本来就在用镜像)。 无论走哪个源,': { zh: '(大陆网络常见,探测版本号时本来就在用镜像)。 无论走哪个源,', en: '(common on mainland networks, and it is already being used as a mirror when probing the version number). Whichever source is used,' },
'(如 43、121 等)。': { zh: '(如 43、121 等)。', en: '(e.g. 43, 121, etc.).' },
'(安装说明)。': { zh: '(安装说明)。', en: '(installation guide).' },
'(已填入第一个可用候选,可手动改)': { zh: '(已填入第一个可用候选,可手动改)', en: '(the first available candidate has been filled in, you can change it manually)' },
'(常见': { zh: '(常见', en: '(common' },
'(库已建好,装完后不可再切换)': { zh: '(库已建好,装完后不可再切换)', en: '(Library already built, it cannot be switched after installation)' },
'(当前 ': { zh: '(当前 ', en: ' (current: ' },
'(按需修改端口)': { zh: '(按需修改端口)', en: '(change the port as needed)' },
'(推荐)': { zh: '(推荐)', en: '(recommended)' },
'(推荐:': { zh: '(推荐:', en: '(recommended:' },
'(提供 wg / wg-quick 命令),': { zh: '(提供 wg / wg-quick 命令),', en: '(provides the wg / wg-quick commands),' },
'(无可用网卡)': { zh: '(无可用网卡)', en: '(no network interface available)' },
'(无容器)': { zh: '(无容器)', en: '(no containers)' },
'(无描述)': { zh: '(无描述)', en: '(no description)' },
'(无日志)': { zh: '(无日志)', en: '(no logs)' },
'(无状态,推荐)': { zh: '(无状态,推荐)', en: '(stateless, recommended)' },
'(无输出)': { zh: '(无输出)', en: '(no output)' },
'(无)': { zh: '(无)', en: '(none)' },
'(暂无备份)': { zh: '(暂无备份)', en: '(no backup yet)' },
'(暂无更新日志)': { zh: '(暂无更新日志)', en: '(no changelog available yet)' },
'(服务端密钥尚未生成,请先点一次「保存并应用」)': { zh: '(服务端密钥尚未生成,请先点一次「保存并应用」)', en: '(the server key has not been generated yet, please click "Save & Apply" once)' },
'(服务账号)': { zh: '(服务账号)', en: '(service account)' },
'(未创建)': { zh: '(未创建)', en: '(not created)' },
'(未取得附件列表,可能探测源暂时不可用)': { zh: '(未取得附件列表,可能探测源暂时不可用)', en: '(attachment list not retrieved; the probe source may be temporarily unavailable)' },
'(未命名)': { zh: '(未命名)', en: '(unnamed)' },
'(未检测到物理网卡)': { zh: '(未检测到物理网卡)', en: '(no physical network interface detected)' },
'(未检测到)': { zh: '(未检测到)', en: '(not detected)' },
'(权限': { zh: '(权限', en: '(permissions' },
'(每行一个': { zh: '(每行一个', en: '(one per line' },
'(比如没配打印服务就不会有 CUPS 配置),不影响还原。': { zh: '(比如没配打印服务就不会有 CUPS 配置),不影响还原。', en: '(for example, if no print service is configured there will be no CUPS configuration), this does not affect restoration.' },
'(沙箱': { zh: '(沙箱', en: '(sandbox' },
'(清单)、': { zh: '(清单)、', en: '(checklist),' },
'(渲染结果) 与': { zh: '(渲染结果) 与', en: '(rendered result) and' },
'(留空=同主机)': { zh: '(留空=同主机)', en: '(empty = same host)' },
'(直连)': { zh: '(直连)', en: '(direct)' },
'(秒)': { zh: '(秒)', en: '(seconds)' },
'(空)': { zh: '(空)', en: '(empty)' },
'(管理员)': { zh: '(管理员)', en: '(administrator)' },
'(累计)': { zh: '(累计)', en: ' (cumulative)' },
'(缓存)': { zh: '(缓存)', en: '(cached)' },
'(缺工具,需安装 ': { zh: '(缺工具,需安装 ', en: '(tool missing, install ' },
'(自动替换': { zh: '(自动替换', en: '(automatically replaced' },
'(自签证书)': { zh: '(自签证书)', en: '(self-signed certificate)' },
'(证书可从旧机器单独拷贝)。': { zh: '(证书可从旧机器单独拷贝)。', en: '(the certificate can be copied separately from the old machine).' },
'(该页面的设置没有独立配置文件,': { zh: '(该页面的设置没有独立配置文件,', en: '(This page has no configuration file of its own,' },
'(读取中': { zh: '(读取中', en: '(reading' },
'(超级用户)': { zh: '(超级用户)', en: '(superuser)' },
'(这样保存会被拒绝)': { zh: '(这样保存会被拒绝)', en: '(saving this way will be rejected)' },
'(进控制台用它登录)': { zh: '(进控制台用它登录)', en: '(use it to log in from the console)' },
'(通常几十秒内恢复), 并且会重建': { zh: '(通常几十秒内恢复), 并且会重建', en: '(usually recovers within tens of seconds), and it will rebuild' },
'(重启': { zh: '(重启', en: '(restart' },
'(防火墙': { zh: '(防火墙', en: '(firewall' },
'(需对端运行': { zh: '(需对端运行', en: '(requires the peer to run' },
'(顺序去重),所以不必担心写出重复指令。': { zh: '(顺序去重),所以不必担心写出重复指令。', en: '(de-duplicated in order), so there is no need to worry about writing duplicate directives.' },
'(预览失败:': { zh: '(预览失败:', en: '(preview failed: ' },
'(高级)': { zh: '(高级)', en: '(advanced)' },
'(默认关闭,需要时再开)': { zh: '(默认关闭,需要时再开)', en: '(disabled by default, enable it when needed)' },
')、下载、文件夹打包为': { zh: ')、下载、文件夹打包为', en: '), downloading, and folders packaged as' },
')。 内网通告只能用': { zh: ')。 内网通告只能用', en: '). The LAN announcement can only use' },
')。 多半是启动后立刻退出了,看': { zh: ')。 多半是启动后立刻退出了,看', en: '). It most likely exited right after startup, see' },
')。 容器拿到私有': { zh: ')。 容器拿到私有', en: '). The container gets a private' },
')。可自由添加任意': { zh: ')。可自由添加任意', en: '). You can freely add any' },
')上的': { zh: ')上的', en: ') on' },
')也支持': { zh: ')也支持', en: ') also supports' },
')会原样保留在最后。': { zh: ')会原样保留在最后。', en: ') is kept as is at the end.' },
')只能按端口判断,无法准确识别具体应用。': { zh: ')只能按端口判断,无法准确识别具体应用。', en: ') can only be judged by port and cannot accurately identify the specific application.' },
')拿设备,': { zh: ')拿设备,', en: ') to fetch devices,' },
')支持情况。唤醒需要目标设备已关机但仍带电。': { zh: ')支持情况。唤醒需要目标设备已关机但仍带电。', en: ') support. Waking requires the target device to be powered off but still powered.' },
')是拿去给公共证书机构签名的半成品。': { zh: ')是拿去给公共证书机构签名的半成品。', en: ') is a half-finished artifact meant to be signed by a public certificate authority.' },
')的租约。': { zh: ')的租约。', en: ') leases.' },
')都能直接接入,无需任何': { zh: ')都能直接接入,无需任何', en: ') can all connect directly without any' },
'), 不会影响真实界面;觉得满意再点「保存并应用」。': { zh: '), 不会影响真实界面;觉得满意再点「保存并应用」。', en: '); it does not affect the real interface; if you are satisfied with it, click "Save and Apply".' },
'), 但机器之间只认': { zh: '), 但机器之间只认', en: '), but between machines only' },
'), 浏览器应已开始下载;没弹窗的话请检查浏览器的下载拦截设置。': { zh: '), 浏览器应已开始下载;没弹窗的话请检查浏览器的下载拦截设置。', en: '); the browser should have started the download; if no prompt appears, check the browser\'s download blocking settings.' },
'),主题包上限': { zh: '),主题包上限', en: '), theme package size limit' },
'),会自动拆成两段;注意「生效星期」指的是<b>起始那天</b>。': { zh: '),会自动拆成两段;注意「生效星期」指的是<b>起始那天</b>。', en: '), so it is split into two segments. Note that "active weekdays" refers to the <b>starting</b> day.' },
'),再下发给内网设备。 大陆家庭宽带通常需要': { zh: '),再下发给内网设备。 大陆家庭宽带通常需要', en: '), then distribute it to LAN devices. Mainland China home broadband usually needs' },
');互联网测速通过下载测速文件估算下行带宽。': { zh: ');互联网测速通过下载测速文件估算下行带宽。', en: '); the Internet speed test estimates the downstream bandwidth by downloading a test file.' },
'+ 添加': { zh: '+ 添加', en: '+ Add' },
', RAW 直通模式没有设备可用。这是一台虚拟机': { zh: ', RAW 直通模式没有设备可用。这是一台虚拟机', en: ', no device is available in RAW passthrough mode. This is a virtual machine' },
', 不会改动任何网络配置、防火墙规则或服务。': { zh: ', 不会改动任何网络配置、防火墙规则或服务。', en: ', and it does not change any network configuration, firewall rules or services.' },
', 仅对指定内网地址生效。建议同时开启「安全模式」以限制误映射。': { zh: ', 仅对指定内网地址生效。建议同时开启「安全模式」以限制误映射。', en: ', which only takes effect for the specified LAN address. It is recommended to enable "Safe Mode" at the same time to limit incorrect mappings.' },
', 以确保不影响正在运行的局域网与': { zh: ', 以确保不影响正在运行的局域网与', en: ', to make sure the running LAN and' },
', 再在上面选中它。升级走同一条路径,数据目录会原样保留,已注册的': { zh: ', 再在上面选中它。升级走同一条路径,数据目录会原样保留,已注册的', en: ', then select it above. Upgrades follow the same path, the data directory is kept as is, and registered' },
', 升级前请先创建快照。': { zh: ', 升级前请先创建快照。', en: ', please create a snapshot before upgrading.' },
', 历史连接与流量日志将': { zh: ', 历史连接与流量日志将', en: ', historical connections and traffic logs will' },
', 可先做干跑预览查看将写入的配置文件。': { zh: ', 可先做干跑预览查看将写入的配置文件。', en: ', you can first do a dry-run preview to see the configuration files that will be written.' },
', 否则会出现「连上了': { zh: ', 否则会出现「连上了', en: ', otherwise you will see "connected but' },
', 所以地址池用': { zh: ', 所以地址池用', en: ', so the address pool uses' },
', 所以这里提供多个公共加速前缀': { zh: ', 所以这里提供多个公共加速前缀', en: ', so multiple public acceleration prefixes are provided here' },
', 把它提交给证书机构,签回来的证书回到上面「导入」里补全即可。': { zh: ', 把它提交给证书机构,签回来的证书回到上面「导入」里补全即可。', en: ', submit it to the certificate authority, and complete it by importing the returned certificate in the "Import" section above.' },
', 端口已固定,便于防火墙精确放通。': { zh: ', 端口已固定,便于防火墙精确放通。', en: ', the port is fixed, which makes it easy to allow it precisely in the firewall.' },
', 这里填': { zh: ', 这里填', en: ', fill in' },
', 进入后可一键还原最近的快照并自动重启,让设备恢复到可用状态。': { zh: ', 进入后可一键还原最近的快照并自动重启,让设备恢复到可用状态。', en: ', and once you enter, you can restore the most recent snapshot with one click and restart automatically, bringing the device back to a usable state.' },
', 重启后需要你手工拉起来。': { zh: ', 重启后需要你手工拉起来。', en: ', after the restart you have to bring it up manually.' },
',RAW 直通模式无法工作。请到「依赖自检与安装」安装。': { zh: ',RAW 直通模式无法工作。请到「依赖自检与安装」安装。', en: ', RAW passthrough mode cannot work. Please install it under "Dependency Check and Installation".' },
',macOS 与 Linux': { zh: ',macOS 与 Linux', en: ', macOS and Linux' },
',不一致就删除并中止。': { zh: ',不一致就删除并中止。', en: ', and delete and abort on mismatch.' },
',不会带着风险往下走。': { zh: ',不会带着风险往下走。', en: ', so you never carry the risk forward.' },
',不会把可疑的包装进你系统。': { zh: ',不会把可疑的包装进你系统。', en: ', so suspicious packages are never installed into your system.' },
',不会污染现有配置。': { zh: ',不会污染现有配置。', en: ', which does not pollute the existing configuration.' },
',不会被清掉。': { zh: ',不会被清掉。', en: ', will not be cleared.' },
',不会被环境里的代理掩盖)。': { zh: ',不会被环境里的代理掩盖)。', en: ', and it will not be masked by a proxy in the environment).' },
',不用改。': { zh: ',不用改。', en: ', no need to change it.' },
',不要上传私钥。私钥应保存在你的本地电脑上,绝不发送到服务器。 支持粘贴文本或选择': { zh: ',不要上传私钥。私钥应保存在你的本地电脑上,绝不发送到服务器。 支持粘贴文本或选择', en: ', do not upload the private key. The private key should be kept on your local computer and must never be sent to the server. You can paste the text or choose' },
',不要发到群里。': { zh: ',不要发到群里。', en: ', do not post it to the group chat.' },
',不需要装任何第三方内核模块, 性能也远好于': { zh: ',不需要装任何第三方内核模块, 性能也远好于', en: ', it needs no third-party kernel modules, and its performance is far better than' },
',丢包 ': { zh: ',丢包 ', en: ', packet loss ' },
',也可使用自定义公共': { zh: ',也可使用自定义公共', en: ', and you can also use a custom public' },
',以确保不影响正在运行的局域网与': { zh: ',以确保不影响正在运行的局域网与', en: ', to ensure the running LAN and' },
',全程不需要外网': { zh: ',全程不需要外网', en: ', and no external network is needed for the whole process' },
',其中': { zh: ',其中', en: ', of which' },
',其提供的服务会中断。': { zh: ',其提供的服务会中断。', en: ', the services it provides will be interrupted.' },
',即使客户端未请求也会下发。': { zh: ',即使客户端未请求也会下发。', en: ', and are pushed down even when the client did not request them.' },
',另有': { zh: ',另有', en: ', plus' },
',只做状态展示与升级风险预警。': { zh: ',只做状态展示与升级风险预警。', en: ', it only displays status and warns about upgrade risks.' },
',只是往下载目录放文件。': { zh: ',只是往下载目录放文件。', en: ', it merely drops files into the download directory.' },
',只是有些网站和服务用': { zh: ',只是有些网站和服务用', en: ', but some websites and services use' },
',只显示这一次。关掉这个窗口就 只能重新下载(私钥仍存在机器上,但你自己看不到它)。': { zh: ',只显示这一次。关掉这个窗口就 只能重新下载(私钥仍存在机器上,但你自己看不到它)。', en: ', shown only this one time. Once you close this window you can only download it again (the private key still exists on the machine, but you cannot see it yourself).' },
',只读展示;如需修改可在服务器上用': { zh: ',只读展示;如需修改可在服务器上用', en: ', shown read-only; to modify them, use' },
',可以分享给别人或备份。 包内含': { zh: ',可以分享给别人或备份。 包内含', en: ', so it can be shared with others or backed up. The bundle contains' },
',可多选。勾选的策略会在生成地址与': { zh: ',可多选。勾选的策略会在生成地址与', en: ', multiple selections allowed. Checked policies are applied when generating addresses and' },
',可用': { zh: ',可用', en: ', available' },
',可用同一套条件检索、统计与导出。 归档文件:': { zh: ',可用同一套条件检索、统计与导出。 归档文件:', en: ', and you can search, tally and export with the same set of criteria. Archived files:' },
',可能导致数据丢失。 仅在系统完全无响应时使用。': { zh: ',可能导致数据丢失。 仅在系统完全无响应时使用。', en: ', which may cause data loss. Use it only when the system is completely unresponsive.' },
',可能影响网络连接,包括': { zh: ',可能影响网络连接,包括', en: ', which may affect network connectivity, including' },
',可随时关闭。': { zh: ',可随时关闭。', en: ', it can be turned off at any time.' },
',因此内置限速(默认': { zh: ',因此内置限速(默认', en: ', so a rate limit is built in (default' },
',在 4GB': { zh: ',在 4GB', en: ', on 4GB' },
',在下方「紧急救援通道': { zh: ',在下方「紧急救援通道', en: ', under "Emergency Rescue Channel' },
',填别的位数手机和电脑会直接忽略。': { zh: ',填别的位数手机和电脑会直接忽略。', en: ', filling in any other number of digits will simply be ignored by phones and computers.' },
',存放于': { zh: ',存放于', en: ', stored in' },
',客户端装自己的原厂驱动。 老式打印机、驱动装不上的机型用它最省心,也最省路由器资源': { zh: ',客户端装自己的原厂驱动。 老式打印机、驱动装不上的机型用它最省心,也最省路由器资源', en: ', and the client installs the vendor\'s own driver. For old printers and models whose drivers will not install, it is the least hassle and also the lightest on router resources' },
',将来装好 Docker 一启动就直接生效。 要现在装,请去「系统': { zh: ',将来装好 Docker 一启动就直接生效。 要现在装,请去「系统', en: ', once Docker is installed it takes effect as soon as it starts. To install it now, go to "System' },
',并在主配置中': { zh: ',并在主配置中', en: ', and in the main configuration' },
',把控制器地址填': { zh: ',把控制器地址填', en: ', set the controller address to' },
',抢同一个设备的结果是谁都打不出来': { zh: ',抢同一个设备的结果是谁都打不出来', en: ', competing for the same device means nothing gets printed' },
',插任一口皆可访问。': { zh: ',插任一口皆可访问。', en: ', reachable through any port.' },
',无需编译': { zh: ',无需编译', en: ', no compilation needed' },
',服务参数写入': { zh: ',服务参数写入', en: ', service parameters are written to' },
',格式:': { zh: ',格式:', en: ', format:' },
',正在写入的活跃日志也不动。': { zh: ',正在写入的活跃日志也不动。', en: ', and active logs currently being written are left untouched.' },
',没有冲突': { zh: ',没有冲突', en: ', no conflicts' },
',渲染器读的是': { zh: ',渲染器读的是', en: ', and the renderer reads' },
',点「立即更新」只会得到「暂未接入」的失败提示, DNS 记录不会变动。建议改用阿里云': { zh: ',点「立即更新」只会得到「暂未接入」的失败提示, DNS 记录不会变动。建议改用阿里云', en: ', clicking "Update now" will only return a "Not connected yet" failure message, and the DNS record will not change. Using Aliyun instead is recommended' },
',用它。': { zh: ',用它。', en: ', use it.' },
',用它签一张服务器证书,再把根证书装进你的设备。': { zh: ',用它签一张服务器证书,再把根证书装进你的设备。', en: ', use it to sign a server certificate, then install the root certificate on your devices.' },
',确认桌面正常': { zh: ',确认桌面正常', en: ', confirm the desktop works normally' },
',翻上去之后标题栏会出现「': { zh: ',翻上去之后标题栏会出现「', en: ', after scrolling up, the title bar will show "' },
',自动更新不会发生。请点下方「保存配置」重试,或检查这台机器是否支持 systemd。': { zh: ',自动更新不会发生。请点下方「保存配置」重试,或检查这台机器是否支持 systemd。', en: ', automatic updates will not happen. Please click "Save Configuration" below to retry, or check whether this machine supports systemd.' },
',见下方字段': { zh: ',见下方字段', en: ', see the fields below' },
',规则只会写入': { zh: ',规则只会写入', en: ', rules will only be written to' },
',解压后上限': { zh: ',解压后上限', en: ', after extraction the limit is' },
',请先手工修正或把文件挪走。': { zh: ',请先手工修正或把文件挪走。', en: ', please fix it manually or move the file away.' },
',请点击保存并应用': { zh: ',请点击保存并应用', en: ', please click Save and apply' },
',请用新地址访问': { zh: ',请用新地址访问', en: ', please visit the new address' },
',请重新导出。': { zh: ',请重新导出。', en: ', please export again.' },
',连上之后就能像在家一样访问内网地址。': { zh: ',连上之后就能像在家一样访问内网地址。', en: ', once connected you can access LAN addresses just like at home.' },
',避免组播泛洪。': { zh: ',避免组播泛洪。', en: ', to avoid multicast flooding.' },
',配置只会写入': { zh: ',配置只会写入', en: ', configuration is only written to' },
',配置只会写入磁盘,': { zh: ',配置只会写入磁盘,', en: ', the configuration is only written to disk,' },
',释放': { zh: ',释放', en: ', release' },
',除非你在防火墙': { zh: ',除非你在防火墙', en: ', unless in the firewall you' },
',需要重新逐台创建。': { zh: ',需要重新逐台创建。', en: ', they need to be created again one by one.' },
',靠 IPP Everywhere / AirPrint / Mopria': { zh: ',靠 IPP Everywhere / AirPrint / Mopria', en: ', relying on IPP Everywhere / AirPrint / Mopria' },
',顺带把容器日志滚动、': { zh: ',顺带把容器日志滚动、', en: ', along with container log rotation,' },
',风险较高)': { zh: ',风险较高)', en: ', higher risk)' },
',默认': { zh: ',默认', en: ', by default' },
': 网卡与': { zh: ': 网卡与', en: ': NIC and' },
':DHCP 服务会启动并占用 53': { zh: ':DHCP 服务会启动并占用 53', en: ': the DHCP service will start and occupy 53' },
':下载': { zh: ':下载', en: ': Download' },
':下载后与官方发布的': { zh: ':下载后与官方发布的', en: ': after downloading, compare with the officially published' },
':保存只会写盘,不会修改内核参数、不会启停服务。': { zh: ':保存只会写盘,不会修改内核参数、不会启停服务。', en: ': saving only writes to disk; it will not modify kernel parameters, and will not start or stop services.' },
':保存只会写配置,不会启停打印服务。': { zh: ':保存只会写配置,不会启停打印服务。', en: ': saving only writes the configuration, it does not start or stop the print service.' },
':只把安装包准备好并告诉你怎么装。 装不装、什么时候装,由你决定。': { zh: ':只把安装包准备好并告诉你怎么装。 装不装、什么时候装,由你决定。', en: ': it only prepares the package and tells you how to install it. Whether to install it, and when, is your decision.' },
':可以写配置文件,但不会重启 Docker。': { zh: ':可以写配置文件,但不会重启 Docker。', en: ': the configuration file can be written, but Docker will not be restarted.' },
':向导会把配置写到磁盘,但不会重启服务、 不会真正拨号。等你关闭保护模式后再点一次「保存并生效」即可。': { zh: ':向导会把配置写到磁盘,但不会重启服务、 不会真正拨号。等你关闭保护模式后再点一次「保存并生效」即可。', en: ': the wizard will write the configuration to disk, but will not restart services, and will not actually dial. After you turn off protection mode, click "Save and apply" once more.' },
':备注是你自己写的话,回滚就不容易选错。 回滚之前系统会自动再拍一张': { zh: ':备注是你自己写的话,回滚就不容易选错。 回滚之前系统会自动再拍一张', en: ': if the note is written by you, it is less likely to pick the wrong one when rolling back. Before the rollback the system automatically takes another' },
':安装与保存只会写盘,不会真的启动服务。': { zh: ':安装与保存只会写盘,不会真的启动服务。', en: ': installation and saving only write to disk; the service will not actually be started.' },
':手机和电脑': { zh: ':手机和电脑', en: ': phones and computers' },
':按创建方式自动识别,凡不是自动拍的一律保留(手动创建、回滚前、升级前拍的都是手动)。 若只想保住': { zh: ':按创建方式自动识别,凡不是自动拍的一律保留(手动创建、回滚前、升级前拍的都是手动)。 若只想保住', en: ': recognized automatically by how it was created; anything not taken automatically is always kept (manually created, taken before a rollback or before an upgrade all count as manual). If you only want to keep' },
':每敲一个键立刻发到服务端, 回显由内核产生,所以': { zh: ':每敲一个键立刻发到服务端, 回显由内核产生,所以', en: ': every keystroke is sent to the server immediately, and the echo is produced by the kernel, so' },
':点「中断」会立即停止并删除半截文件, 已下载的完整文件保留。备份和校验阶段为了数据完整性不可中断。': { zh: ':点「中断」会立即停止并删除半截文件, 已下载的完整文件保留。备份和校验阶段为了数据完整性不可中断。', en: ': clicking "Abort" stops immediately and deletes the half-written file; fully downloaded files are kept. The backup and verification stages cannot be interrupted, for the sake of data integrity.' },
':界面里的所有模块配置(': { zh: ':界面里的所有模块配置(', en: ': all module configurations in the interface (' },
':调用面板自带的备份能力,把当前配置存一份。 备份不成功就': { zh: ':调用面板自带的备份能力,把当前配置存一份。 备份不成功就', en: ': call the panel\'s built-in backup capability to save a copy of the current configuration. If the backup does not succeed,' },
':路由器': { zh: ':路由器', en: ': router' },
':部署只会写盘,不会重启 Web 服务。': { zh: ':部署只会写盘,不会重启 Web 服务。', en: ': deployment only writes to disk; the web service will not be restarted.' },
';26 起 ip6tables': { zh: ';26 起 ip6tables', en: '; ip6tables from 26 onwards' },
';此处的': { zh: ';此处的', en: '; the' },
';每行右侧可一键转为静态绑定、或回收该': { zh: ';每行右侧可一键转为静态绑定、或回收该', en: '; on the right of each row you can convert it into a static binding with one click, or reclaim that' },
';点「保存并应用」才会真正生效。 改动这两个动作是分开的,和其它模块的「保存': { zh: ';点「保存并应用」才会真正生效。 改动这两个动作是分开的,和其它模块的「保存', en: '; it only takes effect after clicking "Save and Apply". These two actions are separate, just like "Save' },
},
/* == BT == 后端下发文案的英文对照(2026-10-05)。
DDNS 服务商 / QoS 档位 / 清理项 / 告警规则 / 向导步骤等 30 张表,
定义在 backend/drouter-helper.py 的模块级常量里,随 API 下发。
它们都有稳定 key,所以前端用 bt(表名, key, 字段) 查这张表拿英文,
**后端零改动**(不必给每条加 _en 字段,也不必让 JSON 体积翻倍)。
数据源:_dev/bt-en.py,由 _dev/apply-bt-en.py 渲染。 */
bt: {
'ACCEL_IMPACT': {
'IPv6 转发': { 'name': 'IPv6 forwarding', 'why': 'The current acceleration table takes over established IPv4/IPv6 connections alike; normal forwarding is unaffected.' },
'NAT / 端口映射': { 'name': 'NAT / port forwarding', 'why': 'Existing NAT rules can stay; connection setup still goes through the full conntrack path. Test your port forwards once after enabling this.' },
'QoS / 流量整形 / 限速': { 'name': 'QoS / traffic shaping / rate limiting', 'why': 'tc rate limiting works poorly together with the flowtable fast path, and limits may stop applying. Do not enable it while relying on rate limits, or keep the rate-limited traffic out of the fast path.' },
'UPnP 自动端口映射': { 'name': 'UPnP automatic port mapping', 'why': 'UPnP still fires when new connections are set up and is unaffected; just re-check it once if you use long-lived mappings.' },
'复杂 ACL / 深度包检测': { 'name': 'Complex ACL / deep packet inspection', 'why': 'Content-based rules (domain or keyword filtering) only apply to new connections; later packets of a long connection are no longer inspected.' },
'策略路由 / 多出口分流': { 'name': 'Policy routing / multi-WAN split', 'why': 'Complex splitting that depends on per-packet marking needs reviewing too; exclude the affected traffic from flowtable if necessary.' },
'连接跟踪统计 / 流量监控': { 'name': 'Connection tracking statistics / traffic monitoring', 'why': 'conntrack still records connections, but byte counts for offloaded traffic may stop updating, so monitoring graphs will drift.' },
'逐包防火墙日志 / 计数': { 'name': 'Per-packet firewall logging / counting', 'why': 'Established connections no longer traverse the forward chain per packet, so log / counter rules for those packets stop matching. If you need to audit every connection precisely, leave this off.' },
},
'ACCEL_SCOPE': {
'IPv4 + IPv6(双栈同时加速)': { 'en': 'IPv4 + IPv6 (dual-stack acceleration)' },
'仅 IPv4': { 'en': 'IPv4 only' },
'仅 IPv6': { 'en': 'IPv6 only' },
'未覆盖任何协议族': { 'en': 'No address family covered' },
},
'ACCEL_HW_NOTE': {
'当前网卡未报告支持硬件卸载,将使用软件快速路径(对家用场景已足够)。': { 'en': 'No interface reported hardware-offload support; the software fast path will be used (sufficient for home use).' },
},
'ACCEL_SCOPE_NOTE': {
'软加速对 IPv4 与 IPv6 的作用范围': { 'en': 'How software acceleration applies to IPv4 and IPv6' },
'flowtable 本身属于 inet 家族,可以同时承载 IPv4 与 IPv6;但「哪些连接的后续报文会被卸载到快速路径」取决于 forward 链里显式写下的匹配规则。Drouter 默认同时对 IPv4 和 IPv6 卸载已建立连接,你也可以只选其中一个协议族。': { 'en': 'The flowtable belongs to the inet family and can carry both IPv4 and IPv6; however, which connections subsequent packets are offloaded to the fast path depends on the match rules explicitly written in the forward chain. Drouter offloads established connections for both IPv4 and IPv6 by default; you can also choose a single address family.' },
'TCP / UDP 已建立连接 → 走快速路径': { 'en': 'Established TCP / UDP connections -> fast path' },
'TCP / UDP / SCTP 等已建立连接 → 走快速路径': { 'en': 'Established TCP / UDP / SCTP connections -> fast path' },
'IPv4 与 IPv6 是两套独立的规则:只写 ip 则仅 IPv4 被加速,IPv6 仍逐包走 netfilter。': { 'en': 'IPv4 and IPv6 are two independent rule sets: writing only ip accelerates IPv4 alone, while IPv6 still traverses netfilter per-packet.' },
'IPv6 的下一个头字段是 nexthdr(不是 protocol);使用扩展头的报文会在内核里被规范化后再匹配。': { 'en': 'IPv6 next-header field is nexthdr (not protocol); packets using extension headers are normalized by the kernel before matching.' },
'ICMP / ICMPv6 等不属于"连接型"流量,默认不卸载,仍逐包经过防火墙(便于排障与限速)。': { 'en': 'ICMP / ICMPv6 are not "connection-oriented" traffic and are not offloaded by default; they still traverse the firewall per-packet (for troubleshooting and rate limiting).' },
'若你的运营商不支持 IPv6,选择「仅 IPv4」可减少一条规则,几乎无差别。': { 'en': 'If your ISP does not support IPv6, choosing "IPv4 only" removes one rule with almost no difference.' },
'已卸载的连接不再逐包经过 forward 链,因此针对这些包的日志 / 计数 / DSCP 标记会失效。': { 'en': 'Offloaded connections no longer traverse the forward chain per-packet, so logging / counting / DSCP marking for those packets will stop working.' },
},
'ACL_ACTIONS': {
'allow': { 'n': 'Allow (only these)', 'why': 'Whitelist mode: only these are permitted and everything else is blocked within the time group.' },
'block': { 'n': 'Block (deny access)', 'why': 'Matching traffic is dropped outright; the most common action.' },
'limit': { 'n': 'Rate limit (hand over to QoS)', 'why': 'No marking and no priority change; it just matches the QoS rate-limit rules.' },
'log': { 'n': 'Log only (do not block)', 'why': 'Only produces log entries for observation; ideal for a trial run before you decide.' },
},
'ACL_APP_GROUPS': {
'ad': { 'name': 'Ads & tracking', 'why': 'Ad and tracking domains; blocking them makes browsing feel noticeably better.' },
'adult': { 'name': 'Adult content', 'why': 'Needs nDPI categories or an external blacklist; recommend blocking it always.' },
'custom': { 'name': 'Custom (domain / IP)', 'why': 'Enter domains or IPs directly; useful for school sites, specific servers and the like.' },
'game': { 'name': 'Games', 'why': 'Online game protocols (including Steam / Xbox / PSN platform traffic).' },
'p2p': { 'name': 'P2P downloads', 'why': 'BT / P2P traffic, often blocked outright to protect the experience of other devices.' },
'social': { 'name': 'Social & entertainment', 'why': 'Major short-video and social platforms — the category parents most often restrict.' },
'study': { 'name': 'Study & work', 'why': 'Usually kept in the whitelist as an "allow" category.' },
'video': { 'name': 'Video streaming', 'why': 'Long-form video platforms; heavy on bandwidth and a common target for time limits.' },
},
'ACL_GROUP_TEMPLATES': {
'guests': { 'name': 'Guest devices', 'why': 'Devices on the guest network; usually allowed internet but blocked from the LAN.' },
'iot': { 'name': 'IoT devices', 'why': 'Cameras, robot vacuums and the like; forbid them from initiating outbound connections and limit what they can reach.' },
'kids': { 'name': 'Children\'s devices', 'why': 'Group a child\'s phone / tablet / study laptop together and apply time limits to them uniformly.' },
'work': { 'name': 'Work devices', 'why': 'Office PCs; give them bandwidth priority and allow work collaboration apps.' },
},
'ACL_TIME_PRESETS': {
'always': { 'name': 'Always in effect', 'why': 'No time limit; the rule applies all the time (useful for a permanent blacklist).' },
'homework': { 'name': 'Homework hours', 'why': 'Weekday evenings; only study apps and essential sites are allowed.' },
'night': { 'name': 'Night-time sleep', 'why': 'Every day 22:00 to 06:30 the next day, crossing midnight; used to cut the internet at night or leave only a whitelist.' },
'school': { 'name': 'School day hours', 'why': 'Monday to Friday 07:00-17:00, used to limit entertainment apps during school hours.' },
'weekend': { 'name': 'Weekends', 'why': 'All day Saturday and Sunday; usually relaxed.' },
},
'ALERT_CHANNELS': {
'bark': { 'n': 'Bark (iOS / Android push)', 'd': 'Enter the Bark server address and device key; tapping the title opens the URL. Self-hosted servers are supported.' },
'smtp': { 'n': 'Email (SMTP)', 'd': 'Good for a work mailbox. Use a dedicated authorisation code as the password, not the main account password.' },
'webhook': { 'n': 'Group bot webhook (DingTalk / WeCom / Lark)', 'd': 'Paste the bot URL directly; the message format is chosen automatically per platform.' },
},
'ALERT_RULES': {
'backup_fail': { 'n': 'Automatic backup failing repeatedly', 'unit': 'x', 'why': 'One backup failure may just mean the disk happened to be full; repeated failures mean the configuration itself is wrong.' },
'disk_full': { 'n': 'Disk usage too high', 'unit': '%', 'why': 'Logs, snapshots and backups all write to the root partition. Above 90% both apt upgrades and database writes can fail, so the default warning fires at 85%.' },
'load_high': { 'n': 'Load consistently high', 'unit': '', 'why': 'On a 2-core machine a sustained load above 3 means something is busy. Short spikes are normal, so this is info-level only, not a fault.' },
'loss_high': { 'n': 'Heavy packet loss to the gateway', 'unit': '%', 'why': 'High ping loss usually means a cable, a port negotiation or Wi-Fi signal problem. It shows up as "pages loading half the time", which is harder to diagnose than a full outage.' },
'mem_high': { 'n': 'Memory usage too high', 'unit': '%', 'why': 'With only 4 GB, running out of free memory takes down dnsmasq and the web panel first — and then you cannot open the interface to read the alert.' },
'snapshot_fail': { 'n': 'Automatic snapshot failing repeatedly', 'unit': 'x', 'why': 'Snapshots are your "undo if I break it" safety net. If they quietly fail for two weeks, you find out on the day you need them that you cannot go back.' },
'temp_high': { 'n': 'CPU temperature too high', 'unit': '\u00b0C', 'why': 'Small x86 boxes cool poorly; above 80 °C it is time to check the fan and dust in the case. If no temperature sensor can be read this rule is skipped automatically, so it will not fire falsely.' },
'wan_down': { 'n': 'Internet link down', 'unit': 's', 'why': 'The link is only declared down after the gateway has stopped responding for this long. Too short a window and a single hiccup (a neighbour’s Wi-Fi, say) gets reported as an outage — and once the messages pile up nobody reads them.' },
},
'BACKUP_SCOPE': {
'外观与个性化': { 'group': 'Appearance and personalisation' },
'敏感文件(需显式勾选才导出)': { 'group': 'Sensitive files (only exported when explicitly ticked)' },
'服务与应用': { 'group': 'Services and applications' },
'界面配置(数据库)': { 'group': 'Interface configuration (database)' },
'网络与防火墙配置': { 'group': 'Network and firewall configuration' },
},
'CLEAN_ITEMS': {
'apt': { 'name': 'APT package cache', 'why': 'Downloaded .deb files and package indexes left over from installs and upgrades. Nobody looks at them afterwards — the safest and most common dead weight here.', 'risk': 'Reinstalling the same package afterwards means downloading it again. On an offline machine (or with a dead mirror) turn this one off.' },
'core': { 'name': 'Crash dumps (coredump)', 'why': 'Memory images the kernel dumps when a program crashes; a single one is often tens or hundreds of MB, and one crash can leave several.', 'risk': 'Only needed when diagnosing a crash; deleting ones older than the configured age does not affect operation.' },
'drouter_log': { 'name': 'Panel runtime logs (old)', 'why': 'Operation and status logs from the panel’s modules, rotated daily by logrotate.', 'risk': 'Same: the live log is not deleted, and the entry above already excludes ulog* so nothing is double counted.' },
'journal': { 'name': 'systemd journal', 'why': 'Standard output from every systemd service plus kernel logs. With no size limit it can reach hundreds of MB over a few months.', 'risk': 'Reclaimed with the official journalctl commands, which will not damage the journal file being written. History older than the configured age is discarded.' },
'snapdl': { 'name': 'Snapshot download leftovers', 'why': 'Archives generated when you download a config snapshot from the panel; useless once downloaded.', 'risk': 'Only .tar.gz files are deleted; the snapshots themselves under /opt/drouter/snapshots are untouched.' },
'tmp': { 'name': 'Temporary files (/tmp, /var/tmp)', 'why': 'Debris left by crashes and interrupted installs. Debian does not clean /tmp automatically by default.', 'risk': 'Only files untouched for 3 days are removed; temporary files in use are always fresh, so they are safe. systemd private directories and desktop runtime directories are excluded.' },
'trash': { 'name': 'File manager trash', 'why': 'Files deleted under "Web Terminal / Files" are moved here so you can undo — but it never shrinks on its own.', 'risk': 'In effect this gives the trash a shelf life; only items older than the configured age are cleared.' },
'ulog': { 'name': 'Firewall flow logs (old)', 'why': 'Records every connection passing through the firewall. This is the fastest-growing file in the system — even before this host takes over routing it can write 1 MB a day, and much more afterwards.', 'risk': 'Only rotated old files are deleted; the live ulog.jsonl is left alone, so no current records are lost.' },
'varlog': { 'name': 'Rotated system logs', 'why': 'Compressed archives rotated out of rsyslog / cups / apt and friends. Once you have looked inside once they have little value.', 'risk': 'Excludes /var/log/drouter (the panel log is managed separately) and the journal directory (reclaimed by systemd itself), avoiding double cleanup and half-deleted state.' },
},
/* Docker 镜像加速源:key = 后端下发的中文说明原文 */
/* Docker/GitHub 镜像加速源:key = 后端 mirrors[].key */
/* DPI 安装方式(后端 presets)—— key = presets[].id */
'DPI_INSTALL_PLANS': {
'apt': {
'name': 'APT install (easiest)',
'why': 'Install straight from the Debian 13 repositories, no compiling. The nDPI version may be slightly older but is fine for home use.',
},
'source': {
'name': 'Build nDPI from source (newest)',
'why': 'Gives you the newest protocol signature database (faster recognition of new apps), but compiling takes a while.',
},
'netfilter': {
'name': 'nDPI Netfilter kernel module',
'why': 'Provides xt_ndpi so nftables/iptables can mark traffic by application. You have to compile it yourself.',
},
},
'DPI_HOSTS': {
'direct': {
'name': 'Direct (no proxy)',
'why': 'No proxy at all. Pick this when you are outside China or already run your own proxy.',
},
'ghproxy': {
'name': 'ghproxy.com',
'why': 'A long-standing public accelerator: fairly stable but occasionally rate-limited.',
},
'gh-proxy': {
'name': 'gh-proxy.com',
'why': 'A backup accelerator supporting both release files and raw files.',
},
'moeyy': {
'name': 'moeyy.cn',
'why': 'Supports both raw and archive downloads; decent speeds.',
},
'ghfast': {
'name': 'ghfast.top',
'why': 'One of the more active accelerator nodes right now.',
},
'ghproxy-net': {
'name': 'ghproxy.net',
'why': 'Backup node; a good try when the others time out.',
},
'gitclone': {
'name': 'gitclone.com',
'why': 'Mirror-style proxy for the whole site, good for git clone (note the URL is assembled differently).',
},
},
'DDNS_PROVIDERS': {
'aliyun': { 'n': 'Alibaba Cloud DNS', 'region': 'China', 'desc': 'AccessKey signature (HMAC-SHA1) calling the Alidns OpenAPI; supports both IPv4 and IPv6 records' },
'cloudflare': { 'n': 'Cloudflare', 'region': 'International', 'desc': 'API token + zone ID; supports A / AAAA records and works on the free plan' },
'custom': { 'n': 'Custom (URL template)', 'region': 'Any', 'desc': 'Enter the update URL your provider gives you; supports the placeholders {ip} {ipv6} {domain} {token} {user} {pass}', 'doc': 'Fill this in per the provider documentation; works with any service that offers HTTP updates' },
'dnspod': { 'n': 'DNSPod (Tencent Cloud)', 'region': 'China', 'desc': 'Uses a DNSPod token (ID,Token) to call Record.Ddns; the most widely used at Chinese homes' },
'dnspod_tencent': { 'n': 'Tencent Cloud DNSPod (SecretId/Key)', 'region': 'China', 'desc': 'Tencent Cloud API 3.0 signature (TC3-HMAC-SHA256); suits existing Tencent Cloud accounts' },
'duckdns': { 'n': 'Duck DNS', 'region': 'International', 'desc': 'Free; a token plus a domain, with a very simple update endpoint' },
'dyndns': { 'n': 'DynDNS', 'region': 'International', 'desc': 'The standard dyndns2 protocol, compatible with many routers and third-party services' },
'dynv6': { 'n': 'dynv6', 'region': 'International', 'desc': 'Free; native support for IPv6 (AAAA) as well as IPv4, updated with a token' },
'freedns': { 'n': 'FreeDNS', 'region': 'International', 'desc': 'Free; uses an automatically generated update hash' },
'godaddy': { 'n': 'GoDaddy', 'region': 'International', 'desc': 'GoDaddy API key + secret; updates A / AAAA records' },
'googledomains': { 'n': 'Google Domains (now Squarespace)', 'region': 'International', 'desc': 'Credentials for the old Google Domains dynamic DNS, now served by Squarespace' },
'he': { 'n': 'Hurricane Electric', 'region': 'International', 'desc': 'Free; uses a DDNS key and is IPv6 friendly' },
'huaweicloud': { 'n': 'Huawei Cloud DNS', 'region': 'China', 'desc': 'Huawei Cloud IAM + DNS API (AK/SK signature); supports dual-stack record sets' },
'namecheap': { 'n': 'Namecheap', 'region': 'International', 'desc': 'Dynamic DNS password plus hostname' },
'noip': { 'n': 'No-IP', 'region': 'International', 'desc': 'The classic HTTP Basic update endpoint at dynupdate.no-ip.com' },
'ovh': { 'n': 'OVH', 'region': 'International', 'desc': 'OVH API (three-key AK/AS/CK signature)' },
'porkbun': { 'n': 'Porkbun', 'region': 'International', 'desc': 'API key + secret key; updates A / AAAA records' },
},
'DPI_SOURCES': {
'ndpi-netfilter': { 'name': 'nDPI Netfilter kernel module', 'why': 'Provides xt_ndpi so nftables / iptables can mark by application directly. You have to build it yourself.' },
'ndpi-protos': { 'name': 'nDPI protocol definitions', 'why': 'nDPI’s protocol signatures (src/lib/protocols + lists) — the core data for "what app is this".' },
'suricata-rules': { 'name': 'Suricata app-detection rules', 'why': 'The suricata-update tool and its default rule sources, used for application-layer blocking and marking.' },
},
'FS_TYPES': {
'btrfs': { 'note': 'Supports snapshots, checksums and online expansion. Turn off copy-on-write (nodatacow) for Samba shares to avoid fragmentation.' },
'exfat': { 'note': 'Best cross-platform choice: Windows / macOS / Linux all read and write it natively, no 4 GB per-file limit — ideal for portable drives.' },
'ext3': { 'note': 'The predecessor of ext4. Only use it when you must talk to very old hardware.' },
'ext4': { 'note': 'The Linux choice: journalled, stable, supports permissions and ACLs. Windows / macOS need a third-party driver to read or write it.' },
'f2fs': { 'note': 'Designed for flash (USB sticks / SSDs / TF cards); noticeably reduces write amplification and extends lifetime.' },
'ntfs': { 'note': 'Native on Windows. Writing from Linux needs ntfs-3g (kernels 5.15+ have a native driver); macOS mounts it read-only by default.' },
'vfat': { 'note': 'Widest compatibility (TVs / car head units / cameras / consoles all accept it). Limits: files ≤ 4 GB, partitions ≤ 2 TB.' },
'xfs': { 'note': 'Handles large files and concurrent writes well, and is fast at deleting many small files. Partitions cannot be shrunk once created.' },
},
'KERN_FW_ITEMS': {
'masquerade_v4': { 'name': 'IPv4 outbound masquerade (SNAT)', 'why': 'Rewrites the private addresses of LAN devices to the router’s own WAN address. A home broadband line usually gets a single public IP, so dozens of devices share one egress through it.' },
'masquerade_v6': { 'name': 'IPv6 outbound masquerade (NAT66)', 'why': 'The IPv6 flavour of address masquerading. Normally unnecessary — IPv6 has enough addresses that every device can have its own public one.' },
'mss_v4': { 'name': 'IPv4 MSS clamping', 'why': 'During the TCP handshake it clamps the maximum segment size to what the link can carry. It is the standard fix for "some sites will not load, images stall halfway, WeChat cannot send pictures" after PPPoE dial-up.' },
'mss_v6': { 'name': 'IPv6 MSS clamping', 'why': 'Same idea as IPv4, but IPv6 negotiates via PMTUD (path MTU discovery) on its own, so manual intervention is rarely needed.' },
},
'KERN_ITEMS': {
'bbr': { 'name': 'BBR congestion control', 'why': 'Google\'s TCP congestion control algorithm. On links with loss or elevated latency it reaches the available bandwidth with lower latency than the system default (cubic).' },
'fwd_v4': { 'name': 'IPv4 forwarding', 'why': 'Decides whether this host forwards packets for others. With it off the machine is just an ordinary host on the LAN and drops packets not addressed to it; with it on the machine actually gains router capability.' },
'fwd_v6': { 'name': 'IPv6 forwarding', 'why': 'The same, for IPv6. If the broadband line has no IPv6 it makes no difference either way.' },
'snmp': { 'name': 'SNMP monitoring', 'why': 'Opens a standard SNMP service so network management software (Zabbix / PRTG / Cacti / LibreNMS) can collect interface traffic, CPU and memory metrics.' },
},
'NFS_PRESETS': {
'legacy': { 'n': 'Legacy devices (insecure)', 'why': 'May be needed for older players and thin clients; it lets the client root write directly, which is risky — use it only on a trusted LAN.' },
'linux': { 'n': 'Linux clients (recommended)', 'why': 'root_squash maps the client root to an anonymous user — the safest option and works with virtually every distribution.' },
'macos': { 'n': 'macOS clients', 'why': 'macOS may mount from a source port above 1024, so insecure is required; all_squash avoids permission conflicts.' },
'readonly': { 'n': 'Read-only export', 'why': 'Read-only, which suits sharing media sources or mirror repositories.' },
'windows': { 'n': 'Windows (WSL2 / Client for Windows)', 'why': 'The Windows NFS client handles permission mapping unusually; pinning the anonymous uid/gid to nobody (65534) is simplest.' },
},
'OH_ITEMS': {
'autostart': { 'name': 'Start on boot', 'why': 'Decides whether OpenSOHO comes up on its own after the machine reboots.' },
'bind': { 'name': 'Listen address', 'why': 'Decides who can reach the controller. APs must be able to connect in order to register, so it has to listen on the LAN.' },
'enable_new_devices': { 'name': 'Adopt new APs automatically', 'why': 'When OpenSOHO discovers a new AP, should it push the configuration to it or just watch it?' },
'encryption': { 'name': 'Encrypt stored config at rest', 'why': 'OpenSOHO\'s settings collection holds sensitive items such as Wi-Fi passwords. Turning this on encrypts those values on disk.' },
'install': { 'name': 'How to install', 'why': 'OpenSOHO is not an apt package; it is a self-contained Go binary. If the router can reach GitHub, one click installs it; otherwise transfer the file in from another machine.' },
'secret': { 'name': 'Shared secret', 'why': 'This is what you paste into openwisp-config on the AP side; get it wrong and registration fails. drouter generates and keeps it — copy it straight from this page.' },
},
'PPPM_STRATEGIES': {
'balance': { 'name': 'Load balance (even split across sessions)', 'why': 'All sessions carry traffic at once, so total throughput is roughly the sum. Suits carriers that allow multi-dial.' },
'primary_backup': { 'name': 'Primary/backup (automatic failover)', 'why': 'Only the first session is used and the rest stand by; traffic switches to the backup when the primary link drops. Suits flaky multi-dial or conserving resources.' },
'weighted': { 'name': 'Weighted (custom weight per session)', 'why': 'Distributes traffic by weight — e.g. two 500M lines plus one 200M line can be set to 5:5:2.' },
},
'PRINT_DRIVERS': {
'everywhere': { 'name': 'Automatic (IPP Everywhere, driverless)', 'note': 'Recommended. Most network printers from 2015 onward, plus AirPrint / Mopria devices, support this. The router does no format conversion — the printer parses it itself.' },
'raw': { 'name': 'Raw (pass through, no conversion)', 'note': 'The client must have the printer driver installed and send already-rendered data. Suits old printers, or cases where the driver will not install on the router.' },
},
'PRINT_ITEMS': {
'browsed': { 'name': 'cups-browsed auto discovery', 'why': 'Searches the LAN for network printers and creates a local queue for each. That is how your HP OfficeJet Pro 7740 was found.' },
'listen': { 'name': 'Allow LAN access', 'why': 'Out of the box CUPS only listens on 127.0.0.1:631, meaning only the machine itself can connect and nothing on the LAN can. This is the most common reason for "CUPS is installed but unusable".' },
'mode': { 'name': 'Working mode (pick one)', 'why': 'Decides how this router provides printing. Switching modes stops the other one automatically so both do not fight over the same USB printer.' },
'remote_admin': { 'name': 'Allow remote administration', 'why': 'Lets other machines on the LAN add or remove queues and change settings through CUPS.' },
'share': { 'name': 'Share the printer', 'why': 'Decides whether the queue is published to the network. Without sharing, only this machine can use the queue and other devices cannot even see it.' },
'web_iface': { 'name': 'CUPS web interface', 'why': 'CUPS\'s built-in web pages: manage queues, view jobs and change settings.' },
},
'QOS_CAKE_MODES': {
'besteffort': { 'name': 'besteffort (no priority)', 'why': 'Priority tiering is off: all traffic shares one queue, made fair by CAKE flow isolation (per host / per flow). Lowest CPU cost, but gaming and voice traffic get no priority.' },
'diffserv3': { 'name': 'diffserv3 (three tiers, recommended)', 'why': 'Three DiffServ tiers: Voice (CS7/CS6/EF/VA; 25% bandwidth share, shortened Codel interval), Best Effort (normal traffic, full bandwidth), Bulk (CS1/LE; low priority, only 6.25% bandwidth share — downloads, BitTorrent, video).' },
'diffserv4': { 'name': 'diffserv4 (four tiers)', 'why': 'Adds a Video tier on top of diffserv3 (AF4x/AF3x/CS3/AF2x/CS2; 50% bandwidth share) and covers more DSCP codes for Voice. One more tin costs slightly more CPU.' },
},
'QOS_IMPACT': {
'CAKE 会占用 CPU': { 'name': 'CAKE costs CPU', 'why': 'CAKE schedules per packet, so the higher the bandwidth the higher the CPU cost. Up to 1 Gbps is usually fine; above 2 Gbps prefer flowtable or XDP (and on a VM the real ceiling is lower).' },
'HTB 按 IP 限速影响面': { 'name': 'Scope of HTB per-IP limits', 'why': 'A limit applies to both directions of one LAN IP at once. Setting the guaranteed bandwidth too low keeps that device permanently slow, so pair guaranteed with peak bandwidth.' },
'与 flowtable 软加速冲突': { 'name': 'Conflicts with flowtable software acceleration', 'why': 'Software acceleration lets established connections bypass netfilter, which breaks DSCP marking and mark-based classification. Turn off software acceleration in "Network Status / Acceleration" before enabling QoS; this module detects it and warns you.' },
'加密流量无法识别应用': { 'name': 'Encrypted traffic cannot be identified', 'why': 'HTTPS / QUIC are encrypted, so ports and DSCP alone cannot tell you which app it is. Enable the DPI module (nDPI) for per-app rules, at the cost of an extra process and CPU.' },
'连接数限制的取舍': { 'name': 'Trade-off in connection limits', 'why': 'Limiting concurrent connections per IP stops a misbehaving device from overwhelming the router, but too low a value makes legitimate apps such as torrent clients and multi-tab browsers fail. Keep it above 300.' },
},
'QOS_PRESETS': {
'bt': { 'name': 'Demote BT / P2P', 'why': 'Drops P2P to the lowest priority so it does not consume bandwidth needed by games and web pages.' },
'dns': { 'name': 'DNS first', 'why': 'Prioritising small DNS packets noticeably improves how fast a page starts loading.' },
'gaming': { 'name': 'Gaming first', 'why': 'Marks the ports Steam / Xbox / PSN commonly use as high priority so they jump the queue.' },
'video': { 'name': 'Video first', 'why': 'Real-time audio/video for video conferencing (Tencent Meeting / Zoom / Teams / WebRTC) and live streaming. af41 sits half a step below gaming and above ordinary web, so the picture stays smooth without squeezing out downloads and games.' },
'voip': { 'name': 'Voice first', 'why': 'SIP and RTP voice traffic get the highest priority, avoiding choppy calls.' },
},
'SHARE_DIR_TEMPLATES': {
'backup': { 'name': 'Backup share (writable by designated hosts only)', 'note': 'Combine with an "allowed subnet" restriction so only the backup server can reach it.' },
'home': { 'name': 'Private folder (account required)', 'note': 'Must be accessed with a username and password; only the users you name can get in.' },
'media': { 'name': 'Media library (read-only)', 'note': 'For TV boxes and players; read-only avoids accidentally deleting the source material.' },
'public': { 'name': 'Public share (everyone can read and write)', 'note': 'Good for files shared across the household; on SMB it is written as nobody, on NFS with all_squash.' },
},
'SNAPSHOT_SCOPE': {
'界面配置(全部模块)': { 'group': 'Interface configuration (all modules)' },
'系统文件': { 'group': 'System files' },
'账号与审计': { 'group': 'Accounts and audit' },
},
'WAN_LOG_SOURCE': {
'pppd 拨号进程日志(journalctl -u pppd-drouter)+ 内核 ppp 链路事件': { 'en': 'pppd dial process log (journalctl -u pppd-drouter) + kernel PPP link events' },
'dhclient / NetworkManager 租约协商日志 + 内核地址事件': { 'en': 'dhclient / NetworkManager lease negotiation log + kernel address events' },
'内核地址与路由事件(netlink)+ 网关可达性探测': { 'en': 'Kernel address/route events (netlink) + gateway reachability probes' },
'pppd 拨号日志 + 内核 IPv6 地址/前缀事件(DHCPv6-PD)': { 'en': 'pppd dial log + kernel IPv6 address/prefix events (DHCPv6-PD)' },
'dhclient(v4/v6)日志 + 内核 IPv6 路由器通告事件': { 'en': 'dhclient (v4/v6) log + kernel IPv6 router advertisement events' },
'内核网桥/链路事件(netlink)': { 'en': 'Kernel bridge/link events (netlink)' },
},
'STORAGE_TYPE': {
'整盘': { 'en': 'whole disk' },
'分区': { 'en': 'partition' },
'光驱': { 'en': 'optical drive' },
},
'STORAGE_BUS': {
'雷电 / USB4': { 'en': 'Thunderbolt / USB4' },
'USB': { 'en': 'USB' },
'NVMe': { 'en': 'NVMe' },
'SATA / SCSI': { 'en': 'SATA / SCSI' },
'虚拟磁盘': { 'en': 'virtual disk' },
'MMC / TF 卡': { 'en': 'MMC / TF card' },
'未知': { 'en': 'unknown' },
},
'AUD_THEMES': {
'电光蓝': { 'en': 'Electric Blue' },
'藏青色': { 'en': 'Navy' },
'暗夜绯红': { 'en': 'Dark Rose' },
'暗夜墨绿': { 'en': 'Dark Green' },
'紫罗兰': { 'en': 'Violet' },
'暖阳': { 'en': 'Warm Sun' },
'青竹': { 'en': 'Teal' },
'Drouter 经典蓝': { 'en': 'Drouter Classic Blue' },
},
/* ---- 1.0.10 补:真机数据渲染暴露出来的后端中文(键=后端下发的中文原文)----
缩进必须 6/8 空格:t-bt-en 的检查器按 `^ '表': {` 数表,
写成 2 空格会被判成「bt4 引用了不存在的表」(2026-10-08 实测)。 ---- */
'KERN_IMPACT': {
'IPv6 不走 NAT,内网设备通常直接拿到公网 v6 地址。所以「转发开了但上不了网」多半是前缀委派(PD)没拿到,去「DHCPv6 / 前缀委派」页看': { 'en': 'IPv6 does not use NAT; LAN devices usually get a public v6 address directly. So if forwarding is on but there is still no Internet, prefix delegation (PD) is most likely missing - check the DHCPv6 / Prefix Delegation page.' },
'clamp(按路由 MTU 自动算)适合绝大多数场景,MTU 变了不用改配置': { 'en': 'clamp (derived from the route MTU) fits almost every setup; nothing to change when MTU changes.' },
'fixed(写死数值)只在多拨 / 隧道 / GRE 这类 MTU 不统一的场景才需要': { 'en': 'fixed (a hard-coded value) is only needed where MTU is inconsistent, e.g. multi-dial, tunnels or GRE.' },
'会同时把默认队列规则设为 fq(BBR 的搭档)。若你在「智能限速 QoS」里手工指定了 qdisc,以 QoS 页为准': { 'en': 'It also sets the default qdisc to fq (BBR companion). If you set a qdisc manually under Smart QoS, the QoS page wins.' },
'会在 UDP 161 开一个监听。团体名(community)相当于只读口令,建议别用默认的 public,并用防火墙限制可访问的网段': { 'en': 'It opens a UDP 161 listener. The community name works as a read-only password - avoid the default public and restrict reachable subnets with the firewall.' },
'做了伪装之后外网看不到内网真实 IP,所以「从外网访问内网服务」才需要单独配端口转发或 DMZ': { 'en': 'With masquerade on, the Internet cannot see real LAN addresses, so publishing an internal service requires port forwarding or DMZ.' },
'关掉之后内网就上不了网 —— 除非上游路由器已经写了回程路由,知道「内网网段走 192.168.7.3」': { 'en': 'Turning it off cuts the LAN off from the Internet - unless the upstream router already has a return route sending the LAN subnet to 192.168.7.3.' },
'单独打开它网络不会立刻变化 —— 还得配合出向地址伪装(masquerade)和正确的路由表,内网才能真正上网': { 'en': 'Enabling it alone changes nothing right away - outbound masquerade and a correct routing table are also required before the LAN can really reach the Internet.' },
'只影响本机自己发起和终结的 TCP 连接(路由器上跑的代理、下载、Docker 拉镜像等),不会影响「经过本机转发」的别人家流量 —— 拥塞控制是通信两端的事,中间的路由器改不了': { 'en': 'It only affects TCP connections originated or terminated by this host (proxies, downloads, Docker pulls), not traffic merely forwarded through it - congestion control belongs to the two endpoints and a middlebox cannot change it.' },
'只有 PPPoE / 隧道把 MTU 压到 1500 以下时才需要考虑打开': { 'en': 'Only worth enabling when PPPoE or a tunnel pushes MTU below 1500.' },
'只有「上游只给一个 /64 且不再下发前缀委派」时才需要它': { 'en': 'Only needed when the upstream hands out a single /64 with no further prefix delegation.' },
'它只决定「转不转」,不决定「安不安全」;访问控制由防火墙规则说了算': { 'en': 'It only decides whether packets are forwarded, not whether that is safe - access control is decided by firewall rules.' },
'将来真正接管路由后,WAN 口照收上游 RA、LAN 口由 radvd 自己发 RA,那时再按接口细分即可': { 'en': 'Once it really takes over routing, the WAN port still accepts upstream RAs while radvd sends RAs on LAN; per-interface tuning can wait until then.' },
'打开 IPv6 转发后,内核就不再接受 accept_ra=1 下的路由通告,靠 SLAAC 拿地址的家宽会在租期到期后丢掉整个 IPv6。本页开启时会自动同时设置 accept_ra=2(意为「开了转发也照收 RA」),这是 OpenWrt / RouterOS 等固件的标准做法': { 'en': 'With IPv6 forwarding on, the kernel no longer accepts router advertisements under accept_ra=1, so SLAAC-only home links lose IPv6 entirely when the lease expires. Enabling it here also sets accept_ra=2 (keep accepting RAs while forwarding), the standard practice of OpenWrt / RouterOS and other firmwares.' },
'打开后内网设备对外只呈现一个 v6 地址,BT、摄像头 P2P、远程桌面这类需要入向连接的应用会失效': { 'en': 'Once on, LAN devices expose a single v6 address outward, so apps needing inbound connections (BT, camera P2P, remote desktop) stop working.' },
'改动后要到「防火墙 IPv4」页点一次「保存并应用」才会生效': { 'en': 'After a change, click Save and apply once on the IPv4 firewall page for it to take effect.' },
'设得太小会让每个包装的数据变少、网速略降;PPPoE 一般 1452,普通以太网 1500 即可': { 'en': 'Too small a value leaves less payload per packet and slightly lowers throughput; 1452 for PPPoE, 1500 for plain Ethernet.' },
'需要先安装 snmpd;没装时本页会提示去「依赖自检与安装」安装': { 'en': 'snmpd must be installed first; when it is missing this page points you to Dependency check and install.' },
'需要内核模块 tcp_bbr(Debian 13 自带)。加载失败会自动退回 cubic,页面会如实显示当前实际生效的算法': { 'en': 'Needs kernel module tcp_bbr (shipped with Debian 13). If loading fails it falls back to cubic and the page shows the algorithm actually in effect.' },
'默认关闭,这是 IPv6 的推荐做法': { 'en': 'Off by default - the recommended setting for IPv6.' },
'默认关闭:家用环境一般用不到,多一个监听就多一分风险': { 'en': 'Off by default: rarely needed at home, and every extra listener adds risk.' },
'默认关闭;打开了却没问题也建议关掉,少一层改写': { 'en': 'Off by default; even when enabling it causes no problem, keeping it off means one less layer of rewriting.' },
},
'PRINT_IMPACT': {
'CUPS 模式:功能最全,手机 / 电脑免驱就能打,但要多跑一个守护进程': { 'en': 'CUPS mode: the most complete feature set, driverless printing from phones and PCs, at the cost of one more daemon.' },
'RAW 直通模式:最省资源、兼容性最好(驱动全在客户端),但客户端必须自己装驱动,也没有队列管理': { 'en': 'RAW passthrough: lightest on resources and most compatible (drivers live on the client), but clients must install drivers themselves and there is no queue management.' },
'依赖 avahi-daemon。它没运行时能打印但发现不了,页面会提示': { 'en': 'Depends on avahi-daemon. Without it printing still works but discovery fails, and the page says so.' },
'关掉不影响打印,只是 631 上的网页打不开': { 'en': 'Turning it off does not affect printing, only the web page on 631 becomes unreachable.' },
'关掉后,已自动生成的队列会消失(手工添加的队列不受影响)': { 'en': 'After turning it off, auto-generated queues disappear (manually added queues are kept).' },
'关闭:把所有打印服务都停掉,端口不再监听': { 'en': 'Off: stops all print services and listens on no port.' },
'它也会把本机的队列再广播出去,供其他机器发现': { 'en': 'It also re-advertises this host queues so other machines can discover them.' },
'将来这台机器真正接管路由后,如果防火墙改了策略,需要确认入站仍然放行 631': { 'en': 'Once this host really takes over routing, if firewall policy changes confirm inbound 631 is still allowed.' },
'开着方便排障;讲究的话可以在打完配置后关掉': { 'en': 'Handy while troubleshooting; you may turn it off once configuration is done.' },
'打开后 CUPS 会监听全部地址的 631 端口': { 'en': 'When enabled, CUPS listens on 631 on all addresses.' },
'打开后会通过 mDNS(avahi)在局域网里广播,iPhone / Android / Windows / macOS 才能自动发现': { 'en': 'When enabled it advertises over mDNS (avahi) on the LAN so iPhone / Android / Windows / macOS can auto-discover it.' },
'打开后同网段的任何人都能改打印配置,只在可信网络里开': { 'en': 'When enabled anyone on the same subnet can change printing settings - only enable on trusted networks.' },
'本页会把访问范围限制在 @LOCAL(直连网段),WAN 侧的机器访问不到 —— 不会把打印机暴露到公网': { 'en': 'This page limits access to @LOCAL (the directly connected subnet); machines on the WAN side cannot reach it, so the printer is never exposed to the Internet.' },
'没有插 USB 打印机时,RAW 模式没有意义 —— 页面会如实提示': { 'en': 'With no USB printer attached, RAW mode is pointless - the page says so plainly.' },
'网络上打印机很多时会生成一堆队列,看着乱,这时可以关掉': { 'en': 'On networks with many printers it spawns a pile of queues; turn it off in that case.' },
'默认关闭 —— 管理操作还是在本机做更安全': { 'en': 'Off by default - administration is safer done on this host.' },
},
'BACKUP_ITEMS': {
'全部模块的设置值(drouter.db 的 settings / ifaces / admins)': { 'en': 'Settings of all modules (settings / ifaces / admins in drouter.db)' },
'网卡备注与角色绑定': { 'en': 'NIC notes and role bindings' },
'网卡与桥接、LAN / WAN 口参数': { 'en': 'NICs and bridges, LAN / WAN port parameters' },
'DHCP 与 DNS(drouter.conf)': { 'en': 'DHCP and DNS (drouter.conf)' },
'IPv6 地址池、RA 通告、DHCPv6 前缀委派': { 'en': 'IPv6 address pools, RA announcements, DHCPv6 prefix delegation' },
'IPv4 / IPv6 防火墙规则集(nftables)': { 'en': 'IPv4 / IPv6 firewall rulesets (nftables)' },
'端口转发与 DMZ、UPnP 配置': { 'en': 'Port forwarding, DMZ and UPnP configuration' },
'PPPoE 拨号配置(不含账号密码)': { 'en': 'PPPoE dial-up configuration (credentials excluded)' },
'智能限速 QoS 规则、应用识别 DPI 前缀库': { 'en': 'Smart QoS rules and the DPI application prefix database' },
'访问控制与家长时间组': { 'en': 'Access control and parental time groups' },
'文件共享 Samba 配置、CUPS 打印配置': { 'en': 'Samba file sharing and CUPS printing configuration' },
'Docker Compose 栈文件与引擎配置(daemon.json)': { 'en': 'Docker Compose stacks and engine configuration (daemon.json)' },
'NTP 时间同步、内核转发与 BBR 参数': { 'en': 'NTP time sync, kernel forwarding and BBR parameters' },
'当前主题、自定义主题文件': { 'en': 'Active theme and custom theme files' },
'CA 证书库与私钥、WireGuard 私钥': { 'en': 'CA certificate store and private keys, WireGuard private keys' },
'PPPoE 宽带账号密码、DHCP 静态绑定 MAC': { 'en': 'PPPoE broadband credentials, DHCP static binding MACs' },
},
'CA_KEY_TYPES': {
'rsa:2048': { 'en': 'RSA 2048 (best compatibility, recommended)' },
'rsa:4096': { 'en': 'RSA 4096 (slower; signing and handshake cost more)' },
'ec:prime256v1': { 'en': 'EC P-256 (faster and lighter; old devices may not support it)' },
},
'IFACE_METHOD': {
'DHCP 自动': { 'en': 'DHCP auto', 'kind': 'info' },
'静态地址': { 'en': 'Static address', 'kind': 'warn' },
'手动': { 'en': 'Manual', 'kind': 'gray' },
'未配置': { 'en': 'Not configured', 'kind': 'gray' },
},
'IFACE_DRVSRC': {
'内核内建': { 'en': 'Kernel built-in', 'kind': 'ok' },
'发行版官方源': { 'en': 'Distro official package', 'kind': 'ok' },
'第三方(DKMS)': { 'en': 'Third-party (DKMS)', 'kind': 'warn' },
'第三方(手工编译)': { 'en': 'Third-party (manually built)', 'kind': 'warn' },
'未知': { 'en': 'Unknown', 'kind': 'gray' },
'内核/其它': { 'en': 'Kernel / other', 'kind': 'warn' },
},
'THEME_DESC': {
'default': { 'en': 'Default theme, blue tones, light interface' },
'teal': { 'en': 'Fresh teal, comfortable for long sessions' },
'violet': { 'en': 'High-contrast purple' },
'dark-green': { 'en': 'Dark theme, easier on the eyes at night' },
'warm': { 'en': 'Warm orange tones, bright and lively' },
'dark-rose': { 'en': 'Dark base with crimson accents' },
'electric-blue': { 'en': 'High-saturation cyan-blue with a glow, good for status lights and charts' },
'navy': { 'en': 'Deep near-black blue with low glare, for night use and long shifts' },
},
'THEME_AUTHOR': {
'Drouter 内置': { 'en': 'Drouter built-in' },
},
'THEME_NAMES': {
'dark-green': { 'name': 'Dark Green', 'desc': 'A dark theme, gentler on the eyes at night' },
'dark-rose': { 'name': 'Dark Rose', 'desc': 'Dark with rose-red accents' },
'default': { 'name': 'Drouter Classic Blue', 'desc': 'The default theme — a blue, light interface' },
'electric-blue': { 'name': 'Electric Blue', 'desc': 'A high-saturation cyan-blue with a glowing feel; good for status lights and charts' },
'navy': { 'name': 'Navy', 'desc': 'Deep blue, near-black; low-glare and easy on the eyes for night and long shifts' },
'teal': { 'name': 'Teal', 'desc': 'A fresh teal-green, easy on the eyes for long sessions' },
'violet': { 'name': 'Violet', 'desc': 'A high-contrast purple tone' },
'warm': { 'name': 'Warm Sun', 'desc': 'A warm orange tone — bright and lively' },
},
'ULOG_SOURCES': {
'app': { 'n': 'Application log', 'desc': 'drouter’s own operations and error records' },
'conntrack': { 'n': 'Connection tracking', 'desc': 'NAT connection create / destroy / update events' },
'ddns': { 'n': 'Dynamic DNS', 'desc': 'DDNS update results and public address changes' },
'flow': { 'n': 'Current connections', 'desc': 'A live snapshot of the connection table (conntrack -L)' },
'fw': { 'n': 'Firewall', 'desc': 'Packets accepted or dropped by nftables (log statements)' },
'system': { 'n': 'System log', 'desc': 'Kernel and system service journal entries' },
'wan': { 'n': 'WAN uplink', 'desc': 'Link-up events: dial-up, DHCP, static addressing and so on' },
},
'WAN_ACCESS_TYPES': {
'bridge': { 'n': 'Bridge / bypass (WAN untouched)', 'desc': 'Layer-2 passthrough / bypass only; no dial-up here, and the WAN state is determined by the upstream device' },
'dhcp': { 'n': 'DHCP (IPoE)', 'desc': 'The ONT already dialled and downstream devices get their addresses automatically; also used for "IPoE, no dial-up" access in some regions' },
'ipoe_dhcp6': { 'n': 'IPoE + DHCPv6-PD (dual stack)', 'desc': 'Both IPv4 and IPv6 are handed down by the upstream device; suits an ONT in routing mode plus direct IPv6' },
'pppoe': { 'n': 'PPPoE dial-up', 'desc': 'ONT in bridge mode + the host or router dials out; needs your broadband account and password (common with China Telecom / Unicom / Mobile / CBN)' },
'pppoe_dhcp6': { 'n': 'PPPoE + DHCPv6-PD (dual stack)', 'desc': 'IPv4 over PPPoE, IPv6 prefix delegated via DHCPv6-PD — the mainstream dual-stack setup in China' },
'static': { 'n': 'Static address (leased line / fixed IP)', 'desc': 'The ISP assigns a fixed public IP; configure the address, gateway and DNS yourself' },
},
/* 后端 _nat_check 下发的中文 title/desc —— 按 nat 枚举值查英文。
* 后端零改动:它继续下发中文,这里按键取值翻译。*/
/* 多拨「使用须知」—— 后端 pppmulti 下发的整句中文,按原文当键 */
'WAN_STATE': {
'未拨号': { 'en': 'Not dialled' },
'已连接': { 'en': 'Connected' },
'连接中…': { 'en': 'Connecting…' },
'重拨中…': { 'en': 'Redialing…' },
'未知状态': { 'en': 'Unknown state' },
'已连接(PPPoE 拨号成功)': { 'en': 'Connected (PPPoE dial-up succeeded)' },
'连接中…(会话已建立,等待认证)': { 'en': 'Connecting… (session established, awaiting authentication)' },
'连接中…(正在与接入服务器协商)': { 'en': 'Connecting… (negotiating with the access server)' },
'未拨号(拨号进程未运行)': { 'en': 'Not dialled (dial-up process not running)' },
'已获取地址(DHCP 协商完成)': { 'en': 'Address obtained (DHCP negotiation complete)' },
'连接中…(等待 DHCP 分配地址)': { 'en': 'Connecting… (waiting for DHCP to assign an address)' },
'未连接(WAN 网卡不存在或未分配)': { 'en': 'Disconnected (WAN NIC missing or unassigned)' },
'链路已就绪(静态配置生效)': { 'en': 'Link ready (static configuration active)' },
'链路已配置但未连通(检查网线与上级端口)': { 'en': 'Link configured but not connected (check cable and upstream port)' },
'网桥已工作(透传模式)': { 'en': 'Bridge working (passthrough mode)' },
'未启用': { 'en': 'Not enabled' },
},
'PPPM_NOTES': {
'多拨能否成功取决于运营商是否允许同一账号并发拨号(部分省份限制为 1 条)。':
{ 'd': 'Whether multi-dial succeeds depends on whether the ISP allows concurrent dialling on one account (some regions cap it at a single session).' },
'尝试 N 个会话前,建议先只用 1 条确认账号可正常拨通。':
{ 'd': 'Before trying N sessions, dial with just one to confirm the account works.' },
'若运营商拒绝并发,会话会反复重拨并在这页显示为「未连接」,属正常现象。':
{ 'd': 'If the ISP refuses concurrent sessions, they keep re-dialling and show as not connected here \u2014 that is normal.' },
'多拨会改变出网路由,请确认已填好账号并显式点击「应用并连接」。':
{ 'd': 'Multi-dial changes the outbound routing, so fill the account in and click Apply and connect explicitly.' },
},
/* DPI「使用须知」—— 后端 act_dpi 下发的整句中文 */
'DPI_NOTES': {
'DPI 需要独立进程(nDPI Reader / Suricata),会额外占用内存;本机为 4GB 内存的虚拟机,建议只装 nDPI 一项。':
{ 'd': 'DPI needs its own process (nDPI Reader / Suricata) and costs extra memory. This host is a 4GB VM, so install nDPI alone.' },
'加密流量(HTTPS/QUIC)无法被 DPI 完整识别,这是所有厂商的共同限制。':
{ 'd': 'Encrypted traffic (HTTPS/QUIC) cannot be fully identified by DPI \u2014 a limitation shared by every vendor.' },
'规则库默认从 GitHub 获取,国内直连常常超时 —— 请在下方选择加速前缀。':
{ 'd': 'The ruleset is fetched from GitHub by default and direct connections from China often time out \u2014 pick an acceleration prefix below.' },
},
/* VLAN 常用预设名 */
'VLAN_PRESETS': {
'中国电信 IPTV': { 'n': 'China Telecom IPTV' },
'中国联通 IPTV': { 'n': 'China Unicom IPTV' },
'中国移动 IPTV': { 'n': 'China Mobile IPTV' },
'中国广电 IPTV': { 'n': 'China Broadcasting IPTV' },
'通用 VLAN': { 'n': 'Generic VLAN' },
},
/* DDNS 自定义(URL 模板)服务商 */
'DDNS_REGION': {
'通用': { 'en': 'Generic' },
'国内': { 'en': 'Domestic' },
'国际': { 'en': 'International' },
},
'DDNS_CUSTOM': {
'自定义(URL 模板)': { 'n': 'Custom (URL template)' },
'填入服务商给出的更新 URL,支持占位符 {ip} {ipv6} {domain} {token} {user} {pass}':
{ 'd': 'Paste the update URL your provider gives you. Placeholders: {ip} {ipv6} {domain} {token} {user} {pass}.' },
'按服务商文档填写;适用于任何提供 HTTP 更新的服务商':
{ 'd': 'Fill this in per your provider\u2019s documentation; it works with any provider offering an HTTP update endpoint.' },
},
/* WOL 不可用原因(后端下发中文)*/
'WOL_REASON': {
'该网卡或驱动未上报 WOL 能力':
{ 'd': 'This NIC or its driver does not report WOL capability' },
'网卡不支持 WOL': { 'd': 'This NIC does not support WOL' },
},
/* 系统概览:温度不可用 / 虚拟化说明(后端下发中文)*/
'SYSINFO_NOTES': {
'宿主机的 CPU 温度传感器通常不随虚拟机暴露。若宿主机为物理机,可在 Proxmox 中把温度相关 PCI 设备(如带温度上报的 BMC/IPMI、或部分 USB HID 传感器)直通给本虚拟机;成功率取决于平台与硬件。': { 'n': 'Host temperature sensor unavailable',
'd': 'Host CPU temperature sensors are not exposed to the guest' },
'QEMU / KVM 虚拟机': { 'n': 'QEMU / KVM virtual machine' },
'传统 BIOS': { 'n': 'Legacy BIOS', 'd': 'Legacy BIOS' },
'UEFI': { 'n': 'UEFI', 'd': 'UEFI' },
/* arm64 适配:ARM 板没有 BIOS,走 U-Boot + 设备树启动 */
'设备树 (Device Tree)':
{ 'n': 'Device Tree',
'd': 'Device Tree / U-Boot boot. ARM and RISC-V boards have no BIOS: the bootloader hands the kernel a device tree describing the hardware.' },
'未读取到温度传感器,仅显示进程数':
{ 'd': 'No temperature sensor found; only the process count is shown' },
'未读取到温度': { 'd': 'No temperature reading' },
'当前运行在 QEMU / KVM 虚拟机 中,虚拟化层默认不会把宿主机 CPU 温度传感器暴露给客户机,因此温度无法读取。宿主机的 CPU 温度传感器通常不随虚拟机暴露。若宿主机为物理机,可在 Proxmox 中把温度相关 PCI 设备(如带温度上报的 BMC/IPMI、或部分 USB HID 传感器)直通给本虚拟机;成功率取决于平台与硬件。':
{ 'd': 'This machine runs as a QEMU / KVM guest. The virtualization layer does not expose the host CPU temperature sensor by default, so the reading is unavailable. On a physical host you can pass the relevant PCI device (a BMC/IPMI with temperature reporting, or some USB HID sensors) through to this VM in Proxmox; success depends on the platform and hardware.' },
},
/* 页面级整段说明(后端下发中文)—— 按原文当键,bt4 查英文 */
/* 页面级整段说明(后端下发中文)—— key 逐字节等于真机原文 */
'PAGE_NOTES': {
'当前内核里没有 drouter 的防火墙规则(nft 规则集为空),还没有任何包经过本机的防火墙链,所以这里不会有记录。请到「防火墙 IPv4 / IPv6」页面点一次「应用」,规则载入后即可开始记录。':
{ 'd': 'There are no drouter firewall rules in the kernel yet (the nft ruleset is empty), so no packet has traversed the firewall chain and there is nothing to show. Open the "Firewall IPv4 / IPv6" page and click "Apply" once — recording starts as soon as the rules are loaded.' },
'防火墙日志开关当前为关闭:规则里不会生成 log 语句,因此这里不会有新记录。':
{ 'd': 'The firewall logging switch is currently off: the rules contain no log statements, so no new records will appear here.' },
'所有接口统一返回 {"ok":..,"msg_cn":..,"data":..};失败时 ok=false。除 /api/health、/api/login 外均需 X-Token 头。':
{ 'd': 'Every endpoint returns {"ok":..,"msg_cn":..,"data":..}; on failure ok=false. Everything except /api/health and /api/login requires the X-Token header.' },
'按 Diffserv 分为三档:语音(CS7/CS6/EF/VA,占 25% 带宽份额,Codel 间隔缩短)、尽力(普通流量,占满带宽)、批量(CS1/LE,低优先级,只分到 6.25% 带宽份额,用于下载 / BT / 视频等大流量)。':
{ 'd': 'Three tiers by Diffserv: voice (CS7/CS6/EF/VA, 25% of bandwidth, shorter Codel intervals), best-effort (normal traffic, full bandwidth) and bulk (CS1/LE, lowest priority, 6.25% of bandwidth).' },
'时间规则按北京时间(UTC+8)换算后写入内核;跨零点的时间段会自动拆成两段。应用识别依赖 DPI 库,限速动作依赖 QoS 模块。':
{ 'd': 'Time rules are converted to Beijing time (UTC+8) before being written into the kernel; a period crossing midnight is split into two. App identification relies on the DPI database, and rate-limit actions rely on the QoS module.' },
'外接 U 盘 / 移动硬盘 / Type-C 与雷电硬盘盒会显示在下方。「连接方式」显示的是总线类型(USB / 雷电 / NVMe / SATA);Type-C 是插头形态,电气上仍归 USB 或雷电,因此按总线展示更准确。':
{ 'd': 'External USB drives, portable disks and Thunderbolt enclosures are listed below.' },
'真正的 Wi-Fi、VLAN、PoE 配置都在 OpenSOHO 自己的控制台里做 —— 这里只负责把它装好、管住、把入口给你。AP 侧需要在 OpenWRT 上装 openwisp-config 并填入下面的共享密钥来注册。':
{ 'd': 'The actual Wi-Fi, VLAN and PoE configuration is done in OpenSOHO\\u2019s own console \\u2014 this page only installs it, keeps it running and gives you the entry point.' },
'SMB 面向 Windows / macOS / Linux 全平台,兼容性最好;NFS 更适合 Linux 之间互传,性能更高但 Windows 需要额外客户端。两者可以同时开启,共享同一个目录。':
{ 'd': 'SMB covers Windows, macOS and Linux with the best compatibility; NFS suits transfers between Linux machines and performs better, but Windows needs an extra client. Both can be enabled at once and share the same directory.' },
'Docker 面板支持容器/镜像/网络/卷的日常运维,以及 Compose 项目管理。「命令转换」可以把任意 docker run 命令转成 docker-compose.yml。':
{ 'd': 'This panel handles day-to-day container, image, network and volume work plus Compose project management. The command converter turns any docker run command into docker-compose.yml.' },
'不使用任何代理。海外网络或已自建代理时选这个。':
{ 'd': 'No proxy at all. Pick this when you are outside China or already run your own proxy.' },
'老牌公共加速,稳定性一般,偶尔限流。':
{ 'd': 'A long-standing public accelerator: fairly stable but occasionally rate-limited.' },
'备用加速,支持 release 文件与 raw 文件。':
{ 'd': 'A backup accelerator supporting both release files and raw files.' },
'Debian 13 仓库直接装,无需编译。nDPI 版本可能略旧,但够家用。':
{ 'd': 'Install straight from the Debian 13 repositories, no compiling. The nDPI version may be slightly older but is fine for home use.' },
},
'DEP_GROUPS': {
'core': { 'n': 'Core runtime' },
'sys': { 'n': 'System basics' },
'net': { 'n': 'Network & diagnostics' },
'fw': { 'n': 'Firewall & NAT' },
'storage': { 'n': 'Removable storage & filesystems' },
'share': { 'n': 'File sharing' },
'qos': { 'n': 'QoS & traffic' },
'print': { 'n': 'Print service' },
'ac': { 'n': 'Wireless AC / AP' },
'monitor': { 'n': 'Monitoring & SNMP' },
'container': { 'n': 'Containers' },
'desktop': { 'n': 'Desktop environment' },
},
'DEP_ITEMS': {
'python3': { 'n': 'Python 3 runtime', 'd': 'Foundation of the backend and management services' },
'dnsmasq': { 'n': 'dnsmasq (DHCP/DNS)', 'd': 'LAN DHCP and DNS service' },
'dnsmasq-utils': { 'n': 'dnsmasq-utils (DHCP tools)', 'd': 'Actively release DHCP leases (falls back to deleting the lease file + reload when missing)' },
'radvd': { 'n': 'radvd (IPv6 RA)', 'd': 'IPv6 Router Advertisement' },
'dhcpcd': { 'n': 'dhcpcd (DHCPv6 client)', 'd': 'IPv6 prefix delegation and address acquisition' },
'pppd': { 'n': 'pppd (PPPoE dial-up)', 'd': 'Broadband PPPoE dialing' },
'chrony': { 'n': 'chrony (NTP time sync)', 'd': 'System time synchronisation' },
'chronyc': { 'n': 'chronyc (NTP query)', 'd': 'Check time sources and offset (same package as chrony)' },
'nftables': { 'n': 'nftables firewall', 'd': 'IPv4/IPv6 firewall and software fast path' },
'miniupnpd': { 'n': 'miniupnpd (UPnP)', 'd': 'UPnP / NAT-PMP automatic port mapping' },
'conntrack': { 'n': 'conntrack (connection tracking)', 'd': 'Inspect the connection tracking table and verify acceleration' },
'nft-flowtable': { 'n': 'nf_flow_table kernel module', 'd': 'Software fast path (flowtable) dependency' },
'nf-conntrack': { 'n': 'nf_conntrack kernel module', 'd': 'NAT and connection tracking dependency' },
'nf-nat': { 'n': 'nf_nat kernel module', 'd': 'Address translation dependency' },
'ethtool': { 'n': 'ethtool (NIC tool)', 'd': 'NIC state, WOL wake-up, hardware offload' },
'curl': { 'n': 'curl (HTTP client)', 'd': 'Diagnostics, WAN checks and the external lookups of the "real public IP decision"' },
'iproute2': { 'n': 'iproute2 (ip/ss/tc)', 'd': 'Interface, route and traffic-control management' },
'iperf3': { 'n': 'iperf3 (bandwidth test)', 'd': 'Speed test tool' },
'traceroute': { 'n': 'traceroute (route tracing)', 'd': 'Diagnostic tool' },
'dnsutils': { 'n': 'dnsutils (dig/nslookup)', 'd': 'DNS diagnostics' },
'iputils': { 'n': 'iputils (ping/arping)', 'd': 'Connectivity diagnostics' },
'socat': { 'n': 'socat (port tool)', 'd': 'Serial/TCP debugging' },
'wget': { 'n': 'wget (downloader)', 'd': 'Command-line downloads' },
'mtr': { 'n': 'mtr (route tracing)', 'd': 'Continuously trace every hop to a target' },
'etherwake': { 'n': 'etherwake (Wake-on-LAN)', 'd': 'WOL wake-up. Falls back to a Python broadcast magic packet when missing; the feature is unaffected' },
'wireguard-tools': { 'n': 'WireGuard tools (wg / wg-quick)', 'd': 'VPN server: reach your LAN from outside. Without it the VPN page cannot generate keys or edit the config' },
'nmcli': { 'n': 'NetworkManager (nmcli)', 'd': 'Only used to detect how NICs are configured. Intentionally not installable: NetworkManager would fight the router config for the NICs' },
'networkctl': { 'n': 'systemd-networkd (networkctl)', 'd': 'Only used to detect NIC configuration; not installable either' },
'sqlite3': { 'n': 'SQLite3 (config DB)', 'd': 'Configuration database (Python\'s built-in sqlite3 also works)' },
'openssl': { 'n': 'OpenSSL (cert tool)', 'd': 'Generate the panel\'s self-signed certificate, import CA certs, SSL tests' },
'ca-certs': { 'n': 'CA root certificates', 'd': 'HTTPS requests and certificate verification' },
'systemd': { 'n': 'systemd (service manager)', 'd': 'Service and timer hosting. No one-click install when missing (the system form needs manual review)' },
'sudo': { 'n': 'sudo (privilege whitelist)', 'd': 'Privileged operations called from the low-privilege backend' },
'logrotate': { 'n': 'logrotate (log rotation)', 'd': 'Keeps logs from filling the disk. The auto-clean on the "Disk & log cleanup" page depends on it' },
'kmod': { 'n': 'modprobe / modinfo (kernel modules)', 'd': 'Entry point for loading the CAKE / HTB queue modules and fast-path modules for QoS' },
'procps': { 'n': 'ps / pkill (process tools)', 'd': 'Overview process list and service status queries' },
'coreutils': { 'n': 'df / du / ls (basic tools)', 'd': 'Disk usage stats and the directory scans on the "Disk & log cleanup" page' },
'tar': { 'n': 'tar (archiver)', 'd': 'Theme import/export, config backup packing' },
'hostname': { 'n': 'hostname', 'd': 'Hostname shown on the overview page and in terminal prompts' },
'udev': { 'n': 'udevadm (device events)', 'd': 'USB printer / removable drive hot-plug detection and RAW passthrough permissions' },
'zip': { 'n': 'zip / unzip (archived download)', 'd': 'Compress folders for download' },
'p7zip': { 'n': '7z (high compression)', 'd': 'Compress large files' },
'vim': { 'n': 'vim (editor)', 'd': 'Edit config files in the web terminal' },
'htop': { 'n': 'htop (process monitor)', 'd': 'View processes in the web terminal' },
'journalctl': { 'n': 'journalctl (system log)', 'd': 'Collect system logs into the unified log. Missing means this is not a systemd system; review manually' },
'util-linux': { 'n': 'lsblk / mount (block devices)', 'd': 'Removable storage: detect devices, size and connection type (USB / Thunderbolt / NVMe), mount and unmount' },
'usbutils': { 'n': 'lsusb (USB device list)', 'd': 'Removable storage & USB printers: list devices and vendor IDs on the USB bus' },
'e2fsprogs': { 'n': 'mkfs.ext4 / mkfs.ext3 (ext4 format)', 'd': 'Removable storage: Linux-native ext4/ext3, journaling with permission and ACL support' },
'exfatprogs': { 'n': 'mkfs.exfat (exFAT format)', 'd': 'Removable storage: first choice for cross-platform portable drives (readable by Windows / macOS / Linux)' },
'ntfs-3g': { 'n': 'mkfs.ntfs (NTFS format)', 'd': 'Removable storage: Windows-compatible NTFS' },
'dosfstools': { 'n': 'mkfs.vfat (FAT32 format)', 'd': 'Removable storage: the most universally compatible FAT32' },
'xfsprogs': { 'n': 'mkfs.xfs (XFS format)', 'd': 'Removable storage: strong with large files and concurrent writes; deletes many small files quickly' },
'btrfs-progs': { 'n': 'mkfs.btrfs (Btrfs format)', 'd': 'Removable storage: Btrfs with snapshots and checksums' },
'f2fs-tools': { 'n': 'mkfs.f2fs (F2FS format)', 'd': 'Removable storage: F2FS designed for flash (USB sticks / SSDs / TF cards); reduces write amplification' },
'smartmontools': { 'n': 'smartctl (disk health)', 'd': 'Removable storage: read SMART health. Optional because installing starts the smartd daemon' },
'samba': { 'n': 'Samba (SMB/CIFS share)', 'd': 'File sharing: shared folders for Windows / macOS. Debian auto-enables smbd after install' },
'samba-common': { 'n': 'Samba account tool (smbpasswd)', 'd': 'File sharing: set access accounts for SMB shares' },
'nfs-server': { 'n': 'NFS server', 'd': 'File sharing: NFS mounts from Linux / NAS. Auto-enables nfs-server after install' },
'iftop': { 'n': 'iftop (live traffic)', 'd': 'Real-time traffic monitor' },
'tc': { 'n': 'tc (traffic control)', 'd': 'QoS shaping and queueing (CAKE / HTB)' },
'tcpdump': { 'n': 'tcpdump (packet capture)', 'd': 'On-interface packet diagnostics' },
'cups': { 'n': 'CUPS print service', 'd': 'Printing: share USB / network printers to the LAN. Starts the cups daemon after install' },
'cups-client': { 'n': 'lpadmin / lpstat (printer admin)', 'd': 'Printing: add, remove and query printer queues' },
'opensoho': { 'n': 'OpenSOHO (AC / AP controller)', 'd': 'AC/AP centre: centrally manage OpenWRT AP Wi-Fi / VLAN / PoE. Not an apt package; install it on the "Services -> AC/AP centre" page' },
'snmpd': { 'n': 'snmpd (SNMP server)', 'd': 'SNMP monitoring: let NMS software poll traffic and interface data. Starts snmpd after install' },
'snmp-cli': { 'n': 'snmpwalk / snmpget (SNMP client)', 'd': 'SNMP monitoring: verify snmpd actually answers during the self-check' },
'lm-sensors': { 'n': 'sensors (temperature & voltage)', 'd': 'CPU / board temperature probes for the overview hardware dashboard' },
'dmidecode': { 'n': 'dmidecode (BIOS/hardware)', 'd': 'Overview reads BIOS version, board and memory info from it' },
'docker': { 'n': 'Docker engine', 'd': 'Docker container management panel. Starts the docker service after install' },
'docker-compose': { 'n': 'Docker Compose plugin', 'd': 'Container orchestration (docker compose up). The path varies by distro; probed one by one here' },
'xfce': { 'n': 'XFCE desktop environment', 'd': 'Desktop environment. Only if you want a GUI; the router itself does not need one' },
'xorg': { 'n': 'Xorg display server', 'd': 'GUI foundation (installed with the desktop)' },
'vnc': { 'n': 'RealVNC Server', 'd': 'Remote graphical desktop. This system never modifies it; only prompts when missing' },
},
'DCFG_MIRRORS': {
'tencent': { 'n': 'Tencent Cloud', 'd': 'Tencent Cloud public mirror — stable long-term, no login needed.' },
'daocloud': { 'n': 'DaoCloud', 'd': 'DaoCloud public accelerator — good availability in China.' },
'netease': { 'n': 'NetEase', 'd': 'NetEase\'s long-standing mirror — stable, occasionally lags on sync.' },
'ustc': { 'n': 'USTC', 'd': 'Good on CERNET and China Telecom links; may throttle at peak.' },
'nju': { 'n': 'Nanjing University', 'd': 'NJU open-source mirror; preferred by CERNET users.' },
'sjtug': { 'n': 'Shanghai Jiao Tong University', 'd': 'SJTUG mirror; fast in East China.' },
'aliyun': { 'n': 'Aliyun (dedicated URL required)', 'd': 'Aliyun no longer offers a generic accelerator URL. Get your own https://xxxx.mirror.aliyuncs.com address from the Container Registry console and fill it in as the custom mirror below.' },
},
'SHARE_TEXTS': {
'Windows 10 / 11': { 'd': 'Windows 10 / 11' },
'macOS': { 'd': 'macOS' },
'Linux': { 'd': 'Linux' },
'若弹出凭据窗口:用户名填 drouter(或你创建的账号),密码为对应密码;公共盘可勾选「使用其他账户」后留空直接确定。':
{ 'd': 'If a credentials prompt appears: enter drouter (or the account you created) as the username and its password; for public shares you can tick "Use another account" and confirm with it left empty.' },
'右键该共享 →「映射网络驱动器」,即可长期使用。':
{ 'd': 'Right-click the share -> "Map network drive" to keep using it permanently.' },
'Windows 需在「启用或关闭 Windows 功能」里勾选「NFS 客户端」才能挂载 NFS。一般用 SMB 即可。':
{ 'd': 'Windows needs the "NFS client" ticked in "Turn Windows features on or off" to mount NFS. SMB is usually enough.' },
'访达 → 顶部菜单「前往」→「连接服务器」(⌘K)':
{ 'd': 'Finder -> menu "Go" -> "Connect to Server" (Cmd+K)' },
'macOS 自带 NFS v3/v4 客户端;SMB 更推荐,兼容性与权限处理都更好。':
{ 'd': 'macOS ships NFS v3/v4 clients; SMB is still recommended for better compatibility and permission handling.' },
'SMB:安装 cifs-utils 后挂载;NFS:安装 nfs-common 后挂载。':
{ 'd': 'SMB: install cifs-utils then mount; NFS: install nfs-common then mount.' },
'把挂载写进 /etc/fstab 可开机自动挂载。':
{ 'd': 'Write the mount into /etc/fstab to mount automatically at boot.' },
'NFS 在 Linux 上性能最好,推荐局域网内 Linux 之间使用。':
{ 'd': 'NFS performs best on Linux; recommended between Linux machines on the LAN.' },
'SMB 面向 Windows / macOS / Linux 全平台,兼容性最好;NFS 更适合 Linux 之间互传,性能更高但 Windows 需要额外客户端。两者可以同时开启,共享同一个目录。':
{ 'd': 'SMB works across Windows / macOS / Linux with the best compatibility; NFS suits Linux-to-Linux transfers better with higher performance but needs an extra client on Windows. Both can be enabled at the same time and share the same folders.' },
},
'OPENAPI_TEXTS': {
'通用': { 'en': 'General' },
'鉴权': { 'en': 'Auth' },
'只读观测': { 'en': 'Read-only observation' },
'网络诊断': { 'en': 'Network diagnostics' },
'网络加速': { 'en': 'Network acceleration' },
'二层网络': { 'en': 'L2 network' },
'版本更新': { 'en': 'Version update' },
'WAN 接入': { 'en': 'WAN access' },
'服务': { 'en': 'Services' },
'寻址与路由': { 'en': 'Addressing & routing' },
'安全': { 'en': 'Security' },
'工具': { 'en': 'Tools' },
'日志与审计': { 'en': 'Logging & audit' },
'主题之家': { 'en': 'Themes' },
'配置管理': { 'en': 'Config management' },
'系统维护': { 'en': 'System maintenance' },
'审计': { 'en': 'Audit' },
'文件管理': { 'en': 'File management' },
'健康检查(无需登录)': { 'en': 'Health check (no login required)' },
'登入获取 Token': { 'en': 'Log in to get a token' },
'系统概览(CPU / 内存 / 磁盘 / 进程 / 温度 / 虚拟化)': { 'en': 'System overview (CPU / memory / disk / processes / temperature / virtualisation)' },
'网络接口列表': { 'en': 'Network interface list' },
'路由表': { 'en': 'Routing table' },
'受管服务状态': { 'en': 'Managed service status' },
'防火墙规则快照': { 'en': 'Firewall rules snapshot' },
'DHCP 租约': { 'en': 'DHCP leases' },
'IPv6 地址与 RA 状态': { 'en': 'IPv6 addresses and RA status' },
'时间同步状态': { 'en': 'Time sync status' },
'日志': { 'en': 'Logs' },
'系统日志': { 'en': 'System logs' },
'上游链路详情(IPv4/IPv6 协议、地址、网关、DNS、DHCPv6 统计)': { 'en': 'Upstream link details (IPv4/IPv6 protocol, address, gateway, DNS, DHCPv6 stats)' },
'邻居表 / 路由表 / IPv6 规则表': { 'en': 'Neighbour table / routing table / IPv6 rule table' },
'NAT 类型自动检测(STUN)': { 'en': 'Automatic NAT type detection (STUN)' },
'nftables flowtable 软加速 开关/查询': { 'en': 'nftables flowtable software fast path on/off/query' },
'VLAN 接口 查询/保存/应用/删除': { 'en': 'VLAN interfaces: query/save/apply/delete' },
'WOL 网络唤醒 / 网卡能力查询': { 'en': 'WOL wake-on-LAN / NIC capability query' },
'下载指定版本的安装包(先备份→官方源下载→SHA256 校验)': { 'en': 'Download the package of a given version (backup first -> official source -> SHA256 verify)' },
'中断正在进行的更新下载': { 'en': 'Abort the update download in progress' },
'PPPoE 多拨:查询/保存/应用/启停/单会话操作': { 'en': 'PPPoE multi-session: query/save/apply/start-stop/per-session ops' },
'PPPoE 单会话日志与排错建议': { 'en': 'PPPoE per-session log and troubleshooting hints' },
'QoS 智能限速:查询/保存/启用/停用/重置': { 'en': 'QoS smart shaping: query/save/enable/disable/reset' },
'DPI 识别库:状态/代理测速/更新': { 'en': 'DPI signature DB: status/proxy speed test/update' },
'DPI 更新日志': { 'en': 'DPI update log' },
'WAN 接入方式统一实时日志与状态(PPPoE/DHCP/静态/双栈/桥接)': { 'en': 'Unified live log and status for the WAN access mode (PPPoE/DHCP/static/dual-stack/bridge)' },
'动态域名 DDNS:查询/保存/启停/公网检测/立即更新': { 'en': 'Dynamic DNS: query/save/on-off/public-IP check/update now' },
'端口转发与 DMZ:查询/保存(渲染为 nftables DNAT)': { 'en': 'Port forwarding and DMZ: query/save (rendered as nftables DNAT)' },
'访问控制与家长时间组:查询/保存/启停/渲染预览(nftables)': { 'en': 'Access control and parental time groups: query/save/on-off/preview (nftables)' },
'内网文件共享 SMB / NFS:查询/保存/启停/建目录/渲染预览': { 'en': 'LAN file sharing SMB / NFS: query/save/on-off/mkdir/preview' },
'外置存储设备(USB / Type-C / 雷电):识别设备、挂载、卸载、格式化(ext4/xfs/btrfs/f2fs/exfat/ntfs/vfat)、开机自动挂载': { 'en': 'Removable storage (USB / Type-C / Thunderbolt): detect, mount, unmount, format (ext4/xfs/btrfs/f2fs/exfat/ntfs/vfat), mount at boot' },
'Docker / Compose 面板:状态查询、容器运维、镜像/网络/卷、Compose 项目管理、docker run → compose 转换': { 'en': 'Docker / Compose panel: status, container ops, images/networks/volumes, Compose projects, docker run -> compose conversion' },
'连接跟踪与统一日志:查询/当前连接表/保存保留策略/清理/导出': { 'en': 'Connection tracking and unified logs: query/current connections/save retention/clean/export' },
'当前连接跟踪表快照(conntrack -L,含传输字节)': { 'en': 'Snapshot of the current connection tracking table (conntrack -L, with byte counters)' },
'统一日志配置与采集能力自检': { 'en': 'Unified log config and collection capability self-check' },
'主题列表 / 主题详情 / 可定制变量清单': { 'en': 'Theme list / theme details / customisable variable list' },
'主题保存 / 删除 / 应用 / 复位 / 导出 / 导入 / 预览 / 配色': { 'en': 'Theme save / delete / apply / reset / export / import / preview / palette' },
'配置渲染预览(只读,不写盘)': { 'en': 'Config render preview (read-only, nothing written to disk)' },
'运行依赖自检': { 'en': 'Runtime dependency self-check' },
'一键安装缺失依赖': { 'en': 'One-click install of missing dependencies' },
'读取全部结构化配置': { 'en': 'Read all structured config' },
'应用配置(渲染 + 校验 + 回滚保护)': { 'en': 'Apply config (render + validate + rollback protection)' },
'创建快照': { 'en': 'Create snapshot' },
'快照列表': { 'en': 'Snapshot list' },
'回滚到指定快照': { 'en': 'Roll back to a given snapshot' },
'审计日志': { 'en': 'Audit log' },
'列目录': { 'en': 'List directory' },
'下载文件': { 'en': 'Download file' },
'读取文本(预览)': { 'en': 'Read text (preview)' },
'文件校验值': { 'en': 'File checksum' },
'关键词搜索': { 'en': 'Keyword search' },
'新建目录': { 'en': 'Create directory' },
'重命名': { 'en': 'Rename' },
'删除(走回收站)': { 'en': 'Delete (goes to trash)' },
'打包 zip': { 'en': 'Pack as zip' },
'目标路径': { 'en': 'Target path' },
'cURL(最通用,Linux/macOS/Windows 均可)': { 'en': 'cURL (most universal; Linux/macOS/Windows)' },
'Python(仅用标准库 requests 可省)': { 'en': 'Python (standard library only; requests optional)' },
'JavaScript / Node.js / 浏览器 fetch': { 'en': 'JavaScript / Node.js / browser fetch' },
'Go(net/http 标准库)': { 'en': 'Go (net/http standard library)' },
'Java 11+(HttpClient)': { 'en': 'Java 11+ (HttpClient)' },
'PHP(file_get_contents / curl 通用写法)': { 'en': 'PHP (file_get_contents / curl)' },
'Shell(wget 版,无 curl 环境)': { 'en': 'Shell (wget variant, when curl is absent)' },
'PowerShell(Windows)': { 'en': 'PowerShell (Windows)' },
'原始 HTTP 报文(任何 HTTP 客户端 / 工单系统 / IoT)': { 'en': 'Raw HTTP messages (any HTTP client / ticketing system / IoT)' },
},
'AUDIT_ACTIONS': {
'登录成功': { 'n': 'Login success' },
'登录失败': { 'n': 'Login failed' },
'创建快照': { 'n': 'Create snapshot' },
'删除快照': { 'n': 'Delete snapshot' },
'快照保护': { 'n': 'Snapshot protection' },
'清理快照': { 'n': 'Clean snapshots' },
'修改快照备注': { 'n': 'Edit snapshot note' },
'导出配置备份': { 'n': 'Export config backup' },
'清理配置备份': { 'n': 'Clean config backups' },
'应用配置': { 'n': 'Apply config' },
'保存配置': { 'n': 'Save config' },
'主题之家': { 'n': 'Themes' },
'诊断工具': { 'n': 'Diagnostics' },
'租约转静态': { 'n': 'Lease -> static' },
'停止 VPN': { 'n': 'Stop VPN' },
'紧急救援通道': { 'n': 'Rescue channel' },
'PPPoE 控制': { 'n': 'PPPoE control' },
'应用 VPN 配置': { 'n': 'Apply VPN config' },
},
'NAT_TYPES': {
'NONE': {
't': 'Direct public exposure (no NAT)',
'd': 'This host\u2019s own address matches the public mapping exactly \u2014 it is exposed to the internet directly.',
},
'NAT1': {
't': 'NAT1 \u00b7 Full Cone',
'd': 'The most compatible NAT type. Any external host can reach you back through this mapped port, which suits P2P, remote gaming and self-hosted services.',
},
'NAT2': {
't': 'NAT2 \u00b7 Address-Restricted Cone',
'd': 'The public address is stable but the mapped port varies per destination. Once you have contacted a host first, it can connect back. Fine for everyday browsing and gaming.',
},
'NAT3': {
't': 'NAT3 \u00b7 Port-Restricted Cone',
'd': 'You are behind carrier-grade NAT: the mapping points at an address inside the ISP network. P2P and port mapping succeed far less often.',
},
'NAT4': {
't': 'NAT4 \u00b7 Symmetric',
'd': 'Every destination gets a different mapped address, so compatibility is worst. Common on corporate or carrier symmetric NAT; P2P basically needs a relay.',
},
'NA': { 't': 'Unknown', 'd': 'Not enough samples to judge reliably' },
},
'WIZ_DNS_PRESETS': {
'114': { 'n': '114DNS', 'd': 'A carrier-grade public resolver: stable, but latency can be mediocre in some regions.' },
'ali': { 'n': 'Alibaba Cloud AliDNS', 'd': 'The fastest and widest-reaching resolver inside China; the usual choice for home broadband.' },
'cf': { 'n': 'Cloudflare', 'd': 'An overseas resolver. Direct latency from China is high, which can make domestic sites slower.' },
'dnspod': { 'n': 'Tencent DNSPod', 'd': 'A long-standing Chinese resolver that is fairly aggressive about blocking malicious domains.' },
'gg': { 'n': 'Google Public DNS', 'd': 'An overseas resolver. Often blocked or interfered with in China, so rarely the first choice.' },
'isp': { 'n': 'Follow the ISP assignment', 'd': 'Use the DNS your ISP hands out during PPPoE dial-up. Least effort, but it can be hijacked to inject ads.' },
},
'WIZ_STEPS': {
'dns': { 'n': 'Step 3 · Open websites', 'd': 'Domain names have to be translated into IPs before they can be reached. This step decides between the ISP’s DNS and a public one.' },
'lan': { 'n': 'Step 2 · Hand out addresses on the LAN', 'd': 'Let phones and computers get an IP automatically over Ethernet or Wi-Fi, with no manual configuration.' },
'v6': { 'n': 'Step 4 · Decide on IPv6', 'd': 'IPv6 is the next generation of addressing. Chinese broadband mostly supports it now, and leaving it on is usually right.' },
'wan': { 'n': 'Step 1 · Connect to the internet', 'd': 'Tell this machine where the broadband line comes in, and confirm it really connects.' },
},
'WIZ_WAN_MODES': {
'dhcp': { 'n': 'DHCP automatic (IPoE)', 'd': 'Plug in the cable and you have an address; no account or password needed.', 'when': 'The ONT is already dialled and this host sits behind it; or estate broadband / a line with IPoE enabled.' },
'pppoe': { 'n': 'PPPoE dial-up', 'd': 'Needs your broadband account and password, and this host dials out. This is what most China Telecom / Unicom / Mobile / CBN home lines use.', 'when': 'The ONT is set to bridge mode, or you intend this host to take over dialling from the ISP ONT.' },
'static': { 'n': 'Static address', 'd': 'The ISP gave you a fixed IP, gateway and DNS; fill them in by hand.', 'when': 'Enterprise leased lines or fixed-IP broadband. Very rare at home.' },
},
'UPS_PROTO': {
'静态地址': { 'en': 'Static address' },
'DHCP 自动': { 'en': 'DHCP (automatic)' },
'PPPoE 拨号': { 'en': 'PPPoE dial-up' },
'DHCPv6 客户端': { 'en': 'DHCPv6 client' },
},
'UPD_SOURCES': {
'GitHub 官方': { 'en': 'GitHub (official)' },
'ghproxy 镜像': { 'en': 'ghproxy mirror' },
'kkgithub 镜像': { 'en': 'kkgithub mirror' },
},
'UPD_ASSETS': {
'deb': { 'd': 'Deb package (recommended, 523 KB)' },
'offline': { 'd': 'Offline bundle (87 MB, installs without Internet)' },
'docker': { 'd': 'Docker image (169 MB)' },
},
},
/* ---- 通用词 ---- */
common: {
version: { zh: '版本', en: 'Version' },
loading: { zh: '读取中…', en: 'Loading…' },
reading: { zh: '正在读取…', en: 'Reading…' },
retry: { zh: '重试', en: 'Retry' },
check: { zh: '重新检查', en: 'Re-check' },
close: { zh: '关闭', en: 'Close' },
cancel: { zh: '取消', en: 'Cancel' },
ok: { zh: '确定', en: 'OK' },
save: { zh: '保存', en: 'Save' },
apply: { zh: '应用', en: 'Apply' },
bytes: { zh: '字节', en: 'Bytes' },
count: { zh: '条目', en: 'items' },
peak: { zh: '峰值', en: 'Peak' },
avg: { zh: '平均', en: 'Avg' },
device: { zh: '设备', en: 'Device' },
interface: { zh: '接口', en: 'Interface' },
state: { zh: '状态', en: 'State' },
latest: { zh: '最新', en: 'Latest' },
// 「已修改,请点击保存并应用」在网卡页 / WAN 页各出现好几次,
// 抽成一条免得改一处漏一处。
dirtyApply:{ zh: '已修改,请点击保存并应用',
en: 'Changed — click Save & Apply to make it take effect' },
dirty: { zh: '已修改', en: 'Changed' },
unassigned:{ zh: '未分配', en: 'Unassigned' },
notConnected: { zh: '未连接', en: 'Not connected' },
notConnected: { zh: '未连接', en: 'Not connected' },
/* index.html 的**静态**文案(登录页、顶栏按钮 title、页脚、底部操作条)。
这些不在任何 VIEWS 里,切语言时只有 applyDom() 会重刷它们 ——
所以必须挂 data-i18n / data-i18n-attr,否则切英文后仍是中文。 */
ui: {
backDash: { zh: '返回系统概览', en: 'Back to dashboard' },
toggleMenu: { zh: '折叠/展开菜单', en: 'Collapse / expand menu' },
toggleMenuAria: { zh: '折叠或展开菜单', en: 'Collapse or expand the menu' },
refreshPage: { zh: '刷新当前页面', en: 'Reload current page' },
switchClock: { zh: '点击切换 12/24 小时制', en: 'Click to switch 12/24-hour format' },
saveOnly: { zh: '仅保存', en: 'Save only' },
saveApply: { zh: '保存并应用', en: 'Save and apply' },
footer: { zh: 'Drouter · Debian 13 主路由管理系统', en: 'Drouter · Debian 13 primary router management' },
mit: { zh: '遵循 MIT 开源协议', en: 'Released under the MIT license' },
curVer: { zh: '当前安装的版本', en: 'Currently installed version' },
localConsole: { zh: 'Debian 13 主路由 · 本地管理台', en: 'Debian 13 primary router · local console' },
adminUser: { zh: '管理员用户名', en: 'Administrator username' },
password: { zh: '密码', en: 'Password' },
login: { zh: '登 录', en: 'Log in' },
firstHint: { zh: '首次使用默认账号 admin / admin123,登录后请立即修改密码。', en: 'Default account is admin / admin123 - change the password right after signing in.' },
loading: { zh: '加载中…', en: 'Loading…' },
pageTitle: { zh: 'Drouter · Debian 13 主路由管理', en: 'Drouter · Debian 13 primary router management' },
},
},
/* ---- 顶栏 / 品牌 ---- */
app: {
title: { zh: 'Drouter 管理台', en: 'Drouter Console' },
logout: { zh: '退出登录', en: 'Sign out' },
// ⛔ 不要用**一条**词条同时表达「当前语言」和「点了会变成什么」——
// 两者方向相反(中文界面显示「中」+「切到英文」),共用一条必然自相矛盾。
// 分成两条,各说各的。
// ⚠️ 每条 zh/en 都要有值(空串会被 t-i18n.py 判为「缺词」),
// 所以写成「本界面语言 → 可切换到」的双语完整句式。
// i18n-allow-han:英文里的「中文」是**目标语言名**,
// 不能硬译成 Chinese(用户看到 "switch to Chinese" 不知道是指汉语)。
langToEn: { zh: '界面语言:中文 · 切换到 English',
en: 'UI language: English · switch to 中文' }, // i18n-allow-han
langToZh: { zh: '界面语言:中文 · 切换到 English',
en: 'UI language: English · switch to 中文' }, // i18n-allow-han
},
/* ---- 后端下发的选项文案(1.0.10,**自动生成,别手改**)----
来自 backend/drouter-helper.py 的 17 张选项表。
key 是后端的稳定标识(v/k/id),文案放前端 —— 后端不动。
重新生成:_dev/gen-opt-dict.py(先跑 gen-opt-i18n.py 抽数据)
查不到时渲染处会回落到后端下发的中文原文,不会显示 key。 */
opt: {
wanAccess: {
"pppoe": {
n: { zh: "PPPoE 拨号", en: "PPPoE dial-up" },
d: { zh: "光猫桥接 + 电脑/路由拨号,需要宽带账号密码(电信/联通/移动/广电均常见)", en: "ONT in bridge mode; the computer/router dials up and needs the broadband account" },
},
"dhcp": {
n: { zh: "DHCP 自动(IPoE)", en: "Automatic DHCP (IPoE)" },
d: { zh: "光猫已拨号,下挂设备自动获取地址;也用于部分地区「IPoE 免拨号」", en: "The ONT already dialled up; devices get addresses automatically (also used for IPoE-only regions)" },
},
"static": {
n: { zh: "静态地址(专线 / 固定 IP)", en: "Static address" },
d: { zh: "运营商分配固定公网 IP,手动配置地址、网关与 DNS", en: "ISP-assigned fixed public IP; set address, gateway and DNS manually" },
},
"pppoe_dhcp6": {
n: { zh: "PPPoE + DHCPv6-PD(双栈)", en: "PPPoE + DHCPv6-PD (dual-stack)" },
d: { zh: "IPv4 走 PPPoE、IPv6 通过 DHCPv6-PD 下发前缀,国内主流双栈方式", en: "IPv4 over PPPoE, IPv6 prefix delegated by DHCPv6-PD — the mainstream dual-stack setup in China" },
},
"ipoe_dhcp6": {
n: { zh: "IPoE + DHCPv6-PD(双栈)", en: "IPoE + DHCPv6-PD (dual-stack)" },
d: { zh: "IPv4/IPv6 均由上级自动下发,适用于光猫路由模式 + IPv6 直连", en: "Both IPv4 and IPv6 are pushed down by the upstream; suits ONT routing mode with direct IPv6" },
},
"bridge": {
n: { zh: "桥接旁路(不改 WAN)", en: "Bridged passthrough" },
d: { zh: "仅做二层透传/旁路,不参与拨号,WAN 状态由上级设备决定", en: "Layer-2 passthrough only; no dial-up, WAN state decided by the upstream device" },
},
},
ddns: {
"custom": {
n: { zh: "自定义(URL 模板)", en: "Custom (URL template)" },
d: { zh: "填入服务商给出的更新 URL,支持占位符 {ip} {ipv6} {domain} {token} {user} {pass}", en: "Generic template for providers not listed here" },
},
"aliyun": {
n: { zh: "阿里云解析 DNS", en: "Aliyun DNS" },
d: { zh: "AccessKey 签名(HMAC-SHA1)调用 Alidns OpenAPI,支持 IPv4/IPv6 双记录", en: "Alibaba Cloud DNS" },
},
"dnspod": {
n: { zh: "DNSPod(腾讯云)", en: "DNSPod (Tencent)" },
d: { zh: "使用 DNSPod Token(ID,Token)调用 Record.Ddns,国内家用最广泛", en: "Tencent DNSPod" },
},
/* TODO ddns.dnspod_tencent 缺英文(中文:腾讯云 DNSPod(SecretId/) */
"huaweicloud": {
n: { zh: "华为云 DNS", en: "Huawei Cloud DNS" },
d: { zh: "华为云 IAM + DNS API(AK/SK 签名),支持双栈记录集", en: "Huawei Cloud public DNS" },
},
"cloudflare": {
d: { zh: "API Token + Zone ID,支持 A / AAAA 记录,免费版即可", en: "Cloudflare DDNS" },
},
"noip": {
d: { zh: "经典 HTTP Basic 更新接口 dynupdate.no-ip.com", en: "NoIP dynamic DNS" },
},
/* TODO ddns.dyndns 缺英文(中文:标准 dyndns2 协议,兼容大量路由) */
"duckdns": {
d: { zh: "免费,Token + 域名,更新接口极简", en: "Free DuckDNS service" },
},
"freedns": {
d: { zh: "免费,使用自动生成的更新哈希", en: "afraid.org FreeDNS" },
},
/* TODO ddns.namecheap 缺英文(中文:Dynamic DNS Password) */
"googledomains": {
n: { zh: "Google Domains(已迁移 Squarespace)", en: "Google Domains" },
d: { zh: "旧 Google Domains 动态 DNS 凭据,现由 Squarespace 承接", en: "Google Domains DDNS" },
},
/* TODO ddns.godaddy 缺英文(中文:GoDaddy API Key + Se) */
/* TODO ddns.dynv6 缺英文(中文:免费,原生支持 IPv6(AAAA)与 ) */
/* TODO ddns.he 缺英文(中文:免费,使用 DDNS Key,IPv6 ) */
/* TODO ddns.ovh 缺英文(中文:OVH API(AK/AS/CK 三密钥) */
/* TODO ddns.porkbun 缺英文(中文:API Key + Secret Key) */
},
aclTime: {
"school": {
n: { zh: "上学日白天", en: "Weekdays 07:00–17:00" },
d: { zh: "周一至周五 7:00–17:00,用于限制上学时段娱乐类应用。", en: "Weekdays 07:00–17:00, to limit entertainment apps during school hours" },
},
"night": {
n: { zh: "夜间睡眠", en: "Daily 22:00–06:30" },
d: { zh: "每天 22:00 到次日 6:30,跨零点,用于夜间断网或只留白名单。", en: "Daily 22:00 to 06:30 next day — cut the line at night or keep an allow list only" },
},
"weekend": {
n: { zh: "周末全天", en: "Weekends" },
d: { zh: "周六周日全天,通常放宽限制。", en: "Weekends only, usually relaxed" },
},
/* TODO aclTime.homework 缺英文(中文:作业时段) */
/* TODO aclTime.always 缺英文(中文:始终生效) */
},
aclApp: {
"social": {
n: { zh: "社交娱乐", en: "Social media" },
d: { zh: "主流短视频与社交平台,家长控制最常限制的一类。", en: "Social media and chat apps" },
},
"game": {
n: { zh: "游戏", en: "Games" },
d: { zh: "在线游戏协议(含 Steam/Xbox/PSN 平台流量)。", en: "Online games" },
},
"video": {
n: { zh: "视频流媒体", en: "Video" },
d: { zh: "长视频平台,带宽占用大,也是常见的「限时」对象。", en: "Video streaming" },
},
/* TODO aclApp.p2p 缺英文(中文:P2P 下载) */
/* TODO aclApp.adult 缺英文(中文:不良内容) */
/* TODO aclApp.ad 缺英文(中文:广告与跟踪) */
"study": {
n: { zh: "学习办公", en: "Study" },
d: { zh: "通常在白名单里,作为「允许」类保留。", en: "Study and coursework" },
},
/* TODO aclApp.custom 缺英文(中文:自定义(域名/IP)) */
},
aclGroup: {
"kids": {
n: { zh: "孩子的设备", en: "Kids’ devices" },
d: { zh: "把孩子的手机/平板/学习机归到一组,统一施加时间限制。", en: "Children's devices" },
},
/* TODO aclGroup.guests 缺英文(中文:访客设备) */
/* TODO aclGroup.iot 缺英文(中文:IoT 设备) */
"work": {
n: { zh: "办公设备", en: "Office devices" },
d: { zh: "办公电脑,优先带宽并允许办公协作类应用。", en: "Office/work devices" },
},
},
aclAction: {
/* TODO aclAction.block 缺英文(中文:阻断(禁止访问)) */
"allow": {
n: { zh: "放通(仅允许)", en: "Allow" },
d: { zh: "用于白名单模式:只允许这些,其余在时间组内阻断。", en: "Permit — no further checks" },
},
/* TODO aclAction.limit 缺英文(中文:限速(交给 QoS)) */
"log": {
n: { zh: "仅记录(不阻断)", en: "Log only" },
d: { zh: "只产生日志用于观察,用于「先看效果再决定」的试运行阶段。", en: "Record the match but change nothing" },
},
},
shareTpl: {
/* TODO shareTpl.public 缺英文(中文:公共盘(所有人可读写)) */
"media": {
n: { zh: "影音库(只读)", en: "Media library" },
d: { zh: "电视盒子 / 播放器挂载用;只读可避免误删片源。", en: "Movies and music, for players and phones" },
},
/* TODO shareTpl.home 缺英文(中文:私人目录(需账号)) */
/* TODO shareTpl.backup 缺英文(中文:备份盘(仅指定设备可写)) */
},
nfsPreset: {
/* TODO nfsPreset.linux 缺英文(中文:Linux 客户端(推荐)) */
/* TODO nfsPreset.macos 缺英文(中文:macOS 客户端) */
/* TODO nfsPreset.windows 缺英文(中文:Windows(WSL2 / 客户端功能) */
/* TODO nfsPreset.readonly 缺英文(中文:只读导出) */
/* TODO nfsPreset.legacy 缺英文(中文:兼容旧设备(不安全)) */
},
mirror: {
/* TODO mirror.tencent 缺英文(中文:腾讯云) */
"daocloud": {
d: { zh: "DaoCloud 公共加速节点,国内可用性较好。", en: "DaoCloud public accelerator — good availability in China" },
},
"netease": {
n: { zh: "网易", en: "NetEase" },
d: { zh: "网易的老牌镜像源,速度稳定但偶尔同步滞后。", en: "NetEase’s long-standing mirror — stable, occasionally lags on sync" },
},
"ustc": {
n: { zh: "中国科学技术大学", en: "USTC" },
d: { zh: "教育网与电信链路表现好,高峰期偶尔限速。", en: "Good on CERNET and China Telecom links; may throttle at peak" },
},
/* TODO mirror.nju 缺英文(中文:南京大学) */
/* TODO mirror.sjtug 缺英文(中文:上海交通大学) */
"aliyun": {
n: { zh: "阿里云(需填专属地址)", en: "Aliyun" },
d: { zh: "阿里云不再提供通用加速地址。登录容器镜像服务控制台,在「镜像加速器」里拿到形如 https://xxxx.mirror.aliyuncs.com 的专属地址,填到下面的自定义源里。", en: "Aliyun no longer offers a generic accelerator URL; get one from the Container Registry console" },
},
},
printItem: {
/* TODO printItem.mode 缺英文(中文:工作模式(三选一)) */
/* TODO printItem.listen 缺英文(中文:允许局域网访问) */
"share": {
n: { zh: "共享打印机", en: "Share this queue" },
d: { zh: "决定队列要不要对外发布。不共享的话,队列只有本机能用,局域网里的其他设备根本看不见它。", en: "Let other machines on the LAN add or remove queues and change settings" },
},
/* TODO printItem.web_iface 缺英文(中文:CUPS Web 管理界面) */
/* TODO printItem.remote_admin 缺英文(中文:允许远程管理) */
/* TODO printItem.browsed 缺英文(中文:cups-browsed 自动发现) */
},
printDriver: {
"everywhere": {
n: { zh: "自动(IPP Everywhere,免驱)", en: "Everywhere (auto)" },
d: { zh: "推荐。2015 年后的网络打印机、AirPrint / Mopria 设备基本都支持。路由器不做格式转换,由打印机自己解析。", en: "Let the clients handle it — the printer itself is reached directly" },
},
/* TODO printDriver.raw 缺英文(中文:Raw(原样转发,不做任何转换)) */
},
ohItem: {
/* TODO ohItem.install 缺英文(中文:安装方式) */
/* TODO ohItem.bind 缺英文(中文:监听地址) */
/* TODO ohItem.secret 缺英文(中文:共享密钥) */
/* TODO ohItem.enable_new_devices 缺英文(中文:自动接管新 AP) */
/* TODO ohItem.encryption 缺英文(中文:配置静态加密) */
/* TODO ohItem.autostart 缺英文(中文:开机自启) */
},
fsType: {
"exfat": {
d: { zh: "跨平台首选:Windows / macOS / Linux 都能原生读写,无 4GB 单文件限制,最适合移动硬盘。", en: "exFAT" },
},
"ext4": {
d: { zh: "Linux 首选:日志型、稳定、支持权限与 ACL。Windows / macOS 需装第三方驱动才能读写。", en: "ext4" },
},
"ntfs": {
d: { zh: "Windows 原生。Linux 写入需 ntfs-3g(内核 5.15+ 已有原生驱动),macOS 默认只读。", en: "NTFS" },
},
"vfat": {
d: { zh: "兼容性最强(电视 / 车载 / 相机 / 游戏机都认)。限制:单文件 ≤ 4GB,分区 ≤ 2TB。", en: "FAT32" },
},
"xfs": {
d: { zh: "大文件与并发写入表现好,删除大量小文件很快。分区建好后不支持缩容。", en: "XFS" },
},
"btrfs": {
d: { zh: "支持快照、校验和与在线扩容。Samba 共享建议关掉 CoW(nodatacow)以免碎片。", en: "btrfs" },
},
/* TODO fsType.f2fs 缺英文(中文:专为闪存(U 盘 / SSD / TF ) */
/* TODO fsType.ext3 缺英文(中文:ext4 的前代。只在要对接很老的设备时) */
},
ulogSource: {
/* TODO ulogSource.fw 缺英文(中文:防火墙) */
/* TODO ulogSource.conntrack 缺英文(中文:连接跟踪) */
/* TODO ulogSource.flow 缺英文(中文:当前连接) */
/* TODO ulogSource.wan 缺英文(中文:WAN 接入) */
/* TODO ulogSource.ddns 缺英文(中文:动态域名) */
/* TODO ulogSource.app 缺英文(中文:应用日志) */
"system": {
n: { zh: "系统日志", en: "System log" },
d: { zh: "内核与系统服务的 journal 日志", en: "systemd journal" },
},
},
alertRule: {
/* TODO alertRule.wan_down 缺英文(中文:外网连接中断) */
/* TODO alertRule.disk_full 缺英文(中文:磁盘占用过高) */
/* TODO alertRule.temp_high 缺英文(中文:CPU 温度过高) */
/* TODO alertRule.mem_high 缺英文(中文:内存占用过高) */
/* TODO alertRule.load_high 缺英文(中文:负载持续偏高) */
/* TODO alertRule.loss_high 缺英文(中文:到网关丢包严重) */
/* TODO alertRule.backup_fail 缺英文(中文:自动备份连续失败) */
/* TODO alertRule.snapshot_fail 缺英文(中文:自动快照连续失败) */
},
alertChan: {
"bark": {
n: { zh: "Bark(iOS / Android 推送)", en: "Bark" },
d: { zh: "填 Bark 服务器地址与设备 Key,点标题即跳转。支持自建服务器。", en: "Bark push to iOS" },
},
/* TODO alertChan.smtp 缺英文(中文:邮件(SMTP)) */
"webhook": {
n: { zh: "群机器人 Webhook(钉钉 / 企业微信 / 飞书)", en: "Webhook / bot" },
d: { zh: "直接粘机器人地址。按平台自动用该平台的报文格式。", en: "Incoming webhook for chat bots" },
},
},
pppm: {
"balance": {
n: { zh: "负载均衡(按会话均分)", en: "Load balancing" },
d: { zh: "所有会话同时承载流量,总吞吐 ≈ 各会话相加。适合运营商允许多拨的场景。", en: "Spread sessions across links by weight" },
},
"primary_backup": {
n: { zh: "主备(故障自动切换)", en: "Primary/backup" },
d: { zh: "只用第一条会话,其余待机;主链路断开时自动切到备用。适合多拨不稳定或想省资源。", en: "One link carries traffic; the other stands by" },
},
"weighted": {
n: { zh: "加权(自定义各会话权重)", en: "Weighted" },
d: { zh: "按权重分配流量,例如两条 500M + 一条 200M 可设 5:5:2。", en: "Weights decide the share of each link" },
},
},
qosMode: {
/* TODO qosMode.diffserv3 缺英文(中文:diffserv3(三档,推荐)) */
/* TODO qosMode.diffserv4 缺英文(中文:diffserv4(四档)) */
/* TODO qosMode.besteffort 缺英文(中文:besteffort(不分档)) */
},
qosPreset: {
/* TODO qosPreset.gaming 缺英文(中文:游戏优先) */
/* TODO qosPreset.voip 缺英文(中文:语音优先) */
/* TODO qosPreset.dns 缺英文(中文:DNS 优先) */
"video": {
n: { zh: "视频优先", en: "Video" },
d: { zh: "视频会议(腾讯会议 / Zoom / Teams / WebRTC)与直播推流的实时音视频。af41 比游戏低半档、比普通网页高,既保证画面不卡,又不会把下载和游戏挤下去。", en: "Video calls and streaming first" },
},
/* TODO qosPreset.bt 缺英文(中文:BT / P2P 降级) */
},
dpiSource: {
/* TODO dpiSource.ndpi-protos 缺英文(中文:nDPI 协议识别规则库) */
/* TODO dpiSource.suricata-rules 缺英文(中文:Suricata 应用识别规则集) */
/* TODO dpiSource.ndpi-netfilter 缺英文(中文:nDPI Netfilter 内核模块) */
},
cleanItem: {
"ulog": {
n: { zh: "防火墙流日志(旧)", en: "Connection/flow logs" },
d: { zh: "记录每一条经防火墙的连接。这是全系统增长最快的文件 —— 本机还没接管路由时一天就能写 1MB,真正接管后会大得多。", en: "Connection tracking and flow logs" },
},
/* TODO cleanItem.drouter_log 缺英文(中文:面板运行日志(旧)) */
/* TODO cleanItem.varlog 缺英文(中文:系统日志轮转包) */
/* TODO cleanItem.journal 缺英文(中文:systemd 日志(journal)) */
/* TODO cleanItem.apt 缺英文(中文:APT 软件包缓存) */
/* TODO cleanItem.snapdl 缺英文(中文:快照下载打包残留) */
"tmp": {
n: { zh: "临时文件(/tmp、/var/tmp)", en: "Temporary files" },
d: { zh: "程序崩溃、安装中断留下的残骸。Debian 的 /tmp 默认不会自动清理。", en: "Temporary files under /tmp" },
},
/* TODO cleanItem.trash 缺英文(中文:文件管理器回收站) */
/* TODO cleanItem.core 缺英文(中文:崩溃转储(coredump)) */
},
kernItem: {
"fwd_v4": {
n: { zh: "IPv4 转发", en: "IPv4 forwarding" },
d: { zh: "决定本机要不要「替别人转发包」。关闭时它只是局域网里的一台普通主机,收到目的地不是自己的包就直接丢弃;打开后这台机器才真正具备路由器能力。", en: "Decides whether this machine forwards packets for other devices. Off, it is just an ordinary host on the LAN: packets not addressed to it are dropped. It must be on if this machine is your router." },
},
"fwd_v6": {
n: { zh: "IPv6 转发", en: "IPv6 forwarding" },
d: { zh: "同上,只是针对 IPv6。宽带没有 IPv6 时,开与不开都一样。", en: "Same as IPv4 forwarding but for IPv6. Makes no difference if your link has no IPv6." },
},
"bbr": {
n: { zh: "BBR 拥塞控制", en: "BBR congestion control" },
d: { zh: "谷歌的 TCP 拥塞控制算法。在有丢包或延迟偏高的链路上,比系统默认的 cubic 更能跑满带宽、延迟也更低。", en: "Google's TCP congestion control. On links with packet loss or high latency it reaches the available bandwidth more fully than the system default (cubic), with lower latency." },
},
"snmp": {
n: { zh: "SNMP 监控", en: "SNMP monitoring" },
d: { zh: "开一个标准 SNMP 服务,让网管软件(Zabbix / PRTG / Cacti / LibreNMS)能采集本机的接口流量、CPU、内存等指标。", en: "Runs a standard SNMP service so NMS tools (Zabbix / PRTG / Cacti / LibreNMS) can collect metrics from this router." },
},
},
kernFw: {
"masquerade_v4": {
n: { zh: "IPv4 出向地址伪装(masquerade / SNAT)", en: "IPv4 outbound masquerade (SNAT)" },
d: { zh: "把内网设备的私有地址改写成路由器自己的 WAN 地址再发出去。家用宽带通常只给一个公网 IP,内网几十台设备全靠它共用一个出口。", en: "Rewrites the private addresses of LAN devices to the router’s own WAN address on the way out. Home broadband usually hands out a single public IP while the LAN has dozens, so this is what makes sharing work." },
},
"mss_v4": {
n: { zh: "IPv4 MSS 钳制", en: "IPv4 MSS clamping" },
d: { zh: "在 TCP 握手时把「单个报文能装多少数据」压到链路扛得住的大小。专治 PPPoE 拨号后「部分网站打不开、图片加载一半、微信发不出图」。", en: "Caps how much data fits in one TCP segment during the handshake. Fixes the classic \"some sites will not load over PPPoE\" problem." },
},
"masquerade_v6": {
n: { zh: "IPv6 出向地址伪装(NAT66)", en: "IPv6 outbound masquerade (NAT66)" },
d: { zh: "IPv6 版本的地址伪装。正常情况下不需要 —— IPv6 地址足够多,每台设备都能有自己的公网地址。", en: "The IPv6 form of address masquerade. Normally unnecessary — there are enough IPv6 addresses for every device to have its own public one." },
},
"mss_v6": {
n: { zh: "IPv6 MSS 钳制", en: "IPv6 MSS clamping" },
d: { zh: "同 IPv4 的 MSS 钳制,但 IPv6 靠 PMTUD(路径 MTU 发现)自己协商,绝大多数场景不需要人工干预。", en: "Same as IPv4 MSS clamping, but IPv6 negotiates its own path MTU via PMTUD, so it is needed far less often." },
},
},
wizStep: {
"wan": {
n: { zh: "第 1 步 · 接上外网", en: "Step 1 · Connect to the internet" },
d: { zh: "告诉这台机器「从哪里接宽带」,并且确认它真的连上了。", en: "Tell this machine where the broadband comes from, and confirm it is actually connected." },
},
"lan": {
n: { zh: "第 2 步 · 给内网发地址", en: "Step 2 · Hand out LAN addresses" },
d: { zh: "让手机、电脑插上网线或连上 Wi-Fi 就能自动拿到 IP,不用手工设置。", en: "Let phones and PCs get an IP automatically over Ethernet or Wi-Fi, with no manual configuration." },
},
"dns": {
n: { zh: "第 3 步 · 能打开网址", en: "Step 3 · Resolve names" },
d: { zh: "域名要翻译成 IP 才能访问。这一步决定用运营商的 DNS 还是公共 DNS。", en: "Domains must be translated into IPs before they can be visited. This step decides between the ISP’s DNS and a public resolver." },
},
"v6": {
n: { zh: "第 4 步 · 要不要 IPv6", en: "Step 4 · Decide on IPv6" },
d: { zh: "IPv6 是新一代地址。国内宽带基本都支持了,多数情况建议开。", en: "IPv6 is the next generation of addressing. Chinese broadband mostly supports it now, and turning it on is usually the right call." },
},
},
wizDns: {
"ali": {
n: { zh: "阿里云 AliDNS", en: "Aliyun AliDNS" },
d: { zh: "国内解析最快、覆盖最广,家庭宽带首选。", en: "Fastest and widest coverage inside China — the usual first choice for home broadband." },
},
"dnspod": {
n: { zh: "腾讯 DNSPod", en: "Tencent DNSPod" },
d: { zh: "国内老牌,对恶意域名拦截做得比较积极。", en: "A long-standing Chinese resolver that is quite aggressive at blocking malicious domains." },
},
"114": {
d: { zh: "运营商级公共 DNS,稳定但部分地区速度一般。", en: "Stable, but latency can be mediocre in some regions." },
},
"cf": {
d: { zh: "国外 DNS。国内直连延迟偏高,访问国内网站可能变慢。", en: "An overseas resolver. Latency from China is high, which can make domestic sites slower." },
},
"gg": {
d: { zh: "国外 DNS。国内常被干扰,通常不作首选。", en: "An overseas resolver that is often interfered with in China, so rarely the first choice." },
},
"isp": {
n: { zh: "跟随运营商下发", en: "Follow the ISP" },
d: { zh: "用宽带拨号时运营商给的 DNS(PPPoE 会下发给本机)。最省心,但可能被劫持插广告。", en: "Use whatever DNS the ISP hands out when you dial up (PPPoE pushes it to the router). Least effort, but it can be hijacked to inject ads." },
},
},
wizWanMode: {
"pppoe": {
n: { zh: "PPPoE 拨号", en: "PPPoE dial-up" },
d: { zh: "需要宽带账号和密码,由本机发起拨号。中国电信 / 联通 / 移动 / 广电的家庭宽带最常见的就是这种。", en: "Needs your broadband account and password; the router dials up itself. The most common setup for home broadband in China." },
},
"dhcp": {
n: { zh: "DHCP 自动获取(IPoE)", en: "Automatic DHCP (IPoE)" },
d: { zh: "网线插上就有地址,不需要账号密码。", en: "Plug in Ethernet and you have an address — no credentials needed." },
},
"static": {
n: { zh: "静态地址", en: "Static address" },
d: { zh: "运营商给了固定的 IP、网关和 DNS,手工填进去。", en: "The ISP gave you a fixed address, gateway and DNS; fill them in yourself." },
},
},
dpiHost: {
"direct": {
n: { zh: "直连(不使用代理)", en: "Direct (no proxy)" },
d: { zh: "不使用任何代理。海外网络或已自建代理时选这个。", en: "Uses no proxy at all. Pick this on networks you can already reach, or when you run your own proxy." },
},
"ghproxy": {
d: { zh: "老牌公共加速,稳定性一般,偶尔限流。", en: "A long-running public accelerator; stability is so-so and it rate-limits now and then." },
},
"gh-proxy": {
d: { zh: "备用加速,支持 release 文件与 raw 文件。", en: "Backup accelerator; supports both release and raw file downloads." },
},
"moeyy": {
d: { zh: "对 raw 与 archive 都支持,速度较好。", en: "Handles raw and archive downloads, and is fairly fast." },
},
"ghfast": {
d: { zh: "目前较活跃的加速节点之一。", en: "One of the more active accelerators at the moment." },
},
"ghproxy-net": {
d: { zh: "备用节点,适合前几个都超时时尝试。", en: "Backup node — try it when the ones above time out." },
},
"gitclone": {
d: { zh: "整站镜像式代理,适合 git clone(注意 URL 拼接方式不同)。", en: "Whole-site mirror-style proxy; suits git clone (note the URL is built differently)." },
},
},
accelImpact: {
"fwLog": {
n: { zh: "逐包防火墙日志 / 计数", en: "Per-packet firewall log / counters" },
d: { zh: "已建立的连接不再逐包经过 forward 链,因此针对这些数据包的 log / counter 规则不会继续命中。如果你需要精确审计每条连接,建议不要开启。", en: "Established connections no longer traverse the forward chain, so log and counter rules will not see their packets." },
},
"deepInspect": {
n: { zh: "复杂 ACL / 深度包检测", en: "Complex ACL / deep packet inspection" },
d: { zh: "基于数据内容的规则(域名、关键字过滤等)只对新连接生效;长连接的后续数据包不再经过检测。", en: "Content-based rules (domain, keyword filters) only apply to new connections; later packets of a long-lived connection skip inspection." },
},
"qos": {
n: { zh: "QoS / 流量整形 / 限速", en: "QoS / traffic shaping / rate limiting" },
d: { zh: "tc 限速与 flowtable 快速路径协同不佳,可能导致限速失效。依赖限速时请勿开启,或把需要限速的流量排除在加速之外。", en: "tc rate limiting works poorly with the flowtable fast path and may stop limiting. If you rely on rate limits, leave this off or keep the affected traffic out of the flowtable." },
},
"policyRoute": {
n: { zh: "策略路由 / 多出口分流", en: "Policy routing / multi-WAN split" },
d: { zh: "依赖逐包标记的复杂分流策略需要一并复核,必要时把相关流量排除在 flowtable 之外。", en: "Complex split routing that depends on per-packet marking needs review; exclude the affected traffic from the flowtable if needed." },
},
"conntrack": {
n: { zh: "连接跟踪统计 / 流量监控", en: "Connection tracking stats / traffic monitoring" },
d: { zh: "conntrack 仍会记录连接,但已卸载流量的字节计数可能不再刷新,监控图表会有偏差。", en: "conntrack still records connections, but byte counts for offloaded flows may stop updating, so monitoring graphs will drift." },
},
"nat": {
n: { zh: "NAT / 端口映射", en: "NAT / port forwarding" },
d: { zh: "已有 NAT 规则可以保留,连接建立阶段仍会走完整 conntrack。开启后建议实测一次端口映射。", en: "Existing NAT rules are fine and connection setup still goes through conntrack in full. Test port forwarding once after enabling." },
},
"upnp": {
n: { zh: "UPnP 自动端口映射", en: "UPnP automatic port mapping" },
d: { zh: "新连接建立时仍会触发 UPnP,不受影响;长期映射开启后复核一次即可。", en: "Still fires for new connections and is unaffected; just re-verify long-lived mappings after enabling." },
},
"ipv6": {
n: { zh: "IPv6 转发", en: "IPv6 forwarding" },
d: { zh: "当前加速表同时接管 IPv4/IPv6 的已建立连接,正常转发无影响。", en: "The current fast path covers established IPv4 and IPv6 connections alike; normal forwarding is unaffected." },
},
},
qosImpact: {
"flowtable": {
n: { zh: "与 flowtable 软加速冲突", en: "Conflicts with flowtable acceleration" },
d: { zh: "软加速让已建立连接绕过 netfilter,DSCP 打标与 mark 分类会失效。开启 QoS 前请先关闭「网络状态 / 加速」页的软加速,本模块会自动检测并提示。", en: "Software acceleration lets established connections bypass netfilter, which breaks DSCP marking and mark-based classification. Disable flowtable before turning on QoS." },
},
"cakeCpu": {
n: { zh: "CAKE 会占用 CPU", en: "CAKE costs CPU" },
d: { zh: "CAKE 是逐包调度,带宽越高 CPU 开销越大。1Gbps 以内通常无压力;超过 2Gbps 建议改用 flowtable 或 XDP 方案(本机为虚拟机,实际可承受带宽更低)。", en: "CAKE schedules per packet, so the faster the link the more CPU it needs. Fine below 1 Gbps; above 2 Gbps consider HTB instead." },
},
"htbIp": {
n: { zh: "HTB 按 IP 限速影响面", en: "HTB per-IP limiting is broad" },
d: { zh: "限速对一个内网 IP 的上下行同时生效。设「保证带宽」过低会让该设备一直慢,建议保证带宽 + 峰值带宽搭配使用。", en: "A limit applies to both directions of that IP at once. Setting the guaranteed rate too low keeps that device slow permanently — pair guaranteed with peak." },
},
"encrypted": {
n: { zh: "加密流量无法识别应用", en: "Encrypted traffic cannot be identified by application" },
d: { zh: "HTTPS / QUIC 已加密,仅靠端口与 DSCP 无法准确区分「是哪个应用」。要按应用识别请启用 DPI 模块(nDPI),但它需要额外进程与 CPU。", en: "HTTPS / QUIC are encrypted, so port and DSCP alone cannot tell you which app it is. Enable DPI if you need per-app control." },
},
"connLimit": {
n: { zh: "连接数限制的取舍", en: "Trade-off when limiting connections" },
d: { zh: "限制单 IP 并发连接数能抑制异常设备拖垮路由,但设得过低会让迅雷/多标签浏览器等正常应用报错,建议 300 以上。", en: "Capping concurrent connections per IP contains a misbehaving device, but too low a cap makes legitimate apps (downloaders, many browser tabs) fail. Start around 300 and adjust." },
},
},
dpiInstall: {
"apt": {
n: { zh: "APT 安装(最省事)", en: "Install from APT (easiest)" },
d: { zh: "Debian 13 仓库直接装,无需编译。nDPI 版本可能略旧,但够家用。", en: "Straight from the Debian 13 repos, no compiling. The bundled nDPI may be a little older but is fine for home use." },
},
"source": {
n: { zh: "源码编译 nDPI(版本最新)", en: "Build nDPI from source (newest)" },
d: { zh: "拿到最新协议特征库(新应用识别更快),但编译耗时较长。", en: "Gets the latest protocol definitions (faster at recognising new apps) but takes a while to compile." },
},
"netfilter": {
n: { zh: "nDPI Netfilter(按应用打标)", en: "nDPI Netfilter (per-app marking)" },
d: { zh: "让 nftables 按应用分类并交给 QoS 限速。需内核头文件支持。", en: "Lets nftables classify by application and hand the result to QoS. Needs kernel headers." },
},
},
wizNote: {
"pool": {
d: { zh: "内网设备的地址由这里开始分配。填错了轻则上不了网,重则和上游路由器打架。", en: "LAN devices get their addresses from this range. Get it wrong and either nothing can reach the internet, or it clashes with your upstream router." },
},
},
dockerNote: {
"panel": {
d: { zh: "Docker 面板支持容器/镜像/网络/卷的日常运维,以及 Compose 项目管理。「命令转换」可以把任意 docker run 命令转成 docker-compose.yml。", en: "The Docker panel covers day-to-day work on containers, images, networks and volumes, plus Compose projects. \"Command conversion\" turns an arbitrary docker/docker-compose command into the equivalent panel action." },
},
},
ohNote: {
"console": {
d: { zh: "真正的 Wi-Fi、VLAN、PoE 配置都在 OpenSOHO 自己的控制台里做 —— 这里只负责把它装好、管住、把入口给你。AP 侧需要在 OpenWRT 上装 openwisp-config 并填入下面的共享密钥来注册。", en: "The actual Wi-Fi, VLAN and PoE configuration lives in OpenSOHO’s own console — this page only installs it, manages it and keeps track of the entry point." },
},
},
shareNote: {
"smbVsNfs": {
d: { zh: "SMB 面向 Windows / macOS / Linux 全平台,兼容性最好;NFS 更适合 Linux 之间互传,性能更高但 Windows 需要额外客户端。两者可以同时开启,共享同一个目录。", en: "SMB works across Windows / macOS / Linux and has the widest compatibility; NFS suits Linux-to-Linux transfers and can be a bit faster for large files." },
},
},
aclNote: {
"panel": {
d: { zh: "时间规则按北京时间(UTC+8)换算后写入内核;跨零点的时间段会自动拆成两段。应用识别依赖 DPI 库,限速动作依赖 QoS 模块。", en: "Time rules are converted from Beijing time (UTC+8) before being written to the kernel; ranges that cross midnight are split in two. App identification needs the DPI database, and rate limiting needs QoS." },
},
},
ulogNote: {
"flows": {
d: { zh: "「当前连接」是 conntrack 表的实时快照,展示 NAT 映射后的地址、连接状态与已传输字节数。开启软加速(flowtable)后,已卸载流量的字节计数可能不再增长。", en: "\"Current connections\" is a live snapshot of the conntrack table showing NAT-translated addresses, connection state and bytes transferred. With software acceleration (flowtable) some fields may be incomplete." },
},
"unified": {
d: { zh: "统一日志把防火墙、连接跟踪、WAN 接入、DDNS、应用与系统日志规范化成同一种记录结构,可用同一套条件检索。", en: "Unified logging normalises firewall, connection tracking, WAN access, DDNS, application and system logs into one record structure, so the same filters and statistics work across all of them." },
},
},
alertNote: {
"noDefaultRoute": {
d: { zh: "本机没有默认路由(未拨号或路由表为空)", en: "This machine has no default route (never dialled up, or the routing table is empty)" },
},
"dnd": {
d: { zh: "在免打扰时段内(非紧急)", en: "Suppressed by the do-not-disturb window (non-urgent alerts only)" },
},
},
quotaNote: {
"bytes": {
d: { zh: "字节数取自连接跟踪事件在连接结束时的统计。长时间持续连接(如大文件下载、在线视频)会在连接断开后才计入,所以当月数字会随时间回补。", en: "Byte counts come from connection-tracking events recorded when a connection closes. Long-lived transfers (big downloads, video streaming) are only counted once they disconnect, so the monthly total rises in steps." },
},
},
caNote: {
"expireUnreadable": {
d: { zh: "读不出有效期", en: "Cannot read the expiry date" },
},
},
storageNote: {
"usb": {
d: { zh: "外接 U 盘 / 移动硬盘 / Type-C 与雷电硬盘盒会显示在下方。「连接方式」显示的是总线类型(USB / 雷电 / NVMe / SATA);Type-C 是插头形态,电气上仍归 USB 或雷电,因此按总线展示更准确。", en: "External USB drives, portable SSDs and Thunderbolt enclosures appear below; \"Connection\" shows the bus type (USB / Thunderbolt)." },
},
},
backupNote: {
"identitySkip": {
d: { zh: "属于本机身份信息,不还原", en: "Part of this machine’s identity — not restored" },
},
"srcMissing": {
d: { zh: "文件不存在", en: "File does not exist" },
},
},
fsNote: {
"protected": {
d: { zh: "拒绝删除系统关键目录", en: "Refuses to delete system-critical directories" },
},
},
},
/* ---- 导航菜单(1.0.10 第 2 批,**自动生成,别手改**)----
由 _dev/gen-nav-i18n.py 从 app.js 的 NAV_GROUPS 生成。
加新页面后重跑该脚本即可,别手抄。 */
nav: {
soon: { zh: '待完善', en: 'Coming soon' },
noMatch: { zh: '没有匹配的菜单', en: 'No matching menu entry' },
search: { zh: '搜索菜单…', en: 'Search menu…' },
g: {
'g0': { zh: '概览', en: 'Overview' },
'g1': { zh: '接口', en: 'Interfaces' },
'g2': { zh: '寻址与路由', en: 'Addressing & Routing' },
'g3': { zh: '安全', en: 'Security' },
'g4': { zh: '服务', en: 'Services' },
'g5': { zh: '工具', en: 'Tools' },
'g6': { zh: '日志与审计', en: 'Logs & Audit' },
'g7': { zh: '系统', en: 'System' },
},
n: {
'wizard': { zh: '新手向导', en: 'Setup Wizard' },
'dash': { zh: '系统概览', en: 'System Overview' },
'health': { zh: '健康总览', en: 'Health' },
'netstat': { zh: '网络状态 / 加速', en: 'Network Status / Acceleration' },
'iface': { zh: '网卡与桥接', en: 'NICs & Bridge' },
'wan': { zh: 'WAN 口', en: 'WAN Port' },
'pppmulti': { zh: 'PPPoE 多拨', en: 'PPPoE Multi-WAN' },
'lan': { zh: 'LAN 口', en: 'LAN Port' },
'vlan': { zh: 'VLAN / IPTV', en: 'VLAN / IPTV' },
'wol': { zh: '网络唤醒 (WOL)', en: 'Wake-on-LAN (WOL)' },
'dhcp': { zh: 'DHCP 服务', en: 'DHCP Service' },
'dns': { zh: 'DNS 服务', en: 'DNS Service' },
'ipv6': { zh: 'IPv6 / RA', en: 'IPv6 / RA' },
'dhcpv6': { zh: 'DHCPv6 / 前缀委派', en: 'DHCPv6 / Prefix Delegation' },
'ddns': { zh: '动态域名 DDNS', en: 'Dynamic DNS (DDNS)' },
'pubip': { zh: '真·公网 IP 判定', en: 'Real Public IP Check' },
'fw4': { zh: '防火墙 IPv4', en: 'Firewall IPv4' },
'fw6': { zh: '防火墙 IPv6', en: 'Firewall IPv6' },
'portfwd': { zh: '端口转发 / DMZ', en: 'Port Forwarding / DMZ' },
'upnp': { zh: 'UPnP / NAT-PMP', en: 'UPnP / NAT-PMP' },
'acl': { zh: '访问控制 / 时间组', en: 'Access Control / Time Groups' },
'vpn': { zh: 'WireGuard VPN', en: 'WireGuard VPN' },
'qos': { zh: '智能限速 QoS', en: 'Smart Rate Limit (QoS)' },
'dpi': { zh: '应用识别 DPI', en: 'App Detection (DPI)' },
'ntp': { zh: 'NTP 时间同步', en: 'NTP Time Sync' },
'nfs': { zh: '文件共享 SMB/NFS', en: 'File Sharing SMB/NFS' },
'print': { zh: '打印服务', en: 'Print Service' },
'opensoho': { zh: 'AC/AP 管理中心', en: 'AC/AP Controller' },
'webshell': { zh: 'Web 终端 / 文件', en: 'Web Terminal / Files' },
'api': { zh: '通用 API 接口', en: 'General API' },
'diag': { zh: '网络诊断工具', en: 'Network Diagnostics' },
'v6test': { zh: 'IPv6 连通性测试', en: 'IPv6 Connectivity Test' },
'docker': { zh: 'Docker / Compose', en: 'Docker / Compose' },
'dcfg': { zh: 'Docker 引擎配置', en: 'Docker Engine Config' },
'log': { zh: '系统日志', en: 'System Logs' },
'alert': { zh: '告警与通知', en: 'Alerts & Notifications' },
'flowlog': { zh: '连接与流日志', en: 'Connection & Flow Logs' },
'quota': { zh: '用量与账单', en: 'Usage & Billing' },
'depcheck': { zh: '依赖自检与安装', en: 'Dependency Check & Install' },
'cleanup': { zh: '磁盘与日志清理', en: 'Disk & Log Cleanup' },
'kern': { zh: '内核转发与加速', en: 'Kernel Forwarding & Tuning' },
'ca': { zh: '证书 / SSL', en: 'Certificates / SSL' },
'backup': { zh: '配置备份与还原', en: 'Config Backup & Restore' },
'power': { zh: '电源控制', en: 'Power Control' },
'user': { zh: '用户与密钥', en: 'Users & Keys' },
'sys': { zh: '系统设置', en: 'System Settings' },
'theme': { zh: '主题之家', en: 'Theme Studio' },
'update': { zh: '升级与保护', en: 'Upgrade & Protection' },
},
t: {
'wizard': { zh: '第一次用这台机器上网?四步走完:接上外网 · 给内网发地址 · 配 DNS · 要不要 IPv6。每一步都带范例和体检结果', en: 'First time on this machine? Four steps: connect to the internet, hand out LAN addresses, set up DNS, decide on IPv6. Each step has examples and a health check.' },
'dash': { zh: '系统概览', en: 'System Overview' },
'health': { zh: '一屏看清每个模块的状态灯:绿=正常,黄=要留意,红=出问题了,灰=没启用', en: 'Every module at a glance: green = fine, amber = watch, red = problem, grey = off' },
'netstat': { zh: '网络状态 · NAT 检测 · 软加速', en: 'Status · NAT detection · software acceleration' },
'iface': { zh: '网卡与桥接', en: 'NICs and bridging' },
'wan': { zh: 'WAN 口设置', en: 'WAN port settings' },
'pppmulti': { zh: 'PPPoE 多拨 / 多会话聚合', en: 'PPPoE multi-WAN / session aggregation' },
'lan': { zh: 'LAN 口设置', en: 'LAN port settings' },
'vlan': { zh: 'VLAN 与 IPTV 划分', en: 'VLAN and IPTV segmentation' },
'wol': { zh: '网卡远程唤醒 WOL', en: 'Wake NICs remotely with WOL' },
'dhcp': { zh: 'DHCP 服务与 Options', en: 'DHCP service and options' },
'dns': { zh: 'DNS 服务', en: 'DNS service' },
'ipv6': { zh: 'IPv6 与路由通告', en: 'IPv6 and router advertisements' },
'dhcpv6': { zh: 'DHCPv6 与前缀委派', en: 'DHCPv6 and prefix delegation' },
'ddns': { zh: '动态域名解析 DDNS(IPv4 / IPv6,国内外服务商)', en: 'Dynamic DNS for IPv4 and IPv6, with domestic and overseas providers' },
'pubip': { zh: '判定出口 IP 是不是真的能被外网连进来(入向可达性实测)', en: 'Determine whether the outbound IP can actually be reached inbound (measured)' },
'fw4': { zh: 'IPv4 防火墙', en: 'IPv4 firewall' },
'fw6': { zh: 'IPv6 防火墙', en: 'IPv6 firewall' },
'portfwd': { zh: '端口转发与 DMZ(nftables DNAT)', en: 'Port forwarding and DMZ (nftables DNAT)' },
'upnp': { zh: 'UPnP / NAT-PMP', en: 'UPnP / NAT-PMP' },
'acl': { zh: '访问控制与家长时间组', en: 'Access control and parental time groups' },
'vpn': { zh: '远程连回家里访问内网与 NAS:Debian 13 内核自带 WireGuard,逐台设备发放独立配置', en: 'Reach your LAN and NAS from elsewhere: WireGuard is built into the Debian 13 kernel, each device gets its own config' },
'qos': { zh: '智能限速与流量整形(CAKE / HTB)', en: 'Smart rate limiting and traffic shaping (CAKE / HTB)' },
'dpi': { zh: '应用识别与规则库更新(nDPI)', en: 'App identification and rule-set updates (nDPI)' },
'ntp': { zh: 'NTP 时间同步', en: 'NTP time synchronisation' },
'nfs': { zh: '内网文件共享(SMB / NFS,跨平台模板)', en: 'LAN file sharing (SMB / NFS, cross-platform templates)' },
'print': { zh: 'CUPS 打印服务器 / USB 打印机 RAW 直通(互斥二选一),共享给手机与电脑', en: 'CUPS print server / USB printer RAW passthrough (mutually exclusive), shared to phones and PCs' },
'opensoho': { zh: 'OpenSOHO 无线控制器:集中管理 OpenWRT AP 的 Wi-Fi · VLAN · PoE', en: 'OpenSOHO wireless controller: central management of OpenWRT AP Wi-Fi · VLAN · PoE' },
'webshell': { zh: 'Web SSH 终端与文件管理器', en: 'Web SSH terminal and file manager' },
'api': { zh: '对外通用 API 接口与调用范例', en: 'Public API reference with call examples' },
'diag': { zh: '网络诊断工具', en: 'Network diagnostic tools' },
'v6test': { zh: 'IPv6 连通性测试', en: 'IPv6 connectivity test' },
'docker': { zh: 'Docker 与 Docker Compose 管理面板', en: 'Docker and Docker Compose management panel' },
'dcfg': { zh: 'daemon.json 可视化配置:IPv6 一键开启 · 国内镜像源切换与测速 · 日志滚动 · 默认网桥网段', en: 'daemon.json visual config: one-click IPv6 · mirror source switching and speed test · log rotation · default bridge subnet' },
'log': { zh: '日志查看', en: 'Log viewer' },
'alert': { zh: '掉线 / 磁盘满 / 温度高主动推送:Bark · 邮件 · 群机器人,带冷却与免打扰', en: 'Proactive push on outage / full disk / high temperature: Bark · email · chat bot, with cooldown and do-not-disturb' },
'flowlog': { zh: '连接跟踪与流量日志(统一日志系统)', en: 'Connection tracking and traffic logs (unified logging)' },
'quota': { zh: '按设备与服务统计每月流量,工作室可按比例分摊话费;后台增量聚合,不会拖慢机器', en: 'Monthly traffic per device and service, split line costs in a studio; incremental background aggregation that does not slow the machine' },
'depcheck': { zh: '运行依赖自检与一键安装', en: 'Run dependency checks and install in one click' },
'cleanup': { zh: '回收日志 / 缓存 / 临时文件,可设定阈值自动清理,防止小硬盘被占满', en: 'Reclaim logs / caches / temp files, with thresholds for automatic cleanup so a small disk never fills up' },
'kern': { zh: 'IP 转发 · 出向伪装 · MSS 钳制 · BBR · SNMP,五项内核级开关(每项附说明与联动影响)', en: 'IP forwarding · outbound masquerade · MSS clamping · BBR · SNMP — five kernel-level switches, each with notes on interactions' },
'ca': { zh: 'CA 证书管理:建自己的 CA · 签发服务器证书 · 导入 · 部署给管理后台;附带 SSL/TLS 握手体检工具', en: 'CA management: build your own CA · issue server certificates · import · deploy to the console; includes an SSL/TLS handshake doctor' },
'backup': { zh: '把全部设置导成一个能下载、能换机还原的包:带清单与逐文件校验,还原前先预检', en: 'Export every setting into one downloadable, restorable package, with a manifest and per-file checks; pre-flight check before restoring' },
'power': { zh: '电源控制', en: 'Power control' },
'user': { zh: '系统用户与 SSH 公钥', en: 'System users and SSH public keys' },
'sys': { zh: '系统设置', en: 'System settings' },
'theme': { zh: '主题之家(Web 设计 · 离线预览 · 导入导出)', en: 'Theme studio (web design · offline preview · import/export)' },
'update': { zh: '系统升级与 RealVNC 保护', en: 'System upgrade and RealVNC protection' },
},
},
/* ---- 模块健康总览(#5)----
这里只放**前端自己的**文案:模块名、状态码、指标名、提示语。
后端 read:status 只回稳定枚举 + 原始数值,一个中文字符都不下发 ——
这样就不会重演「后端下发中文、英文界面漏翻」那套债。 */
st: {
nav: { zh: '健康总览', en: 'Health' },
navTip: { zh: '一屏看清每个模块的灯:绿=正常,黄=要留意,红=出问题了,灰=没启用', en: 'Every module at a glance: green = fine, amber = watch, red = problem, grey = off' },
title: { zh: '模块健康总览', en: 'Module health' },
desc: { zh: '后端一次汇总全部模块的运行状态;黄灯代表「能跑但值得看一眼」,红灯代表「现在就有问题」。鼠标悬停或点标题旁的 ⓘ 看说明。', en: 'The backend aggregates every module in one pass. Amber means "running but worth a look"; red means "there is a problem right now". Hover, or tap the ⓘ next to a title, for details.' },
refresh: { zh: '刷新', en: 'Refresh' },
auto: { zh: '自动刷新', en: 'Auto refresh' },
updated: { zh: '更新于', en: 'Updated' },
worst: { zh: '整体状态', en: 'Overall' },
worstFmt: { zh: '整体状态:{0}', en: 'Overall: {0}' },
tbBad: { zh: '模块健康:{0} 项需要处理({1})', en: 'Module health: {0} need attention ({1})' },
tbOk: { zh: '模块健康:全部正常', en: 'Module health: all healthy' },
allOk: { zh: '全部正常', en: 'All healthy' },
problems: { zh: '需要处理', en: 'Needs attention' },
goto: { zh: '去处理', en: 'Fix it' },
metric: { zh: '指标', en: 'Metrics' },
loading: { zh: '正在读取各模块状态…', en: 'Reading module status…' },
none: { zh: '暂无模块状态', en: 'No module status yet' },
tb: { zh: '模块健康', en: 'Module health' },
tip: { zh: '说明', en: 'About' },
lv: {
ok: { zh: '正常', en: 'OK' },
warn: { zh: '留意', en: 'Watch' },
err: { zh: '异常', en: 'Problem' },
off: { zh: '未启用', en: 'Off' },
na: { zh: '不适用', en: 'N/A' },
},
c: {
ok: { zh: '正常', en: 'OK' },
running: { zh: '运行中', en: 'Running' },
stopped: { zh: '已停止', en: 'Stopped' },
starting: { zh: '启动中', en: 'Starting' },
failed: { zh: '启动失败', en: 'Failed' },
disabled: { zh: '未启用', en: 'Disabled' },
unknown: { zh: '未知', en: 'Unknown' },
error: { zh: '读取失败', en: 'Read failed' },
up: { zh: '已连通', en: 'Up' },
down: { zh: '未连通', en: 'Down' },
noaddr: { zh: '有地址但无网关', en: 'Address but no gateway' },
active: { zh: '已下发', en: 'Applied' },
inactive: { zh: '未下发', en: 'Not applied' },
synced: { zh: '已同步', en: 'Synced' },
unsynced: { zh: '未同步', en: 'Not synced' },
enabled: { zh: '已启用', en: 'Enabled' },
unconfigured: { zh: '未配置', en: 'Not configured' },
not_installed: { zh: '未安装', en: 'Not installed' },
installed: { zh: '已安装', en: 'Installed' },
stale: { zh: '偏旧', en: 'Stale' },
fresh: { zh: '较新', en: 'Fresh' },
empty: { zh: '无记录', en: 'Empty' },
unsupported: { zh: '硬件不支持', en: 'Unsupported' },
update_available: { zh: '有新版本', en: 'Update available' },
latest: { zh: '已是最新', en: 'Up to date' },
broken: { zh: '索引损坏', en: 'Index broken' },
cups: { zh: 'CUPS', en: 'CUPS' },
raw: { zh: 'RAW 直通', en: 'RAW passthrough' },
},
k: {
system: { zh: '系统资源', en: 'System resources' },
wan: { zh: '外网链路', en: 'WAN uplink' },
dnsdhcp: { zh: 'DNS / DHCP', en: 'DNS / DHCP' },
ipv6: { zh: 'IPv6 / RA', en: 'IPv6 / RA' },
fw: { zh: '防火墙', en: 'Firewall' },
upnp: { zh: 'UPnP / NAT-PMP', en: 'UPnP / NAT-PMP' },
ntp: { zh: '时间同步', en: 'Time sync' },
ddns: { zh: '动态域名', en: 'DDNS' },
acl: { zh: '访问控制', en: 'Access control' },
share: { zh: '文件共享', en: 'File sharing' },
docker: { zh: 'Docker', en: 'Docker' },
dpi: { zh: '应用识别', en: 'App identification' },
qos: { zh: '智能限速', en: 'QoS shaping' },
vpn: { zh: 'WireGuard VPN', en: 'WireGuard VPN' },
accel: { zh: '软加速', en: 'Soft offload' },
ulog: { zh: '统一日志', en: 'Unified log' },
snapshot: { zh: '快照', en: 'Snapshots' },
backup: { zh: '配置备份', en: 'Config backup' },
update: { zh: '版本与升级', en: 'Version & upgrade' },
alert: { zh: '告警通知', en: 'Alerts' },
print: { zh: '打印服务', en: 'Printing' },
ca: { zh: '证书 / SSL', en: 'Certificates / SSL' },
},
h: {
system: { zh: 'CPU、内存、磁盘与温度。磁盘或内存超过 85% 变黄、95% 变红。', en: 'CPU, memory, disk and temperature. Turns amber past 85% and red past 95% on disk or memory.' },
wan: { zh: '默认路由与网关。只有地址没有网关,说明上游还没接上。', en: 'Default route and gateway. An address without a gateway means the uplink is not up yet.' },
dnsdhcp: { zh: '内网发地址与域名解析,由 dnsmasq 提供。停着就等于内网没有 DNS。', en: 'LAN addressing and name resolution, served by dnsmasq. Stopped means the LAN has no DNS.' },
ipv6: { zh: '路由通告(radvd)与 IPv6 转发开关。只做转发不发通告时标为「不适用」。', en: 'Router advertisements (radvd) and the IPv6 forwarding switch. Forwarding-only setups show as N/A.' },
fw: { zh: 'drouter 自己下发的 nftables 表数量。0 张表示还没接管过滤,流量直接放行。', en: 'Number of nftables tables drouter has pushed. 0 means filtering is not taken over yet and traffic passes through.' },
upnp: { zh: '让应用自动开端口。不装也能正常上网,属于可选件。', en: 'Lets apps open ports by themselves. Optional — the network works fine without it.' },
ntp: { zh: 'chrony 是否已与上游时钟对齐。偏差大或未同步会影响日志时间与证书校验。', en: 'Whether chrony has locked onto an upstream clock. Drift or no sync affects log timestamps and certificate checks.' },
ddns: { zh: '公网 IP 变化时自动更新域名解析。记录为空等于白开。', en: 'Updates the domain record when the public IP changes. Enabled with no records does nothing.' },
acl: { zh: '家长时间组与上网时段限制,由 nftables 执行。', en: 'Parental time groups and internet schedules, enforced by nftables.' },
share: { zh: 'SMB / NFS 是否在对外提供目录。开了开关但服务没起,客户端连不上。', en: 'Whether SMB / NFS is serving directories. Switched on but not running means clients cannot connect.' },
docker: { zh: '容器引擎与运行中的容器。没装 Docker 的机器显示为「不适用」。', en: 'Container engine and running containers. Machines without Docker show as N/A.' },
dpi: { zh: 'nDPI 特征库版本与新鲜度。超过 90 天没更新会变黄。', en: 'nDPI signature library version and freshness. Turns amber after 90 days without an update.' },
qos: { zh: 'CAKE / HTB 限速是否生效。', en: 'Whether CAKE / HTB shaping is active.' },
vpn: { zh: '远程回内网的 WireGuard 隧道与已发放的设备数。', en: 'WireGuard tunnel for remote access, plus how many peers have been issued.' },
accel: { zh: 'flowtable 快速转发是否开启。虚拟机的网卡通常不支持。', en: 'Whether the flowtable fast path is on. Virtual NICs usually do not support it.' },
ulog: { zh: '连接跟踪与流量日志的采集开关与保留天数。', en: 'Collection switches and retention for conntrack and flow logs.' },
snapshot: { zh: '最近一次快照时间与自动快照策略。超过 30 天没拍会变黄。', en: 'Latest snapshot time and the automatic policy. Turns amber if nothing was taken for 30 days.' },
backup: { zh: '可下载的配置备份包数量与最近一次时间。换机还原靠它。', en: 'Downloadable config backup packs and the latest one. This is what you restore from on a new machine.' },
update: { zh: '本机版本与是否有新版本可用。', en: 'Local version and whether a newer one is available.' },
alert: { zh: '掉线 / 磁盘满 / 温度高的推送通道。开了告警但没配通道等于没开。', en: 'Push channels for offline, disk-full and high-temperature events. Enabled with no channel does nothing.' },
print: { zh: 'CUPS 打印服务器或 USB 打印机 RAW 直通,两者互斥。', en: 'CUPS print server or USB printer RAW passthrough — mutually exclusive.' },
ca: { zh: '自建 CA 与已签发的证书记录。', en: 'Local CA and the certificates it has issued.' },
},
m: {
cpu: { zh: 'CPU 使用率', en: 'CPU usage' },
mem: { zh: '内存占用', en: 'Memory' },
disk: { zh: '磁盘占用', en: 'Disk' },
temp: { zh: '温度', en: 'Temperature' },
load: { zh: '1 分钟负载', en: 'Load (1 min)' },
proc: { zh: '进程数', en: 'Processes' },
mem_used_mb: { zh: '已用内存', en: 'Memory used' },
mem_total_mb: { zh: '内存总量', en: 'Memory total' },
disk_used_h: { zh: '已用磁盘', en: 'Disk used' },
disk_total_h: { zh: '磁盘总量', en: 'Disk total' },
leases: { zh: 'DHCP 租约', en: 'DHCP leases' },
v4: { zh: 'IPv4 地址', en: 'IPv4 addresses' },
v6: { zh: 'IPv6 地址', en: 'IPv6 addresses' },
proto: { zh: '接入方式', en: 'Method' },
iface: { zh: '网卡', en: 'Interface' },
gw: { zh: '网关', en: 'Gateway' },
dns: { zh: 'DNS 数量', en: 'DNS servers' },
forwarding: { zh: 'IPv6 转发', en: 'IPv6 forwarding' },
tables: { zh: '规则表', en: 'Tables' },
mappings: { zh: '映射条目', en: 'Mappings' },
synced: { zh: '已同步', en: 'Synced' },
offset: { zh: '偏差', en: 'Offset' },
records: { zh: '解析记录', en: 'Records' },
rules: { zh: '规则', en: 'Rules' },
shares: { zh: '共享目录', en: 'Shares' },
exports: { zh: 'NFS 导出', en: 'Exports' },
containers: { zh: '容器总数', en: 'Containers' },
running: { zh: '运行中', en: 'Running' },
version: { zh: '版本', en: 'Version' },
age_days: { zh: '库龄(天)', en: 'Age (days)' },
down_mbit: { zh: '下行 Mbps', en: 'Down Mbps' },
up_mbit: { zh: '上行 Mbps', en: 'Up Mbps' },
ips: { zh: '限速 IP 数', en: 'Shaped IPs' },
peers: { zh: '已发设备', en: 'Peers' },
port: { zh: '端口', en: 'Port' },
devices: { zh: '参与网卡', en: 'Devices' },
flows: { zh: '流表项', en: 'Flows' },
sources: { zh: '采集源', en: 'Sources' },
keep_days: { zh: '保留天数', en: 'Retention (days)' },
count: { zh: '数量', en: 'Count' },
age_hours: { zh: '距今(小时)', en: 'Age (hours)' },
auto: { zh: '自动策略', en: 'Auto policy' },
local: { zh: '本机', en: 'Local' },
latest: { zh: '最新', en: 'Latest' },
channels: { zh: '通知通道', en: 'Channels' },
certs: { zh: '证书数', en: 'Certificates' },
},
},
/* ---- 概览页 ---- */
dash: {
hostInfo: { zh: '主机信息', en: 'Host Information' },
hostname: { zh: '主机名', en: 'Hostname' },
biosMode: { zh: 'BIOS 启动方式', en: 'Boot Mode' },
platform: { zh: '运行平台', en: 'Platform' },
os: { zh: '操作系统', en: 'Operating System' },
uptime: { zh: '运行时间', en: 'Uptime' },
currentTime:{ zh: '当前时间', en: 'Current Time' },
physMachine:{ zh: '物理机', en: 'Physical' },
vmMachine: { zh: '虚拟机', en: 'Virtual' },
load: { zh: '负载', en: 'Load' },
netTotal: { zh: '累计已下载 / 已上传', en: 'Total Downloaded / Uploaded' },
gauges: { zh: '资源占用', en: 'Resource Usage' },
cpuPct: { zh: 'CPU 使用率', en: 'CPU Usage' },
memPct: { zh: '内存使用率', en: 'Memory Usage' },
diskPct: { zh: '磁盘使用率', en: 'Disk Usage' },
procTemp: { zh: '进程 / 温度', en: 'Processes / Temp' },
netQuality: { zh: '网络实时质量', en: 'Network Quality' },
downRate: { zh: '下行速率', en: 'Download' },
upRate: { zh: '上行速率', en: 'Upload' },
latency: { zh: '响应延迟(RTT)', en: 'Latency (RTT)' },
jitter: { zh: '抖动 / 丢包', en: 'Jitter / Loss' },
estab: { zh: '已建立连接', en: 'Established' },
retrans: { zh: 'TCP 重传累计', en: 'TCP Retransmits' },
statIface: { zh: '统计网卡', en: 'Interfaces' },
netState: { zh: '网络状态', en: 'Network Status' },
stageInfo: { zh: '当前阶段说明', en: 'Current Stage' },
noIface: { zh: '未检测到物理网卡。', en: 'No physical NIC detected.' },
/* --- 概览页其余词条(1.0.10 抽完整个概览页)--- */
detecting: { zh: '检测中…', en: 'Detecting…' },
kernel: { zh: '内核', en: 'Kernel' },
cores: { zh: '核', en: 'cores' },
netTotalTip: {
zh: '自开始统计以来,本机所有物理网卡累计收发的数据总量(重启不清零)。'
+ '实时速率请看下方「网络实时质量」。',
en: 'Total bytes sent/received by all physical NICs since counting '
+ 'began (not reset on reboot). For live rates, see Network '
+ 'Quality below.',
},
netExtra: { zh: '统计起始时间读取中…', en: 'Reading start time…' },
diskRoot: { zh: '根分区 {0} / {1}(可用 {2})',
en: 'Root {0} / {1} (free {2})' },
diskRootNoSize: { zh: '根分区(/)使用情况', en: 'Root (/) usage' },
cpuSub: { zh: '{0} 逻辑核心 · {1} 物理核心{2}',
en: '{0} logical · {1} physical cores{2}' },
memSub: { zh: '可用 {0} MB 共 {1} MB',
en: '{0} MB available of {1} MB' },
procCount: { zh: '{0} 个进程', en: '{0} processes' },
cpuTemp: { zh: 'CPU 温度 {0} °C{1}',
en: 'CPU {0} °C{1}' },
noTempSensor: { zh: '未读取到温度传感器,仅显示进程数',
en: 'No temperature sensor; processes only' },
procLimit: { zh: '进程上限 {0}(占用 {1}%)',
en: 'Process limit {0} ({1}% used)' },
netQualityTip: {
zh: '每 2 秒自动刷新。速率按物理网卡合计;抖动 / 响应对网关(或公共 DNS)'
+ '探测,结果缓存 20 秒以节省资源。',
en: 'Refreshes every 2s. Rates aggregate all physical NICs; jitter '
+ 'and latency probe the gateway (or a public DNS) and are cached '
+ 'for 20s to save resources.',
},
realtime: { zh: '实时', en: 'Live' },
probing: { zh: '探测中…', en: 'Probing…' },
pps: { zh: '包速率', en: 'Packet rate' },
allPhysIf: { zh: '全部物理口', en: 'All physical NICs' },
/* --- 概览页第 3 批:网络状态 / 服务状态 / 阶段说明 --- */
netStateTip: { zh: '当前接口地址与默认路由',
en: 'Interface addresses and the default route' },
noAddr: { zh: '无地址', en: 'No address' },
none: { zh: '无', en: 'None' },
defRoute: { zh: '默认路由', en: 'Default route' },
svcState: { zh: '服务状态', en: 'Service Status' },
svcStateTip: {
zh: '核心服务运行情况(灰色为未启用)',
en: 'Status of core services (grey = not enabled)',
},
running: { zh: '运行中', en: 'Running' },
notRunning: { zh: '未运行', en: 'Not running' },
bootStart: { zh: '开机自启', en: 'Start on boot' },
disabled: { zh: '禁用', en: 'Disabled' },
stageTip: {
zh: '本项目采用「先构建、后切换」策略,确保不影响正在运行的局域网与 RealVNC 会话。',
en: 'This project builds first and switches later, so the running '
+ 'LAN and RealVNC session are never disrupted.',
},
buildStage: { zh: '构建阶段', en: 'Build stage' },
inProgress: { zh: '进行中', en: 'In progress' },
saveOnly: {
zh: 'DHCP 服务、防火墙规则、拨号均只保存不启用',
en: 'DHCP service, firewall rules and dial-up are saved but not '
+ 'activated',
},
wanIf: { zh: 'WAN 口', en: 'WAN port' },
wanUnassigned: {
zh: '未分配(请先添加网卡,然后在「网卡与桥接」中指派)',
en: 'Unassigned (add a NIC first, then assign it under NICs & Bridge)',
},
lanIf: { zh: 'LAN 口', en: 'LAN port' },
switchWay: { zh: '切换方式', en: 'How switching happens' },
switchWayTip: {
zh: '填写完 PPPoE 账号密码并保存后,由你决定何时执行切换',
en: 'After you fill in the PPPoE credentials and save, you decide '
+ 'when to switch over',
},
},
/* ---- 服务名(概览页「服务状态」列表)---- */
svc: {
dnsmasq: { zh: 'DHCP/DNS 服务', en: 'DHCP / DNS service' },
radvd: { zh: 'IPv6 RA', en: 'IPv6 RA' },
dhcpcd: { zh: 'DHCPv6 客户端', en: 'DHCPv6 client' },
miniupnpd: { zh: 'UPnP', en: 'UPnP' },
chrony: { zh: 'NTP 客户端', en: 'NTP client' },
'systemd-networkd': { zh: 'networkd', en: 'networkd' },
NetworkManager: { zh: 'NetworkManager', en: 'NetworkManager' },
sshd: { zh: 'SSH', en: 'SSH' },
'drouter-web': { zh: '管理后台', en: 'Management console' },
lightdm: { zh: 'LightDM 桌面', en: 'LightDM desktop' },
rsyslog: { zh: '日志服务', en: 'Log service' },
/* 概览「服务状态」里还会出现的守护:缺了英文界面直接显示键名 svc.xxx */
docker: { zh: 'Docker 引擎', en: 'Docker engine' },
containerd: { zh: '容器运行时', en: 'Container runtime' },
'pppd-drouter': { zh: 'PPPoE 拨号', en: 'PPPoE dial-up' },
smbd: { zh: 'Samba 文件共享', en: 'Samba file sharing' },
nmbd: { zh: 'Samba 名称服务', en: 'Samba name service' },
'nfs-server': { zh: 'NFS 服务', en: 'NFS service' },
rpcbind: { zh: 'RPC 端口映射', en: 'RPC port mapper' },
},
/* ---- 版本与更新(本轮新增)---- */
upd: {
title: { zh: '版本与更新', en: 'Version & Updates' },
upToDate: { zh: '已是最新', en: 'Up to date' },
hasUpdate: { zh: '有可用更新', en: 'Update available' },
seeNotes: { zh: '查看版本发布说明', en: 'View release notes' },
checking: { zh: '正在连接 GitHub 查询最新版本…',
en: 'Querying GitHub for the latest version…' },
lastCheck: { zh: '上次检查', en: 'Last checked' },
probeSrc: { zh: '探测源', en: 'Probe source' },
upAndGo: { zh: '查看更新内容并升级', en: 'Review & upgrade' },
detecting: { zh: '正在检测新版本…',
en: 'Checking for updates…' },
notesTitle: { zh: '版本发布说明', en: 'Release Notes' },
howTo: { zh: '怎么装', en: 'How to install' },
downloads: { zh: '下载地址', en: 'Downloads' },
security: { zh: '安全说明', en: 'Security' },
curInstalled:{ zh: '当前安装', en: 'Currently installed' },
latestRelease:{ zh: '最新发布', en: 'Latest release' },
type: { zh: '类型', en: 'Type' },
fileName: { zh: '文件名', en: 'File name' },
link: { zh: '链接', en: 'Link' },
},
/* ---- 上游链路(本轮新增)---- */
ups: {
title: { zh: '上游链路', en: 'Upstream Link' },
v4: { zh: 'IPv4 上游', en: 'IPv4 Upstream' },
v6: { zh: 'IPv6 上游', en: 'IPv6 Upstream' },
proto: { zh: '协议', en: 'Protocol' },
addr: { zh: '地址', en: 'Address' },
gw: { zh: '默认网关', en: 'Default gateway' },
dns: { zh: 'DNS', en: 'DNS' },
connected: { zh: '已连接', en: 'Connected' },
bridge: { zh: '网桥', en: 'Bridge' },
physIf: { zh: '物理接口', en: 'Physical interface' },
validLife: { zh: '剩余有效期', en: 'Valid lifetime' },
prefLife: { zh: '首选期', en: 'Preferred' },
dhcp6Stat: { zh: 'DHCPv6 统计', en: 'DHCPv6 Statistics' },
dhcp6Off: { zh: '本机未启用 DHCPv6 客户端',
en: 'DHCPv6 client not enabled on this host' },
noUpstream: { zh: '未检测到上游接口',
en: 'No upstream interface detected' },
accumulating: { zh: '正在累计', en: 'Accumulating…' },
readingUp: { zh: '正在读取上游地址…', en: 'Reading upstream address…' },
noUpstreamTip: {
zh: '本机所有接口都没有可用的上游地址。若这是刚装好的机器,'
+ '请先到「网卡与桥接」指派 WAN 口。',
en: 'No interface has a usable upstream address. On a freshly '
+ 'installed machine, assign the WAN port under '
+ 'Network Interfaces & Bridge first.',
},
dhcp6OffTip: {
zh: '内核没有 dhcp6s 计数器(IPv6 可能走 SLAAC / 静态配置)',
en: 'The kernel exposes no dhcp6s counters (IPv6 is probably '
+ 'using SLAAC or a static address).',
},
backendDown: {
zh: '后端接口无响应,请检查 drouter-helper 是否在运行',
en: 'The backend did not respond; check whether drouter-helper '
+ 'is running.',
},
},
/* ---- 网络明细(本轮新增)---- */
nd: {
title: { zh: '网络明细', en: 'Network Detail' },
neigh4: { zh: 'IPv4 邻居', en: 'IPv4 Neighbours' },
neigh6: { zh: 'IPv6 邻居', en: 'IPv6 Neighbours' },
route4: { zh: 'IPv4 路由', en: 'IPv4 Routes' },
route6: { zh: 'IPv6 路由', en: 'IPv6 Routes' },
rule6: { zh: 'IPv6 规则', en: 'IPv6 Rules' },
dst: { zh: '目标', en: 'Destination' },
mac: { zh: 'MAC 地址', en: 'MAC Address' },
metric: { zh: '跃点', en: 'Metric' },
table: { zh: '路由表', en: 'Table' },
proto: { zh: '协议', en: 'Protocol' },
prio: { zh: '优先级', en: 'Priority' },
srcAddr: { zh: '源地址', en: 'Source' },
stale: { zh: '静默', en: 'Idle' },
failed: { zh: '解析失败', en: 'Failed' },
perm: { zh: '永久', en: 'Permanent' },
active: { zh: '活跃', en: 'Active' },
builtin: { zh: '内核自动', en: 'Kernel built-in' },
userPol: { zh: '用户策略', en: 'User policy' },
defRoute: { zh: '默认路由', en: 'Default route' },
empty: { zh: '暂无条目', en: 'No entries' },
readingNet: { zh: '正在读取邻居表与路由表…',
en: 'Reading neighbours and routes…' },
/* --- 抽 netdetail.js 时补的 --- */
ipv4Addr: { zh: 'IPv4 地址', en: 'IPv4 address' },
ipv6Addr: { zh: 'IPv6 地址', en: 'IPv6 address' },
gw: { zh: '网关', en: 'Gateway' },
source: { zh: '来源', en: 'Source' },
countTip: { zh: '共 {0} 条。', en: '{0} entries in total.' },
staleTip: {
zh: '其中 {0} 条为「静默」—— 该设备曾在线但现在没有通信,属正常状态;'
+ '「解析失败」才是真问题(ARP/ND 应答不上来)。',
en: '{0} of them are idle — the device was seen before but is not '
+ 'communicating now, which is normal. Only "Failed" indicates '
+ 'a real problem (no ARP/ND reply).',
},
neighTip: { zh: 'ARP 缓存 —— 回答「这个 IP 是哪台设备」。',
en: 'ARP cache — answers "which device is this IP?"' },
neigh6Tip: { zh: '邻居发现(NDP)缓存。',
en: 'Neighbour Discovery (NDP) cache.' },
route4Tip: { zh: '决定 IPv4 流量往哪走。',
en: 'Decides where IPv4 traffic goes.' },
route6Tip: { zh: '决定 IPv6 流量往哪走。',
en: 'Decides where IPv6 traffic goes.' },
rule6Tip: { zh: '按优先级依次查表,决定用哪张路由表。',
en: 'Tables are consulted in priority order to pick '
+ 'a routing table.' },
mainTableOnly: {
zh: '只显示 main 表(内核的 local 表是回环与链路本地路由,'
+ '十几条噪音会淹掉真正要看的内容)。',
en: 'Only the main table is shown — the kernel\'s local table '
+ 'holds a dozen loopback and link-local routes that would '
+ 'bury the useful entries.',
},
ruleBuiltinTip: {
// ⚠️ 这里**不能带 HTML 标签**:t() 的返回值直接进 innerHTML 是危险的
// (词条来自代码,理论上可控,但一旦有人从配置/接口注入词条就是 XSS)。
// 要强调就用「」或纯文字,不靠 <b>。
zh: '优先级 0(local 表)与 32766(main 表)是内核自动建立的,'
+ '不要手工删除。',
en: 'Priorities 0 (local) and 32766 (main) are created by the '
+ 'kernel — do not delete them manually.',
},
},
/* ---- 实时图(本轮新增)---- */
rt: {
title: { zh: '实时', en: 'Realtime' },
load: { zh: '系统负载', en: 'System Load' },
loadUnit: { zh: '1 / 5 / 15 分钟', en: '1 / 5 / 15 min' },
bandwidth:{ zh: '带宽', en: 'Bandwidth' },
bwUnit: { zh: '下行 / 上行', en: 'Down / Up' },
conn: { zh: '连接数', en: 'Connections' },
connUnit: { zh: '已建立的 TCP', en: 'Established TCP' },
down: { zh: '下行', en: 'Download' },
up: { zh: '上行', en: 'Upload' },
oneMin: { zh: '1 分钟', en: '1 min' },
fiveMin: { zh: '5 分钟', en: '5 min' },
fifteen: { zh: '15 分钟', en: '15 min' },
sampling: { zh: '每 3 秒采样 · 保留 3 分钟',
en: 'Sampled every 3s · 3-minute window' },
loadNote: { zh: '平均负载是 Linux 跟踪系统资源占用的一项指标,'
+ '数值等于「正在运行或等待 IO 的进程数」的 1/5/15 分钟均值。'
+ '柱状图右侧是最新采样点。',
en: 'Load average is the 1/5/15-minute mean of runnable '
+ 'and I/O-waiting processes. The rightmost bar is the '
+ 'newest sample.' },
},
/* ---- DHCP 服务页(viewDhcp)---- */
dhcp: {
swTitle: { zh: 'DHCP 服务开关', en: 'DHCP Service Switch' },
swDesc: { zh: '关闭时仅做 DNS 转发,不分配地址。构建阶段默认关闭,'
+ '避免与现有网络中的 DHCP 冲突。',
en: 'When off, dnsmasq only forwards DNS and hands out no '
+ 'addresses. It is disabled by default during the '
+ 'build stage so it cannot collide with a DHCP server '
+ 'already running on the network.' },
enable: { zh: '启用 DHCP 服务', en: 'Enable DHCP service' },
poolTitle: { zh: '地址池', en: 'Address Pool' },
poolStart: { zh: '起始地址', en: 'Start address' },
poolEnd: { zh: '结束地址', en: 'End address' },
netmask: { zh: '子网掩码', en: 'Subnet mask' },
leaseTime: { zh: '租期(秒)', en: 'Lease time (seconds)' },
optTitle: { zh: 'DHCP Options(RouterOS 风格)',
en: 'DHCP Options (RouterOS style)' },
/* ⚠️ 下面这一段说明里混着 <span class="mono"> 和 <b>,而词条
**不允许携带 HTML 标签**(t() 的返回值直接进 innerHTML,
万一有人从配置/接口注入词条就是 XSS)。所以整段被拆成若干
条,标签留在 app.js 的模板里。见 nd.ruleBuiltinTip 的同款告诫。 */
optIntro: { zh: '对应 ', en: 'Maps to ' },
optIntroEnd:{ zh: '。', en: '.' },
optC3: { zh: ' = 默认网关,', en: ' sets the default gateway, ' },
optC6: { zh: ' = 客户端该用哪台 DNS(一般填',
en: ' tells the client which DNS server to use '
+ '(usually ' },
selfBox: { zh: '本机', en: 'this router' },
optDnsRest: { zh: '地址,由本机再转发到上游,',
en: '\'s own address, which then forwards upstream, ' },
notWord: { zh: '不是', en: 'not' },
optAnyCode: { zh: '填上游 DNS)。可自由添加任意 code(如 43、121 等)。',
en: 'the upstream DNS server). Any code may be added '
+ '(e.g. 43, 121).' },
opt3Label: { zh: 'Option code 3 · 网关', en: 'Option code 3 · Gateway' },
thEnable: { zh: '启用', en: 'Enable' },
thValue: { zh: '值(Value)', en: 'Value' },
thRemark: { zh: '备注', en: 'Remark' },
thForce: { zh: '强制', en: 'Force' },
phOptValue: { zh: 'IP 或文本', en: 'IP or text' },
btnDelete: { zh: '删除', en: 'Delete' },
btnAddOpt: { zh: '+ 添加自定义 Option', en: '+ Add Custom Option' },
optHint: { zh: '提示:勾选「强制」会使用 dhcp-option-force,即使客户端'
+ '未请求也会下发。code 3 / 6 请优先用上面的专属字段 —— '
+ '下表里重复写同一个 code 不会报错,会与专属字段'
+ '**合并成一行**(顺序去重),所以不必担心写出重复指令。',
en: 'Tip: ticking "Force" uses dhcp-option-force, so the '
+ 'option is sent even when the client never asked for '
+ 'it. Prefer the dedicated fields above for codes 3 '
+ 'and 6 — writing the same code again in the table '
+ 'below is not an error: it gets **merged into a single '
+ 'line** together with the dedicated field (duplicates '
+ 'dropped, order preserved), so you cannot end up with '
+ 'a duplicate directive.' },
staticTitle:{ zh: '静态地址绑定', en: 'Static Leases' },
staticDesc: { zh: '按 MAC 固定分配 IP,格式:',
en: 'Pin an IP to a MAC, format:' },
thName: { zh: '名称', en: 'Name' },
btnAddStatic:{ zh: '+ 添加静态绑定', en: '+ Add Static Lease' },
leaseTitle: { zh: '当前租约(实时)', en: 'Current Leases (live)' },
leaseDescA: { zh: 'dnsmasq 已分配的客户端,类似 RouterOS 的 Lease 列表。',
en: 'The clients dnsmasq has handed out addresses to, '
+ 'much like the RouterOS lease list. ' },
dblClickIp: { zh: '双击 IP', en: 'Double-click an IP' },
leaseDescB: { zh: ' 可为该客户端选择 DHCP Options;每行右侧可一键转为'
+ '静态绑定、或回收该 IP 回地址池。',
en: ' to pick DHCP options for that client; the buttons '
+ 'on the right turn a lease into a static one or '
+ 'release the IP back into the pool.' },
btnRefreshLease: { zh: '刷新租约', en: 'Refresh Leases' },
autoRefresh: { zh: '每 10 秒自动刷新', en: 'Auto-refresh every 10s' },
thIp: { zh: 'IP 地址', en: 'IP Address' },
thMac: { zh: 'MAC 地址', en: 'MAC Address' },
thHostname: { zh: '主机名', en: 'Hostname' },
thRemain: { zh: '剩余时间', en: 'Time Left' },
thType: { zh: '类型', en: 'Type' },
thActions: { zh: '操作', en: 'Actions' },
dblTitle: { zh: '双击选择 DHCP Options',
en: 'Double-click to choose DHCP Options' },
tagStatic: { zh: '静态', en: 'Static' },
tagDynamic: { zh: '动态', en: 'Dynamic' },
btnToStatic:{ zh: '转为静态', en: 'Make Static' },
btnRelease: { zh: '回收 IP', en: 'Release IP' },
noLease: { zh: '暂无租约记录(DHCP 服务未启动或尚无客户端)。',
en: 'No leases yet (the DHCP service is not running, or '
+ 'no client has joined).' },
toastLeaseRefreshed: { zh: '租约已刷新', en: 'Leases refreshed' },
},
/* ---- 防火墙页(viewFw,IPv4/IPv6 共用)---- */
fw: {
title: { zh: 'IPv{0} 防火墙规则', en: 'IPv{0} Firewall Rules' },
descA: { zh: '使用 nftables 语法。应用前会自动执行 ',
en: 'Uses nftables syntax. A ' },
descB: { zh: ' 语法预检,失败会阻止应用并保留现有规则;'
+ '应用前自动创建快照,可一键回滚。',
en: ' syntax check runs automatically before the rules are '
+ 'applied; if it fails the apply is blocked and the '
+ 'current rules are left in place. A snapshot is taken '
+ 'before every apply so you can roll back in one click.' },
wanIf: { zh: 'WAN 接口', en: 'WAN Interface' },
lanIf: { zh: 'LAN 接口(逗号分隔)',
en: 'LAN Interfaces (comma-separated)' },
mssClamp: { zh: 'PPPoE MSS 钳制', en: 'PPPoE MSS Clamping' },
on: { zh: '开启(推荐)', en: 'On (recommended)' },
off: { zh: '关闭', en: 'Off' },
btnGenDefault: { zh: '按当前参数生成默认规则',
en: 'Generate Default Rules' },
btnShowLive: { zh: '查看系统当前生效规则',
en: 'Show Active Rules' },
logTitle: { zh: '防火墙日志(滚动)', en: 'Firewall Log (scrolling)' },
/* ⚠️ 原文写「已翻译成简体中文」—— 那是**后端**干的活:日志条目由
/api/fw/log 的 action_cn / summary_cn 字段带回,那些字段**只
有中文**。所以英文界面下这一段依然会显示中文行,界面上的
文案翻译解决不了它。真要译,得让后端按 lang 返回对应字段。 */
logDesc: { zh: '把 nftables 命中的包记录到内核日志,并在下面实时'
+ '滚动显示(已翻译成简体中文)。记录本身会占用少量 '
+ 'CPU,因此内置限速(默认 20 包/秒),避免日志风暴'
+ '拖垮小内存设备。',
en: 'Writes the packets nftables matches into the kernel '
+ 'log and scrolls them live below (the backend returns '
+ 'each hit already summarised — currently in Chinese '
+ 'only). Logging itself costs a little CPU, so the '
+ 'rate is capped (20 packets/s by default) to keep a '
+ 'log storm from overwhelming a small-memory device.' },
logDrop: { zh: '记录被拒绝 / 丢弃的包(推荐)',
en: 'Log rejected / dropped packets (recommended)' },
logAccept: { zh: '同时记录被放通的包(数据量大)',
en: 'Also log accepted packets (high volume)' },
logRate: { zh: '日志限速(包/秒)', en: 'Log rate (packets/s)' },
/* ⚠️ 方位词必须是「底部」——动作条在 index.html 里位于
<section id="view"> 之后、<footer> 之前,是一条**底部全宽**的栏,
右上角是顶栏的刷新/新增区。2026-10-05 用户指出后全量排查,共 3 处。 */
saveTip: { zh: '修改后请点击页面底部动作条上的「保存并应用」才会写入规则并生效。',
en: 'Click "Save & Apply" on the action bar at the '
+ 'bottom of the page to write the rules and make '
+ 'them take effect.' },
rawLabel: { zh: '规则内容(可直接编辑)', en: 'Rule Content (editable)' },
rawPh: { zh: '留空则按上面参数自动生成默认规则',
en: 'Leave empty to generate default rules from the '
+ 'settings above' },
rawHintA: { zh: '留空 = 使用系统按参数生成的默认规则(含 NAT、转发、'
+ 'MSS 钳制)。下方默认内容已用 ',
en: 'Leaving it empty uses the default rules generated '
+ 'from the settings above (NAT, forwarding, MSS '
+ 'clamping). The sample below is commented out with ' },
rawHintB: { zh: ' 注释包裹,删除注释符即可启用对应规则。',
en: ' — remove the comment marker to enable that rule.' },
liveTitle: { zh: '防火墙实时日志(滚动显示)',
en: 'Firewall Log (live)' },
liveDescA: { zh: '数据来自内核日志中带 ', en: 'Rule hits are read from '
+ 'kernel log lines tagged ' },
liveDescB: { zh: ' 前缀的规则命中记录,已逐条翻译。开启自动滚动后'
+ '可当作实时监控窗口使用。',
en: ' and summarised line by line. With auto-scroll '
+ 'enabled this doubles as a live monitoring window.' },
fam: { zh: '协议族', en: 'Family' },
famV4: { zh: '仅 IPv4', en: 'IPv4 only' },
famV6: { zh: '仅 IPv6', en: 'IPv6 only' },
act: { zh: '动作', en: 'Action' },
actAll: { zh: '全部动作', en: 'All actions' },
actReject: { zh: '拒绝', en: 'Reject' },
actDrop: { zh: '丢弃', en: 'Drop' },
actAccept: { zh: '放通', en: 'Accept' },
since: { zh: '时间范围', en: 'Time Range' },
since15m: { zh: '最近 15 分钟', en: 'Last 15 minutes' },
since1h: { zh: '最近 1 小时', en: 'Last hour' },
since6h: { zh: '最近 6 小时', en: 'Last 6 hours' },
since24h: { zh: '最近 24 小时', en: 'Last 24 hours' },
kw: { zh: '关键字', en: 'Keyword' },
kwPh: { zh: 'IP / 端口 / 接口名', en: 'IP / port / interface name' },
btnRefresh: { zh: '立即刷新', en: 'Refresh Now' },
autoScroll: { zh: '自动滚动(每 3 秒)', en: 'Auto-scroll (every 3s)' },
btnExport: { zh: '导出 JSON', en: 'Export JSON' },
btnClear: { zh: '清空显示', en: 'Clear View' },
checkTitle: { zh: '预检与应用', en: 'Check & Apply' },
btnCheck: { zh: '仅语法检查(不应用)',
en: 'Syntax Check Only (do not apply)' },
btnSnapshots: { zh: '查看快照列表', en: 'View Snapshots' },
toastDefault: { zh: '已切换为按参数自动生成默认规则',
en: 'Switched to default rules generated from the '
+ 'current settings' },
toastChecking: { zh: '正在执行语法预检…', en: 'Running the syntax check…' },
toastRollback: { zh: '请在「紧急救援通道 → 可回滚的快照」里挑选并回滚',
en: 'Pick a snapshot to roll back under '
+ '"Emergency Rescue → Rollback Snapshots"' },
},
/* ---- IPv6 / RA 页(viewIpv6)---- */
ipv6: {
wanTitle: { zh: 'WAN 侧 IPv6 获取', en: 'IPv6 on the WAN Side' },
wanDescA: { zh: '通过 DHCPv6 客户端获取地址与前缀委派(PD)。',
en: 'Obtain addresses and a prefix delegation (PD) through '
+ 'the DHCPv6 client. ' },
warn: { zh: '注意:', en: 'Note: ' },
wanDescB: { zh: '运营商是否下发 PD 需实测,有链路地址不代表能拿到'
+ '可分配给内网的前缀。',
en: 'Whether the ISP actually delegates a PD has to be '
+ 'measured — having a link-local address does not mean '
+ 'you get a prefix you can hand out to the LAN.' },
pdTitle: { zh: 'DHCPv6 / 前缀委派(PD)',
en: 'DHCPv6 / Prefix Delegation (PD)' },
wanIf: { zh: 'WAN 接口', en: 'WAN Interface' },
lanIf: { zh: 'LAN 接口', en: 'LAN Interface' },
plen: { zh: '子网前缀长度', en: 'Prefix Length' },
slaId: { zh: 'SLA-ID 后缀', en: 'SLA-ID Suffix' },
reqPd: { zh: '请求前缀委派(PD)',
en: 'Request Prefix Delegation (PD)' },
reqIa: { zh: '同时请求接口地址(IA_NA)',
en: 'Also Request Interface Addresses (IA_NA)' },
raTitle: { zh: '局域网 RA 通告(radvd)',
en: 'LAN Router Advertisements (radvd)' },
raDesc: { zh: '向局域网设备通告 IPv6 路由与地址前缀。',
en: 'Advertise IPv6 routes and address prefixes to devices '
+ 'on the LAN.' },
raIf: { zh: '通告接口', en: 'Advertising Interface' },
raPfx: { zh: '通告前缀(如运营商下发 /64)',
en: 'Advertised Prefix (e.g. an ISP-delegated /64)' },
raMax: { zh: '最大通告间隔(秒)', en: 'Max Interval (seconds)' },
raMin: { zh: '最小通告间隔(秒)', en: 'Min Interval (seconds)' },
raLifetime: { zh: '默认路由生命期', en: 'Default Route Lifetime' },
raHop: { zh: '跳数限制', en: 'Hop Limit' },
pfxValid: { zh: '前缀有效生命期', en: 'Prefix Valid Lifetime' },
pfxPref: { zh: '前缀首选生命期', en: 'Prefix Preferred Lifetime' },
rdnss: { zh: 'RDNSS(下发 DNS)', en: 'RDNSS (advertise DNS)' },
dnssl: { zh: 'DNSSL(域名)', en: 'DNSSL (domain search list)' },
rdnssLife: { zh: 'RDNSS 生命期(秒)', en: 'RDNSS Lifetime (seconds)' },
dnsslLife: { zh: 'DNSSL 生命期(秒)', en: 'DNSSL Lifetime (seconds)' },
lifeHintA: { zh: '两个生命期决定客户端保留这份 DNS 多久。DNSSL 没填时'
+ '跟随 RDNSS 的值;注意不要写成 ',
en: 'These two lifetimes decide how long clients keep '
+ 'this DNS configuration. When DNSSL is left empty it '
+ 'follows the RDNSS value; do not shorten it to '
+ 'anything other than ' },
lifeHintB: { zh: ' 之外的省略形式 —— 它们是数字输入框,0 不会被使用,'
+ '这里给的都是合法默认值。',
en: ' — these are number inputs, so 0 is never used, and '
+ 'the defaults shown here are all valid values.' },
mFlag: { zh: 'M 标志(客户端用 DHCPv6 取地址)',
en: 'M flag (clients get addresses over DHCPv6)' },
oFlag: { zh: 'O 标志(客户端用 DHCPv6 取其他配置)',
en: 'O flag (clients get other config over DHCPv6)' },
ndTitle: { zh: 'ND 邻居发现参数', en: 'ND (Neighbour Discovery) Parameters' },
ndDesc: { zh: '来自内核 /proc/sys/net/ipv6,只读展示;如需修改可在'
+ '服务器上用 sysctl 调整。',
en: 'Read-only view of the kernel values under '
+ '/proc/sys/net/ipv6; to change them, use sysctl on '
+ 'the server.' },
poolTitle: { zh: 'IPv6 地址池 / 前缀下发(RouterOS 风格)',
en: 'IPv6 Address Pool / Prefix Delegation (RouterOS style)' },
poolDescA: { zh: '把从运营商获取的 IPv6 前缀分配给内网。类似 RouterOS 的 ',
en: 'Hand the IPv6 prefix you obtained from the ISP out to '
+ 'the LAN, much like RouterOS ' },
poolDescB: { zh: '。', en: '.' },
poolEnable: { zh: '启用地址池(从池中分配地址给内网接口)',
en: 'Enable the address pool (assign addresses from the '
+ 'pool to LAN interfaces)' },
poolFrom: { zh: '地址来源', en: 'Address Source' },
fromPool: { zh: '从地址池分配(from pool)', en: 'Allocate from the pool (from pool)' },
fromManual: { zh: '手动指定前缀', en: 'Specify the prefix manually' },
fromPd: { zh: '自动跟随 PD 前缀', en: 'Follow the delegated PD prefix' },
poolName: { zh: '池名称', en: 'Pool Name' },
poolPrefix: { zh: '池前缀(可留空,取自 PD)',
en: 'Pool Prefix (leave empty to use the PD)' },
subBits: { zh: '子网 ID 长度(借用主机位做子网)',
en: 'Subnet ID Length (host bits borrowed for subnets)' },
subStart: { zh: '分配起始子网 ID', en: 'First Subnet ID Allocated' },
subEnd: { zh: '分配结束子网 ID', en: 'Last Subnet ID Allocated' },
polTitle: { zh: '池策略(Pool Policy)', en: 'Pool Policy' },
polDesc: { zh: '对应 RouterOS 的 pool-policy,可多选。勾选的策略会在'
+ '生成地址与 RA 通告时生效。',
en: 'The RouterOS pool-policy equivalent; select as many '
+ 'as you like. The policies you tick apply when '
+ 'addresses are generated and RA messages are sent.' },
/* 池策略的显示文案。key 用 V6P_POLICIES 的 `v`(recommend / strict /
without-acquire / auto-link-local)—— 它是**写进配置、发给后端**
的持久化值,所以拿它当词条 key 正好:既稳定又与界面语言无关。
app.js 里用 t('ipv6.pol.' + p.v + '.n') 取。 */
pol: {
recommend: {
n: { zh: '推荐(recommend)',
en: 'Recommended (recommend)' },
d: { zh: '默认策略,优先选用推荐前缀,兼容性最好',
en: 'The default policy — prefers the recommended prefix and '
+ 'has the widest compatibility.' },
},
strict: {
n: { zh: '严格(strict)', en: 'Strict (strict)' },
d: { zh: '严格按池范围分配,池用尽时不分新地址',
en: 'Allocates strictly within the pool range; once the pool '
+ 'is used up no new addresses are handed out.' },
},
'without-acquire': {
n: { zh: '不主动获取(without-acquire)',
en: 'No active acquire (without-acquire)' },
d: { zh: '仅使用已有前缀,不主动向运营商索取新的 PD',
en: 'Uses only the prefixes already held; never asks the ISP '
+ 'for a new PD.' },
},
'auto-link-local': {
n: { zh: '自动链路本地(auto link-local)',
en: 'Automatic link-local (auto link-local)' },
d: { zh: '无公网前缀时回退使用 fe80:: 链路本地地址',
en: 'Falls back to fe80:: link-local addresses when there is '
+ 'no public prefix.' },
},
},
liveTitle: { zh: '当前获取到的 IPv6 前缀(实时)',
en: 'IPv6 Prefixes Currently Held (live)' },
liveDesc: { zh: '系统自动探测,可在此为每个前缀添加备注(例如「电信 /56」)。',
en: 'Detected automatically by the system; you can attach '
+ 'a note to each prefix here (e.g. "Telecom /56").' },
pubAddr: { zh: '公网地址', en: 'Public Addresses' },
notFetched: { zh: '未获取', en: 'Not obtained' },
pdLabel: { zh: 'PD 前缀', en: 'PD Prefix' },
pdYes: { zh: '似乎已获取委派前缀',
en: 'A delegated prefix seems to be present' },
pdNo: { zh: '暂未检测到 PD(需运营商支持)',
en: 'No PD detected yet (requires ISP support)' },
noData: { zh: '无数据', en: 'No data' },
thIf: { zh: '接口', en: 'Interface' },
thAddr: { zh: '地址', en: 'Address' },
thLen: { zh: '前缀长度', en: 'Prefix Length' },
thRemark: { zh: '备注', en: 'Remark' },
phRemark: { zh: '例如 电信 /56', en: 'e.g. Telecom /56' },
noPrefix: { zh: '暂无可记录的前缀(运营商可能未下发公网 IPv6)。',
en: 'No prefixes to annotate yet (the ISP may not have '
+ 'delegated public IPv6).' },
dirtyPool: { zh: '地址池设置已修改,请点击保存并应用',
en: 'Address pool settings changed — click Save & Apply' },
dirtyRemark:{ zh: '前缀备注已修改,请点击保存并应用',
en: 'Prefix note changed — click Save & Apply' },
},
/* ---- 网卡与桥接页(viewIface)---- */
iface: {
/* 角色名。⚠️ key 用 IFACE_ROLES 的 **v 值**(持久化到后端的角色标识),
不是中文文案 —— 换语言只改这里的 zh/en,v 不动。
未分配(v 为空串)单独用 unassigned,因为 '' 不是合法的 key 段。 */
role: {
none: { zh: '未分配', en: 'Unassigned' },
wan: { zh: 'WAN(上行 / 光猫)', en: 'WAN (uplink / ONT)' },
lan: { zh: 'LAN(局域网主口)', en: 'LAN (main LAN port)' },
bridge: { zh: '桥接成员(并入网桥)', en: 'Bridge member (joined to the bridge)' },
guest: { zh: '访客网络', en: 'Guest network' },
iot: { zh: 'IoT 设备专网', en: 'IoT-only network' },
dmz: { zh: 'DMZ(对外暴露)', en: 'DMZ (exposed to the internet)' },
mgmt: { zh: '管理口(仅管理访问)', en: 'Management port (console access only)' },
unused: { zh: '保留 / 未接线', en: 'Reserved / not cabled' },
},
newTip: { zh: '检测到 {0} 个新网卡({1})尚未分类,请指派角色。',
en: '{0} new NIC(s) detected ({1}) are not classified yet — please assign a role.' },
tipClose: { zh: '关闭此提示(将来出现新的未分类网卡时会再次提醒)',
en: 'Dismiss this notice (it will come back when another unclassified NIC appears)' },
tipCloseAria: { zh: '关闭提示', en: 'Dismiss notice' },
physTitle: { zh: '物理网卡', en: 'Physical NICs' },
physDesc: { zh: '以 MAC 地址作为唯一标识,即使网卡名变化(ens18 → enp6s18)也能找回你的备注与角色。每一行都显示:Debian 13 当前的配置方式(手动 / DHCP / 静态)、驱动版本与来源、角色。',
en: 'The MAC address is the stable identifier, so your notes and role survive a NIC rename (ens18 → enp6s18). Each row shows how Debian 13 currently configures it (manual / DHCP / static), the driver version and its source, and the assigned role.' },
noPhysNic: { zh: '未检测到物理网卡。', en: 'No physical NIC detected.' },
speed: { zh: '速率', en: 'Speed' },
driver: { zh: '驱动', en: 'Driver' },
noIpv4: { zh: '无 IPv4', en: 'No IPv4' },
linkLabel: { zh: '连接:', en: 'Link: ' },
remark: { zh: '备注', en: 'Note' },
remarkPh: { zh: '例如:电信光猫 / 客厅交换',
en: 'e.g. ISPONTEX modem / living-room switch' },
roleLabel: { zh: '角色', en: 'Role' },
saveNic: { zh: '保存本卡', en: 'Save this NIC' },
curRole: { zh: '当前角色:', en: 'Current role: ' },
unknown: { zh: '未知', en: 'Unknown' },
notConfigured: { zh: '未配置', en: 'Not configured' },
roleChanged: { zh: '角色已修改,保存本卡后生效',
en: 'Role changed — save this NIC to apply it' },
nicSaved: { zh: '网卡信息已保存:{0} 角色={1}',
en: 'NIC saved: {0}, role = {1}' },
/* --- ethtool 详细计数 --- */
ethUnavailable: { zh: '详细计数不可用', en: 'Detailed counters unavailable' },
ethNoData: { zh: 'ethtool 未返回数据', en: 'ethtool returned no data' },
ethNoCounters: { zh: '该驱动未提供详细计数', en: 'This driver reports no detailed counters' },
ethNoCountersWhy: { zh: '部分虚拟网卡与驱动不实现这些计数器',
en: 'Some virtual NICs and drivers do not implement these counters' },
linkUp: { zh: '链路已连接', en: 'Link up' },
linkDown: { zh: '链路断开', en: 'Link down' },
/* --- 驱动来源说明 --- */
drvTitle: { zh: '驱动来源说明', en: 'Driver Sources' },
drvDesc: { zh: '帮助判断网卡驱动的可靠性。绿色为随 Debian 内核自带(最稳),蓝色为硬件厂商官方驱动,橙色为第三方编译(升级内核后可能失效)。',
en: 'Helps you judge how reliable a NIC driver is. Green ships with the Debian kernel (most dependable), blue is the hardware vendor\'s own driver, orange is a third-party build (may break after a kernel upgrade).' },
drvKernel: { zh: '内核内建', en: 'In-kernel' },
drvKernelDesc: { zh: '随 Debian 内核一起发布,无需额外安装,升级内核自动跟随。',
en: 'Ships with the Debian kernel — nothing to install, and it follows kernel upgrades automatically.' },
drvVendor: { zh: '厂商官方', en: 'Vendor' },
drvVendorDesc: { zh: '硬件厂商(如 Intel、Realtek、Broadcom)发布的官方版本,稳定性好但需手动更新。',
en: 'The official build from the hardware vendor (Intel, Realtek, Broadcom…): stable, but you must update it yourself.' },
drvDistro: { zh: '发行版官方源', en: 'Distribution repo' },
drvDistroDesc: { zh: '来自 Debian 官方仓库的固件包(如 firmware-iwlwifi),随 apt 升级。',
en: 'A firmware package from the official Debian archive (e.g. firmware-iwlwifi), upgraded along with apt.' },
drvDkms: { zh: '第三方(DKMS)', en: 'Third-party (DKMS)' },
drvDkmsDesc: { zh: '为较新硬件手动编译的驱动(如 r8125、r8168),内核升级时会自动重编译。',
en: 'Drivers compiled by hand for newer hardware (e.g. r8125, r8168); they rebuild automatically on a kernel upgrade.' },
drvManual: { zh: '第三方(手工编译)', en: 'Third-party (hand-built)' },
drvManualDesc: { zh: '手工 make install 的驱动,内核升级后需要重新编译,否则网卡会失联。',
en: 'Drivers installed by hand with make install: they must be recompiled after a kernel upgrade or the NIC goes dead.' },
/* --- 网桥 --- */
brTitle: { zh: '网桥(桥接剩余网口)', en: 'Bridge (link the remaining ports)' },
brDesc: { zh: '将多个网口桥接为一个二层交换域。把多个网口的角色设为「桥接成员」后,可在此统一启用网桥。',
en: 'Combines several ports into a single layer-2 switched domain. Set the role of each port to "Bridge member", then enable the bridge here.' },
brEnable: { zh: '启用网桥', en: 'Enable the bridge' },
brName: { zh: '网桥名称', en: 'Bridge name' },
brStp: { zh: '生成树协议 STP', en: 'Spanning Tree (STP)' },
stpOff: { zh: '关闭(推荐)', en: 'Off (recommended)' },
stpOn: { zh: '开启', en: 'On' },
brWarn: { zh: '注意:勾选成员口后应用会重配该网卡,可能导致链路瞬时中断。',
en: 'Note: applying after ticking member ports reconfigures those NICs and may interrupt the link briefly.' },
/* --- 新增网卡监测 --- */
monTitle: { zh: '新增网卡监测', en: 'New NIC Watch' },
monDesc: { zh: '页面每次加载都会比对当前网卡 MAC 集合与已知清单,出现未知 MAC 时会在顶部提示。',
en: 'On every page load the current set of NIC MAC addresses is compared with the known list; an unknown MAC raises a notice at the top.' },
monCur: { zh: '当前网卡数', en: 'NICs present' },
monKnown: { zh: '已知(已分类)', en: 'Known (classified)' },
monTodo: { zh: '待分类', en: 'Unclassified' },
monTodoN: { zh: '{0} 个', en: '{0}' },
monNone: { zh: '无', en: 'None' },
},
/* ---- WAN 口页(viewWan)---- */
wan: {
hasWan: { zh: '已检测到 WAN 口:{0}', en: 'WAN port detected: {0}' },
hasWanDesc: { zh: '可在下方填写宽带账号与密码。点击「仅保存」只写入配置,不会拨号。需要正式拨号时,先解除构建保护模式,再点「开始拨号」。',
en: 'Enter your broadband credentials below. "Save only" just writes the configuration without dialling. To dial for real, leave build-protection mode first, then click "Start dialling".' },
noWan: { zh: '尚未分配 WAN 口', en: 'No WAN port assigned yet' },
noWanDesc: { zh: '请在虚拟机平台中为该主机添加第二张网卡,然后在「网卡与桥接」页面将其角色设为 WAN。在此之前,下面填写的 PPPoE 凭据只会被保存,不会执行拨号。',
en: 'Add a second NIC to this host on the virtualisation platform, then set its role to WAN under NICs & Bridge. Until then the PPPoE credentials below are only saved, never dialled.' },
modeTitle: { zh: '连接方式', en: 'Connection Mode' },
modeDesc: { zh: '支持 PPPoE 拨号、DHCP 自动获取、静态地址三种模式,可一键切换(切换会影响全网)。',
en: 'Three modes are supported — PPPoE, DHCP and static addressing — and you can switch at any time (this affects the whole network).' },
curMode: { zh: '当前模式', en: 'Current mode' },
/* 三种模式名。⚠️ key 是持久化到 pppoe.mode 的值,不是文案。 */
modePppoe: { zh: 'PPPoE 拨号', en: 'PPPoE' },
modeDhcp: { zh: 'DHCP 自动', en: 'DHCP' },
modeStatic: { zh: '静态地址', en: 'Static address' },
pppoeTitle: { zh: 'PPPoE 宽带拨号', en: 'PPPoE Broadband Dial-up' },
pppoeDesc: { zh: '适用于中国大陆运营商:中国电信 / 中国联通 / 中国移动 / 中国广电。实际认证方式与是否需要服务名取决于当地运营商,请以实测为准。',
en: 'For Chinese mainland ISPs: China Telecom / China Unicom / China Mobile / China Broadnet. The actual authentication method, and whether a service name is required, depend on your local ISP — trust what you measure.' },
ispLabel: { zh: '运营商模板', en: 'ISP template' },
ispAuto: { zh: '自动 / 通用', en: 'Auto / generic' },
ispCt: { zh: '中国电信', en: 'China Telecom' },
ispCu: { zh: '中国联通', en: 'China Unicom' },
ispCm: { zh: '中国移动', en: 'China Mobile' },
ispCbn: { zh: '中国广电', en: 'China Broadnet' },
dialIface: { zh: '拨号网卡(WAN)', en: 'WAN NIC to dial on' },
userLabel: { zh: '宽带账号', en: 'Broadband account' },
userPh: { zh: '例如 0512xxxxxxxx', en: 'e.g. 0512xxxxxxxx' },
passLabel: { zh: '宽带密码', en: 'Broadband password' },
passPh: { zh: '运营商提供的密码', en: 'The password your ISP gave you' },
svcLabel: { zh: '服务名(可留空)', en: 'Service name (optional)' },
svcPh: { zh: '多数地区留空', en: 'Leave blank in most regions' },
persist: { zh: '断线自动重连(persist)', en: 'Reconnect automatically after a drop (persist)' },
holdoff: { zh: '重拨间隔(秒)', en: 'Redial interval (seconds)' },
maxfail: { zh: '最大失败次数(0=无限)', en: 'Max failures (0 = unlimited)' },
credTip: { zh: '凭据保存在本机 SQLite 数据库中,应用时写入 /etc/ppp/chap-secrets(权限 600)。',
en: 'Credentials are stored in the local SQLite database and written to /etc/ppp/chap-secrets (mode 600) when applied.' },
staticTitle:{ zh: 'WAN 静态地址(静态模式时生效)', en: 'WAN Static Address (used in static mode)' },
addrLabel: { zh: 'IP 地址 / 掩码', en: 'IP address / mask' },
gwLabel: { zh: '网关', en: 'Gateway' },
logTitle: { zh: 'WAN 接入方式实时状态与日志', en: 'WAN Access Status & Log' },
logDesc: { zh: '支持中国大陆家庭宽带全部主流接入方式,日志每 3 秒自动滚动刷新,并针对每种方式给出排错提示。',
en: 'Covers all mainstream Chinese mainland home-broadband access methods. The log auto-scrolls and refreshes every 3 seconds, and gives troubleshooting hints for each method.' },
logSrcLabel:{ zh: '日志来源:', en: 'Log source: ' },
accessLabel:{ zh: '接入方式', en: 'Access type' },
accPppoe: { zh: 'PPPoE 拨号', en: 'PPPoE' },
accDhcp: { zh: 'DHCP 自动(IPoE)', en: 'DHCP (IPoE)' },
accStatic: { zh: '静态地址(专线 / 固定 IP)', en: 'Static address (leased line / fixed IP)' },
accPppoeDhcp6: { zh: 'PPPoE + DHCPv6-PD(双栈)', en: 'PPPoE + DHCPv6-PD (dual stack)' },
accIpoeDhcp6: { zh: 'IPoE + DHCPv6-PD(双栈)', en: 'IPoE + DHCPv6-PD (dual stack)' },
accBridge: { zh: '桥接旁路(不改 WAN)', en: 'Bridged bypass (WAN untouched)' },
sinceLabel: { zh: '时间范围', en: 'Time range' },
since30m: { zh: '最近 30 分钟', en: 'Last 30 minutes' },
since2h: { zh: '最近 2 小时', en: 'Last 2 hours' },
since12h: { zh: '最近 12 小时', en: 'Last 12 hours' },
since2d: { zh: '最近 2 天', en: 'Last 2 days' },
refreshNow: { zh: '立即刷新', en: 'Refresh now' },
logAuto: { zh: '自动刷新日志(每 3 秒)', en: 'Auto-refresh the log (every 3s)' },
logPause: { zh: '暂停自动刷新', en: 'Pause auto-refresh' },
logReading: { zh: '正在读取接入日志…', en: 'Reading the access log…' },
liveTitle: { zh: '当前 WAN 状态', en: 'Current WAN Status' },
liveDesc: { zh: '实时读取,无需手动刷新', en: 'Read live — no manual refresh needed' },
testConn: { zh: '测试连通性(ping 223.5.5.5)', en: 'Test connectivity (ping 223.5.5.5)' },
queryDial: { zh: '查询拨号状态', en: 'Query dial-up status' },
switchTitle:{ zh: '执行切换(请在我方确认后进行)', en: 'Perform the Switch (only after you have confirmed)' },
switchDesc: { zh: '以下按钮会真正改变网络状态,导致当前连接短暂中断。请在填写并保存凭据、且确认 WAN 口就绪后再执行。',
en: 'These buttons really change the network state and will briefly break the current connection. Run them only after saving your credentials and confirming the WAN port is ready.' },
doConnect: { zh: '开始拨号(PPPoE connect)', en: 'Start dialling (PPPoE connect)' },
doDisconnect: { zh: '断开拨号(PPPoE disconnect)', en: 'Stop dialling (PPPoE disconnect)' },
accessPicked: { zh: 'WAN 接入方式已选为「{0}」,请点击保存并应用',
en: 'WAN access type set to "{0}" — click Save & Apply' },
logRefreshed: { zh: '已刷新接入日志', en: 'Access log refreshed' },
logPaused: { zh: '已暂停自动刷新', en: 'Auto-refresh paused' },
modeChanged: { zh: '连接方式已改为「{0}」,请点击页面底部的「保存并应用」',
en: 'Connection mode changed to "{0}" — click Save & Apply at the top right' },
ifaceChanged: { zh: '拨号网卡已选为 {0},请点击保存并应用',
en: 'WAN NIC set to {0} — click Save & Apply' },
testing: { zh: '正在测试…', en: 'Testing…' },
confirmDial: { zh: '确认拨号', en: 'CONFIRM DIAL' },
confirmDisc: { zh: '确认断开', en: 'CONFIRM HANGUP' },
confirmTitle: { zh: '开始 PPPoE 拨号', en: 'Start PPPoE dialling' },
discTitle: { zh: '断开 PPPoE 拨号', en: 'Stop PPPoE dialling' },
confirmWarn: { zh: '此操作会立即改变 WAN 连接状态,可能导致当前网络中断。',
en: 'This immediately changes the WAN connection state and may interrupt your network.' },
confirmHint: { zh: '请输入 {0} 以确认:', en: 'Type {0} to confirm:' },
confirmBad: { zh: '确认文字不正确', en: 'The confirmation text does not match' },
redialRetry: { zh: '重拨中…({0} 秒后重试)', en: 'Redialing… (retry in {0} s)' },
},
/* ---- 内网文件共享 SMB / NFS(nav.nfs 页,renderShare)----
⚠️ 同 nd 组的告诫:词条里**不能带 HTML 标签**(t() 的结果直接进
innerHTML)。原文里混着 <b> / <span class="mono"> 的长句被拆成
若干条,标签留在 app.js 的模板里。 */
share: {
title: { zh: '内网文件共享', en: 'LAN File Sharing' },
on: { zh: '已启用', en: 'Enabled' },
off: { zh: '未启用', en: 'Disabled' },
pkgSamba: { zh: 'Samba 软件包', en: 'Samba package' },
pkgNfs: { zh: 'NFS 软件包', en: 'NFS package' },
installed: { zh: '已安装', en: 'Installed' },
missing: { zh: '未安装', en: 'Not installed' },
smbSvc: { zh: 'SMB 服务', en: 'SMB service' },
nfsSvc: { zh: 'NFS 服务', en: 'NFS service' },
lanAddr: { zh: '本机 LAN 地址', en: 'This router\'s LAN address' },
mainInclude: { zh: '主配置 include', en: 'Main config include' },
written: { zh: '已写入', en: 'Written' },
notWritten:{ zh: '未写入', en: 'Not written' },
installHint: { zh: '尚未安装的软件包可用下面的命令安装(Debian 13 官方源):',
en: 'Install the missing packages with the commands below (Debian 13 official repositories):' },
/* 外置存储 */
stgTitle: { zh: '外置存储设备(U 盘 · 移动硬盘 · Type-C · 雷电)',
en: 'External Storage (USB stick · portable drive · Type-C · Thunderbolt)' },
refresh: { zh: '刷新', en: 'Refresh' },
stgDesc1: { zh: '插上的外置盘会列在下面。可直接挂载、格式化、设为开机自动挂载,并把挂载点一键加入上面的 SMB / NFS 共享。',
en: 'Plugged-in drives are listed below. You can mount, format, or set them to mount at boot, and add the mount point to the SMB / NFS shares above with one click.' },
stgDesc2: { zh: '「连接方式」显示的是总线类型',
en: '"Connection type" shows the bus type' },
stgDesc3: { zh: ':Type-C 只是插头形状,电气上仍归 USB 或雷电,所以按真实总线展示更准确。',
en: ': Type-C is only the shape of the connector — electrically it is still USB or Thunderbolt, so showing the real bus is more accurate.' },
readingStg:{ zh: '正在读取块设备…', en: 'Reading block devices…' },
/* SMB */
smbTitle: { zh: 'SMB / CIFS(推荐:Windows · macOS · Linux 通吃)',
en: 'SMB / CIFS (recommended: works on Windows, macOS and Linux)' },
smbDesc1: { zh: '面向全平台,兼容性最好。',
en: 'It targets every platform and has the best compatibility.' },
smbDesc2: { zh: 'Windows 双击就能用',
en: 'Windows users can just double-click' },
smbDesc3: { zh: ',macOS 与 Linux 也原生支持。配置会写入 ',
en: ', and macOS and Linux support it natively. The configuration is written to ' },
smbDesc4: { zh: ',并在主配置中 include 引入。',
en: ' and pulled in by an include in the main config.' },
enableSmb: { zh: '启用 SMB 文件共享', en: 'Enable SMB file sharing' },
workgroup: { zh: '工作组', en: 'Workgroup' },
serverDesc:{ zh: '服务器描述', en: 'Server description' },
phServerDesc: { zh: 'drouter 文件共享', en: 'drouter file share' },
listenIface: { zh: '监听网卡', en: 'NICs to listen on' },
phListenIface:{ zh: '留空=全部(如 br0 ens18)',
en: 'blank = all (e.g. br0 ens18)' },
noNetbios: { zh: '关闭 NetBIOS(推荐)',
en: 'Turn off NetBIOS (recommended)' },
winsServer:{ zh: '本机充当 WINS 服务器',
en: 'Use this router as a WINS server' },
netbiosHint: { zh: '关闭 NetBIOS 可减少局域网广播;若局域网里有老旧设备(XP / 老打印机)找不到共享,可尝试取消勾选。',
en: 'Turning off NetBIOS reduces LAN broadcast traffic. If older devices on the LAN (XP / old printers) cannot find the shares, try unticking it.' },
sharesTitle: { zh: '共享目录', en: 'Shared Folders' },
addShare: { zh: '+ 新增共享', en: '+ Add share' },
useTpl: { zh: '套用目录模板', en: 'Apply a folder template' },
/* NFS */
nfsTitle: { zh: 'NFS(推荐:Linux / macOS 之间,性能更高)',
en: 'NFS (recommended between Linux / macOS — higher performance)' },
nfsDesc1: { zh: 'NFS 是 Linux 原生协议,局域网内传输性能通常优于 SMB。导出规则写入 ',
en: 'NFS is the native Linux protocol and usually transfers faster than SMB over the LAN. Export rules are written to ' },
nfsDesc2: { zh: ',服务参数写入 ',
en: ', and service settings to ' },
nfsDesc3: { zh: ',端口已固定,便于防火墙精确放通。',
en: '. The ports are fixed so the firewall can allow them precisely.' },
enableNfs: { zh: '启用 NFS 文件共享', en: 'Enable NFS file sharing' },
threads: { zh: '服务线程数', en: 'Service threads' },
threadsHint: { zh: '线程数决定并发处理能力,家用 4–16 足够;调大反而会占用内存。',
en: 'The thread count decides how much work can be handled concurrently; 4–16 is plenty for a home network, and raising it just wastes memory.' },
exportsTitle: { zh: '导出目录', en: 'Exports' },
addExport: { zh: '+ 新增导出', en: '+ Add export' },
/* 连接提示 */
hintTitle: { zh: '什么都不用改:三平台连接方式',
en: 'Nothing to change: how to connect from each platform' },
hintDesc1: { zh: '下面的命令可以直接复制使用,把 ',
en: 'Copy the commands below and replace ' },
hintDesc2: { zh: ' 换成你的路由器地址即可。',
en: ' with your own router address.' },
/* 预览 */
previewTitle: { zh: '配置预览(将会写入磁盘)',
en: 'Configuration Preview (this is what gets written to disk)' },
previewDesc: { zh: '核对生成的 SMB / NFS 配置是否符合预期。',
en: 'Check that the generated SMB / NFS configuration is what you expect.' },
genPreview: { zh: '生成预览', en: 'Generate preview' },
rendering: { zh: '正在渲染…', en: 'Rendering…' },
renderFail: { zh: '渲染失败', en: 'Rendering failed' },
filesInvolved:{ zh: '涉及文件', en: 'Files involved' },
/* 目录缺失提示 */
missDirsPre: { zh: '⚠ 以下共享目录还不存在:',
en: '⚠ These shared folders do not exist yet: ' },
missDirsPost: { zh: '。可在下方共享项里点「创建」按钮一键建立。',
en: '. Use the "Create" button on the share below to make them in one click.' },
addedShare: { zh: '已新增一个共享,请填写后保存',
en: 'Share added — fill it in and save' },
addedExport: { zh: '已新增一个 NFS 导出,请填写后保存',
en: 'NFS export added — fill it in and save' },
appliedTpl: { zh: '已套用模板,请补充地址后保存',
en: 'Template applied — complete the path and save' },
},
/* ---- 打印服务(nav.print 页,printRender)----
⚠️ 同 share 组:词条不带 HTML 标签,标签留在 app.js 模板里。
⚠️ mode 的值('cups' / 'raw' / 'off')是**写进配置的持久化值**,
不是文案 —— 切语言时绝不能跟着变(见 wan.modePppoe 的同款告诫)。 */
print: {
notInstalled: { zh: '未安装', en: 'Not installed' },
rawTitle: { zh: 'RAW 直通', en: 'RAW passthrough' },
cupsVersion:{ zh: 'CUPS 版本', en: 'CUPS version' },
listenReal: { zh: '631 实际监听', en: 'What port 631 actually listens on' },
notListening:{ zh: '未监听', en: 'Not listening' },
avahiLabel: { zh: 'avahi 发现服务', en: 'avahi discovery service' },
running: { zh: '运行中', en: 'Running' },
notRunning: { zh: '未运行', en: 'Not running' },
adminPage: { zh: '管理页面', en: 'Admin page' },
/* 顶部三条提示(原文夹着 <b>,拆开) */
notInstPre: { zh: 'CUPS 尚未安装。请先到「系统 → 依赖自检与安装」安装,或执行',
en: 'CUPS is not installed yet. Install it under "System → Dependency Check & Install", or run' },
notInstPost:{ zh: '。', en: '.' },
buildModePre: { zh: '当前处于',
en: 'You are currently in ' },
buildModeB: { zh: '构建保护模式',
en: 'build-protection mode' },
buildModePost: { zh: ':保存只会写配置,不会启停打印服务。',
en: ': saving only writes the configuration, it does not start or stop the print service.' },
localhostPre: { zh: 'CUPS 现在',
en: 'CUPS currently ' },
localhostB: { zh: '只监听 127.0.0.1:631',
en: 'listens only on 127.0.0.1:631' },
localhostPost: { zh: ' —— 局域网里的设备连不上。在下面把「允许局域网访问」打开并保存即可。',
en: ' — devices on the LAN cannot reach it. Turn on "Allow LAN access" below and save.' },
/* 三种模式 */
modeCups: { zh: 'CUPS 打印服务器', en: 'CUPS print server' },
modeCupsD: { zh: '功能最全:免驱打印、AirPrint / Mopria、队列管理、Web 管理界面',
en: 'Most capable: driverless printing, AirPrint / Mopria, queue management, web admin UI' },
modeRaw: { zh: 'USB RAW 直通', en: 'USB RAW passthrough' },
modeRawD: { zh: '最省资源:把 USB 打印机原样映射成 TCP 9100,驱动全在客户端',
en: 'Lightest on resources: maps the USB printer straight to TCP 9100, drivers stay on the clients' },
modeOff: { zh: '关闭打印服务', en: 'Turn off the print service' },
modeOffD: { zh: '停掉所有打印相关服务,631 / 9100 都不再监听',
en: 'Stops every print-related service; 631 / 9100 are no longer listened on' },
isCurrent: { zh: '当前模式', en: 'Current mode' },
switchTo: { zh: '切换到这个模式', en: 'Switch to this mode' },
noUsbPre: { zh: '当前',
en: 'Currently ' },
noUsbB: { zh: '没有检测到 USB 打印机',
en: 'no USB printer has been detected' },
noUsbPost: { zh: ',RAW 直通模式没有设备可用。这是一台虚拟机 —— 需要先把 USB 打印机在 PVE 里直通给这台虚拟机,插上之后设备节点才会出现。',
en: ', so RAW passthrough mode has no device to use. This is a virtual machine — you need to pass the USB printer through to it in PVE first; the device node only appears once it is plugged in.' },
diffTitle: { zh: '两种模式到底差在哪', en: 'How the two modes actually differ' },
diffCupsPre: { zh: 'CUPS 模式',
en: 'CUPS mode' },
diffCupsB: { zh: ':手机和电脑',
en: ': phones and computers ' },
diffCupsB2: { zh: '不用装驱动',
en: 'need no printer driver' },
diffCupsPost:{ zh: ',靠 IPP Everywhere / AirPrint / Mopria 直接发现并打印;还能把网络上已有的打印机收进来再共享出去',
en: ' — they discover and print via IPP Everywhere / AirPrint / Mopria. You can also pull existing network printers in and re-share them.' },
diffRawPre: { zh: 'RAW 直通模式',
en: 'RAW passthrough mode' },
diffRawB: { zh: ':路由器',
en: ': the router ' },
diffRawB2: { zh: '完全不碰打印数据',
en: 'never touches the print data' },
diffRawPost: { zh: ',客户端装自己的原厂驱动。老式打印机、驱动装不上的机型用它最省心,也最省路由器资源',
en: ', and clients use their own vendor drivers. It is the least hassle for old printers and models whose drivers will not install, and the cheapest on router resources.' },
diffBothPre:{ zh: '两者',
en: 'The two ' },
diffBothB: { zh: '不能同时开',
en: 'cannot be enabled at the same time' },
diffBothPost:{ zh: ':CUPS 侧靠 ipp-usb(libusb)拿设备,RAW 侧靠内核 usblp 模块的 ',
en: ': CUPS reaches the device through ipp-usb (libusb) while RAW uses the kernel usblp module\'s ' },
diffBothPost2:{ zh: ',抢同一个设备的结果是谁都打不出来',
en: ' — both fighting over one device means nothing prints at all.' },
diffSwitch:{ zh: '切换模式时本页会自动把另一边停干净,不用你手工去 systemctl',
en: 'When you switch modes this page shuts the other side down cleanly for you — no manual systemctl needed.' },
impactTitle:{ zh: '打开/关闭会带来什么', en: 'What turning this on or off changes' },
/* CUPS 设置项 */
optLan: { zh: '允许局域网访问(推荐)', en: 'Allow LAN access (recommended)' },
optLocal: { zh: '只听本机 127.0.0.1', en: 'Local only (127.0.0.1)' },
openToLan: { zh: '开放到直连网段', en: 'Open to the directly connected network' },
lanOnly: { zh: '仅本机', en: 'Local only' },
shareHint: { zh: '共享后其他设备才能发现这台打印机',
en: 'Other devices can only discover this printer once it is shared' },
opened: { zh: '已开放', en: 'Open' },
offByDefault:{ zh: '默认关闭', en: 'Off by default' },
rawDev: { zh: 'RAW 直通设备', en: 'RAW passthrough device' },
listenPort:{ zh: '监听端口', en: 'Listen port' },
bindAddr: { zh: '绑定地址', en: 'Bind address' },
socatsPre: { zh: '上面三项只在 ',
en: 'The three settings above only apply in ' },
socatsB: { zh: 'RAW 直通模式',
en: 'RAW passthrough mode' },
socatsPost:{ zh: '下生效。用系统自带的 ',
en: '. It is implemented with the built-in ' },
socatsPost2:{ zh: ' 实现,不需要额外装包。',
en: ', so no extra package is needed.' },
noSocat: { zh: '系统里没有 ',
en: 'This system does not have ' },
noSocatB: { zh: ',RAW 直通模式无法工作。请到「依赖自检与安装」安装。',
en: ', so RAW passthrough mode cannot work. Install it under "Dependency Check & Install".' },
/* 队列表 */
thQueue: { zh: '队列', en: 'Queue' },
thDev: { zh: '设备地址', en: 'Device address' },
thState: { zh: '状态', en: 'State' },
thActs: { zh: '操作', en: 'Actions' },
isDefault: { zh: '默认', en: 'Default' },
notSaved: { zh: '未落盘', en: 'Not persisted' },
notSavedTitle: { zh: 'CUPS 还没把它写进 printers.conf,重启 CUPS 或重启机器后才会固定下来',
en: 'CUPS has not written it to printers.conf yet; it becomes permanent after restarting CUPS or the machine' },
shared: { zh: '已共享', en: 'Shared' },
notShared: { zh: '未共享', en: 'Not shared' },
accepting: { zh: '接受任务', en: 'Accepting jobs' },
paused: { zh: '已暂停', en: 'Paused' },
unshare: { zh: '取消共享', en: 'Stop sharing' },
doShare: { zh: '共享', en: 'Share' },
setDefault:{ zh: '设为默认', en: 'Set as default' },
testPage: { zh: '测试页', en: 'Test page' },
doPause: { zh: '暂停', en: 'Pause' },
doResume: { zh: '恢复', en: 'Resume' },
doDelete: { zh: '删除', en: 'Delete' },
viewJobs: { zh: '查看打印任务', en: 'View print jobs' },
noQueuePre: { zh: '还没有任何打印队列。可以在下面添加一个,',
en: 'There are no print queues yet. Add one below, ' },
noQueuePost: { zh: '或者打开 cups-browsed 让它自动发现网络上的打印机。',
en: 'or turn on cups-browsed to let it discover printers on the network automatically.' },
/* 添加队列 */
newName: { zh: '队列名(英文数字)', en: 'Queue name (letters and digits)' },
newUri: { zh: '设备地址', en: 'Device address' },
newDriver: { zh: '驱动', en: 'Driver' },
newInfo: { zh: '描述', en: 'Description' },
phInfo: { zh: '客厅打印机', en: 'Living-room printer' },
newLoc: { zh: '位置', en: 'Location' },
phLoc: { zh: '书房', en: 'Study' },
addQueue: { zh: '添加队列', en: 'Add queue' },
/* USB 与设备 */
usbFound: { zh: '检测到 {0} 台 USB 打印机:',
en: '{0} USB printer(s) detected:' },
noUsbTitle:{ zh: '没有检测到 USB 打印机。这是一台 ',
en: 'No USB printer has been detected. This is a ' },
noUsbPve: { zh: 'PVE 虚拟机',
en: 'PVE virtual machine' },
noUsbBody: { zh: ' —— 需要先把 USB 打印机在 PVE 的硬件设置里直通(USB Host Device)给这台虚拟机,插好之后这里才会出现设备节点。',
en: ' — you need to pass the USB printer through to it in PVE\'s hardware settings (USB Host Device) first; the device node shows up here once it is plugged in.' },
noUsblp: { zh: '(内核的 usblp 模块当前未加载,插上设备后会自动加载)',
en: '(the kernel usblp module is not loaded right now; it will load automatically once you plug a device in)' },
netDevPre: { zh: '网络上发现的设备(',
en: 'Devices discovered on the network (' },
netDevPost:{ zh: '):', en: '):' },
thType: { zh: '类型', en: 'Type' },
none: { zh: '(无)', en: '(none)' },
},
/* ---- 连接与流日志(nav.flowlog 页,renderFlowLog)----
⚠️ 日志级别(err / warn / info / debug)与动作(ORIG / DROP…)是
**数据不是文案** —— 它们要原样传给 API、也要与归档文件里的值对齐,
绝不能随语言变。这里只翻译「级别旁边显示的名字」。
⚠️ s.n / l.n(来源名、级别名)由后端 /api/ulog 下发,属于服务端数据,
前端不翻译(与 print 组的 it.name 同款处理)。 */
flowlog: {
title: { zh: '连接与流日志', en: 'Connection & Flow Logs' },
ulLabel: { zh: '统一日志', en: 'Unified log' },
on: { zh: '已开启', en: 'On' },
off: { zh: '已关闭', en: 'Off' },
descPre: { zh: '把防火墙、连接跟踪、WAN 接入、DDNS、应用与系统日志',
en: 'Firewall, connection tracking, WAN access, DDNS, application and system logs are ' },
descB: { zh: '规范化为同一种记录结构',
en: 'normalised into one common record structure' },
descPost: { zh: ',可用同一套条件检索、统计与导出。归档文件:',
en: ', so you can search, aggregate and export them with the same set of conditions. Archive file: ' },
descTail: { zh: '({0} 条 · {1})。',
en: ' ({0} rows · {1}).' },
viewFlow: { zh: '当前连接', en: 'Current connections' },
refresh: { zh: '刷新', en: 'Refresh' },
liveTitle: { zh: '打开后会订阅 conntrack 实时事件流,查询会多等几秒以捕捉这段时间内新建的连接。默认关闭以保证查询速度。',
en: 'When on, subscribes to the conntrack event stream and waits a few extra seconds so that connections opened during the wait are captured. Off by default to keep queries fast.' },
liveLabel: { zh: '抓实时连接事件({0} 秒)',
en: 'Capture live connection events ({0}s)' },
fwLogOffPre:{ zh: '防火墙日志开关当前为关闭:规则里没有 log 语句,因此「防火墙」源不会有新记录。可到「防火墙 IPv4 / IPv6」页打开「记录被拒绝的包」。',
en: 'Firewall logging is currently off: the rules contain no log statement, so the "Firewall" source will not produce new records. Turn on "Log dropped packets" under Firewall IPv4 / IPv6.' },
filterTitle:{ zh: '筛选与检索', en: 'Filter & Search' },
sinceLabel: { zh: '时间范围', en: 'Time range' },
srcLabel: { zh: '日志源', en: 'Log source' },
allSrc: { zh: '全部来源', en: 'All sources' },
minLevel: { zh: '最低级别', en: 'Minimum level' },
noLimit: { zh: '不限', en: 'Any' },
protoLabel: { zh: '协议', en: 'Protocol' },
allProto: { zh: '全部', en: 'All' },
actionLabel:{ zh: '动作', en: 'Action' },
phAction: { zh: 'DROP / ACCEPT / NEW…', en: 'DROP / ACCEPT / NEW…' },
qLabel: { zh: '关键字', en: 'Keyword' },
phQ: { zh: 'IP、端口、中文描述…', en: 'IP, port, description…' },
limitLabel: { zh: '条数', en: 'Rows' },
go: { zh: '查询', en: 'Search' },
reset: { zh: '重置', en: 'Reset' },
filterHint: { zh: '「最低级别」按严重程度过滤:选「警告」会同时显示错误与警告。关键字对中文描述与原始行同时匹配。',
en: '"Minimum level" filters by severity: picking "Warning" also shows errors. Keywords match both the description and the raw log line.' },
/* 时间范围预设。⚠️ v('30 min ago' 等)是**传给 API 的查询值**,
不是文案 —— 只翻 n,见 renderFlowLog 里的 SINCE_I18N 映射。 */
since5m: { zh: '最近 5 分钟', en: 'Last 5 minutes' },
since30m: { zh: '最近 30 分钟', en: 'Last 30 minutes' },
since2h: { zh: '最近 2 小时', en: 'Last 2 hours' },
since12h: { zh: '最近 12 小时', en: 'Last 12 hours' },
since1d: { zh: '最近 1 天', en: 'Last 1 day' },
since7d: { zh: '最近 7 天', en: 'Last 7 days' },
/* 级别显示名(只用于「按级别」统计芯片的图例;级别 id 本身是数据) */
lvlErr: { zh: '错误', en: 'Error' },
lvlWarn: { zh: '警告', en: 'Warning' },
lvlNotice: { zh: '提示', en: 'Notice' },
lvlInfo: { zh: '信息', en: 'Info' },
lvlDebug: { zh: '调试', en: 'Debug' },
/* 级别下拉里「中文名(id)」的拼法:id 原样保留,只换外层括号 */
levelFmt: { zh: '{0}({1})', en: '{0} ({1})' },
statTitle: { zh: '分布统计', en: 'Distribution' },
bySrc: { zh: '按来源', en: 'By source' },
byLevel: { zh: '按级别', en: 'By level' },
byAction: { zh: '按动作', en: 'By action' },
byProto: { zh: '按协议', en: 'By protocol' },
topSrc: { zh: '来源地址 TOP', en: 'Top source addresses' },
topDstPort: { zh: '目的端口 TOP', en: 'Top destination ports' },
keepTitle: { zh: '保留策略与导出', en: 'Retention & Export' },
keepDesc: { zh: '归档会按下面的策略自动清理(由后台定时任务执行)。开启归档后,即使系统 journal 轮转,历史连接与流量日志仍可追溯。',
en: 'Archives are pruned automatically by the policy below (run by a background timer). With archiving on, historical connection and traffic logs stay traceable even after the system journal rotates.' },
enableUl: { zh: '启用统一日志', en: 'Enable the unified log' },
archive: { zh: '归档到磁盘', en: 'Archive to disk' },
keepDays: { zh: '保留天数', en: 'Keep days' },
keepRows: { zh: '最大条数', en: 'Max rows' },
archiveMin: { zh: '归档最低级别', en: 'Minimum archived level' },
srcSwitches:{ zh: '采集源开关', en: 'Collection sources' },
save: { zh: '保存设置', en: 'Save settings' },
pruneNow: { zh: '立即清理', en: 'Prune now' },
exportJson: { zh: '导出 JSON', en: 'Export JSON' },
exportCsv: { zh: '导出 CSV', en: 'Export CSV' },
clearArch: { zh: '清空归档', en: 'Clear archive' },
/* 右上角的统计摘要(纯 textContent,不进 innerHTML) */
metaFlow: { zh: '连接表 {0} 条', en: '{0} connections' },
metaKern: { zh: '内核表 {0}/{1}', en: 'kernel table {0}/{1}' },
metaStat: { zh: '采集 {0} 条 · 命中 {1} 条 · 显示 {2} 条',
en: '{0} collected · {1} matched · {2} shown' },
},
/* ---- 系统设置页(nav.wan 之外的 sys 页,viewSys)----
⚠️ 同 nd / share 组的告诫:词条里**不能带 HTML 标签**(t() 的结果
直接进 innerHTML)。原文里混着 <b> 的长句被拆成若干条,
标签留在 app.js 的模板里。 */
sys: {
/* 构建保护模式 */
build: {
title: { zh: '构建保护模式:', en: 'Build protection mode: ' },
on: { zh: '已开启', en: 'On' },
off: { zh: '已关闭', en: 'Off' },
descOn1: { zh: '开启时,所有「应用」操作只会把配置写入磁盘,',
en: 'While it is on, every "Apply" operation only writes the configuration to disk, ' },
descOnB: { zh: '不会启动服务、不会改变网络',
en: 'it never starts services and never changes the network' },
descOn2: { zh: '。这是构建阶段的安全保险,可放心填完所有配置而不影响正在运行的局域网与 RealVNC 会话。',
en: '. This is a safety net while you are setting things up: you can fill in every setting without disturbing the running LAN or your RealVNC session.' },
descOff1: { zh: '已关闭。此后「保存并应用」会',
en: 'It is off. From now on "Save & Apply" will ' },
descOffB: { zh: '真正生效',
en: 'really take effect' },
descOff2: { zh: ':DHCP 服务会启动并占用 53/67 端口,防火墙规则会立即加载。请确保这是你想要的。',
en: ': the DHCP service will start and take ports 53/67, and firewall rules will load immediately. Make sure this is what you want.' },
btnOff: { zh: '关闭保护,允许配置生效',
en: 'Turn off protection and apply settings' },
btnOn: { zh: '重新开启保护', en: 'Turn protection back on' },
},
/* 管理账号 */
acct: {
title: { zh: 'Web 管理账号', en: 'Web Console Account' },
desc: { zh: '此账号仅用于登录本管理台,与 Debian 系统用户完全独立。当前用户:',
en: 'This account is only used to sign in to this console and is completely separate from Debian system users. Current user: ' },
oldPw: { zh: '原密码', en: 'Current password' },
newPw: { zh: '新密码(至少 8 位)', en: 'New password (at least 8 characters)' },
newPw2: { zh: '确认新密码', en: 'Confirm new password' },
submit: { zh: '修改管理密码', en: 'Change Password' },
mismatch:{ zh: '两次输入的新密码不一致',
en: 'The two new passwords do not match' },
},
/* 管理端口 */
port: {
title: { zh: 'Web 管理端口', en: 'Web Console Port' },
desc1: { zh: '修改管理后台的 HTTPS 端口,避免与其他服务冲突。默认 ',
en: 'Change the HTTPS port of the admin console to avoid clashing with other services. Defaults to ' },
desc2: { zh: '修改后需要重启管理后台,然后用新地址重新访问(例如 ',
en: 'The console has to be restarted afterwards, then you reopen it at the new address (for example ' },
newPort: { zh: '新端口', en: 'newport' },
desc3: { zh: ')。', en: ').' },
label: { zh: 'HTTPS 端口', en: 'HTTPS port' },
save: { zh: '保存并重启后台', en: 'Save and Restart Console' },
reset: { zh: '恢复默认 8443', en: 'Restore Default 8443' },
http1: { zh: '明文 HTTP 端口固定为 ',
en: 'The plain HTTP port is fixed at ' },
http2: { zh: '(仅建议本机调试使用)。',
en: ' (recommended for local debugging only). ' },
cur: { zh: '当前生效端口:', en: 'Port currently in effect: ' },
bad: { zh: '端口必须是 1-65535 的数字',
en: 'The port must be a number between 1 and 65535' },
confirm: { zh: '确定把管理后台端口改为 {0} 吗?改完后需要用 https://<本机IP>:{0}/ 重新访问。',
en: 'Change the admin console port to {0}? You will need to reopen it at https://<this-host-IP>:{0}/ afterwards.' },
saving: { zh: '正在保存并重启后台…',
en: 'Saving and restarting the console…' },
changed: { zh: '端口已改为 {0},请用新地址访问',
en: 'Port changed to {0} — reopen the console at the new address' },
resetTip: { zh: '已填入默认端口,请点击「保存并重启后台」',
en: 'Default port filled in — click "Save and Restart Console"' },
},
/* 访问控制 */
acl: {
title: { zh: '访问控制', en: 'Access Control' },
portK: { zh: '管理端口', en: 'Console port' },
selfSigned: { zh: '(自签证书)', en: '(self-signed)' },
scope: { zh: '访问范围', en: 'Access scope' },
scopeLan: { zh: '仅限局域网(推荐,WAN 侧不开放)',
en: 'LAN only (recommended, not exposed on the WAN side)' },
scopeAll: { zh: '允许所有来源(含 WAN,风险较高)',
en: 'Allow any source (including WAN, higher risk)' },
scopeCustom: { zh: '自定义允许的网段', en: 'Custom allowed networks' },
nets: { zh: '允许访问的网段(逗号分隔,CIDR 格式)',
en: 'Networks allowed to connect (comma-separated, CIDR)' },
scopeHint: { zh: '访问范围仅影响管理后台的防火墙放行策略;改完请点击页面底部的「保存并应用」。',
en: 'Access scope only affects the firewall allow rules for the admin console. After changing it, click "Save & Apply" at the top right.' },
timeout: { zh: '会话超时', en: 'Session timeout' },
timeoutVal: { zh: '60 分钟', en: '60 minutes' },
lockout: { zh: '登录失败锁定', en: 'Failed-login lockout' },
lockoutVal: { zh: '连续 5 次失败后锁定 10 分钟',
en: 'Locked for 10 minutes after 5 consecutive failures' },
scopeChanged: { zh: '访问范围已改为「{0}」,请点击保存并应用',
en: 'Access scope changed to "{0}" — click Save & Apply' },
netsDirty: { zh: '允许网段已修改,请点击保存并应用',
en: 'Allowed networks changed — click Save & Apply' },
},
/* 配置快照与回滚 */
snap: {
title: { zh: '配置快照与回滚', en: 'Configuration Snapshots & Rollback' },
desc1: { zh: '快照会', en: 'A snapshot ' },
descB: { zh: '整体覆盖全部用户设置',
en: 'replaces all user settings as a whole' },
desc2: { zh: ':界面里的所有模块配置(DHCP/DNS、防火墙 IPv4·IPv6、WAN/LAN、IPv6 与 RA、UPnP、NTP、网卡角色、访问范围与 Web 端口等)连同底层配置文件一起打包。回滚时数据库与配置文件一并还原,不会出现「只恢复了一半」的情况。',
en: ': every module configured in the UI (DHCP/DNS, firewall IPv4·IPv6, WAN/LAN, IPv6 and RA, UPnP, NTP, NIC roles, access scope and Web port, etc.) is packaged together with the underlying configuration files. Rolling back restores the database and the files together, so you never end up with "only half of it restored".' },
tag: { zh: '快照备注', en: 'Snapshot note' },
tagPh: { zh: '例如:切换前备份', en: 'e.g. backup before switching' },
lock: { zh: '创建后上锁', en: 'Lock after creating' },
create: { zh: '立即创建快照', en: 'Create Snapshot Now' },
refresh: { zh: '刷新快照列表', en: 'Refresh Snapshot List' },
hint1: { zh: '快照创建后仍可随时改备注、随时上锁解锁 —— 列表见下方',
en: 'You can rename or lock/unlock a snapshot at any time after it is created — the list is below ' },
hint2: { zh: '。', en: '.' },
listGoto: { zh: '已切到系统设置页,快照列表在「紧急救援通道」里',
en: 'Switched to System Settings — the snapshot list is under "Emergency Rescue Channel"' },
scopeTitle:{ zh: '快照包含以下内容:',
en: 'A snapshot contains the following:' },
disk: { zh: '磁盘:剩余 {0} / 共 {1}',
en: 'Disk: {0} free of {1}' },
listCount:{ zh: '共 {0} 份快照', en: '{0} snapshots' },
listLockA:{ zh: ',其中 ', en: ', ' },
listLockB:{ zh: ' 份已上锁', en: ' of them locked' },
listAt: { zh: ',存放于 ', en: ', stored in ' },
dot: { zh: '。', en: '.' },
thTime: { zh: '时间', en: 'Time' },
thTag: { zh: '备注', en: 'Note' },
thProt: { zh: '保护', en: 'Protected' },
thSize: { zh: '大小', en: 'Size' },
thDb: { zh: '配置库', en: 'Config DB' },
thAct: { zh: '操作', en: 'Actions' },
unnamed: { zh: '(未命名)', en: '(unnamed)' },
dbYes: { zh: '已含', en: 'Included' },
dbOld: { zh: '旧版', en: 'Legacy' },
saveTag: { zh: '存备注', en: 'Save Note' },
dl: { zh: '下载', en: 'Download' },
rb: { zh: '回滚', en: 'Rollback' },
del: { zh: '删除', en: 'Delete' },
empty: { zh: '暂无快照。可在上方「配置快照与回滚」里立即创建一份,或等自动快照按计划生成。',
en: 'No snapshots yet. Create one right away under "Configuration Snapshots & Rollback" above, or wait for the automatic snapshots to run on schedule.' },
packing: { zh: '正在打包快照 {0}…', en: 'Packing snapshot {0}…' },
dlFail: { zh: '下载失败', en: 'Download failed' },
dlStart: { zh: '已开始下载快照 {0}',
en: 'Started downloading snapshot {0}' },
dlFailNet:{ zh: '下载失败:{0}', en: 'Download failed: {0}' },
/* 回滚确认弹窗 */
rbTitle: { zh: '确认回滚', en: 'Confirm Rollback' },
rbDesc1: { zh: '将把配置整体恢复到快照 ',
en: 'Configuration will be restored to the state of snapshot ' },
rbDesc2: { zh: ' 的状态。', en: '.' },
rbDesc3: { zh: '回滚会同时还原界面配置数据库与系统配置文件,并重启相关服务。回滚前系统会自动再拍一张 ',
en: 'The rollback restores both the UI configuration database and the system configuration files, and restarts the relevant services. Before rolling back, the system automatically takes another snapshot named ' },
rbDesc4: { zh: ' 快照,万一不满意还能退回来。',
en: ' so you can still come back if you are not satisfied.' },
rbWarn: { zh: '回滚过程中网络可能短暂中断。',
en: 'The network may be briefly interrupted during the rollback.' },
/* 已上锁快照的二次确认 */
lockTitle:{ zh: '这份快照已上锁', en: 'This snapshot is locked' },
lockDescA:{ zh: '快照 {0} 已上锁,', en: 'Snapshot {0} is locked, ' },
lockDescB:{ zh: '自动清理不会删除它',
en: 'automatic cleanup will never delete it' },
lockDescC:{ zh: '。', en: '.' },
lockDescD:{ zh: '上锁只挡自动清理,不挡你手动删。确定要删掉它吗?此操作不可恢复。',
en: 'Locking only blocks automatic cleanup, not manual deletion. Are you sure you want to delete it? This cannot be undone.' },
lockForce:{ zh: '仍要删除', en: 'Delete Anyway' },
},
/* 自动快照 */
auto: {
title: { zh: '自动快照', en: 'Automatic Snapshots' },
desc1: { zh: '按设定的时间间隔自动为当前配置拍一份快照,并在超过保留期后自动清理旧快照。默认',
en: 'A snapshot is taken automatically at the interval you set, and old ones are pruned once they pass the retention period. Enabled' },
descB: { zh: '开启', en: 'by default' },
desc2: { zh: ',可随时关闭。', en: ', and can be turned off at any time.' },
enable: { zh: '开启自动快照', en: 'Enable automatic snapshots' },
interval: { zh: '快照时间(小时一次)', en: 'Snapshot interval (hours)' },
days: { zh: '过期时间(天后自动删除)',
en: 'Expire after (days, then delete automatically)' },
count: { zh: '最多保留份数(0=不限)',
en: 'Maximum copies to keep (0 = unlimited)' },
path: { zh: '快照存放路径', en: 'Snapshot storage path' },
pathHint1:{ zh: '路径仅允许位于 ',
en: 'The path may only be under ' },
pathHint2:{ zh: ' 之下,避免误写系统关键目录。',
en: ' so that critical system directories are never overwritten.' },
keepManual:{ zh: '手动快照不参与自动清理',
en: 'Keep manual snapshots out of automatic cleanup' },
onApply: { zh: '每次「保存并应用」前自动拍一张',
en: 'Take one before every "Save & Apply"' },
hint1: { zh: '「手动快照不参与自动清理」是',
en: '"Keep manual snapshots out of automatic cleanup" is a ' },
hintB: { zh: '全局开关',
en: 'global switch' },
hint2: { zh: ':按创建方式自动识别,凡不是自动拍的一律保留(手动创建、回滚前、升级前拍的都是手动)。',
en: ': it works out how each snapshot was created and keeps everything that was not taken automatically (manual snapshots — including those taken before a rollback or an upgrade).' },
hint3: { zh: '若只想保住',
en: 'If you only want to keep ' },
hintB2: { zh: '其中某一份',
en: 'one particular snapshot' },
hint4: { zh: ',在下方「紧急救援通道 → 可回滚的快照」里给它单独上锁即可 —— 上锁的那份在任何自动清理下都不会被删,且不占用「最多保留份数」的额度。',
en: ', lock that one individually under "Emergency Rescue Channel → Rollback-capable Snapshots" below — a locked snapshot is never removed by any automatic cleanup, and it does not count toward the "maximum copies to keep" quota.' },
save: { zh: '保存自动快照策略', en: 'Save Automatic Snapshot Policy' },
runNow: { zh: '立即执行一次', en: 'Run Once Now' },
prune: { zh: '立即清理过期快照', en: 'Prune Expired Snapshots Now' },
kvNext: { zh: '下次自动快照', en: 'Next automatic snapshot' },
kvTimer: { zh: '定时器状态', en: 'Timer status' },
kvDisk: { zh: '快照占用', en: 'Snapshot disk usage' },
stateOn: { zh: '已开启', en: 'Enabled' },
stateOnT: { zh: ' 自动快照正在按计划运行',
en: ' — automatic snapshots are running on schedule' },
stateOff: { zh: '已关闭', en: 'Disabled' },
stateOffT:{ zh: ' 不会再自动创建快照',
en: ' — no more snapshots will be created automatically' },
timerOn: { zh: '运行中', en: 'Running' },
timerOff: { zh: '未运行', en: 'Not running' },
diskUse: { zh: '剩余 {0} / 共 {1}', en: '{0} free of {1}' },
saving: { zh: '正在保存…', en: 'Saving…' },
creating: { zh: '正在创建快照…', en: 'Creating snapshot…' },
pruning: { zh: '正在清理…', en: 'Pruning…' },
},
/* 紧急救援通道 */
res: {
title: { zh: '紧急救援通道', en: 'Emergency Rescue Channel' },
desc1: { zh: '当配置失误把网络"打崩"时(网络风暴、IP 冲突、路由环路、防火墙锁死、Web 管理页打不开等),常规手段往往已经进不去路由器。',
en: 'When a misconfiguration has "broken" the network (broadcast storms, IP conflicts, routing loops, a locked-out firewall, an unreachable web console, and so on), the usual ways in no longer get you into the router. ' },
descB: { zh: '紧急救援通道',
en: 'The Emergency Rescue Channel' },
desc2: { zh: '是一条完全独立于 WAN 口 / LAN 口的应急入口:它会在网卡上额外绑定一组虚拟地址,因此',
en: 'is a completely separate emergency entry point, independent of the WAN and LAN ports: it binds an extra set of virtual addresses on the NICs, so ' },
descB2: { zh: '把网线插到任意一个网口都能访问',
en: 'you can reach it by plugging the cable into any port' },
desc3: { zh: ',进入后可一键还原最近的快照并自动重启,让设备恢复到可用状态。',
en: ', then restore the most recent snapshot and reboot automatically to bring the device back to a usable state.' },
hint1: { zh: '下面这份快照列表就是救援通道的「还原材料」。',
en: 'The snapshot list below is the rescue channel\'s "repair kit". ' },
hintB: { zh: '网络已经打崩的时候,最怕的不是没有快照,是不知道该回滚哪一份',
en: 'once the network is already broken, the worst thing is not having a snapshot — it is not knowing which one to roll back to' },
hint2: { zh: ' —— 所以列表直接放在这里,看得清每份快照的备注、体积和是否受保护,回滚按钮就在手边。',
en: ' — so the list lives right here, where you can see each snapshot\'s note, size and whether it is protected, with the rollback button at hand.' },
enable: { zh: '开启紧急救援通道',
en: 'Enable the emergency rescue channel' },
vip: { zh: '救援地址(虚拟 IP)', en: 'Rescue address (virtual IP)' },
mask: { zh: '掩码长度', en: 'Prefix length' },
port: { zh: '救援端口', en: 'Rescue port' },
alt: { zh: '备用救援地址(同网段直连用)',
en: 'Alternate rescue address (for a direct connection on the same subnet)' },
ifaces: { zh: '生效网卡(留空=自动应用到所有物理网卡,插任一口皆可访问)',
en: 'Active NICs (leave empty = apply to every physical NIC, reachable from any port)' },
reboot: { zh: '一键还原后自动重启',
en: 'Reboot automatically after a one-click restore' },
hintEnable:{ zh: '启用后访问方式:',
en: 'Once enabled, reach it at ' },
hintAlso: { zh: '(也支持 ',
en: ' (you can also add ' },
hintEnd: { zh: ' 参数直达还原页)。',
en: ' to jump straight to the restore page).' },
hintAlt: { zh: '(也可用 ',
en: ' (or go straight to the one-click restore page at ' },
hintAltEnd:{ zh: ' 直达一键还原页)。',
en: ')' },
hintTail: { zh: '此地址不占用 WAN/LAN,插任一口皆可访问。',
en: 'This address does not use the WAN/LAN ports and is reachable from any of them.' },
save: { zh: '保存救援通道设置', en: 'Save Rescue Settings' },
test: { zh: '连通性自检', en: 'Connectivity Self-test' },
kvSvc: { zh: '服务状态', en: 'Service status' },
kvVif: { zh: '虚拟网卡', en: 'Virtual NIC' },
rbTitle: { zh: '可回滚的快照', en: 'Rollback-capable Snapshots' },
rbDesc1: { zh: '回滚 = 把界面配置与系统配置文件整体恢复到快照那一刻的状态,并重启相关服务。动手前先看清',
en: 'A rollback restores the UI configuration and the system configuration files to the state captured in that snapshot, then restarts the relevant services. Before you start, check ' },
rbDescB: { zh: '哪一份是你要的',
en: 'which one you actually want' },
rbDesc2: { zh: ':备注是你自己写的话,回滚就不容易选错。',
en: ': a note in your own words makes it much harder to pick the wrong one.' },
rbDesc3: { zh: '回滚之前系统会自动再拍一张 ',
en: 'Before rolling back, the system automatically takes another snapshot named ' },
rbDesc4: { zh: ' 快照,回滚完不满意还能退回来。',
en: ' so you can still come back if you are not satisfied with the result.' },
lockTitle:{ zh: '自动清理规则', en: 'Automatic Cleanup Rules' },
lockDesc1:{ zh: '手动快照', en: 'Manual snapshots' },
lockAnd: { zh: '与', en: ' and ' },
lockDesc2:{ zh: '已上锁的快照',
en: 'locked snapshots' },
lockDesc3:{ zh: '都不会被「自动快照」的过期清理删掉。两者区别在于——「手动快照」是按创建方式自动识别的全局策略(在「自动快照」卡片里可关),',
en: ' are never removed by the expiry cleanup of "Automatic Snapshots". The difference is that "manual snapshots" is a global policy detected from how a snapshot was created (you can turn it off in the "Automatic Snapshots" card), while ' },
lockDescB:{ zh: '上锁',
en: 'locking' },
lockDesc4:{ zh: '则是你对',
en: ' is your decision about ' },
lockDescB2:{ zh: '这一份',
en: 'that one snapshot' },
lockDesc5:{ zh: '的单独决定,任何自动清理都跳过它。上锁不影响手动删除,只是删之前会多问一次。',
en: ' individually, and every automatic cleanup skips it. Locking does not prevent manual deletion — it just asks you once more before doing so.' },
noPhys: { zh: '未检测到物理网卡', en: 'No physical NICs detected' },
stateOnT: { zh: '插任一口皆可访问救援页',
en: ' the rescue page is reachable from any port' },
stateOffT:{ zh: '(默认关闭,需要时再开)',
en: ' (off by default — turn it on when you need it)' },
vifOn: { zh: '已创建', en: 'Created' },
vifOff: { zh: '未创建', en: 'Not created' },
addrs: { zh: '当前地址:', en: 'Current addresses: ' },
saving: { zh: '正在保存并应用…', en: 'Saving and applying…' },
testing: { zh: '正在自检…', en: 'Self-test running…' },
tokenLbl: { zh: '访问令牌 ', en: 'Access token ' },
tokenHelp:{ zh: ' —— 救援页上所有的还原操作都要填它。只显示这一次,关掉再开启会换一个。请抄到另一台机器上保存。',
en: ' — every restore action on the rescue page requires it. It is shown only once; turning the channel off and on again issues a new one. Copy it to another machine and keep it there.' },
},
/* 网络后端迁移 */
mig: {
title: { zh: '网络后端迁移(高级)',
en: 'Network Backend Migration (advanced)' },
desc1: { zh: '当前由 NetworkManager 管理网卡。如需切换为 systemd-networkd,可先做干跑预览查看将写入的配置文件。',
en: 'Network interfaces are currently managed by NetworkManager. To switch to systemd-networkd, run a dry-run preview first to see which configuration files would be written. ' },
descB: { zh: '真正执行可能中断网络连接',
en: 'The real migration may interrupt your network connection' },
desc2: { zh: '——万一失联,可以通过虚拟机平台的控制台,或者物理机的 KVM/IPMI、本地显示器、VNC 等方式重新登录救回。确认自己能救回来之后,再执行迁移。',
en: ' — if you lose access, you can get back in through the hypervisor console, or through KVM/IPMI, a local monitor or VNC on physical hardware. Run the migration only once you are sure you can recover.' },
preview: { zh: '生成迁移预览(不写入)',
en: 'Generate Migration Preview (no changes)' },
needWan: { zh: '请先到「网卡与桥接」页把某个网口的角色设为 WAN,否则迁移配置里缺少 WAN 网卡,无法生成。',
en: 'First set one port\'s role to WAN on the "NICs & Bridge" page — the migration config has no WAN interface without it, so nothing can be generated.' },
making: { zh: '生成中…', en: 'Generating…' },
noFiles: { zh: '未生成任何文件', en: 'No files were generated' },
},
/* 配置文件位置 */
files: {
title: { zh: '配置文件位置', en: 'Configuration File Locations' },
thItem: { zh: '内容', en: 'Content' },
thPath: { zh: '路径', en: 'Path' },
db: { zh: 'Web 配置数据库', en: 'Web configuration database' },
snap: { zh: '配置快照', en: 'Configuration snapshots' },
logs: { zh: '结构化日志', en: 'Structured logs' },
dhcp: { zh: 'DHCP/DNS 配置', en: 'DHCP/DNS configuration' },
fw: { zh: '防火墙规则', en: 'Firewall rules' },
pppoe: { zh: 'PPPoE 配置', en: 'PPPoE configuration' },
ra: { zh: 'RA 配置', en: 'RA configuration' },
},
},
/* ---- 证书 / SSL 页(viewCa)----
⚠️ 同 nd / share / sys 组的告诫:词条里**不能带 HTML 标签**。
⚠️ ca.kind.* 对应后端下发的 kind_cn(CA_KIND_CN)—— 那是**中文**,
切到英文时若直接显示 kind_cn 就会中英混杂,所以这里按 kind
重新映射成词条(见 app.js 的 caKindText)。 */
ca: {
reading: { zh: '正在读取…', en: 'Reading…' },
/* 正在用的证书 */
webTitle: { zh: '管理后台正在用的证书',
en: 'Certificate in use by the admin console' },
reload: { zh: '重新读取', en: 'Reload' },
webDesc: { zh: '浏览器打开 https://本机:端口 时看到的就是这张。默认是一张自签证书 —— 能加密,但浏览器不认识它,所以会提示「不安全」。想消除提示,在下面建一个自己的 CA,用它签一张服务器证书,再把根证书装进你的设备。',
en: 'This is the certificate your browser sees when you open https://this-host:port. By default it is a self-signed certificate — it does encrypt the traffic, but browsers do not recognise it, so they will warn that the connection is "not secure". To remove the warning, create your own CA below, use it to issue a server certificate, and install the root certificate on your devices.' },
restore: { zh: '重新生成一张默认自签证书',
en: 'Generate a New Default Self-signed Certificate' },
/* 证书库说明 */
libTitle: { zh: '证书库', en: 'Certificate Store' },
libDesc: { zh: 'CA 证书用来签发;服务器证书可以直接部署给管理后台;证书签名请求(CSR)是拿去给公共证书机构签名的半成品。',
en: 'A CA certificate is used to issue other certificates; a server certificate can be deployed to the admin console directly; a certificate signing request (CSR) is a half-finished document that you hand to a public certificate authority to be signed.' },
/* ① 创建 CA */
step1: { zh: '① 创建自己的 CA', en: '① Create your own CA' },
step1Desc:{ zh: 'CA 是「发证机构」。建好之后,你签的每一张证书都属于同一个信任体系 —— 只要把这张 CA 装进手机 / 电脑一次,之后签的所有证书都不再提示不安全。',
en: 'A CA is a "certificate authority". Once you have one, every certificate you issue belongs to the same chain of trust — install this CA on your phone / computer once, and none of the certificates issued afterwards will trigger a security warning.' },
/* ② 签发服务器证书 */
step2: { zh: '② 用 CA 签一张服务器证书',
en: '② Issue a server certificate with your CA' },
step2Desc:{ zh: '签好的证书会带上你填的域名和 IP。浏览器访问时,地址必须出现在 SAN(使用者可选名称)里,否则照样报「名称不匹配」—— 这是最常被忽略的一步。',
en: 'The issued certificate carries the domains and IPs you enter. When the browser connects, the address must appear in the SAN (Subject Alternative Name), otherwise you will still get a "name mismatch" error — this is the most commonly overlooked step.' },
whichCa: { zh: '用哪张 CA 签', en: 'Sign with which CA' },
dnsLabel: { zh: '域名(多个用逗号分隔)',
en: 'Domains (comma-separated)' },
ipLabel: { zh: 'IP(多个用逗号分隔)',
en: 'IPs (comma-separated)' },
sign: { zh: '签发', en: 'Issue' },
/* ③ 导入 */
step3: { zh: '③ 导入已有证书', en: '③ Import an existing certificate' },
step3Desc:{ zh: '从证书机构买的、别处签好的,直接粘进来(或填这台机器上的文件路径)。证书和私钥可以粘在同一个框里,会自动拆开。',
en: 'Paste in a certificate you bought from a certificate authority or that was issued elsewhere (or give the path of a file on this machine). The certificate and the private key can go in the same box — they are split automatically.' },
kindLabel:{ zh: '类型', en: 'Type' },
completeTo:{ zh: '补到哪条记录(可选,用来补全 CSR)',
en: 'Attach to which record (optional, used to complete a CSR)' },
pemLabel: { zh: '证书 PEM(可含私钥)',
en: 'Certificate PEM (may include the private key)' },
fromFile: { zh: '或用这台机器上的文件',
en: 'Or use a file on this machine' },
doImport: { zh: '导入', en: 'Import' },
/* ④ CSR */
step4: { zh: '④ 生成证书签名请求(CSR)',
en: '④ Generate a certificate signing request (CSR)' },
step4Desc:{ zh: '如果你有正式域名并想用公共证书机构签发的证书:在这里生成 CSR,把它提交给证书机构,签回来的证书回到上面「导入」里补全即可。',
en: 'If you have a real domain name and want a certificate signed by a public certificate authority: generate a CSR here, submit it to the authority, then bring the signed certificate back and complete it via "Import" above.' },
otherDns: { zh: '其它域名(逗号分隔)',
en: 'Other domains (comma-separated)' },
genCsr: { zh: '生成 CSR', en: 'Generate CSR' },
csrHand: { zh: '把它交给证书机构(点一下全选复制)',
en: 'Hand this to the certificate authority (click to select all and copy)' },
copyCsr: { zh: '复制 CSR', en: 'Copy CSR' },
copied: { zh: '已复制', en: 'Copied' },
copyFail: { zh: '复制失败', en: 'Copy failed' },
/* SSL/TLS 体检 */
testTitle:{ zh: 'SSL / TLS 体检', en: 'SSL / TLS Check-up' },
testDesc: { zh: '对任意主机的任意端口做一次真实握手,看协议版本、加密套件、证书链和校验结论。默认测本机管理后台;也可以测局域网里其它设备、或者外网站点。',
en: 'Perform a real handshake against any host and port to inspect the protocol version, cipher suite, certificate chain and verification result. It defaults to this router\'s own console, but you can also test other devices on the LAN or external sites.' },
hostLabel:{ zh: '主机', en: 'Host' },
sniLabel: { zh: 'SNI(留空=同主机)',
en: 'SNI (leave empty = same as host)' },
sniPh: { zh: '可留空', en: 'optional' },
insecure: { zh: '不看校验结果,只要握手能通就行',
en: 'Ignore the verification result — a successful handshake is enough' },
startTest:{ zh: '开始测试', en: 'Start Test' },
testSelf: { zh: '测本机管理后台', en: 'Test this Console' },
testHint: { zh: '填好主机点「开始测试」。',
en: 'Enter a host and click "Start Test".' },
needHost: { zh: '请填写要测试的主机',
en: 'Enter the host you want to test' },
handshaking:{ zh: '正在握手…', en: 'Handshaking…' },
testFail: { zh: '测试失败', en: 'Test failed' },
hsFail: { zh: '握手失败', en: 'Handshake failed' },
hsOk: { zh: '握手', en: 'Handshake' },
success: { zh: '成功', en: 'Success' },
proto: { zh: '协议', en: 'Protocol' },
cipher: { zh: '加密套件', en: 'Cipher suite' },
elapsed: { zh: '耗时', en: 'Elapsed' },
pass: { zh: '通过', en: 'Pass' },
caution: { zh: '注意', en: 'Warning' },
leafFp: { zh: '叶子证书 SHA256:',
en: 'Leaf certificate SHA256:' },
/* 通用字段(caRender 与体检结果共用) */
subject: { zh: '证书主题', en: 'Subject' },
issuer: { zh: '颁发者', en: 'Issuer' },
validity: { zh: '有效期', en: 'Validity' },
remain: { zh: '剩余', en: 'Remaining' },
type: { zh: '类型', en: 'Type' },
alg: { zh: '算法', en: 'Algorithm' },
fp: { zh: 'SHA256 指纹', en: 'SHA256 fingerprint' },
inLib: { zh: '在证书库里', en: 'In the certificate store' },
selfSignTag:{ zh: '自签(浏览器会提示)',
en: 'Self-signed (browsers will warn)' },
byCaTag: { zh: '由 CA 签发', en: 'Issued by a CA' },
inLibYes: { zh: '是({0})', en: 'Yes ({0})' },
inLibNo: { zh: '否(自动生成,未入库)',
en: 'No (auto-generated, not stored)' },
covers: { zh: '覆盖的名称:', en: 'Covered names: ' },
lastDeploy:{ zh: '上次部署({0}):{1}',
en: 'Last deployment ({0}): {1}' },
buildWarn:{ zh: '当前处于构建保护模式:部署只会写盘,不会重启 Web 服务。',
en: 'Build protection mode is on: deploying only writes to disk and does not restart the web service.' },
idxBroken:{ zh: '证书库索引文件损坏,列表可能不完整。新建证书会重建它。',
en: 'The certificate store index file is corrupted, so the list may be incomplete. Creating a new certificate will rebuild it.' },
noCert: { zh: '管理后台现在没有可用的证书:',
en: 'The admin console has no usable certificate right now: ' },
certGone: { zh: '证书文件缺失或无法解析',
en: 'the certificate file is missing or cannot be parsed' },
expiring: { zh: '这张证书{0}(剩 {1} 天)。建议现在换一张,否则浏览器会彻底拒绝连接。',
en: 'This certificate {0} ({1} days left). Replace it now, otherwise browsers will refuse the connection outright.' },
hasExpired:{ zh: '已经过期', en: 'has expired' },
almostOver:{ zh: '快到期了', en: 'is about to expire' },
loadFail: { zh: '读取失败', en: 'Failed to read' },
/* 到期标签(caDaysTag) */
unknown: { zh: '未知', en: 'Unknown' },
expiredDays:{ zh: '已过期 {0} 天', en: 'Expired {0} days ago' },
daysLeft: { zh: '剩 {0} 天', en: '{0} days left' },
/* 列表 */
libEmpty: { zh: '证书库是空的。先在下面「① 创建自己的 CA」建一张。',
en: 'The certificate store is empty. Create one under "① Create your own CA" below.' },
thName: { zh: '名称', en: 'Name' },
thType: { zh: '类型', en: 'Type' },
thSubject:{ zh: '主题 / CN', en: 'Subject / CN' },
thExpiry: { zh: '有效期至', en: 'Expires' },
thLeft: { zh: '剩余', en: 'Remaining' },
thKey: { zh: '私钥', en: 'Private key' },
thStatus: { zh: '状态', en: 'Status' },
thAct: { zh: '操作', en: 'Actions' },
hasKey: { zh: '有', en: 'Yes' },
noKey: { zh: '无', en: 'No' },
inUse: { zh: '正在用', en: 'In use' },
canSign: { zh: '可签发', en: 'Can issue' },
awaiting: { zh: '待签回', en: 'Awaiting signature' },
deploy: { zh: '部署', en: 'Deploy' },
del: { zh: '删除', en: 'Delete' },
noCa: { zh: '— 还没有 CA,先创建一张 —',
en: '— no CA yet, create one first —' },
newRecord:{ zh: '— 新建一条记录 —',
en: '— create a new record —' },
complete: { zh: '补全:{0}', en: 'Complete: {0}' },
caOpt: { zh: '{0}({1})', en: '{0} ({1})' },
rsa2048: { zh: 'RSA 2048', en: 'RSA 2048' },
/* 证书类型(替代后端下发的中文 kind_cn) */
kind: {
ca: { zh: 'CA 证书', en: 'CA certificate' },
server: { zh: '服务器证书', en: 'Server certificate' },
csr: { zh: '证书签名请求', en: 'Certificate signing request' },
},
/* 动作确认 */
needCa: { zh: '请先创建一张 CA 证书',
en: 'Create a CA certificate first' },
needDns: { zh: '请填写域名', en: 'Enter a domain name' },
deployAsk:{ zh: '把这张证书部署给管理后台?\n\n'
+ '· Web 服务会重启,你需要重新登录一次\n'
+ '· 换上后如果握手不通过,会自动还原原来的证书\n'
+ '· 自签证书浏览器仍会提示,那是正常的(加密是生效的)',
en: 'Deploy this certificate to the admin console?\n\n'
+ '· The web service will restart and you will have to sign in again\n'
+ '· If the handshake does not pass afterwards, the previous certificate is restored automatically\n'
+ '· Browsers will still warn about a self-signed certificate — that is normal (encryption is working)' },
delAsk: { zh: '确定删除这张证书?它的私钥会一起删除,不可恢复。',
en: 'Delete this certificate? Its private key will be deleted too, and this cannot be undone.' },
restoreAsk:{ zh: '重新生成一张默认自签证书并立即部署?\n\n'
+ '它会带上本机所有 IP 与 localhost,有效期十年。Web 服务会重启,你需要重新登录。',
en: 'Generate a fresh default self-signed certificate and deploy it now?\n\n'
+ 'It will cover all local IPs and localhost, and is valid for ten years. The web service will restart and you will have to sign in again.' },
restarting:{ zh: 'Web 服务正在重启,10 秒后自动刷新(需要重新登录一次)',
en: 'The web service is restarting; the page refreshes automatically in 10 seconds (you will have to sign in again)' },
/* 表单标签(三处共用) */
cnLabel: { zh: '证书主体 CN', en: 'Certificate subject CN' },
nameLabel:{ zh: '名称(显示用)', en: 'Name (display only)' },
namePh: { zh: '家里的根证书', en: 'Home root certificate' },
step1Go: { zh: '创建 CA', en: 'Create CA' },
daysLabel:{ zh: '有效期(天)', en: 'Validity (days)' },
keyLabel: { zh: '私钥算法', en: 'Private key algorithm' },
portLabel:{ zh: '端口', en: 'Port' },
dnsCnLabel:{ zh: '域名 CN', en: 'Domain CN' },
},
};
/* ---- 运行时状态 ---- */
let LANG = DEFAULT_LANG;
const listeners = [];
function detect() {
try {
const saved = localStorage.getItem(STORE_KEY);
if (saved) return saved;
} catch (e) { /* 隐私模式 / 无 localStorage */ }
// 跟随浏览器
const nav = (navigator.language || '').toLowerCase();
if (nav.indexOf('zh') === 0) return 'zh-CN';
if (nav.indexOf('en') === 0) return 'en-US';
return DEFAULT_LANG;
}
/* 取词:{zh, en} 或字符串 */
function pick(entry) {
if (entry == null) return null;
if (typeof entry === 'string') return entry;
// ⛔ 2026-10-07:这里原来是 `&& entry.en`(真值判断)。
// 空串 '' 是**合法的英文译文**(量词/助词在英文里就该消失:
// '共 3 条' → 'Total 3'),却因为 falsy 掉回 entry.zh,
// 英文界面又吐出中文。只有**真的没配** en 才该回落。
if (LANG === 'en-US' && entry.en != null) return entry.en;
return entry.zh || entry.en || '';
}
/* 「中文原文 → 词条」直查索引(1.0.10 起)。
为什么需要它:补 i18n 时大量界面文案是**含中文的整段 HTML 片段**
(带 <span class="tag">、${…} 之类),给它起 `oh.tag.installed` 这种
点分 key 既难维护又容易撞名。直接拿中文原文当 key 最省事:
① 不用设计命名,改动最小;
② 漏翻译时 lookup 返回 null → t() 回落到 key 本身(= 中文原文),
行为与改动前完全一致,**不会开天窗**。
⚠️ 必须在 lookup 之前试:中文原文里可能含 '.'(如 `192.168.7.3`),
走点分路径会被切碎、永远查不到。 */
let RAW_INDEX = null;
function rawIndex() {
if (RAW_INDEX) return RAW_INDEX;
RAW_INDEX = Object.create(null);
(function walk(node) {
for (const k in node) {
const v = node[k];
if (!v || typeof v !== 'object') continue;
if (typeof v.zh === 'string' && !(v.zh in RAW_INDEX)) {
RAW_INDEX[v.zh] = v;
// 换行形态归一化的**别名**(2026-10-05)。
// 为什么需要:app.js 里的 key 可能写成 'a\nb'(字面反斜杠+n),
// 也可能写成 'a<换行>b';字典里存的则是另一种形态。
// 两者在 JS 里是**不同的字符串**,直接查表必然有一边查不到,
// 表现为英文界面下这些片段回落中文(实测 24 条)。
// 归一化:把「字面 \n」与「真实换行」都换成同一个标记再索引。
const norm = (s) => {
// 逐层剥「反斜杠 + n」:源码里可能是 \n、\\n、\\\n…
// (取决于回写脚本转义了几次),字典里只有其中一种。
// 全部归一到 \u0001,两种形态就都能命中同一张表。
let out = s;
for (let i = 0; i < 4; i++) {
const next = out
.replace(/\\\\n/g, '\u0001') // \\n -> 标记
.replace(/\\r\\n|\\n/g, '\u0001') // \n / 真实换行 -> 标记
if (next === out) break;
out = next;
}
return out;
};
const nk = norm(v.zh);
if (!(nk in RAW_INDEX)) RAW_INDEX[nk] = v;
}
walk(v);
}
})(DICT);
return RAW_INDEX;
}
/* 查字典,三级:
① 中文原文直查(key 本身就是词条,如 t('概览'))
② **尾段**原文直查 —— 处理 t('raw.1. modprobe wireguard(…)\n'):
点分路径会把含 '.' 的 raw 键切碎('raw.1' / 'raw.daemon'),
而 rawIndex 里存的是 '1. modprobe…'(不带 raw. 前缀)。
2026-10-05 实测:6 条含 '.' 的词条因此回落中文,英文界面显示中文。
判据:逐个尝试「从第 i 个点开始的后缀」,第一个含中文且命中的即返回。
③ 普通点分路径('common.version')
顺序不能换:③ 必须最后,否则 'raw.daemon.json …' 会被切成 raw→daemon→… 走偏。 */
function lookup(key) {
const k = String(key);
if (/[\u4e00-\u9fff]/.test(k)) {
const idx = rawIndex();
const norm = (x) => {
let out = x;
for (let i = 0; i < 4; i++) {
const next = out
.replace(/\\\\n/g, '\u0001')
.replace(/\\r\\n|\\n/g, '\u0001');
if (next === out) break;
out = next;
}
return out;
};
// ① 整串就是词条(原样 + 换行归一化两种形态)
const hit = idx[k] || idx[norm(k)];
if (hit) {
// ⚠️ 中文界面必须**逐字显示代码里的原文**。
// 归一化命中时,词条的 zh 可能是「另一种换行形态」
// (如 'a\\nb' vs 'a<换行>b'),直接返回会让部分文案
// 多出/少掉反斜杠 —— 实测 14 条对不上。
// 英文界面无所谓(显示的是 en)。
if (LANG !== 'en-US' && hit.zh !== k) {
return { zh: k, en: hit.en, __alias: true };
}
return hit;
}
// ② 逐个后缀('raw.a.b.c' 依次试 'a.b.c'、'b.c'、'c')
const parts = k.split('.');
for (let i = 1; i < parts.length; i++) {
const sub = parts.slice(i).join('.');
if (!/[\u4e00-\u9fff]/.test(sub)) continue;
const h2 = idx[sub] || idx[norm(sub)];
if (h2) return h2;
}
}
// ③ 点分路径
const parts = k.split('.');
let node = DICT;
for (const p of parts) {
if (node == null || typeof node !== 'object') return null;
node = node[p];
}
return node || null;
}
/* 后端下发文案的英文查表:bt(表名, key, 字段)。
用法:`bt('QOS_PRESETS', p.id, 'why')`
- 查不到 → 返回 ''(调用点通常写成 esc(bt(...) || 中文) 回落)
- 中文界面 → 返回 '',让调用点的 || 回落分支生效。
为什么不直接在这里判语言:调用点的回落写法更简洁,
且这批表的中文在 app.js / helper 里都现成,不需要再抄一份。 */
function bt(table, key, field) {
if (LANG !== 'en-US') return '';
const tbl = DICT.bt || {};
const row = tbl[table] && tbl[table][key];
return (row && row[field]) || '';
}
function t(key, vars) {
const entry = lookup(key);
let s = pick(entry);
if (entry && entry.__alias) {
// 归一化别名:中文用传入的原文,英文用词条的 en。
s = LANG === 'en-US' ? (entry.en || entry.zh) : entry.zh;
}
if (s == null) {
// ⛔ 缺词**显示原文**而不是空白 —— 空白会让界面出现「空按钮」,
// 用户以为是 bug,比英文多重要得多。
console.warn('[i18n] 缺少词条:' + key);
return key;
}
if (Array.isArray(vars)) {
vars.forEach((v, i) => {
s = s.split('{' + i + '}').join(v == null ? '' : String(v));
});
}
return s;
}
/** 翻译一段 HTML 里的 data-i18n 属性(用于 index.html 静态部分)。
data-i18n="nav.dash" → 替换元素文本
data-i18n-attr="title:nav.dash" → 替换 title 属性 */
function applyDom(root) {
const box = root || document;
box.querySelectorAll('[data-i18n]').forEach(el => {
el.textContent = t(el.getAttribute('data-i18n'));
});
box.querySelectorAll('[data-i18n-attr]').forEach(el => {
el.getAttribute('data-i18n-attr').split(',').forEach(pair => {
const idx = pair.indexOf(':');
if (idx < 0) return;
const attr = pair.slice(0, idx).trim();
el.setAttribute(attr, t(pair.slice(idx + 1).trim()));
});
});
}
function setLang(lang, opts) {
const next = lang === 'en-US' ? 'en-US' : 'zh-CN';
if (next === LANG && !(opts && opts.force)) return LANG;
LANG = next;
document.documentElement.lang = LANG;
try { localStorage.setItem(STORE_KEY, LANG); } catch (e) { /* 忽略 */ }
applyDom();
// 通知订阅者(各模块的 render 重新渲染)
listeners.forEach(fn => {
try { fn(LANG); } catch (e) { console.error('[i18n] 订阅者出错', e); }
});
return LANG;
}
function onChange(fn) {
if (typeof fn === 'function') listeners.push(fn);
}
/** 供各模块登记「语言变了要重绘我」。
⚠️ 必须登记,否则切语言后这些卡片还是旧语言 ——
它们是**异步填充**的(fetch 回来才 innerHTML),
go() 重绘主视图不会顺带重建它们。
典型例子:概览页重绘不会重新 fetch 上游链路,容器被清空了。 */
function register(name, fn) {
if (typeof fn === 'function') {
listeners.push(fn);
RENDERERS[name] = fn;
}
}
const RENDERERS = {};
function rerenderAll() {
Object.keys(RENDERERS).forEach(k => {
try { RENDERERS[k](); } catch (e) { console.error('[i18n] ' + k, e); }
});
}
function toggle() {
return setLang(LANG === 'zh-CN' ? 'en-US' : 'zh-CN');
}
// 初始化
LANG = detect();
document.documentElement.lang = LANG;
// 暴露
window.t = t;
window.bt = bt; // 暴露给 bt4():后端文案英文查表
window.__drouterBT = DICT.bt; // 调试用:console 查表
// 后端下发的结构化字段(en_*/中文原值):按当前语言二选一。
// 英文界面取 en_(缺失回落中文),中文界面取中文原值(不会误显英文)。
function enOrZh(en, zh) {
if (LANG === 'en-US') return (en !== undefined && en !== null && en !== '') ? en : zh;
return (zh !== undefined && zh !== null && zh !== '') ? zh : en;
}
window.enOrZh = enOrZh;
window.i18n = {
t: t, setLang: setLang, getLang: () => LANG, toggle: toggle,
onChange: onChange, applyDom: applyDom, dict: DICT,
register: register, rerenderAll: rerenderAll,
};
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => applyDom());
} else {
setTimeout(applyDom, 0);
}
})();