一、背景
想测试一下TRAE实现一个稍微复杂点的cli工具能力怎么样,到底需要经历多少步骤,我选择做一个中文文案提取的cli工具
二、cli工具能力
一个功能完整的 CLI 国际化工具,基于 Node.js 开发,使用 Babel AST 语法树工具来处理代码。以下是该工具的主要功能:
1. 中文文案提取与处理
- 基于 AST 扫描:使用 Babel 相关工具解析代码,提取包含中文的字符串字面量
- 自动生成唯一 key:使用代码所在路径 + 中文文本的 hash 值生成唯一的文案 key
- 跳过已处理文本:智能识别已经被 $t 函数处理过的文本,避免重复处理
- 添加内联注释:在源代码中添加
/* i18n-key: {key} */形式的注释,标记位置 id
2. Locale 文件生成与管理
- 默认生成两套配置:自动生成中文(zh-cn.json)和英文(en.json)两套语言包
- 增量生成:支持增量更新,避免覆盖旧的 locale 文件,只添加新的文案
- 语言包同步:当修改代码中的 key 时,自动更新所有语言包文件中的对应 key
3. 国际化函数实现
- **t(key, defaultValue)` 函数,支持默认值功能
- 中文兜底:当找不到翻译时,使用中文进行兜底
- 多语言支持:支持根据用户语言选择对应的语言包
4. 命令行功能
- extract 命令:提取中文文案并生成 到locale目录下的多语言json文件
trans-cli extract --src ./src --output ./locale - detect 命令:检测并修复 key 不一致的情况,会自动更新关联语言的key
trans-cli detect --src ./src
三、见证奇迹的十二轮对话,整个过程下来大约半小时
第一轮
帮我实现一个cli国际化工具,基于nodejs实现
功能清单:
- 基于babel相关ast语法树工具,对项目的代码进行扫描
- 提取中文文案可key到项目根目录的locale下面,按照zh-cn.json的形式存储文案key到翻译文案的映射,文案key使用代码所在path+中文hash取得
- 针对提取的文案,针对翻译的文案和源代码之前的中文位置,通过内联注释/**/的形式标记位置id,方便后续通过修改locale的翻译文案key,反向修改源代码的key
第二轮
需要实现一个$t语言转化函数,获取用户的语言,然后选择使用对应的语言包,所以需要在每一个识别到中文的文件里面进行导入,替换掉原来中文所在的位置,注意保持对应关系
第三轮
现在重构这个项目的导入方式,基于es6的导入导出来实现,不要使用require
第四轮
继续优化,语言的生成支持采用增量生成,不然新增加的文案会覆盖旧的locale目录
第五轮
locale目录下,支持默认生成中文和英文两套配置,每次文案新增,都需要扫描locale目录,把对应的文案配置,进行对应修改
第六轮
继续优化,$t函数支持,默认展示的中文进行兜底,解决匹配不到的情况
第七轮
t('welcome_message', "你好,世界")
第八轮
生成的$t函数第二个参数值,没有显示中文,请改正
第九轮
现在有一个场景: const name = $t("test.js_b8bdf", "小明") /* i18n-key: test.js_b8bdf */;
如果我改了$t里面的 test.js_b8bdf 这个key变成testNewKey, 首先程序会通过/* i18n-key: test.js_b8bdf / 去locale里面的全部语言包的test.js_b8bdf全部修改成testNewKey 然后将之前添加的位置注释 / i18n-key: test.js_b8bdf /; 更新成 / i18n-key: testNewKey*/;
第十轮
思路是对的,但是我期望的是,我直接修改代码里面的文案key,你能扫描出来,识别到文案$t里面的ket和注释标记的i18n-key不一致的场景后,去全局替换并更新,最后在package.json里面帮我添加一个检测重命名的执行脚本
第十一轮
优化逻辑 如果已经被语言函数转化过,则跳过 ,比如 const name = $t('test.js_9f61d', '你好');
这种场景,不应该被重复处理
第十二轮
在现有功能基础上优化,我在执行detect脚本的时候,发现 const age = $t('test.hhhhhhh', '哈'); /* i18n-key: test.js_54c8 */
这个并没有被扫描到,应正确识别test.hhhhhhh和test.js_54c8不一致,然后去locale下面把全部语言包的test.js_54c8都更新成test.hhhhhhh
最后
我使用了TRAE搭配Doubao-Seed-Code模型,十二轮Agent对话,实现了我的项目国际化文案扫描提取工具,cli工具结果验证可用,全程几乎没写代码,全程半小时不到,我的体验是,相比较于写代码的速度,我们没法去和AI竞争,但是,你知道要去做什么,这,其实更重要!我想感谢布兰登·艾奇,这位javascript创始人,给了我们前端赖以生存的工具,人们常说AI让程序员们处于水深火热,但是我更希望,AI的发展让我们变成更强的自己。
介绍下工作流程
- 初始化:运行
extract命令提取中文文案并生成语言包 - 开发:在代码中使用
$t('key', '默认值')形式的调用 - 维护:当需要修改 key 时,直接修改代码中的 key,然后运行
detect命令自动更新所有相关文件 - 翻译:在生成的语言包文件中添加对应的翻译
该工具的实现确保了国际化过程的自动化和一致性,提高了开发效率,减少了人工操作的错误率。