2011-01-13 2 views
5

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

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 Support», была включена поддержка. messages.po и messages.mo файлы действительны, файлы, которые я создал с помощью poEdit. Я пользователь Windows. Однако, когда я открыл try.php, он просто повторил Hello World! (А не его переведенная строка. Кроме того, я перевел .po файл 100% (по poEdit). Тем не менее, я не получаю результаты. Небольшая помощь по этому вопросу будет оценена.

Спасибо ! заранее

ответ

2

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

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

textdomain() обычно является последним вызовом функции (на самом деле это может потребоваться до вызова gettext aka _(), если вы работаете с несколькими доменами.Сначала вы связываете все домены, затем вы выбираете один из них. – eckes

+0

В вашем примере вы используете два разных имени домена «es» и «messages-es». Это может не сработать (и, как правило, у вас нет идентификатора языка в имени файла, как это определено в каталоге). Таким образом, «/full/path/here/application/locale/es_ES/LC_MESSAGES/messages.mo» будет именем файла «сообщения» и LC_TYPE es_ES. – eckes

0

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

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

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

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

Смежные вопросы