You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用flask_babelex与Jinja2时如何在可翻译文本中插入HTML或占位符

解决方案

推荐采用翻译占位符+安全标记的方案实现,完全符合Flask+BabelEx的国际化最佳实践,不需要额外JS逻辑,也不会出现标签转义问题:

方案1:Python侧组装(适合翻译内容在视图层定义的场景)

核心思路是把需要加样式的关键词单独作为翻译条目,通过占位符嵌入主翻译字符串,再用Markup标记HTML部分为安全内容,避免Jinja2转义:

from flask_babelex import gettext
from markupsafe import Markup

# 关键词单独翻译,不同语言会自动匹配对应词汇
highlight_keyword = gettext(u'potatoes')
# 主翻译字符串用占位符留位置,不需要包含任何HTML标签
page_title = Markup(gettext(u'The best %(keyword)s in the world!')) % {
    'keyword': Markup(f'<span class="potato-style">{highlight_keyword}</span>')
}

模板中直接正常调用即可,不需要额外处理:

<h2>{{ page_title }}</h2>

方案2:Jinja2模板侧组装(适合翻译内容在模板层定义的场景)

如果不想在Python层处理HTML拼接,也可以把逻辑全放到模板中实现,用内置的safe过滤器标记安全内容:

<h2>
{{ 
    _('The best %(keyword)s in the world!', 
        keyword='<span class="potato-style">%s</span>'|format(_('potatoes'))
    )|safe 
}}
</h2>

两种方案的优势

  • 翻译资源文件(.po/.mo)中不会出现HTML标签,避免翻译人员误修改标签结构,后续维护成本极低
  • 关键词单独作为翻译条目,不同语言下都能正确匹配对应词汇,不会出现多语言适配问题
  • 完全基于现有依赖实现,不需要引入额外工具或JS逻辑

可选方案(不推荐):翻译字符串直接嵌入HTML

如果你的场景中标签位置在不同语言里会发生变化(比如部分语言语序不同需要调整标签位置),也可以直接把HTML写到翻译字符串中,只需要在渲染时加safe过滤器即可:

page_title = gettext(u'The best <span class="potato-style">potatoes</span> in the world!')
<h2>{{ page_title|safe }}</h2>

该方案的缺点是翻译人员需要额外注意不要修改HTML标签结构,适合小范围特殊场景使用。

内容的提问来源于stack exchange,提问作者Xosted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:15:03