2013-03-21 82 views
10

我一直在看选项,国际化的一个开源项目:使用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在我的项目中。


更新:我很感兴趣,看看开源项目有多大处理国际化:

因此,就我所见,这三个随机项目都没有使用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。

+0

安装语言环境?你什么意思?您只需包含特定的'.mo'文件并设置适当的语言环境。它真的不像你想要的那样可怕。 – vanneto 2013-03-21 07:43:05

+2

如果是这样的话,那会很棒,但我不认为它是......查看问题顶部的链接。 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

+0

简单密钥=>值数组对于完整的翻译系统来说是不够的。他们是否支持复数?语境?分类?域名?注释?这些都是你应该使用的所有功能,也许你现在还不知道。如果你反对gettext,给Zend_Translate一个镜头。你的理由是非真的。 – deceze 2013-03-21 08:19:22

回答

2

这里是解决方案:

$lang = 'de'; //debug 
setlocale(LC_ALL, 'C.UTF-8'); 
bindtextdomain('default', PATH . "/locale/$lang"); 
bind_textdomain_codeset('default', 'UTF-8'); 
textdomain('default'); 

这一点,我张贴在我的回答底部的例子之间的唯一区别是,它采用C.UTF-8不仅仅是C

我将对此进行更多的测试,如果它能够跨平台工作,并且如果我发现其他问题将更新此答案。

+0

恭喜,它似乎也适用于我。但它似乎真的很黑,我不能相信这是解决这个问题的常用方法。我不明白“C.UTF-8”的语言是什么,但它似乎安装在每个环境中。既然你的帖子是2年前,我会很乐意问你是否在此期间找到了更好的解决方案。 – steven 2015-10-10 12:54:36

+0

对不起@steven,我还没有真正使用PHP至今。不过现在我不太通过最佳实践和烦恼可能会直行基于阵列的解决方案的gettext知道的挫折。 – stackunderflow 2015-10-11 18:24:49

+0

你知道如何在xampp for windows上安装语言环境吗? – Gonzalo 2018-01-25 16:53:06

3

尝试gettext-php。它是用PHP编写的gettext的替代替代品。我认为它最初是为WordPress设计的,因为WP需要在共享主机上运行,​​而这些共享主机并不总是针对每种语言环境进行配置。这在我看来也是你的问题。

它有一点性能问题,但它对我来说一直不是问题。

+0

感谢您的建议。现在,我已经(终于)得到的Gettext去我想我会坚持下去,现在,但我会记住这一点柜面我有什么更多的问题。 – stackunderflow 2013-03-22 23:15:48