- 论坛徽章:
- 1
|
Gtk2-Perl 11.本地化
perl 的本地化模块包括 Locale::Maketext 和 Locale::gettext。前者是完全用 perl 实现的本地化模块,而后者是使用 gettext 库的 perl 扩展。由于 Glade 使用的 c 库,所以如果程序使用 Glade 产生界面,只能用 Locale::gettext 进行界面本地化(当然,你如果把 Glade 文件放到 perl 文件中,动态使用 Maketext 产生 Glade 所需要的 xml 也是可以,不过代价比较高)。在 MSWin 上安装 Locale::gettext 模块还不算特别复杂,只要少量修改一下 Makefile.PL 文件就可以了。
这两个模块的使用方法,我在“perl 程序的本地化”和 “ 使用 gettext 进行程序的本地化”两篇文章中有比较详细的介绍。和一般的 Locale::gettext 模块使用是一样的,界面的本地化也可以分成提取产生po 文件,翻译和编译产生 mo 文件三个步骤。以前一章中的 Glade 测试文件为例,说明一下整个过程。
首先把 perl 源代码改造成使用 gettext 的形式:
use Gtk2 '-init';
use Glib qw(TRUE FALSE);
use Gtk2::GladeXML;
use POSIX qw(setlocale);
use Locale::gettext qw(bindtextdomain textdomain LC_ALL);
binmode STDOUT, "utf8";
setlocale(LC_ALL, "");
bindtextdomain('glade-demo', 'locale');
textdomain('glade-demo');
{
my $ld = Locale::gettext->domain('glade-demo');
sub gettext { $ld->get(@_) }
}
my $app = Gtk2::GladeXML->new('glade-demo.glade');
$app->signal_autoconnect_from_package('main');
my $win = $app->get_widget('window1');
$win->signal_connect('delete-event' => sub { Gtk2->main_quit });
$win->show();
Gtk2->main;
sub on_button1_clicked {
print gettext("Goodbye, cruel world!\n");
Gtk2->main_quit;
return FALSE;
}
源程序
提取可翻译的字符串使用下面的命令:
xgettext glade-demo-l18n.pl
xgettext -j messages.po glade-demo.glade
翻译文件中的字符串,并注意修改 charset 成 utf8。建议把文件改名为 glade-demo.zh_CN.po,防止再次使用 xgettext 使文件被覆盖。
使用 msgfmt 产生 mo 文件:
mkdir -p locale/zh_CN/LC_MESSAGES
msgfmt -o locale/zh_CN/LC_MESSAGES/glade-demo.mo glade-demo.zh_CN.po
最后运行一下程序吧。
po 文件如下:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: glade-demo 0.01\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-08-02 10:21+0800\n"
"PO-Revision-Date: 2007-08-02 10:36+0800\n"
"Last-Translator: Ye Wenbin <wenbinye@gmail.com>\n"
"Language-Team: Chinese <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: glade-demo-l10n.pl:31
msgid "Goodbye, cruel world!\n"
msgstr "永别了!\n"
#: glade-demo.glade:18
msgid "Hello"
msgstr "你好"
源文件 |
|