2013-03-31 28 views
9

Sono un principiante con Django. (Ho appena completato il tutorial e seguendo questa guida http://www.gettingstartedwithdjango.com) Voglio fare un sito con contenuti multilingue, e vorrei sapere quale è la migliore pratica, almeno con i modelli:Best practice: Django multilingua

  1. Utilizzare le tabelle differenti (1 per ogni lingua)
  2. utilizzare un solo tavolo, utilizzando un attributo aggiuntivo nel modello per la lingua
  3. ho idea

Vladislav è nel giusto, tutto dipende dai dati della tabella è di contenimento. Così un esempio:

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) 

Possibilità:

  1. I possono avere un libro completo in tutte le lingue
  2. io possa avere un libro completo in appena 1 lingua
  3. io possa avere un libro completo in 1 lingua, ma solo alcuni capitoli in un'altra lingua

Quindi penso che devo tenere un'istanza di un libro per e un linguaggio che ho almeno un capitolo di quel libro.

Spero che sia chiaro! Grazie ancora a tutti voi

+1

Penso che stai cercando [internazionalizzazione in Django] (https://docs.djangoproject.com/en/1.4/topics/i18n/) – DMunoz

+0

Un libro meraviglioso sulle migliori pratiche https://django.2scoops.org/ – Jake

+0

Ho sentito parlare molto di quel libro, penso che lo comprerò domani, grazie per il suggerimento! – Jiloc

risposta

6

Per me, tutto dipende dai dati contenuti nella tabella. Non esiste una taglia adatta a tutti.

Per le tabelle di sistema (categorie, campi disponibili) faccio una tabella con colonne diverse per lingue diverse. Le vecchie ma fini implementazioni sono django-transmeta.

Per le tabelle con un numero elevato di righe: tabella con informazioni comuni e una tabella per quelle traducibili. In questo modo è possibile aggiungere lingue al volo, utile quando si desidera offrire agli utenti un'ampia scelta di lingue. Apparentemente non sono sicuro che ci sia una buona implementazione di questo approccio. django-hvad è un'implementazione ma è ancora beta e personalmente non mi piace usarlo.

Here è possibile trovare ulteriori informazioni sui plugin disponibili.

Posso suggerire i seguenti modelli.

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) 

In questo caso è bene che si ottiene familiarità con select-related e prefetch-related

In ogni caso è necessario costruire un'astrazione in cima quindi sarà comodo per lavorare con la struttura.

+0

Grazie per l'aiuto, spero che tu possa aiutarmi un po 'di più ora che ho spiegato in modo più specifico! – Jiloc

+0

Puoi trovare il mio suggerimento per i modelli nella risposta modificata. –

3

In base al modello attuale e le tre possibilità hai descritto, si potrebbe provare il seguente di tradurre le informazioni di modello:

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() 

Poi, nel vostro punto di vista si può fare qualcosa di simile:

# 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 
}) 

Come ha suggerito Vladislav nella sua risposta, controlla tutti i diversi django multilingue attualmente disponibili come alternativa a ciò che ho descritto qui.

Per quanto riguarda la traduzione del contenuto statico del tuo sito web, è piuttosto semplice. Controlla Django Internationalization.

1

Se non si desidera gestire manualmente ciascun modello, è possibile provare qualcosa come django-linguo. Crea le traduzioni per i campi che ti piacciono in base al tuo attributo Meta class translate e all'impostazione LANGUAGES nel tuo file settings.py.

Consiglio vivamente di verificare alcuni dei pacchetti di internazionalizzazione disponibili per Django come django-rosetta e django-linguo. Django-linguo aiuta a tradurre il contenuto del modello, mentre django-rosetta sembra aggiungere un'interfaccia di amministrazione per le tue traduzioni.

Non ho ancora suonato con django-rosetta ma sembra anche interessante. Spero che questo aiuti :)

+0

Penso che controllerò quelle librerie di terze parti e darò un rapporto qui per tutti voi. – AmiNadimi