Невозможно заставить gettext работать в контейнере Docker php:fpm-8.2.Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Невозможно заставить gettext работать в контейнере Docker php:fpm-8.2.

Сообщение Anonymous »

Я проверил вопросы, касающиеся этой проблемы, они не помогли (см. то, что я пробовал ниже).
Я настраиваю многоконтейнерное приложение в 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()
каждого из следующих методов при запуске в эхо-контейнере: Тем не менее, он не работает (я также дважды проверил, что msgid правильно настроен и переведен, и даже снова и снова создавал файлы .mo).
Примечание: в контейнере 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');
Затем я пытаюсь получить доступ к своим переводам gettext через:

Код: Выделить всё

_('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-fpm — php-fpm, а порт, отображаемый изображением, — 9000).
Опять же, все работает, все PHP-приложение, за исключением функции gettext, как упоминалось выше.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... -container
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»