Django-Transmeta er en Django app til oversættes indhold i Django modeller. & Nbsp; Hvert sprog gemmes og styres automatisk i en anden kolonne på database-niveau.
Brug Transmeta strong>
Oprettelse oversættes modeller
Kig på denne model:
klasse Bog (models.Model):
& Nbsp; title = models.CharField (MAX_LENGTH = 200)
& Nbsp; description = models.TextField ()
& Nbsp; krop = models.TextField (standard = '')
& Nbsp; pris = models.FloatField ()
Antag, at du ønsker at gøre beskrivelsen og krop oversættes. Den resulterende model efter brug transmeta er:
fra Transmeta import Transmeta
klasse Bog (models.Model):
& Nbsp; __ metaclass__ = Transmeta
& Nbsp; title = models.CharField (MAX_LENGTH = 200)
& Nbsp; description = models.TextField ()
& Nbsp; krop = models.TextField (standard = '')
& Nbsp; pris = models.FloatField ()
& Nbsp; klasse Meta:
& Nbsp; oversætte = ('beskrivelse', 'krop',)
Sørg for at du har sat standard og tilgængelige sprog i din settings.py:
LANGUAGE_CODE = 'es'
ugettext = lambda s: s # dummy ugettext funktion, som Djangos docs sige
SPROG = (
& Nbsp; (»es«, ugettext (»spanske«)),
& Nbsp; ('en', ugettext (engelsk)),
)
Dette er SQL til med ./manage.py sqlall kommando:
BEGIN;
CREATE TABLE "fooapp_book" (
& Nbsp; "id" serial NOT NULL PRIMARY KEY,
& Nbsp; "title" varchar (200) NOT NULL,
& Nbsp; "description_en" tekst,
& Nbsp; "description_es" tekst NOT NULL,
& Nbsp; "body_es" tekst NOT NULL,
& Nbsp; "body_en" tekst NOT NULL,
& Nbsp; "pris" dobbelt præcision NOT NULL
)
;
COMMIT;
Noter: * Transmeta skaber en kolonne for hvert sprog. Må ikke bekymre dig om at skulle nye sprog i fremtiden, Transmeta løser dette problem for dig. * Hvis et felt er nul = Falsk og ikke har en standardværdi, vil Transmeta kun oprette ét NOT NULL felt, for standardsproget. Felter for andre sekundære sprog vil være NULL. Desuden vil det primære sprog kræves i admin app, mens de øvrige områder vil være frivillig (med blank = True). Dette blev gjort, fordi den normale fremgangsmåde for indhold oversættelse først tilføje indhold i de vigtigste sprog og senere har oversættere oversætte til andre sprog. * Du kan bruge ./manage.py syncdb til at oprette database skema.
At spille i python skallen
Transmeta skaber et felt for hver tilgængelig sproget for hver oversættes felt er defineret i en model. Felt navne er suffikset sproglige korte koder, fx: description_es, description_en, og så videre. Desuden skaber en FIELD_NAME getter at hente feltværdien i den aktive sprog.
Lad os spille lidt i en python shell bedst forstå, hvordan det fungerer:
& Gt; & gt; & gt; fra fooapp.models importerer Book
& Gt; & gt; & gt; b = Book.objects.create (description_es = u'mi Descripción «, description_en = u'my beskrivelse")
& Gt; & gt; & gt; b.description
u'my beskrivelse '
& Gt; & gt; & gt; fra django.utils.translation import aktivere
& Gt; & gt; & gt; aktivere ('es')
& Gt; & gt; & gt; b.description
u'mi Descripción '
& Gt; & gt; & gt; b.description_en
u'my beskrivelse '
Tilføjelse af nye sprog
Hvis du har brug for at tilføje nye sprog til de eksisterende behøver du kun at ændre din settings.py og bede Transmeta at synkronisere BF igen. For eksempel for at tilføje fransk til vores projekt, skal du føje det til sprog i settings.py:
SPROG = (
& Nbsp; (»es«, ugettext (»spanske«)),
& Nbsp; ('en', ugettext (engelsk)),
& Nbsp; (»fr«, ugettext (fransk)),
)
Og udføre en særlig sync_transmeta_db kommando:
& Nbsp; ./ manage.py sync_transmeta_db
Manglende sprog i "Beskrivelse" feltet fra "fooapp.book" model: fr
SQL til at synkronisere "fooapp.book" skema:
& Nbsp; ALTER TABLE "fooapp_book" Tilføj kolonne "description_fr" tekst
Er du sikker på, at du ønsker at udføre den tidligere SQL: (y / n) [n]: y
Udfører SQL ... Udført
Manglende sprog i "krop" feltet fra "fooapp.book" model: fr
SQL til at synkronisere "fooapp.book" skema:
& Nbsp; ALTER TABLE "fooapp_book" Tilføj kolonne "body_fr" tekst
Er du sikker på, at du ønsker at udføre den tidligere SQL: (y / n) [n]: y
Udfører SQL ... Udført
Og færdig!
Tilføjelse af nye oversættes felter
Forestil dig nu, at der efter flere måneder ved hjælp af denne web app (med mange bøger oprettet), skal du gøre bogpriser oversættes (for eksempel fordi bogen pris afhænger af valuta).
For at opnå dette, først tilføje pris til modellens oversættes felter liste:
klasse Bog (models.Model):
& Nbsp; ...
& Nbsp; pris = models.FloatField ()
& Nbsp; klasse Meta:
& Nbsp; oversætte = ('beskrivelse', 'krop', 'pris',)
Det eneste, nu kalder den sync_transmeta_db kommando for at opdatere DB skema:
& Nbsp; ./ manage.py sync_transmeta_db
Tilgængelige sprog:
& Nbsp; 1. Spansk
& Nbsp; 2. Engelsk
Vælg et sprog til at sætte aktuelle uoversatte data.
Hvad er det sprog, aktuelle data? (1-2): 1
Manglende sprog i felt fra "fooapp.book" model "pris": es, da
SQL til at synkronisere "fooapp.book" skema:
& Nbsp; ALTER TABLE "fooapp_book" Tilføj kolonne "price_es" dobbelt præcision
& Nbsp; update "fooapp_book" set "price_es" = "pris"
& Nbsp; ALTER TABLE "fooapp_book" ALTER kolonnen "price_es" SET NOT NULL
& Nbsp; ALTER TABLE "fooapp_book" Tilføj kolonne "price_en" dobbelt præcision
& Nbsp; ALTER TABLE "fooapp_book" DROP kolonne "pris"
Er du sikker på, at du ønsker at udføre den tidligere SQL: (y / n) [n]: y
Udfører SQL ... Udført
Hvad fanden denne kommando gør?
sync_transmeta_db kommandoen ikke kun skaber nye database kolonner for ny oversættes felt ... det kopierer data fra gamle pris område til et af sprogene, og derfor kommando bede dig om destinationen sprog vilkår for faktiske data.
Integration Admin
Transmeta gennemsigtig måde viser alle oversættes felter ind i admin interface. Det er let, fordi modeller har faktisk mange områder (en for hvert sprog).
Ændring formularfelter i admin er en ganske almindelig opgave, og Transmeta omfatter canonical_fieldname nyttefunktion at anvende disse ændringer for alle sproglige områder på én gang. Det er bedre forklares med et eksempel:
fra Transmeta import canonical_fieldname
klasse BookAdmin (admin.ModelAdmin):
& Nbsp; def formfield_for_dbfield (selv-, db_field, ** kwargs):
& Nbsp; felt = super (BookAdmin, self) .formfield_for_dbfield (db_field, ** kwargs)
& Nbsp; db_fieldname = canonical_fieldname (db_field)
& Nbsp; hvis db_fieldname == 'beskrivelse':
& Nbsp; # dette gælder for alle description_ * felter
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; Elif field.name == 'body_es «:
& Nbsp; # dette gælder kun for body_es felt
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; tilbagevenden felt
Funktioner :
- Automatisk skema skabelse med oversætbare felter.
- translaterbare felter integreret i Django admin interface.
- Kommando til at synkronisere databaseskema at tilføje nye oversættes felter og nye sprog.
Hvad er nyt i denne udgivelse:
- Tilføjet get_mandatory_fieldname funktion.
Hvad er nyt i version 0.6.9:
- Support i metode get_field_language til feltnavne med understregning
Hvad er nyt i version 0.6.8:
- Løs et lille bug i kommandoen sync_transmeta_db (UnboundLocalError: lokal variabel "f" refereres før tildeling)
Hvad er nyt i version 0.6.7:
- Skift repræsentation (verbose_name) i Transmeta etiketter
Hvad er nyt i version 0.6.6:
- Forbedringer og anvendelighed i kommandoen sync_transmeta_db
- Fix nogle bugs
- Dokumentation
Hvad er nyt i version 0.6.5:
- Forbedringer og anvendelighed i kommandoen sync_transmeta_db
- Arbejder med den sidste django (kommandoen sync_transmeta_db)
- Arbejder med mysql (kommandoen sync_transmeta_db)
Hvad er nyt i version 0.6.4:
- Rettelser fejl med arv i modellerne.
Hvad er nyt i version 0.6.3:
- Tillad at bruge en TRANSMETA_LANGUAGES indstillinger.
- Tilføjet to muligheder for at sync_transmeta_db: -y (antage ja på alle) og -D (standard sprogkode)
Hvad er nyt i version 0.6.2:
- virker, når standard locale har stavemåder som es-ES eller en-US.
Krav :
- Django
- Python
Kommentarer ikke fundet