在 <lambda> 中编译消息 django <string>,第 1 行 Django 国际化

compile messages django <string> in <lambda>, line 1 Django internationalization

当我尝试访问我的项目的某个页面时出现以下错误。我相信这是由于我在那条线上实施的复数。令人困惑的是,它并没有发生在我项目中的所有语言上,只有一种。

控制台

  File "\lib\site-packages\django\template\base.py", line 959, in render_annotated
    return self.render(context)
  File "\lib\site-packages\django\templatetags\i18n.py", line 149, in render
    result = translation.ungettext(singular, plural, count)
  File "\lib\site-packages\django\utils\translation\__init__.py", line 89, in ungettext
    return _trans.ungettext(singular, plural, number)
  File "\lib\site-packages\django\utils\translation\trans_real.py", line 362, in ngettext
    return do_ntranslate(singular, plural, number, 'ngettext')
  File "\lib\site-packages\django\utils\translation\trans_real.py", line 349, in do_ntranslate
    return getattr(t, translation_function)(singular, plural, number)
  File "C:\Python34\Lib\gettext.py", line 344, in ngettext
    tmsg = self._catalog[(msgid1, self.plural(n))]
  File "<string>", line 1, in <lambda>
TypeError: unorderable types: str() > int()

Template.py

{% cache cache_hourly_timeout visualizations %}
    {% blocktrans count number_views=advertisement.get_views|intcomma %}<strong>{{ number_views }}</strong> view{% plural %}<strong>{{ number_views }}</strong> views{% endblocktrans %}
{% endcache %}

我们实际上遇到了同样的问题:

模板

{% blocktrans count count=paginator.count %}
    single text
{% plural %}
    plural text
{% endblocktrans %}

这实际上触发了您描述的错误。对我们来说,它只发生在法语中,而不是任何其他语言。

在 Django 中复制 Shell

在 django shell 中,我们可以使用以下行来复制此错误:

    from django.utils.translation import _trans

    _trans.ngettext("test", "tests", 0)  # 'tests'
    _trans.ngettext("test", "tests", 1)  # 'test'
    _trans.ngettext("test", "tests", 2)  # 'tests'
    _trans.ngettext("test", "tests", '')  # 'tests'
    _trans.activate('fr')  # Changing the language to French
    _trans.ngettext("test", "tests", '')
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
      File "/home/vagrant/.virtualenvs/talentindex/lib/python3.4/site-packages/django/utils/translation/trans_real.py", line 369, in ngettext
        return do_ntranslate(singular, plural, number, 'ngettext')
      File "/home/vagrant/.virtualenvs/talentindex/lib/python3.4/site-packages/django/utils/translation/trans_real.py", line 356, in do_ntranslate
        return getattr(t, translation_function)(singular, plural, number)
      File "/usr/lib64/python3.4/gettext.py", line 341, in ngettext
        tmsg = self._catalog[(msgid1, self.plural(n))]
      File "<string>", line 1, in <lambda>
    TypeError: unorderable types: str() > int()

解决方法

此问题的解决方法是确保计数器永远不会 None 或空字符串。由于模板中的空字符串分页器对象实际上是 None 并且 None.count 会导致空字符串,从而导致错误。

使用{% blocktrans count count=paginator.count|default:0 %}解决。

希望这对任何人都有帮助。