GNU gettext 不可用深度定位

概要

        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的问题都脱离不了这些范围

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值