[python] Překlady programů

Petr Přikryl prikryl na atlas.cz
Úterý Prosinec 5 14:45:50 CET 2017


Ta funkce se speciálním názvem "_" a odpovídající wx.GetTranslation jsou právě obalem nad gettext.
 
Ve svých zdrojácích (jak je v té dokumentaci naznačeno) pak místo:
 
aString = u"This is a string which will be translated"

píšeš
aString = _(u"This is a string which will be translated") 
Jde o to, že externí nástroje reagují na výskyt _("xxx") ve zdrojovém textu a vykousnou to do toho
zdrojového tvaru pro poedit. Při běhu funkce _() použije původní řetězec jako klíč a v databázi
najde odpovídající překlad. Takže to xxx může být i v symbolickém jazyce. Pro každý jazyk bez výjimky
pak definuješ překlad. Pokud se ale předělává existující projekt, tak se prostě všechny řetězcové
literály obalí tou funkcí (raději ne úplně mechanicky), pustí se na to extraktor, použije se poedit,
a je to... (skoro :)
 
V Pythonu (verze 3) jsem nezkoušel, zda lze _(u"xxxx") nahradit pythonštějším _('xxxx')
-- tj. bez u a s apostrofy místo uvozovek. Z hlediska Pythonu je to stejné, ale musí se chytat
ten extraktor, který zpracovává zdrojové texty a připravuje podklady pro poedit.
 
Petr
______________________________________________________________
> Od: "Ctibor.Plasek" <Ctibor.Plasek na seznam.cz>
> Komu: "Konference PyCZ" <python na py.cz>
> Datum: 05.12.2017 13:49
> Předmět: Re: [python] Překlady programů
>
Ještě jednou díky oběma.To Petr - jj.  Našel jsem si ty překlady u pyscripteru a přesně tohle mne mátlo... :-)A web nedělám. Bavím se s wxpythonem a tam je jenom toto:https://wxpython.org/Phoenix/docs/html/internationalization.html Ale vy jste mne alespoň správně nasměrovali.Takže ještě jednou díky.Ctibor
 ---------- Původní e-mail ----------
 Od: Ondrej Tuma <konference na webjet.cz>
 Komu: python na py.cz
 Datum: 5. 12. 2017 13:35:32
 Předmět: Re: [python] Překlady programů 
Hoj, 
 
no tak to opravdu není. Ten princip je jednoduchý, a doporučuji si o 
gettextu něco napsat. Žádný hezký český zdroj mě ale nenapadá. Anglický 
asi nejlépe: 
 
https://www.gnu.org/software/gettext/manual/gettext.html 
 
Ve zkratce je postup následující: 
 
v kódu, kde se má doplnit překlad se použije funkce gettext, případně 
alias podtržítko (_): 
 
 from gettext import gettext 
 print(gettext("Hello world")) 
 
Následně se pomocí nástrojů gettextu vygeneruje pot soubor: 
 
 xgettext -o aplikace.pot --language=python 
 
Z něj se pak různým způsobem dá vytvořit soubor s překlady, nejlépe pak: 
 
 msginit -l cs (pro český jazyk) 
 
výsledný soubor cs.po se edituje v jednom z nástrojů, jenž jsem psal a 
nakonec se vygeneruje binární katalog: 
 
 msgfmt -o cs/LC_MESSAGES/aplikace.mo cs.po 
 
V kódu je pak třeba definovat jak se katalog jmenuje (název 
katalogu bez přípony). 
 
 from gettext import bindtextdomain 
 bindtextdomain('aplikace', localedir='/usr/share/locale') 
 
V případě, že používáš webovou aplikaci a šablony (jinja2) pak je třeba 
vytvořit objekt translation, ten se pak předává při generování výstupu. 
 
 from gettext import translation 
 translations = translation('aplikace', 
 localedir="/usr/share/locale", 
 languages=[cs, sk], 
 fallback=True) 
 
 env = Environment(loader=FileSystemLoader(path), 
 undefined=MissingUndefined, 
 extensions=['jinja2.ext.i18n']) 
 env.install_gettext_translations(translations) 
 template = env.get_template("sablona.html") 
 
 
 localedir je cesta k adresari, ve kterem jsou adresare s 
 jazyky, v nich LC_MESSAGES a v nich aplikace.mo 
 
Příklady sem nezkoušel, tak snad sem je napsal správně. Pak to funguje 
tak, že gettext natáhne katalogy, dle nastavených jazyků do paměti a 
podle toho, jestli najde string v příslušném jazykovém katalogu 
přeložený (postupně zkouší všechny jazyky), vrátí přeložený string. 
 
