Как я могу выбрать язык, используя Flask + Babel?

Сейчас разрабатываю проект, который должен поддерживать два языка: английский по умолчанию и русский. Это довольно легко сделать, используя заголовок HTTP_ACCEPT_LANGUAGE, код ниже:

babel = Babel(app)

@babel.localeselector
def get_locale():
    return request.accept_languages.best_match(app.config["LANGUAGES"].keys())

Языки жестко прописаны в конфигурационном файле приложения:

LANGUAGES = {
    'en': 'English',
    'ru': 'Russian'
}

Но я также хочу добавить кнопку, например Switch language to English. Как лучше всего реализовать это?


person Sergey Potekhin    schedule 22.02.2017    source источник


Ответы (1)


Это решение, с которым я столкнулся:

Сначала вы устанавливаете маршрут, который будет обрабатывать изменение языка и сохранит выбранный язык в сеансе:

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

Во-вторых, вам нужно немного изменить код, чтобы получить выбранный язык из сеанса:

@babel.localeselector
def get_locale():
    # if the user has set up the language manually it will be stored in the session,
    # so we use the locale from the user settings
    try:
        language = session['language']
    except KeyError:
        language = None
    if language is not None:
        return language
    return request.accept_languages.best_match(app.config['LANGUAGES'].keys())

Вы также должны иметь доступ к CURRENT_LANGUAGE из шаблонов, чтобы вы могли внедрить его:

@app.context_processor
    def inject_conf_var():
        return dict(
                    AVAILABLE_LANGUAGES=app.config['LANGUAGES'],
                    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 %}

config.py приложения включает следующую константу:

LANGUAGES = {
  'en': 'English',
  'es': 'Spanish'
}

Надеюсь это поможет!

person René Fernández    schedule 22.02.2017
comment
Где вы создали AVAILABLE_LANGUAGES? Вы имеете в виду только ЯЗЫКИ? - person Salviati; 27.07.2018
comment
Кроме того, я обнаружил, что конфигурация приложения должна обновляться при изменении языка приложения по умолчанию. Язык по умолчанию будет автоматически установлен после запуска приложения и будет сохранен в кеше. - person JunKim; 19.09.2018
comment
Привет! Я только что добавил дополнительные сведения о константах LANGUAGES и AVAILABLE_LANGUAGES. Проверьте части inject_conf_var и config.py. Ваше здоровье. - person René Fernández; 21.09.2018