PHP Gettext问题(比如非线程安全的?)

时间:2009-10-29 20:11:46

标签: php internationalization gettext

我想开始使用gettext来处理我在Web项目上的翻译(PHP 5)。由于它是一个广泛使用的标准,具有良好的声誉,它似乎是最好的选择。

但是,我也听到有关服务器不兼容的事情,并且它是非线程安全的。这对我使用它的项目意味着什么?由于我构建了许多人使用的东西,因此我的代码工作非常重要。

我们是在谈论小问题(比如仍在使用PHP 4的人)还是主要问题,例如在websevers上分发和安装gettext的问题很少?

3 个答案:

答案 0 :(得分:15)

线程问题仅适用于使用嵌入式PHP(例如Apache的mod-php)并运行使用线程的服务器(如带有worker-mpm的Apache服务器)。

因此 - 如果出现以下情况,则线程安全问题不适用于您:

  1. 您使用NGINX服务器(它不使用线程。)
  2. 您使用Apache(无论是否有线程MPM)和快速模式下的PHP
  3. 您在非线程MPM(作为prefork-MPM)和PHP的mod-php模式下使用Apache。
  4. 所以 - 大多数使用默认Apache安装的人都不应该担心gettext不是线程安全的,因为大多数发行版的默认apache安装都使用非线程prefork-MPM!

    P.S。另外 - 请记住,Windows上的Apache是​​线程化的。

答案 1 :(得分:2)

我认为使用php手册评论部分更多信息应该辱骂更多信息....来自gettext部分手册的评论之一

  

GNU gettext库适用于   每个进程,而不是每个线程。   这意味着在多用户中   设置,如Apache Web服务器   它只适用于prefork MPM   (即每个用户一个进程)。工人   和其他线程MPM将无法正常工作。

     

此外,许多用户控制GNU   通过设置系统环境获取文本   变量如LANG。这不是一个   Web服务器的良好解决方案   由于明显的种族环境   条件。

http://www.php.net/manual/en/gettext.setup.php

答案 2 :(得分:0)

我遇到了与PHP 5.6.30 VC11 Theard Safe在Windows 10上相同的问题。解决方法通过sirio3mil找到并解决了这个问题here

显然,带有TS的PHP只能访问Locale语言文件夹。因此,当使用除系统之外的其他语言调用setlocale和putenv函数时,无法读取.mo和.po文件夹。

解决方法是只为每种翻译语言提供一个包含系统语言的语言文件夹和多对.mo / .po文件。域名将设置为想要的语言。

瑞士法语,德语和意大利语的例子:

文件夹结构

  

\地点\ fr_CH表示\ LC_MESSAGES

     
      
  • fr_CH.mo + fr_CH.po //系统语言
  •   
  • de_CH.mo + de_CH.po
  •   
  • it_CH.mo + it_CH.po
  •   

代码

$lang = 'fr_CH' or 'de_CH' or 'it_CH'

bindtextdomain($lang, '.\Locale');
textdomain($lang);
bind_textdomain_codeset($lang, 'UTF-8');
setlocale (LC_ALL, $lang);
putenv('LC_ALL=' . $lang);