我一直在看选项,国际化的一个开源项目:使用PHP的Gettext无需安装语言环境
Gettext的,这似乎每个人都建议,显然需要区域设置为“安装在系统上“ 要使用的。在PHP手册上看到这个note,这反映了我的情况。这SO question也询问同样的问题。这不适用于开源项目,因为我不能相信最终用户在他们的系统上安装了适当的语言环境。此外,您必须安装区域设置才能使用您翻译的字符串(IMO),这非常奇怪。
Zend_Translate有时也推荐使用gettext,但我没有使用Zend框架,所以我不认为这是我的选择。有人说你可以将它从Zend框架中分离出来,但我不知道如何。如果任何人都可以告诉我需要什么文件(我已经下载了Zend框架的tarball)来挑选,我会开放使用Zend_Translate。
数组。这就是我现在做的事情,但它并不理想,因为:
- 将使用了大量的内存来定义每一个翻译的时候,大部分不会由当前页面中使用。
- 我有问题,发现自己复制数组中的密钥,它已经变成1000行代码长,我几乎没有添加任何东西......
- 这意味着非程序员不能真正翻译而POedit是每个人都期望使用的标准。
可我不知读.mo
文件,而Gettext的或一个Zend_Translate,或者我必须使用gettext?如果是这样,我怎样才能使所有的语言环境工作,就像我在上面链接的问题一样?
编辑:我现在愿意使用Zend_Translate。我只需要弄清楚我需要什么文件(如果它们可以合并成一个文件,那将是非常好的) - 我不希望整个Zend Framework在我的项目中。
更新:我很感兴趣,看看开源项目有多大处理国际化:
- Moodle的使用arrays。
- Drupal似乎使用arrays, with a database fallback。他们还运行
setlocale('C')
以获得通用语言环境并规避整个setlocale
混乱。 - WordPress的使用heaps of their own functions i18n,虽然下面确实使用gettext。
因此,就我所见,这三个随机项目都没有使用Zend_Translate,也没有直接使用gettext。
也许这是一个好主意,使用C
区域设置,将语言的名称存储在文本域名中,然后从那里开始。
所以这里的,据我再也忍受不了了:
$lang = 'de'; //debug
setlocale(LC_ALL, 'C');
bindtextdomain('default', PATH . "/locale/$lang");
bind_textdomain_codeset('default', 'UTF-8');
textdomain('default');
var_dump(file_exists(PATH . "/locale/$lang/C/LC_MESSAGES/default.mo")); //bool(true)
但我仍然只得到英文字符串,即使我用poEdit的,等的msgfmt做适当的文件。我也尝试重新启动Apache。
安装语言环境?你什么意思?您只需包含特定的'.mo'文件并设置适当的语言环境。它真的不像你想要的那样可怕。 – vanneto 2013-03-21 07:43:05
如果是这样的话,那会很棒,但我不认为它是......查看问题顶部的链接。 PHP用户手册上的[User notes](http://www.php.net/manual/en/book.gettext.php#91187)也会这样说,并且您需要运行'locale -a'来查看哪些语言环境可以使用(并运行'sudo apt-get install language-pack-langcode-base'来安装额外的语言包)。我自己的测试也反映了这一点。这不适合开源项目,因为我不能指望用户这样做。 – stackunderflow 2013-03-21 07:50:51
简单密钥=>值数组对于完整的翻译系统来说是不够的。他们是否支持复数?语境?分类?域名?注释?这些都是你应该使用的所有功能,也许你现在还不知道。如果你反对gettext,给Zend_Translate一个镜头。你的理由是非真的。 – deceze 2013-03-21 08:19:22