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

В настоящее время я пытаюсь использовать 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 <[email protected]>\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?


person Martin Thoma    schedule 07.10.2011    source источник
comment
вы включили php_gettext в php.ini?   -  person Ariful Islam    schedule 07.10.2011
comment
согласно phpinfo (): поддержка GetText включена   -  person Martin Thoma    schedule 07.10.2011
comment
Вместо setlocale() попробуйте putenv("LANG=") и другие.   -  person mario    schedule 07.10.2011
comment
Я пробовал только putenv и putenv с setlocale. Оба не работали.   -  person Martin Thoma    schedule 07.10.2011
comment
Gettext - отстой именно по этой причине. Я бы подумал об использовании вместо этого Zend_Translate. Может работать с файлами .mo / .po   -  person Pekka    schedule 07.10.2011
comment
Достаточно просто перезапустить Apache2 (sudo /etc/init.d/apache2 restart). Я пришел к мысли, как var_dump(setlocale(LC_ALL, 'de_DE')); напечатал bool(false). Он должен напечатать string(5) "de_DE". Тем не менее, я хотел бы знать, могу ли я получить обратную связь от gettext.   -  person Martin Thoma    schedule 07.10.2011
comment
Наверное, нет, но вы можете использовать strace так же, как и я. Я обнаружил, что установленный вами языковой стандарт должен существовать в системе. Я попытался установить pl_PL, но он не установлен в моем ArchLinux, поэтому мне пришлось выбрать pl_PL.UTF-8.   -  person shark555    schedule 18.02.2013
comment
По моему опыту, gettext может не работать во многих творческих целях. Вы всегда должны объяснять, в чем именно заключается проблема: никаких переводов, всегда один и тот же язык, пропущенные слова ...   -  person Álvaro González    schedule 17.03.2016


Ответы (3)


Это то, что у меня работает на 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) <[email protected]>\n"
"Language-Team: LANGUAGE <[email protected]>\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 не работает. Я думаю, что каталог locale должен иметь то же имя языка, установленного с помощью setlocale. Другое дело - проверить каждую функцию, которая называется what return. Они никогда не должны возвращать NULL или FALSE. Сделать это можно очень просто:

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

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

person jedi    schedule 10.08.2013

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

person Lordran    schedule 17.03.2016

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

person Gavin    schedule 23.02.2014