0

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

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

4

1 回答 1

1

所以你有静态和动态的文本。翻译文本的Babel 方式仅对静态文本有效。对于动态生成的文本,它会非常无效:Babel 不知道动态文本,每次新产品出现时,您都必须手动将新闻文本添加到 PO。我不推荐它。

您应该对动态文本使用不同的方法。我想您会定期通过第 3 方 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.

于 2015-11-20T10:07:56.050 回答