使用Jinja2和Pyramid进行Python国际化工作。似乎存在一个问题,无法确定应该如何翻译%%。
所以我进行了更多的调查,发现问题更多地与gettext有关,如repl所示。
>>>gettext.gettext("98%% off %s sale") % ('holiday')
'98% off holiday sale'
>>>gettext.gettext("98%% off sale")
'98%% off sale'
>>>gettext.gettext("98% off %s sale") % ('holiday')
Traceback (most recent call last):
Python Shell, prompt 13, line 1
TypeError: %o format: a number is required, not str
似乎这是一个鸡生蛋的问题。
- 如果 gettext 翻译 %% -> %,则在参数替换期间格式化程序将无法正常工作。 - 如果 gettext 不翻译 %% -> %,则当不调用格式化程序(没有要插入的参数)时,%% 将泄露出来。
所有这些都意味着翻译者(大多数人不是计算机程序员)必须非常小心地进行翻译,并且每个人在包含 % 的翻译中都需要非常小心。
似乎我们做错了什么(不知怎么回事),应该有一种更直接和统一的格式来完成此操作。目前,我们通过将百分号作为格式参数注入来解决这个问题。
是否有更好的方法来处理这个问题,还是现在的方法就是最好的方法?
底部有一个 .po 文件。
单元测试基本上说了一切,为什么最后一个断言失败了?这是 Jinja2 的 bug,还是我需要以不同的方式处理它。
class Jinja2Tests(TestCase):
def test_percent_percent(self):
""" i18n(gettext) expresses 98% as 98%% only in some versions of jinja2 that has not
worked as expected. This is to make sure that it is working. """
env = Environment(extensions=['jinja2.ext.i18n'])
lang = gettext.translation('messages', path.abspath(path.join(path.dirname(__file__), 'data')))
env.install_gettext_translations(lang)
template = env.from_string(source="{{ _('98%% off %(name)s sale') | format(name='holiday') }}")
result = template.render()
self.assertEqual('98% off holiday sale(translated)', result)
template = env.from_string(source="{{ _('98%% off sale') }}")
result = template.render()
# THE LINE BELOW FAILS WITH:
# AssertionError: '98% off sale(translated)' != u'98%% off sale(translated)'
self.assertEqual('98% off sale(translated)', result)
您需要将MO文件编译为PO文件,以运行上述代码。
# This file is distributed under the same license as the Uniregistrar project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2016.
#
msgid ""
msgstr ""
"Project-Id-Version: Uniregistrar 1.0\n"
"Report-Msgid-Bugs-To: mark@uniregistry.com\n"
"POT-Creation-Date: 2016-12-22 15:22-0500\n"
"PO-Revision-Date: 2016-11-14 16:42-0500\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n"
"Language-Team: en <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.3\n"
#: uniregistrar/constants.py:90
msgid "98%% off sale"
msgstr "98%% off sale(translated)"
#: uniregistrar/constants.py:90
msgid "98%% off %(name)s sale"
msgstr "98%% off %(name)s sale(translated)"