我一直在寻找开源项目国际化的选择:
每个人似乎都建议使用Gettext,显然需要将“语言环境”安装在“系统上”才能使用。请参阅PHP手册中的note,这完全反映了我的情况。这SO question也问了同样的问题。这不适合开源项目,因为我不相信最终用户在他们的系统上安装了适当的语言环境。此外,您必须安装区域设置才能使用已翻译的字符串(IMO),这非常奇怪。
Zend_Translate有时也推荐使用gettext,但我没有使用Zend框架,所以我认为这不是我的选择。有些人说你可以从Zend框架中拆分它,但我不知道如何。如果有人能告诉我我需要哪些文件(我已经下载了Zend框架的tar包),我会接受使用Zend_Translate。
阵列。这就是我现在正在做的事情,但这并不理想,因为:
我可以以某种方式读取没有Gettext或Zend_Translate的.mo
文件,还是我必须使用Gettext?如果是这样,我怎样才能使所有语言环境都有效,就像我上面链接的问题一样?
更新:我有兴趣看看有多大的开源项目处理i18n:
setlocale('C')
来获取通用语言环境并绕过整个setlocale
混乱。因此,就我所见,这三个随机项目都没有使用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 :(得分:3)
以下是解决方案:
$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
。
我会对此进行更多测试,如果它跨平台工作,如果我发现其他任何内容,我会更新此答案。
答案 1 :(得分:3)
试试gettext-php。它是用PHP编写的gettext的替代品。我认为它最初是为WordPress完成的,因为WP需要在共享主机上运行,而共享主机并不总是为每个语言环境配置。在我看来,这也是你的问题。
它有一点性能损失,但对我来说根本不是问题。
答案 2 :(得分:0)
对于仍然对此有任何疑问的任何人,您都可以尝试下面的代码,我从这里得到: http://php.net/manual/en/function.gettext.php#58310
它在freebsd服务器上解决了我,没有额外的语言环境安装(fr_FR和my_MY) 当您对gettext缓存有问题时,此代码也很有用。
<?php
function initialize_i18n($locale) {
$locales_root="/app/php/locale"; // change This to where you locale folder at
putenv('LANG='.$locale);
setlocale(LC_ALL,"");
setlocale(LC_MESSAGES,$locale);
setlocale(LC_CTYPE,$locale);
$domains = glob($locales_root.'/'.$locale.'/LC_MESSAGES/*.mo');
$current = basename($domains[0],'.mo');
$timestamp = preg_replace('{messages-}i','',$current);
bindtextdomain($current,$locales_root);
textdomain($current);
}
?>