现在,我正在开发一个项目,该项目应支持两种语言:默认为英语和俄语。使用HTTP_ACCEPT_LANGUAGE标头很容易做到,代码如下:
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。实现它的最佳实践是什么?
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' }
希望这可以帮助!