Selector de idioma con web2py

Una de las características más interesantes y potentes en web2py es sin duda su motor de internacionalización (i18n) a través del objeto T.

Vista previa

Por defecto, web2py determina el idioma que debe desplegar para el usuario en base al contenido de Accept-Language en la cabecera HTTP, que es establecido por el navegador según la configuración del mismo o del idioma del sistema operativo. Al momento de desarrollar aplicaciones web, probablemente se querrá dar la posibilidad al usuario de seleccionar el idioma que se le antoje independientemente de la configuración en su navegador, por lo que web2py provee la función T.force para, justamente, forzar al motor de internacionalización a emplear un idioma determinado.

El siguiente código provee un selector de idioma para cualquier sitio que utilice web2py. Fue extraído de la aplicación administrativa (admin) que se instala junto al framework para administrar las distintas aplicaciones, con algunas modificaciones.

El código

El selector opera utilizando una cookie que almacena el idioma seleccionado. Por lo tanto, empezamos por crear una función de JavaScript capaz de realizar lo anteriormente comentado.

function switchLanguage(lang)
{
    var date = new Date();
    cookieDate = date.setTime(date.getTime() + (100*24*60*60*1000));
    document.cookie = "rplang=" + lang + "; expires=" + cookieDate + "; path=/";
    window.location.reload();
}

Esta función crea una cookie con el nombre «rplang» (puede cambiarse por cualquier otro) y recarga la página.

Ahora bien, en alguna vista de nuestra aplicación, incluimos el siguiente selector HTML.

<select onchange="switchLanguage(this.options[this.selectedIndex].id)">
    {{for langinfo in sorted([(code,info[1]) for code,info in T.get_possible_languages_info().iteritems() if code != 'default']):}}
        <option {{=T.accepted_language==langinfo[0] and 'selected' or ''}} {{='id='+langinfo[0]}} >{{=langinfo[1]}}</option>
    {{pass}}
</select>

Se trata de emplear la función T.get_possible_languages_info para obtener una lista de todos los idiomas disponibles. Cuando uno es seleccionado, se invoca a la función de JavaScript switchLanguage.

Por último, en algún modelo debe utilizarse el siguiente código encargado de leer el idioma de la cookie y llamar a la función T.force.

if "rplang" in request.cookies and not (request.cookies["rplang"] is None):
    T.force(request.cookies["rplang"].value)

Si se quiere especificar un idioma por defecto cuando aún no se ha seleccionado ninguno (es decir, la cookie «rplang» no ha sido establecida), puede añadirse debajo del código anterior:

else:
    T.force("es")  # Español por defecto.

Aplicación de ejemplo

La aplicación de ejemplo simplemente desplegará el selector de idioma y el mensaje «Hello, world!» al cual le proveeremos su traducción al castellano correspondiente.

Comenzamos por crear una aplicación en el administrador de web2py.

Nueva aplicación

Luego, abrimos el archivo [nombre aplicación]/views/default/index.html, borramos el contenido y en su lugar ingresamos lo siguiente.

<script>
    function switchLanguage(lang)
    {
        var date = new Date();
        cookieDate = date.setTime(date.getTime() + (100*24*60*60*1000));
        document.cookie = "rplang=" + lang + "; expires=" + cookieDate + "; path=/";
        window.location.reload();
    }
</script>
<select onchange="switchLanguage(this.options[this.selectedIndex].id)">
    {{for langinfo in sorted([(code,info[1]) for code,info in T.get_possible_languages_info().iteritems() if code != 'default']):}}
        <option {{=T.accepted_language==langinfo[0] and 'selected' or ''}} {{='id='+langinfo[0]}} >{{=langinfo[1]}}</option>
    {{pass}}
</select>
<br /><br />
{{=T("Hello, world!")}}

(Al utilizar este código en una aplicación real, probablemente querrás ubicar la función switchLanguage por separado en un archivo de JavaScript para acelerar la carga del sitio.)

En el modelo [nombre aplicación]/models/db.py, al final de todo, ingresamos el código anterior encargado de forzar el idioma en base al valor de la cookie.

if "rplang" in request.cookies and not (request.cookies["rplang"] is None):
    T.force(request.cookies["rplang"].value)

Por último, en el administrador de web2py, nos dirigimos a editar nuestra recientemente creada aplicación (Gestionar > Editar), y en la sección de lenguajes editamos el archivo es.py para proveer la traducción al castellano de nuestro mensaje inicial («Hello, world!»).

Vista previa

Una vez hecho esto, nuestro sitio ya está en condiciones de mostrar el mensaje adecuado en base al idioma seleccionado.

Vista previa

Vista previa

Si no se ha especificado una traducción para el mensaje en el idioma seleccionado (por ejemplo, Francés), se mostrará el texto original.

Puedes descargar esta aplicación e instalarla desde el administrador de web2py desde este enlace.

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

Deja una respuesta