我想开始使用 gettext 来处理我对 Web 项目 (PHP 5) 的翻译。由于它是一个广泛使用的标准,享有良好的声誉,因此它似乎是最佳选择。
但是,我也听到有关服务器不兼容的事情并且它是非线程安全的。这对我使用它的项目意味着什么?由于我构建了许多人使用的东西,因此我的代码能够正常工作非常重要。
我们是在谈论小问题(如仍在使用 PHP 4 的人)还是在网络服务器上分发和安装 gettext 低等大问题?
我想开始使用 gettext 来处理我对 Web 项目 (PHP 5) 的翻译。由于它是一个广泛使用的标准,享有良好的声誉,因此它似乎是最佳选择。
但是,我也听到有关服务器不兼容的事情并且它是非线程安全的。这对我使用它的项目意味着什么?由于我构建了许多人使用的东西,因此我的代码能够正常工作非常重要。
我们是在谈论小问题(如仍在使用 PHP 4 的人)还是在网络服务器上分发和安装 gettext 低等大问题?
线程问题仅适用于使用嵌入式 PHP(例如 Apache 的 mod-php)并运行使用线程的服务器(如带有 worker-mpm 的 Apache 服务器)的情况。
所以 - 线程安全问题不适用于您,如果:
所以 - 大多数使用默认 Apache 安装的人不应该担心 gettext 不是线程安全的,因为大多数发行版中的默认 apache 安装使用非线程 prefork-MPM!
PS 还 - 请记住 Windows 上的 Apache 是线程化的。
我认为在 php 手动注释部分中多玩一些应该会破坏更多信息.... gettext 部分手册中的评论之一
GNU gettext 库在每个进程上工作,而不是在每个线程的基础上。这意味着在多用户设置(例如 Apache Web 服务器)中,它只能与 prefork MPM(即每个用户一个进程)一起使用。Worker 和其他线程 MPM 将不起作用。
另外,很多用户通过设置LANG等系统环境变量来控制GNU gettext。由于明显的竞争条件,这对于 Web 服务器环境来说不是一个好的解决方案。
我在 Windows 10 上使用 PHP 5.6.30 VC11 Theard Safe 时遇到了同样的问题。解决方法在这里由 sirio3mil 找到并解决了这个问题。
显然,带有 TS 的 PHP 只能访问 Locale 语言文件夹。因此,当 setlocale 和 putenv 函数使用系统语言以外的另一种语言调用时,无法读取带有 .mo 和 .po 的文件夹。
解决方法是只有一个包含系统语言的语言文件夹和多对 .mo/.po 文件用于每种翻译的语言。域将设置为所需的语言。
以瑞士法语、德语和意大利语为例:
\Locale\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);