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. cocos2d-x step by step(3) Double Kill

    喏,咱们已经调通hello world 了,然后呢,咱们做一些高大上的东西,那做什么呢,做一个打乒乓球的小东西,啊哈! 这就是最终界面了,没画一个球形  就用一个白色方框代替吧. 啊哈! public ...

  2. ASP复制文件

    <% dim fs,oldpath,newpath Set fs=Server.CreateObject("Scripting.FileSystemObject") oldp ...

  3. Android的包管理机制浅析(二)

    上篇刚好说到获取到了签名信息,以下进入安装过程,直接上源代码: private void installNewPackageLI(PackageParser.Package pkg, int pars ...

  4. C++字符串操作二

    #include <iostream> #include <assert.h> using namespace std; //模拟实现strcmp函数. bool my_str ...

  5. YUV格式

    http://blog.csdn.net/u011270282/article/details/50696616 http://blog.csdn.net/acs713/article/details ...

  6. ubuntu 16.04 更新 gcc/g++ 4.9.2

    ubuntu 转载 2016年10月12日 :: 标签:ubuntu /g++ /gcc [html] view plain copy sudo dpkg -l g++ 最近在学C++primer , ...

  7. GuozhongCrawler系列教程 (1) 三大PageDownloader

    GuozhongCrawler  QQ群 202568714 教程源代码下载地址:http://pan.baidu.com/s/1pJBmerL GuozhongCrawler内置三大PageDown ...

  8. unity3d开发的android应用中增加AD系统的详细步骤

    unity3d开发的android应用中增加AD系统的详细步骤 博客分类: Unity3d unity3d  Unity3d已经支持android,怎样在程序里增加admob?  试了一下,确实能够, ...

  9. EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案

    本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52400226 EasyDarwin团队的Ba ...

  10. 公网RTSP地址(持续更新)

    H264+AAC: rtsp://a2047.v1412b.c1412.g.vq.akamaistream.net/5/2047/1412/1_h264_350/1a1a1ae555c53196016 ...