Django-Transmeta je aplikace Django pro translatovatelné obsah v modelech Djangovo. & Nbsp; Každý jazyk se uloží a automaticky řízena jiného sloupce na úrovni databáze.
Použití Transmeta strong>
Vytváření přeložitelné modely
Podívejte se na tento model:
třída Book (models.Model):
& Nbsp; title = models.CharField (MAX_LENGTH = 200)
& Nbsp; description = models.TextField ()
& Nbsp; body = models.TextField (default = '')
& Nbsp; cena = models.FloatField ()
Předpokládejme, že chcete, aby se popis a tělo nepřeložitelný. Výsledný model po použití Transmeta je:
od Transmeta dovozu Transmeta
třída Book (models.Model):
& Nbsp; __ metaclass__ = Transmeta
& Nbsp; title = models.CharField (MAX_LENGTH = 200)
& Nbsp; description = models.TextField ()
& Nbsp; body = models.TextField (default = '')
& Nbsp; cena = models.FloatField ()
& Nbsp; třída Meta:
& Nbsp; překládat = ("popis", "tělo",)
Ujistěte se, že jste nastavili výchozí a dostupné jazyky ve vašem settings.py:
LANGUAGE_CODE = "es"
ugettext = Lambda S: S # figurínu ugettext funkce, jako dokumenty Djangovo říkají
JAZYKY = (
& Nbsp; ("es", ugettext ("španělský")),
& Nbsp; ("en", ugettext ("Czech")),
)
To je SQL generovaný s ./manage.py příkazem sqlall:
BEGIN;
CREATE TABLE "fooapp_book" (
& Nbsp; "id" serial 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; "cena" double precision NOT NULL
)
;
ZAVÁZAT SE;
Poznámky: * Transmeta vytvoří jeden sloupec pro každý jazyk. Nebojte se o potřebě nových jazyků v budoucnu, Transmeta řeší tento problém za vás. * Je-li jedno pole je null = False a nemá výchozí hodnotu, Transmeta se vytvořit pouze jeden NOT NULL pole pro výchozí jazyk. Pole pro další sekundární jazyků bude s možnou hodnotou Null. Také primární jazyk nutné v admin aplikace, zatímco ostatní pole bude volitelná (s prázdnou = True). Stalo se tak proto, že běžný přístup k obsahu překladu nejprve přidat obsah do hlavního jazyka a později mají překladatelé překládat do jiných jazyků. * Můžete použít ./manage.py SyncDB vytvořit schéma databáze.
Hraní v python skořápce
Transmeta vytváří jedno pole na všech dostupných jazycích pro každý translatovatelné pole výhledu podle modelu. Názvy polí jsou s příponou shortcodech jazyk, např: description_es, description_en, a tak dále. Kromě toho vytváří název_pole getr načíst hodnotu pole v aktivní jazyk.
Pojďme si hrát trochu v IRP, aby co nejlépe pochopit, jak to funguje:
& Gt; & gt; & gt; od fooapp.models import Book
& Gt; & gt; & gt; b = Book.objects.create (description_es = u'mi POPIS ', description_en = u'my popis ")
& Gt; & gt; & gt; b.description
u'my popis "
& Gt; & gt; & gt; od django.utils.translation dovozu Aktivovat
& Gt; & gt; & gt; aktivovat ("es")
& Gt; & gt; & gt; b.description
u'mi POPIS "
& Gt; & gt; & gt; b.description_en
u'my popis "
Přidání nové jazyky
Chcete-li přidat nové jazyky do stávajících stačí jen změnit svůj settings.py a požádat Transmeta znovu synchronizovat DB. Chcete-li například přidat francouzsky náš projekt, je třeba přidat do Jazyky v settings.py:
JAZYKY = (
& Nbsp; ("es", ugettext ("španělský")),
& Nbsp; ("en", ugettext ("Czech")),
& Nbsp; ("fr", ugettext ("francouzský")),
)
A spustit speciální příkaz sync_transmeta_db:
& Nbsp; ./ manage.py sync_transmeta_db
Chybějící jazyků v poli "Popis" z "fooapp.book" model: fr
SQL pro synchronizaci "fooapp.book" schématu:
& Nbsp; ALTER TABLE "fooapp_book" ADD sloupec "description_fr" text
Jste si jisti, že chcete spustit předchozí SQL: (y / n) [n]: y
Provádím SQL ... Hotovo
Chybějící jazyků v poli "body" z "fooapp.book" model: fr
SQL pro synchronizaci "fooapp.book" schématu:
& Nbsp; ALTER TABLE "fooapp_book" ADD sloupec "body_fr" text
Jste si jisti, že chcete spustit předchozí SQL: (y / n) [n]: y
Provádím SQL ... Hotovo
A hotovo!
Přidání nových přeložitelné pole
A teď si představte, že po několika měsících používání této webové aplikace (s mnoha knih vytvořili), je třeba, aby kniha cen nepřeložitelný (například proto, že kniha cena závisí na měně).
K dosažení tohoto cíle, nejdříve přidejte cenu translatovatelné seznamu polí modelu:
třída Book (models.Model):
& Nbsp; ...
& Nbsp; cena = models.FloatField ()
& Nbsp; třída Meta:
& Nbsp; překládat = ("popis", "tělo", "cena",)
Vše, co zbylo nyní volá příkaz sync_transmeta_db aktualizaci DB schématu:
& Nbsp; ./ manage.py sync_transmeta_db
Dostupné jazyky:
& Nbsp; 1. Španělština
& Nbsp; 2. Angličtina
Vyberte si jazyk, ve kterém se musí zavádět současné nepřeložené dat.
Co je to jazyk aktuálních dat? (1-2): 1
Chybějící jazyků v poli "cena" z "fooapp.book" model: es, en
SQL pro synchronizaci "fooapp.book" schématu:
& Nbsp; ALTER TABLE "fooapp_book" ADD sloupec "price_es" double precision
& Nbsp; UPDATE "fooapp_book" Set "price_es" = "cena"
& Nbsp; ALTER TABLE "fooapp_book" ALTER sloupec "price_es" SET NOT NULL
& Nbsp; ALTER TABLE "fooapp_book" ADD sloupec "price_en" double precision
& Nbsp; ALTER TABLE "fooapp_book" DROP Sloupec "Cena"
Jste si jisti, že chcete spustit předchozí SQL: (y / n) [n]: y
Provádím SQL ... Hotovo
Co se to sakra tento příkaz dělá?
Příkaz sync_transmeta_db nejen vytváří nové databázové sloupce pro nové translatovatelné oblasti ... to zkopírovat data ze starého cenové oblasti do jednoho z jazyků, a to je důvod, proč příkaz vás požádat o cílové jazykové oblasti na aktuální data.
Integrace správce
Transmeta transparentně zobrazí všechny přeložitelné pole do administrátorského rozhraní. Je to snadné, protože modely mají ve skutečnosti mnoha oblastech (jeden pro každý jazyk).
Změna pole formuláře v admin je poměrně běžný úkol, a Transmeta obsahuje funkci canonical_fieldname nástroje lze použít tyto změny pro všechny jazykové oborů najednou. Je lépe vysvětlit na příkladu:
od Transmeta dovozu canonical_fieldname
třída BookAdmin (admin.ModelAdmin):
& Nbsp; def formfield_for_dbfield (self, db_field, ** kwargs):
& Nbsp; pole = super (BookAdmin, self) .formfield_for_dbfield (db_field, ** kwargs)
& Nbsp; db_fieldname = canonical_fieldname (db_field)
& Nbsp; v případě, db_fieldname == "popis":
& Nbsp; # to platí pro všechny description_ * pole
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; elif field.name == "body_es":
& Nbsp; # to platí pouze pro body_es pole
& Nbsp; field.widget = MyCustomWidget ()
& Nbsp; return pole
Vlastnosti :
- Automatická tvorba schéma s přeložitelných poli.
- translatable pole integrován do administrátorského rozhraní Django je.
- Příkaz k synchronizaci databáze schéma přidávat nové přeložitelné pole a nové jazyky.
Co je nového v této verzi:
- Přidána funkce get_mandatory_fieldname.
Co je nového ve verzi 0.6.9:
- Podpora v metodě get_field_language pro názvy polí podtržítka
Co je nového ve verzi 0.6.8:
- Oprava malou chybu v příkazu sync_transmeta_db (UnboundLocalError: lokální proměnná "f" odkazuje před přiřazením)
Co je nového ve verzi 0.6.7:
- Změna reprezentace (verbose_name) z Transmeta štítků
Co je nového ve verzi 0.6.6:
- Zlepšení a použitelnost v příkazovém sync_transmeta_db
- opravit některé chyby
- Documentation
Co je nového ve verzi 0.6.5:
- Zlepšení a použitelnost v příkazovém sync_transmeta_db
- Práce s posledním Django (příkaz sync_transmeta_db)
- Práce s MySQL (příkaz sync_transmeta_db)
Co je nového ve verzi 0.6.4:
- Opravy chyb se dědictví v modelech.
Co je nového ve verzi 0.6.3:
- Povolit pouze nastavení TRANSMETA_LANGUAGES.
- Přidány dvě možnosti sync_transmeta_db: Y (předpokládat, ano na všechno) a -d (výchozí kód jazyka)
Co je nového ve verzi 0.6.2:
- funguje, když výchozí národní mít pravopisné varianty jsou es-ES nebo EN-US.
Požadavky na :
- Django
- Python
Komentáře nebyl nalezen