2009-12-17(Thu)

Linux 国际化编程

Linux 国际化编程

gettext 是 GNU 国际化与本地化 (i18n) 函数库。正常的情况下GNU/LINUX系统是默认安装这一软件包的。
程序源代码需要进行修改以响应 GNU gettext 请求。多数编程语言均已通过字符封装的方式实现了对其的支持。

为了减少输入量和代码量,此功能通常以标记别名 _ 的形式使用,所以例如以下 C语言代码:
printf(gettext("Hello World!\n"));
应当写作:
printf(_("Hello World!\n"));

具体代码实现

①首先加入相关头文件:
#include <libintl.h> // gettext支持
#include <locale.h> // locale支持


②然后是定义宏:
#define PACKAGE "helloworld" // 软件包名
#define LOCALEDIR "./locale" // locale目录
#define _(string) gettext(string)
#define N_(string) string


③在主函数中加入相关函数:
// 设置locale为系统默认,gtk程序不需要这句。因为gtk_init()已经帮我们做了。
// setlocale (LC_ALL, "");
// 设定国际化翻译包所在位置
bindtextdomain(PACKAGE,LOCALEDIR);
// 设定国际化翻译包名称,省略.mo
textdomain(PACKAGE);


④相关字符串修改
将代码中需要国际化的字符串改写为_()宏,代码如下:
gtk_window_set_title(GTK_WINDOW(window),_("Hello World!"));

⑤生成相关文件与翻译
完成以上修改后,执行命令:xgettext -k_ -o po文件 源文件,它的功能是将源文件中的以下划线开始的括号中的字符串加入到po文件中。

po文件的头部可以加入软件 包的名称、版本、翻译者的邮件地址等,po文件中以#开始的行为注释内容, msgid后面的内容为英文,msgstr后面的内容为翻译的中文,翻译好后保存为UTF8格式。

msgid "Hello World!"
msgstr "你好世界!"


执行命令:msgfmt -o mo文件 po文件,将po文件格式化为mo文件,这样程序在运行时就能根据当前locale的设定来正确读取mo文件中的数据,从而显示关语言的信息 了。
关于mo文件的位置,本程序设在./locale目录下的中文目录zh_CN下的LC_MESSAGES目录下,即. /locale/zh_CN/LC_MESSAGES 目录下,在REDHAT中默认的目录是/usr/share/locale。

将此步骤生成的mo文件复制到相应的目录下,将locale设为简体中文,运行程序,测试结果就为中文,如locale设为英文则显示英文信息。

附加内容
含有变量的文本国际化,以下是一种方法,和没有参数没有太大不同。
示例如下:

主函数:
int main(int argc, char *argv[])
{
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain("test");
printf(_("Hello, %s.\n"), _("XiaoWang"));
return 0;
}


PO文件:
msgid "Hello, %s.\n"
msgstr "喂,%s。\n"
msgid "XiaoWang"
msgstr "小王"


注意点
英文的单复数,例如 “%d apple(s)”,可能是 1 apple 或 2 apples。
需要的时候请参照ngettext()函数。

trackback url


引用此文章(FC2博客用户)

trackback

发表留言

只对管理员显示

留言

自我介绍

riuliyu

Author:riuliyu
欢迎来到 FC2 博客

最新文章
最新留言
最新引用
月份存档
类别
FC2 Counter
搜索栏
RSS链接
链接
加为好友

和此人成为好友