Gettext verwendet immer das Standardgebietsschema des Systems

Ich muss eine reine Windows-PHP-Webanwendung lokalisieren und evaluiere diegettext extension Es fällt mir jedoch am schwersten, es in meiner Windows 7-Entwicklungsbox zum Laufen zu bringen. Ich habe Trial and Error zusammen mit verwendetProzessmonitor die schlechte und ungenaue dokumentation zu überwinden und ich habe es geschafft zu machen_() Zeichenfolgen aus dem * .po-Katalog anzeigen, die dem Standardgebietsschema des Computers entsprechen (in meinem Fall Modern Spanish).Alle meine Versuche, ein anderes Gebietsschema festzulegen, werden ignoriert.

Ich habe ein Testskript mit vielen überflüssigen Sachen geschrieben:

<dl><?php

define('DIR_LOCALE', __DIR__ . DIRECTORY_SEPARATOR . 'locale');
bindtextdomain('general', DIR_LOCALE);
bind_textdomain_codeset('general', 'UTF-8');
textdomain('general');

if(!defined('LC_MESSAGES')){
    define('LC_MESSAGES', 5);
}

$pruebas = array(
    'enu',
    'es_ES',
    'en_GB',
    'english-uk',
    'Spanish_Spain.1252',
    'esn',
    'spanish',
    'spanish-modern',
);
foreach($pruebas as $locale){
    putenv("LC_ALL=$locale");
    setlocale(LC_ALL, $locale);

    putenv("LC_MESSAGES=$locale");
    setlocale(LC_MESSAGES, $locale);

    putenv("LANGUAGE=$locale");
    putenv("LANG=$locale");
?>
    <dt><?=htmlspecialchars($locale)?></dt>
    <dd><?=_('codigo_idioma')?></dd>
<?php } ?>
</dl>

In meinem Fall,<?=_('codigo_idioma')?> druckt immeres_ES@modern.

Ich habe PHP / 5.4.5, aber ich gehe davon aus, dass es auf jedem einigermaßen aktuellen Server funktioniert, den unsere Kunden besitzen.

Ich habe viele vage Verweise über die Notwendigkeit gelesen, Gebietsschemas auch unter Windows zu installieren, aber keine genauen Details.Woran kann das liegen?

(Mir ist bewusst, dass der allgemeine Rat lautet, gettext zu löschen und eine andere Bibliothek zu verwenden.)

Weitere Tests:

Mein Code läuft einwandfrei wie er ist auf zwei weiteren 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

Die Apache-Version scheint irrelevant zu sein (dies passiert auch mit dem Befehlszeileninterpreter).Die PHP-Version scheint irrelevant zu sein (habe auch das neueste 32-Bit-PHP / 5.5.5 auf meinem PC ausprobiert).Meine[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls] Der Registrierungsbaum ist identisch mit der anderen Seven-Box.

Bearbeiten: Beim Testen über die Befehlszeile habe ich festgestellt, dass die EinstellungLANG Umgebungsvariable vor dem Ausführen des PHP-Skripts ändert schließlich die Sprache:

C:\>set LANG=en_GB
C:\>php C:\test\gettext.php

Dies beweist definitiv, dass mein Computer über die richtigen Ressourcen verfügt, lässt mich aber auch fragen, warum PHP dies behauptetputenv() funktioniert und ignoriert es dann:

var_dump( getenv('LANG'), putenv('LANG=en_GB'), getenv('LANG') );
bool(false)
bool(true)
string(5) "en_GB"

Auch das hat keine Wirkung:

$_ENV['LANG'] = 'en_GB';
$_SERVER['LANG'] = 'en_GB';

Antworten auf die Frage(6)

Ihre Antwort auf die Frage