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