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

Posted

技术标签:

【中文标题】Django 模板:翻译带有 HTML 的文本块的最佳实践【英文标题】:Django templates: Best practice for translating text block with HTML in it 【发布时间】:2011-06-06 02:53:56 【问题描述】:

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

有没有更好的选择?

【问题讨论】:

【参考方案1】:

我可以为任何翻译都不变的部分片段提供一个方便的解决方案。

在这种情况下,您可以避免在使用自定义模板标签时在 .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.

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

【讨论】:

【参考方案2】:

将整个句子放在一个翻译字符串中不仅更有意义,而且翻译人员可能无法将句子拆分为正确的句子。请记住,句子的不同部分可以通过时态、格、性别等相互影响。更不用说其他语言的行为与英语不同。例如,在提出请求和提出要求时,“请”这个词可能会有所不同。

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

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 文件中有标签“a”,对吧?这是一种没有任何 html 标签的 .po 文件的方法吗?谢谢。 没有简单的方法。如果您需要在句子中标记几个单词,只有翻译人员可以告诉您这些单词在哪里,所以他们必须以某种方式标记它们。您可以使用 HTML,也可以编写自己的标记。【参考方案3】:

来自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 中的文本。这使它远离你的翻译字符串。

【讨论】:

这是一个很好的解决方案,谢谢。我将使用 Ned Batchelder 的调整(仅将属性存储在变量中)。不幸的是,anchor 变量无法使用 Django 的内置模板语言轻松创建是对的,所以在我看来,我必须这样做。 你可以这样做:% url login as anchor_url %% blocktrans with anchor=''|safe %请 anchor 登录以使用 MyApplicationName.% endblocktrans %

以上是关于Django 模板:翻译带有 HTML 的文本块的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

在多个 django 模板文件中显示相同 html 块的最佳 DRY 方法

生成带有和不带有 HTML 标签的相同文本?

django - 如何使翻译工作?

在 Django 模板中使用带有 blocktrans 的 urlize 过滤器的惯用方式

4.Django-模板介绍

Django 第三课 模板