Linux C中实现国际化效果需要用到下面几个函数:
setlocale
bingtextdomain
textdomain
还是通过代码说明,我会尽量将注释写详细些。
#include <stdio.h>
#include <libintl.h>
#include <locale.h>
/*使用宏将gettext包装起来,这样在代码中会省很多事,毕竟要国际化的将不止一处*/
#define _(String) gettext(String)
#define _t(String1,String2, n) ngettext(String1, String2, n)
/*
将国际化功能封装起来
成功返回0,失败返回-1
*/
int domain(char * TEXT )
{
/* setlocale的作用是设置本地信息,这里本地信息可以是指定的某个区域的语言、货币、时间以及其他信息,该函数的第一个参数就是指定设置何种本地信息,第二个参数是指定将该种本地信息设置成什么,暂时弄不懂的话记住需要按照下面这样来上这么一句就好*/
/* 以前查阅相关资料时有的提到“gtk程序不需要这句,因为gtk_init()已经帮我们做了”,我没测试过,如果有谁写gtk程序的话可以测试下*/
if( setlocale( LC_ALL, “” ) == NULL )
return-1;
/* bindtextdomain设置国际化翻译包所在的位置,它有两个参数,第一个参数叫domainname,其作用是指定国际化翻译包的名字;第二个参数是指定“翻译文件”的存放位置
翻译文件是以.mo结尾,此处第二个参数是“.”,那么路径就是如下内容:
./[编码名]/LC_MESSAGES/[domainname].mo
eg:
./zh_CN/LC_MESSAGES/domain.mo
*/
bindtextdomain("domain", "." );
/*textdomain设定国际化翻译包名称,也就是说对哪个程序“国际化”,这里我的程序名是domain.c那么第一个参数就写domain*/
textdomain(“domain” );
//下面的_( “xxxx”)就是对应上面的宏了
printf(_("The text of domain") );
printf( "\n" );
printf(_("Input %s\n"), TEXT );
return 0;
}
int main( int argc, char** argv )
{
domain( argv[1] );
return 0;
}
到此domain.c编写完成。
下面就来生成翻译文件。
首先执行命令:xgettext -k_ -o po名源文件
即:xgettext-k_ -o domain.po domain.c
这样就在当前目录生成了po文件
编辑它,会发现里面有带翻译的内容
msgid "The text of Guojihua"
msgstr ""
msgid "Input %s\n"
msgstr ""
其中msgid就是带翻译的内容,msgstr就是翻译后的内容,根据需要补充即可
msgid"The text of Guojihua"
msgstr "国际化测试"
msgid "Input %s\n"
msgstr "输入的是 %s"
然后执行命令:msgfmt -o “mo文件名” “po文件名”
即:msgfmt -o domain.mo domain.po
诶!出错了。
根据提示改一下domain.po:
第一个警告:
上图第二行改为:
第二个错误:
有没有注意到msgstr中的内容少了个\n,所以改为:
改好后在执行命令:msgfmt -o domain.mo domain.po
这样就在当前目录生成了mo文件。
然后建立翻译包的目录(还记得bindtextdomain的作用么?)
mkdir –p zh_CN/LC_MESSAGES
将生成的mo文件拷贝进去。
然后编译执行吧:
gcc domain.c