【问题标题】:Django i18n translating text with htmlDjango i18n 用 html 翻译文本
【发布时间】:2013-01-17 11:17:46
【问题描述】:

如何处理翻译中的 HTML?我想翻译带有 HTML 的句子。比如这样一个字符串([login]是一个链接):

Please [login] to view your profile.

我不想打扰我的翻译人员翻译与 html 交织在一起的文本。另一方面,我不想费心在我的视图中创建所有链接,就像this question 中建议的那样。因此,理想情况下,我想要一个仅模板的解决方案,以具有制作 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。这个问题有(类似的)解决方案,还是需要自定义模板标签?

【问题讨论】:

  • 您的解决方案翻译了两次。
  • 这是为什么呢? {{ login }} 是一个变量,不会被翻译(再次)。
  • 除非模板 i18n 不是这样工作的。
  • 是的,这就是我首先要问的原因。

标签: django django-templates


【解决方案1】:

我创建了一个通用的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 ""

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多