[英]Django templates: Best practice for translating text block with HTML in it
在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类),我必须重新翻译每种语言的字符串。
还有更好的选择吗?
来自文档 :
在{%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
中的文本。 这使它远离你翻译的字符串。
将整个句子放在一个翻译字符串中不仅更有意义,翻译者在分割成片段时也不可能得到正确的句子。 请记住,句子的不同部分可以相互影响,包括时态,案例,性别等。 更不用说其他语言的行为与英语不同。 例如,“请”这个词在提出请求和提出要求时可能会有所不同。
始终在翻译字符串中使用完整的句子,以便翻译人员可以使用目标语言制作正确的句子。
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保持平衡。 如果没有字符串中的开始标记,它很容易看起来像字符串中的错误。
我可以为只有部分片段提供方便的解决方案,这些片段对于任何翻译都是常量
在这种情况下,您可以避免在使用自定义模板标记时使用.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.
但这是一个棘手的问题 - 如何处理需要翻译的部分片段(如你的情况)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.