Вземете текущия локал в 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

Други отговори казват, че трябва да приложите функцията 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() от шаблоните.

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