在gtk+程序中显示中文说明

 在gtk+程序中显示中文说明
简单地说,gtk只认utf8编码,由glibc负责转换编码到utf8编码或直接用utf8编码。
(一)应用程序中该做的事情(确定所用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
// 或者 xgettext --keyword=_ try.c -o test.po更方便,默认的keyword是gettext,此处增加keyword _
// 翻译po文件(以utf-8编码格式填写),运行msgfmt test.po test.mo
// charset=无效编码名,即:CHARSET为无效编码名。可有程序iconv --list查看支持的编码名
// 拷贝test.mo文件到/usr/share/locale/zh_CN.GB2312/LC_MESSAGES目录下
// 已翻译的po文件的内容
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION
"
"POT-Creation-Date: 2005-03-07 20:31-0500
"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
"
"Last-Translator: FULL NAME 
"
"Language-Team: LANGUAGE 
"
"MIME-Version: 1.0
"
"Content-Type: text/plain; charset=CHARSET
"
"Content-Transfer-Encoding: 8bit
"
#: try.c:31
msgid "ok"
msgstr "确定"
// 编译程序,设置locale,运行程序,正常情况应该有中文显示
$gcc -o app try.c
$export LC_ALL=zh_CN.GB2312
$./app
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GTK+ 2.0 教程 译者: huzheng,konghui,ferry,carton,yang_yi,ddd,tingle 版本号: V_0.1.0 2002年 6 月25 日 本文是有关通过 C 语言接口使用 GTK (the GIMP Toolkit) 的教程。 Table of Contents 中文说明 简介 从这里开始 用 GTK 来写 Hello World 编译 Hello World 程序 信号和回调函数的原理 事件 Hello World 详解 继续 数据类型 深入探索信号处理函数 改进了的 Hello World 组装构件 组装盒的原理 盒的细节 组装示范程序 用表组装 表组装示例 构件概述 类型转换 构件的组织 无窗口构件 按钮构件 一般按钮 Normal Buttons 开关按钮 Toggle Buttons 复选按钮 Check Buttons 单选按钮 Radio Buttons 调整对象 Adjustments 创建一个调整对象 轻松使用调整对象 “调整对象”的内部机制 范围构件 Range Widgets 滚动条构件 Scrollbar Widgets 比例构件 Scale Widgets 创建一个比例构件 函数和信号(至少讲了函数) 常用的范围函数 设置更新方式 获得和设置调整对象 键盘和鼠标绑定 示例 杂项构件 标签 Labels 箭头 Arrows 工具提示对象 The Tooltips Object 进度条 Progress Bars 对话框 Dialogs 标尺 Rulers 状态栏 Statusbars 文本输入构件 Text Entries 微调按钮 Spin Buttons 组合框 Combo Box 日历 Calendar 颜色选择 Color Selection 文件选择 File Selections 容器构件 Container Widgets 事件盒 The EventBox 对齐构件 The Alignment widget 固定容器 Fixed Container 布局容器 Layout Container 框架 Frames 比例框架 Aspect Frames 分栏窗口构件 Paned Window Widgets 视角 Viewports 滚动窗口 Scrolled Windows 按钮盒 Button Boxes 工具栏 Toolbar 笔记本 Notebooks 菜单构件 手工创建菜单 手工菜单示例 使用套件 套件示例 无文档构件 快捷标签 Accel Label 选项菜单 Option Menu 菜单项 Menu Items 复选菜单项 Check Menu Item 单选菜单项 Radio Menu Item 分隔菜单项 Separator Menu Item 分离菜单项 Tearoff Menu Item 曲线图 Curves 绘图区 Drawing Area 字体选择对话框 Font Selection Dialog 消息对话框 Message Dialog Gamma 曲线图 图像 Image 插头和插座 Plugs and Sockets 树视区 Tree View 文本视区 Text View 设置构件的属性 超时、IO 和 Idle 函数 超时 Timeouts 监控IO Idle 函数 高级事件和信号处理 信号函数 连接和断开信号处理函数 阻塞和反阻塞信号处理函数 发出和停止信号 信号的发射和传播 操作选区 概述 获取选区信息 提供选区 拖放 概述 属性 函数 设置源构件 源构件上的信号 设置目的构件 目的构件上的信号 GLib 定义 双向链表 单向链表 存储管理 计时器 字符串处理 实用程序和错误处理函数 GTK 的 rc 文件 rc 文件的功能 GTK rc 文件的格式 rc 文件示例 编写你自己的构件 概述 一个构件的剖析 创建一个复合构件 介绍 选择一个父类 头文件 _get_type() 函数 _class_init() 函数 _init() 函数 其余的... 从头创建构件 介绍 在屏幕上显示构件 表盘构件的原形 主体 gtk_dial_realize() 大小磋商 gtk_dial_expose() 事件处理 可能的增强 深入的学习 涂鸦板,一个简单的绘图程序 概述 事件处理 绘图区构件和绘图 添加XInput支持 允许扩展设备信息 使用扩展设备信息 得到更多关于设备的信息 进一步的讲解 编写 GTK 应用程序的技巧 投稿 鸣谢 教程的版权和许可声明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值