Как добавить ссылку для изменения и сохранения нового языка с помощью babel и flask?

Я правильно настроил Babel, и перевод работает, как задумано. Я застрял в том, чтобы иметь возможность переключать языки с помощью ссылки, а затем сохранять этот параметр активным, даже если пользователь нажимает на любые другие ссылки на веб-странице.

Вот как выглядит моя установка:

app = Flask(__name__)
app.config["BABEL_DEFAULT_LOCALE"] = "en"
babel = Babel(app)

@babel.localeselector
def get_locale():
    if request.args.get("lang"):
        session["lang"] = request.args.get("lang")
    return session.get("lang", "en")

Это работает, как и ожидалось, и нового пользователя приветствует версия веб-страницы «en». Я могу переключиться вручную, набрав '/?lang=sv' или '/?lang=en' после адреса в поле поиска, но как это сделать со ссылкой?

Это, вероятно, просто, но я не понимаю, как это сделать, основываясь на их документации. Кроме того, это первый раз для меня, поэтому такое ощущение, что я принял воду на голову.


person Salviati    schedule 25.07.2018    source источник
comment
Мод, вероятно, может закрыть этот, потому что я нашел здесь двойник: заголовок stackoverflow.com/questions/42393831/. Но это не помогает мне, так как мы действительно не сделали это так же   -  person Salviati    schedule 25.07.2018


Ответы (2)


Вероятно, что-то вроде этого может помочь вам.

Установите маршрут, который обрабатывает изменение языка и сохраняет выбранный язык в сеансе:

@app.route('/language/<language>')
def set_language(language=None):
    session['language'] = language
    return redirect(url_for('index'))

У вас есть настройка get_locale(), которая возвращает выбранный язык, но вы должны иметь доступ к нему из шаблона. Так

@app.context_processor
def inject_conf_var():
    return dict(CURRENT_LANGUAGE=session.get(CURRENT_LANGUAGE=session.get('language'', request.accept_languages.best_match(app.config['LANGUAGES'].keys())))

Наконец, в шаблоне выберите нужный язык:

{% for language in AVAILABLE_LANGUAGES.items() %}
    {% if CURRENT_LANGUAGE == language[0] %}
        {{ language[1] }}
    {% else %}
        <a href="{{ url_for('set_language', language=language[0]) }}" >{{ language[1] }}</a>
    {%  endif %}
{% endfor %}
person Sushant    schedule 25.07.2018
comment
Пытаюсь понять, что происходит, как можно скорее вернусь с информацией, заработало у меня это или нет. Благодарю вас! - person Salviati; 25.07.2018
comment
К сожалению, так не получилось, придумал другой способ. Пусть так и будет, пока я не найду лучший способ - person Salviati; 25.07.2018

Вероятно, худший способ сделать это, но он работает.

Сначала мне пришлось изменить индекс, чтобы принять метод GET:

@app.route("/", methods=['GET'])
def index():
    return render_template("index.html", me=me)

Затем добавьте в файл HTML метод формы

<form method="GET">
  <input type="submit" name="lang" value="sv">
  <input type="submit" name="lang" value="en">
</form>

Не приму этот ответ, потому что он выглядит неправильно, должен быть лучший способ

person Salviati    schedule 25.07.2018