前言
最近在打算看opencode源码,起因是在opencode桌面端设置了一个本地服务器之后,opencode起不来了😂,问了deepseek之后还是没有找到原因(最后找到原因了,跟我的服务器没关系,我的一个项目.opencode目录下自定义了opencode.json文件,我按照v2的语法写的,但是我的opencode还是v1,所以识别配置错误),我猜想设置了服务器之后应该会将配置保存在本地,但是我找不到😂。正好拉取了opencode的源码,就打算看看源码找一下,但是最后也没找到😂😂。
虽然还没有找到(暂时😀),但是在阅读的过程遇到了一个小卡点,虽然之前是使用过i8n,但是并不是在monorepo架构下,而且使用的不是@solid-primitives/i18n,同时语言映射文件是用ts写的而不是json。如果你的架构是Monorepo或者是TS语法语言包,可以参考我的解决方案。
前置工作
插件
我使用的是vscode,使用的插件是i18n Ally Next。直接在vscode的插件市场搜索下载就行,安装最新版就行。需要注意的是如果加载不出来插件市场,看看自己是否开启了VPN,关掉VPN就可以正常加载了,如果还不行,尝试手动下载配置吧,教程网上都有。
日志观察工具
在vscode中使用快捷键ctrl+shift+U,快速打开output面板,然后选择i18N Ally Next,就会输出插件的日志。在这里观察插件是否出现问题啥的。
检查插件依赖
打开插件依赖安装路径,一般是这个路径,如果没有特别设置的话C:\Users\{用户名}\.vscode\extensions\lydanne.i18n-ally-next-3.0.15\node_modules。查看这个目录下有没有ts-node,如果没有的话直接在这个目录下手动安装,我安装的版本是10.9.2。
然后在vscode设置中搜索i18n查看ts-node的路径是否设置正确,不然也识别不到。
配置
配置i18n-ally-next-custom-framework.yml文件
在项目根目录下的.vscode中配置文件.vscode\i18n-ally-next-custom-framework.yml,注意是monorepo项目的根目录下,这个文件的内容可以让AI帮你生成。
# 定义在哪些文件类型中检测翻译键 languageIds: - typescript - typescriptreact - javascript - javascriptreact # 匹配 @solid-primitives/i18n 的 t('key') 调用 usageMatchRegex: - "[^\\w\\d]t\\(\\s*['\"`]({key})['\"`]" # 定义一键提取硬编码字符串时生成的代码模板 refactorTemplates: - "t('$1')" # 假设你未使用命名空间 namespace: false然后要注意namespace字段,如果说语言包是嵌套的就需要设置为true,如果是平铺的设置为false。
配置settings.json文件
也是在项目根目录下配置.vscode\settings.json,这个文件也是让AI生成就行,不过你要知道每个字段代表的意思,不然错了也看不出来,如果说语言包不是平铺的那么还要设置namespace字段,同时pathMatcher字段也要变。
{ // 国际化语言文件所在目录(相对于项目根目录) "i18n-ally-next.localesPaths": [ "packages/app/src/i18n" ], // 启用哪些文件解析器来提取和读取翻译键 "i18n-ally-next.enabledParsers": ["ts", "tsx", "json"], // 语言文件的命名匹配规则:{locale}.{ext} // 例如 en.json、zh.ts、en.tsx 等 "i18n-ally-next.pathMatcher": "{locale}.{ext}", // 翻译键的嵌套风格:nested 表示嵌套对象 "i18n-ally-next.keystyle": "nested", // 源语言(默认语言),即编写代码时使用的语言 "i18n-ally-next.sourceLanguage": "en", // 在编辑器中显示翻译时使用的语言(例如悬停提示、内联显示) "i18n-ally-next.displayLanguage": "zh" }修改package.json和语言包
对于你想要翻译的项目的package.json文件,删除type:module字段。
同时对于语言映射文件必须使用export default导出,不要用命名导出。opencode使用的是命名导出,自己手动改一下源码就行。
原来的
改成
检查
首先检查output面板插件是否正常输出日志了,首先看是否正常加载了我们之前配置的文件,是否解析并加载正确语言包地址,最后查看语言包文件是否正确识别了。
然后去代码里看是否把翻译嵌入了。
如果没有成功,可能是识别出错了,可以尝试去设置里面设置一下源语言和目标语言。注意源语言和目标语言必须和语言映射文件名一样,比如zh.ts则为zh,ar.ts则为ar