Prekladaci makro {_ …} a helpery

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

Zcela opatrne bych se zeptal na soucasnou implementaci kolem makra {_ ...} – tedy neceho, co vola nejake prekladatko. Uz nejakou dobu koukam, jak se mi na jednom webu nepreklada retezec. Celou dobu jsem to povazoval za chybu gettextu a vubec to neresil. Byl jsem ale donucen se tim zaobirat, a zjistil jsem prekvapivou vec:

{_"Ahoj svete"|magic}

vyprodukovalo:

echo $template->translate(magic("Ahoj svete"));

misto pozadovaneho:

echo magic($template->translate("Ahoj svete"));

Tedy nejprve se na retezec aplikoval helper, a vysledek se poslal do translatoru. Takto by to s makrem pro vypis a helperem melo fungovat obecne, ale v pripade {_ ...} toto makro povazuji za identicke k { } s tim rozdilem, ze se retezec prelozi. Logicky je to ale pro mne to same (vypis hodnoty). Proto me toto chovani prekvapilo.

Workaround byl napsat do sablony:

{$template->translate("Ahoj Svete")|magic}

Takove reseni ale zapricini to, ze az budu priste zjistovat vyskyty _( ), tak zrovna v tomto pripade silne „utru“.

Zajimalo by mne tedy, jak si stoji Nette 2.0 v tomto pripade :) Nemam ted zrovna silu stavajici web prepisovat do dvojky.


A abych byl konkretni a bylo zcela jasne, o co mi jde: mel jsem retezec, ktery obsahoval znacky rikajici, ze jde o odkaz. Napriklad text „Toto je [odkaz]:[https://www.nette.org]“. Helper link pak mel na starost z retezce udelat „<a href="...">odkaz</a>“.

V gettext je definovano, ze:

msgid "Toto je [odkaz]:[https://www.nette.org]"
msgstr "This is [link]:[https://www.nette.org]"

:) do gettextu ale byl poslan jiz retezec, ktery prolezl helperem link – tedy „Toto je <a href="...">odkaz</a>“ ke kteremu samozrejme nebyl definovan msgid.

Pouziti:

{_"Toto je [odkaz]:[https://www.nette.org]"|link}

Editoval wdolek (22. 11. 2011 19:52)

voda
Člen | 561
+
0
-

Nevím v čem je rozdíl, ale mně se to chová v Nette 0.9 i 2.0 správně. V obou případech se to přeloží na

$template->magic($template->translate("Ahoj svete"))

OT: nebylo by lepší mít v gettextu jen první část textu a odkaz jako parametr helperu?

{_"Toto je [odkaz]"|link:'https://www.nette.org'}
wdolek
Člen | 331
+
0
-

voda napsal(a):

OT: nebylo by lepší mít v gettextu jen první část textu a odkaz jako parametr helperu?

{_"Toto je [odkaz]"|link:'https://www.nette.org'}

:) asi ano… Ale co sem s tim Nette udelal, ze mi to preklada jinak (jak popisuji) ;D

voda
Člen | 561
+
0
-

wdolek napsal(a):
Ale co sem s tim Nette udelal, ze mi to preklada jinak (jak popisuji) ;D

Nevím, křišťálová koule se mi někam zakutálela :)

Verze Nette, jaký používáš překladač, jak ho nastavuješ, nějaká vlastní makra, …?

Patrik Votoček
Člen | 2221
+
0
-

a nechová se to ve 2.0 jinak než v 0.9.x?

voda
Člen | 561
+
0
-

Patrik Votoček napsal(a):

a nechová se to ve 2.0 jinak než v 0.9.x?

Zkoušel jsem obě verze a fungovalo mi to vždy správně.

wdolek
Člen | 331
+
0
-

voda napsal(a):

Verze Nette, jaký používáš překladač, jak ho nastavuješ, nějaká vlastní makra, …?

Take nemam kristalovou kouli po ruce – do libs jsem si nenahral zadne readme.txt ani version.txt a v hlavickach souboru je rok 2008/2009… ale hle! Nasel jsem:

final class Framework {
    ...
    const VERSION = '0.9';
    const REVISION = 'c82239a released on 2009-08-17';
    const PACKAGE = 'PHP 5.2';
    ...
}

Horsi je to ale s Translatorem – ten nema v sobe lautr zadnou informaci. Ale dost mozna je to nejaky pra-predek tohoto: https://componette.org/search/?… …

Nemyslim si ale, ze je to zalezitost Translatoru jako takoveho – ten ma jen metodu translate a par vecicek kolem. Registrace translatoru v sablone take neni nic extra sloziteho. To podstatne je ve zpracovani sablony frameworkem.

Web uz si tak nejak zahniva tretim rokem – je dost mozne, ze jsem nekde necou vystoural a nepoznacil si co sem presne udelal :) kdo vi. Chtel jsem se jen ujistit, ze se soucasne Nette chova ocekavatelne – coz bylo potvrzeno.

voda
Člen | 561
+
0
-

Tak jestli stačí jako výsledek, že teď to funguje správně. Já testoval aktuální 0.9.x verzi, tak je možné že to dříve fungovalo jinak.