Flask-Babel转换Flask-WTF SelectField

时间:2019-10-01 03:07:42

标签: flask babel flask-wtforms wtforms flask-babel

我想用 Flask-Babel 转换 Flask-WTF SelectField值。

这是我的代码段:

from flask_babel import _, lazy_gettext as _l

class PaymentStatus(enum.Enum):
    REJECTED = 'REJECTED'
    COMPLETED = 'COMPLETED'
    EXPIRED = 'EXPIRED'

    def __str__(self):
        return self.value

payment_status = [(str(y), y) for y in (PaymentStatus)]

def course_list():
    return Course.query.all()

class PaymentForm(FlaskForm):
    course_name = QuerySelectField(_l('Course name'), validators=[required()], query_factory=course_list)
    status_of_payment = SelectField(_l('Payment Status'), choices=payment_status)
    # ...
    # ...

在这里,我想使用 Flask-Babel 将SelectField choices值和QuerySelectField query_factory值本地化。

是否有可能..?,如果可以,那么请欣赏任何示例或参考教程:)

1 个答案:

答案 0 :(得分:2)

SelectField choices可以由lazy_gettext()处理。

Quote from The Flask Mega-Tutorial Part XIII: I18n and L10n

  

通常在应用程序启动时,在请求之外的 中分配了一些字符串文字,因此在评估这些文本时,无法知道使用哪种语言。

     

Flask-Babel提供了_()的惰性评估版本,称为lazy_gettext()

from flask_babel import lazy_gettext as _l

class LoginForm(FlaskForm):
    username = StringField(_l('Username'), validators=[DataRequired()])
    # ...

对于choices

from flask_babel import _, lazy_gettext as _l

class PaymentStatus(enum.Enum):
    REJECTED = _l('REJECTED')
    COMPLETED = _l('COMPLETED')
    EXPIRED = _l('EXPIRED')

    def __str__(self):
        return self.value

QuerySelectField query_factory接受从数据库查询的值 。 Flask-Babel / babel不应处理这些值。导致数据库将数据存储在Python源代码之外。

可能的解决方案:

Miguel Grinberg制作的

BTW, Flask Mega-Tutorial 是非常著名的Flask教程。所有这些情况都包含在其中。