使用PHP的Gettext无需安装语言环境(Use PHP Gettext without havi

2019-08-17 19:25发布

我一直在寻找为国际化的一个开源项目的选项:

  • Gettext的,这似乎每个人都建议,显然需要语言环境被“安装在系统上”使用。 请参阅本笔记上的PHP手册,这正好反映了我的情况。 这太问题也问到同样的问题。 因为我不能相信最终用户有其系统上安装相应的语言环境,这是不适合的开源项目。 此外,这是非常非常奇怪的,你要只安装语言环境中使用已翻译(IMO)的字符串。

  • 一个Zend_Translate还建议支持的gettext的时候,但是我没有使用Zend框架,所以我不认为这是我的选择。 有些人说,你可以从Zend框架拆分它,但我不知道如何。 如果有人能告诉我是什么文件,我需要(我已经下载了Zend框架的压缩包),挑,我会开到里用Zend_Translate。

  • 阵列。 这就是我现在做的事情,但它的效果并不理想,因为:

    • 这将是使用了大量的内存来定义每一个翻译的时候,大部分不会由当前页面中使用。
    • 我有发现自己复制阵列,这已经成为1000行代码长在按键的问题,我很少添加任何东西...
    • 这意味着非程序员不能真正转化,而poEdit的是,每个人都希望使用标准。

我能以某种方式阅读.mo文件,而Gettext的或一个Zend_Translate,或者我必须使用gettext? 如果是这样,我怎样才能使所有的语言环境中我连接到上面的问题的工作,什么样的?

编辑:现在我愿意用一个Zend_Translate。 我只需要找出哪些文件,我需要(这将是巨大的,如果他们可以合并成一个文件) - 我不想整个Zend框架在我的项目。


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

  • Moodle的使用数组 。
  • Drupal的似乎使用阵列,数据库回退 。 他们还运行setlocale('C')来获得一个通用的语言环境和规避整个setlocale混乱。
  • WordPress使用自己的职能堆的国际化,但下面不使用gettext。

所以没有这三个随机项目都使用了Zend_Framework,也不直接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的。

Answer 1:

尝试的gettext-PHP 。 它是用PHP编写的gettext的一个下拉replacment。 它最初被做了WordPress的,我想是因为WP需要在其上并不总是配置为各个地区共享主机上运行。 在我看来这是你的问题也是如此。

它有一点性能损失,但它一直不是我的问题,在所有。



Answer 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

我会做的这个更多的测试,如果它跨平台工作,如果我发现任何东西都不会更新这个答案。



Answer 3:

对任何人来说还是有一些问题,这一点,你可以试试下面的代码,这是我从这里得到: 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);
}
?>


文章来源: Use PHP Gettext without having to install locales