在gtk 程式中显示中文说明

(一)应用程式中该做的事情(确定所用mo文档的位置)
首先用函数textdomain配置应用程式的中文信息(mo文档)所在的位置,姑且称为“域”
如:
setlocale( LC_ALL, "zh_CN.GB2312" );
textdomain( "test" ); // 配置代表该应用程式中文信息的名称,默认的“域”名为message
bindtextdomain ( "test", "/usr/local/share/locale"); // 配置信息所在的目录,默认情况下该目录值被配置为/usr/share/locale
这样gettext函数(下面将提到)就会在目录/usr/local/share/locale/zh_CN.GB2312/LC_MESSAGES中去中文信息文档test.mo。
其中***代表程式的locale环境变量对应语言变量LC_MESSAGES的值
......

在gtk 程式中显示中文说明

(一)应用程式中该做的事情(确定所用mo文档的位置)
首先用函数textdomain配置应用程式的中文信息(mo文档)所在的位置,姑且称为“域”
如:
setlocale( LC_ALL, "zh_CN.GB2312" );
textdomain( "test" ); // 配置代表该应用程式中文信息的名称,默认的“域”名为message
bindtextdomain ( "test", "/usr/local/share/locale"); // 配置信息所在的目录,默认情况下该目录值被配置为/usr/share/locale
这样gettext函数(下面将提到)就会在目录/usr/local/share/locale/zh_CN.GB2312/LC_MESSAGES中去中文信息文档test.mo。
其中***代表程式的locale环境变量对应语言变量LC_MESSAGES的值

程式中,每一个将被显示成中文的字符串都必须经过gettext函数处理。
如:
gtk_button_new_with_label( "ok" );
假如要将该按钮的标签名显示成中文,那么必须将这条语句改成 gtk_button_new_with_label( (void*)gettext( "ok" ) );

gettext工作原理
char *str = "string";
gettext( str );
1. 根据locale和textdomain的配置寻找对应mo文档;
if 没找到 then 返回str; else goto 2;
2. 以str串为id找相应的翻译串;
if 没找到 then 返回str; else goto 3;
3. 把翻译串从 编码1 转化成 编码2;
if 转换成功 then 返回经编码转换后的翻译串; else 返回翻译串(或其他?);
编码1:由mo文档的属性charset决定
编码2:由locale决定,如:zh_CN.GB2312决定编码2为GB2312编码

(二)mo文档的制作
1. 根据源程式生成po文档,如:xgettext --keyword="gettext" try.c -o test.po
例:设xgettext程式从文档中找到gettext("pepole"),则在po文档中有如下内容:
msgid "people"
msgstr ""

2. 在po文档中,根据msgid部分填写的msgstr部分,
例:
msgid "people"
msgstr "人民"
注意,如下配置po文档的相应内容:
"Content-Type: text/plain; charset=CHARSET "
"Content-Transfer-Encoding: 8bit "
此处charset为msgstr部分的编码格式,
由于gtk 的文本输入都是UTF-8格式,所以此处用utf-8编码格式编辑po文档(填入msgstr部分的简体中文),并令charset= CHARSET,这样msgstr部分的简体中文被保存为UTF-8编码格式。这样,假如gettext从和该文档对应的mo文档中取出的信息就是简体中 文的UTF-8编码,注意:此处charset=CHARSET则gettext的第三步没有执行,所以返回的是utf-8串(因为文本输入时的编码格式 为utf-8)
Content-Transfer-Encoding暂时将他写做8bit
注:假如此处charset=有效编码,那么由gettext返回的中文编码格式由locale决定,此时还需将gettext的返回中文串转成utf- 8格式,这样就进行了两次编码转换;而假如charset=无效编码,则gettext直接返回中文utf-8串,而没必要进行编码转换,效率更高。
3. 生成mo文档,msgfmt test.po -o test.mo

4. 拷贝mo文档到程式中配置的相应位置/usr/local/share/locale/***/LC_MESSAGES

(三)环境配置
配置好gtk 所用的中文字体,假如所用字体是GB2312编码,那么能够想象gtk是这样工作(实际不是这么处理的,但效果是相同的):将输入的UTF-8编码转化成GB2312码,然后告诉X服务器用 该码 和 该字体文档 显示相应字行.

(四)例子
// try.c文档内容
#include
#include
#define _(str) (void*)gettext(str)

gint delete_event( GtkWidget *win, GdkEvent *e, gpointer arg )
{
g_print( "quite application! " );
return FALSE;
}
void destroy( GtkWidget *win, gpointer arg )
{
g_print( "destroy window! " );
gtk_main_quit();
}
int main( int argc, char *argv[] )
{
GtkWidget *window,*button;
unsigned char *s;

textdomain( "testmo" );
printf( "%s ", bindtextdomain( "testmo", "/usr/share/locale" ) );

gtk_init( &argc, &argv );

window = gtk_window_new( GTK_WINDOW_TOPLEVEL );

g_signal_connect( G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), NULL );
g_signal_connect( G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL );

button = gtk_button_new_with_label( _("ok") );
gtk_container_add( GTK_CONTAINER( window ), button );
gtk_widget_show( button );

gtk_widget_show( window );
gtk_main();
return 0;
}
// 生成po文档,编码方式utf-8
// gcc -E try.c -o temp.c; xgettext temp.c -o test.po; rm -f temp.c

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!