Как я могу перевести сообщения об ошибках проверки по умолчанию Flask-WTF? - PullRequest
0 голосов
/ 07 июля 2019

Я включаю интернационализацию и локализацию в свое приложение 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.

...