Linux C实现国际化

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

Linux C实现国际化_第1张图片

你可能感兴趣的:(Linux C实现国际化)