【问题标题】:With Jinja2 and Babel, how do I translate sentences containing HTML tags?使用 Jinja2 和 Babel,我如何翻译包含 HTML 标签的句子?
【发布时间】:2016-10-02 14:18:46
【问题描述】:

假设我有一个 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>

所以我有一个带有链接和强调的句子。假设我想翻译我的句子。显而易见的方法是使用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”视为所有单独的字符串,加上标点符号。当然,译者会想要重新构造句子,并选择单独连接和强调的单词。

因此,鉴于此,解决方案是什么?如何将一个带有标签的句子翻译为一个单元?

【问题讨论】:

  • 我不熟悉 Jinja2 或 Babel,但这似乎更像是一个逻辑难题而不是特定于实现的难题,所以无论如何我都会尝试一下:为什么不写一个脚本来确保在翻译过程中,文本中的任何 html 标签都会被译者忽略吗?在此示例中,您可以将

    标记内的任何内容分割为一个单元。这会被翻译人员读取,但 标签 inside 会被忽略,剩下的是原始文本。

  • 好吧,我不希望标签被忽略,我希望人工翻译人员根据翻译重新排列它们。但这变得复杂了,因为那时我必须告诉 Jinja2 相信翻译后的代码,而不是逃避它,因为很多原因,这将是有问题的。
  • 换句话说,我希望 HTML 标记的位置由翻译器决定,因此删除/忽略它们是行不通的。
  • 如果你说的是原文中存在的标签需要在翻译后的对等位置,那恐怕我做不到想一想没有使用语法敏感的解析器,它可以智能地识别和分类跨语言的部分文本。也许使用类似spacy.io 或这个演示:foxtype.com/sentence-tree
  • 这有点矫枉过正,因为这就是你想要做的。我认为您低估了您的简单示例实际上有多复杂。撇开专有名词不谈,有些词在其他语言中甚至没有等价词,当它们出现时,它们可以成为另一个复合词/帮助词的一部分,或者分成不同的词放在句子中。您的解决方案必须以某种方式考虑所有这些,同时直观地理解两种语言的语法,以防止格式被上下文破坏。 继承的格式有很多。

标签: python flask jinja2 python-babel


【解决方案1】:

您可以使用 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

【讨论】:

    【解决方案2】:

    你可以这样做:

    {% 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

    【讨论】:

      猜你喜欢
      • 2013-01-24
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 2012-09-15
      • 2013-04-08
      相关资源
      最近更新 更多