Mazagran – translation toolkit pre nette aplikacie

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
bazo
Člen | 620
+
0
-

Ahojte,

cez vikend som spiskal http://mazagran.eu (verzia alpha1), aplikaciu na preklad inych aplikacii. Pouziva sa spolu s Mazagran translation kitom https://github.com/…/translation

princip je podobny ako u gettextu, povodne som tvoril riesenie na zaklade gettextu, ale neslo mi zo skompilovaneho .mo vycitat kontexty, tak namiesto studia formatu som sa rozhodol vytvorit vlastne riesenie.

vela veci v interface chyba, este to planujem zwebsocketovat, namiesto ajaxu.

co to vie:

  • automaticky extrahovat retazce na preklad zo zdrojakov(vdaka http://packagist.org/…xt-extractor)
  • vytvorit sablonu na preklad, ktora sa da nahrat do Mazagranu
  • vytvorit jazykovu verziu na preklad, da sa prekladat rucne, v Mazagrane, compiler automticky doplni pocet pluralov a pluralove pravidlo
  • skompilovat subor jazykovej verzie do slovnika pre pouzitie s translatorom

toto vsetko zvlada aj online appka, ktora ma rozhranie velmi podobne poeditu.

co chyba

  • skratky do nette a latte na oznacovanie prekladov
  • moznost prekladov v kontexte
  • spravne naformatovane pluralove pravidla, aby im rozumelo php(viac ternarnych vyrazov potrebuje doplnit zatvorky)

co to bude vediet(mozno :D)

  • extrahovane retazce nahrat priamo do Mazagranu
  • commenty pre pri prekladoch
  • sprava dalsich spolupracovnikov a prekladatelov, moznost obmedzit pristup len na konkretny preklad
  • preklad stahovany priamo zo servera(samozrejme cachovany na klientovi)
  • automaticke upozornenie klienta o novej verzii prekladu – postback na custom url

format sablon, prekladov je zalozeny na neone.

bugy:

  • urcite vela
  • skompilovany slovnik zo servera nie je totozny so slovnikom vytvorenym pomocou compilera(neviem preco)

slovnik je len serializovana trieda translator s prekladmi a indexom contextovych sprav

co si o tom myslite?

Editoval bazo (19. 8. 2012 14:13)

Filip Procházka
Moderator | 4668
+
0
-

Chtěl bych vidět nějaké screeny. Regl jsem se a při přidávání překladu cs mi to hodilo 500 :)

Vytvořil jsem novou zprávu. Ta se přidala 2x – jako translated a untranslated a pak když jsem u té prvni odeslal něco do formuláře, tak se to uložilo do té druhé.

Každopádně je to zajímavý počin a to webové rozhraní je příjemné. Chtělo by to na tom webu nějaký „článek“ se screeny kde bys popsal (očekávané) workflow.


Má to ovšem celé jeden zásadní háček. Konkrétně Extractor. Vytahovat texty z kódu je hodně špatný nápad. Jeden příklad za všechny:

"text" . $text . "text";

Daleko lepší přístup je „extrahovat“ tyhle slovníky „za běhu“. Zkrátka pustíš aplikaci a všechny požadavky na překlad, které nemají odpovídající záznam, se někam uloží bez překladu.

Stejně musíš všechny stavy aplikace otestovat. Ať už ručně nebo automatizovaně. Takže všechny texty ti musí projít přes translator.

Pak už je to hračka.

Editoval HosipLan (19. 8. 2012 14:49)

bazo
Člen | 620
+
0
-

HosipLan napsal(a):

Chtěl bych vidět nějaké screeny. Regl jsem se a při přidávání překladu cs mi to hodilo 500 :)

to bude sposobene tymi pravidlami, plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; takuto rovnicu php nevie spravne vyhodnotit. priznam ze cs som nefixoval :D tych jazykov je strasne vela, asi odtial vyberiem nejake najpouzivanejsie a tie poriadne otestujem. alebo teda prijimam pull requesty na opravu :)

Vytvořil jsem novou zprávu. Ta se přidala 2x – jako translated a untranslated a pak když jsem u té prvni odeslal něco do formuláře, tak se to uložilo do té druhé.

toto je velmi zaujimave. tuto bude nejaky skaredy bug.

Každopádně je to zajímavý počin a to webové rozhraní je příjemné. Chtělo by to na tom webu nějaký „článek“ se screeny kde bys popsal (očekávané) workflow.

diky. ked to este trosku odladim pridam screeny.


Má to ovšem celé jeden zásadní háček. Konkrétně Extractor. Vytahovat texty z kódu je hodně špatný nápad. Jeden příklad za všechny:

"text" . $text . "text";

