Jak zjistit jazyk v routeru?
- h4kuna
- Backer | 740
Tohle řeším taky, stávájící router jsem si upravil, že si do callbacku FILTER_OUT přidám $refUrl a taky jsem umlčel výstup, protože funkce rawurldecode očekává jen jeden parameter, tím vím kam aplikace chce směrovat a podle toho sestavím url. A pro FILTER_IN musím mít k dispozici všechny jazykový mutace protože nevím co přijde. Nic lepšího nemám, zatím to maká.
$params[$name] = @call_user_func($meta[self::FILTER_OUT], $params[$name], $refUrl);
Editoval h4kuna (5. 3. 2013 9:38)
- h4kuna
- Backer | 740
Protože ve třídě route je celkem dost statických a zároveň private věcí tak si celou třídu zkopíruj, přejmenuj ji podle sebe a zaměň ten řádek viz výše. Při instancovaní rout použij novou třídu a pro vlastní callbacky použij FILTER roluj trošku níže „Kromě překladového slovníku v podobě pole lze nasadit i vlastní překladové funkce a filtry.“
Editoval h4kuna (5. 3. 2013 12:50)
- danik
- Člen | 56
Ahoj vespolek,
resim neco dost podobnyho. Diky tomu, ze muzu v config.neon predat do router
factory celkem co chci, muzu ji treba predat instanci
Nette\Localization\ITranslator
a tu potom pri definici rout vyuzit
ve filtrech rout. Pripada mi to jako nejspravnejsi postup – precijen,
prekladam, tak bych mel pouzit prekladac.
No ale ten translator musi odnekud vzit jazyk. Bylo by tudiz cool, kdyby
filtrovaci funkce umely pristupovat k ostatnim (jiz znamym) parametrum, ktere
jsme z routy vyparsovali. Napriklad routa
[<lang [a-z]{2}>/]<presenter>/<action>
, ktera by
pro <presenter>
a <action>
mela nastaveny
filtrovani pomoci translatoru. Pak by teoreticky pri filtrovani tech parametru
uz mohl <lang>
bejt vyparsovanej a bud mit nejakou hodnotu
nebo bejt NULL (pokud neni v URL zadanej).
Jedno reseni, ktery me napada, je mit „filtr“ funkci i pro parametr
<lang>
, ktera by ale nic realne nefiltrovala, jen by
nastavovala jazyk translatoru. Translator samozrejme ma nejakej „vychozi“
jazyk (tzn. jazyk kterej je pouzitej primo ve zdrojaku), takze by absence
parametru <lang>
v URL nemela vadit.. jdu to zkusit :o)
- jan.vince
- Člen | 8
Řešil jsem taky překlad adres pro různé jazyky, ale protože mám jen CS/EN a menu s pár položkami, chtěl jsem (zkusit) kód udržet v RouterFactory.
Potřebuji adresy:
- /kontakt
- /en/contact
$router[] = new Route('<lang en>/<presenter>/<action>', array(
'module' => 'Front',
'presenter' => array(
Route::VALUE => 'Homepage',
Route::FILTER_TABLE => array(
'contact' => 'Kontakt',
'about' => 'Omne',
'home' => 'Homepage',
)),
'action' => 'default',
'lang' => NULL
));
$router[] = new Route('[<lang [a-z]{2}>/]<presenter>/<action>', array(
'module' => 'Front',
'presenter' => 'Homepage',
'action' => 'default',
'lang' => 'cs'
));
Pro obsáhlejší menu by byl lepší překlad přes Translator, pro víc jazyků určitě Routování s více parametry.