几 个公司组成了一个非正式的论坛, 接着IBM, Microsoft等公司迅速加入.
Unicode研讨会在1990年发表了Unicode标准版本1, 同时国际标准化组织完
成 了一种类似的编码----ISO 10646. 因为没有必要存在两套标准, 所以
Unicode 研讨会和国际标准化组织在1991到1992合二为一. 1994年, 中国和
日本开始对 基于ISO10646上的国家标准进行工作. 现在, Unicode 开始用
在许多产品中.
Unicode包含了当今计算机领域中广泛使用的所由字符, 如世界上大部分 的
书面语言, 印刷字符, 数字和技术符号, 地理图形和标点符号. 由于
Unicode 的一致性, 它在大多数情况下都可能简化软件的国际化过程. 它取
消了处理 多种代码页的必要, 并且由于是16位编码, 因此由双字节字符集
所引起的额外 处理也不必要了.
但是, Unicode作为一种编码也有它的缺陷, 比如编码的位置与排序无关,
所以使软件支持Unicode仅仅是国际化的第一步, 实际情况中还需要与语言
相关 的信息和规则. 所以Unicode一般作为程序的内部处理编码, 必须提供
与其它 编码的双向转换表.
最后需要说明的是, 虽然使用Unicode会使普通的英文文本大两倍, 但是 使
用Unicode的整个系统却不会增加太大, 因为系统存放的文件大部分是二进
制 文件格式, 同时, 使用针对Unicode的压缩方式, 可以把文件压缩成和使
用对应 的8位正文一样大小.
4. 字体(Font)和字体集(FontSet)
在X窗口系统下使用的字体都必须在X服务器中注册X逻辑字体描述(X
Logical Font Description)名. 它包括了字体的许多信息, 例如以下为西
文字体和中文 字体的两个例子.
1. -adobe-times-medium-r-normal--14-140-75-75-p-74-iso8859-1
2. -tlc-song-medium-r-normal--24-240-75-75-c-240-gbk-0
为了方便使用, 用户还可以给每一个字体加一个或多个别名, 别名文件
fonts.alias 放在字体目录下, 可以手工编辑. 当字体目录变更或别名变更
后, 必须使用命令 "xset fp rehash"或重新启动X才起作用.
X 字体也可以通过字体服务器(Font Server)加载. 这对于本地不放字体 的
系统或X终端特别有用. 加载的协议可以是TCP或DECNET.
X 窗口系统的字体在X Server中之存在一份, 当所由软件都不使用它时, 字
体的内存自动施放.
字体中包含了制造商名, 字体类型, 权重, 字体大小, 字符集等信息. 它们
也 可以缩写, 省去的部分用星号代替, 比如对上面的中文字体, 可以缩写
为:
-*-song-*-24-*-gbk-0
在实际应用中, 字符串往往是中文和英文的混和字符串, 所以必须使用两种
字体来绘出该字符串, 这种指定两种或两种以上的字体的描述就是字体集.
字体 集一般的格式是把多种字体用逗号隔开, 比如, 指定下列字体集:
"-adobe-helvetica-medium-r-normal--14-*-*-*-*-*-iso8859-*,\
-tlc-song-medium-r-normal--14-*-*-*-*-*-gbk-0"
令人遗憾的是, 中文的GB编码和Big5编码有重叠区域, 不能区分开来, 所以
字体集并不能同时指定GB和Big5的字体.
字体集的具体载入受到Locale的影响.
在许多已经国际化的软件和图形库中, 一般通过资源文件让用户指定字体
集, 比如gtk的简体中文资源文件为/etc/gtk/gtkrc.zh_CN, qt-1.44(国际
化的)的 资源文件是 ~/.qti18nrc 等等.
2. 信息的国际化
信息(Message)国际化是软件国际化中比较重要的一环, 如果使软件可以 支持多
种语言, 在设计时就应当考虑到信息的国际化问题. 现在的绝大多数 软件使用
GNU的gettext作为基本工具. 信息国际化的基本步骤是:
o 在软件初始化时设置使用setlocale()设置Locale
o 使用gettext宏定义, 使程序看上去比较方便:
o 指定信息的位置:
o 指定翻译信息: _("Some Strings");
o 在软件完成后,使用 xgettext 提取信息并翻译
o 使用msgfmt把信息文件转换为.mo文件, 安装到locale目录下
/* file this_app.c */
#include
#include
#define _(String) gettext(String)
#define N_(String) gettext(String)
#define __(String) (String)
int main(){
//由环境变量决定locale
setlocale(LC_ALL, "");
//设置message的位置和文件名
bindtextdomain("this_app", "/usr/share/locale");
textdomain("this_app");
printf(_("Some String"));
}
至此, 本程序的国际化过程已完成. 编译并联接成可执行文件this_app.
gcc -o this_app this_app.c
下面是本地化的过程.
o 提取要翻译的信息: xgettext -a -o this_app.po this_app.c
o 翻译信息
在文件this_app.po 中含有"Some String":
msgid "Some String"
msgstr ""
翻译成:
msgid "Some String"
msgstr "一些字符串"
o 格式化信息文件: msgfmt -o this_app.mo this_app.po
o 拷贝信息文件到locale的目录下, 比如对于中文zh_CN, cp this_app.mo
/usr/share/locale/zh_CN/LC_MESSAGES
o 执行文件: LC_ALL=zh_CN ./this_app
上一页 [1] [2] [3] [4] |