Portál AbcLinuxu, 10. května 2025 02:39

Dotaz: Python a gettext

21.8.2005 17:19 trancelius | skóre: 22
Python a gettext
Přečteno: 160×
Odpovědět | Admin
Zdravím, Ve svým programu mám dejme tomu print _("Hello "+green("world")) a chtěl bych, aby v gettext katalogu bylo jen
msgid "Hello world"
msgstr "Nazdar světe"
Je to nějak možný ? Takhle mám obarveno celkem dost stringů...
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.8.2005 17:33 Pinky | skóre: 30
Rozbalit Rozbalit vše Re: Python a gettext
Odpovědět | | Sbalit | Link | Blokovat | Admin
Myslím že to nejde. Musel by jsi z toho udělat jeden řetězec který by třeba obsahoval speciální řídící znaky které by ti text obarvyli (jestli tohle jde to nevím)
21.8.2005 17:41 trancelius | skóre: 22
Rozbalit Rozbalit vše Re: Python a gettext
Šlo by to nějak takhle:
print _("Hello %s") %("world")
... ale pak by "world" nebylo lokalizovaný, pokud bych ho nedal do katalogu taky... budu muset udělat nějakej kompromis, něco jako obarvovat pouze příkazy, switche atd :)
21.8.2005 17:44 trancelius | skóre: 22
Rozbalit Rozbalit vše Re: Python a gettext
Oprava:
print _("Hello %s") %(green("world"))
21.8.2005 17:47 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Python a gettext
Touto cestou se nevydávej, jen bys zadělával překladatelům (a sobě) na problémy.
21.8.2005 17:46 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Python a gettext
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ne, to nejde a navíc je tohle skládání stringů po kouskách přesně to, co se v manuálu gettextu důrazně nedoporučuje. Když bude v jiném jazyce zapotřebí jiný slovosled (tj. něco jako Světe, nazdar!), tak jsi vyrobil nepřeložitelnou hlášku. Kromě toho rozkouskování citelně zvyšuje počty řetězců, které jsou stejné v angličtině, ale musejí se překládat různě do jiných jazyků (světe vs. svět), takže vyžadují zjednoznačující prefixy, sgettext(), etc.

Správný postup je používat nějaký markup:
print _(colorize("Hello <green>world</green>"))
takže překladatel pak má k překladu celou hlášku a markup zachová. Přičemž _(colorize(...)) může klidně být jedna funkce.
21.8.2005 18:21 trancelius | skóre: 22
Rozbalit Rozbalit vše Re: Python a gettext
Aha, takže něco jako
def colorize(text):
	return text.replace("<green>", "[zelená]").replace("</green>", "[/zelená]")
kde to v těch [ ] jsou escape sekvence daných barev... ?
Ku8aZ avatar 21.8.2005 18:43 Ku8aZ | skóre: 17
Rozbalit Rozbalit vše Re: Python a gettext
Řekl bych, že Yeti spíš myslel v řetězcích TAGy ponechávat a funkce colorize by provedla parsování těchto řetězců a podle tagů by volala příslušné funkce - čili asi něco jako HTML.
Čeho se vlastně člověk bojí, když se bojí tmy...? jabber: ku8az AT jabbim.cz
21.8.2005 18:52 trancelius | skóre: 22
Rozbalit Rozbalit vše Re: Python a gettext
Nebo tak ... to už je detail. Mě připadá jednodušší udělat slovník, kterej pak parser nasází do stringu, něco jako barvy = { '<green>': '\escape sekvence zelené', ... atd }
21.8.2005 19:47 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Python a gettext
Takhle by to moc nefungovalo.
print colorize(_("Hello <green>world</green>"))
je lepší.

colorize() může klidně vypadat jako jednoduché nahrazení <green> -> \e[32m, </green> -> \e[0m, etc. (raději ovšem podle termcapu).
21.8.2005 20:59 trancelius | skóre: 22
Rozbalit Rozbalit vše Re: Python a gettext
Tak... tohle je výplod mé fantazie a asi je to totální slátanina, ale nic lepšího mě nenapadá :D
def colordict(text):
	escapes = {
	'<Cg>': '\x1b[32;01m',
	'<Cy>': '\x1b[33;01m',
	'<Cr>': '\x1b[31;01m',
	'<Cb>': '\x1b[34;01m',
	'<CB>': '\x1b[01m',
	'<C/>': '\x1b[39;49;00m'
	}
	return escapes[text.group()]

def outform(text):
	p = re.compile(r'<C.>')
	return p.sub(colordict, text)

print outform("Něco <Cr>červenýho<C/>...")
22.8.2005 09:40 trancelius | skóre: 22
Rozbalit Rozbalit vše Re: Python a gettext
Ráno moudřejší večera, takhle je to hezčí...
colortags = {
'<Cg>': '\x1b[32m',
'<Cy>': '\x1b[33;01m',
'<Cr>': '\x1b[31;01m',
'<Cb>': '\x1b[34;01m',
'<CB>': '\x1b[01m',
'<C/>': '\x1b[39;49;00m'
}

def style(text):
	return re.compile('<C.>').sub(lambda text: colortags[text.group()], text)
Slovník s tagy se definuje jen jednou a je to prakticky v jedné funkci :)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.