我很难弄清楚如何使用flask-babel来转换循环中的变量。给这个(非工作)示例我需要为每次迭代更改它以使其拥有自己的翻译?
{% for key, values in products.items() %}
<h4>{{ _('%(name)s', name=values['name']) }}</h4>
<p>{{ _('%(caption)s', caption=values['caption']) }}</p>
{% endfor %}
通过此示例,PO生成如下:
msgid "%(name)s"
msgstr ""
据我所知,这只允许我为翻译插入一个值
答案 0 :(得分:1)
所以你有静态和动态的文本。用于翻译文本的 Babel-way 仅对静态文本有效。对于动态生成的文本,它将非常无效:Babel不知道动态文本,每次出现新产品时,您都必须手动将新闻文本添加到PO。我不推荐它。
您应该对动态文本使用不同的方法。我想您定期通过第三方API将产品导入您的数据库,因此您拥有Product
模型。如果只有少数语言和文本需要翻译,那么只有一个具有许多翻译字段的模型(每种语言一个)仍然足够。例如:
class Product(db.Model):
__tablename__ = 'product'
id = db.Column(db.Integer, primary_key=True)
category = db.Column(db.SmallInteger, index=True)
added = db.Column(db.DateTime, index=True)
name_en = db.Column(db.String(255))
name_eo = db.Column(db.String(255))
name_hu = db.Column(db.String(255))
description_en = db.Column(db.Text)
description_eo = db.Column(db.Text)
description_hu = db.Column(db.Text)
因此,在导入新产品后,您可以通过在线界面翻译其文本。如果您要翻译许多字段,可以将Product
的语言相关和独立部分分开,并为它们分隔模型:
class Product(db.Model):
__tablename__ = 'product'
id = db.Column(db.Integer, primary_key=True)
category = db.Column(db.SmallInteger, index=True)
added = db.Column(db.DateTime, index=True)
class ProductText(db.Model):
__tablename__ = 'product'
id = db.Column(db.Integer, primary_key=True)
pid = db.Column(db.Integer, db.ForeignKey('product.id'))
language = db.Column(db.String(10), index=True)
name = db.Column(db.String(255))
description = db.Column(db.Text)
因此,当您想向客户展示产品时,请先检查有效语言,然后使用当前ProductText
加载相应的已翻译Product
。