Gettext kann im Docker-Container php:fpm-8.2 nicht zum Laufen gebracht werdenPhp

PHP-Programmierer chatten hier
Anonymous
 Gettext kann im Docker-Container php:fpm-8.2 nicht zum Laufen gebracht werden

Post by Anonymous »

Ich habe die Fragen zu diesem Problem überprüft, sie haben nicht geholfen (siehe unten, was ich versucht habe).
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');
Was ich versucht habe:
  • 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()
jeder der folgenden Methoden, wenn sie im Containerecho ausgeführt werden:
  • Code: Select all

    setlocale(LC_ALL, "en_GB.UTF-8")
    > en_GB.UTF-8
  • Code: Select all

    setlocale(LC_ALL, "en_GB.utf8")textdomain('first')
    > zuerst
  • Code: Select all

    textdomain('second')
    > Sekunde
Trotzdem funktioniert es nicht (ich habe auch noch einmal überprüft, ob die msgid richtig eingerichtet und übersetzt ist, und habe sogar .mo-Dateien immer wieder neu generiert).
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
Weitere Details:
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');
Ich versuche dann, auf meine gettext-Übersetzungen zuzugreifen über:

Code: Select all

_('Hallo')
... für den ersten, oder:

Code: Select all

dgettext('second','Hallo')
... für Sekunde.
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"
);
... aber ich bin so geduldig mit diesem Problem fertig, dass ich einfach so ziemlich jede globale Variable, über die ich lese, in Bezug auf dieses Problem gesetzt habe.
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"


(Der Name des php-fpm-Containers lautet php-fpm und der vom Bild verfügbar gemachte Port lautet 9000).
Auch hier funktioniert alles, die gesamte PHP-Anwendung, mit Ausnahme der Gettext-Sache, wie oben erwähnt.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post