📄 00000002.htm
字号:
/* file this_app.c */ <BR>#include <BR>#include <BR>#define _(String) gettext(String) <BR>#define N_(String) gettext(String) <BR>#define __(String) (String) <BR> <BR>int main(){ <BR>//由环境变量决定locale <BR>setlocale(LC_ALL, ""); <BR> <BR>//设置message的位置和文件名 <BR>bindtextdomain("this_app", "/usr/share/locale"); <BR>textdomain("this_app"); <BR> <BR>printf(_("Some String")); <BR>} <BR> <BR> <BR>至此, 本程序的国际化过程已完成. 编译并联接成可执行文件this_app. <BR> <BR>gcc -o this_app this_app.c <BR> <BR>下面是本地化的过程. <BR> <BR>o 提取要翻译的信息: xgettext -a -o this_app.po this_app.c <BR>o 翻译信息 <BR> <BR>在文件this_app.po 中含有"Some String": <BR> <BR>msgid "Some String" <BR>msgstr "" <BR> <BR>翻译成: <BR> <BR>msgid "Some String" <BR>msgstr "一些字符串" <BR> <BR>o 格式化信息文件: msgfmt -o this_app.mo this_app.po <BR>o 拷贝信息文件到locale的目录下, 比如对于中文zh_CN, cp this_app.mo <BR>/usr/share/locale/zh_CN/LC_MESSAGES <BR>o 执行文件: LC_ALL=zh_CN ./this_app <BR> <BR>3. 输入的国际化 <BR> <BR>在X窗口系统下输入主要有三种方式: <BR> <BR>1. 单此击键输入单字符 <BR>2. 两个或多个组合键输入单字符 <BR>3. 除键输入外, 还需要转换服务器 <BR> <BR>其中前两种用于输入西文字符, 比如对于欧洲语言的特殊字符的输入, 通常采用 <BR>重映射键盘的方法. 或者使用"加速键"的方法输入, 加速键是键盘 上的特殊键, <BR>按下后不会使光标向后移动. <BR> <BR>在Linux下, 使用软件xkeycaps可以把键盘重新映射并且保存整个键盘 在映射后 <BR>的对照表, 使用命令xmodmap可以加载映射表. <BR> <BR>对于中文输入, 主要使用第三种输入方式. 针对各种语言的综合考虑, X 窗口系 <BR>统在输入上定义了下列区域: <BR> <BR>1. 预编辑区域(Preedit Area), 用于显示输入的过程, 当用户输入 字符时, <BR>应立即显示在该区域 <BR>2. 状态区域(Status Area), 用于显示输入状态, 对中文来说, 用于显示输入 <BR>方法, 全角/半角状态, 中文/西文标点符号状态. <BR>3. 辅助区域(Auxiliary Area), 显示可供选择的列表, 又称选择 区域, 它由 <BR>输入服务器控制. <BR> <BR>根据预编辑区域和状态区域的不同组合, X 窗口系统共定义了四种输入 的风格 <BR>(Input Style): <BR> <BR>1. Root风格: 预编辑区域和选择区域都在应用软件之外, 它们都是 由输入服 <BR>务器完成的, 输入服务器所显示的界面是根窗口的子 窗口. 如类似"中文之 <BR>星"的独立的输入条模式. <BR>2. OffTheSpot风格: 预编辑区域和选择区域在应用软件之内, 通常 是在窗口 <BR>下方的某个固定区域内. 如XEmacs的缺省输入模式. <BR>3. OverTheSpot风格: 预编辑区域在当前的输入位置, 状态区域 在应用程序的 <BR>某一固定区域. 它通常又称为光标跟随模式, 类似 于Windows下的智能ABC <BR>输入方法 <BR>4. OnTheSpot风格: 预编辑区域和选择区域都在应用软件之内, 内容是又输入 <BR>服务器发送的, 应用程序负责显示. <BR> <BR>对中文输入来说, 最好的风格是(3),(4),(1). 对大部分中文输入方法, 必须弹出 <BR>辅助区域, 供用户选择, 只有少数的中文输入方法, 如五笔字型, 比较适合(4). <BR>对于状态区域, 中文输入多数选用在Root风格的窗口的某个 位置或使用专用的控 <BR>制条. 在MS Windows下比较常用的光标跟随模式, 可以 用(3),(4)来实现. 鉴于 <BR>Linux下有的用户把X Window设置成为虚屏模式, 选 择上述的任何一种模式都不 <BR>尽满意. <BR> <BR>对应用软件来说, 最简单的输入接口是Root风格, 它把显示部分交给 输入服务器 <BR>去做. 编写软件时所用的代码量少, 是对软件初步使用国际化 标准的最佳选择. <BR>从方便用户的角度来看, 应用软件, 特别是高层的库函数 应该同时支持四种输入 <BR>风格. 令人遗憾的是, 一般软件仅支持两到三种输入 风格. 所以在现在的输入服 <BR>务器(IM Server)也很少支持四种风格, 这似乎 成了鸡和蛋的问题. <BR> <BR>下面列出几种常用软件和图形库的XIM支持情况: <BR> <BR>NetscapeRoot,OffTheSpot,OverTheSpot <BR>Java Root,OnTheSpot <BR>Qt Root,OverTheSpot <BR>gtk+ Root,OverTheSpot <BR>rxvt Root,OffTheSpot,OverTheSpot <BR> <BR>中文输入需要客户软件和服务器软件的的密切配合, 它们之间是通过 XIM(X <BR>Input Method)协议来通讯的. 输入服务器首先起动, 在X Server里 注册自己, <BR>服务器的名字也被注册. 当客户程序起动时, 到X Server里查寻 有没有符合自己 <BR>locale类型的输入服务器(如果用XMODIFIERS指定服务器名, 则同时用locale和名 <BR>字区分). 找到后, 根据输入服务器提供的风格种类 选择一个最适合自己的风格. <BR>然后客户程序为每一个需要输入的窗口都建立 一个自己的标示IC(Input <BR>Context), 里面含有客户程序的信息, 以后的通讯 则一直使用该标示. <BR> <BR>下面是直接使用X Lib和服务器联接的过程, 在高层函数库中, 把这一 过程隐藏 <BR>了起来: <BR> <BR> <BR>XIM im; <BR>XIC ic; <BR>... <BR>if( (im = XOpenIM(display, NULL, NULL, NULL)) == NULL ) { <BR>printf("Error : XOpenIM !\n"); <BR>exit(0); <BR>} <BR> <BR>//指定预编辑的类型等... <BR>if( (ic = XCreateIC(im, <BR>XNInputStyle, XIMPreeditPosition | XIMStatusNothing, <BR>XNClientWindow, window, <BR>NULL)) == NULL ) { <BR>printf("Error : XCreateIC() ! \n"); <BR>XCloseIM(im); <BR>exit(0); <BR>} <BR>... <BR> <BR>for(;;) { <BR>XNextEvent(display, &event); <BR> <BR>//如果输入服务器接收并处理...继续 <BR>if (XFilterEvent(&event, None) == True) <BR>continue; <BR>switch(event.type) { <BR>case Expose: <BR>XmbDrawString(...); <BR>case KeyPress: <BR>count = XmbLookupString(ic, <BR>(XKeyPressedEvent *) &event, <BR>string, len, &keysym, &status); <BR>... <BR>} <BR>} <BR> <BR> <BR>目前使用比较广泛的XIM输入服务器有Chinput(简体中文, 同时支持繁体), xcin <BR>(繁体中文), kinput2(日文) 和 hanIM/ami(韩文). <BR> <BR>中文输入服务器Chinput 选择了OverTheSpot风格作为缺省的输入模式, 它与标准 <BR>的输入风格略有不同, 即把预编辑区域偏离输入位置, 使输入区 域同时作为状态 <BR>区域, 在很大程度满足了用户的输入习惯. 同时它还使用 辅助工具条显示和改变 <BR>输入状态. Chinput还解决了同时使用GB和Big5编码 的问题, 被动输入(Passive <BR>Input)问题等. 对于普通用户, 除了使用键盘 输入外, 还可以使用手写识别输入 <BR>和语音识别输入方式. 目前的输入架构 基本能够满足它们的要求. 笔者在手写识 <BR>别输入方面做了一些尝试, 发 现对绝大部分软件是能够适合被动输入的. <BR> <BR>4. 打印的国际化 <BR> <BR>在X窗口系统下的打印是一个很难解决的问题, 所以到目前为止没有形成 一个统 <BR>一的打印标准. 其原因之一就是X窗口系统在设计上把显示和打印完全 分开了. <BR> <BR>在Linux最常见的需要打印的文件格式是普通文本文件和PostScript文件. 对于中 <BR>文的普通文本文件的打印一般需要先转换为PostScript文件再打印. 对于 <BR>PostScript文件, 如果应用软件在生成时含有中文字体信息, 则打印 比较容易实 <BR>现, 反之, 则很难实现甚至不可能打印. <BR> <BR>目前中文文本文件常用的打印方法通常是,使用gb2ps/bg2ps/cnprint 等 软件转 <BR>换成PS文件打印, 转换过程使用了中文的点阵字体. 对已经形成的PS 文件的打 <BR>印, 如果不包含中文字体, 直接打印就会输出乱码, 通常使用的方法 是将这一类 <BR>PS文件过滤一下, 改为使用中文字体, 然后再打印. 如陈向阳先生 的过滤软件 <BR>ps2cps可以打印Netscape的存储文件. 这种打印的缺点是有时输出 的PS中汉字字 <BR>符串和英文字符串对不齐. 最好的方法是在PostScript一级实现 中文打印, 陈向 <BR>阳先生对ghostscript进行了中文化, 可以直接使用TTF轻松打 印Netscape, <BR>Qt/KDE, lyx等软件输出的PS文件. 这种从底层实现打印的方法 也是日文和韩文 <BR>所采用的方法. <BR> <BR>使用CID(adobe)字体打印的方法也在尝试之中. <BR> <BR>总之, 目前的中文打印缺乏统一标准, 应用软件在输出打印PS文件时多数 不考虑 <BR>双字节语言的问题, 使打印变得更加复杂化, 所以当前的中文Linux发 布版本多 <BR>数不支持中文打印, <BR> <BR>5. 客户程序间通讯的国际化 <BR> <BR>客户程序间通讯(Interclient Communications Conventions, 简称ICCC)是 客户 <BR>程序之间共享资源的手段之一. 最常见的应用是文本的拷贝和粘贴和与窗口 管理 <BR>器通讯. 但是如果两个应用程序之间所使用的字符集不同, 粘贴就会出现问 题, <BR>甚至粘贴的内容会丢失. 所以客户程序之间必须国际化了的通讯协议. <BR> <BR>应用程序和窗口管理器之间的通讯也属于客户程序间通讯. <BR> <BR>如果客户程序之间使用的字符集相同, 但是编码不同, 则不会丢失数据, 这时应 <BR>该使用复合文本(COMPOUND TEXT)传输. X内部定义了COMPOUND_TEXT 的原子 <BR>(Atom)用于传输中英文混和的字符串. 对7字节编码, ASCII或者其它 ISO8859-1 <BR>字符集, 客户程序通讯可以不用转换而直接使用XA_STRING原子传输. <BR> <BR>Linux is my life. <BR>=>欢迎访问主页 <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.214.121] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -