Django es el entorno de desarrollo web para perfeccionistas con límites de tiempo

Entradas sobre "internacionalización":

Snippet de vista para i18n

Una de las cosas que nos ofrece Django es vistas genéricas y soporte para localización (aka i10n) e internacionalización (aka i18n). Entonces una vez tenemos nuestro sitio con i18n o i10n pues lo que sigue es que le demos a nuestros usuarios la manera de escoger su idioma, Django tiene un algoritmo par esto, sin embargo en algún punto nuestros usuarios querrán poder escoger su idioma preferido, para esto este framework nos da la opcion de una vista generica, sobre la cual encontraréis información en http://docs.djangoproject.com/en/dev/topics/i18n/#the-set-language-redirect-view.

Lo único es que esta vista espera que haya un formulario para que el usuario escoja su idioma y además que tengamos predefinida una página a la cual el usuario será redirigido después de seleccionar el idioma a lo cual le veo particularmente un inconveniente, pues si el usuario ha llegado a un punto importante para él y es llevado a la página inicial no le agradará (en mi caso me molestaría). Además, ¿y si queremos tener la posibilidad de hacerlo desde una url y no una variable por post?

Para resolver este conflicto se modifica un poco la vista que nos trae Django y la dejamos así:

def set_lang(request,lang):
   response = HttpResponseRedirect(request.META['HTTP_REFERER'])
   lang_code = u'%s' % lang
   if lang_code and check_for_language(lang_code):
      if hasattr(request, 'session'):
         request.session['django_language'] = lang_code
      else:
         response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
return response

Esta vista espera que se escoja el idioma por una url y además redireccionará al usuario a la página en la que se encontraba, podemos hacerlo incluso en el urls.py y finalmente escogemos la url:

urlpatterns = patterns('',
   ...
   (r'^set_lang/(?P<lang>\w{2})/$',set_lang),
   ...
)

De esta manera si se va a /set_lang/es/ Django cargará todo nuestro sitio en español y volvera a la vista en la que lo hayamos hecho.

Publicado por Diego Andrés el Friday 20 de March de 2009 | 2 comentarios | Categorías: internacionalización, snippets, traducciones, trucos

Slughifi: slugs a prueba de caracteres internacionales

Slughifi es un código que mejora las características de la función slugify de django.template.defaultfilters. Soporta muchos más caracteres internacionales con todo tipo de acentuación. Mientras que slugify elimina todos estos caracteres al generar el slug, slughifi los reemplaza por caracteres no acentuados haciendo honor a su nombre al proporcionar slugs altamente fieles a la cadena sobre la que se aplica. Fue presentado hace bastante tiempo en este hilo de la lista de correo django-users y dí con él por casualidad. Desde entonces no he dejado de utilizarlo en mis proyectos. Slughifi parece no estar disponible en la página original en la que se encontraba. Sin embargo sí lo está en el trac de django-fr y también lo podéis bajar directamente desde aquí.

Usar slughifi es realmente sencillo. Basta con hacer un import y usar la función:

from slughifi import slughifi

a = slughifi('Esta es la página web de Django en español')
# a tomará el valor 'esta-es-la-pagina-web-de-django-en-espanol'

Publicado por Antonio Melé el Tuesday 10 de March de 2009 | 4 comentarios | Categorías: aplicaciones, descargas, internacionalización, snippets

Idiomas en nuestras URLs gracias a django-localeurl

django-localeurl es una aplicación que permite el uso de códigos de idiomas en las URLs de nuestro proyecto. Esto trae la ventaja de que cada página en cada idioma tiene una URL propia. Gracias a ello los buscadores indexan cada página en los distintos idiomas disponibles y nuestros usuarios pueden compartir las URLs de una página en el idioma que deseen. Además funciona a la perfección con el LocaleMiddleware que viene con Django y que sirve para hacer la "negociación" para descubrir el idioma del usuario en función de si ya ha seleccionado un idioma previamente, si por el contrario debe utilizar el idioma de su navegador o como último recurso el idioma por defecto de nuestro proyecto.

django-localeurl nos permitirá cambiar nuestras URLs de http://mi-proyecto.com/noticias a URLs del tipo http://mi-proyecto.com/es/noticias, http://mi-proyecto.com/de/noticias, etc. No hará falta cambiar nada en nuestra URLconf para hacerlo funcionar.

Instalar django-localeurl

  1. Descargamos el paquete localeurl del sitio oficial a nuestro path de Python.

  2. Añadimos 'localeurl.middleware.LocaleURLMiddleware' al setting MIDDLEWARE_CLASSES por encima de 'django.middleware.common.CommonMiddleware'.

    Importante: También deberemos situarlo por debajo de 'django.middleware.locale.LocaleMiddleware' en caso de que utilicemos LocaleMiddleware, para que éste pueda realizar la negociación de selección de idioma previamente.

  3. Añadimos 'localeurl' a nuestras aplicaciones instaladas (setting INSTALLED_APPS).

  4. Nos aseguramos de que el valor del setting LANGUAGE_CODE esté en el setting LANGUAGES que contiene la lista de lenguajes disponibles para nuestro proyecto. Podemos visualizar la lista de lenguajes por defecto en el código fuente de django.conf.global_settings.

Configurar django-localeurl

