Gettext zawsze używa domyślnych ustawień regionalnych systemu

Muszę zlokalizować aplikację internetową PHP tylko dla systemu Windows i oceniamrozszerzenie gettext ale mam najtrudniejszy czas, gdy próbuję sprawić, by działał w moim pudełku programistycznym dla Windows 7. Użyłem prób i błędów razem zMonitor procesu pokonać słabą i niedokładną dokumentację i udało mi się to zrobić_() wyświetl łańcuchy z katalogu * .po, który odpowiada domyślnym ustawieniom komputera (w moim przypadku Modern Spanish).Wszystkie moje próby ustawienia innej lokalizacji są po cichu ignorowane.

Napisałem skrypt testowy z dużą ilością zbędnych rzeczy:

<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>

W moim przypadku,<?=_('codigo_idioma')?> zawsze drukujees_ES@modern.

Mam PHP / 5.4.5, ale spodziewam się, że będzie działał w każdym dość aktualnym serwerze, który posiadamy.

Przeczytałem wiele niejasnych odniesień na temat konieczności instalowania ustawień lokalnych, nawet w systemie Windows, ale bez dokładnych szczegółów.Co może być problemem?

(Wiem, że powszechną radą jest zrzucanie gettext i używanie dowolnej innej biblioteki).

Dalsze testy:

Mój kod działa bez zarzutu, podobnie jak na dwóch innych komputerach: 32-bitowy Windows Vista i 32-bitowy Windows 7 32-bitowy. Nie działa na moim komputerze (64-bitowy Windows 7) i innym (32-bitowy Windows Server 2003)

Wersja Apache wydaje się nieistotna (dzieje się tak również z interpretatorem wiersza poleceń).Wersja PHP wydaje się nieistotna (próbowałem także najnowszego 32-bitowego PHP / 5.5.5 na moim komputerze).Mój[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls] drzewo rejestru jest identyczne z drugim polem Siedem.

Edytować: Podczas testowania w wierszu poleceń odkryłem, że ustawienieLANG zmienna środowiskowa przed uruchomieniem skryptu PHP w końcu zmienia język:

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

To ostatecznie dowodzi, że mój komputer ma poprawne zasoby, ale także zastanawia mnie, dlaczego PHP tak twierdziputenv() działa, a następnie go ignoruje:

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

Nawet to nie ma żadnego efektu:

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

questionAnswers(5)

yourAnswerToTheQuestion