多语言
Argus 的界面与原生层(托盘、错误信息、特权服务的提示)共用 locales/ 下的文案目录。简体中文(zh-CN)是源语言,其他语言从它翻译;目前另有英语(en-US)。
目录结构
locales/
zh-CN/ 源语言:键以这里为准
common.json 通用词(取消、关闭、启用……)与资源名称
shell.json 工具栏、导航栏、状态栏
processes.json 进程列表、右键菜单、分组
details.json 详细信息面板
actions.json 结束进程、优先级等操作的确认与结果
performance.json
services.json
startup.json
connections.json
history.json
fileLock.json 文件占用查询
settings.json
updates.json 更新提示
onboarding.json 首次启动引导
format.json 时长、日期等格式
native.json Rust 侧:托盘、宿主命令、更新程序、核心库与特权服务
en-US/ 与 zh-CN 相同的文件和键
每个文件是一个命名空间,内部可以按功能嵌套分组,键用 camelCase。界面里的完整键是“命名空间.路径”,例如 settings.update.channel.label;native.json 的键不带命名空间前缀,例如 tray.quit。
在界面中使用
import { rich, t } from "../lib/i18n";
<button title={t("shell.details.show")}>…</button>
t("shell.interval.option", { seconds: 2 }); // "每 {seconds} 秒"
t("actions.endGroup.done", { count: n, name }); // 复数,见下文
rich("onboarding.background.hotkey", { hotkey: <Keycaps keys={keys} /> }); // "按 {hotkey} 可随时显示或隐藏 Argus……"
t的键有类型检查:键来自zh-CN的 JSON,拼错或删掉的键会让pnpm typecheck失败。由枚举拼出的键(t(`shell.page.${p}`))只要枚举的每个值都有对应的键也能通过检查。t读取当前语言的信号,切换语言时所有在 JSX 或计算中调用t的地方自动更新。因此不要在模块顶层把t(...)的结果存进常量;常量里存键或枚举值,渲染时再调用t,或写成 getter。- 占位符写作
{name}。名为count的数值按当前语言加千位分隔符,其他数值原样输出(PID、端口不加分隔符)。 - 需要在文案中嵌入元素(加粗、键帽、链接、图标)时用
rich:文案里写<tag>…</tag>,参数里给出渲染函数;{name}占位符也可以传入元素。标签不能嵌套。 - 数字、日期、排序使用
lib/i18n.ts的localized按语言缓存Intl对象,不要写死"zh-CN"。常用的格式化函数在lib/format.ts。 - 列表连接用
fmtList(中文“、”和“和”,英文逗号与 and)。
在 Rust 中使用
use argus_core::tr;
tr!("tray.quit")
tr!("tray.update", version = version) // "更新到 {version}…"
tr! 返回 String,按 argus_core::i18n 的当前语言查找 native.json,缺失的键退回中文,再退回键本身。宿主启动时按设置选定语言,切换语言时重建托盘菜单和窗口标题;已经显示的错误信息不随之更新。
宿主启动的辅助进程(如句柄查询)通过环境变量 ARGUS_LOCALE(argus_core::i18n::ENV)继承宿主的语言。特权服务以 SYSTEM 身份运行,管理员维护助手经 UAC 在另一个提升的进程中运行,它们读不到用户的语言设置,使用 Windows 的显示语言。因此当 Argus 的语言与 Windows 显示语言不同时,来自服务的少量错误信息会显示为 Windows 的语言。
只有展示给用户的文字放进目录。日志(log::info! 等)、panic 信息和代码注释用英文,不翻译。
复数
中文没有复数变化,源文案总是一个字符串。其他语言可以把含 {count} 的文案写成按复数类别区分的对象,类别名称取自 Intl.PluralRules:
"done": { "one": "Ended {count} process of {name}.", "other": "Ended {count} processes of {name}." }
调用处传入数值的 count。除 other 外的类别可以不写 {count}(如 “One process”)。
检查
pnpm check 和 CI 会运行 node scripts/i18n.mjs,检查:
- 每种语言都有源语言的全部文件和键,没有多余的键;
- 译文保留源文案的全部占位符和标签,复数形式只用于含
{count}的文案; - 非中文的译文里没有中文;
- Rust 中
tr!用到的键都存在,传入的参数与文案的占位符一致(安装程序的文案在 NSIS 脚本中,不在检查范围内); - 代码中没有直接写入的中文文案。注释、Rust 测试和
ui/src/lib/mock.ts(模拟数据)除外;确有必要时在该行的注释里写i18n-ignore。
node scripts/i18n.mjs --unused 额外列出代码中似乎没有用到的键,用于清理。
增加文案
- 在
zh-CN对应命名空间里加键,再在其他语言的同一位置加译文。 - 在代码中用
t、rich或tr!引用。 - 运行
start.bat check。
改了源文案的意思时,同步修改所有语言的译文;只改措辞且不影响译文时可以只改中文。
增加语言
- 复制
locales/en-US为新的语言目录(如ja-JP),逐个翻译。 - 界面:在
ui/src/lib/i18n.ts的Locale与LOCALES中加入该语言(用它自己的语言写名称),并调整localeFor的匹配。 - Rust:在
argus_core::i18n::Locale中加入变体、标签、include_str!与system()的匹配。 - 安装程序:在
src-tauri/tauri.conf.json的bundle.windows.nsis.languages中加入 NSIS 语言名,在src-tauri/installer-ui.nsh中为每个LangString加上该语言(含界面字体ArgusFace),并在src-tauri/installer-hooks.nsh中为新的$LANGUAGE补上提示文字。 - 在浏览器预览中用
start.bat ui打开http://localhost:5173/?lang=<语言>检查各页面的排版。
写作约定
- 中文:正式、简洁,不用口语化表述;完整句子以句号结尾,标签、按钮、提示短语不加句号。
- 英文:沿用 Windows 的界面用语,标签与按钮用句首大写(“End task”“Open file location”),完整句子以句号结尾,与中文源文案一致。可以使用常见的缩写形式(can't、don't),错误提示用 “Couldn't …”。
- 产品名 Argus、Windows、GitHub 与技术名词(PID、CPU、ETW、IPv4、UAC)不翻译。
- 译文不必逐字对应,但信息必须完整,尤其是权限、风险与数据去向的说明。
术语表
| 中文 | English |
|---|---|
| 进程 | Process / Processes |
| 应用 | Apps |
| 后台进程 | Background processes |
| 进程树 | Process tree |
| 结束进程 | End task |
| 结束进程树 | End process tree |
| 效率模式 | Efficiency mode |
| 优先级:实时、高、高于正常、正常、低于正常、低 | Priority: Realtime, High, Above normal, Normal, Below normal, Low |
| 详细信息 | Details |
| 打开文件位置 | Open file location |
| 性能 | Performance |
| 服务 | Services |
| 启动类型:自动、自动(延迟启动)、手动、禁用 | Startup type: Automatic, Automatic (Delayed Start), Manual, Disabled |
| 启动(页签)、启动项 | Startup (tab), Startup apps |
| 启动影响 | Startup impact |
| 连接 | Connections |
| 历史 | History |
| 文件占用 | File locks |
| 句柄 | Handle |
| 工作集、提交大小 | Working set, Commit size |
| 分页缓冲池、非分页缓冲池 | Paged pool, Non-paged pool |
| 刷新频率、暂停刷新 | Refresh rate, Pause updates |
| 特权服务 | Privileged service |
| 替换系统任务管理器 | Replace Task Manager |
| 管理员授权 | Administrator permission |
| 管理员、标准权限 | Administrator, Standard user |
| 规则 | Rules |
| 托盘 | System tray |
| 快捷键 | Keyboard shortcut |
| 更新通道:稳定版、测试版 | Update channel: Stable, Beta |
| 下载线路 | Download source |
| 加速代理 | GitHub proxy |
| 安装版、免安装版 | Installed version, Portable version |
| 界面动画、曲线动画 | Interface animations, Chart animations |
| 流畅、均衡、省电、关闭 | Smooth, Balanced, Power saving, Off |
| 首次启动引导 | Welcome guide |
| 导航栏位置:侧边、顶部 | Navigation position: Side, Top |