在linux系统下,以c语言程序为例来实现程序的国际化,即让程序根据Linux系统不同的语言环境的不同来显示出对应该语言的文字,即先让c程序支持国际化然后再进行本地化翻译。
Linux上实现这个过程需要用到xgettext和msgfmt这两个工具:
Xgettext 是国际化的工具,用来提取程序中的字符串,生成*.po或是*.pot的文件,
msgfmt 是本地化的工具,用来编译翻译后的.po文件为.mo文件,这样系统在启动时候会扫描系统环境提取对应名字的.mo文件中的字符串替代原来的英文,实现本地化。在加载不同的言语环境变量(LANG)时,可以出翻译相应的语言。
1、 实际操作:
1) 在有需要进行翻译的文件中加入头文件:
#include <glib/gi18n.h>
2) 并添加如下定义:
#define PACKAGE "name" //name为相应翻译包name.mo的名称
#define LOCALEDIR "/usr/share/locale/" //此行不变
3) 在要翻译的位置之前添加此内容:
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
4) 对要进行翻译的内容加上:_()
例如要将button = gtk_button_new_with_label ("Hello World!");中的Hello World! 翻译为:你好,世界!则改为:button = gtk_button_new_with_label (_("Hello World!"));
5)命令行输入:xgettext –k_ name.c -o name.pot
或xgettext –k--keyword =_ name.c -o name.pot
生成name.pot 文件
6) 改变当前shell的语言环境为要翻译的语言环境:export LANG=target
并命令行输入:msginit -l target -i name.pot
生成target.po
并对其进行翻译。
生成的.po文件内容如下:
# Chinese translations for PACKAGE package
# PACKAGE 软件包的简体中文翻译.
# Copyright (C) 2011 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# <rj@server>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION/n"
"Report-Msgid-Bugs-To: /n"
"POT-Creation-Date: 2011-04-02 16:21+0800/n"
"PO-Revision-Date: 2011-04-02 16:21+0800/n"
"Last-Translator: JieRen <renjiedona@hotmail.com>/n"
"Language-Team: Chinese (simplified)/n"
"MIME-Version: 1.0/n"
"Content-Type: text/plain; charset=UTF-8/n"
"Content-Transfer-Encoding: 8bit/n"
"Language: zh_CN/n"
#: hello.c:67
#: hello.c:76
#: hello.c:126
msgid "Hello World!"
msgstr "你好世界!"//此处为要翻译的内容,在此翻译后保存即可。
7)命令行:msgfmt target.po -o target.mo
生成最终要的翻译包,再复制到usr/share/locale/**/LC_MESSAGES/
**为对应的语言,如简体中文为:zh_CN
8) 完成本地化工作。
9) 第6条以后的内容可以用工具(poedit)等完成。
10) 相关头文件:
#include <glib/gi18n.h>//包含了locale 所需的(#include <libintl.h>、#include <locale.h>)
2、
3、 相关头文件:
#include <glib/gi18n.h>//包含了locale 所需的(#include <libintl.h>、#include <locale.h> 及_()的定义)
//与文件读写相关的头文件
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
4、生成各文件用途:
.pot 该文件是从代码中生成的原始翻译文件,它是生成所有其它 .po 文件的源文件。
.po 由.po 文件生成,该文件是翻译人员进行翻译的文档,即直接在该文件中翻译,保存。
.mo 该文件是最后要得到的翻译文件。里面包含要翻译的内容和相关语言参数。
5、 步骤(以hello.c翻译中文为例)
l 创建pot文件,pot是Portable Object Template的首字母缩写,与po对应的是mo,mo是Machine Object的首字母缩写。前者意指原始的字符串文件,一般用于给翻译人员去修改的,后者则是与机器相关的,一般是供程序读取。可以手工创建pot文件,也可以通过xgettext从代码中抽取字符串来产生。这里是用xgettext来产生的:
xgettext –k_ hello.c -o hello.pot
*注意:-k_ 是查找关键字:“_”
l 根据pot产生不同语言的po文件,这里我们先产生一个简体中文的po文件:
export LANG=zh_CN.UTF-8
msginit -l zh_CN.UTF-8 -i hello.pot
生成文件名会自动和语言一致:zh_CN.po
l 翻译zh_CN.po里对应的字符串为中文:
msgid "Hello, World!/n"
msgstr "你好,世界!/n"
保存
l 根据po文件生成mo文件。
msgfmt zh_CN.po -o zh_CN.mo
l 安装mo文件到系统中:
cp -f zh_CN.mo /usr/share/locale/zh_CN/LC_MESSAGES/foonly.mo
*注:可以自定义路径,但该目录最后几个路径是固定的即.mo文件应该放在该目录之下:…/zh_CN/LC_MESSAGES/
在程序中定义LOCALEDIR的路径就是以上路径“/zh_CN/”的上一个目录。
l 设置环境变量:export LANG=……
通过不同环境变量,显示不同语言。
详细请参考《语言国际化.pdf》
建立多语言翻译时,要建立对应语言的文件目录:例如台语:…/zh_TW/LC_MESSAGES/
参考资料:
http://www.gnu.org/software/gettext/manual/gettext.html#Top
http://l10n.gnome.org/languages/
http://www.ibm.com/developerworks/cn/opensource/os-unicode/