Невозможно использовать gettext для получения переведенной строки в файлах .mo

Я пытаюсь настроить чистую среду для тестирования php gettext. Я развил один из примеров и начал с него, но не смог заставить его работать: https://github.com/yookoala/gettext-example

(При необходимости клонируйте исходный код и проверьте себя)

Основная часть PHP-скрипта:

<?php
// set locale to either first argument or the $_GET['locale']
$localeToSet = $argv[1] ?? $_GET['locale'] ?? 'zh_HK.utf8';
if (($locale = setlocale(LC_ALL, [
    $localeToSet,
    "$localeToSet.utf8",
    "$localeToSet.utf-8",
    "$localeToSet.UTF8",
    "$localeToSet.UTF-8",
])) === false) {
    throw new Exception($localeToSet . ' is not supported in this system');
}

bindtextdomain('messages', 'locale');

textdomain('messages');

printf("locale: %s - \n", $locale);
printf(_("Hello, %s, it is nice to see you today.\n"), "Vic");

Файл locale/zh_HK/LC_MESSAGES/messages.po:

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Codegroove.net
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid   ""
msgstr  "Project-Id-Version: Codegroove.net Example Translations 0.0.1\n"
        "Report-Msgid-Bugs-To: [email protected]\n"
        "POT-Creation-Date: 2010-05-28 06:18-0500\n"
        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
        "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
        "Language-Team: LANGUAGE <[email protected]>\n"
        "MIME-Version: 1.0\n"
        "Content-Type: text/plain; charset=UTF-8\n"
        "Content-Transfer-Encoding: 8bit\n"

#, php-format
msgid   "Hello, %s, it is nice to see you today.\n"
msgstr "你好,%s,很高興今日與你會面。\n"

И CLI, и тестовый сервер PHP не смогли отобразить переведенный текст (как и должно быть). Он просто показывает необработанное сообщение.

Кто-нибудь здесь знает, что не так с моей настройкой? Или как я могу отследить проблему?


person Koala Yeung    schedule 15.11.2018    source источник
comment
Может быть, мы могли бы помочь, если бы вы сказали нам что-то, с чем мы могли бы работать. Что не удалось, как это произошло, выдавало ли вам сообщения об ошибках, если да, какие они были   -  person RiggsFolly    schedule 15.11.2018
comment
Я ожидал увидеть переведенное сообщение. Вместо этого отображается только непереведенная строка.   -  person Koala Yeung    schedule 15.11.2018
comment
И сообщения об ошибке нет вообще.   -  person Koala Yeung    schedule 15.11.2018
comment
Когда вы задаете вопрос, прочитайте его про себя, но представьте, что вы один из нас Если вы прочитаете эту информацию, сможете ли вы помочь себе?   -  person RiggsFolly    schedule 15.11.2018
comment
Я буквально не знаю, чем еще я могу помочь себе. Я предоставил всю информацию, которую смог придумать (включая полный исходный код). Пожалуйста, совет, если вы думаете, что я могу дать больше. Спасибо.   -  person Koala Yeung    schedule 15.11.2018
comment
Предоставляет ли php-gettext какое-либо отладочное сообщение, которое я мог бы включить?   -  person Koala Yeung    schedule 15.11.2018


Ответы (1)


Существует также версия gettext для командной строки. Попробуй это:

TEXTDOMAIN=messages TEXTDOMAINDIR=locale LC_ALL=zh_HK.UTF-8 gettext 'Hello, %s, it is nice to see you today.
>'

Вместо новой строки вы должны нажать ENTER, а затем добавить закрывающую кавычку. > исходит из вашей оболочки.

Это работает? Тогда вы знаете, что проблема заключается в вашем коде. И если это не работает, проблема в вашей настройке, вашей локальной среде. Попробуйте посмотреть, какие каталоги и файлы рассматриваются gettext, например, с strace или около того.

Другие возможные ошибки:

  1. Перевод извлекается из файла mo, а не из файла po. Он существует? Попробуйте msgunfmt locale/zh_HK/LC_MESSAGES/messages.mo.
  2. Попробуйте указать абсолютный путь к каталогу локали с помощью bindtextdomain('messages', '/path/to/locale');
  3. Вы используете Windows?

Какая локаль на самом деле используется? Вы не опубликовали результат своего скрипта.

person Guido Flohr    schedule 26.11.2018