urls tutorial template examples example python django localization internationalization

python - tutorial - django views



Cómo localizar el contenido de una aplicación de Django (9)

Hola, actualmente estoy trabajando en una aplicación django para mis estudios, y llegué al punto de l18n. La localización del sitio en sí fue muy fácil, pero ahora tengo que permitir que los usuarios traduzcan el contenido dinámico de la aplicación. Los usuarios pueden guardar "productos" en la base de datos y darles nombres y descripciones, pero dado que todo el sitio debe estar localizado, debo proporcionar una forma de traducir estos nombres y descripciones a los usuarios.

¿Hay alguna forma natural en django de hacer esto? ¿O debo realizarlo como parte de la aplicación (representando las traducciones en el modelo de datos)?

Gracias, Janosch


Depende de quién proporcionará las traducciones. Si desea proporcionar una interfaz web para la traducción, debe desarrollarla usted mismo y también representar las traducciones en la base de datos.

Si los mismos traductores que tradujeron el sitio también traducirán los datos, puede proporcionarles el mismo modelo que usan para el sitio (presumiblemente gettext), y luego también puede usar gettext para este contenido.


"Debo proporcionar una forma de traducir estos nombres y descripciones a los usuarios".

"¿Hay alguna forma natural en django de hacer esto?"

¿Estás preguntando si Django puede traducir de un idioma a otro? ¿Estás preguntando algo como http://translate.google.com/ ?

No creo que Django pueda traducir la entrada del usuario a otro idioma.

Si va a hacer la traducción para sus usuarios, esto debe ser parte de su modelo de datos.

El filtro i18n de Django le permite tener una tabla de cadenas de traducción. La documentación dice esto.

  1. Incruste cadenas de traducción en su código y plantillas de Python.
  2. Obtenga traducciones para esas cadenas, en los idiomas que desee. Esto es algo que hace manualmente, contratando traductores o conociendo muchos idiomas usted mismo.
  3. Active el middleware de configuración regional en la configuración de Django.


Sugiero revisar django-multilingual . Es una aplicación de terceros que le permite definir campos de traducción en sus modelos.

Por supuesto, todavía tiene que escribir las traducciones reales, pero se almacenan de forma transparente en la base de datos (en lugar de en los archivos PO estáticos), que es lo que creo que está preguntando.



También busca el complemento de localización de contenido o cómo escribirlo. Puede agregar a la lista django-i18n-model


Creo que deberías operar en dos pasos:

  1. Obtener traducciones
  2. Mostrar cadenas traducidas

Para el primer paso, debe decirle a Django que las cadenas insertadas por el usuario deben traducirse. Creo que no hay una forma nativa de hacerlo. Tal vez puedas extraer las cadenas de tu archivo db poniéndolas en archivos específicos de la configuración regional, ejecutar ''makemessages'' en ellos, obtener archivos django.po y traducir.

Segundo, use ugettext para mostrar esas cadenas en su aplicación web.

Espero que esto pueda ayudar a los que tienen su mismo problema.


O prueba esto:

http://packages.python.org/django-easymode/i18n/index.html

Se mantiene muy cerca de la forma en que normalmente harías un modelo django, solo debes agregar 1 decorador por encima de tu modelo. Tiene soporte administrativo para los campos traducidos, incluidas líneas y líneas genéricas. Casi todo lo que puede hacer con modelos regulares y clases de administración puede hacerlo con las versiones internacionalizadas.


Tengo 2 idiomas en mi sitio: inglés y árabe. Los usuarios pueden alternar entre idiomas haciendo clic en una bandera. En los modelos, uso un modelo proxy:

class Product(models.Model): name=models.CharField(max_length=100) name_ar=models.CharField(max_length=100, default='''') def __unicode__(self): return self.name class Product_ar(Product): def __unicode__(self): return self.name_ar class Meta: proxy=True

En formularios, uso 2 formularios en lugar de uno:

class CollectionEditForm_en(forms.Form): name = forms.CharField(label=_(''Name''), max_length=100, widget=forms.TextInput(attrs={''size'':''50''})) product = forms.ModelChoiceField(label=_(''product''), queryset=Product.objects.filter(enabled=True), empty_label=None) class CollectionEditForm_ar(forms.Form): name = forms.CharField(label=_(''Name''), max_length=100, widget=forms.TextInput(attrs={''size'':''50''})) product = forms.ModelChoiceField(label=_(''product''), queryset=Product_ar.objects.filter(enabled=True), empty_label=None)

En el lenguaje de verificación de código de esta manera:

if request.LANGUAGE_CODE==''ar'': CollectionEditForm=CollectionEditForm_ar else: CollectionEditForm=CollectionEditForm_en

Entonces, en las plantillas, compruebo:

{% if LANGUAGE_CODE == "ar" %} <a href="/product/{{product.alias}}/">{{product.name_ar}}</a> {% else %} <a href="/product/{{product.alias}}/">{{product.name}}</a> {% endif %}

Espero que esta solución ayude a alguien