Получить текущую локаль в Jinja2

На моем сайте используйте Flask + Jinja2 и Flask-Babel для перевода. На сайте есть два языка (в зависимости от URL-адреса), и я хотел бы добавить ссылку для переключения между ними. Чтобы сделать это правильно, мне нужно получить название текущей локали, но я не нашел такой функции в документации. Он вообще существует?


person aplavin    schedule 05.05.2013    source источник


Ответы (3)


Наконец, я использовал это решение: добавить функцию get_locale, которая должна быть определена в любом случае, в глобальные переменные Jinja2, а затем вызвать ее в шаблоне, как и любую другую функцию.

person aplavin    schedule 05.05.2013
comment
Как вы добавили глобальные переменные jinja2? Я пробовал делать e=Environment, e.globals = {'get_locale':get_locale} - person 8oh8; 21.03.2017

В других ответах говорится, что вы должны реализовать функцию Babel get_locale() и что вы должны добавить ее в глобальные переменные Jinja2, но они не говорят, как это сделать. Итак, что я сделал:

Я реализовал функцию get_locale() следующим образом:

from flask import request, current_app

@babel.localeselector
def get_locale():
    try:
        return request.accept_languages.best_match(current_app.config['LANGUAGES'])
    except RuntimeError:  # Working outside of request context. E.g. a background task
        return current_app.config['BABEL_DEFAULT_LOCALE']

Затем я добавил следующую строку в определение Flask app:

app.jinja_env.globals['get_locale'] = get_locale

Теперь вы можете вызывать get_locale() из шаблонов.

person Caumons    schedule 11.09.2019

Вы несете ответственность за сохранение локали пользователя в вашем сеансе в базе данных. Flask-babel не будет делать это за вас, поэтому вам следует реализовать метод get_locale для flask-babel, чтобы иметь возможность найти локаль вашего пользователя.

Это пример get_locale из документации flask-babel:

from flask import g, request

@babel.localeselector
def get_locale():
    # if a user is logged in, use the locale from the user settings
    user = getattr(g, 'user', None)
    if user is not None:
        return user.locale
    # otherwise try to guess the language from the user accept
    # header the browser transmits.  We support de/fr/en in this
    # example.  The best match wins.
    return request.accept_languages.best_match(['de', 'fr', 'en'])
person MostafaR    schedule 05.05.2013
comment
Да, я реализовал такую ​​функцию get_locale, она возвращает локаль в зависимости от URL. Но как получить активную локаль запроса в шаблоне Jinja? - person aplavin; 05.05.2013