如何处理翻译中的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。是否存在(类似的)此问题的解决方案,还是需要自定义模板标记?
答案 0 :(得分: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 ""