i18n er en pakke, der forsøger at forenkle arbejdsgangen og udvikling af internationaliserede applikationer. & Nbsp; Det er en tynd wrapper omkring eksisterende værktøjer, især gettext og babel.
Grundlæggende brug
# Demo.py
#
fra i18n.translator import Translator
supported_languages = ['it_IT', 'fr_FR', 'de_DE']
# Aktiverer italienske oversættelser
tr = Oversætter ("/ sti / til / roots, supported_languages, 'it_IT')
print tr ._ ('Hej Verden! ")
hvor / sti / til / root / er rodmappen på dit projekt. Når instantieres, skaber Translator klasse automatisk en mappe kaldet / sti / til / root / sprog, hvor oversættelserne er gemt.
Udpakning beskeder
Forinden den egentlige oversættelse, skal du udpakke beskeder fra dine kildefiler, ved at påberåbe sig kommandoen extract på i18n-modulet, som er en wrapper omkring pybabel ekstrakt og pybabel opdatering:
& Nbsp; python -m i18n --root = / sti / til / root --languages = it_IT, fr_FR, de_DE ekstrakt
ekstrakt søger alle de beskeder, indpakket indeni opkald til _ (), gettext () eller ngettext () og producerer en fil kaldet sprog / template.pot. Dette er en standard gettext po file` som indeholder alle de beskeder i ansøgningen.
Desuden ekstrakt () skaber også en besked katalog fil for hver af de understøttede sprog som sprog / $ CODE / LC_MESSAGES / messages.po, hvor $ CODE er et af de sprog, der er anført i supported_languages (it_IT, fr_FR og de_DE i ovenstående eksempel ).
Kataloget filer er nu klar til at blive oversat ved hjælp af en af de mange eksisterende værktøjer, f.eks QT Linguist eller poEdit. For korrekt funktion af ansøgningen, skal bevares det hele sprog / hierarki. Vi foreslår at spore de forskellige messages.po filer i Version Control System sammen med de andre filer, der tilhører ansøgningen.
Opdatering beskeder
Under udviklingen af programmet, vil du helt sikkert tilføje nye meddelelser, der skal oversættes. Ekstrakten kommandoen automatisk håndtere denne sag: hvis den finder eksisterende katalog filer, deres indhold (herunder eksisterende oversættelser) er fusioneret med de nyligt udpakkede meddelelser.
Kompilering kataloger
Det er nødvendigt at udarbejde kataloget filer, før du bruger dem med gettext. Som standard vores Oversætter objekt samler automatisk alle kataloger findes i sprog /, der producerer de tilsvarende .mo filer. Opgørelsen sker kun, når kataloget filen er ændret. Det betyder, at i de fleste tilfælde behøver du ikke at bekymre sig om udarbejdelse af kataloger.
Hvis du foretrækker at have mere kontrol på dette trin, kan du passerer autocompile = False til konstruktøren af Oversætter og kompilere dem manuelt fra kommandolinjen:
& Nbsp; python -m i18n --root = / sti / til / root --languages = it_IT, fr_FR, de_DE kompilere
Lagring oversættelser i en database
For nogle anvendelser er det nyttigt at lade brugeren at definere nye oversættelser og / eller tilsidesætte standard ting. i18n understøtter denne use case med DBTranslator klassen, som er en underklasse af oversætter. Ved omregning, DBTranslator først ser i databasen: Hvis meddelelsen ikke er fundet, det delegerede til standard gettext adfærd.
DBTranslator er baseret på sqlalchemy. Dens constructor tager endnu en motor parameter:
fra i18n.dbtranslator import DBTranslator
fra sqlalchemy import create_engine
motor = create_engine (SQLite: ///db.sqlite ')
ROOT = '/ sti / til / root'
SPROG = ['it_IT', 'fr_FR']
DEST_LANGUAGE = 'it_IT'
tr = DBTranslator (ROOT, SPROG, DEST_LANGUAGE, motor = motor)
print tr ._ ("Hello World")
DBTranslator opretter automatisk tabellen translation_entries i BF. Derefter er det op til anvendelsen at tilvejebringe en brugergrænseflade til at manipulere tabellen. For test, kan du bruge add_translation () metode til at indsætte en ny oversættelse i BF:
tr.add_translation ("it_IT", "Hello World", "ciao mondo")
print tr ._ ("Hello World") # prints "ciao Mondo"
Sådan bruges en global Translator
Ved design, i18n forsøger helt at undgå global stat. Det betyder, at du kan instantiere så mange Oversætter og DBTranslator som du ønsker, hver med henvisning til en anden mappe og / eller database. Dette er især nyttigt til testning.
Men i praksis de fleste projekter vil bruge en global oversætter som kender budskaberne på alle de komponenter i projektet. Demoen ansøgningen viser en måde at gøre det i translate.py modulet:
import py
fra i18n.translator import Translator
# Sæt roden af projektet til den mappe, der indeholder denne fil
Root = py.path.local (__ fil __). Bib-sti ()
SPROG = ['it_IT', 'fr_FR', 'de_DE']
tr = Translator (ROOT, sprog, 'it_IT')
_ = Tr._
ngettext = tr.ngettext
hvis __name__ == '__main__ «:
& Nbsp; tr.cmdline (sys.argv)
På denne måde kan resten af programmet blot importere og bruge _ () og ngettext () fra translate.py. Eller i din præference, import direkte tr objekt og brug tr ._ () og tr.ngettext () til at oversætte meddelelser.
De sidste to linjer i koden giver en bekvem måde at ringe ekstrakt og kompilere fra kommandolinjen uden at skulle manuelt at angive root dir og de understøttede sprog. Bare køre:
& Nbsp; python translate.py ekstrakt # ... eller kompilere
Krav :
- Python
Kommentarer ikke fundet