Функция PHP gettext возвращает только исходную непереведенную строку

Я пытаюсь использовать gettext для добавления поддержки локализации на свой сайт. Я следовал различным руководствам по настройке gettext и сделал следующее:

Я создал следующие файлы и каталоги в корне каталога моего проекта:

test.php

locale/
  de_DE
    LC_MESSAGES
       messages.mo
       messages.po

  en_GB
    LC_MESSAGES
       messages.mo
       messages.po

Я использовал Poedit для создания вышеуказанных файлов .po и mo. Я заставил иск использовать окончания строк Unix, UTF-8 и соответственно установить язык и страну.

Затем я создал PHP-скрипт с именем test.php, который имеет следующий код:

<?php

  define('LOCALE', 'de_DE');

  // Set up environmental variables
  putenv("LC_ALL=" . LOCALE);
  setlocale(LC_ALL, LOCALE);
  bindtextdomain("messages", "./locale");
  bind_textdomain_codeset("messages", LOCALE .".utf8");
  textdomain("messages");

  die(gettext('This is a test.'));

?>

Я импортировал текст «Это тест». в Poedit, предоставил перевод и сохранил его.

Но по какой-то причине скрипт test.php будет выводить только исходный текст без перевода. Он отказывается загрузить версию для файлов перевода.

Стоит отметить, что сервер работает под управлением Linux (Ubuntu), Apache 2.2.11 и PHP 5.2.6-3ubuntu4.5. Я проверил phpinfo(), и gettext включен.


person Camsoft    schedule 11.03.2010    source источник


Ответы (3)


Ваша проблема может быть связана с отсутствующей локалью в вашей системе. Пожалуйста, установите немецкую локаль, и все должно работать:

sudo apt-get install language-pack-de-base

Затем введите следующую команду, и вы должны увидеть немецкие локали:

locale -a

После этого следующий код должен работать, если у вас все еще есть файлы .po и .mo в структуре каталогов, которую вы описали:

  <?php

  setlocale(LC_ALL, 'de_DE.UTF-8');
  bindtextdomain('messages', './locale');
  textdomain('messages');

  echo gettext('This is a test.');

  ?>
person bpedro    schedule 15.03.2010
comment
Итак, это сработало? Действительно ли это была проблема, связанная с отсутствующей локалью или чем-то другим? - person bpedro; 16.03.2010
comment
Без проблем! Я рад, что смог помочь! - person bpedro; 16.03.2010

Да, да, PHP снова поддерживает gettext. Просто подсказка, которая может вам помочь, а может и не помочь:

Из-за ужасной реализации gettext в PHP многие проекты с открытым исходным кодом, такие как WordPress, переключились на этот: http://savannah.nongnu.org/projects/php-gettext/ и полностью обойти исходную версию.

Я тоже так делал в одном из своих проектов, и не могу сказать, что что-то упускаю.

Недостаток для коммерческих проектов: это под лицензией GPL.

person Boldewyn    schedule 11.03.2010
comment
Интересный. Я посмотрю на это. Арх, хотя GPL будет проблемой. - person Camsoft; 11.03.2010
comment
Не могу использовать это, потому что, как вы сказали, это GPL, и эта проблема, с которой я столкнулся, связана с коммерческим проектом. - person Camsoft; 15.03.2010
comment
Я знаю проблему. У нас тоже есть проект с закрытым исходным кодом, и нам остается что-то реализовать самим, потому что мы не можем использовать php-gettext (или хотим полагаться на модуль PHP gettext). Тем не менее, я подумал, что стоит ответить, так как это важный проект для включения в другое программное обеспечение PHP под лицензией GPL. - person Boldewyn; 16.03.2010

попробуйте следующее

<?php

  define(LC_MESSAGES, 'de_DE');

  // Set up environmental variables
  putenv("LANGUAGE=de_DE");
  bindtextdomain("*", dirname(__FILE__).'/locale');
  bind_textdomain_codeset("messages", 'UTF-8');      

  die(gettext('This is a test.'));

?>
person Gabriel Solomon    schedule 11.03.2010
comment
К сожалению, это не сработало. Он по-прежнему просто отображает английскую версию. - person Camsoft; 11.03.2010