Ich habe eine Multi-Container-App auf Docker mit einem httpd:2.4 (Apache)-Container eingerichtet, der als Reverse-Proxy fungiert und Anforderungen an PHP-Dateien an meinen php-fpm-Container weiterleitet.
Alles in diesem Setup funktioniert perfekt, mit Ausnahme von Gettext-Übersetzungen. Ich kann den Docker-Container einfach nicht dazu bringen, eine gettext-Übersetzung im Gebietsschema en_GB zurückzugeben.
Setup:
- Die .mo-Dateien sind in einem Ordner vorhanden, der erfolgreich in meinen php-fpm-Container gemountet wurde, unter /var/www/php/translations, mit dem Struktur:
Code: Select all
en_GB.utf8
LC_MESSAGES
first.mo
second.mo
- In meinem in meinen Container kopierten PHP-Code rufe ich dies auf, bevor ich versuche, eine gettext-Übersetzung über _() oder dgettext() abzurufen:
Code: Select all
 bindtextdomain('first', '/var/www/php/translations');
bindtextdomain('second', '/var/www/php/translations');
- Runnig locale -a im laufenden php-fpm-Container gibt Folgendes zurück:
Code: Select all
C
C.utf8
POSIX
en_GB.utf8
- Ich habe versucht, die Sprachordner auf z.B. en_GB.UTF-8
- Ich habe versucht, zusätzlich aufzurufen:
Code: Select all
bind_textdomain_codeset('first', 'UTF-8');
bind_textdomain_codeset('second', 'UTF-8');
Code: Select all
var_dumps()- > en_GB.UTF-8Code: Select all setlocale(LC_ALL, "en_GB.UTF-8")
- > zuerstCode: Select all setlocale(LC_ALL, "en_GB.utf8")textdomain('first')
- > SekundeCode: Select all textdomain('second')
Hinweis: Im Apache-Container wird nichts in Bezug auf Gebietsschemas gemacht, aber das sollte in Ordnung sein, da es sich um einen völlig separaten Container handelt Container?
Hinweis: Dieses genaue Setup funktioniert, wenn es auf einer tatsächlichen VM mit Apache als Reverse-Proxy bereitgestellt wird und PHP als FastCGI dahinter ausgeführt wird. Ich habe also keine Ahnung, was mir fehlt.
Docker-Datei meines PHP-FPM-Containers (relevante Teile):
Code: Select all
FROM php:8.2-fpm
RUN  /etc/locale.gen && \
echo "de_CH.UTF-8 UTF-8" >> /etc/locale.gen && \
locale-gen
# Set [url=viewtopic.php?t=25360]environment[/url] variables so PHP uses the locale
ENV LANG=en_GB.utf8
ENV LANGUAGE=en_GB:en
ENV LC_ALL=en_GB.utf8
PHP-Code, mit dem ich versuche, die Übersetzungen an den Geldautomaten zu laden:
Code: Select all
$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');
Code: Select all
_('Hallo')
Code: Select all
dgettext('second','Hallo')
Das Ergebnis ist, dass einfach die msgid immer zurückgegeben wird, in der gettext-Standardsprache (also Hallo statt Hello, egal ob alle Aufrufe erfolgreich sind, wie in meinen oben gezeigten var_dumps erklärt).
Ich habe zunächst nur versucht, die Sprache zu laden über:
Code: Select all
putenv("LC_ALL=$locale_value.utf8");
setlocale(
LC_ALL,
"$locale_value.utf8"
);
Ich habe dann auch versucht, das Verzeichnis /var/www/php/translations in den obigen Aufrufen durch /usr/lib/locale zu ersetzen, da dies das native Locale-Verzeichnis von php-fpms zu sein scheint LC_MESSAGES für das Docker-Image, das ich abrufe. Keine Auswirkung, dasselbe Ergebnis.
PS: Wenn das wichtig ist, ist das PHP-FPM-Image auf Debian aufgebaut, wie Sie im Link des Images sehen können, das meine Docker-Datei verwendet.
Wenn das wichtig ist, implemetiere ich die Reverse-Proxy-Logik über Apache so, dass ich Folgendes in der Apache-Konfiguration verwende, die in meinen Apache-Docker kopiert wird Container:
Code: Select all
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "/var/www/html%{reqenv:SCRIPT_NAME}"
SetHandler "proxy:fcgi://php-fpm:9000"
Auch hier funktioniert alles, die gesamte PHP-Anwendung, mit Ausnahme der Gettext-Sache, wie oben erwähnt.
 Mobile version
 Mobile version