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

5 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()使用的任何代码中 包装真实语言 LANGUAGES.

将语言包装成真实意味着什么gettext()?如何在代码中调用它?

use*_*922 5

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

from django.utils.translation import ugettext_lazy as _

LANGUAGES = [
    ('de', _('German')),
    ('en', _('English')),
]
Run Code Online (Sandbox Code Playgroud)


Car*_*yer 3

正如它所说:当您实际使用语言名称或向用户显示它们时,对语言名称调用 gettext() :

from django.utils.translation import ugettext

for lang_code, lang_name in settings.LANGUAGES:
    translated_name = ugettext(lang_name)
    ...
Run Code Online (Sandbox Code Playgroud)

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

要在模板中执行等效操作,只需使用 {% blocktrans %} 标记,该标记仅在幕后调用 ugettext:

{% for lang in LANGUAGES %}
  {% blocktrans %}{{ lang.1 }}{% endblocktrans %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

  • 因为当您在源代码树上运行 gettext 命令行工具时(可能通过 ./manage.py makemessages),您希望它将这些字符串识别为“需要翻译”,以便将它们添加到您的 PO 文件中。 (2认同)