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

And*_*Dog 32 django gettext django-templates internationalization

在Django模板中,我如何翻译包含HTML的块?例如:

{% trans "Please" %}
    <a href="{% url login %}?next={{ currentUrlPath }}">
        {% trans "log in" %}
    </a>
{% trans "in order to use MyApplicationName." %}
Run Code Online (Sandbox Code Playgroud)

拆分翻译的字符串允许我随时更改模板中的HTML,但我想将它放入单个翻译字符串会更有意义,如下所示:

{% url login as loginUrl %}
{% blocktrans %}
    Please
    <a href="{{ loginUrl }}?next={{ currentUrlPath }}">
        log in
    </a>
    in order to use MyApplicationName.
{% endblocktrans %}
Run Code Online (Sandbox Code Playgroud)

但是HTML标记在翻译字符串中,即如果我想更改HTML(例如锚的CSS类),我必须重新翻译每种语言的字符串.

还有更好的选择吗?

Mik*_*one 21

来自文档:

在{%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 %}
Run Code Online (Sandbox Code Playgroud)

这样您的翻译字符串就有占位符.在你的情况下:

{% blocktrans with login_object.anchor as anchor %}
    Please {{ anchor|safe }}log in</a> in order to use MyApplicationName.
{% endblocktrans %}
Run Code Online (Sandbox Code Playgroud)

您需要生成anchor视图函数中的文本.这使它远离你翻译的字符串.

  • 你可以这样做:{%url login as anchor_url%} {%blocktrans with anchor ='<a href="'|add:anchor_url | addd:'>>'| safe%}请{{anchor}}登录</a>以便使用MyApplicationName.{%endblocktrans%} (6认同)

Ned*_*der 14

将整个句子放在一个翻译字符串中不仅更有意义,翻译者在分割成片段时也不可能得到正确的句子.请记住,句子的不同部分可以相互影响,包括时态,案例,性别等.更不用说其他语言的行为与英语不同.例如,"请"这个词在提出请求和提出要求时可能会有所不同.

始终在翻译字符串中使用完整的句子,以便翻译人员可以使用目标语言制作正确的句子.

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 %}
Run Code Online (Sandbox Code Playgroud)

这使得翻译字符串中的HTML保持平衡.如果没有字符串中的开始标记,它很容易看起来像字符串中的错误.


ser*_*ach 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 %}
Run Code Online (Sandbox Code Playgroud)

所以,在您的.po文件中,您有:

It costs %(sum2)s dollars.
Run Code Online (Sandbox Code Playgroud)

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