12 php arrays gettext zend-translate php-gettext
我一直在寻找开源项目国际化的选择:
每个人似乎都推荐的Gettext显然需要将"语言环境"安装在"系统上"才能使用.请参阅PHP手册中的这个注释,它反映了我的具体情况.这个问题也提出了同样的问题.这不适合开源项目,因为我不相信最终用户在他们的系统上安装了适当的语言环境.此外,您必须安装区域设置才能使用已翻译的字符串(IMO),这非常奇怪.
Zend_Translate有时也推荐使用gettext,但我没有使用Zend框架,因此我认为这不是我的选择.有些人说你可以从Zend框架中拆分它,但我不知道如何.如果有人能告诉我需要哪些文件(我已经下载了Zend框架的tarball)来挑选,我会愿意使用Zend_Translate.
阵列.这就是我现在正在做的事情,但它并不理想,因为:
我可以以某种方式读取.mo没有Gettext或Zend_Translate的文件,还是我必须使用Gettext?如果是这样,我如何使所有语言环境都能正常工作,就像我上面链接的问题一样?
编辑:我现在愿意使用Zend_Translate.我只需要弄清楚我需要哪些文件(如果将它们合并到一个文件中会很棒) - 我不希望在我的项目中使用整个Zend Framework.
更新:我有兴趣看看有多大的开源项目处理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)
Run Code Online (Sandbox Code Playgroud)
但我仍然只是得到英文字符串,即使我已经使用poedit,msgfmt等来制作相应的文件.我也试过重启Apache.
小智 4
这是解决方案:
$lang = 'de'; //debug
setlocale( LC_ALL, 'C.UTF-8' );
bindtextdomain( 'default', PATH . "/locale/$lang" );
bind_textdomain_codeset( 'default', 'UTF-8' );
textdomain( 'default' );
Run Code Online (Sandbox Code Playgroud)
它与我在答案底部发布的示例之间的唯一区别是它C.UTF-8不仅使用C.
我将对此进行更多测试,以及它是否可以跨平台工作,如果我发现其他任何内容,我将更新此答案。