免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: tracing

GTK下如何在简体和繁体之间转换? [复制链接]

论坛徽章:
0
发表于 2009-10-15 09:38 |显示全部楼层
原帖由 naihe2010 于 2009-10-15 09:12 发表
你启动程序的时候,用env LC_ALL=en_US ./程序

这样试试看呢?

这样还是不行,给你看看我的源码,这是网上的一个例子

#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include <stdio.h>

#define GETTEXT_PACKAGE "gi18n"
#define LOCALEDIR "./locale"

int main(int argc,char **argv)
{
    GtkWidget *window;
    gtk_init (&argc, &argv);
    bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
    textdomain (GETTEXT_PACKAGE);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW(window), _("help"));
    g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (gtk_main_quit), NULL);
    gtk_widget_show (window);
    gtk_main ();
    return 0;
}

论坛徽章:
0
发表于 2009-10-15 11:58 |显示全部楼层
我在程序里这么写就可以显示英文
setlocale(LC_ALL, "C");
setenv("LANG", "C", 1);

现在问题是msgfmt的时候识别不了po文件里的繁体

论坛徽章:
0
发表于 2009-10-15 12:34 |显示全部楼层
支持繁体的话,charset不能改为big5。

po文件里的charset,指得是你的po文件用的编码。如果你的文件是gb2312编码的,就还写gb2312。但是这个po文件,得是zh_TW就好了。

[ 本帖最后由 naihe2010 于 2009-10-15 12:35 编辑 ]

论坛徽章:
0
发表于 2009-10-15 13:43 |显示全部楼层
原帖由 naihe2010 于 2009-10-15 12:34 发表
支持繁体的话,charset不能改为big5。

po文件里的charset,指得是你的po文件用的编码。如果你的文件是gb2312编码的,就还写gb2312。但是这个po文件,得是zh_TW就好了。

不管写成什么,如果po文件里有繁体字,当使用msgfmt时,会提示invalid multibyte sequence

论坛徽章:
0
发表于 2009-10-15 14:40 |显示全部楼层
我觉得是因为你应该确定好这个po文件到底是什么编码的。是什么,charset就赋成什么。应该不会有问题。

另外,可否把你的整个的源代码发给我一份看看。

论坛徽章:
0
发表于 2009-10-15 15:50 |显示全部楼层
多谢各位,已经搞定了,原理我还不大懂,但确实可以了,现在英文,简体中文,繁体中文都可以显示,剩下的工作就是综合一下了,我是这么做的。
1、英文
英文的话就不需要po和mo文件了,设置好语言环境即可
setlocale(LC_ALL, "C");
setenv("LANG", "C", 1);
2、简体中文
charset=gb2312,charset应该不是文件的编码,而是要显示的字符串的编码
setlocale(LC_ALL, "zh_CN.UTF-8");
setenv("LANG", "zh_CN", 1);
3、繁体中文
charset=big5
setlocale(LC_ALL, "zh_TW.Big5");
setenv("LANG", "zh_TW", 1);

以下是显示繁体中文的完整源码:
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdio.h>
#include <libintl.h>
#include <stdlib.h>

#define GETTEXT_PACKAGE "gi18n"
#define LOCALEDIR "./locale"
#define _(STRING) gettext(STRING)

int main(int argc,char **argv)
{
    GtkWidget *window;
    gtk_init (&argc, &argv);
    setlocale(LC_ALL, "zh_TW.Big5");
    setenv("LANG", "zh_TW", 1);
    bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
    textdomain (GETTEXT_PACKAGE);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW(window), g_locale_to_utf8(_("help"), -1, NULL, NULL, NULL));
    g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (gtk_main_quit), NULL);
    gtk_widget_show (window);
    gtk_main ();
    return 0;
}
代码可能有笔误,不是直接拷贝过来的,要在当前目录下建个locale的文件夹,mo文件就放在./locale/zh_TW/LC_MESSAGES/里

论坛徽章:
0
发表于 2009-10-15 15:52 |显示全部楼层
另外,多谢naihe2010 让我认识了gettext

论坛徽章:
0
发表于 2009-10-15 15:57 |显示全部楼层
还有,显示繁体的时候,写po文件的msgstr时,写成简体中文就可以了,不用写繁体,否则msgfmt会报错

论坛徽章:
0
发表于 2009-10-15 17:40 |显示全部楼层
你用gettext还是有一点小毛病的,gettext的作用,是使可执行程序不用重新编译而支持国际化。你不用更改源文件的。去掉那句setenv()。直接在程序启动时,自己判断系统的环境来显示就好了。

论坛徽章:
0
发表于 2009-10-15 17:42 |显示全部楼层
具体来说,就是在源文件中只设置locale为C。而不设置setenv。因为这个setenv会覆盖系统的env,导致国际化支持单一化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP