关于操作系统中英⽂切换的.po和.mo介绍
⼀、⽂件简介
.po⽂件,.mo⽂件,.pot⽂件是由gettext程序⽣成或者使⽤的源代码和编译结果。
1、.pot⽂件
是⼀种模板⽂件,其实质与.po⽂件⼀样,其中包含了从源代码中提取所有的翻译字符串的列表,主要提供给翻译⼈员使⽤。
从源码中扫描得到的翻译模版⽂件,原始语⾔取决于源码字符串中使⽤的⾃然语⾔,建议使⽤英⽂。纯⽂本格式;
2、.po⽂件
根据POT⽂件建⽴的各种语⾔版本的待翻译⽂件,其中包含原始语⾔和被翻译的⽬标语⾔。纯⽂本格式;
(1)⽤程序msginit来分析pot⽂件,⽣成各语⾔对应的po⽂件,⽐如中⽂就是zh_,法语就是⽂件。
(2)PO是PortableObject(可移植对象)的缩写形式,它是⾯向翻译⼈员的、提取于源代码的⼀种资源⽂件。
(3).po⽂件可以⽤任何编辑器如poEdit,vi,Emacs,editplus打开,交给翻译⼈员来将其中的⽂字翻译成本国语⾔。
在我们系统中,直接新建.po⽂件修改即可。在诊断模式下:/usr/share/locale/zh_CN/LC_MESSAGES路劲下存放了对应的⽂件。⽬
前仅⽀持中英⽂!
3、.mo⽂件
供最终软件实际使⽤的⽂件,使⽤PO编译⽽成。⼆进制格式。
(1)⽤msgfmt将.po⽂件编译成mo⽂件,这是⼀个⼆进制⽂件,不能直接编辑。
(2)MO是MachineObject(机器对象)的缩写形式,它是⾯向计算机的、由.po⽂件通过GNUgettext⼯具包编译⽽成的⼆进制⽂件,应⽤
程序通过读取.mo⽂件使⾃⾝的界⾯转换成⽤户使⽤的语⾔,如简体中⽂。
(3)可以⽤⼯具如msgunfmt命令将.mo⽂件反编译为.po⽂件。
gettext是⼀套⼯具集的名称。这套⼯具集包含xgettext/msginit/msgfmt等⼀套建⽴模版(POT)、创建PO⽂件和编译MO⽂件的⼯具。
gettext包含的⼯具如下:
xgettext从源码中⽣成POT模版或直接⽣成PO⽂件
msginit基于POT⽂件⽣成待翻译的PO⽂件;
msgfmt将PO⽂件编译成⼆进制的MO⽂件;
msgunfmt顾名思义,将MO⽂件反编译成PO⽂件;
msgmerge将POT模版⽂件与PO⽂件合并。⽤于在源码更新之后将新的待翻译内容更新到已经翻译的PO⽂件中;
msgcat将多个PO⽂件合并在⼀起。
来源:
维护:
维护po的翻译⼈员在每次得到从新的程序源代码产⽣的po时,都⽤msgmerge来根据旧的已翻译过的po来先处理⼀下新的未翻译的po。
有的msgid前⾯⼀⾏有fuzzy的字样。这说明,第⼀这个po是被msgmerge处理过的;第⼆,已翻译的po⾥没有和这个msgid完全等同的
msgid,只有⾮常相似的。这种情况下,msgmerge仍然会⽤那个相似的msgid来翻译此msgid。不过会给这个msgid标记为fuzzy,表⽰翻译
⼈员仍然要翻译这个msgid,并在翻译后去掉上⾯带fuzzy的这⼀⾏(翻译好后必须去掉,fuzyy。否则⽆法显⽰译⽂)。
在我们系统中,原本/usr/share/locale/zh_CN/LC_MESSAGES路劲下仅存放了对应的mo⽂件。为了便于扩展,修改src/locale/zh_CN下的
Makefile使得⽣成的po⽂件也保存在该路径下。翻译⼈员可以取得该po⽂件进⾏对应的翻译。然后将该翻译过后的po⽂件(例如中⽇,中
韩)存放在/usr/share/locale/路径下即可。最后在程序代码中根据当前语⾔环境在该⽬录下寻找指定的语⾔包进⾏翻译即可。⽐如
。由于存在预加载,我们翻译好的.po⽂件需要重新编译版本下载安装。
TIPS:假如想增加⽇⽂提⽰。需要在src/locale⽬录下仿照zh_CN再新建⼀个⽬录,Makefile的编写仿照zh_CN⽬录即可。然后在新建⽬录下
添加翻译好的中⽇po⽂件。Makefile根据这个⽂件进⾏编译安装即可。同时也需要记得修改系统的查找mo⽂件函数。设备⽬前路径
是usr/share/locale//zh_CN/LC_MESSAGES/,只需要仿照即可在locale⽬录下新增路径即可。
如图所⽰:传⼊的lang需要和页⾯进⾏交互讨论,⽬前系统仅⽀持中⽂,需要新定义新的语⾔字段。然后下⾯的查找判断再根据传⼊的新语
⾔类型增加⼀个判断即可。若bindtextdomain为空代表在当前路径下默认绑定最先找到的mo⽂件。testdomain则解读指定的mo⽂件,若为
空则默认读取最新读到的mo⽂件。故存在多个mo⽂件需要指定绑定的mo.详情参考manbindytextdomain3.
PO⽂件详解:
po⽂件都是由⼀对对的msgid和msgstr组成的。msgid就是原⽂。msgstr就是译⽂。
注:对于不可能出现的提⽰信息可以不写中⽂翻译。
1.可以看到tlocale(LC_ALL,"");设置语⾔环境,第⼆个参数如果为空代表读取当前语⾔环境locale。设置失败返回NULL。“”之间不能加空
格。
2.接着就是bindtextdomain("msg",LANGUAGE_PATH),参考:,功能是:设置包含LC_MESSAGES分类(catalog)的locale⽬录,程序
的.mo⽂件就保存到其下的⽬录中。LC_MESSAGES是locale的⼀个分类(catalog),和其它的分类,如:LC_TIME、LC_CTYPE,是平
级的概念。domainname、locale⽬录、程序当前活动locale,这三者会决定你需要将.mo放到locale⽬录的具体位置,因为当前locale可
能是中⽂zh_CN,也可能是繁体中⽂zh_TW。最终存放路劲是:[locale⽬录]/[活动locale]/LC_MESSAGES/。本设备存放路径则
是usr/share/locale//zh_CN/LC_MESSAGES/
main("msg");参考:,功能是:设置后来使⽤gettext()时的domain。⽰例中设置:textdomain("msg")。⼀般与上⼀步的
domainname相同。若存在多个mo⽂件,上述函数进⾏多次绑定后,则该函数就特别指定当前需要绑定的mo⽂件。
t();参考:,功能是:根据环境读取mo⽂件中的msgid还是msgstr,并返回适当的语⾔类型。
总结步骤:
⼀般的⼯作流程是这样的:
1.在源码中使⽤约定的语法来书写字符串,C语⾔默认是gettext("hello,world")。在本⽂中,将使⽤_("hello,world");
2.使⽤xgettext从源码中扫描出需要翻译的⽂本,建⽴POT⽂件;
3.使⽤msginit命令根据POT⽂件建⽴PO⽂件。或者直接在上⼀步也可以直接建⽴PO⽂件;
4.进⾏⼈⼯翻译(当然也可以进⾏机器翻译),翻译的结果保存在PO⽂件中;
5.使⽤msgfmt命令将PO⽂件编译成MO⽂件;
6.在程序中实现调⽤命令,本⽂中是_函数,这个函数将读取并解析MO⽂件,根据调⽤的原始语⾔⽂本返回翻译之后的⽂本。
C语⾔简单实例:
1.新建1.c⽂件如下:
⽣成pot⽂件。会提取出所有的字符串,如下:
3.根据.pot⽂件可以产⽣不同.po⽂件。
exportLANGUAGE=zh_CN设置当前语⾔环境为中⽂。
msginit-lzh_初始化⽂件,当前路径会⽣成zh_。
进⼊zh_⽂件中增加对应字符串中⽂翻译即可。
zh_-ozh_根据po⽂件⽣成mo⽂件。
-fzh_/usr/share/locale/zh_CN/LC_MESSAGES/。注意中的名称需要和代码中的domianname名称⼀致。
复制mo⽂件到语⾔⽬录下。
gcc1.c,然后./即可看到屏幕打印出来的是:“你好,世界”。
若exportLANGUAGE=en,即可看到屏幕打印出来的是:“hello,world”。
若添加其他语⾔也很简单,只需要对待⼀个中⽂⼀样,⽣成⼀个mo⽂件,并安装到系统中对应的⽬录然后根据系统语⾔环境变量来读取即
可。切换不同语⾔就相当于修改locale.
本文发布于:2022-12-28 15:12:04,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/47303.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |