Linux下的本地化与国际化 gettext

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux下的本地化与国际化– 2. gettext

GNU gettext 是一套GNU下的国际化工具,几乎支持所有Linux下的计算机语言。在gettext的帮助下,可以轻松完成程序的国际化。

一、相关文件

.pot

po 的模版,可由xgettext生成

.po

翻译的源,可由msginit + .pot生成

.gmo

编译后的po,可由 msgfmt + .po 生成

.mo

同上,只是gmo通常指的是未安装的mo,可由 install + .gmo 生成

二、相关工具

xgettext

从源代码中提取需要翻译的字串,生成pot文件

msginit

替换pot中的Entry信息,如译者,文件编码等

msgmerge

合并现有的.po文件

msgfmt

把.po文件生成.gmo或.mo文件

三、相关函数

bindtextdomain(const char *domain, const char *dirname)

通过domain与dirname绑定mo文件的域

textdomain (const char *domainname)

指定gettext所用的域

gettext(const char *msgid):

由locale与textdomain指定的domain得到翻译后的字串

ngettext(const char *msgid1, const char *msgid2, unsigned long int n): 通过n返回单数的msgid1 或复数的msgid2

dgettext(const char *domain, const char *msgid)

指定domain的gettext

dngettext(const char *domain, const char *msgid, unsigned long int n);

指定domain的ngettext

dcgettext(const char *domain, const char *msgid, int category): 指定domain与category的gettext

dcngettext(const char *domain, const char *msgid1, const char *msgid2, unsigned long int n, int category):

指定domain与category的ngettext

gettext的dirname, locale domain, category, 在磁盘上的结构为

dirname/locale/category/domain.mo

/usr/share/locale/zh_CN/LC_MESSAGES/gettext_demo.mo

默认的category为LC_MESSAGES

四、实例

1. 新建文件 gettext_demo.c

view plaincopy to clipboardprint?

#include

1.#include

2.#include

3.

4.#define _(string) gettext(string)

5.

6.const char *DOMAIN = "gettext_demo";

7.const char *DIRNAME = "languages";

8.

9.int main(int argc, char **argv) {

10.

11./× 设置locale与系统一致 */

12. setlocale(LC_ALL, "");

13.

14./× 添加域 gettext_test 在目录 po */

15. bindtextdomain(DOMAIN, DIRNAME);

16.

17./× 设定默认域为 gettext_test */

18. textdomain(DOMAIN);

19.

20./× gettext(Hello World) */

21. puts(_("Hello"));

22.return 0;

23.}

2. 制作zh_CN.UTF-8的语言包

gettext_demo$ ls

gettext_demo.c

gettext_demo$ mkdir po

gettext_demo$ cd po

由xgettext生成pot

gettext_demo/po$ xgettext -k_ ——package-name gettext_demo ——package-version 0.1 ../×.c -o gettext_demo.pot

gettext_demo/po$ ls

gettext_demo.pot

由gettext_demo.pot生成zh_CN.po

gettext_demo/po$ msginit #因为我的系统locale为zh_CN.UTF-8,因此msginit自动生成针对zh_CN.UTF-8的po

gettext_demo/po$ ls

gettext_demo.pot zh_CN.po

修改po文件

#: ../gettext_demo.c:22

msgid "Hello"

msgstr ""

#: ../gettext_demo.c:22

msgid "Hello"

msgstr "你好"

由zh_CN.po生成zh_CN.mo

gettext_demo/po$ msgfmt zh_CN.po -o zh_CN.mo

gettext_demo/po$ ls

gettext_demo.pot zh_CN.mo zh_CN.po

复制zh_CN.mo到../languages/zh_CN/LC_MESSAGES/gettext_demo.mo gettext_demo/po$ mkdir -p ../languages/zh_CN/LC_MESSAGES

gettext_demo/po$ cp

zh_CN.mo ../languages/zh_CN/LC_MESSAGES/gettext_demo.mo

编译并测试

gettext_demo$ gcc gettext_demo.c -o gettext_demo

gettext_demo$ ls

gettext_demo gettext_demo.c languages po

gettext_demo$ ./gettext_demo

你好

测试英文环境

gettext_demo$ LC_ALL=en_US ./gettext_demo

Hello

如果尝试 LC_ALL=zh_CN.GBK ./gettext_demo 在UTF-8环下显示"乱码",因为显示的是GBK编码,gettext转换到相应的编码了。

当系统发生变化时,添加了新的语句,为此通过工具msgmerge进行和并

修改 gettext_demo.c

相关文档
最新文档