django 使用settings.LANGUAGES和使用gettext()正确翻译的名称

gajydyqb  于 2023-03-24  发布在  Go
关注(0)|答案(4)|浏览(222)

Django文档:
如果定义了自定义LANGUAGES设置,则可以将语言标记为翻译字符串(如上面显示的默认值)--但是使用一个“虚拟”gettext()函数,而不是django.utils.translation中的那个。你不应该从你的设置文件中导入django.utils.translation,因为那个模块本身依赖于设置,这将导致循环导入。解决方案是使用一个“dummy”gettext()函数。下面是一个示例设置文件:
x1名5名1 x 1名6名1 x 1名7名1 x 1名8名1 x
通过这种安排,django-admin.py makemessages仍然会找到并标记这些字符串以进行转换,但转换不会在运行时发生--因此您必须记住在运行时使用LANGUAGES的任何代码中 Package 真实的的gettext()中的语言。
在真实的gettext()中 Package 语言到底意味着什么?在代码中应该如何调用它?

3xiyfsfu

3xiyfsfu1#

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

from django.utils.translation import ugettext_lazy as _

LANGUAGES = [
    ('de', _('German')),
    ('en', _('English')),
]

如果你使用的是Django 3.0或更高版本,那么你应该使用gettext_lazy

siv3szwd

siv3szwd2#

就像上面说的:在实际使用语言名称或向用户显示语言名称时,调用gettext():

from django.utils.translation import ugettext

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

(You通常应该使用ugettext而不是gettext,因为Django中的所有文本都是unicode。
要在模板中执行等效操作,只需使用{% blocktrans %}标记,该标记仅在后台调用ugettext:

{% for lang in LANGUAGES %}
  {% blocktrans %}{{ lang.1 }}{% endblocktrans %}
{% endfor %}
yacmzcpb

yacmzcpb3#

这真的是对上述问答的评论和进一步解释。我无法让我的翻译工作,阅读和重读文档,在网上搜索了几个小时,在阅读这篇文章后,我意识到它归结为:
我原来有:

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

这行不通,然后在阅读后,这一尝试

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

这使得一切工作...我刚刚搜索了这一点,它是在文档的https://docs.djangoproject.com/en/1.4/topics/i18 n/translation/#how-django-discovers-language-preference,在本节的底部...

xmjla07d

xmjla07d4#

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

{% for lang in LANGUAGES %}
      {% trans lang.1 %}
{% endfor %}

相关问题