一、简介
软件的国际化Internationalization,在Linux社区中一般简称为i18n(去掉开始的I和最后的N,中间一共18个字符),就是使软件具有适应各国语言环境的能力,这牵涉到软件设计和软件编码的很多方面,包括文字编码、时区设置和时间表示方法、语法顺序、语句翻译、数字表示、货币表示等等,一般情况下工作最多的可能就是对语言翻译的支持。
和国际化对应的,就是本地化Localization,在Linux社区中一般简称为l10n,也就是将软件转换成当地语言的过程。这一般是翻译过程,可能牵涉到少量的编码(当然,如果软件国际化能力不够的情形除外)。
为了支持跨平台,因此微软的国际化模式就不予以考虑。另外找到两个开源的模式,一个是IBM的ICU4C,一个是GNU GetText。由于IBM的ICU4C考虑比较全面,但过于庞大,复杂的东西在应用中总会导致比较多的问题和代价,因此为简单计,在进行软件国际化工作中,我们可以采用GNU的GetText,GNU GetText是Linux下一个比较统一的国际化解决方案。
在Linux下,GetText依赖于Bash, Binutils, Bison, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Sed. 因此,是否适合嵌入式产品,还有待测试。
二、别人的实践经验:
初步试验结果:
1. 必须在代码中使用bindtextdomain设置本地化文件的根路径(即(LANG)\LC_MESSAGES的所在目录)。
2. 在Windows环境下,似乎不用setlocale,即使设置也没有用处,应该继续测试。
3. 直接使用命令行进行转换可能会在调用iconv时有问题,因此直接使用编辑工具poEdit将.po文件翻译并转换到.mo文件。
三、实例代码
#include <stdio.h>
#include <locale.h>
#include <libintl.h>
#define _(string) gettext(string)
int main (int argc, char *argv[])
{
/**告诉该程序到gettext_test.mo中去找其它语言的信息。*/
setlocale (LC_ALL, ""); -------------------------------------------------1
/**到当前目录中的language目录下去找*/
textdomain ("gettext_test");--------------------------------------------2
bindtextdomain ("gettext_test", "language"); ---------------------3
if(argc < 2)
{
printf(_("not enough parameter!\n"));
printf(_("usage: %s username\n"), argv[0]); exit(1);
}
printf (_("welcome to world of gettext, %s!\n"), argv[1]);
return 0;
}
1、将系统运行的语言环境设置为程序运行的环境;
2、告诉该程序到gettext_test.mo中去找输出语言的信息;
3、告诉程序到当前目录的language目录下去找gettext_test.mo文件。
该程序和背景说明章节中的程序有明显的不同是把所有的字符串信息用_()包围起来,实际上是把它们作为gettext()的参数。编译运行该程序,假定该程序名是gettext_test.exe,如果直接运行gettext_test.exe,它会输出英文字符串提示参数不够,给出程序的使用方法。
可是这个国际化还差很远啊,是的,下面还有一系列的工作要作:
1、在源码gettext_test.c的目录下运行xgettext --keyword=_ -o gettext_test.po gettext_test.c,就会得到一个文本文件gettext_test.po。
2、用任意一个文本编辑器,如记事本打开它,跳过前面的一些文件头的信息,会发现程序中所有用_()包含的字符串都以下面的形式出现:
#: gettext_test.c:26
#, c-format
msgid "usage: %s username\n"
msgstr ""
只要在msgstr后面的引号中填入对应语言的翻译即可,例如这一句可以改为:
#: gettext_test.c:26
#, c-format
msgid "usage: %s username\n"
msgstr "使用方法:%s用户名\n"
3、保存好翻译后运行命令:
msgfmt -o language/zh_CN/LC_MESSAGES/gettext_test.mo gettext_test.po。
这样就生成了语言包的二进制格式,根据程序中的设置,
该程序会到当前目录的language子目录中寻找语言包,
所以gettext_test.po最终放置的位置是当前目录
/language/zh_CN/LC_MESSAGES。zh_CN表示中文,
如果你建立了如法文等其它的语言包,还需要建立fr目录等。
转贴:linux软件国际化
最新推荐文章于 2021-07-22 08:35:58 发布