在 <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 %}
解决。
希望这对任何人都有帮助。
当我尝试访问我的项目的某个页面时出现以下错误。我相信这是由于我在那条线上实施的复数。令人困惑的是,它并没有发生在我项目中的所有语言上,只有一种。
控制台
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 %}
解决。
希望这对任何人都有帮助。