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

时间:2011-01-09 15:52:56

标签: django internationalization django-templates gettext

在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类),我必须重新翻译每种语言的字符串。

还有更好的选择吗?

3 个答案:

答案 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.

但这是一个棘手的问题 - 如何处理需要翻译的部分片段(如你的情况)。