PHP程序国际化小记[i18n]
2011.08.11 | 天气: 阴 | 标签: gettext, i18n, wp破事, 技术, 折腾, 有趣的学习, 正则表达式, 网站Linux上的国际化基本都是由gettext来完成的,配合这.po.mo的使用,可以说是相当方便,PHP程序的国际化我还是第一次做,这里有篇文章讲得非常不错,我这就不存档了。
这里讲下我自己遇到的一些问题:
不能加载.mo文件
明明写好了.mo,路径也正确,却怎么也加载不上来。
得检查两个地方:
-
主机是否支持这个翻译语言
像我写程序和测试用的Ubuntu执行了
locale -a后,只有寥寥几种en_US.utf8 zh_CN.utf8 zh_SG.utf8
而在东哥的主机上测试的时候竟然有191种!而且细心的你可能注意到了,我的Ubuntu上只有两种中文:一个是简体zh_CN.utf8,和新马泰地区的zh_SG.utf8;而东哥的主机上有还有HK TW。所以测试的时候发现所有都写好了却不识别,要先看看主机是否支持。p.s.如果没有ssh,可以新开一个php文件,在里面写入
echo system('locale -a');
保存后访问即可 -
编码问题
编码国内常见的有utf8、gbk、gb2312三种,不过我个人觉得国标码太废柴了,写些别国的文字或者符号就直接趴下了,所以直接用utf8。
setlocale(LC_ALL, $key.'.utf8');
把这段代码加到php中,这样启用的语言和编码格式才能正确加载。注意utf8前还有一个点(这个小问题折腾了我至少10分钟才发现)
HTTP_ACCEPT_LANGUAGE读取问题
真心觉得这问题简直坑爹,因为浏览器传上来(即超级变量$_SERVER['HTTP_ACCEPT_LANGUAGE']里的值)的是「zh-cn」这样的格式,而gettext使用的却是「zh_CN」,大小写还不能搞错,还需要蛋疼地转化一下,这里我用了正则的替换
$name = preg_replace('/(\w+)-(\w+)?/e',"'\\1_'.strtoupper('\\2')", $name);
哈哈,聪明的你应该发现了,就算传上来像「zh」这样的函数,这条正则也会聪明地避开,反向引用和//e的使用,想必我不用多说了。


