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网站搜索下载。
LC_MESSAGES、语言文件po和mo互相转换的更多相关文章
- po 和 mo 的互相转换
反编译 mo 文件成 po 文件 msgunfmt test.mo -o test.po 编码 po 文件为 mo 文件 msgfmt -o test.mo test.po 记着备用.
- 关于操作系统中英文切换的.po和.mo介绍
一.文件简介 .po文件,.mo文件,.pot文件是由gettext程序生成或者使用的源代码和编译结果. 1..pot文件 是一种模板文件,其实质与.po文件一样,其中包含了从源代码中提取所有的 ...
- C语言---文件
1. 需要了解的概念 包括:数据流.缓冲区.文件类型.文件存取方式 1.1 数据流: 指程序与数据的交互是以流的形式进行的.进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流 ...
- C 语言文件操作
C 语言文件操作 1. 数据流: 程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流. 所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...
- C语言文件操作函数
C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...
- 【转】C语言文件操作解析(三)
原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...
- C语言文件操作函数大全(超详细)
C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fc ...
- 12. Go 语言文件处理
Go 语言文件处理 本章我们将带领大家深入了解一下 Go语言中的文件处理,重点在于文件而非目录或者通用的文件系统,特别是如何读写标准格式(如 XML 和 JSON 格式)的文件以及自定义的纯文本和二进 ...
- c语言文件读写操作总结
C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...
随机推荐
- libsvm交叉验证与网格搜索(参数选择)
首先说交叉验证.交叉验证(Cross validation)是一种评估统计分析.机器学习算法对独立于训练数据的数据集的泛化能力(generalize), 能够避免过拟合问题.交叉验证一般要尽量满足:1 ...
- python得到最长递增子串长度及起始位置【转】
def incSeq(seq): start = 0 for i in xrange(1, len(seq)): if seq[i] < seq[i-1]: yield start, i - s ...
- C#遇见的函数
1.类Stopwatch 提供一组方法和属性,可用于准确地测量运行时间. 命名空间: System.Diagnostics Stopwatch timePerParse = Stopwatc ...
- [Algorithm] JavaScript Graph Data Structure
A graph is a data structure comprised of a set of nodes, also known as vertices, and a set of edges. ...
- 《UNIX-Shell编程24学时教程》读书笔记Chap1,2 Shell基础,脚本基础
Chap1 Shell基础 知道该使用哪种命令是依赖于经验的.----惟手熟尔. 1.1 什么是命令 其实知道这些名词好像也没什么帮助,嘻嘻 1.2 什么是Shell 不同用户不同的提示符:不同的环境 ...
- mysql:“Access denied for user 'root@IP地址'"
请仔细.再仔细确认你的用户名.密码.IP是否有误! 可悲的我老犯这种低级错误,以为用户没权限访问,唉..
- Plug and Play
http://baike.baidu.com/view/33701.htm 即插即用 编辑 PNP是Plug-and-Play(即插即用)的缩写.它的作用是自动配置(低层)计算机中的板卡和其他设备 ...
- Linux 下编译安装OpenCV(zhuanzai)
http://www.cnblogs.com/emouse/archive/2013/02/22/2922940.html Cmake的安装 OpenCV 2.2以后版本需要使用Cmake生成make ...
- asp.net core 初探 二
今天用@宇内流云大大的jexus 体验一下生产环境的发布,运行. 生产环境: centos 7 jexus 5.8.1 独立版 包含了mono (mono安装真心痛苦……) 开发环境就是昨天的Ubun ...
- C++输入一行字符串的一点小结
C++输入一行字符串的一点小结 原文链接: http://www.wutianqi.com/?p=1181 大家在学习C++编程时.一般在输入方面都是使用的cin. 而cin是使用空白(空格,制表符和 ...