Linux下的本地化与国际化 gettext
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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