Asi o tom zase napíšu článek, ať se pořádně znemožním :-) 
 
Ondra 
 
V Tue, 05 Dec 2017 11:21:26 +0100 (CET) 
"Ctibor.Plasek" <Ctibor.Plasek na seznam.cz> napsáno: 
 
> Ahoj. 
> Díky moc za rady - teda spíš za nasměrování :-) Konečně vím, co mám 
> hledat... 
> 
> Sice to zatím moc nechápu (zdá se mi, že se odkazuje na určitý přesný 
> řádek v kódu, 
> 
> což by asi bylo nešťastné při jakémkoliv doplňování - takže to 
> nakonec asi nebude pravda) 
> 
> 
> 
> 
> Ctibor 
> ---------- Původní e-mail ---------- 
> Od: Ondrej Tuma <konference na webjet.cz> 
> Komu: python na py.cz 
> Datum: 23. 11. 2017 8:09:17 
> Předmět: Re: [python] Překlady programů 
> "Hoj, 
> 
> GTK+ používá gettext také. 
> 
> V Pythonu používám přímo gettext modul: 
> https://docs.python.org/3/library/gettext.html?highlight=gettext#module- 
> gettext 
> Narozdíl od klasické C knihovny, se s ním pracuje o něco lépe a 
> pohodlněji. 
> 
> Mezi ty nejznámější programy na správu překladů patří poedit 
> https://poedit.net/. 
> 
> A rozhodně zajímavým Michalovým počinem je Weblate 
> https://weblate.org/. Zatím mám u něj jeden free software a to teprve 
> pár dní, takže zkušenosti nemám, 
> 
> Ondra 
> 
> V Thu, 23 Nov 2017 01:15:47 +0100 
> Petr Messner <petr.messner na gmail.com> napsáno: 
> 
> > Ahoj, 
> > 
> > gettext je standard. Zkus se podívat na tyto odkazy - pokud neděláš 
> > web, tak si ty webové věci od toho odmysli :) 
> > 
> > - https://docs.djangoproject.com/en/2.0/topics/i18n/ 
> > - https://docs.djangoproject.com/en/2.0/topics/i18n/translation/ 
> > - http://babel.pocoo.org/en/latest/ 
> > 
> > Pokud používáš nějaký framework (webový, qt, gtk, ...), najdi si 
> > dokumentaci o internacionalizaci (i18n) k němu :) 
> > 
> > Obecně chceš soubor a ne databázi, protože soubor budeš mít 
> > normálně v gitu, kolegové posílat pull requesty na to apod. S 
> > formátem gettextu umí pracovat hromada nástrojů, včetně statické 
> > analýzy kódu pro vyhledávání nepřeložených řetězců, výpočet 
> > translation coverage... 
> > 
> > PM 
> > 
> > Dne 23. listopadu 2017 0:32 Ctibor.Plasek <Ctibor.Plasek na seznam.cz> 
> > napsal(a): 
> > 
> > > Ahoj. 
> > > Přemýšlím nad následujícím problémem - jak jednoduše vytvořit 
> > > vícejazyčnou verzi programu. 
> > > Vytvořit databázi, nebo textové soubory? Jakým nejlepším způsobem 
> > > říct programu, že pokud je zapnutá volba "česky"¨ 
> > > tak že první v menu bude "Soubor", když anglicky tak že to bude 
> > > "File" atd. Určitě jste už tyto problémy řešili, tak jsem se 
> > > chtěl zeptat, co a jakým způsobem je nejvýhodnější (i pro event. 
> > > další rozšíření překladů) 
> > > 
> > > Díky za rady 
> > > 
> > > _______________________________________________ 
> > > Python mailing list 
> > > python na py.cz 
> > > http://www.py.cz/mailman/listinfo/python 
> > > 
> > > Visit: http://www.py.cz 
> > > 
> > > 
> 
> 
> 
 
 
 
-- 
Ondřej Tůma <mcbig na zeropage.cz> 
www: http://ipv6.mcbig.cz jabber: mcbig na jabber.cz twitter: mcbig_cz 
_______________________________________________ 
Python mailing list 
python na py.cz 
http://www.py.cz/mailman/listinfo/python 
 
Visit: http://www.py.cz 
 
 ----------
 
 _______________________________________________
 Python mailing list
 python na py.cz
 http://www.py.cz/mailman/listinfo/python <http://www.py.cz/mailman/listinfo/python>
 
 Visit: http://www.py.cz <http://www.py.cz>

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20171205/194a117c/attachment.html>


Další informace o konferenci Python