Django i18n翻译带有HTML标记的文本

4

如何处理翻译中的HTML代码?我想要翻译包含HTML代码的句子。例如,这样一个字符串([login] 是一个链接):

Please [login] to view your profile.

我不想让我的翻译员为混杂了HTML的文本进行翻译而感到困扰。另一方面,我也不想为我的视图中创建所有链接而感到困扰,就像这个问题所建议的那样。因此,理想情况下,我希望仅使用模板就能够实现灵活地构造HTML,并允许翻译人员只处理文本字符串。

例如,以下伪代码实现了这些要求:

{% render as login_html %}
    <a href="{{ url 'login' }}?next={{ request.path|urlencode }}">
        {% trans "Login" %}
    </a>
{% endrender %}

{% blocktrans with login=login_html %}
    Please {{ login }} to view your profile.
{% endblocktrans %}

首先,登录HTML被呈现并存储为login_url。然后在我的blocktrans中,我可以简单地使用{{ login }}来给出呈现的登录HTML。是否有类似的解决方案,或者需要自定义模板标签?


你的解决方案翻译了两次。 - Ignacio Vazquez-Abrams
为什么呢?{{ login }}是一个变量,不需要再次翻译。 - Bouke
除此之外,这不是模板国际化的工作方式。 - Ignacio Vazquez-Abrams
是的,这就是我为什么首先提出询问的原因。 - Bouke
1个回答

2
我已经创建了一个通用的render标签来实现这一点:
from classytags.arguments import Argument, Flag
from classytags.core import Options
from classytags.helpers import AsTag
from django import template
from django.utils.safestring import mark_safe

register = template.Library()


class Render(AsTag):
    """
    Renders the block contents to be used elsewhere in the template.

    Example usage:

        {% render as login_url %}
            <a href="{% url 'login' %}">{% trans "Login" %}</a>
        {% endrender %}

        {% blocktrans %}
            Please {{ login_url }} for more information.
        {% endblocktrans %}

    It will automatically strip leading and trailing whitespace, use `nowrap`
    to disable this behaviour:

        {% render nostrip as varname %} . . . {% endrender %}
    """
    options = Options(
        Flag('strip', default=True, false_values=['nostrip']),
        'as',
        Argument('varname', resolve=False, required=True),
        blocks=[('endrender', 'nodelist')],
    )

    def get_value(self, context, nodelist, strip, **kwargs):
        value = nodelist.render(context)
        if strip:
            value = value.strip()
        return mark_safe(value)
register.tag(Render)

当与翻译上下文一起使用时(例如{% trans "Login" context "login_url" %}),翻译者将能够在不受HTML干扰的情况下对翻译进行更好的控制。
msgctxt "login_url"
msgid "Login"
msgstr ""

#, python-format
msgid "Please %(login_url)s for more information."
msgstr ""

它依赖于django-classy-tags: https://github.com/django-cms/django-classy-tags - racribeiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接