Как я могу проанализировать, почему gettext не работает? - PullRequest
5 голосов
/ 07 октября 2011

В настоящее время я пытаюсь использовать gettext с PHP и poedit.Я написал следующий файл test.php:

<?php

error_reporting(E_ALL | E_DEPRECATED | E_USER_DEPRECATED | -1);
bindtextdomain('messages', './i18n/');
textdomain('messages');
setlocale(LC_ALL, $_GET['l']);
putenv("LANG=".$_GET['l']);

echo _('test :-(');

?>

и это мои messages.po:

msgid ""
msgstr ""
"Project-Id-Version: Community Chess\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-10-07 18:34+0100\n"
"PO-Revision-Date: \n"
"Last-Translator: Martin Thom <info@martin-thoma.de>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Poedit-Basepath: /var/www/community-chess\n"
"X-Poedit-SearchPath-0: .\n"

#: test.php:8
msgid "test :-("
msgstr "Juhu :-)"

#~ msgid "test"
#~ msgstr "Juhu!"

Моя структура каталогов

community-chess
    test.php
    i18n
        de_DE
            LC_MESSAGES
                messages.po
                messages.mo

Как толькокогда я смотрю на http://localhost/community-chess/test.php?l=de_DE, я получаю "test :-("

Я сгенерировал локаль с

sudo locale-gen de_DE

и проверил с помощью

locale -a

Почему это не работает? Как я могу получить отзыв от gettext?

Ответы [ 3 ]

1 голос
/ 17 марта 2016

Когда я перезапускаю nginx через cmd "/ path / to / nginx -s reload", он не работает, но после перезапуска php-fpm с помощью cmd "/etc/init.d/php-fpm restart ",это сработало! Надеюсь, что мой опыт будет полезен для кого-то с проблемой:)

1 голос
/ 10 августа 2013

Это то, что у меня работает на CE ZendServer на linux и сервер Apache на NetBsd

Файл «message.po» генерируется из корня приложения:

#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-04-30 19:38+0200\n"
"PO-Revision-Date: 2013-04-12 14:00+0000\n"
"Last-Translator: gin(e) <ginex@posta.indivia.net>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: eo\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: include/apteryx_text.php:3
msgid "email:"
msgstr "Retpoŝtadreso:"

Это новый древовидный каталог:

res/locale/
    de_DE/
       LC_MESSAGES/
            messages.mo
    eo_EO/
       LC_MESSAGES/
            messages.mo
    eo->eo_EO (symlink)

Я должен добавить символическую ссылку "eo", потому что в моей системе поддерживаются только три локали эсперанто:

eo
eo.iso88593
eo.utf8

скомпилировано с:

sudo locale-gen eo
sudo locale-gen eo.iso88593
sudo locale-gen eo.utf8
sudo update-locale
sudo dpkg-reconfigure locales

и на данный момент мой код locale.php:

$charset="UTF-8";
$gettext_domain="messages";
$locale_dir="res/locale";
putenv("LC_ALL=$lang");
$l=split("_",$lang);
/* not in all system and not all locales got the classic name this stupid method try to solve it*/
if(! setlocale(LC_ALL, $lang.".".$charset)) 
  if(! setlocale(LC_ALL, $lang)) 
    if(! setlocale(LC_ALL,$l[0].".".$charset))  
        setlocale(LC_ALL,$l[0]);

bindtextdomain($gettext_domain, "res/locale");
textdomain($gettext_domain);
bind_textdomain_codeset($gettext_domain, $charset);

потому что без него gettext не работает. Я думаю, что каталог локали должен иметь то же имя, что и язык, заданный с помощью setlocale. Другое дело - проверять каждую функцию, которая называется return. Они никогда не должны возвращать NULL или FALSE. Вы можете сделать это простым способом:

var_dump(bindtextdomain($gettext_domain, "res/locale"));
var_dump(textdomain($gettext_domain)); 
..and so on..

Последний, но не список, не забудьте установить правильное разрешение apache для всех файлов .mo, перезапустить ваш сервер apache и проверить с помощью phpinfo (), что «GetText Support» «включена».

0 голосов
/ 23 февраля 2014

В случае, если вы пропустили это, OP сказал в своих комментариях выше, что он исправил это, просто перезапустив Apache.У меня были проблемы с _() просто не работает.Язык работал нормально, bindtextdomain и textdomain возвращали правильные значения, но это просто не работало. Я перезапустил Apache, и он заработал.

...