离线安装vscode中文包报“依赖错误”实为误判,本质是签名校验、版本不匹配或locale.json配置错误;需修改package.json中engines.vscode字段、确保locale.json路径正确且值为"zh-cn"、并确认vs code版本≥1.76以启用vs/nls.js模块。

离线安装 VSCode 中文语言包失败时提示“依赖错误”,基本不是真有依赖,而是 VS Code 把官方语言包误判为“需联网验证的扩展”——它其实没有运行时依赖,但校验流程卡在签名、版本或加载路径上。
为什么装中文包会报“依赖错误”
VS Code 1.85+ 后,MS-CEINTL.vscode-language-pack-zh-hans 不再走普通插件加载路径,而是由内置 vs/nls.js 模块接管。一旦它没被激活(比如旧版 VS Code ≤1.75)、或语言包结构被破坏、或 locale 配置未写入 locale.json,VS Code 就会 fallback 到扩展加载器,并错误地抛出“依赖不满足”这类模糊提示。
- 这不是 npm 式的依赖缺失,没有
package.json里 missing peer dep 那种逻辑 - 常见假依赖错误包括:
Extension 'MS-CEINTL.vscode-language-pack-zh-hans' is not compatible with Code '1.91.0'、Cannot read property 'localize' of undefined(本质是nls.js没注入) - 第三方汉化包(如发布者非
MS-CEINTL)会直接触发此错误,因为它们没声明contributes.localizations
检查 locale.json 是否存在且格式正确
VS Code 只认 locale.json 文件里的 {"locale": "zh-cn"},其他任何地方写的 "locale" 都无效。这个文件必须存在、合法、且值严格小写。
- 路径必须准确:
Windows:%APPDATA%\Code\User\locale.json
macOS:~/Library/Application Support/Code/User/locale.json
Linux:~/.config/Code/User/locale.json - 内容只能是纯 JSON:
{"locale": "zh-cn"}—— 不能多逗号、不能用单引号、不能写成"zh_CN"或"zh-hans" - 如果文件被 IT 策略工具、远程开发配置或工作区设置覆盖,临时关闭文件夹(
File > Close Folder)再执行Configure Display Language命令可绕过
修复 .vsix 版本不匹配导致的“依赖”假象
报错 not compatible with Code 的本质是 package.json 里 "engines": {"vscode": "^1.85.0"} 和你本地 code --version 输出的主版本号不满足语义化匹配。这不是依赖问题,是硬性版本锁。
- 用
unzip -l MS-CEINTL.vscode-language-pack-zh-hans-1.90.2.vsix确认根目录含extension/package.json - 解压后打开该文件,把
"^1.85.0"改成你本地版本的主版本号(如code --version输出1.91.0,就改成"^1.91.0") - 重新打包必须用
zip -r new.vsix extension/(Linux/macOS)或 7-Zip(Windows),别用资源管理器拖放重命名,会破坏 ZIP 结构
确认 vs/nls.js 已启用且无系统级拦截
语言包生效的前提是 VS Code 启动时注入了国际化运行时模块 vs/nls.js。这个模块在 VS Code ≤1.75 默认关闭,1.76+ 才默认启用。老旧内网镜像部署的版本常卡在这里。
- 打开 Help → About,看版本号是否 ≥ 1.76;低于则升级,别试图打补丁
- Windows 上若系统区域设为英语且启用了 “Beta: Use Unicode UTF-8”,VS Code 会跳过语言包加载——关掉该选项再试
- macOS/Linux 下检查终端里
echo $LANG是否为en_US.UTF-8类值,它可能覆盖 VS Code 自动探测;临时改用LANG=zh_CN.UTF-8 code启动可验证 - 双击桌面快捷方式可能启动旧实例;关掉所有
Code Helper进程,再从开始菜单/应用坞启动
真正难搞的不是安装步骤,而是 VS Code 对语言包的加载机制藏得太深:它不报具体错,只甩一个“依赖错误”,实际可能是 locale.json 被覆盖、nls.js 没注入、或系统区域设置在底层劫持了启动链路。排查时得一层层切进去,不能只盯着 .vsix 文件本身。











