📄 00000001.htm
字号:
3.讯息输出 (详见 info gettext): <BR> <BR> <BR> 一般我们程式的讯息输出,是经由 stdio.h □头的函式,直接输 <BR> <BR> 出到 stdout 或 stderr, 而输出的内容是直接写死在程式码中。 <BR> <BR> 这样的程式要做多国语文化会造成困 扰,因为我们必须要修改原 <BR> <BR> 始码,将所有的讯息字串翻译成另一种语文。因此,我们 必须透 <BR> <BR> 过 locale 的 LC_MESSAGES 来处理讯息输出。其原理很简单,就 <BR> <BR> 是将程式中 的所有讯息抽离出来,为每一个 locale 分别做好一 <BR> <BR> 个讯息档,当程式要输出讯息时, 则透过 libc 的函式依目前的 <BR> <BR> locale 去正确的讯息档中抓取讯息。 <BR> <BR> <BR> 在此我用 GNU gettext 为例,简单说明其原理。在 <BR> <BR> /usr/share/locale 中,□头有 各种 locale 的资料目录。而每 <BR> <BR> 个目录下,都会有一个 LC_MESSAGES 的目录,而这 些目录就是 <BR> <BR> 用来放各别程式的讯息档。例如: <BR> <BR> <BR> /usr/share/locale/ja/LC_MESSAGES/prog.mo (日文) <BR> <BR> /usr/share/locale/zh_TW.Big5/LC_MESSAGES/prog.mo (Big5) <BR> <BR> <BR> 其中在 ja/ 目录下的 prog.mo 就是 prog 这个程式的日文讯 <BR> <BR> 息,而 zh_TW.Big5/ 下的 prog.mo 就是 prog 这个程式的中文 <BR> <BR> 讯息。假设在还没加入 LC_MESSAGES 支 援之前, prog.c 长得 <BR> <BR> 像这样: <BR> <BR> <BR> <BR> #include <BR> <BR> main() <BR> <BR> { <BR> <BR> printf("This is a test string.\n"); <BR> <BR> } <BR> <BR> <BR> <BR> 现在我们要用 gettext 来加入支援,则程式只要改成: <BR> <BR> <BR> <BR> #include <BR> <BR> #include <BR> <BR> #define _(STRING) gettext(STRING) <BR> <BR> #define PACKAGE "prog" <BR> <BR> <BR> main() <BR> <BR> { <BR> <BR> setlocale(LC_MESSAGES, ""); <BR> <BR> textdomain(PACKAGE); <BR> <BR> /* 这□就是指定用 <BR> <BR> /usr/share/locale/$LOC/LC_MESSAGES/prog.mo <BR> <BR> 作为讯息档。其中 $LOC 是在 setlocale 中设定的 */ <BR> <BR> printf(_("This is a test string.\n")); <BR> <BR> /* 使用 gettext 来抓出讯息,再交给 printf 来印 */ <BR> <BR> } <BR> <BR> <BR> <BR> <BR> 如果在指定的 locale 下找不到 prog.mo 档,则程式就直接以原 <BR> <BR> 英文讯息印出。因 此,加入 LC_MESSAGES 的支援,原 source <BR> <BR> code 修改并不多,其实相当方便。 <BR> <BR> <BR> 比较麻烦的是各 locale 下的讯息档制作,而这些步骤可以经由 <BR> <BR> GNU gettext 套件 很容易地达成,其步骤简述如下 (详见 info <BR> <BR> gettext): <BR> <BR> <BR> xgettext editor msgfmt (install) <BR> <BR> source code --> .pot --> .pox --> .gmo --> .mo --> <BR> <BR> (节录自 <A HREF="mailto:Platin.bbs@csie.nctu.edu.tw">Platin.bbs@csie.nctu.edu.tw</A> 的文章: <BR> <BR> [REF] 关於 gettext (一、简介)) <BR> <BR> <BR> 使用 xgettext 产生 .pot 档: <BR> <BR> <BR> xgettext -a -o prog.pot prog.c <BR> <BR> <BR> 而 prog.pot 档的内容如下: <BR> <BR> <BR> <BR> # SOME DESCRIPTIVE TITLE. <BR> <BR> # Copyright (C) YEAR Free Software Foundation, Inc. <BR> <BR> # FIRST AUTHOR , YEAR. <BR> <BR> # <BR> <BR> #: prog.c:8 <BR> <BR> #, fuzzy <BR> <BR> msgid "" <BR> <BR> msgstr "" <BR> <BR> "Project-Id-Version: PACKAGE VERSION\n" <BR> <BR> "POT-Creation-Date: 1999-02-28 19:18+0800\n" <BR> <BR> "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" <BR> <BR> "Last-Translator: FULL NAME \n" <BR> <BR> "Language-Team: LANGUAGE \n" <BR> <BR> "MIME-Version: 1.0\n" <BR> <BR> "Content-Type: text/plain; charset=CHARSET\n" <BR> <BR> "Content-Transfer-Encoding: ENCODING\n" <BR> <BR> <BR> #: prog.c:10 <BR> <BR> msgid "This is a test string.\n" <BR> <BR> msgstr "" <BR> <BR> <BR> <BR> 各位可以注意到倒数两行, msgid 就是原来 source □头 <BR> <BR> 的英文讯息,而我 们可以直接在 msgstr 中将原讯息翻译 <BR> <BR> 成中文。所以,接下来的工作其实就 是翻译,我们可以用 <BR> <BR> 任意的编辑器编辑这个档案,并将翻译好的档案存成 <BR> <BR> prog.pox 档。 <BR> <BR> <BR> 将 prog.pox 编译成 prog.gmo: <BR> <BR> <BR> msgfmt -o prog.gmo prog.pox <BR> <BR> <BR> 其中 prog.gmo。就是我们要的讯息档,等到我们把它安装 <BR> <BR> 到 <BR> <BR> <BR> /usr/share/locale/..../LC_MESSAGES/ <BR> <BR> <BR> 之後,就名改为 prog.mo 。在此, .pot, pox, gmo 等附 <BR> <BR> 档名是 info gettext 中建议的,分别代表未翻译前的讯息 <BR> <BR> 原始档、翻译後的讯息原始档、 经 GNU gettext 套件编译 <BR> <BR> 後的讯息档。 <BR> <BR> <BR> 七、撰写 Xi18n 程式: <BR> <BR> <BR> Xi18n 意指在 X Window 中加入 I18N 的支援。除了上述的部分外, <BR> <BR> Xi18n 还需要 考虑字形设定、图形字串输出、以及输入的问题。由於 <BR> <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -