我想开始使用的gettext来处理我的web项目的翻译(PHP 5)。 既然是凭借良好的信誉广泛使用的标准似乎是最好的选择。
不过,我也听到有关服务器的东西不兼容,它是非线程安全的。 这是什么意思为使用它,然后我的项目? 因为我建立的东西,许多人使用,这是非常重要的,我的代码工作。
我们是在谈论小问题(就像人们仍在使用PHP 4)或类似的websevers为低的gettext的分发和安装的重大问题?
我想开始使用的gettext来处理我的web项目的翻译(PHP 5)。 既然是凭借良好的信誉广泛使用的标准似乎是最好的选择。
不过,我也听到有关服务器的东西不兼容,它是非线程安全的。 这是什么意思为使用它,然后我的项目? 因为我建立的东西,许多人使用,这是非常重要的,我的代码工作。
我们是在谈论小问题(就像人们仍在使用PHP 4)或类似的websevers为低的gettext的分发和安装的重大问题?
线程问题仅如果使用嵌入PHP(Apache的MOD-PHP为例),并运行使用线程(像工人MPM的Apache服务器)服务器应用。
所以 - 线程安全问题并不适用于你,如果:
所以 - 大多数人默认的Apache安装不应该担心的gettext不是线程安全的,因为默认的Apache的大多数发行版的安装使用非线程prefork的-MPM!
PS也 - 记住,Apache的Windows上有螺纹。
我想多打一些与PHP手册评论部分应该唾骂更多信息....从gettext的部分手动的评论之一
GNU的gettext库的作品在每个过程中,而不是每个线程的基础。 这意味着,在一个多用户设置诸如Apache Web服务器,将仅与prefork的MPM(每个用户即,一个进程)工作。 工人和其他螺纹的MPM将无法正常工作。
此外,许多用户通过设置系统环境变量,例如LANG控制GNU的gettext。 这不是一个web服务器环境中很好地解决由于明显的竞争条件。
http://www.php.net/manual/en/gettext.setup.php
我曾与PHP 30年6月5日VC11 Theard安全同样的问题在Windows 10变通方法发现和解决这个问题, 在这里通过sirio3mil。
与TS显然PHP只能访问地区语言的文件夹。 所以当的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);