我是新手使用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。我什么都不懂:(
最后,我发现了错误。由于您的语言目录所在的目录的路径而导致的错误。必须从项目的根目录指定此路由,而不是从要翻译文本的文件指定此路由。因此,我的最终功能是:
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”位于项目的根目录上
问题:使用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 的所有功能。