Как использовать файлы po / pot с php?

У меня есть файлы .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");
?>

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

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


person Rajat Sharma    schedule 13.01.2011    source источник


Ответы (3)


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

<?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.

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

<?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..
?>
person richhallstoke    schedule 09.05.2011
comment
textdomain () обычно является последним вызовом функции (на самом деле он может потребоваться перед каждым вызовом gettext aka _ (), если вы работаете с несколькими доменами. Сначала вы связываете все домены, затем выбираете один. - person eckes; 13.12.2012
comment
В вашем примере вы используете два разных доменных имени «es» и «messages-es». Это может не сработать (и обычно у вас нет идентификатора языка в имени файла, поскольку он определяется каталогом). Итак, /full/path/here/application/locale/es_ES/LC_MESSAGES/messages.mo будет именем файла сообщений домена и LC_TYPE es_ES. - person eckes; 13.12.2012

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

person Lordalcol    schedule 23.01.2011

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

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

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

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

person eckes    schedule 13.12.2012