GTK区域化语言的一些整理

来源:互联网 发布:实体店和淘宝买家具 编辑:程序博客网 时间:2024/06/16 08:39

linux系统下,以c语言程序为例来实现程序的国际化,即让程序根据Linux系统不同的语言环境的不同来显示出对应该语言的文字,即先让c程序支持国际化然后再进行本地化翻译。

Linux上实现这个过程需要用到xgettextmsgfmt这两个工具:

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的语言环境为要翻译的语言环境:exportLANG=target

并命令行输入:msginit -l target -i name.pot

生成target.po

并对其进行翻译。

生成的.po文件内容如下:

# Chinese translations forPACKAGE package

# PACKAGE 软件包的简体中文翻译.

# Copyright (C) 2011 THEPACKAGE'S COPYRIGHT HOLDER

# This file is distributed underthe same license as the PACKAGE package.

# <rj@server>, 2011.

#

msgid ""

msgstr ""

"Project-Id-Version: PACKAGEVERSION/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翻译中文为例)

创建pot文件,potPortable Object Template的首字母缩写,与po对应的是momoMachine Object的首字母缩写。前者意指原始的字符串文件,一般用于给翻译人员去修改的,后者则是与机器相关的,一般是供程序读取。可以手工创建pot文件,也可以通过xgettext从代码中抽取字符串来产生。这里是用xgettext来产生的:

xgettext–k_ hello.c -o hello.pot

*注意:-k_ 是查找关键字:“_

根据pot产生不同语言的po文件,这里我们先产生一个简体中文的po文件:

exportLANG=zh_CN.UTF-8

msginit-l zh_CN.UTF-8 -i hello.pot

生成文件名会自动和语言一致:zh_CN.po

翻译zh_CN.po里对应的字符串为中文:

msgid"Hello, World!/n"

msgstr"你好,世界!/n"

保存

根据po文件生成mo文件。

msgfmtzh_CN.po -o zh_CN.mo

安装mo文件到系统中:

cp -fzh_CN.mo /usr/share/locale/zh_CN/LC_MESSAGES/foonly.mo

*注:可以自定义路径,但该目录最后几个路径是固定的即.mo文件应该放在该目录之下:/zh_CN/LC_MESSAGES/

在程序中定义LOCALEDIR的路径就是以上路径“/zh_CN/”的上一个目录。

设置环境变量: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/