Как использовать файлы po / pot с php? - PullRequest
5 голосов
/ 13 января 2011

У меня есть файл .po и .mo в папке с адресом / locale / nld_nld / LC_MESSAGES / .Оба имени файлов являются сообщениями.Я пытался использовать следующий код:

try.php:

<?php
require_once("Localization.php");
echo _("Hello World!");
?>

Localization.php идет здесь:

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

Обе попытки.Файлы php и Localization находятся в одном каталоге.Также я пользуюсь xampp.Я также реализовал phpinfo();.В таблице перед «Поддержка GetText» было упомянуто, что включено.Файлы messages.po и messages.mo являются допустимыми файлами, которые я создал с помощью poEdit.Я пользователь Windows.Однако когда я открыл try.php, он просто повторил Hello World!(не переведенная строка. Кроме того, я перевел файл .po на 100% (в соответствии с poEdit). Тем не менее, я не получаю результаты. Небольшая помощь по этому вопросу была бы оценена.

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 09 мая 2011

Оглядываясь назад на код, который у меня есть на рабочем сайте для перевода на испанский язык, я замечаю, что у меня есть те же строки в другом порядке, возможно, это имеет значение?Например:

<?php
putenv('LC_MESSAGES=es_ES');
setlocale(LC_MESSAGES, 'es_ES.utf8');
bindtextdomain('es','/full/path/here/application/locale');
textdomain('messages-es');
bind_textdomain_codeset('messages-es', 'UTF-8');
?>

Для работы приведенного выше кода мой .mo файл находится в / full / path / here / application / locale / es_ES.utf8 *Папка 1007 *.

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

<?php
function TestLang( $langCode ) {
  echo( '<b>TESTING LANG CODE: ' . strtolower( $langCode ) . '</b><br />' );
  putenv( 'LC_MESSAGES=' . strtolower( $langCode ) . '_' . strtoupper( $langCode ));
  echo( 'LC_MESSAGES: ' . getenv( 'LC_MESSAGES' ) . '<br />' );
  $localeResult = setlocale( LC_MESSAGES, strtolower( $langCode ) . '_' . strtoupper( $langCode ) . '.utf8' );
  echo( 'Locale: ' . $localeResult . '<br />' );
  $textDomain = bindtextdomain( strtolower( $langCode ), ROOT . '/' . APP_DIR . '/locale' );
  echo( 'Text Domain: ' . $textDomain . '<br />' );
  textdomain( strtolower( $langCode ));
  $codeSet = bind_textdomain_codeset( strtolower( $langCode ), 'UTF-8' );
  echo( 'Code Set: ' . $codeSet . '<br />' );
  echo( '.mo File: ' . $textDomain . '/' . $localeResult . '/LC_MESSAGES/' . $langCode . '.mo<br />' );
  echo( '<br />-- ' . _( 'Hello World!' ) . ' --<br />' );
}

TestLang( 'en' );
TestLang( 'de' );
TestLang( 'es' );
TestLang( 'fr' );
// etc..
?>
0 голосов
/ 13 декабря 2012

Выведите возвращаемое значение $result=bindtextdomain($domain,$path), оно сообщит вам, действительно ли ваш локальный путь - это путь, который вы ожидаете от жизни ваших файлов перевода. И затем проверьте права доступа к файлам этих файлов, если они (и каталоги до корня) доступны для пользователя www. Это где-то в ./locale/LC_MESSAGES/nld_nld/

textdomain($domain) должен быть последним методом (перед фактическим переводом gettext). Параметр домена bindtextdomain и textdomain должен быть одним и тем же доменным именем (оно не было в вашем ответе) и равно базовому имени файлов mo.

Убедитесь, что ни один из ваших php-файлов не использует другой текстовый домен, особенно когда вы используете "require_once".

Кстати, у вас есть код, который ищет идентификатор языка в запросе (без фильтра) и использует nld_nld в качестве возврата по умолчанию, я бы вместо этого поместил туда нормальный язык (основной язык сайта, такой как "en").

0 голосов
/ 23 января 2011

Проблема может заключаться в "-" в UTF-8.Есть также другие строки для совместимости с Windows.Попробуйте прочитать это: http://www.php.net/manual/en/function.setlocale.php#89076

...