使用 Jinja2 和 Babel,我如何翻译包含 HTML 标签的句子?

With Jinja2 and Babel, how do I translate sentences containing HTML tags?

假设我有一个 Jinja2 模板,并且我正在使用 Flask-Babel 来翻译我的项目。例如:

<p>The <em>best</em> way of using the Internet is
to use <a href="{{ url_for('our_site') }}">our site</a>.</p>

所以我有一个带有 link 和强调的句子。假设我想翻译我的句子。显而易见的方法是使用 gettext(){% trans %} 标签:

<p>{% trans %}The {% endtrans %} <em>{% trans %}best{% endtrans %}</em>
{% trans %}way of using the Internet is to use{% endtrans %}
<a href="{{ url_for('our_site') }}">{% trans %}our site{% endtrans %}</a>{% trans %}.{% endtrans %}</p>

很明显,问题在于这会将句子分解成多个片段,无法很好地翻译。这将导致翻译器将字符串 "The"、"best"、"way of using the Internet is to use" 和 "our site" 视为所有单独的字符串,加上标点符号。当然,译者会想重组句子,选择什么词link,分别强调。

鉴于此,解决方案是什么?如何让一个带有标签的句子翻译成一个单位?

您可以使用 gettext() 和安全过滤器

{{ gettext('The <em>best</em> solution') | safe }}

http://jinja.pocoo.org/docs/2.9/templates/#list-of-builtin-filters

您的翻译人员随后可以安排标签。

如果您想让译员的工作更简单一些,您可以添加自定义降价过滤器并使用它在短语中添加简单的格式,请参见此处的示例 https://gist.github.com/glombard/7554134

你可以做到:

{% trans url=url_for('our_site') %}
<p>The <em>best</em> way of using the Internet is to use <a href="{{ url }}">our site</a>.</p>
{% endtrans %}

与对象嵌套变量相同 (obj.site_name):

{% trans url=url_for('our_site'), site_name=obj.site_name %}
<p>The <em>best</em> way of using the Internet is
to use <a href="{{ url }}">our site</a>{{ site_name }}.</p>
{% endtrans %}

所以你必须将变量声明为 trans 函数参数,否则 trans 将无法工作。要了解更多信息,请访问 docs.