在Django模板中,我如何翻译包含HTML的块?例如:
{% trans "Please" %}
<a href="{% url login %}?next={{ currentUrlPath }}">
{% trans "log in" %}
</a>
{% trans "in order to use MyApplicationName." %}
拆分已翻译的字符串允许我随时更改模板中的HTML,但我想将它放入单个翻译字符串会更有意义,如下所示:
{% url login as loginUrl %}
{% blocktrans %}
Please
<a href="{{ loginUrl }}?next={{ currentUrlPath }}">
log in
</a>
in order to use MyApplicationName.
{% endblocktrans %}
但HTML标记在翻译字符串中,即如果我想更改HTML(例如锚的CSS类),我必须重新翻译每种语言的字符串。
还有更好的选择吗?
答案 0 :(得分:20)
来自the docs:
在{%trans%}内的字符串中混合模板变量是不可能的。如果您的翻译需要带变量的字符串(占位符),请改用{%blocktrans%}。
然后在blocktrans
下:
要翻译模板表达式(例如,访问对象属性或使用模板过滤器),您需要将表达式绑定到本地变量以在翻译块中使用。例子:
{% blocktrans with article.price as amount %}
That will cost $ {{ amount }}.
{% endblocktrans %}
{% blocktrans with value|filter as myvar %}
This will have {{ myvar }} inside.
{% endblocktrans %}
这样您的翻译字符串就有占位符。在你的情况下:
{% blocktrans with login_object.anchor as anchor %}
Please {{ anchor|safe }}log in</a> in order to use MyApplicationName.
{% endblocktrans %}
您需要在视图功能中生成anchor
中的文本。这使它远离你翻译的字符串。
答案 1 :(得分:11)
将整个句子放在一个翻译字符串中不仅更有意义,翻译者在分割成片段时也可能无法正确判断句子。请记住,句子的不同部分可以相互影响,包括时态,案例,性别等。更不用说其他语言的行为与英语不同。例如,“请”这个词在提出请求和提出要求时可能会有所不同。
始终在翻译字符串中使用完整的句子,以便翻译人员能够使用目标语言制作正确的句子。
Mike DeSimone提出了正确的建议,我只想对其进行一次调整:
{% blocktrans with login_object.anchor_attr as anchor_attr %}
Please <a {{ anchor_attr|safe }}>log in</a> in order to use MyApplicationName.
{% endblocktrans %}
这样可以平衡翻译字符串中的HTML。如果没有字符串中的开始标记,它很容易看起来像字符串中的错误。
答案 2 :(得分:8)
我可以为只有部分片段提供方便的解决方案,这些片段对于任何翻译都是不变的。
在这种情况下,您可以避免在使用自定义模板标记时使用.po文件中的任何HTML或CSS,例如下一个:
@register.filter( name='safewrap' )
def safewrap( val, arg ):
return val.format( arg )
safewrap.is_safe = True
...
{% blocktrans with sum2="<a href='mysite.com/offer'>{0}</a>"|safewrap:sum %}
It costs {{sum2}} dollars.
{% endblocktrans %}
所以,在您的.po文件中,您有:
It costs %(sum2)s dollars.
但这是一个棘手的问题 - 如何处理需要翻译的部分片段(如你的情况)。