vscode.l10n.t()是vs code 1.80+推荐的唯一运行时翻译方式,需在package.json声明"l10n"字段、使用utf-8无bom的package.nls.zh-cn.json文件、key严格匹配,且contributes文案须用%key%占位而非直接调用t()。

vscode.l10n.t() 是当前唯一推荐的运行时翻译方式
VS Code 1.80+ 版本已正式弃用 vscode-nls 工具链,vscode.l10n.t() 成为插件本地化的事实标准。它不依赖构建步骤,也不需要 webpack loader 配置,但要求你严格遵守几个前提:
- 必须在
package.json中声明"l10n": "./nls"字段,指向存放.nls.*.json的目录(通常为根目录) -
package.nls.json和package.nls.zh-cn.json必须同级存在,且 key 完全一致 - 调用
vscode.l10n.t()时,第一个参数必须是字符串字面量(如"saveConfirm"),不能是变量或拼接结果,否则编译期无法提取到资源文件 - 所有 .json 文件必须保存为 UTF-8 无 BOM 编码——Windows 记事本默认带 BOM,极易导致中文解析失败并显示为空白或乱码
配置项(contributes)里的文案根本不会走 l10n 流程
这是最容易被忽略的盲区:package.json 中 contributes.commands、contributes.configuration、contributes.menus 等字段里的 "title"、"description" 等文案,**完全不经过 vscode.l10n.t() 或任何运行时翻译逻辑**。VS Code 在加载插件 manifest 时就直接读取这些字符串。
- 正确做法是:把这些文案全部挪进
package.nls.json,并在package.json中用%key%占位,例如"title": "%command.save.title%" - 确保
package.nls.json里有对应 key:"command.save.title": "保存文件" - 注意:这种占位符只对
contributes生效,对代码中vscode.window.showInformationMessage()这类调用无效,后者仍需显式调用vscode.l10n.t()
打包时中文资源没嵌入?检查 vsce 的工作路径和文件匹配
vsce package 默认只打包 package.json 中 main、icon、license 等显式声明的路径,.nls.*.json 文件不会自动包含——除非它们被识别为本地化资源。
- 确认
package.json的"l10n"字段值(如"./nls")与实际目录名完全一致,大小写敏感 - 确保
.nls.*.json文件位于该目录下,且文件名符合package.nls.{locale}.json格式(如package.nls.zh-cn.json) - 运行
vsce package --no-yarn时观察控制台输出:若看到Found 2 language packs类提示,说明识别成功;若无声无息,大概率路径或命名不匹配 - 打包后解压 .vsix 文件,手动检查
extension/目录下是否存在package.nls.zh-cn.json—— 没有它,用户装了插件也看不到中文
用户语言是 zh-cn,但插件里 vscode.env.language 返回 en?
这不是 bug,而是 VS Code 启动时序问题:插件 activate() 执行时,语言环境可能尚未初始化完成,vscode.env.language 会暂时返回 fallback 值(通常是 "en")。
- 不要在
activate()开头就依赖vscode.env.language做条件加载 - 改用
vscode.l10n.t()—— 它内部会自动监听语言变更,并在环境就绪后重渲染,无需你手动处理延迟 - 如果必须提前读取语言(比如初始化 Webview 资源路径),可加一层判断:
if (vscode.env.language !== 'en') { /* 可信 */ },或监听vscode.env.onDidChangeLanguage事件 - 测试时务必重启 VS Code(不是重载窗口),否则旧语言缓存可能残留
真正麻烦的从来不是“怎么加中文”,而是确保每个文案都走对路径:contributes 用 %key%、运行时用 vscode.l10n.t()、打包时文件不丢、用户语言变化时能响应——漏掉任意一环,那个按钮或那条提示就永远卡在英文上。











