在Linux程序中实现国际化/本地化

时间:2023-01-18 19:41:46

国际化

程序的国际化/本地化是指根据用户语言和区域的不同程序可以使用针对用户的交互信息。如,中文用户,则语言会变成中文,时间会显示北京时间,货币会显示RMB。

Linux 下 Gnu/gettext 工具套件可以完成语言(message)的本地化/国际化。gettext的官方手册 :http://www.gnu.org/software/gettext/manual/gettext.html

gettext套件包括如下工具:

  • gettext : 进行translate,根据LC_MESSAGES环境变量的值和TEXTDOMAIN查找字串对应的本地表示。
  • xgettext : 从程序中抽取调用gettext进行本地化的字符串,生成一份.po结尾的配置文件。
  • msgfmt : 将配置好的本地化配置文件进行转换成gettext使用的格式。
  • msgmerge:合并已有的两份.po文件
  • msgunfmt:从msgfmt生成的.mo文件生成.po配置文件
  • etc.
使用gettext套件进行本地化的步骤:
  1. 程序编写的时候,在程序开始的地方配置gettext:
    setlocale(lc_ALL,""); /* "" 空串,则会根据运行时环境变量的情况决定 */
    bindtextdomain('myapp','/usr/local/share/locale')
    textdomain('myapp');
  2. 需要本地化的地方调用gettext库函数。如:printf (gettext("hello,world"));代替:printf ("hello,world");  可以使用define宏定义为_(),等于使用gettext(),因而可以简写为(几乎所有程序都这么做):printf (_("hello,world"));
  3. 使用xgettext工具处理程序,从中抽取出gettext调用的字符串:xgettext -L c -o zh_CN.po myprogram.c。如果在多文件的程序中,通常使用如下方式获得:find deja-dup/ -name "*.vala" > po/POTFILES.in。然后:xgettext -f POTFILES.in -d zh_CN --keyword=_ --keyword=N_ --from-code=UTF-8
  4. 使用msgfmt工具将配置文件转换成gettext使用的格式:msgfmt -o /usr/local/share/locale/zh_CN/LC_MESSAGES/myapp.mo zh_CN.po
其他:
有时候可能找到一个其他人翻译的.mo文件,而你又想要修改它,此时可以通过msgunfmt将.mo文件转换为.po文件,然后使用poedit等程序进行修改.