Я помню, как запускал несколько тестов несколько месяцев назад с gettext, и следующий код работал отлично:
putenv('LANG=l33t');
putenv('LANGUAGE=l33t');
putenv('LC_MESSAGES=l33t');
if (defined('LC_MESSAGES')) // available if PHP was compiled with libintl
{
setlocale(LC_MESSAGES, 'l33t');
}
else
{
setlocale(LC_ALL, 'l33t');
}
bindtextdomain('default', './locale'); // ./locale/l33t/LC_MESSAGES/default.mo
bind_textdomain_codeset('default', 'UTF-8');
textdomain('default');
echo _('Hello World!'); // h3110 w0r1d!
Это работало отлично (под Windows XP и CentOS, если я правильно помню), что было хорошо, потому что яможет использовать произвольные «локали», не беспокоясь о том, установлены они в системе или нет.Однако, похоже, это больше не работает, мне интересно, почему ...
Red Hat + PHP 5.2.11:
Я могу переключаться с одного на другойразличные локали и переводы показывают корректность до тех пор, пока вызов setlocale()
не возвращает false (если локаль доступна / установлена в системе).
Это не идеально (было бы здорово, если бы яможет просто указать gettext на любой произвольный каталог перевода без проверки наличия языкового стандарта), но это приемлемо.Позже я проведу еще несколько тестов.
Windows 7 + PHP 5.3.1 (XAMPP):
setlocale()
всегда возвращает false (даже при использовании LC_ALL
вместо LC_MESSAGES
), если я не использую какой-либо действительный языковой стандарт Windows, такой как eng
, deu
или ptg
- в этом случае языковой стандарт, кажется, установлен правильно, но переводы по-прежнему не отображаются.Я не могу сейчас проверить, потому что у меня открыты сотни вкладок, но я думаю, что самый первый вызов этого скрипта дает правильный перевод (перезапуск Apache не сработает).
Я неконечно, если это связано с PHP Ошибка # 49349 .Я протестирую это пару часов.
Есть ли способ использовать расширение gettext (не чисто реализации PHP, такие как php-gettext или ZendНадежно перевести Adapter ) в различные операционные системы (возможно, с custom locales вроде l33t
)?
Кроме того, необходимо ли использовать setlocale(LC_ALL, ...)
?Я бы предпочел оставить настройки TIME
, NUMERIC
и MONETARY
(особенно) локали нетронутыми (по умолчанию POSIX
локаль).
У меня была идея ... Будет ли этоможно позвонить setlocale()
с очень распространенным языком (например, C
, POSIX
или en_US
) и указать язык через домен?Примерно так:
/lang/C/LC_MESSAGES/domain.pt.mo
/lang/C/LC_MESSAGES/domain.de.mo
/lang/C/LC_MESSAGES/domain.en.mo
/lang/C/LC_MESSAGES/domain2.pt.mo
/lang/C/LC_MESSAGES/domain2.de.mo
/lang/C/LC_MESSAGES/domain2.en.mo
Будет ли это работать на платформах * nix и Windows без проблем?