Ich muss eine reine Windows-PHP-Webanwendung lokalisieren und evaluiere die Gettext-Erweiterung , aber ich habe die schwierigste Zeit versuchen, es in meiner Windows 7-Entwicklungsumgebung funktionieren zu lassen. Ich habe Trial and Error zusammen mit Process Monitor verwendet, um die schlechte und ungenaue Dokumentation und ich zu überwinden habe es geschafft, _()
Zeichenketten aus dem * .po-Katalog zu machen, der dem Standard-Gebietsschema des Computers entspricht (in meinem Fall Modern Spanish). Alle meine Versuche, ein anderes Gebietsschema festzulegen, werden stillschweigend ignoriert.
Ich habe ein Testskript mit vielen überflüssigen Dingen geschrieben:
%Vor% In meinem Fall gibt <?=_('codigo_idioma')?>
immer es_ES@modern
aus.
Ich habe PHP / 5.4.5, aber ich erwarte, dass es in jedem einigermaßen aktuellen Server funktioniert, den unsere Kunden besitzen.
Ich habe viele vage Referenzen über die Notwendigkeit gelesen, Locales auch unter Windows zu installieren, aber keine genauen Details. Was kann das Problem sein?
(Ich bin mir bewusst, dass der allgemeine Ratschlag darin besteht, Gettext auszugeben und eine andere Bibliothek zu verwenden.)
Weitere Tests:
Mein Code läuft einwandfrei in zwei anderen Computern: 32-Bit Windows Vista und 32-Bit Windows 7 32-Bit. Es schlägt auf meinem Computer (64-Bit Windows 7) und einem anderen (32-Bit Windows Server 2003)
fehl[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls]
Registrierungsstruktur ist identisch mit der anderen Seven-Box. Bearbeiten: Beim Testen in der Befehlszeile habe ich festgestellt, dass das Festlegen der Umgebungsvariable LANG
vor dem Ausführen des PHP-Skripts die Sprache schließlich ändert:
Dies beweist definitiv, dass mein Computer die richtigen Assets hat, aber ich frage mich auch, warum PHP behauptet, dass putenv()
funktioniert und ignoriert es dann:
Auch das hat keine Wirkung:
%Vor%Es ist ein Problem , das bestätigt wurde und teilweise repariert vom PHP-Team.
Es ist eine ziemlich technische Sache, die scheinbar mit der Art und Weise zusammenhängt, wie Umgebungsvariablen (von denen gettext stark abhängt) von der zugrunde liegenden Plattform gehandhabt werden. Außerdem hat sich in den Visual C Runtime-Bibliotheken etwas von VC9 zu VC11 geändert, was sich auf all das auswirkt.
Zusammenfassend:
Der Schlüssel ist, eine nicht Thread sichere (= NTS) Version von PHP zu verwenden.
Bedauerlicherweise geht Windows und PHP nicht gut mit den Umgebungen für Threading-Prozesse um, so dass putenv ('LC_ALL ='. $ locale); Befehl funktioniert nicht.
Endlich habe ich Apache 2.4 + FCGID + PHP 7.1 NTS, was jetzt auf Windows 7 gut funktioniert, und es ist eine nicht Thread-sichere Installation.
Eine Schritt-für-Schritt-Anleitung zur Installation eines solchen Systems finden Sie hier: Ссылка
Ich habe die VC14- und x64-Version für alle Komponenten verwendet (VC ist die Abkürzung für "Microsoft Visual C ++ Redistributable"). Dazu habe ich zuerst VC14 installiert, von hier heruntergeladen: Ссылка
Ich hatte das gleiche Problem mit PHP 5.6.30 VC11 Theard Safe unter Windows 10. Abhilfe gefunden und behebe dieses Problem hier von sirio3mil.
Offenbar kann PHP mit TS nur auf den Sprachordner "Locale" zugreifen. Wenn also die Funktionen setlocale und putenv mit einer anderen Sprache als der Systemsprache aufgerufen werden, kann der Ordner mit .mo und .po nicht gelesen werden.
Problemumgehung besteht darin, nur einen Sprachordner mit Systemsprache und mehrere Paare .mo / .po-Dateien für jede übersetzte Sprache zu verwenden. Die Domain wird mit der gewünschten Sprache eingestellt.
Beispiel mit Schweizer Französisch, Deutsch und Italienisch:
\ Locale \ fr_CH \ LC_MESSAGES
- fr_CH.mo + fr_CH.po // Systemsprache
- de_CH.mo + de_CH.po
- it_CH.mo + it_CH.po
Erstes Problem: setlocale ()
Damit dies funktioniert, müssen Sie ein gültiges Gebietsschema festlegen. Unter Windows funktioniert setlocale () nicht wie erwartet. Sie müssen eine Umgebungsvariable wie folgt setzen:
%Vor%Zweites Problem: Locale-Namen.
Windows-Gebietsschema-Namen unterscheiden sich von Linux. Versuchen Sie es mit 'ita', 'eng', 'deu', 'ger', 'esp'. Sie können eine vollständige Liste hier erhalten: Ссылка
Beispiel:
%Vor%Drittes Problem, das große: Gettext-Erweiterung unter Windows ist nicht threadsicher. Jedes Mal, wenn Sie die Sprache wechseln, ist die Änderung prozeßweit. Wenn Sie PHP als Fast-CGI ausführen, sind Sie in Ordnung. Wenn Sie PHP als Apache-Modul (zum Beispiel) ausführen, ist es eine völlige Unordnung, weil sich die Sprache für jede PHP-Instanz ändert. Das Problem besteht darin, dass gettext () von der Gebietsschemaeinstellung abhängig ist. Diese Einstellung ist bei Windows PHP prozeßweit. Sie können das Gebietsschema für einen PHP-Thread nicht ändern, sondern nur für den PHP-Prozess.
Gesagt, hier ist ein funktionierender Code:
%Vor%Die Gebietsschema-Verzeichnisstruktur muss wie folgt lauten:
%Vor%