zoukankan      html  css  js  c++  java
  • LC_MESSAGES、语言文件po和mo互相转换

     

    LANGUAGE, LC_ALL, LC_MESSAGES, LANG zz- -   关于这几个环境变量一般认为它们的作用是用来指定程序用户界面语言而且这几个环境变量的优先级是从左到右依次降低的大概的这么理解一下,也没什么太大问题不过其实是不很准确的它们是否起作用还和程序调用某些函数的方式有关主要有这么一些函数:setlocale(), textdomain()/bindtextdomain(), gettext()/dgettext()/dcgettext()详情如下:Wait a sec, 如果对如何写国际化的程序尚不了解的话,还是先看看这个http://xcin.linux.org.tw/i18n/pc2000/p5/index.html首先,这几个环境变量并不能自动控制库函数(比如gettext)所使用的locale。也就是说设置了这些环境变量,程序的界面语言可能没有变化,虽然这样的软件应该很少。所有的c语言程序默认的locale都是"C"。 setlocale可以改变库函数所用的locale。如果希望利用这些环境变量来设定库函数所使用的locale或者某个locale的 category,一定要用""作为setlocale的第二个参数来调用setlocale()。绝大多数软件都会这样做:setlocale(LC_ALL, "");如果不调用setlocale(),或者使用其他自己指定的合法locale字符串(比如“zh_CN.utf8")作为第二个参数调用setlocale,那么这些环境变量就一点用都没有。所以如果你正确设定了环境变量,但还是不起作用的话,不排除软件本身有问题。其次,程序界面语言的字符串存于mo文件中。gettext被用来从mo文件中得到这些字符串。mo文件的绝对路径是这样的 DIR_NAME/LOCALE/LC_CATEGORY/DOMAIN_NAME.mogettext 需要依次确定这个路径的各个部分,才能找到正确的mo文件。其中LOCALE部分正是和语言相关的。要确定它,gettext将按照LANGUAGE, LC_ALL, LC_MESSAGES, LANG的顺序挨个检查这些环境变量(注意,可以这样理解,实际不是这样,可以看这个连接http://spaces.msn.com/members/zhllg/Blog/cns!1pZICR9vxlDKAQZ1A4wqfIbw!824.entry glibc决定mo文件路径中LOCALE部分的详细过程 /* in glibc 2.3.6's implementation (intl/dcigettext.c)** in order to determine LOCALE part of the mo file's path** gettext does the following:* 1. getenv("LANGUAGE") first,* if it is set and the current locale is not "C" (which* means setlocale() must have been called to change* the programs locale), then use it** 2. otherwise, it will look into an array* struct __locale_struct {* ...* const char *__name[13];* }* which consists the values of all locale category,* using the value of LC_MESSAGES macro as array index,* and get the corresponding array element, use it** this process is effectively equal to the process of* looking at the following environment variable in turn:* LC_ALL* LC_xxx* LANG* because all the values in the array are set by setlocale()** PS: dcgettext's third parameter can change this behavior* i.e. not use LC_MESSAGE at array index* but this parameter can't be LC_ALL* otherwise, dcgettext don't even look for a mo file* it just return the msgid** for example, the following call will returns "hand"* printf(dcgettext(PACKAGE, "hand/n", LC_ALL));**/ 而且这里有个前提,就是程序的locale一定不能为“C”,也就是说一定要事先调用setlocale()),直到找到一个已经被设置的为止,并用它的值代替上面路径中的LOCALE。其余几个部分,DIR_NAME一般是 “/usr/share/locale”,也可以由bindtextdomain()的第二个参数指定;LC_CATEGORY的值对于gettext ()来说默认是“LC_MESSAGES”,也可以由dcgettext()的第三个参数决定;DOMAIN_NAME初始值是”message“,可以通过textdomain()或者bindtextdomain()的第一个参数指定,一般是程序名。再次,LANGUAGE是glibc的扩展,其他的libc貌似是没有的,它可以是几个值,彼此之间用冒号分开,比如:zh_CN:zh:en_US:en举个例子,一个典型的mo文件的路径是/usr/share/locale/zh_CN/LC_MESSAGES/coreutils.mo顾名思议,ls,cp,mv等程序的中文错误提示信息就来自这个文件以上过程是决定程序输出语言的来源(mo文件),如果找不到,自然就是英文还有一个重要的相关环境变量/locale category 是LC_CTYPELC_CTYPE决定用什么字符集打印出mo里的字符。要注意的是,同一种语言,不管用什么字符集,一个程序都只需要一个mo。比如LC_CTYPE=zh_CN.gbk,程序按gbk字符集输出字符,如果LC_CTYPE=zh_CN.utf8,程序按utf8字符集输出字符最后一点,其实这些信息`info libc`里都有GNU的这些软件的info确实是好东西不过说实话不是很user friendly是reference,而不是tutorial看起来会比较乏味   在Linux中通过locale来设置程序运行的不同语言环境,locale由ANSI C提供支持。locale的命名规则为_.,如zh_CN.GBK,zh代表中文,CN代表大陆地区,GBK表示字符集。在locale环境中,有一组变量,代表国际化环境中的不同设置:LC_COLLATE,定义该环境的排序和比较规则 LC_CTYPE,用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。LC_MONETARY,货币格式LC_NUMERIC,非货币的数字显示格式LC_TIME,时间和日期格式LC_MESSAGES,提示信息的语言。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。 LANGUAGE参数可同时设置多种语言信息,如LANGUANE=”zh_CN.GB18030:zh_CN.GB2312:zh_CN”。LANG,LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALLLC_ALL,它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响举个例子,使用zh_CN.GBK中文locale:einstein:~# export LC_ALL=zh_CN.GBKeinstein:~# localeLANG=zh_CN.GB2312LC_CTYPE=”zh_CN.GBK”LC_NUMERIC=”zh_CN.GBK”LC_TIME=”zh_CN.GBK”LC_COLLATE=”zh_CN.GBK”LC_MONETARY=”zh_CN.GBK”LC_MESSAGES=”zh_CN.GBK”LC_PAPER=”zh_CN.GBK”LC_NAME=”zh_CN.GBK”LC_ADDRESS=”zh_CN.GBK”LC_TELEPHONE=”zh_CN.GBK”LC_MEASUREMENT=”zh_CN.GBK”LC_IDENTIFICATION=”zh_CN.GBK”LC_ALL=zh_CN.GBK 因为我们刚开始按安装的时候选择的是简体中文模式,所以默认的Locale也就是简体中文,当然我们还能增加新的locale和更改locale设置:dpkp-reconfigure locales,也可手动修改/etc/locale.gen文件,添加新的locale,然后执行locale-gen,即可生成新的locale,再通过设置上面说的LC_*变量就可设置系统的locale了。下是我的locale.gen文件:zh_CN GB2312 en_GB ISO-8859-1en_GB.ISO-8859-15 ISO-8859-15en_GB.UTF-8 UTF-8en_US ISO-8859-1en_US.ISO-8859-15 ISO-8859-15en_US.UTF-8 UTF-8zh_CN.GB18030 GB18030zh_CN.GBK GBKzh_CN.UTF-8 UTF-8zh_HK BIG5-HKSCSzh_HK.UTF-8 UTF-8zh_TW BIG5zh_TW.EUC-TW EUC-TWzh_TW.UTF-8 UTF-8        

    如何将语言文件po和mo互相转换 汉化mo文件需要的工具叫gettext,去http://gnuwin32.sourceforge.net/packages/gettext.htm下载一个回来安装,然后运行: msgunfmt.exe d:/english.mo -o d:/english.po
    来反编译mo文件,然后再下载poedit,对english.po进行编辑、翻译,完成后再运行: msgfmt.exe -o d:/chinese.mo d:/english.po 然后就编译完成了chinese.mo文件。 gettext包中包含了msgunfmt.exe、msgfmt.exe 等文件,要下载gettext,poedit请到http://www.sourceforge.net网站搜索下载。

  • 相关阅读:
    ubuntu下文件安装与卸载
    webkit中的JavaScriptCore部分
    ubuntu 显示文件夹中的隐藏文件
    C语言中的fscanf函数
    test
    Use SandCastle to generate help document automatically.
    XElement Getting OuterXML and InnerXML
    XUACompatible meta 用法
    Adobe Dreamweaver CS5.5 中文版 下载 注册码
    The Difference Between jQuery’s .bind(), .live(), and .delegate()
  • 原文地址:https://www.cnblogs.com/noobkey/p/3553731.html
Copyright © 2011-2022 走看看