На моем сайте используйте Flask + Jinja2 и Flask-Babel для перевода. На сайте есть два языка (в зависимости от URL-адреса), и я хотел бы добавить ссылку для переключения между ними. Чтобы сделать это правильно, мне нужно получить название текущей локали, но я не нашел такой функции в документации. Он вообще существует?
Получить текущую локаль в Jinja2
Ответы (3)
Наконец, я использовал это решение: добавить функцию get_locale
, которая должна быть определена в любом случае, в глобальные переменные Jinja2, а затем вызвать ее в шаблоне, как и любую другую функцию.
В других ответах говорится, что вы должны реализовать функцию 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()
из шаблонов.
Вы несете ответственность за сохранение локали пользователя в вашем сеансе в базе данных. 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'])