Django-Transmeta is 'n Django app vir vertaalbaar inhoud in Django se modelle. & Nbsp; Elke taal word gestoor en outomaties in 'n ander kolom databasis vlak bestuur word.
Gebruik Transmeta strong>
Skep vertaalbaar modelle
Kyk na hierdie model:
klas Book (models.Model):
& Nbsp; title = models.CharField (MAX_LENGTH = 200)
& Nbsp; beskrywing = models.TextField ()
& Nbsp; liggaam = models.TextField (verstek = '')
& Nbsp; prys = models.FloatField ()
Veronderstel jy wil beskrywing en liggaam vertaalbaar te maak. Die gevolglike model na die gebruik van Transmeta is:
van Transmeta invoer Transmeta
klas Book (models.Model):
& Nbsp; __ metaclass__ = Transmeta
& Nbsp; title = models.CharField (MAX_LENGTH = 200)
& Nbsp; beskrywing = models.TextField ()
& Nbsp; liggaam = models.TextField (verstek = '')
& Nbsp; prys = models.FloatField ()
& Nbsp; klas Meta:
& Nbsp; vertaal = ('n beskrywing "," liggaam,)
Maak seker dat jy die standaard en die beskikbare tale wat in jou settings.py:
LANGUAGE_CODE = 'es'
ugettext = lambda s: s # dummy ugettext funksie, soos Django's dokumente sê
TALE = (
& Nbsp; ('es', ugettext ('Spaans')),
& Nbsp; ('en', ugettext ("Engels")),
)
Dit is die SQL gegenereer met die ./manage.py sqlall opdrag:
Begin;
CREATE TABLE "fooapp_book" (
& Nbsp; "id" serial NIE NULL primêre sleutel,
& Nbsp; "titel" varchar (200) NIE NULL,
& Nbsp; "description_en" teks,
& Nbsp; "description_es" teks NIE NULL,
& Nbsp; "body_es" teks NIE NULL,
& Nbsp; "body_en" teks NIE NULL,
& Nbsp; "prys" dubbele presisie NIE NULL
)
;
Pleeg;
Notes: * Transmeta skep een kolom vir elke taal. Moenie bekommerd wees nie oor hoef nuwe tale in die toekoms, Transmeta los die probleem vir jou. * As een veld, is van nul = Vals en het nie 'n verstek waarde, sal Transmeta net een NIE NULL veld skep, vir die standaard taal. Veld vir ander sekondêre tale sal waarvoor geen nul mag wees. Ook, sal die primêre taal vereis word in die admin app, terwyl die ander velde opsionele sal wees (met leë = True). Dit is gedoen omdat die normale benadering vir die inhoud vertaling eerste inhoud voeg in die hoof taal en later het vertalers vertaal in ander tale. * Jy kan ./manage.py syncdb gebruik databasis skedule te skep.
Speel in die luislang dop
Transmeta skep een veld vir elke beskikbare taal vir elke vertaalbaar veld gedefinieer in 'n model. Gebied name bijvoegsel taal kort kodes, bv: description_es, description_en, en so aan. Daarbenewens skep dit 'n FIELD_NAME lucky die veld waarde in die aktiewe taal te haal.
Kom ons speel 'n bietjie in 'n luislang dop om die beste te verstaan hoe dit werk:
& Gt; & gt; & gt; van fooapp.models invoer Book
& Gt; & gt; & gt; b = Book.objects.create (description_es = u'mi Descripción ', description_en = u'my beskrywing')
& Gt; & gt; & gt; b.description
u'my beskrywing '
& Gt; & gt; & gt; van django.utils.translation invoer aktiveer
& Gt; & gt; & gt; aktiveer ('es')
& Gt; & gt; & gt; b.description
u'mi Descripción '
& Gt; & gt; & gt; b.description_en
u'my beskrywing '
Toevoeging van nuwe tale
As jy 'n nuwe taal te voeg tot die bestaande jy net nodig het om jou settings.py te verander en vra Transmeta weer die DB te pas. Byvoorbeeld, Frans ons projek te voeg, moet jy dit te voeg by Tale in settings.py:
TALE = (
& Nbsp; ('es', ugettext ('Spaans')),
& Nbsp; ('en', ugettext ("Engels")),
& Nbsp; (fr, ugettext ("Franse")),
)
En uit te voer 'n spesiale sync_transmeta_db opdrag:
& Nbsp; ./ manage.py sync_transmeta_db
Ontbreek tale in die veld van "fooapp.book" model "beskrywing": fr
SQL te sinchroniseer "fooapp.book" skema:
& Nbsp; ALTER TABLE "fooapp_book" Voeg kolom "description_fr" teks
Is jy seker dat jy die vorige SQL te voer: (J / N) [n]: y
SQL ... gebraai
Ontbreek tale in die veld van "fooapp.book" model "liggaam": fr
SQL te sinchroniseer "fooapp.book" skema:
& Nbsp; ALTER TABLE "fooapp_book" Voeg kolom "body_fr" teks
Is jy seker dat jy die vorige SQL te voer: (J / N) [n]: y
SQL ... gebraai
En gedoen!
Toevoeging van nuwe vertaalbaar velde
Dink dat ons nou, na 'n paar maande met behulp van hierdie web app (met baie boeke geskep), moet jy boek prys vertaalbaar maak (byvoorbeeld omdat boek prys hang af van die munt).
Om dit te bereik, voeg eers die prys aan die model se vertaalbaar velde lys:
klas Book (models.Model):
& Nbsp; ...
& Nbsp; prys = models.FloatField ()
& Nbsp; klas Meta:
& Nbsp; vertaal = ('n beskrywing "," liggaam "," prys ")
Al wat nou oorbly, is die roeping van die sync_transmeta_db die bevel van die DB skema te werk:
& Nbsp; ./ manage.py sync_transmeta_db
Beskikbare tale:
& Nbsp; 1. Spanish
& Nbsp; 2. Engels
Kies 'n taal waarin huidige onvertaalde data te sit.
Wat is die taal van die huidige data? (1-2): 1
Ontbreek tale in die veld van "fooapp.book" model "prys": es, en
SQL te sinchroniseer "fooapp.book" skema:
& Nbsp; ALTER TABLE "fooapp_book" Voeg kolom "price_es" dubbele presisie
& Nbsp; UPDATE "fooapp_book" SET "price_es" = "prys"
& Nbsp; ALTER TABLE "fooapp_book" ALTER KOLOM "price_es" Stel NIE NULL
& Nbsp; ALTER TABLE "fooapp_book" Voeg kolom "price_en" dubbele presisie
& Nbsp; ALTER TABLE "fooapp_book" DROP KOLOM "prys"
Is jy seker dat jy die vorige SQL te voer: (J / N) [n]: y
SQL ... gebraai
Wat de hel hierdie opdrag doen?
sync_transmeta_db opdrag nie net skep nuwe databasis kolomme vir nuwe vertaalbaar veld ... dit data van die ou prys veld kopieer in een van tale, en dit is hoekom opdrag vra vir die doel taal in die veld vir werklike data.
Admin integrasie
Transmeta vertoon deursigtig al vertaalbaar velde in die administrateur koppelvlak. Dit is maklik, want modelle het in werklikheid baie velde (een vir elke taal).
Veranderende vorm velde in die admin is nogal 'n gemeenskaplike taak, en Transmeta sluit die canonical_fieldname nutsfunksie hierdie veranderinge vir alle taal velde op een slag te pas. Dit is beter verduidelik met 'n voorbeeld:
van Transmeta invoer canonical_fieldname
klas BookAdmin (admin.ModelAdmin):
& Nbsp; def formfield_for_dbfield (self, db_field, ** kwargs):
& Nbsp; veld = super (BookAdmin, self) .formfield_for_dbfield (db_field, ** kwargs)
& Nbsp; db_fieldname = canonical_fieldname (db_field)
& Nbsp; as db_fieldname == 'beskrywing':
& Nbsp; # dit geld vir alle description_ * velde
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; elif field.name == 'body_es':
& Nbsp; # Dit geld slegs vir body_es veld
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; terugkeer veld
Eienskappe :
- Outomatiese skema skepping met vertaalbaar velde.
- vertaal aanvaarde velde geïntegreer in Django se administrateur koppelvlak.
- Command databasis skedule te sinchroniseer nuwe vertaalbaar velde en nuwe tale te voeg.
Wat is nuut in hierdie release:
- Bygevoeg get_mandatory_fieldname funksie.
Wat is nuut in die weergawe 0.6.9:
- Support in metode get_field_language vir veldname met onderstreping
Wat is nuut in die weergawe 0.6.8:
- Fix 'n klein fout in die opdrag sync_transmeta_db (UnboundLocalError: plaaslike veranderlike 'f' verwys voordat opdrag)
Wat is nuut in die weergawe 0.6.7:
- Verander die verteenwoordiging (verbose_name) van die Transmeta etikette
Wat is nuut in die weergawe 0.6.6:
- Verbeterings en bruikbaarheid in die opdrag sync_transmeta_db
- Fix n paar foute
- Dokumentasie
Wat is nuut in die weergawe 0.6.5:
- Verbeterings en bruikbaarheid in die opdrag sync_transmeta_db
- Werk met die laaste Django (die opdrag sync_transmeta_db)
- Werk met mysql (die opdrag sync_transmeta_db)
Wat is nuut in die weergawe 0.6.4:
- Oplossing fout met erfenis in modelle.
Wat is nuut in die weergawe 0.6.3:
- Laat 'n TRANSMETA_LANGUAGES instellings te gebruik.
- Bygevoeg twee opsies te sync_transmeta_db: -y (aanvaar ja op al) en d (verstek taal-kode)
Wat is nuut in die weergawe 0.6.2:
- Werke wanneer verstek land het spelling variante as es-ES of en-US.
Vereistes :
- Django
- Python
Kommentaar nie gevind