Go 1.22项目中gotext如何批量处理子包翻译?
解决Go 1.22中
gotext批量处理多包的问题 为什么通配符...无效?
gotext工具的路径匹配逻辑和go build这类命令的...通配符不一样,直接用绝对包路径或者随意的相对路径加...,它没法正确识别并遍历子包——核心是它需要基于模块根目录的上下文来匹配路径。
可行的解决办法
1. 模块根目录下用./...
找到项目里包含go.mod的根目录,在根目录下任意.go文件中添加这条生成指令:
//go:generate gotext extract -outdir=./locales ./...
然后在根目录下运行go generate,gotext会自动遍历所有子包,提取所有翻译标记内容。
2. 子目录里调整相对路径
如果生成指令写在子目录的文件里,需要先回到模块根目录的路径,再加上...。比如你的文件在mainPackage/api下,指令可写成:
//go:generate gotext extract -outdir=../../locales ../../...
这里../../...会从根目录开始遍历所有子包,确保覆盖到所有需要处理的代码。
3. 写脚本批量处理
要是上面的方法仍不生效,直接写个Shell脚本搞定:
创建gen_locales.sh文件:
#!/bin/bash # 遍历所有非vendor目录下的Go子包 find . -type f -name "*.go" ! -path "./vendor/*" | xargs dirname | sort -u | while read pkg; do gotext extract -outdir=./locales "$pkg" done
给脚本添加执行权限:chmod +x gen_locales.sh,然后在.go文件中添加:
//go:generate ./gen_locales.sh
脚本会自动找出所有包含Go文件的子包,逐个调用gotext完成提取。
4. 检查版本和模块配置
确保使用的是Go 1.22自带的gotext工具,而非第三方版本。运行go version确认版本,同时检查go.mod中的模块路径是否正确——模块路径错误会导致包匹配失败。
验证方法
运行go generate后,打开locales/active.en.toml文件,查看是否包含所有子包的翻译文本,若全部覆盖则说明批量处理生效。
内容的提问来源于stack exchange,提问作者maradev21
相关产品推荐
相关产品推荐

