django-Transmeta este o aplicatie Django pentru conținutul traductibil în modelele Django lui. & Nbsp; Fiecare limbă este stocată și gestionat în mod automat într-o coloană diferită la nivel de baze de date.
Utilizarea Transmeta strong>
Crearea de modele traductibile
Uită-te la acest model:
clasă Book (models.Model):
& Nbsp; title = models.CharField (MAX_LENGTH = 200)
& Nbsp; descriere = models.TextField ()
& Nbsp; corp = models.TextField (default = '')
& Nbsp; preț = models.FloatField ()
Să presupunem că doriți să faceți descriere și traductibile corp. Modelul rezultat după utilizarea Transmeta este:
de la Transmeta Transmeta import
clasă Book (models.Model):
& Nbsp; __ metaclass__ = Transmeta
& Nbsp; title = models.CharField (MAX_LENGTH = 200)
& Nbsp; descriere = models.TextField ()
& Nbsp; corp = models.TextField (default = '')
& Nbsp; preț = models.FloatField ()
& Nbsp; clasă Meta:
& Nbsp; translate = ("descriere", "organism",)
Asigurați-vă că ați setat limbile implicite și disponibile în settings.py dumneavoastră:
LANGUAGE_CODE = 'es'
ugettext = lambda s: s # dummy ugettext funcție, așa cum spune documente Django lui
LIMBI = (
& Nbsp; ("es", ugettext ("spaniolă")),
& Nbsp; ("en", ugettext ("limba engleză")),
)
Aceasta este SQL generat cu comanda sqlall ./manage.py:
ÎNCEPE;
CREATE TABLE "fooapp_book" (
& Nbsp; "id" PRIMARY KEY NOT NULL serial,
& Nbsp; "title" VARCHAR (200) NOT NULL,
& Nbsp; text "description_en",
& Nbsp; "description_es" text NOT NULL,
& Nbsp; "body_es" text NOT NULL,
& Nbsp; textul "body_en" NOT NULL,
& Nbsp; "tarif" dubla precizie NOT NULL
)
;
COMMIT;
Note: * Transmeta creează o coloană pentru fiecare limbă. Nu vă faceți griji cu privire la nevoie de noi limbi în viitor, Transmeta rezolvă această problemă pentru tine. * În cazul în care un câmp este nul = False și nu are o valoare implicită, Transmeta va crea doar un câmp NOT NULL, pentru limba implicită. Domenii de alte limbi secundare va fi nulă. De asemenea, limba principală va fi necesară în aplicația admin, în timp ce celelalte domenii va fi opțională (cu gol = Adevărat). Acest lucru a fost făcut acest lucru pentru că abordarea normală pentru traducere de conținut este primul adaugati continut in limba principală și mai târziu trebuie traducători traduce în alte limbi. * Puteți utiliza syncdb ./manage.py pentru a crea schema de baze de date.
Redarea în coajă python
Transmeta creează un câmp pentru fiecare limbă disponibilă pentru fiecare domeniu traductibile definit intr-un model. Numele teren sunt sufix cu codurile de limbă scurte, de exemplu: description_es, description_en, și așa mai departe. În plus, acesta creează un getter FIELD_NAME pentru a prelua valoarea câmpului în limba activ.
Să jucăm un pic într-o coajă piton pentru a înțelege cel mai bine cum functioneaza acest lucru:
& Gt; & gt; & gt; de la fooapp.models import de carte
& Gt; & gt; & gt; b = Book.objects.create (description_es = u'mi Descripción ', description_en = u'my descriere')
& Gt; & gt; & gt; b.description
Descriere u'my "
& Gt; & gt; & gt; de la django.utils.translation activare import
& Gt; & gt; & gt; activa ("es")
& Gt; & gt; & gt; b.description
u'mi Descripción "
& Gt; & gt; & gt; b.description_en
Descriere u'my "
Adăugarea de noi limbi
Dacă aveți nevoie să adăugați noi limbi pentru cele existente care aveți nevoie doar de a schimba settings.py și cere Transmeta pentru a sincroniza din nou PB. De exemplu, pentru a adăuga franceză la proiectul nostru, trebuie să-l adăugați la Limbile în settings.py:
LIMBI = (
& Nbsp; ("es", ugettext ("spaniolă")),
& Nbsp; ("en", ugettext ("limba engleză")),
& Nbsp; ("fr", ugettext ("franceză")),
)
Și executa o comandă specială sync_transmeta_db:
& Nbsp; ./ manage.py sync_transmeta_db
Lipsește limbi în "descriere" câmpul de modelul "fooapp.book": fr
SQL pentru a sincroniza schema "fooapp.book":
& Nbsp; ALTER TABLE "fooapp_book" ADD COLUMN text "description_fr"
Sunteți sigur că doriți să execute SQL precedent: (y / n) [n]: y
Executare SQL ... Done
Lipsește limbi în domeniu "trup" de la modelul "fooapp.book": fr
SQL pentru a sincroniza schema "fooapp.book":
& Nbsp; ALTER TABLE "fooapp_book" ADD COLUMN text "body_fr"
Sunteți sigur că doriți să execute SQL precedent: (y / n) [n]: y
Executare SQL ... Done
Și gata!
Adăugarea de noi domenii traductibile
Acum imaginați-vă că, după mai multe luni, folosind această aplicație web (cu multe cărți creat), aveți nevoie pentru a face traductibil tarif carte (de exemplu, deoarece prețul carte depinde de valută).
Pentru a realiza acest lucru, în primul rând se adaugă la lista de preț domenii traductibil modelului:
clasă Book (models.Model):
& Nbsp; ...
& Nbsp; preț = models.FloatField ()
& Nbsp; clasă Meta:
& Nbsp; translate = ("descriere", "organism", "preț",)
Tot ce a mai rămas acum este de asteptare comanda sync_transmeta_db pentru a actualiza schema DB:
& Nbsp; ./ manage.py sync_transmeta_db
Limbi disponibile:
& Nbsp; 1. Spaniolă
& Nbsp; 2. Engleză
Alegeți o limbă în care să pună datele netraduse curente.
Care este limba de date curent? (1-2): 1
Lipsește limbi în domeniu "preț" de la modelul "fooapp.book": es, en
SQL pentru a sincroniza schema "fooapp.book":
& Nbsp; ALTER TABLE "fooapp_book" ADD COLOANA "price_es" dubla precizie
& Nbsp; UPDATE "fooapp_book" SET "price_es" = "preț"
& Nbsp; ALTER TABLE "fooapp_book" ALTER COLOANA "price_es" SET NOT NULL
& Nbsp; ALTER TABLE "fooapp_book" ADD COLUMN "price_en" dubla precizie
& Nbsp; ALTER TABLE "fooapp_book" DROP COLUMN "preț"
Sunteți sigur că doriți să execute SQL precedent: (y / n) [n]: y
Executare SQL ... Done
Ce naiba această comandă nu?
comanda sync_transmeta_db nu numai creează noi coloane de baze de date pentru domeniu nou traductibil ... ea a copia date de pe teren tarif vechi într-una din limbile, și de aceea comanda vă întreb pentru teren limbă de destinație pentru datele reale.
Integrarea Admin
Transmeta afișează transparent toate domeniile traductibile în interfața de administrare. Acest lucru este ușor deoarece modele au, de fapt, mai multe domenii (unul pentru fiecare limbă).
Schimbarea câmpurile de formular în admin este destul de o sarcină comună, precum și Transmeta include funcția de utilitate canonical_fieldname să aplice aceste modificări pentru toate domeniile lingvistice la o dată. Este mai bine explicat cu un exemplu:
de la Transmeta canonical_fieldname import
clasă BookAdmin (admin.ModelAdmin):
& Nbsp; def formfield_for_dbfield (auto-, db_field, ** kwargs):
& Nbsp; câmp = super- (BookAdmin, auto) .formfield_for_dbfield (db_field, ** kwargs)
& Nbsp; db_fieldname = canonical_fieldname (db_field)
& Nbsp; dacă db_fieldname == "descriere":
& Nbsp; # acest lucru este valabil pentru toate description_ * Campuri
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; Elif field.name == 'body_es ":
& Nbsp; # aceasta se aplică numai la câmp body_es
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; domeniul de returnare
Caracteristici :
- Crearea automată schemă cu câmpuri traductibile.
- domenii traductibil integrate în interfața de administrare Django lui.
- Command pentru a sincroniza schema de baze de date pentru a adăuga noi domenii traductibile și limbi noi.
Ce este nou în această versiune:
- funcție get_mandatory_fieldname Adaugata.
Ce este nou în versiunea 0.6.9:
- Suport în metoda get_field_language de nume de câmpuri cu subliniaza
Ce este nou în versiunea 0.6.8:
- Fix un bug mic în sync_transmeta_db comandă (UnboundLocalError: variabilă locale "f" de referință înainte cesiune)
Ce este nou în versiunea 0.6.7:
- Schimbarea reprezentarea (verbose_name) din etichetele Transmeta li>
Ce este nou în versiunea 0.6.6:
- Îmbunătățiri și gradul de utilizare în sync_transmeta_db comanda
- Fix unele bug-uri
- Documentation
Ce este nou în versiunea 0.6.5:
- Îmbunătățiri și gradul de utilizare în sync_transmeta_db comanda
- Funcționează cu ultimul Django (sync_transmeta_db comanda)
- Funcționează cu mysql (sync_transmeta_db comanda)
Ce este nou în versiunea 0.6.4:
- eroare Corecții cu moștenire în modele.
Ce este nou în versiunea 0.6.3:
- Permiteți să utilizați un setări TRANSMETA_LANGUAGES.
- Adaugata două opțiuni pentru a sync_transmeta_db: Y (presupunem da pe toate) și d (cod limba maternă)
Ce este nou în versiunea 0.6.2:
- Lucrari când implicit locale au variante de ortografie ca es-ES sau en-US.
Cerințe :
- Django
- Python
Comentariile nu a fost găsit