如何使用flask-babel在循环内翻译

时间:2015-11-18 18:31:46

标签: python flask internationalization jinja2 babel

我很难弄清楚如何使用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 ""

据我所知,这只允许我为翻译插入一个值

1 个答案:

答案 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