Desde Yaco nos traen las aplicaciones pluggables django-inlinetrans y django-inplaceedit que permiten editar traducciones de templates y objetos de nuestros modelos desde el frontend de nuestro proyecto.
Una vez instalada en nuestro proyecto, django-inlinetrans nos permitirá realizar traducciones inline. Para ello basta con reemplazar los tags de traducción de nuestras plantillas:
{% trans "Hola" %}
por el templatetag itrans:
{% itrans "Hola" %}
De esta forma podremos editar las traducciones de nuestras plantillas directamente desde el frontend de nuestro proyecto.
Por su parte django-inplaceedit nos permitirá editar los campos de nuestros modelos reemplazando sus ocurrencias en nuestras plantillas por el tag inplace_edit. Por ejemplo:
{{ content.description|safe }}
Tendría que ser reemplazado por:
{% inplace_edit "content.description|safe" %}
django-inplaceedit no sólo nos permite editar campos de texto si no que también soporta la edición de choices, campos booleanos, campos de fecha ó fecha y hora, foreingkeys, relaciones many-to-many, campos de archivo y de imagen, todo ello in-place desde el frontend de nuestro proyecto.
Ambas aplicaciones se pueden ver en acción en el siguiente vídeo:
Publicado por Antonio Melé el Miércoles 11 d Enero d 2012 | 5 comentarios | Categorías: aplicaciones, internacionalización, modelos, pluggables
django-transmeta es una aplicación reusable que nos permite añadir traducciones a los campos de nuestros modelos. Es muy fácil de utilizar ya que crea automáticamente un campo en la base de datos por cada atributo traducible y cada idioma de nuestro setting LANGUAGES.
Así, si tenemos un campo llamado nombre y nuestro setting LANGUAGES son inglés y español django-transmeta creará los campos nombre_es, nombre_en en la base de datos y al acceder directamente a atributo nombre obtendremos la traducción correspondiente al idioma que esté activo en la petición.
Para usar django-transmeta tenemos que añadir un atributo __metaclass__ a los modelos que tengan campos con traducciones y en la clase Meta del modelo añadiremos el atributo translate en el que tendremos que incluir la lista de campos que permiten ser traducidos. Valga como ejemplo el siguiente modelo en el que los campos con traducción serán description y body:
from transmeta import TransMeta
class Book(models.Model):
__metaclass__ = TransMeta
title = models.CharField(max_length=200)
description = models.TextField()
body = models.TextField(default='')
price = models.FloatField()
class Meta:
translate = ('description', 'body', )
Al añadir nuevos idiomas o marcar nuevos campos como traducibles django-transmeta se ocupa de detectar qué tablas faltan en la base de datos para crearlas. Para ello basta utilizar el siguiente comando tras haber modificado cualquier modelo:
./manage.py sync_transmeta_db
Otra ventaja es que django-transmeta muestra todos los campos de idiomas en el sitio de administración de Django de forma transparente, permitiendo editar todos los idiomas desde el Admin.
Publicado por Antonio Melé el Lunes 14 d Febrero d 2011 | 8 comentarios | Categorías: aplicaciones, internacionalización, modelos, pluggables
Django incluye la aplicación django.contrib.localflavor que agrupa campos de formulario y widgets específicos para distintos países. Vamos a ver lo que podemos hacer con el "local flavor" para España.
Podemos utilizar el campo es.forms.ESIdentityCardNumberField para validar la entrada comprobando si se trata de un NIF (españoles), NIE (extranjeros) o CIF (empresas) válido.
El campo es.forms.ESCCCField permite validar si la entrada es un número de cuenta bancaria verificando que se trata de un Código Cuenta Cliente correcto. El formato debe ser EEEE-OOOO-CC-AAAAAAAAAA siendo E, O, C y A los dígitos de entidad bancaria, número de oficina, código de control y número de cuenta. El delimitador entre los dígitos puede ser un guión, un espacio o puede no usarse delimitador alguno.
El campo es.forms.ESPhoneNumberField permite validar números de teléfono españoles. Los números deben de tener 9 cifras siendo la primera de ellas 6, 8 ó 9.
El campo es.forms.ESPostalCodeField permite validar códigos postales de España. Los códigos deben de tener 5 cifras, las primeras dos representan el número de provincia y deben estar entre 01 y 52.
Además de los campos de formularios también se incluyen dos widgets que permiten seleccionar provincias y regiones de España en formularios.
El widget es.forms.ESProvinceSelect consiste en un elemento select con todas las provincias de España.
El widget es.forms.ESRegionSelect consiste en un elemento select con todas las comunidades autónomas.
Vamos a ver cómo crear un sencillo formulario en el que usuario tenga que introducir su nombre, su NIF/NIE/CIF, un número de teléfono, una provincia, un código postal y una cuenta bancaria:
from django import forms
from django.contrib.localflavor.es.forms import *
class Formulario(forms.Form):
nombre = forms.CharField(max_length=80)
nif = ESIdentityCardNumberField()
tel = ESPhoneNumberField()
provincia = forms.SelectField(widget=EsProvinceSelect())
codigo_postal = ESPostalCodeField()
cuenta = ESCCCField()
Publicado por Antonio Melé el Viernes 9 d Julio d 2010 | 2 comentarios | Categorías: forms, internacionalización
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 Viernes 20 d Marzo d 2009 | 3 comentarios | Categorías: internacionalización, snippets, traducciones, trucos
Suscríbete a nuestro feed RSS y al feed de la comunidad para estar al tanto de todo lo que ocurre entorno a Django.
Tú también puedes escribir en éste blog. Para hacerlo basta con que nos digas sobre qué quieres escribir un artículo relacionado con Django.
Utilizar un formulario para modificar 2 modelos
Descubriendo objetos similares por sus etiquetas