侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

GTK国际化

2022-06-17 星期五 / 0 评论 / 0 点赞 / 92 阅读 / 3759 字

昨天项目要求对一个GTK程序国际化,花了一下午的时间看了相关资料,现在整理制作流程。 一、源码中设置国际化的支持。在main函数添加如下代码,增加国际化的支持。代码中的PACKAGE为程序最后名

    昨天项目要求对一个GTK程序国际化,花了一下午的时间看了相关资料,现在整理制作流程。

    一、源码中设置国际化的支持。在main函数添加如下代码,增加国际化的支持。代码中的PACKAGE为程序最后名称,用以查找翻译文件。LOCALE为翻译文件所在的文件夹。LOCALE的文件路径为locale/zh_CN/LC_MESSAGES,其中zh_CN为语言,LC_MESSAGES文件夹下保存具体的翻译文件(mo文件)。

    这里还需要注意一个问题,我们这里使用的国际化是利用GNU的gettext实现的。gettext在查找当前语言的顺序是LC_ALL ->LC_MESSAGES->LANG。而在windows上LC_*消息是没有的,即setlocale函数在windows系统上没有任何作用的。为了程序的可移植性,应该通过设置环境变量LANG,然后通过setlocale来集成环境变量。

#include <glib/gi18n.h>#include <locale.h>#include <stdlib.h>#define PACKAGE "Dial-Assistant"#define LOCALE "./locale"int main(){        //set locale        putenv("LANG=zh_CN.utf8");        setlocale(LC_ALL,"");        bindtextdomain(PACKAGE,LOCALE);        #ifdef G_OS_WIN32                bind_textdomain_codeset(PACKAGE,"UTF-8");        #endif        textdomain(PACKAGE);        return 0;}
2.在源码中使用_()替换翻译字符串。如:_("Hello")。下面给出一个示例函数。文件中的_("Dial-Assistant")在没有国际化之前为"Dial-Assistant"。
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);        window_main=window;        gtk_widget_set_size_request(window,500,500);        gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);            gtk_window_set_icon_from_file(GTK_WINDOW(window),"logo.png",NULL);        gtk_window_set_title(GTK_WINDOW(window),_("Dial-Assistant"));
3.使用xgettext提取源码中需要翻译的字段。其中-k表示提取源码中什么样的字符串,如这里是-k_ 表示提取以下划线开始的字符串格式,即提取 _("")中的字符串。-o表示输出文件名。--from-code=utf8表示源文件的字符编码。
xgettext -k_ -o Dial-Assistant.po *.c --from-code=utf8
4.修改po文件。首先修改“Project-Id-Version”字段后面的值,表示版本信息。然后修改“Content-type”字段中的"charset"字段信息,将其修改为“UTF-8”表示输出的字符串信息。然后根据下面的msgid修改msgstr。下面给出一个示例文件(部分)。
"Project-Id-Version: 1.0/n""Report-Msgid-Bugs-To: /n""POT-Creation-Date: 2013-01-04 18:23+0800/n""PO-Revision-Date: 2013-01-04 18:31+0800/n""Last-Translator: FULL NAME <EMAIL@ADDRESS>/n""Language-Team: LANGUAGE <[email protected]>/n""MIME-Version: 1.0/n""Content-Type: text/plain; charset=UTF-8/n""Content-Transfer-Encoding: 8bit/n""X-Generator: Poedit 1.5.4/n"#: ami.c:175msgid "socket error"msgstr "socket错误"
5.使用msgfmt程序生成mo文件。
msgfmt -o Dial-Assistant.mo Dial-Assistant.po
6.创建翻译文件存放文件夹。这里需要注意的是,因为考虑到程序的移植问题,所以建议把翻译文件夹(locale文件夹)存放在本地(这也是在第一步中定位locale文件夹为“./locale”的原因)。
mkdir -pv locale/zh_CN/LC_MESSAGES
7.复制第五步中生成的mo文件到locale/zh_CN/LC_MESSAGES中。

8.测试。如果需要测试,在linux系统下可以通过临时设置环境变量来测试。临时修改环境变量的命令为:

export LANG=zh_CN.UTF-8

广告 广告

评论区