繁体   English   中英

Django模板:在其中翻译带有HTML的文本块的最佳实践

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM