LANGUAGE, LC_ALL, LC_MESSAGES, LANG(转贴)

    关于这几个环境变量
一般认为它们的作用是用来指定程序用户界面语言
而且这几个环境变量的优先级是从左到右依次降低的

大概的这么理解一下,也没什么太大问题
不过其实是不很准确的
它们是否起作用还和程序调用某些函数的方式有关
主要有这么一些函数: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.mo
gettext 需要依次确定这个路径的各个部分,才能找到正确的mo文件。其中LOCALE部分正是和语言相关的。要确定它,gettext将按照LANGUAGE, LC_ALL, LC_MESSAGES, LANG的顺序挨个检查这些环境变量(注意,可以这样理解,实际不是这样,可以看这个连接
http://spaces.msn.com/members/zhllg/Blog/cns!1pZICR9vxlDKAQZ1A4wqfIbw!824.entry
而且这里有个前提,就是程序的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_CTYPE
LC_CTYPE决定用什么字符集打印出mo里的字符。要注意的是,同一种语言,不管用什么字符集,一个程序都只需要一个mo。比如 LC_CTYPE=zh_CN.gbk,程序按gbk字符集输出字符,如果LC_CTYPE=zh_CN.utf8,程序按utf8字符集输出字符

最后一点,其实这些信息`info libc`里都有
GNU的这些软件的info确实是好东西
不过说实话不是很user friendly
是reference,而不是tutorial
看起来会比较乏味
Anyway,既然搞这个,还是得会用它

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IOT物联网小镇

赏点银子去植发

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值