Python: перевод текста показывает msgid вместо msgstr - PullRequest
0 голосов
/ 10 октября 2018

Я новичок, использую библиотеку gettext для перевода текста.Я хочу перевести текст, который есть в следующем файле:

dobles_message.py

def set_message(self, language):
    t = gettext.translation("basketmetrics_i18n", "../i18n", fallback=True, languages=["'" + language + "'"])
    t.install()
    _ = t.gettext
    self.message = _("mensaje_dd_1")

Чтобы сделать это, сначала я должен создать dobles_message.po сэта инструкция:

xgettext -i dobles_message.py -o dobles_message.pot -d basketmetrics_i18n

Затем я создал структуру каталогов i18n / es / LC_MESSAGES и i18n / en / LC_MESSAGES и создал версию .po для каждого языка с этими инструкциями:

msginit -i dobles_message.pot -o ../i18n/es/LC_MESSAGES/basketmetrics_i18n.po -l es
msginit -i dobles_message.pot -o ../i18n/en/LC_MESSAGES/basketmetrics_i18n.po -l en

Трижды я изменил кодировку и перевел текст каждого файла.И в-четвертых, я создал файлы .mo из каждого файла .po с этой инструкцией в каталоге i18n / es / LC_MESSAGES и в каталоге i18n / en / LC_MESSAGES

msgfmt basketmetrics_i18n.po -o basketmetrics_i18n.mo

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

Вот какова моя структура файлов и каталогов:

enter image description here

И содержание моих файлов следующее ...

dobles_message.pot

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid   ""
msgstr  "Project-Id-Version: PACKAGE VERSION\n"
        "Report-Msgid-Bugs-To: \n"
        "POT-Creation-Date: 2018-10-10 13:22+0200\n"
        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
        "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
        "Language-Team: LANGUAGE <LL@li.org>\n"
        "Language: \n"
        "MIME-Version: 1.0\n"
        "Content-Type: text/plain; charset=CHARSET\n"
        "Content-Transfer-Encoding: 8bit\n"

#: dobles_message.py:15
msgid   "mensaje_dd_1"
msgstr  ""

basketmetrics_i18n.po (английская версия)

    # English translations for PACKAGE package.
    # Copyright (C) 2018 THE PACKAGE'S COPYRIGHT HOLDER
    # This file is distributed under the same license as the PACKAGE package.
    # José Carlos <josecarlos@asterix>, 2018.
    #
    msgid ""
    msgstr ""
    "Project-Id-Version: PACKAGE VERSION\n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2018-10-10 13:22+0200\n"
    "PO-Revision-Date: 2018-10-10 13:31+0200\n"
    "Last-Translator: Jos Carlos <josecarlos@asterix>\n"
    "Language-Team: English\n"
    "Language: en\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=utf-8\n"
    "Content-Transfer-Encoding: 8bit\n"
    "Plural-Forms: nplurals=2; plural=(n != 1);\n"

    #: dobles_message.py:15
    msgid "mensaje_dd_1"
    msgstr "¡¡¡Hi ###twitter###!!! From www.basketmetrics.com we want to congrats to get your double double nº ###numero### this season. ¡¡¡Congratulations!!!"

basketmetrics_i18n.po (испанская версия)

# Spanish translations for PACKAGE package.
# Copyright (C) 2018 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# José Carlos <josecarlos@asterix>, 2018.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-10 13:22+0200\n"
"PO-Revision-Date: 2018-10-10 13:28+0200\n"
"Last-Translator: Jos Carlos <josecarlos@asterix>\n"
"Language-Team: Spanish\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=latin-1\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: dobles_message.py:15
msgid "mensaje_dd_1"
msgstr "¡¡¡Hola ###twitter###!!! Desde www.basketmetrics.com queremos felicitarte por haber conseguido tu doble doble nº ###numero### esta temporada. ¡¡¡Felicidades!!!"

Что я делаю не так?Я использую python3

Редактировать I:

В моем коде я удалил опцию "fallback = True" и получаю эту ошибку:

enter image description here

На первом шаге я определил домен "basmetmetrics_i18n", и у меня есть файлы .po, созданные с этим именем.Что случилось?

Редактировать II:

Следуя мудрому совету @stovfl, я изменил свою функцию set_message:

def set_message(self, language):
    print("language: " + language)
    gettext.bindtextdomain('basketmetrics_i18n', '../i18n')
    gettext.textdomain('basketmetrics_i18n')
    _ = gettext.gettext
    self.message = _("mensaje_dd_1")
    print("Mensaje traducido: " + self.message)

Прямо сейчас у меня нетНет ошибки в моем приложении, но я все равно получаю сообщение вместо msgstr.Я ничего не понимаю: (

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Наконец-то я нашел ошибку.Ошибка из-за пути к каталогу, где у вас есть языковой каталог.Вы должны указать этот маршрут из корня проекта, а не из файла, в который вы хотите перевести текст.Итак, моя функция, наконец, такова:

def set_message(self, language):
    t = gettext.translation("basketmetrics_i18n", "../i18n", fallback=True, languages=["'" + language + "'"])
    t.install()
    _ = t.gettext
    self.message = _("mensaje_dd_1")

Поскольку мой язык каталогов "i18n" находится в корне проекта

0 голосов
/ 10 октября 2018

Вопрос : использование библиотеки gettext для перевода текста


Из документации:

gettext (message)

Найдите идентификатор сообщения в каталоге и верните соответствующую строку сообщения в виде строки Unicode. Если в каталоге нет записи для идентификатора сообщения, и был установлен запасной вариант, поиск перенаправляется в метод gettext (). В противном случае возвращается идентификатор сообщения .


Ваш код будет работать для меня, если вы измените следующее languages=[language]:

def set_message(self, language):
    t = gettext.translation(package, localedir, fallback=True, languages=[language])
    t.install()
    _ = t.gettext
    message = _("mensaje_dd_1")

set_message('es')

В соответствии с Документацией Python вам необходимо выполнить:

import gettext
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print(_('This is a translatable string.'))
...