当前位置: 首页 > 知识库问答 >
问题:

Python:翻译文本显示msgstr而不是msgstr

毛峻
2023-03-14

我是新手使用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_消息和i18n/en/LC_消息,并创建了。每种语言的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文件来自每个。目录i18n/es/LC_MESSAGES和目录i18n/en/LC_MESSAGES中包含此指令的po文件

msgfmt basketmetrics_i18n.po -o basketmetrics_i18n.mo

但是,当我运行应用程序而不是翻译文本时,muy应用程序会显示msgid。

以下是我的文件和目录结构:

接下来是我的文件内容。。。

多布勒的消息。锅

# 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  ""

篮筐。采购订单(英文版)

    # 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!!!"

篮筐。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!!!"

我做错了什么?我在用蟒蛇3

编辑I:

在我的代码中,我删除了“fallback=True”选项,出现以下错误:

在我的第一步中,我定义了域“basmetrics_i18n”,并且我已经得到了。使用该名称创建的po文件。发生了什么事?

编辑二:

根据@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)

现在,我的应用程序中没有任何错误,但我仍然得到msgid而不是msgstr。我什么都不懂:(

共有2个答案

楚硕
2023-03-14

最后,我发现了错误。由于您的语言目录所在的目录的路径而导致的错误。必须从项目的根目录指定此路由,而不是从要翻译文本的文件指定此路由。因此,我的最终功能是:

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”位于项目的根目录上

莫欣悦
2023-03-14

问题:使用gettext库翻译文本

从文件中:

gettext(消息)

在目录中查找消息id并返回相应的消息字符串,作为Unicode字符串。如果目录中没有消息ID的条目,并且已经设置了回退,则查找将转发到回退的gettext()方法。否则,返回消息id。

如果您更改以下语言=[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.'))
 类似资料:
  • 我正在考虑从自然gettext msgstr切换到固定的。例如从 到 这是因为当站点上的语言数量不断增加时,文本字符串更新变得越来越麻烦,并且每次连续部署版本的所有翻译都不实用。然而,改用伪造的MSGID将使网站模板和源代码(英语是主要语言)的工作变得繁琐。 金字塔框架和变色龙模板通过允许gettext翻译的默认值,为这个问题提供了一个简洁的解决方案。例如,如果没有可用的和数据(英文)。采购订单文

  • 我对IntelliJ有问题--如果我用Ctrl+单击该类,它会显示一个类的“反编译”版本,而不是它的源代码。 这就是我所看到的: 我正在尝试打开常规的JDK源文件。 src.zip没有损坏-我可以通过WinRAR打开它 当将JDK1.8.0_161添加到IntelliJ中时,它会自动找到src.zip。当手动将src.zip添加到jbsdk8u112b287.2_windows_x86 Sourc

  • 问题内容: 我正在从数据库中读取希伯来语中的一些文本,并正在尝试这样做。如果我得到的结果是: 而json_encode显示: 我相信这是因为我在数据库中的文本包含一个(’)标记。尝试了各种反斜杠或real_escape_string组合,都无济于事。 问题答案: 期望将数据中的字符串编码为UTF-8。 如果尚未将它们转换为UTF-8:

  • 我在输出用户首选语言的日期时遇到了问题。我有一个中间件,在内核中注册,它根据该用户的首选区域设置呈现应用程序。 这不会改变碳日期的语言(应用程序语言应该改变)。当我通过在刀片视图上显示它们来检查设置时,应用程序正在正确设置所选的碳区域设置。 但是我只能显示在选定的语言中的日期,如果我使用函数为特定的实例,我想我可能有超过100个实例,对于一些,我使用访问器来格式化我的模型中的输出。这是正常行为吗?

  • 我和NGINX的关系很紧张,这让我很疯狂。我有Ubuntu 12.04。VirtualBox上有3个LTS。我按照以下说明安装了NGINX-MYSQL-PHP: 安装php5 fpm 然后我在/etc/nginx/sites available/default中设置: 本地主机和信息。php被正确执行。现在我想建立一个本地网站,并尝试做一些重定向。因此,我在/usr/share/nginx/www

  • Selenium Python bindings 提供了一个简单的 API,让你使用 Selenium WebDriver 来编写功能/校验测试。 通过 Selenium Python 的 API,你可以非常直观的使用 Selenium WebDriver 的所有功能。