Gettext (i18n) и Smarty работают с ошибками
Я разрабатываю веб-приложение с PHP и Smarty. Я использую gettext для интернационализации, но у меня есть проблема: он работает только иногда, абсолютно случайно. Я загружаю локаль (например, de_DE) с помощью putenv+setlocale+bindtextdomain+textdomain, перезагружаю страницу и вижу "Поиск"; перезагрузите снова, и я вижу "Suche"; еще две перезагрузки и получают "Suche", но трижды дают мне "Search" снова, затем я вижу "Search" много раз, и внезапно я снова вижу "Suche"... случайно.
Я деактивировал кеш для Smarty, но та же проблема. Я настроил Smarty для использования разных каталогов для разных языков: templates_c/en_GB, templates_c/de_DE и так далее. Компиляция прекрасно работает таким образом.
Я использую smarty-gettext для перевода шаблонов.
Есть ли какие-либо проблемы с использованием gettext и Smarty?
Отредактируйте, чтобы добавить некоторую информацию: я запускаю свои тесты на машине Linux:
apache2 2.2.14
gettext 0.17
php 5.3.2
smarty 3-SVN $ Rev: 3286
4 ответа
У меня та же проблема - иногда на странице отображается перевод, а иногда нет.
Но я использую ванильный PHP (без Smarty) и работаю в Mac OS X (не в Linux).
Мой код выглядит так:
$locale='fr_FR'; //...for example...
putenv("LC_ALL=$locale");
setlocale(LC_ALL,$locale);
bindtextdomain("messages","./locale");
bind_textdomain_codeset("messages","UTF-8");
textdomain("messages");
В настоящее время пытаюсь найти решение проблемы - я дам вам знать, если мне это удастся.
У вас установлен / включен Xcache или любой другой кеш опкодов? Попробуйте отключить их.
У меня была похожая периодически возникающая проблема PHP gettext и vagrant с запущенным Ubuntu
Попробуйте одно из следующего, я думаю, это будет зависеть от того, как у вас работает PHP с Apache
sudo service php5-fpm restart
sudo service apache2 restart
Используется для получения аналогичной проблемы при использовании локали "pt_BR" при использовании русских слов. Решил это, установив локаль на "ru_RU". Надеюсь, это поможет.
Это моя конфигурация, которая действительно работает:
$directory = './locale';
$domain = 'smartybook';
$locale ="ru_RU";
setlocale(LC_ALL, $locale);
bindtextdomain($domain, $directory);
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');
Еще одно важное замечание: начал работать только после использования msgfmt -c -v -o
msgfmt -o было недостаточно. Также важно: должен быть root при вводе команд форматирования, также не забудьте перезапустить apache.