Попытка использовать gettext для интернационализации php-сайта

Хорошо, у меня есть следующий PHP-код:

<?php
$locale = "es";
//$locale = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
//if (isSet($_GET["locale"])) $locale = $_GET["locale"];
putenv("LC_ALL=$locale");
putenv("LANGUAGE=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("messages", "./locale");
bind_textdomain_codeset("messages", 'UTF-8');
textdomain("messages");

echo(getenv("LC_ALL"));
echo("<br>");
echo gettext("Hello World!");
?>

Я создал испанские файлы messages.po и messages.mo и сохранил их в подкаталоге в каталоге, где находится приведенный выше код. Путь к указанному каталогу:

locale / es / LC_MESSAGES

согласно phpinfo, gettext включен на веб-сервере, на котором я работаю (размещенный на A Small Orange).

Вызов страницы показывает, что вызов getenv возвращает "es", но выходит исходная английская строка, а не ожидаемая на испанском языке. Я также пробовал использовать _ ("Hello World!"), Но безрезультатно.

Я не получаю предупреждений, ошибок, ничего. Итак, я совершенно не понимаю, как даже устранить неполадки, где это может приводить к сбою.

Приветствуются любые рекомендации.


person Mark Lybrand    schedule 24.05.2011    source источник
comment
Возможно, это не проблема, но ./locale - это относительный путь; если ваш скрипт запущен где угодно, но только не в этом каталоге, он всегда будет ломаться.   -  person El Yobo    schedule 24.05.2011
comment
Хотя возможно, что это проблема, я попытался вставить весь путь: / home / marklybr / public_html /, и это также не дало никаких изменений. Я действительно хотел бы иметь некоторые предупреждающие сообщения или возможность ведения журнала, чтобы я мог видеть, что система пытается сделать, и почему она отказывается и решает, что английский - просто лучший вариант ...   -  person Mark Lybrand    schedule 24.05.2011
comment
вы пытались перезапустить сервер apache? У меня такая же проблема, но когда я пытаюсь перезапустить сервер apache, он работает.   -  person Permana    schedule 29.07.2011


Ответы (1)


Возможно, я ошибаюсь, но попробуйте изменить ...

putenv("LC_ALL=$locale");
putenv("LANGUAGE=$locale");

to

putenv("LC_ALL=".$locale);
putenv("LANGUAGE=".$locale);
person stack    schedule 24.05.2011
comment
Вы ошибаетесь :) Двойные кавычки действительно выполняют интерполяцию переменных. - person El Yobo; 24.05.2011
comment
Стек не совсем неправильный @ElYobo. Хотя это НЕ решит проблему, оба будут работать правильно. ;) - person Chuck Burgess; 13.09.2014
comment
Предложение Стэка вообще не изменило поведения, поэтому ответ неверен. - person El Yobo; 15.09.2014