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互相转换的更多相关文章

  1. po 和 mo 的互相转换

    反编译 mo 文件成 po 文件 msgunfmt test.mo -o test.po 编码 po 文件为 mo 文件 msgfmt -o test.mo test.po 记着备用.

  2. 关于操作系统中英文切换的.po和.mo介绍

    一.文件简介 .po文件,.mo文件,.pot文件是由gettext程序生成或者使用的源代码和编译结果.   1..pot文件  是一种模板文件,其实质与.po文件一样,其中包含了从源代码中提取所有的 ...

  3. C语言---文件

    1. 需要了解的概念 包括:数据流.缓冲区.文件类型.文件存取方式 1.1 数据流: 指程序与数据的交互是以流的形式进行的.进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流 ...

  4. C 语言文件操作

    C 语言文件操作 1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...

  5. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

  6. 【转】C语言文件操作解析(三)

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  7. C语言文件操作函数大全(超详细)

    C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下   fopen(打开文件)相关函数 open,fc ...

  8. 12. Go 语言文件处理

    Go 语言文件处理 本章我们将带领大家深入了解一下 Go语言中的文件处理,重点在于文件而非目录或者通用的文件系统,特别是如何读写标准格式(如 XML 和 JSON 格式)的文件以及自定义的纯文本和二进 ...

  9. c语言文件读写操作总结

    C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...

随机推荐

  1. [Django] 查看orm自己主动运行的原始查询sql

    django的文档看了非常多.也用了不少,有的时候感觉性能非常不好,知道非常多地方是惰性查询.可是对于复杂的逻辑.仅仅是表面上发现执行非常慢,机器资源消耗非常多.却不知道orm究竟是什么来转化成sql ...

  2. 分布式服务框架选型:面对Dubbo,阿里巴巴为什么选择了HSF?

    转载:http://www.sohu.com/a/141490021_268033 阿里巴巴集团内部使用的分布式服务框架 HSF(High Speed Framework,也有人戏称“好舒服”)已经被 ...

  3. binary-tree-level-order-traversal I、II——输出二叉树的数字序列

    I Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to righ ...

  4. 数据结构与算法系列----AC自己主动机

    一:概念 首先简要介绍一下AC自己主动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之中的一个.一个常见的样例就是给出n个单词,再给出一段 ...

  5. 【LeetCode】Word Break 解题报告

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...

  6. VueJS样式绑定:v-bind

    HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  7. 你必须了解的java内存管理机制(二)-内存分配

    前言 在上一篇文章中,我们花了较大的篇幅去介绍了JVM的运行时数据区,并且重点介绍了栈区的结构及作用,相关内容请猛戳!在本文中,我们将主要介绍对象的创建过程及在堆中的分配方式. 相关链接(注:文章讲解 ...

  8. “懒”也要有境地---大部分程序猿都在的地方,再不来就out了。

    别人在玩.你也在玩,为什么别人天天进步,职业晋升. 而你则原地踏步. 事实上你和他的距离仅仅有一个微信公众号的距离. 假设你说.我根本没有时间学习,不想看书,我仅仅想睡觉.我想你要接着往下看,由于.谁 ...

  9. 【BZOJ1085】[SCOI2005]骑士精神 双向BFS

    [BZOJ1085][SCOI2005]骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它 ...

  10. SpringInAction4笔记——复习

    由于目前只做后端的业务代码的开发,所以根据自己掌握的熟悉程度,只需要复习几个模块即可 重点看的是核心容器(IOC),redis,缓存,消息(主要是rabbitmq),事务,springboot,单元测 ...