django-Transmeta är en Django app för översättnings innehåll i Django modeller. & Nbsp; Varje språk lagras och hanteras automatiskt i en annan kolumn på databasnivå.
Använda Trans
Skapa översättningsbara modeller
Titta på den här modellen:
klass Bok (models.Model):
& Nbsp; title = models.CharField (MAX_LENGTH = 200)
& Nbsp; description = models.TextField ()
& Nbsp; kropp = models.TextField (default = '')
& Nbsp; priset = models.FloatField ()
Anta att du vill göra beskrivning och kropps översättas. Den resulterande modellen efter att ha använt Transmeta är:
från Transimporttransmeta
klass Bok (models.Model):
& Nbsp; __ metaclass__ = Trans
& Nbsp; title = models.CharField (MAX_LENGTH = 200)
& Nbsp; description = models.TextField ()
& Nbsp; kropp = models.TextField (default = '')
& Nbsp; priset = models.FloatField ()
& Nbsp; klass Meta:
& Nbsp; översätta = ("beskrivning", "kropp",)
Kontrollera att du har ställt in standard och tillgängliga språk i ditt settings.py:
LANGUAGE_CODE = 'es "
ugettext = lambda s: s # dummy ugettext funktion, som django s docs säga
SPRÅK = (
& Nbsp; ('es ", ugettext (" spanska ")),
& Nbsp; ("en", ugettext ("engelska")),
)
Detta är SQL genereras med ./manage.py sqlall kommando:
BEGIN;
CREATE TABLE "fooapp_book" (
& Nbsp; "id" serie NOT NULL PRIMARY KEY,
& Nbsp; "title" varchar (200) NOT NULL,
& Nbsp; "description_en" text,
& Nbsp; "description_es" text NOT NULL,
& Nbsp; "body_es" text NOT NULL,
& Nbsp; "body_en" text NOT NULL,
& Nbsp; "pris" double precision NOT NULL
)
;
COMMIT;
Anmärkningar: * Transmeta skapar en kolumn för varje språk. Oroa dig inte om att behöva nya språk i framtiden, löser Trans detta problem för dig. * Om ett fält är null = False och inte har ett standardvärde, kommer Transmeta skapar bara en NOT NULL fält, för standardspråket. Fält för andra sekundära språk blir null. Dessutom kommer det primära språket krävas i admin-appen, medan andra områden kommer att vara frivillig (med tomt = sant). Detta gjordes så eftersom det normala tillvägagångssättet för innehålls översättning först lägga till innehåll i huvudspråket och senare har översättarna översätta till andra språk. * Du kan använda ./manage.py SyncDB att skapa databasschema.
Att spela i python skalet
Transmeta skapar ett fält för varje tillgängligt språk för varje översättningsfält som definieras i en modell. Fältnamnen suffix språk korta koder, t.ex: description_es, description_en, och så vidare. Dessutom skapar det en FIELD_NAME getter för att hämta fältvärdet i det aktiva språket.
Låt oss spela lite i en python skal för att bäst förstå hur detta fungerar:
& Gt; & gt; & gt; från fooapp.models importera Bok
& Gt; & gt; & gt; b = Book.objects.create (description_es = u'mi Descripción ', description_en = u'my beskrivningen ")
& Gt; & gt; & gt; b.description
u'my beskrivningen "
& Gt; & gt; & gt; från django.utils.translation import activate
& Gt; & gt; & gt; aktivera ("es")
& Gt; & gt; & gt; b.description
u'mi Descripción '
& Gt; & gt; & gt; b.description_en
u'my beskrivningen "
Lägga till nya språk
Om du behöver lägga till nya språk till de befintliga du behöver bara ändra ditt settings.py och be Trans att synkronisera DB igen. Till exempel, för att lägga franska till vårt projekt, måste du lägga till det språk i settings.py:
SPRÅK = (
& Nbsp; ('es ", ugettext (" spanska ")),
& Nbsp; ("en", ugettext ("engelska")),
& Nbsp; ('fr', ugettext ("franska")),
)
Och köra en speciell sync_transmeta_db kommando:
& Nbsp; ./ manage.py sync_transmeta_db
Saknade språk "beskrivning" fält från "fooapp.book" modell: fr
SQL för att synkronisera "fooapp.book" schema:
& Nbsp; ALTER TABLE "fooapp_book" ADD KOLUMN "description_fr" text
Är du säker på att du vill köra den tidigare SQL: (y / n) [n]: y
Exekvera SQL ... Done
Saknade språk "kropp" fält från "fooapp.book" modell: fr
SQL för att synkronisera "fooapp.book" schema:
& Nbsp; ALTER TABLE "fooapp_book" ADD KOLUMN "body_fr" text
Är du säker på att du vill köra den tidigare SQL: (y / n) [n]: y
Exekvera SQL ... Done
Och gjort!
Lägga till nya översättningsfält
Tänk dig nu att, efter flera månader med den här webb-app (med skapade många böcker), måste du göra boken pris översättas (till exempel på grund boken priset beror på valuta).
För att uppnå detta, först lägga priset till modellens översättningslista fält:
klass Bok (models.Model):
& Nbsp; ...
& Nbsp; priset = models.FloatField ()
& Nbsp; klass Meta:
& Nbsp; översätta = ("beskrivning", "kropp", "pris",)
Allt som återstår nu är att ringa kommandot sync_transmeta_db att uppdatera DB schema:
& Nbsp; ./ manage.py sync_transmeta_db
Tillgängliga språk:
& Nbsp; 1. Spanska
& Nbsp; 2. Engelska
Välj ett språk som att sätta nuvarande oöversatta uppgifter.
Vad är det språk som aktuella uppgifter? (1-2): 1
Saknade språk "pris" fält från "fooapp.book" modell: es, sv
SQL för att synkronisera "fooapp.book" schema:
& Nbsp; ALTER TABLE "fooapp_book" Lägg till kolumn "price_es" double precision
& Nbsp; UPDATE "fooapp_book" SET "price_es" = "pris"
& Nbsp; ALTER TABLE "fooapp_book" ALTER KOLUMN "price_es" SET NOT NULL
& Nbsp; ALTER TABLE "fooapp_book" ADD KOLUMN "price_en" double precision
& Nbsp; ALTER TABLE "fooapp_book" DROP KOLUMN "pris"
Är du säker på att du vill köra den tidigare SQL: (y / n) [n]: y
Exekvera SQL ... Done
Vad fan detta kommando gör?
sync_transmeta_db kommandot inte bara skapar nya databas kolumner för nya översättningsfält ... det kopierar data från gamla prisfält till ett av språken, och det är därför kommando ber dig om destinationsspråkområdet för faktiska data.
Admin integrering
Transmeta visar öppet alla översättnings fält in i admin-gränssnittet. Detta är lätt eftersom modellerna har faktiskt många områden (en för varje språk).
Ändra formulärfält i admin är en ganska gemensam uppgift, och Transmeta inkluderar canonical_fieldname nyttofunktion för att tillämpa dessa ändringar för alla områden språk på en gång. Det är bättre förklaras med ett exempel:
från Transimport canonical_fieldname
klass BookAdmin (admin.ModelAdmin):
& Nbsp; def formfield_for_dbfield (själv, db_field, ** kwargs):
& Nbsp; fält = super (BookAdmin, själv) .formfield_for_dbfield (db_field, ** kwargs)
& Nbsp; db_fieldname = canonical_fieldname (db_field)
& Nbsp; om db_fieldname == "beskrivning":
& Nbsp; # detta gäller alla description_ * fält
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; Elif field.name == 'body_es':
& Nbsp; # detta gäller endast body_es fält
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; returfält
Funktioner :
- Automatisk schema skapelse med översättningsfält.
- översättningsbara områden integreras i Django s admin-gränssnittet.
- Kommando för att synkronisera databasschema för att lägga till nya översättnings fält och nya språk.
Vad är nytt i den här versionen:
- Inkom get_mandatory_fieldname funktion.
Vad är nytt i version 0.6.9:
- Stöd i metod get_field_language för fältnamn med streck
Vad är nytt i version 0.6.8:
- Fix lite bugg i kommando sync_transmeta_db (UnboundLocalError: lokal variabel "f" refererade före tilldelning)
Vad är nytt i version 0.6.7:
- Ändra representation (verbose_name) av Transmeta etiketter
Vad är nytt i version 0.6.6:
- Förbättringar och användbarhet i kommandot sync_transmeta_db
- Fix några buggar
- Dokumentation
Vad är nytt i version 0.6.5:
- Förbättringar och användbarhet i kommandot sync_transmeta_db
- Fungerar med den sista django (kommandot sync_transmeta_db)
- Fungerar med mysql (kommandot sync_transmeta_db)
Vad är nytt i version 0.6.4:
- Fixar fel med arv i modeller.
Vad är nytt i version 0.6.3:
- Tillåt att använda en TRANSMETA_LANGUAGES inställningar.
- Inkom två alternativ att sync_transmeta_db: -y (antar ja på alla) och -d (standardspråkkoden)
Vad är nytt i version 0.6.2:
- Fungerar när standardlokal har stavningsvarianter som es-ES eller en-US.
Krav :
- Django
- Python
Kommentarer hittades inte