python - 如何使用 Flask + Babel 选择语言?

标签 python flask multilingual python-babel

现在我正在开发一个项目,它应该支持两种语言:默认的英语和俄语。这很容易做到,使用 HTTP_ACCEPT_LANGUAGE header ,代码如下:

babel = Babel(app)

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

语言在应用程序配置文件中被硬编码:

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

但我还想添加一个按钮,例如将语言切换为英语。实现它的最佳实践是什么?

最佳答案

这是我遇到的解决方案:

首先,您设置一个路由来处理语言更改并将所选语言存储在 session 中:

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

其次,您必须稍微修改您必须从 session 中获取所选语言的代码:

@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,以便您可以注入(inject)它:

@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 %}

Application config.py 包含以下常量:

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

希望这对您有所帮助!

关于python - 如何使用 Flask + Babel 选择语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42393831/

相关文章:

php - 如何使用 WPGlobus 获取语言

python - 在 Python 中合并填充的行单元格并忽略空单元格

python - 有条件 dropna() Pandas

python - 使用调试运行 flask 时启动线程

python - Bcrypt Hash 返回 TypeError ("Unicode-objects must be encoded before hashing") 和 Invalid Salt

c# - 制作多语言用户控件

python - 为什么三元运算符比 .get 更快?

python - 如何将具有相同索引的多行组合在一起,并且每一行在pandas中只有一个真实值?

javascript - 在 React 中刷新后保留 'loggedIn' 状态

c++ - FlatBuffers 的多语言集成问题