我正在将国际化和本地化合并到我的Flask应用程序中,但是在转换WTForms验证器在验证失败时提供的默认验证消息时遇到了问题。
我试图同时使用Flask-Babel的_()
(我相信是gettext()
的别名和lazy_gettext()
)为表单验证者之一明确设置“ message”参数,但这些都不起作用。
然后我看到以下链接:http://wtforms.simplecodes.com/docs/1.0.1/i18n.html#translating-built-in-messages,并尝试使用该方法,以完全相同的方式调用了gettext()
和ngettext()
函数,但它们的捕获方式如下:{{ 1}},但这也不起作用。
最后,我看到了上一个链接的这一部分:http://wtforms.simplecodes.com/docs/1.0.1/i18n.html#translating-built-in-messages,并试图创建一个继承了from flask_babel import gettext as _g, ngettext as _n
flask_wtf
和FlaskForm
wtforms.ext.i18n.form
的子类,曾经用来创建我所有的申请表,但这也不起作用。
Form
(包括我所有的申请表)
app/forms.py
我希望任何内置验证程序失败都会导致向查看器显示一条适用的错误消息,该消息将转换为其区域设置,但是我始终会看到英语消息。但是,我的自定义验证程序都可以使用from flask import request
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, TextAreaField, SubmitField
from wtforms.validators import ValidationError, DataRequired, Email, EqualTo, Length
from app.models import User, Thread, Subreddit
from flask_babel import _, lazy_gettext as _l
class CreateThreadForm(FlaskForm):
subreddit = StringField(_l('Subreddit'), validators=[DataRequired()])
title = StringField(_l('Title'), validators=[DataRequired(), Length(min=16, max=128)])
body = TextAreaField(_l('Body'), validators=[DataRequired(), Length(max=256)])
submit = SubmitField(_l('Submit'))
def validate_title(self, title):
thread = Thread.query.filter_by(title = title.data).first()
if thread is not None:
raise ValidationError(_('The specified thread title is already in use.'))
def validate_subreddit(self, subreddit):
existing_subreddit = Subreddit.query.filter_by(name = subreddit.data).first()
if existing_subreddit is None:
raise ValidationError(_('The specified subreddit does not exist.'))
<Other application forms here...>
函数正常翻译,如上面我的_()
代码所示。