Daleko lepší přístup je „extrahovat“ tyhle slovníky „za běhu“. Zkrátka pustíš aplikaci a všechny požadavky na překlad, které nemají odpovídající záznam, se někam uloží bez překladu.

Stejně musíš všechny stavy aplikace otestovat. Ať už ručně nebo automatizovaně. Takže všechny texty ti musí projít přes translator.

Pak už je to hračka.

vytahovanie texty za behu je rozhodne dobry napad. takto by slo prekladat aj texty vynimiek.
neviem aky je problem v tvojom pripade, ani jeden z tych textov by nebol vyextrahovany. texty musia byt oznacene na preklad teda

	{_"text" . $text . "text"}

neviem ako toto skonci, ale je to chyba programatora ked to tak zapise. extractor je presne ten isty gettext extractor ktory tu uz dost dlho koluje v doplnkoch. toto este uvediem v readme a v prislusnych triedach.

inak diky, slo mi hlavne o zhodnotenie napadu.

bazo
Člen | 620
+
0
-

ok, opravil som tie 500ky.

HosipLan napsal(a):

Vytvořil jsem novou zprávu. Ta se přidala 2x – jako translated a untranslated a pak když jsem u té prvni odeslal něco do formuláře, tak se to uložilo do té druhé.

toto fakt neviem ako sa ti podarilo. pri pridani rovnakeho textu vyskoci vynimka

redhead
Člen | 1313
+
0
-

Eh, vytvořil jsem projekt, šel jsem do Translations a po přidání nové ‚cs‘ to spadlo na 500 :)

bazo
Člen | 620
+
0
-

aha, push na zly server :D a este aj packagist blbne.

uz by to malo byt ok

a treba sa znova prihlasit

Editoval bazo (19. 8. 2012 18:30)

Teyras
Člen | 81
+
0
-

Má to ovšem celé jeden zásadní háček. Konkrétně Extractor. Vytahovat texty z kódu je hodně špatný nápad. Jeden příklad za všechny:

"text" . $text . "text";

Daleko lepší přístup je „extrahovat“ tyhle slovníky „za běhu“. Zkrátka pustíš aplikaci a všechny požadavky na překlad, které nemají odpovídající záznam, se někam uloží bez překladu.

Pokud chci tohle překládat, použiju sprintf(). Když překládáš „za běhu“, těžko získáš definitivní šablonu překladu, což je pro lokalizaci docela užitečná věc. Teda, zíksat tu šablonu můžeš, ale vznikne jako vedlejší produkt testů – není to trochu nechutný?

Filip Procházka
Moderator | 4668
+
0
-

Pokud chci tohle překládat, použiju sprintf().

Pravda. To ale můžu v obou případech.

Když překládáš „za běhu“, těžko získáš definitivní šablonu překladu, což je pro lokalizaci docela užitečná věc. Teda, zíksat tu šablonu můžeš, ale vznikne jako vedlejší produkt testů – není to trochu nechutný?

Ne, proč? V praxi to funguje perfektně.

pekelnik
Člen | 462
+
0
-

Sorry ale tohle mi neda ;)

Tahat preklady za behu je kravina!

Nutnost „zpusobit“ vsechny stavy aplikace kvuli prekladu je skutecna zhovadilost, protoze:

  1. nektere stavy nasimulujes skutecne tezko („Na vanoce…“, „Pocitac je vypnuty…“)
  2. prekladat "text" . $text . "text" je nesmysl, protoze to v podstate nikdy neprelozis, protoze nevis co :D tohle se resi parametrizovanym prekladem: "text %s text", $text
Ot@s
Backer | 476
+
0
-

pekelnik napsal(a):

Sorry ale tohle mi neda ;)

Tahat preklady za behu je kravina!

Určitě není :-) Souhlasím však s tím, že parametrizované stringy je třeba hnát přes sprintf(). Při testování aplikace je stejně nutné vyzkoušet všechny její stavy, takže tím automaticky dostanu všechny stringy do slovníku. To je má osvědčená praxe.

Filip Procházka
Moderator | 4668
+
0
-

@pekelnik: to mi jako chceš říct, že napíšeš kód, který poběží jen o vánocích a dopředu to neotestuješ? Ale prosimtě :)

Ovšem uznávám, že můj extrémní příklad, se kterým si extractor neporadí, je maličko vykonstruovaný :) Na druhou stranu, stále si stojím za tím, že ukládat řetězce pro překlad za běhu je systémovější a výhodnější.

Editoval HosipLan (20. 8. 2012 9:56)

Teyras
Člen | 81
+
0
-

@HosipLan: tak si představ, že s tebou na projektu spolupracuje překladatel a zvaž tohle:

  1. používáš normální gettext – „Bohužel používáme souborové formáty, které nepodporuje xgettext, takže místo něj spusťte tenhle skript a vygeneruje vám to *.pot“
  2. extrahuješ za běhu – „Budete si muset nainstalovat PHPUnit a spustit všechny testy, pokud nějaký selže, tak si ten katalog asi holt neaktualizujete…“
