Я настраиваю многоконтейнерное приложение в Docker с контейнером httpd:2.4 (apache), который действует как запросы обратного прокси-сервера, пересылающие запросы к php-файлам в мой контейнер php-fpm.
Все в этой настройке работает отлично, за исключением переводов gettext. Я просто не могу заставить контейнер Docker возвращать перевод gettext в локали en_GB.
Настройка:
- Файлы .mo присутствуют в папке, успешно смонтированной в моем контейнере php-fpm, в /var/www/php/translations, с структура:
Код: Выделить всё
en_GB.utf8
LC_MESSAGES
first.mo
second.mo
- В моем PHP-коде, скопированном в контейнер, я вызываю это перед попыткой получить перевод gettext через _() или dgettext():
Код: Выделить всё
bindtextdomain('first', '/var/www/php/translations');
bindtextdomain('second', '/var/www/php/translations');
- Запуск locale -a в работающем контейнере php-fpm возвращает результат:
Код: Выделить всё
C
C.utf8
POSIX
en_GB.utf8
- Я пытался изменить языковые папки, например, на en_GB.UTF-8
- Я попробовал дополнительно позвонить:
Код: Выделить всё
bind_textdomain_codeset('first', 'UTF-8');
bind_textdomain_codeset('second', 'UTF-8');
Код: Выделить всё
var_dumps()- > en_GB.UTF-8
Код: Выделить всё
setlocale(LC_ALL, "en_GB.UTF-8") - > сначала
Код: Выделить всё
setlocale(LC_ALL, "en_GB.utf8")textdomain('first') - > второй
Код: Выделить всё
textdomain('second')
Примечание: в контейнере Apache ничего не делается в отношении локалей, но это должно быть нормально, поскольку это совершенно отдельный контейнер?
Примечание. Эта точная настройка работает при развертывании на реальной виртуальной машине с Apache в качестве обратного прокси-сервера, а за ним работает PHP как fastcgi. Поэтому я совершенно не понимаю, чего мне не хватает.
Dockerfile моего контейнера php-fpm (соответствующие части):
Код: Выделить всё
FROM php:8.2-fpm
RUN /etc/locale.gen && \
echo "de_CH.UTF-8 UTF-8" >> /etc/locale.gen && \
locale-gen
# Set environment variables so PHP uses the locale
ENV LANG=en_GB.utf8
ENV LANGUAGE=en_GB:en
ENV LC_ALL=en_GB.utf8
PHP-код, с помощью которого я пытаюсь загрузить переводы ATM:
Код: Выделить всё
$locale_value = 'en_GB';
putenv("LANGUAGE=$locale_value.utf8");
putenv("LC_LANGUAGE=$locale_value.utf8");
putenv("LANG=$locale_value.utf8");
putenv("LC_LANG=$locale_value.utf8");
putenv("LC_ALL=$locale_value.utf8");
setlocale(
LC_ALL,
"$locale_value.utf8"
);
// Load text domains
bindtextdomain(
domain : 'first',
directory: '/var/www/php/translations'
);
bindtextdomain(
domain : 'second',
directory: '/var/www/php/translations'
);
// Set default textdomain to first textdomain
textdomain('first');
Код: Выделить всё
_('Hallo')
Код: Выделить всё
dgettext('second','Hallo')
В результате всегда возвращается просто msgid на языке gettext по умолчанию (поэтому Hello вместо Hello, независимо от того, все ли вызовы успешны, как описано в моих var_dumps, показанных выше).
Изначально я только пытался загрузить язык через:
Код: Выделить всё
putenv("LC_ALL=$locale_value.utf8");
setlocale(
LC_ALL,
"$locale_value.utf8"
);
Затем я также попытался заменить каталог /var/www/php/translations в приведенных выше вызовах на /usr/lib/locale, поскольку это, похоже, собственный каталог локали php-fpms для LC_MESSAGES для образа докера, который я извлекаю. Никакого эффекта, тот же результат.
PS: Если это имеет значение, образ php-fpm построен поверх Debian, как вы можете видеть по ссылке на изображение, которое использует мой файл докеров.
Тогда, если это имеет значение, я реализую логику обратного прокси-сервера через Apache, используя следующее в конфигурации Apache, которая скопирована в мой докер Apache. контейнер:
Код: Выделить всё
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "/var/www/html%{reqenv:SCRIPT_NAME}"
SetHandler "proxy:fcgi://php-fpm:9000"
Опять же, все работает, все PHP-приложение, за исключением функции gettext, как упоминалось выше.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... -container
Мобильная версия