vuetify vuejs vue tutorial plugin cli chrome awesome django django-models multilingual

django - vuejs - vue tutorial



Mejor práctica: Django multilenguaje (3)

Según su modelo actual y las tres posibilidades que describió, puede intentar lo siguiente para traducir la información de su modelo:

class Book(models.Model): language = models.CharField(max_length=2) created_at = models.DateTimeField(auto_now_add=True, editable=False) name = models.CharField(max_length=255, unique=True) plot = models.TextField() slug = models.SlugField(max_length=255, blank=True, default='''') class BookTranslation(models.Model): book = models.ForeignKey(Book, related_name="translations") language = models.CharField(max_length=2) created_at = models.DateTimeField(auto_now_add=True, editable=False) name = models.CharField(max_length=255, unique=True) plot = models.TextField() slug = models.SlugField(max_length=255, blank=True, default='''') class Chapter(models.Model): book = models.ForeignKey(Book) language = models.CharField(max_length=2) chapter = models.SmallIntegerField() title = models.CharField(max_length=255, blank=True) pages = models.SmallIntegerField() pub_date = models.DateTimeField(auto_now_add=True) class ChapterTranslation(models.Model): chapter = models.ForeignKey(Chapter, related_name="translations") title = models.CharField(max_length=255, blank=True) pages = models.SmallIntegerField()

Luego, en tus puntos de vista, puedes hacer algo como esto:

# Get user language, default ''en'' lang = request.session.get(''django_language'', ''en'') book = Book.objects.get(...) book_translation = book.translations.filter(language__exact=lang)[0] return render_to_response(..., { ''book'': book_translation })

Como Vladislav sugirió en su respuesta, echa un vistazo a todos los diferentes django-multilingual actualmente disponibles como una alternativa a lo que describí aquí.

En cuanto a la traducción del contenido estático de su sitio web, eso es bastante sencillo. Echa un vistazo a la internacionalización de Django .

soy un principiante con django. (Acabo de completar el tutorial y siguiendo esta guía http://www.gettingstartedwithdjango.com ) Quiero hacer un sitio con contenido multilingüe, y sabría cuál es la mejor práctica, al menos con los modelos:

  1. Use diferentes tablas (1 para cada idioma)
  2. Use solo una tabla, usando un atributo adicional en el modelo para el idioma
  3. no tengo idea

Vladislav está en lo correcto, todo depende de los datos que contiene la tabla. Entonces un ejemplo:

class Book(models.Model): created_at = models.DateTimeField(auto_now_add=True, editable=False) name = models.CharField(max_length=255, unique=True) plot = models.TextField() slug = models.SlugField(max_length=255, blank=True, default='''') class Chapter(models.Model): book = models.ForeignKey(Book) chapter = models.SmallIntegerField() title = models.CharField(max_length=255, blank=True) pages = models.SmallIntegerField() pub_date = models.DateTimeField(auto_now_add=True)

Posibilidades:

  1. Es posible que tenga un libro completo en todos los idiomas
  2. Es posible que tenga un libro completo en solo 1 idioma
  3. Es posible que tenga un libro completo en 1 idioma, pero solo algunos capítulos en otro idioma

Por lo tanto, creo que debo conservar una instancia de un libro para cada idioma, que tengo al menos un capítulo de ese libro.

¡Espero que esté claro! Gracias de nuevo a todos


Para mí, todo depende de los datos que contiene la tabla, no hay un tamaño único para todos.

Para las tablas del sistema (categorías, opciones de campo) hago una tabla de columnas diferentes para diferentes idiomas. Las implementaciones antiguas pero finas son django-transmeta.

Para tablas con muchas filas: tabla con información común y una tabla traducible. De esta forma, puede agregar idiomas sobre la marcha, lo cual es bueno para situaciones en las que desea brindar a los usuarios una gran variedad de idiomas. Aparentemente no estoy seguro de que haya una buena implementación de este enfoque. django-hvad es una implementación, pero sigue siendo beta y personalmente no me gusta usarla.

Aquí puede encontrar más información sobre los complementos disponibles.

Puedo sugerir los siguientes modelos.

class Book(models.Model): """Model for common book info""" created_at = models.DateTimeField(auto_now_add=True, editable=False) #Other common fields class BookTranslation(models.Model): """Model for translatable book info""" book = models.ForeignKey(Book, related_name="translations") language = models.CharField(max_length=2) name = models.CharField(max_length=255, unique=True) slug = models.SlugField(max_length=255, blank=True, default='''') plot = models.TextField() created_at = models.DateTimeField(auto_now_add=True, editable=False) class Chapter(models.Model): """Model for common chapter info""" pub_date = models.DateTimeField(auto_now_add=True) pages = models.SmallIntegerField() #I''ll suggest such relation so you can get the chapters from book #and book translation objects #related_name=''+'' means no related_name #You need to specify it when you have 2 FK to same model book = models.ForeignKey(Book, related_name=''+'') book_translation = models.ForeignKey(Book, related_name=''chapters'') class ChapterTranslation(models.Model): """Model for translatable chapter info""" chapter = models.ForeignKey(Chapter, related_name="translations") language = models.CharField(max_length=2) title = models.CharField(max_length=255, blank=True)

En este caso, es bueno que te familiarices con los relacionados con los selectos y los relacionados con el prefetch

En cualquier caso, debe crear una abstracción en la parte superior para que sea cómodo trabajar con la estructura.


Si no desea administrar cada modelo manualmente, puede intentar algo como django-linguo. Crea las traducciones para los campos que le gustan en función de su atributo de traducción de la clase Meta y en su configuración de IDIOMAS en su archivo settings.py.

Recomiendo consultar algunos de los paquetes de internacionalización disponibles para Django como django-rosetta y django-linguo . Django-linguo ayuda a traducir el contenido del modelo, mientras que django-rosetta parece que agrega una interfaz de administrador para sus traducciones.

Todavía no jugué realmente con django-rosetta pero también parece interesante. Espero que esto ayude :)