关于这几个环境变量
一般认为它们的作用是用来指定程序用户界面语言
而且这几个环境变量的优先级是从左到右依次降低的
大概的这么理解一下,也没什么太大问题
不过其实是不很准确的
它们是否起作用还和程序调用某些函数的方式有关
主要有这么一些函数: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,既然搞这个,还是得会用它