ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

VSCode插件开发国际化实战:用TaoToken统一Key打通多语言配置链路

VSCode插件开发国际化实战:用TaoToken统一Key打通多语言配置链路 1. VSCode 插件国际化到底难在哪VSCode 插件开发里国际化i18n经常被放到最后才做结果就是命令面板里一堆硬编码英文中文用户看到「Greet」完全不知道是干嘛的。更麻烦的是插件不止有界面文案还有package.json里声明的命令标题、配置项描述、设置面板里的枚举值这些地方如果各写各的维护起来就是灾难。我这次要解决的核心问题是让插件的命令标题、通知消息、配置项描述全部走同一套 message id并且运行时根据 VSCode 当前语言自动切换语言包。同时插件里如果调用了大模型能力比如做代码补全、注释生成Key 的管理也要统一不能每个环境写一份。所以这篇会把两件事串起来讲一是 VSCode 官方的 l10n 机制怎么落地二是用 TaoToken 的统一 Key 把多语言配置链路里的模型调用也收口。适合谁看已经能跑通yo code生成插件、想让插件支持中英文切换、并且插件里有模型调用需求的开发者。下面所有配置和代码都可以直接复制到你的工程里改。2. 前置准备TaoToken 统一 Key 与工程骨架先说 Key 这块。插件里如果要做 AI 相关功能最怕的是把 Key 硬编码进extension.ts一旦提交到仓库就泄露。我的做法是插件运行时从 VSCode 的settings.json或环境变量读取 Key而这个 Key 统一由 TaoToken 控制台管理。你可以先到 TaoToken 控制台创建一个 API Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。创建完之后在插件里通过vscode.workspace.getConfiguration读取这样开发、测试、发布三个环境的 Key 可以分别配置不用改代码。工程骨架还是用官方生成器npm install -g yo generator-code yo code选择New Extension (TypeScript)工程名假设为i18n-demopublisher 填你自己的比如dteam。生成完之后目录结构大致是i18n-demo/ ├── package.json ├── src/ │ └── extension.ts ├── tsconfig.json └── .vscode/ └── launch.json接下来要做三件事在package.json里声明 l10n、创建语言包文件、写一个读取 Key 的配置读取函数。这三步做完国际化链路和 Key 链路就都通了。3. 可复制配置l10n 声明、语言包与 settings 片段3.1 package.json 里的 l10n 声明VSCode 从 1.73 开始原生支持l10n字段比早期复制localize.ts的做法干净很多。在package.json顶层加{ name: i18n-demo, publisher: dteam, version: 0.0.1, engines: { vscode: ^1.73.0 }, l10n: ./l10n, main: ./out/extension.js, contributes: { commands: [ { command: i18n-demo.greet, title: %command.greet.title% } ], configuration: { title: %config.title%, properties: { i18n-demo.apiKey: { type: string, default: , description: %config.apiKey.description% }, i18n-demo.model: { type: string, default: claude-3-5-sonnet, enum: [claude-3-5-sonnet, gpt-4o-mini], description: %config.model.description% } } } } }注意l10n指向的是./l10n目录不是根目录。这是官方约定语言包放在这个目录下文件名格式是bundle.l10n.{locale}.json。3.2 语言包文件在工程根目录建l10n文件夹放两个文件。l10n/bundle.l10n.json英文默认{ command.greet.title: Greet, config.title: I18N Demo, config.apiKey.description: API Key for model access, managed by TaoToken, config.model.description: Model used for code completion, message.greet: Hello, {0}! Current locale is {1}. }l10n/bundle.l10n.zh-cn.json中文{ command.greet.title: 问候, config.title: 国际化示例, config.apiKey.description: 模型访问用的 API Key由 TaoToken 统一管理, config.model.description: 用于代码补全的模型, message.greet: 你好{0}当前语言是 {1}。 }这里有个细节package.json里的%command.greet.title%这种占位符VSCode 会去package.nls.json和package.nls.zh-cn.json里找而不是bundle.l10n.*.json。所以命令标题和配置描述需要单独放一份package.nls.json{ command.greet.title: Greet, config.title: I18N Demo, config.apiKey.description: API Key for model access, managed by TaoToken, config.model.description: Model used for code completion }package.nls.zh-cn.json{ command.greet.title: 问候, config.title: 国际化示例, config.apiKey.description: 模型访问用的 API Key由 TaoToken 统一管理, config.model.description: 用于代码补全的模型 }两套文件看起来重复但职责不同package.nls.*.json管的是package.json里的静态声明bundle.l10n.*.json管的是运行时代码里的vscode.l10n.t()。这个区分是新手最容易踩的坑后面排障会再讲。3.3 settings.json 片段在用户或工作区的settings.json里配置 Key 和模型{ i18n-demo.apiKey: sk-你的TaoTokenKey, i18n-demo.model: claude-3-5-sonnet }如果你不想把 Key 写进 settings也可以用环境变量兜底。插件里读取逻辑这样写import * as vscode from vscode; export function getApiKey(): string { const config vscode.workspace.getConfiguration(i18n-demo); const fromConfig config.getstring(apiKey); if (fromConfig fromConfig.trim().length 0) { return fromConfig.trim(); } return process.env.TAOTOKEN_API_KEY ?? ; }这样 CI 环境里注入TAOTOKEN_API_KEY本地开发用 settings互不干扰。4. 运行时加载与验证切换语言看提示文案是否生效4.1 extension.ts 里的调用import * as vscode from vscode; import { getApiKey } from ./config; export function activate(context: vscode.ExtensionContext) { const disposable vscode.commands.registerCommand(i18n-demo.greet, async () { const locale vscode.env.language; const userName process.env.USERNAME ?? process.env.USER ?? developer; const message vscode.l10n.t(message.greet, userName, locale); vscode.window.showInformationMessage(message); const apiKey getApiKey(); if (!apiKey) { vscode.window.showWarningMessage( vscode.l10n.t(config.apiKey.description) ); return; } // 这里可以继续调用模型接口Key 已统一从配置读取 }); context.subscriptions.push(disposable); }vscode.l10n.t()的第一个参数是 message id后面的参数会按{0}、{1}顺序替换。注意vscode.env.language返回的是zh-cn、en这种小写带连字符的格式和语言包文件名后缀要对应上。4.2 验证步骤按 F5 启动 Extension Development Host然后第一步在命令面板输入Greet或问候看命令标题是否跟随语言变化。如果当前 VSCode 是中文应该显示「问候」英文则显示「Greet」。第二步执行命令看通知框。中文环境下应该显示「你好developer当前语言是 zh-cn。」英文环境显示「Hello, developer! Current locale is en.」。第三步切换语言验证。按CtrlShiftP打开命令面板输入Configure Display Language选择中文(简体)或English重启 VSCode 后再执行一次命令确认文案跟着变。第四步打开设置面板搜索i18n-demo看配置项的标题和描述是否也切换了语言。这一步验证的是package.nls.*.json是否生效。如果这四步都通过说明国际化链路和 Key 读取链路都通了。模型调用部分你可以把getApiKey()拿到的 Key 放到请求头里接口地址用 https://taotoken.net/api 具体模型名和参数可以参考接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。5. 本篇常见错排查错误一命令标题显示成%command.greet.title%原文。原因是package.nls.json没放对位置。它必须和package.json同级不能放进l10n目录。l10n目录只放bundle.l10n.*.json。错误二运行时vscode.l10n.t()返回的还是 message id。检查package.json里l10n字段是否指向./l10n以及语言包文件名是否是bundle.l10n.zh-cn.json这种格式。另外vscode.l10n.t()在 Extension Development Host 里需要 VSCode 版本 ≥ 1.73低版本不认这个 API。错误三切换语言后配置描述没变。package.nls.*.json的加载时机是 VSCode 启动时改完语言必须重启窗口热重载不生效。这一点和运行时代码里的l10n.t()不一样后者是每次调用时查表。错误四Key 读不到一直走 warning 分支。先确认settings.json里的 key 是i18n-demo.apiKey和package.json里configuration.properties的字段名完全一致。如果用的是环境变量注意process.env在 Extension Host 里能读到但打包成 vsix 安装后环境变量取决于启动 VSCode 的终端不是系统全局变量。错误五中文语言包不生效但英文正常。检查文件名后缀。VSCode 用的是zh-cn而不是zh-CN大小写敏感。如果你系统语言是zh-tw那还得单独加bundle.l10n.zh-tw.json否则会回退到默认英文。6. 把 Key 和语言包收口到一条链路走到这里插件的多语言文案和模型 Key 其实已经收口到两个地方语言包文件管文案TaoToken 控制台管 Key。后续要加新语言只需要在l10n目录和根目录各加一组文件代码里不用动。要换模型或换 Key改 settings 或环境变量就行不用重新打包插件。如果你还在本地调试阶段想先验证模型返回是否符合预期可以直接用模型对话页面试一下 prompt 和参数地址是 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。确认没问题再写进插件代码能省不少反复打包的时间。长期做插件开发、经常要跑 Agent 类任务的可以看下 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 把 Key 和额度统一管理比每个插件单独申请省事。API Key 的创建和管理入口在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 接入细节以官方文档为准。最后留一个我踩过的坑l10n目录如果被.vscodeignore排除了打包出来的 vsix 安装后语言包会丢失命令标题直接显示占位符。检查一下.vscodeignore里有没有l10n/**这种规则有的话删掉。
返回列表