Gettext verwendet immer das Standardgebietsschema des Systems

8

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
  • Apache-Version scheint irrelevant (es passiert auch mit dem Kommandozeilen-Interpreter).
  • PHP-Version scheint irrelevant (auch letzte 32-Bit-PHP / 5.5.5 in meinem PC versucht).
  • Meine [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:

%Vor%

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:

%Vor% %Vor%

Auch das hat keine Wirkung:

%Vor%     
Álvaro González 24.10.2013, 14:54
quelle

6 Antworten

5

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:

  • Nicht threadsichere Builds wurden am 21. November 2014 im Quellbaum behoben.
  • Thread-sichere Builds (z. B. Apache-Modul) haben es nicht und es ist keine klare Lösung in Sicht.
Álvaro González 06.03.2015, 11:48
quelle
1

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: Ссылка

    
Buzogany Laszlo 17.01.2017 12:51
quelle
1

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:

Ordnerstruktur

  

\ Locale \ fr_CH \ LC_MESSAGES

     
  • fr_CH.mo + fr_CH.po // Systemsprache
  •   
  • de_CH.mo + de_CH.po
  •   
  • it_CH.mo + it_CH.po
  •   

Code

%Vor%     
Camille 10.02.2017 09:37
quelle
0

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%     
Ghigo 13.02.2014 11:23
quelle
0

Unter Ubuntu funktioniert es, wenn Sie Ihre Standard-LC_ALL setzen und LANG und LANGUAGE leer lassen, etwa so:

%Vor%     
darwin 30.11.2017 13:30
quelle
-2

Sie müssen auf PHP 5.6.6 für Windows upgraden, es funktioniert!

    
rapomon 05.03.2015 01:33
quelle

Tags und Links