django-Transmeta è un app Django per i contenuti traducibili in modelli di Django. & Nbsp; Ogni lingua è memorizzata e gestita automaticamente in una colonna diversa a livello di database.
Utilizzo Transmeta strong>
Creazione di modelli traducibili
Guardate questo modello:
classe Book (models.Model):
& Nbsp; title = models.CharField (max_length = 200)
& Nbsp; description = models.TextField ()
& Nbsp; body = models.TextField (default = '')
& Nbsp; prezzo = models.FloatField ()
Si supponga di voler fare la descrizione e il corpo traducibile. Il modello risultante dopo l'utilizzo di Transmeta è:
da Transmeta import Transmeta
classe Book (models.Model):
& Nbsp; __ metaclass__ = Transmeta
& Nbsp; title = models.CharField (max_length = 200)
& Nbsp; description = models.TextField ()
& Nbsp; body = models.TextField (default = '')
& Nbsp; prezzo = models.FloatField ()
& Nbsp; Classe Meta:
& Nbsp; tradurre = ('Descrizione', 'body',)
Assicurarsi di aver impostato le lingue predefinite e disponibili nella vostra settings.py:
Codice_lingua = 'es'
ugettext = lambda s: s # manichino ugettext funzione, come documenti di Django dicono
LINGUE = (
& Nbsp; ('es', ugettext ('spagnolo')),
& Nbsp; ('it', ugettext ('English')),
)
Questo è l'SQL generato con il comando ./manage.py sqlall:
INIZIO;
CREATE TABLE "fooapp_book" (
& Nbsp; "id" NOT NULL PRIMARY KEY seriale,
& Nbsp; varchar "titolo" (200) NOT NULL,
& Nbsp; text "description_en",
& Nbsp; text "description_es" NOT NULL,
& Nbsp; text "body_es" NOT NULL,
& Nbsp; text "body_en" NOT NULL,
& Nbsp; "prezzo" doppia precisione NOT NULL
)
;
COMMIT;
Note: * Transmeta crea una colonna per ciascuna lingua. Non preoccupatevi di dover nuovi linguaggi, in futuro, Transmeta risolve questo problema per voi. * Se un campo è nullo = False e non ha un valore predefinito, Transmeta creerà un solo campo NOT NULL, per la lingua predefinita. I campi per altre lingue secondarie sarà annullabile. Inoltre, la lingua principale sarà necessaria l'applicazione di amministrazione, mentre gli altri settori saranno facoltativi (con vuoto = True). Ciò è stato fatto perché l'approccio normale per la traduzione dei contenuti viene prima aggiungere il contenuto nella lingua principale e più tardi hanno traduttori traducono in altre lingue. * È possibile utilizzare syncdb ./manage.py per creare lo schema del database.
Giocando nella shell python
Transmeta crea un campo per ogni lingua disponibile per ogni campo traducibile definito in un modello. I nomi dei campi hanno come suffisso codici linguistici brevi, ad esempio: description_es, description_en, e così via. Inoltre crea un getter field_name per recuperare il valore di campo nella lingua attiva.
Giochiamo un po 'in un guscio di pitone per capire meglio come funziona:
& Gt; & gt; & gt; da fooapp.models importare Prenota
& Gt; & gt; & gt; b = Book.objects.create (description_es = u'mi descripcion ', description_en = u'my descrizione')
& Gt; & gt; & gt; b.description
Descrizione u'my '
& Gt; & gt; & gt; da django.utils.translation import activate
& Gt; & gt; & gt; attivare ('es')
& Gt; & gt; & gt; b.description
u'mi descripcion '
& Gt; & gt; & gt; b.description_en
Descrizione u'my '
L'aggiunta di nuove lingue
Se avete bisogno di aggiungere nuove lingue a quelli esistenti solamente bisogno di cambiare il vostro settings.py e chiedere Transmeta per sincronizzare nuovamente il DB. Ad esempio, per aggiungere il francese al nostro progetto, è necessario aggiungere che a Lingue a settings.py:
LINGUE = (
& Nbsp; ('es', ugettext ('spagnolo')),
& Nbsp; ('it', ugettext ('English')),
& Nbsp; ('fr', ugettext ('Francese')),
)
E eseguire un comando speciale sync_transmeta_db:
& Nbsp; ./ manage.py sync_transmeta_db
Lingue mancante nel campo "descrizione" di modello "fooapp.book": fr
SQL per la sincronizzazione dello schema "fooapp.book":
& Nbsp; ALTER TABLE "fooapp_book" Aggiungi colonna text "description_fr"
Sei sicuro che si desidera eseguire SQL precedente: (y / n) [n]: y
Esecuzione SQL ... Fatto
Lingue Missing in campo "corpo" da modello "fooapp.book": fr
SQL per la sincronizzazione dello schema "fooapp.book":
& Nbsp; ALTER TABLE "fooapp_book" Aggiungi colonna text "body_fr"
Sei sicuro che si desidera eseguire SQL precedente: (y / n) [n]: y
Esecuzione SQL ... Fatto
E fatto!
L'aggiunta di nuovi campi traducibili
Ora immaginate che, dopo diversi mesi di utilizzo di questa applicazione web (con molti libri creati), è necessario effettuare Prezzo traducibili (per esempio a causa dei prezzi libro dipende valuta).
Per raggiungere questo obiettivo, in primo luogo aggiungere prezzo traducibile lista campi del modello:
classe Book (models.Model):
& Nbsp; ...
& Nbsp; prezzo = models.FloatField ()
& Nbsp; Classe Meta:
& Nbsp; tradurre = ('Descrizione', 'body', 'prezzo',)
Tutto ciò che rimane ora chiama il comando sync_transmeta_db per aggiornare lo schema DB:
& Nbsp; ./ manage.py sync_transmeta_db
Lingue disponibili:
& Nbsp; 1. Lo Spagnolo
& Nbsp; 2. Inglese
Scegli una lingua in cui inserire i dati tradotti correnti.
Qual è la lingua dei dati attuali? (1-2): 1
Lingue mancante nel campo "prezzo" da modello "fooapp.book": es, en
SQL per la sincronizzazione dello schema "fooapp.book":
& Nbsp; ALTER TABLE "fooapp_book" Aggiungi colonna "price_es" doppia precisione
& Nbsp; UPDATE "fooapp_book" SET "price_es" = "prezzo"
& Nbsp; ALTER TABLE "fooapp_book" ALTER COLONNA "price_es" SET NOT NULL
& Nbsp; ALTER TABLE "fooapp_book" Aggiungi colonna "price_en" doppia precisione
& Nbsp; ALTER TABLE "fooapp_book" DROP COLUMN "prezzo"
Sei sicuro che si desidera eseguire SQL precedente: (y / n) [n]: y
Esecuzione SQL ... Fatto
Che diavolo fa questo comando?
Comando sync_transmeta_db non solo crea nuove colonne del database per il nuovo campo traducibile ... è copiare i dati dal vecchio campo prezzo in una delle lingue, ed è per questo comando che chiede campo lingua di destinazione per i dati effettivi.
Integrazione Admin
Transmeta visualizza in modo trasparente tutti i campi traducibili nella interfaccia di amministrazione. Questo è facile perché i modelli hanno in realtà molti campi (uno per ogni lingua).
Modifica campi modulo in admin è piuttosto un compito comune, e Transmeta include la funzione di utilità canonical_fieldname per applicare questi cambiamenti per tutti i campi di lingua in una volta. E 'spiegato meglio con un esempio:
da Transmeta import canonical_fieldname
Classe BookAdmin (admin.ModelAdmin):
& Nbsp; def formfield_for_dbfield (auto, db_field, ** kwargs):
& Nbsp; campo = super (BookAdmin, auto) .formfield_for_dbfield (db_field, ** kwargs)
& Nbsp; db_fieldname = canonical_fieldname (db_field)
& Nbsp; se db_fieldname == 'descrizione':
& Nbsp; # questo vale per tutti i campi description_ *
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; elif field.name == 'body_es':
& Nbsp; # questo vale solo per campo body_es
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; campo di ritorno
Caratteristiche :
- creazione dello schema automatico con campi traducibili.
- campi traducibile integrati nella interfaccia di amministrazione di Django.
- Comando per sincronizzare lo schema del database per aggiungere nuovi campi traducibili e nuovi linguaggi.
Cosa c'è di nuovo in questa versione:
- funzione get_mandatory_fieldname aggiunta.
Cosa c'è di nuovo nella versione 0.6.9:
- Supporto in modo get_field_language per i nomi dei campi di sottolineatura
Cosa c'è di nuovo nella versione 0.6.8:
- Fissare un piccolo bug nel comando sync_transmeta_db (UnboundLocalError: variabile locale 'f' si fa riferimento prima di assegnazione)
Cosa c'è di nuovo nella versione 0.6.7:
- Modificare la rappresentazione (verbose_name) delle etichette Transmeta li>
Cosa c'è di nuovo nella versione 0.6.6:
- Miglioramenti e usabilità nel comando sync_transmeta_db
- correggere alcuni bug
- Documentazione
Cosa c'è di nuovo nella versione 0.6.5:
- Miglioramenti e usabilità nel comando sync_transmeta_db
- Funziona con l'ultima Django (il comando sync_transmeta_db)
- Funziona con mysql (il comando sync_transmeta_db)
Cosa c'è di nuovo nella versione 0.6.4:
- errore Correzioni con ereditarietà modelli.
Cosa c'è di nuovo nella versione 0.6.3:
- permettono di utilizzare un impostazioni TRANSMETA_LANGUAGES.
- Aggiunti due opzioni per sync_transmeta_db: y (sì assumere su tutti) e -d (codice lingua predefinita)
Cosa c'è di nuovo nella versione 0.6.2:
- Funziona quando locale predefinito hanno varianti ortografiche come es-ES o en-US.
Requisiti :
- Django
- Python
I commenti non trovato