之後,就名改为 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 manual" 书中建议的,在其备完整 locale 支援的 libc 环境下,它其实是等价 於
include , 但若在其他环境, Xlocale.h 会用 XLOCALE 机制来 取代原有的机制。
上头的 XSetLocaleModifiers 会存环境变数 XMODIFIERS 中取得 X-modifier 的值并 加以设定之。 XMODIFIERS 的格式为:
export XMODIFIERS=@category=value
目前 category 只有 "im" 有用,如 "@im=xcin-cxims", 意指设定 xcin-cxims 作为
此 X Window 程式的 XIM server。
设定 fontset (详见 man XCreateFontSet):
以往 X Window 程式都是呼叫 XLoadQueryFont() 之类的函式来载入并使用字型。 但 在 Xi18n 的架构下,一个 locale 的 encoding 通常不能光用一种字型来表示。 例如 我们的 zh_TW.Big5, 半形字需用英文字型 (如 -*-iso8859-1),而全形字需 用中文字 型 (如 -twmoe-*-big5-0), 因此,我们不能用 XLoadQueryFont() 将这 些字型分别载 入,而要用 XCreateFontSet() 来载入所需的 fontset。
Display *display;
XFontSet fontset;
char *fontset_name, **missing_charset, *def_string;
int missing_charset_count;
fontset_name = "-*-iso8859-1,-twmoe-*-big5-0";
fontset = XCreateFontSet(display, fontset_name,
&missing_charset_list,
&missing_charset_count,
&def_string);
在这□我们可以将 fontset 看成一个「字型物件」,而不要把它看成 "-*-iso8859-1"
与 "-twmoe-*-big5-0" 这两种字型的组合。当我们要画任何字 串时,我们不用担心要 画的到底是全型字或半型字,使用 fontset 便能帮我们 处理一切。
画出字串 (详见 man XwcDrawImageString, man XmbDrawImageString, manXOpenOM) 平常我们要在视窗画字串时,都会用 XDrawImageString() 等函式,或者用
XDrawImageString16() 来画双位元的字串 (即全型字)。现在可以我们用 XwcDrawImageString (用来画 wide-char (wchar_t *) 字串) 或 XmbDrawImageString
(用来画 multi-byte (char *) 字串) 。不管您输入的字 串是全型或半型,或二者的 混合,使用者两个函式都能正确处理,同时会根据 您的 fontset 的设定来画字。
除此之外, X11R6 还有一个 Output Method 机制,用来做多国语系字串输出 (画字 串),我们可以在程式中呼叫 XOpenOM() 来开启一个 Output Method 。 但这部分我还 没有仔细研究,有兴趣的朋友可以参考本章开头所列的参考资料 以获得进一步资讯。 XIM (详见 man XOpenIM) XIM 应分两方面来谈,一是 XIM server, 另一是 XIM client。对 XIM client 而言,
如同 Output Method 一般,我们可以在程式中呼叫 XOpenIM() 来开启一 个 Input Method, 同时指定 XIM server 的名字。但这部分我还没有仔细研究, 有兴趣的朋友
可以参考本章开头所列的参考资料。
我目前是在写 XIM server 的部分,但我没有直接拿 X Window 的函式来写,而 是拿 IMdkit lib 来写,以简化整个程式写作。在此我不多作说明了,有兴趣的 朋友可以抓
取:
xcin-2.5-19990218.tar.gz
回去看,□头的doc/programming/ 目录中有对此稍作说明,同时 IMdkit 的 source 也整个附在 xcin-2.5 source 中。