Django文档声明:
使用变量或计算值的警告,如前所述 两个例子,就是Django的翻译字符串检测工具, django-admin.py makemessages,将无法找到这些字符串。
对我来说没问题,我已准备好手动翻译变量的所有可能值的翻译。但是怎么做呢?
假设我的模板代码如下:
{% trans var %}
从数据库中提取var,我知道它的所有可能值 - 假设可能的值是“Alice”和“Bob”。
我认为我需要做的就是提供以下条目:
msgid "Alice"
msgstr "Alicja"
在django.po文件中。不幸的是,每当我在那之后运行djangoadmin makemessages时,这些条目都会被注释掉:
#~ msgid "Alice"
#~ msgstr "Alicja"
我做错了什么?我是否误解了翻译计算值的想法?
答案 0 :(得分:10)
我们目前正在解决这个问题。虽然我们还没有这么做,但我们确实有一个相当恼人的丑陋黑客来解决它。
我们只是在代码中的某处定义一个“虚拟”函数(例如你的models.py或甚至settings.py),并用我们需要翻译的所有字符串填充它。
from django.utils.translation import ugettext_lazy as _, pgettext
def dummy_for_makemessages():
"""
This function allows manage makemessages to find the forecast types for translation.
Removing this code causes makemessages to comment out those PO entries, so don't do that
unless you find a better way to do this
"""
pgettext('forecast type', 'some string')
pgettext('forecast type', 'some other string')
pgettext('forecast type', 'yet another string')
pgettext('forecast type', 'etc')
pgettext('forecast type', 'etc again')
pgettext('forecast type', 'and again and again')
永远不会调用此函数,但只是定义它就可以防止消息字符串被makemessages注释掉。
不是最优雅的解决方案,但它确实有效。
答案 1 :(得分:1)
有一种很好的方法可以做到这一点! (我知道,因为我碰巧使用相同的代码)。
首先 - 在某处计算此值。所以,在你的行动中,你可能有:
context['var'] = 'good' if condition(request) else 'bad'
以及稍后的模板:
{% if var == 'good' %}
{% trans "Congratulations, var equals: "}
{% else %}
{% trans "Oops, var equals: "}
{% endif %}
{% trans var %}
你可能有不同的价值,这可能变得不切实际......除非你使用这个技巧:
_ = lambda x: x
context['var'] = _('good') if condition(request) else _('bad')
如果您不想与_
等发生冲突,则需要在本地设置ugettext_lazy
。
这样,你不是:
manage.py makemessages
答案 2 :(得分:0)
我最终用@StFS答案中建议的类似解决方案来解决它。
当我使用pgettext('forecast type', 'some string')
时,在我的模板中使用{% trans varName %}
仍会返回" 某些字符串"而不是" 新文本"翻译。
所以我已将函数中的语法更改为gettext('some string')
。
现在使用{% trans varName %}
会给出#34; New Text"在我的模板中。