PHP gettext функция возвращает только оригинальную непереведенную строку - PullRequest
7 голосов
/ 11 марта 2010

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

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

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 включен.

Ответы [ 3 ]

14 голосов
/ 15 марта 2010

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

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.');

  ?>
1 голос
/ 11 марта 2010

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

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

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

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

0 голосов
/ 11 марта 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.'));

?>
...