Я включаю интернационализацию и локализацию в свое приложение Flask, но у меня возникают проблемы с переводом сообщений проверки по умолчанию, которые валидаторы WTForms предоставляют при ошибке проверки.
Я попытался явно установить параметр "message"для одного из валидаторов моих форм, использующих оба Flask-Babel _()
(который я считаю псевдонимом gettext()
) и lazy_gettext()
), но ни один из них не сработал.
Затем я увидел эту ссылку:http://wtforms.simplecodes.com/docs/1.0.1/i18n.html#translating-built-in-messages и попытался использовать этот метод, при этом функции gettext()
и ngettext()
вызывались точно так же, но захватывали их следующим образом: from flask_babel import gettext as _g, ngettext as _n
, но это тоже не сработало.
Наконец, я увидел этот раздел предыдущей ссылки: http://wtforms.simplecodes.com/docs/1.0.1/i18n.html#translating-built-in-messages и попытался создать подкласс, унаследовавший как 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...>
Я ожидаю, что сбой любого из встроенных vВ результате alidators зрителю будет показано соответствующее сообщение об ошибке, переведенное на его язык, но я всегда вижу сообщение на английском языке.Мои пользовательские валидаторы, однако, все переводят правильно, используя функцию _()
, как показано в моем коде выше для моего CreateThreadForm
.