Я хочу начать использовать gettext для обработки моих переводов на веб-проектах (PHP 5). Поскольку он является широко используемым стандартом с хорошей репутацией, он кажется лучшим выбором.
Тем не менее, я также слышу о несовместимости сервера, и он не является потокобезопасным. Что это значит для моих проектов, которые используют его тогда? Поскольку я строю вещи, которые используют многие люди, очень важно, чтобы мой код работал.
Мы говорим о незначительных проблемах (например, о людях, которые все еще используют PHP 4), или о серьезных проблемах, таких как распространение и установка gettext на веб-страницах, которые являются низкими?
Проблема потоков применяется только в том случае, если вы используете встроенный PHP (например, mod-php от Apache) и запускаете сервер, который использует потоки (например, сервер Apache с рабочим-mpm).
Таким образом, проблема безопасности потоков не распространяется на вас, если:
Таким образом, большинство пользователей с установкой Apache по умолчанию не должны беспокоиться о том, что gettext не является потокобезопасным, поскольку установка по умолчанию apache в большинстве дистрибутивов использует не-threaded prefork-MPM!
PS также – имейте в виду, что Apache на Windows имеет резьбу.
Я думаю, что сыграть еще немного с частью комментариев с комментариями php, должно понести больше информации … один из комментариев руководства по разделу gettext
Библиотека GNU gettext работает для каждого процесса, а не для каждого потока. Это означает, что в многопользовательских настройках, таких как веб-сервер Apache, он будет работать только с предпродажным MPM (т.е. одним процессом для каждого пользователя). Рабочий и другие многопоточные MPM не будут работать.
Кроме того, многие пользователи контролируют GNU gettext, устанавливая переменные системной среды, такие как LANG. Это нехорошее решение для среды веб-сервера из-за очевидного состояния гонки.
У меня была такая же проблема с PHP 5.6.30 VC11 Theard Safe в Windows 10. Обходное решение найдено и исправляет эту проблему здесь sirio3mil.
Очевидно, что PHP с TS может обращаться только к языковой папке языка. Поэтому, когда функция 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);