6

来自 Django 文档:

如果您定义自定义LANGUAGES 设置,可以将语言标记为翻译字符串(如上面显示的默认值) - 但使用“虚拟”gettext()函数,而不是django.utils.translation. 您永远不应该 django.utils.translation从您的设置文件中导入,因为该模块本身取决于设置,这会导致循环导入。解决方案是使用“虚拟”gettext()功能。这是一个示例设置文件:

gettext = lambda s: s LANGUAGES = ( ('de', gettext('German')), ('en', gettext('English')), )

通过这种安排,django-admin.py makemessages仍然会找到并标记这些字符串以进行翻译,但翻译不会在运行时发生——所以你必须记住 在运行时gettext()使用的任何代码中将语言包装成真实的 LANGUAGES

将语言包装成 real 到底意味着什么gettext()?它应该如何在代码中调用?

4

4 回答 4

5

根据最新的文档,您可以ugettext_lazy在设置中使用而不会导致循环导入:

from django.utils.translation import ugettext_lazy as _

LANGUAGES = [
    ('de', _('German')),
    ('en', _('English')),
]
于 2017-03-20T13:42:10.313 回答
3

正是它所说的:当您实际使用语言名称或将它们显示给用户时,请在语言名称上调用它们:

from django.utils.translation import ugettext

for lang_code, lang_name in settings.LANGUAGES:
    translated_name = ugettext(lang_name)
    ...

(通常应该使用 ugettext 而不是 gettext,因为 Django 中的所有文本都是 unicode。)

要在模板中做同样的事情,只需使用 {% blocktrans %} 标签,它只是在后台调用 ugettext:

{% for lang in LANGUAGES %}
  {% blocktrans %}{{ lang.1 }}{% endblocktrans %}
{% endfor %}
于 2009-08-25T18:37:27.773 回答
0

This is really a comment and further explanation on the above Q&A. I could not get my translations to work, read and re-read the docs, searched for hours online, and after reading this post I realized it came down to this:

I originally had:

LANGUAGES = (
    ('en', 'English'),
    ('nl', 'Dutch'),
    )

Which would not work, then after reading this tried

ugettext = lambda s: s
LANGUAGES = (
    ('en', ugettext('English')),
    ('nl', ugettext('Dutch')),
    )

Which made everything work... and I just searched for this and it is in the doc's at https://docs.djangoproject.com/en/1.4/topics/i18n/translation/#how-django-discovers-language-preference, toward the bottom of this section...

于 2012-07-14T15:26:54.957 回答
0

在模板中,您可以执行以下操作:

{% for lang in LANGUAGES %}
      {% trans lang.1 %}
{% endfor %}
于 2013-10-07T09:52:58.353 回答