来自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()
<{1}}在运行时。
在真实LANGUAGES
中包装语言究竟意味着什么?如何在代码中调用它?
答案 0 :(得分:4)
根据latest docs,您可以在设置中使用ugettext_lazy
而不会导致循环导入:
from django.utils.translation import ugettext_lazy as _
LANGUAGES = [
('de', _('German')),
('en', _('English')),
]
答案 1 :(得分:3)
究竟是什么意思:当您实际使用它们或向用户显示时,请在语言名称上调用gettext():
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 %}
答案 2 :(得分:0)
这是对上述Q&amp; A的评论和进一步解释。我无法让我的翻译工作,阅读和重新阅读文档,在网上搜索了几个小时,阅读完这篇文章后我意识到它归结为:
我最初有:
LANGUAGES = (
('en', 'English'),
('nl', 'Dutch'),
)
哪个不行,然后看了这个试过的
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('nl', ugettext('Dutch')),
)
这使一切正常......我只是搜索了这个,它位于https://docs.djangoproject.com/en/1.4/topics/i18n/translation/#how-django-discovers-language-preference的文档中,位于本节的底部......
答案 3 :(得分:0)
您可以执行以下操作:
{% for lang in LANGUAGES %}
{% trans lang.1 %}
{% endfor %}