Existen 3 settings que nos permiten personalizar el funcionamiento de django-localeurl: LOCALE_INDEPENDENT_PATHS, REDIRECT_LOCALE_INDEPENDENT_PATHS y PREFIX_DEFAULT_LANGUAGE.

LOCALE_INDEPENDENT_PATHS

Nos permite especificar para qué URLs no deseamos que se añada el código de lenguaje. Deberemos añadirlas como expresiones regulares. Un ejemplo:

import re
LOCALE_INDEPENDENT_PATHS = (
    re.compile('^/aviso-legal/'),
    re.compile('^/privacidad/'),
)

REDIRECT_LOCALE_INDEPENDENT_PATHS

Por defecto es False. Nos permite especificar si al acceder incluyendo un código de lenguaje a alguna de las URLs especificadas en REDIRECT_LOCALE_INDEPENDENT_PATHS se debe redirigir a la misma sin código de lenguaje. Por ejemplo si al acceder a /de/privacidad/ se debe redirigir a /privacidad/.

PREFIX_DEFAULT_LANGUAGE

Por defecto es True. Nos permite especificar si para el lenguaje por defecto se añade el código de idioma a la URL. Por ejemplo, si nuestro idioma por defecto es el español (LANGUAGE_CODE = 'es') y PREFIX_DEFAULT_LANGUAGE es True, la URL /noticias/ cargará directamente la vista apropiada y /noticias/es/ será redirigida a /noticias/.

Uso en plantillas

Cualquier aplicación que utilice etiquetas {% url %} para las URLs en sus plantillas funcionará correctamente con django-localeurl. A parte de esto django-localeurl incluye un template tag y 2 filtros que nos aportan flexibilidad a la hora de utilizar URLs en nuestras plantillas.

Para hacerlos funcionar debemos cargarlos con load en las plantillas en las que queramos trabajar con ellos:

{% load localeurl_tags %}

El tag {% locale_url %} funciona del mismo modo que el concido {% url %} pero permitiéndonos especificar el idioma que debe utilizarse en la URL. Nos sirve para enlaces que por algún motivo queramos mostrar en un idioma concreto. Para ello si tenemos algo como:

<a href="{% url ver-articulo articulo.id %}">Ver artículo</a>

Para que el enlace apunte a un idioma concreto es tan sencillo como utilizar:

<a href="{% locale_url "en" ver-articulo articulo.id %}">Ver artículo en inglés</a>

Los filtros incluídos son chlocale y rmlocale. chlocale nos permite añadir o cambiar el código de lenguaje de una URL y rmlocale eliminar el código de lenguaje de una URL. Un ejemplo de uso:

<p>Haz <a href="{{ mi_url|chlocale:"de" }}">click aquí</a> para cambiar a alemán.</p>
<p>La url {{ otra_url }} sin código de lenguaje es {{ otra_url|rmlocale }}</p>

Publicado por Antonio Melé el Tuesday 30 de December de 2008 | 0 comentarios | Categorías: aplicaciones, internacionalización, plantillas, urls

Traduce tus proyectos Django con Rosetta

django-rosetta es una aplicación que facilita enormemente el proceso de traducción de tus proyectos y aplicaciones que utilizan internacionalización. La aplicación ofrece un interfaz muy similar al sistema de administración de Django (de hecho hace uso de sus css). Permite visualizar todos los catálogos de traducción, porcentaje de términos traducidos, etc. y realizar traducciones de un modo realmente cómodo. Para cada término de traducción muestra un enlace para sugerir la traducción adecuada que funciona gracias a la AJAX Language API de Google y que nos ahorra mucho tiempo. django-rosetta busca todos los archivos .po de tu proyecto en los siguientes directorios:

  • /proyecto/locale/ para el proyecto en el que está instalada
  • /proyecto/app/locale/ para todas las aplicaciones en el setting INSTALLED_APPS
  • Todos los directotios definidos en el setting LOCALE_PATHS. Por lo que también podrás traducir archivos .po que no tengan nada que ver con tus proyectos.

Nota: Si añades directorios a LOCALE_PATHS recuerda escribirlos con el formato 'mi/directorio/locale' sin la barra / al final ya que django-rosetta la añade automáticamente.

screenshot django-rosetta funcionando en una aplicación Django

Añadir django-rosetta a nuestro proyecto

Incluir django-rosetta en nuestro proyecto es realmente sencillo. Una vez descargada en cualquier parte de nuestro python path añadimos 'rosetta' a nuestras INSTALLED_APPS y a continuación incluimos la entrada de la URL base para la aplicación en la URLconf de nuestro proyecto:

urlpatterns = patterns('',
    # ...
    url(r'^rosetta/', include('rosetta.urls')),
    # ...
)

Ya tenemos django-rosetta funcionando.

Traducir con django-rosetta

Por defecto django-rosetta permite acceder al sistema de traducción a los usuarios que son administradores. Para permitir que otros usuarios puedan realizar las traducciones crea el grupo 'translators' y añádelos al mismo.

Para que django-rosetta pueda guardar los cambios realizados en los catálogos de traducción (archivos .po) necesita que el servidor web tenga permisos de escritura en esos archivos. De no tenerlos django-rosetta permite descargar el catálogo editado para no perder las traducciones realizadas. Para cualquier tema referente a internacionalización echa un vistazo a la documentación oficial.

Publicado por Antonio Melé el Wednesday 3 de December de 2008 | 2 comentarios | Categorías: internacionalización, pluggables