Filip Procházka
Moderator | 4668
+
0
-

„Tady máte administraci překladů a překládejte“ – kde je problém? Proč by překladatel měl pouštět testy?

Teyras
Člen | 81
+
0
-

HosipLan napsal(a):

„Tady máte administraci překladů a překládejte“ – kde je problém? Proč by překladatel měl pouštět testy?

Jo, to je taky řešení, to je fakt. Jediná nevýhoda je, že tím vynucuješ použití tvého administračního nástroje místo standartního gettextu, ale to už je jedno. Pořád ale nechápu, jak můžeš mluvit o systémovým řešení, když de facto spojuješ dva úplně nesouvisející celky – testování a překlad.

Filip Procházka
Moderator | 4668
+
0
-

Pořád ale nechápu, jak můžeš mluvit o systémovým řešení, když de facto spojuješ dva úplně nesouvisející celky – testování a překlad.

Ty netestuješ aplikaci, když ji vyvíjíš? Třeba tím, že si otevřeš stránku a zkusíš odeslat formulář?

Když aplikaci spustíš a zavolá se ti někde vevnitř

$translator->translate($something, array($param1, $param2, $param3)); // třeba

tak můžeš udělat dvě věci

  • podíváš se do slovníku a vrátíš překlad, pokud není, vrátíš předaný řetězec (prevence selhání)
  • pokud překlad neexistuje, tak vložíš překládaný text do slovníku

V administraci si otevřeš slovník, koukneš co přibylo (administrace pozná podle data v databázi) a překládáš. Tohle se absolutně vůbec nevylučuje s gettextem. Můžeš si nechat vygenerovat slovník v libovolném formátu a poslat ho překladateli a pak ho zase nahrát do aplikace. Kde je problém?

Teyras
Člen | 81
+
0
-

Pořád je to náchylnější k lidské chybě. Asi nevěřím, že bych dokázal projít všechny stavy aplikace, ve kterých může být něco k překladu, bez automatizovaného nástroje a něco nevynechat. Je pro mě zkrátka stravitelnější, když si můžu katalog nechat jednorázově vygenerovat.

bazo
Člen | 620
+
0
-

nic nebrani tomu, aby fungoval extractor a aj vycucavaci translator zaroven a aby sa doplnali. mne osobne pride jednoduchsie si nechat texty vyextrahovat ako vsetko preklikavat. hlavne ked su texty aj v emailoch a inych veciach, co sa nedaju vzdy rucne nasimulovat alebo to zaberie dlhy cas a vela namahy.

Tomas P
Člen | 27
+
0
-

Oba pristupy (extrakcia slovnika z kodu, runtime tvorenie slovnika) sa pouzivaju, ziadny z nich nie je vyslovene zly (noflame).
Tiez si myslim ako bazo ze je dobre podporovat oba pristupy. Tiez mam radsej priamu extrakciu z kodu (pouzival som predtym xgettext) a bez jej moznosti by som povazoval preklady za tazsie.

vyhoda extrakcie – vygeneruje sa na aktualnej verzii aplikacie, nic z toho nechyba (pri dodrzani konvencii)
vyhoda postupneho tvorenia slovnika – da sa prelozit cokolvek iduce cez translate funkciu (obsah premennych)
nevyhoda postupneho tvorenia slovnika – neda sa rozlisit, ktore slova uz v aplikacii niesu, teda slovnik bude rast, az kym sa nenecha vygenerovat znovu od zaciatku (rovnako ako pri extrakcii), hrozi ze na nedostane na vsetky stringy, ktore sa zobrazuju/prekladaju v specialnych pripadoch (rozne chyby, maily a pod).

Teyras
Člen | 81
+
0
-

@bazo: pokud máš v plánu podporovat oba přístupy, nemá cenu se tu dohadovat, který je lepší… Konec konců, to je asi nejlepší řešení

bazo
Člen | 620
+
0
-

Zdravim,

takze webove rozhranie bolo jemne updatovane.

zmeny:

  • uzivatelom pribudol nick, tym co mate ucty som nicky spravil podla emailu
  • gravatar v user menu
  • mozno importovat prekladove templaty
  • vlastnici projektu ho mozu zmazat
  • je mozne pridat do projektu dalsieho administratora alebo prekladatela, s obmedzenymi pravami pristupu
  • prekladacie rozhranie dostalo strankovanie
  • pribudol stream aktivit na projektoch
  • nejake zmeny pod kapotou

ak sa niekomu chce tak testujte, hackujte.

bazo
Člen | 620
+
0
-

extractor uz vie posielat vyextrahovane retazce na server