12

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

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

我们是在谈论小问题(如仍在使用 PHP 4 的人)还是在网络服务器上分发和安装 gettext 低等大问题?

4

3 回答 3

16

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

所以 - 线程安全问题不适用于您,如果:

  1. 你使用 NGINX 服务器(它不使用线程。)
  2. 您在 fastcgi 模式下使用 Apache(是否使用线程 MPM)和 PHP
  3. 您将 Apache 与非线程 MPM(作为 prefork-MPM)和 PHP 在 mod-php 模式下使用。

所以 - 大多数使用默认 Apache 安装的人不应该担心 gettext 不是线程安全的,因为大多数发行版中的默认 apache 安装使用非线程 prefork-MPM!

PS 还 - 请记住 Windows 上的 Apache 是线程化的。

于 2011-07-17T20:27:15.507 回答
2

我认为在 php 手动注释部分中多玩一些应该会破坏更多信息.... gettext 部分手册中的评论之一

GNU gettext 库在每个进程上工作,而不是在每个线程的基础上。这意味着在多用户设置(例如 Apache Web 服务器)中,它只能与 prefork MPM(即每个用户一个进程)一起使用。Worker 和其他线程 MPM 将不起作用。

另外,很多用户通过设置LANG等系统环境变量来控制GNU gettext。由于明显的竞争条件,这对于 Web 服务器环境来说不是一个好的解决方案。

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

于 2009-10-29T20:30:35.210 回答
0

我在 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);
于 2017-02-10T09:29:31.130 回答