如何使用 Flask + Babel 选择语言?
How can I choose the language, using Flask + 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'
}
但是我也想添加一个按钮,比如Switch language to English
。实现它的最佳实践是什么?
这是我遇到的解决方案:
首先设置一个路由来处理语言更改并将所选语言存储在会话中:
@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'
}
希望对您有所帮助!
现在我正在开发一个项目,它应该支持两种语言:英语(默认)和俄语。这很容易做到,使用 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'
}
但是我也想添加一个按钮,比如Switch language to English
。实现它的最佳实践是什么?
这是我遇到的解决方案:
首先设置一个路由来处理语言更改并将所选语言存储在会话中:
@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'
}
希望对您有所帮助!