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!