Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP Gettext而不必安装区域设置_Php_Arrays_Gettext_Zend Translate_Php Gettext - Fatal编程技术网

使用PHP Gettext而不必安装区域设置

使用PHP Gettext而不必安装区域设置,php,arrays,gettext,zend-translate,php-gettext,Php,Arrays,Gettext,Zend Translate,Php Gettext,我一直在寻找开源项目国际化的选项: 每个人似乎都推荐使用Gettext,它显然需要使用“安装在系统上”的区域设置。请参阅PHP手册中的这一点,它正好反映了我的情况。这也提出了同样的问题。这不适用于开源项目,因为我不能相信最终用户在他们的系统上安装了适当的区域设置。此外,非常奇怪的是,为了使用已翻译的字符串(IMO),您必须安装locale Zend_Translate有时也建议支持gettext,但我没有使用Zend框架,所以我认为它不是我的选择。有人说你可以把它从Zend框架中分离出来,但我

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

  • 每个人似乎都推荐使用Gettext,它显然需要使用“安装在系统上”的区域设置。请参阅PHP手册中的这一点,它正好反映了我的情况。这也提出了同样的问题。这不适用于开源项目,因为我不能相信最终用户在他们的系统上安装了适当的区域设置。此外,非常奇怪的是,为了使用已翻译的字符串(IMO),您必须安装locale

  • Zend_Translate有时也建议支持gettext,但我没有使用Zend框架,所以我认为它不是我的选择。有人说你可以把它从Zend框架中分离出来,但我不知道怎么分离。如果有人能告诉我需要哪些文件(我下载了一个Zend框架的tarball)来挑选,我愿意使用Zend_Translate

  • 数组。这就是我现在正在做的,但并不理想,因为:

    • 定义每一个翻译都会占用大量内存,而当前页面不会使用大部分内存
    • 我发现自己在复制数组中的键时遇到了问题,数组已经有1000行代码了,我几乎还没有添加任何东西
    • 这意味着非程序员不能真正翻译,而POedit是每个人都希望使用的标准
我是否可以在没有Gettext或Zend_Translate的情况下读取
.mo
文件,或者我必须使用Gettext?如果是这样的话,我如何让所有的区域设置都工作,就像我上面链接的问题一样

编辑:我现在愿意使用Zend_Translate。我只需要弄清楚我需要什么文件(如果它们可以合并成一个文件那就太好了)——我不希望整个Zend框架出现在我的项目中


更新:我很想看看大型开源项目如何处理i18n:

  • 穆德尔使用
  • Drupal似乎使用。它们还运行
    setlocale('C')
    ,以获得通用的区域设置,并绕过整个
    setlocale
    混乱
  • Wordpress使用i18n,尽管下面确实使用gettext
就我所见,这三个随机项目中没有一个直接使用Zend_Translate,也没有一个直接使用gettext

也许最好使用
C
locale,将语言名称存储在文本域名中,然后从那里开始


这就是我所知道的:

$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。

以下是解决方案:

$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

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

试试。这是用PHP编写的gettext的一个临时替代品。我认为,它最初是为WordPress完成的,因为WP需要在共享主机上运行,而共享主机并不总是针对每个语言环境进行配置。在我看来,这也是你的问题


它的性能受到了一定的影响,但对我来说根本不是问题。

对于任何对此仍有问题的人,您可以尝试下面的代码,我从这里获得:

它在freebsd服务器上解决了我的问题,没有额外的语言环境安装(fr\u fr和my\u 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);
}
?>


是否安装区域设置?什么意思?您只需包含特定的
.mo
文件并设置适当的区域设置。它真的没有你想象的那么可怕。如果是这样的话那就太好了,但我不认为它是。。。请参阅问题顶部的链接。在PHP手册上也有这样的说明,您需要运行
locale-a
来查看可以使用哪些语言环境(并运行
sudo-apt-get-install-langcode-base
来安装额外的语言包)。我自己的测试也反映了这一点。这不适用于开源项目,因为我不能期望用户这样做。简单的key=>value数组对于一个完整的翻译系统来说是不够的。他们支持复数吗?上下文类别?域名?评论?这些都是你应该使用的功能,也许你还不知道。如果你不喜欢gettext,给Zend_Translate一次机会。你反对它的理由其实是没有理由的。是的,这就是为什么我想从阵列切换到其他东西。我想如果我需要的话,我会愿意使用Zend_Translate,但是如何使用呢?人们打开它,这样他们就可以将它从Zend框架的其余部分中分离出来,但我不知道如何分离。只需将Zend框架放在某个地方,然后加载
Zend_Translate
类,完成。感谢您的建议。现在我(终于)开始使用Gettext了,我想我现在会继续使用它,但我会记住这一点,以防我有更多的问题。祝贺你,它似乎也对我有用。但这似乎真的很棘手,我不能相信这是解决这个问题的常用方法。我不明白“C.UTF-8”是什么语言,但它似乎安装在每个环境中。由于你的帖子是2年前发布的,我想问你,在这段时间里,你是否找到了更好的解决方案。对不起@steven,从那以后我就没有真正使用过PHP。然而,现在我对最佳实践不太在意,我可能会直接选择基于阵列的解决方案,因为我知道gettext的缺点。你知道如何在xampp for windows上安装区域设置吗?