Интернационализация с gettext на Windows 7 дома и PHP 7.0.8 не удается

На работе мы решили перевести наш сайт на 3 дополнительных языка, и я изучал, как это сделать. Большую часть дня я потратил на поиск в Google и stackru, пробуя каждое другое решение, но не могу заставить его работать.

Я начинаю бояться, что это невозможно сделать в Windows 7 Home edition (Моя машина для разработки).

// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.mo
// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.po
msgid ""
msgstr ""
"Project-Id-Version: iArbete 1.0.0\n"
"Report-Msgid-Bugs-To: ******** \n"
"Last-Translator: ********\n"
"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

msgid "iArbete"
msgstr "workIng"


// C:\Apache24\htdocs\index.php
if(isset($_GET["locale"]))
{
    $locale = $_GET["locale"];
}
else
{
    $locale = 'en_GB';
}

putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
echo getenv("LC_ALL");

$domain = 'messages';
bindtextdomain($domain, './locale');
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');

echo _("iArbete");

echo _("iArbete"); Следует перевести на "workIng", но это не так. Или я не понимаю концепцию?

--- Дополнительная информация --------------------------------------------- -----------

Я сделал некоторые изменения и перекомпилировал файл mo, и теперь он выглядит так.

// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.mo
// C:\Apache24\htdocs\locale\en_GB\LC_MESSAGES\messages.po
msgid ""
msgstr ""
"Project-Id-Version: iArbete 1.0.0\n"
"Report-Msgid-Bugs-To: ******** \n"
"Last-Translator: ********\n"
"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

msgid "workIng"
msgstr "iArbete"

msgid "Menu"
msgstr "Meny"


// C:\Apache24\htdocs\index.php
if(isset($_GET["locale"]))
{
    $locale = $_GET["locale"];
}
else
{
    $locale = 'sv_SE';
    $locale = 'en_GB';
//  $locale = 'ar_AE';
}

putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
//  echo getenv("LC_ALL");

$domain = 'messages';
bindtextdomain($domain, './locale');
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');

echo _("workIng");
echo _("Menu");

msgid "workIng" переводится как "iArbete"msgid "Menu" не переводится как "Meny"

Что здесь происходит? Это так странно, что переводится только первое слово. Таким образом, я переставил слова в po и перекомпилировал, но все еще "workIng" - единственное слово, которое переводится??

Я загружаю свои файлы на Google Drive здесь, если кто-то хотел бы посмотреть.

1 ответ

Вам нужно будет конвертировать файл PO в файл MO, используя msgfmt:

Буквы PO в файлах.po означают Portable Object, чтобы отличить его от файлов.mo, где MO обозначает Machine Object. [...]

PO-файлы предназначены для чтения и редактирования людьми и связывают каждую оригинальную переводимую строку данного пакета с ее переводом на конкретный целевой язык. [...]

MO-файлы предназначены для чтения программами и имеют двоичный характер. [...]

Как только PO-файл завершен и надежен, программа 'msgfmt' используется для преобразования PO-файла в машинно-ориентированный формат, который может обеспечить эффективный поиск переводов программами пакета, когда это необходимо во время выполнения (см. MO Files). Смотрите msgfmt Invocation, для получения дополнительной информации обо всех режимах выполнения программы msgfmt.

- Руководство по gettext для GNU, разделы 1.4 и 1.5

Другие вопросы по тегам