概要
GNU gettext是一组支持多语言转换的工具,在我们平常的项目中,源代码中的交互语句基本是英文编写,涉及用户交互时,比如UI进行业务配置时的一些结果提示,通常会由后端返回,返回前经由gettext转换为本地母语提供给前端进行展示。
本文会利用较底层的 一些工具,阐述 gettext 不可用 ,诸如 翻译语言不对,语言乱码等问题时的定位手段。即使非linux开发人员,也可以通过本文分享的思路找到解决办法。
问题现象
发送错误消息给前台,前台收到的信息是原始英文的信息,未进行中文翻译
定位过程
1、先翻阅代码,确认英文对应的转换 是否加入 po文件或者 加入有误,比如中英文符号的不一致,这种错误简单排查就能排除点
2、如果1未发现问题,那大概率是环境配置问题,或者软件包安装问题,那怎么定位呢?这里推荐使用linux 下的 strace 神器, strace 是一个集诊断、调试、统计与一体的工具,基本所有发现版本都能直接使用
如下截图使用 strace 命令追踪gettext的底层调用 (strace gettext --domain=msg "要翻译的英文句子"),可以看到 报了一堆 ENOENT 错误,结合ENOENT 所在行 整行来看,就是找不到/usr/lib/local/zh_CN目录下的语言集 。
3、在后台服务所属服务器上查看上边报错的的目录,可以看到 没有zh_CN 等等这些目录,但是有一个 locale-archive 文件,这个文件是 编译好的 语言集文件 , 各个平台的语言集文件不一样,我使用的ubuntu系统,那我们需要编译ubuntu 平台对应的语言集
4、ubuntu 平台语言集是根据/etc/local.gen配置文件决定的,不同平台的语言配置文件可以自行查阅,从如下图可以看到,改平台语言集配置文件只支持en_US.UTF-8 UTF-8
可以根据我们需要放开对应的配置,根据项目需要,放开了en_US.UTF-8 和 zh_CN.GB2312 和zh_CN.UTF-8
执行locale-gen, 编译语言集,可以看到编译后,会打印我们放开的语言集
5、编译完的语言集会放在如下目录,可以根据项目需要拷贝走放到自己代码里,安装部署时,再放置到通编译平台系统相同的目标平台
6、到目前为止,我们需要的语言集已经准备好了,代码使用过程中根据需要,配置支持的语言集即可
7、如果代码不是像第6步贴图中 能明确指定需要的语言集,而是整个进程默认的,那需要明确使用gettext 进程的语系环境变量(可以使用 cat /proc/pid/environ 来查看进程配置的环境变量)
总结
以上虽然看似是一个具体问题的定位过程,实际是一个通用的定位方法,不过再哪个代码层面 碰到gettext 不好使,可以使用strace工具查看是否 工具或环境有问题, 无问题情况下,可以比对使用的语言集与配置语言集差异,再无问题可以进一步查看进程的语系等。基本gettext的问题都脱离不了这些范围