昨天项目要求对一个GTK程序国际化,花了一下午的时间看了相关资料,现在整理制作流程。 一、源码中设置国际化的支持。在main函数添加如下代码,增加国际化的支持。代码中的PACKAGE为程序最后名
昨天项目要求对一个GTK程序国际化,花了一下午的时间看了相关资料,现在整理制作流程。
一、源码中设置国际化的支持。在main函数添加如下代码,增加国际化的支持。代码中的PACKAGE为程序最后名称,用以查找翻译文件。LOCALE为翻译文件所在的文件夹。LOCALE的文件路径为locale/zh_CN/LC_MESSAGES,其中zh_CN为语言,LC_MESSAGES文件夹下保存具体的翻译文件(mo文件)。
这里还需要注意一个问题,我们这里使用的国际化是利用GNU的gettext实现的。gettext在查找当前语言的顺序是LC_ALL ->LC_MESSAGES->LANG。而在windows上LC_*消息是没有的,即setlocale函数在windows系统上没有任何作用的。为了程序的可移植性,应该通过设置环境变量LANG,然后通过setlocale来集成环境变量。
#include <glib/gi18n.h>#include <locale.h>#include <stdlib.h>#define PACKAGE "Dial-Assistant"#define LOCALE "./locale"int main(){ //set locale putenv("LANG=zh_CN.utf8"); setlocale(LC_ALL,""); bindtextdomain(PACKAGE,LOCALE); #ifdef G_OS_WIN32 bind_textdomain_codeset(PACKAGE,"UTF-8"); #endif textdomain(PACKAGE); return 0;}
2.在源码中使用_()替换翻译字符串。如:_("Hello")。下面给出一个示例函数。文件中的_("Dial-Assistant")在没有国际化之前为"Dial-Assistant"。 window=gtk_window_new(GTK_WINDOW_TOPLEVEL); window_main=window; gtk_widget_set_size_request(window,500,500); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); gtk_window_set_icon_from_file(GTK_WINDOW(window),"logo.png",NULL); gtk_window_set_title(GTK_WINDOW(window),_("Dial-Assistant"));
3.使用xgettext提取源码中需要翻译的字段。其中-k表示提取源码中什么样的字符串,如这里是-k_ 表示提取以下划线开始的字符串格式,即提取 _("")中的字符串。-o表示输出文件名。--from-code=utf8表示源文件的字符编码。 xgettext -k_ -o Dial-Assistant.po *.c --from-code=utf8
4.修改po文件。首先修改“Project-Id-Version”字段后面的值,表示版本信息。然后修改“Content-type”字段中的"charset"字段信息,将其修改为“UTF-8”表示输出的字符串信息。然后根据下面的msgid修改msgstr。下面给出一个示例文件(部分)。 "Project-Id-Version: 1.0/n""Report-Msgid-Bugs-To: /n""POT-Creation-Date: 2013-01-04 18:23+0800/n""PO-Revision-Date: 2013-01-04 18:31+0800/n""Last-Translator: FULL NAME <EMAIL@ADDRESS>/n""Language-Team: LANGUAGE <[email protected]>/n""MIME-Version: 1.0/n""Content-Type: text/plain; charset=UTF-8/n""Content-Transfer-Encoding: 8bit/n""X-Generator: Poedit 1.5.4/n"#: ami.c:175msgid "socket error"msgstr "socket错误"
5.使用msgfmt程序生成mo文件。 msgfmt -o Dial-Assistant.mo Dial-Assistant.po
6.创建翻译文件存放文件夹。这里需要注意的是,因为考虑到程序的移植问题,所以建议把翻译文件夹(locale文件夹)存放在本地(这也是在第一步中定位locale文件夹为“./locale”的原因)。 mkdir -pv locale/zh_CN/LC_MESSAGES
7.复制第五步中生成的mo文件到locale/zh_CN/LC_MESSAGES中。 8.测试。如果需要测试,在linux系统下可以通过临时设置环境变量来测试。临时修改环境变量的命令为:
export LANG=zh_CN.UTF-8