2017-02-22 69 views
1

现在我正在开发一个项目,它应该支持两种语言:英语,默认和俄语。这是很容易做到的,使用HTTP_ACCEPT_LANGUAGE头,代码波纹管:如何使用Flask + Babel选择语言?

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。实现它的最佳实践是什么?

回答

3

这是我碰到的解决方案:

首先你要定义将处理语言的变化,并且将所选择的语言存储在会话路由:

@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,S啊,你可以把它注射:

@app.context_processor 
    def inject_conf_var(): 
     return dict(
        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 %} 

希望这有助于!