插件中文不显示因 package.json 中文未置于 contributes 下;ui乱码需检查字体配置与 locale;outputchannel 中文日志需延迟调用;多语言打包需用 vsce --locale zh-cn 且注意大小写。

插件开发时中文字符串不显示?检查 package.json 的 contribution 层级
VSCode 插件里写死的中文提示(比如 command.title、configuration.title)在用户界面不出现,不是翻译没做,而是 VS Code 根本没读到这些字段。常见原因是把中文直接写进 package.json 的顶层或错误位置。
必须确保所有用户可见文本都放在 contributes 下对应 key 里,且不能嵌套在未声明的字段中。例如:
{
"contributes": {
"commands": [{
"command": "myExt.sayHello",
"title": "你好世界" // ✅ 正确:在 contributes.commands 里
}],
"configuration": {
"properties": {
"myExt.greeting": {
"type": "string",
"default": "欢迎使用",
"description": "问候语" // ✅ 正确:description 在 contributes.configuration.properties 下
}
}
}
}
}
如果把 "title": "你好世界" 写在 package.json 顶层,或塞进 activationEvents、scripts 等非 contributes 区域,VS Code 会静默忽略——不会报错,但也不显示。
插件 UI 中文乱码或方块字?验证字体链与 locale 继承
插件弹出的 vscode.window.showInformationMessage("测试中文") 显示为 □□ 或问号,说明渲染层没走通 UTF-8 字体映射。这不是插件代码问题,而是 VS Code 主进程的 locale 和字体配置没生效。
- 先确认 VS Code 本体已正确汉化:
Configure Display Language能选到zh-CN,且菜单是中文 - 检查
settings.json是否设置了"editor.fontFamily",若值为"'Fira Code', 'Consolas', monospace"这类纯西文字体,中文必然 fallback 失败——必须显式加入中文字体,如"'Fira Code', 'Microsoft YaHei', 'PingFang SC', monospace" - Linux 用户注意:
code --enable-features=UseOzonePlatform --ozone-platform=wayland启动后,部分字体配置会被绕过,需额外在~/.profile设置export FONTCONFIG_PATH=/etc/fonts
调试插件时中文日志被截断?console.log 与 outputChannel 编码差异
console.log("调试:参数值为 abc") 在开发者工具 Console 里显示正常,但 outputChannel.appendLine("调试:参数值为 abc") 在输出面板里变成乱码或空行,这是因为两者走不同编码路径。
console.log 直接输出到 Chromium DevTools,用的是 Node.js 进程默认编码;而 outputChannel 是 VS Code 自定义通道,依赖主进程的 locale 初始化顺序。v1.89+ 后,若插件在 locale 加载完成前就调用 appendLine,中文会被丢弃。
- 安全做法:所有
outputChannel.appendLine()调用前加一层判断:if (vscode.env.language === 'zh-cn') { ... } - 更可靠方式:改用
vscode.window.showInformationMessage()或vscode.window.setStatusBarMessage(),它们强制等待 locale 就绪 - 避免在
activate()最开头就写大量中文日志——等vscode.workspace.getConfiguration()返回后再输出
多语言插件打包后中文资源丢失?nls.bundle 不生成或加载失败
用 VS Code 官方 i18n 方案(nls.ts + nls.metadata.json)开发多语言插件,本地调试中文正常,打包发布后用户看到的全是英文 key(如 helloWorld.title),说明 nls.bundle 没打进 vsix。
关键点在于打包命令是否启用国际化构建:
- 必须用
vsce package --no-yarn(不要用npm run package自定义脚本,它常跳过 nls) - 确认
package.json的scripts.package包含--locale zh-cn参数,例如:"vsce package --locale zh-cn" - 检查生成的 vsix 解压后是否存在
node_modules/vscode-nls/lib/nls.bundle.zh-cn.js,没有则说明构建阶段漏了 locale 参数 - Windows 用户特别注意:PowerShell 默认编码是 UTF-16,运行 vsce 前执行
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
真正容易被忽略的是:vsce 构建时不会校验 nls.metadata.json 里声明的语言 ID 是否和实际资源匹配——哪怕你写了 zh-CN(大写 CN),而 VS Code 只认 zh-cn,bundle 就不会加载。











