¿Cómo puedo elegir el idioma, usando Flask + Babel?

Ahora estoy desarrollando un proyecto, que debería admitir dos idiomas: inglés, por defecto, y ruso. Es bastante fácil de hacer, usando el encabezado HTTP_ACCEPT_LANGUAGE , el código es el siguiente:

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

Los idiomas están codificados en el archivo de configuración de la aplicación:

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

Pero también quiero agregar un botón, como Switch language to English . ¿Cuál es la mejor práctica para realizarlo?

Esta es la solución que encontré:

Primero, establezca una ruta que maneje el cambio de idioma y almacene el idioma seleccionado en la sesión:

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

En segundo lugar, debe modificar un poco el código para obtener el idioma seleccionado de la sesión:

 @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()) 

También debe poder acceder al CURRENT_LANGUAGE desde las plantillas, para poder inyectarlo:

 @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()))) 

Finalmente, en la plantilla puedes elegir el idioma que quieras:

 {% for language in AVAILABLE_LANGUAGES.items() %} {% if CURRENT_LANGUAGE == language[0] %} {{ language[1] }} {% else %} {{ language[1] }} {% endif %} {% endfor %} 

La aplicación config.py incluye la siguiente constante:

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

¡Espero que esto ayude!