| Linux 的中文化问题简介 |
|
作者:网络 文章来源:转载 点击数: 更新时间:2005-8-15 |
| [ 字体:缩小 正常 放大 | 双击自动滚屏 ] |
请选择合适的字体颜色:
|
|
须透过 locale 的 LC_MESSAGES 来处理讯息输出。其原理很简单,就是将程式中的所
有讯息抽离出来,为每一个 locale 分别做好一个讯息档,当程式要输出讯息时,则透
过 libc 的函式依目前的 locale 去正确的讯息档中抓取讯息。
在此我用 GNU gettext 为例,简单说明其原理。在 /usr/share/locale 中,□头有各
种 locale 的资料目录。而每个目录下,都会有一个 LC_MESSAGES 的目录,而这些目
录就是用来放各别程式的讯息档。例如:
/usr/share/locale/ja/LC_MESSAGES/prog.mo (日文)
/usr/share/locale/zh_TW.Big5/LC_MESSAGES/prog.mo (Big5)
其中在 ja/ 目录下的 prog.mo 就是 prog 这个程式的日文讯息,而 zh_TW.Big5/ 下
的 prog.mo 就是 prog 这个程式的中文讯息。假设在还没加入 LC_MESSAGES 支援之
前, prog.c 长得像这样:
----------------------------------------------------------------------------
----
#include
main()
{
printf("This is a test string.\n");
}
----------------------------------------------------------------------------
----
现在我们要用 gettext 来加入支援,则程式只要改成:
----------------------------------------------------------------------------
----
#include
#include
#define _(STRING) gettext(STRING)
#define PACKAGE "prog"
main()
{
setlocale(LC_MESSAGES, "");
textdomain(PACKAGE);
/* 这□就是指定用
/usr/share/locale/$LOC/LC_MESSAGES/prog.mo
作为讯息档。其中 $LOC 是在 setlocale 中设定的 */
printf(_("This is a test string.\n"));
/* 使用 gettext 来抓出讯息,再交给 printf 来印 */
}
----------------------------------------------------------------------------
----
如果在指定的 locale 下找不到 prog.mo 档,则程式就直接以原英文讯息印出。因
此,加入 LC_MESSAGES 的支援,原 source code 修改并不多,其实相当方便。
比较麻烦的是各 locale 下的讯息档制作,而这些步骤可以经由 GNU gettext 套件很
容易地达成,其步骤简述如下 (详见 info gettext):
xgettext editor msgfmt (install)
source code --> .pot --> .pox --> .gmo --> .mo -->
(节录自 Platin.bbs@csie.nctu.edu.tw 的文章:
[REF] 关於 gettext (一、简介))
使用 xgettext 产生 .pot 档:
xgettext -a -o prog.pot prog.c
而 prog.pot 档的内容如下:
----------------------------------------------------------------------------
----
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR , YEAR.
#
#: prog.c:8
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 1999-02-28 19:18+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
#: prog.c:10
msgid "This is a test string.\n"
msgstr ""
----------------------------------------------------------------------------
----
各位可以注意到倒数两行, msgid 就是原来 source □头的英文讯息,而我 们可以直
接在 msgstr 中将原讯息翻译成中文。所以,接下来的工作其实就 是翻译,我们可以
用任意的编辑器编辑这个档案,并将翻译好的档案存成 prog.pox 档。
将 prog.pox 编译成 prog.gmo:
msgfmt -o prog.gmo prog.pox
其中 prog.gmo。就是我们要的讯息档,等到我们把它安装到
/usr/share/locale/..../LC_MESSAGES/
之後,就名改为 prog.mo 。在此, .pot, pox, gmo 等附档名是 info gettext 中建
议的,分别代表未翻译前的讯息原始档、翻译後的讯息原始档、 经 GNU gettext 套件
编译後的讯息档。
七、撰写 Xi18n 程式:
Xi18n 意指在 X Window 中加入 I18N 的支援。除了上述的部分外, Xi18n 还需要考
虑字形设定、图形字串输出、以及输入的问题。由於目前我只有看过 Xlib, 对於其他
Widget 还没有深入研究,因此我只能对 Xlib 的部分稍作说明。而这类的参考资料,
有兴趣的朋友可以找
The Definitive Guides to the X Window System
这一系列的书来看,出版商是 OReilly & Associates Inc. ,其中有两本
Volume One, Xlib Programming Manual (for Version 11)
Author: Adrian Nye
R6 Update for the R5 Editions of vols. 1, 2, 4, & 5 Programmers Supplement
for Release 6 of the X Window System.
Author: Adrian Nye
在 I18N 方面有详尽的资料,很值得参考。或者是可以看看 XFree86 内附的 .ps 文件
(如果您有安装的话,应该在 /usr/X11R6/lib/X11/doc □头)。
第一步 (详见 man XSupportsLocale):
除了 setlocale() 之外,您还要呼叫 XSupportsLocale() 来确定 X Window 对您 目
前的 locale 是否有支援。另外,您还要呼叫 XSetLocaleModifiers() 来设定 一些
X-modifier 的值,□例如下:
----------------------------------------------------------------------------
----
#include
#include
#include
main()
{
setlocale(LC_CTYPE, "");
if (XSupportsLocale() != True) {
printf("error X locale setting\n");
exit(0);
}
XSetLocaleModifiers("");
}
----------------------------------------------------------------------------
----
在此我们用 X11/Xlocale.h 来取代原来的 locale.h, 这是 "Xlib programming上一页 [1] [2] [3] [4] [5] 下一页 |
|
| 教程录入:小秦 责任编辑:小秦 |
上一篇教程: 关于Mandrake中文问题的几点建议 下一篇教程: Chinput 安装指南 |
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |