使用带有gettext()的正确翻译名称的settings.LANGUAGES

时间:2009-08-25 16:07:20

标签: python django translation gettext

来自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中包装语言究竟意味着什么?如何在代码中调用它?

4 个答案:

答案 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 %}