Preklad url adresy, jak vytvorit link
- saimons
- Člen | 293
Chci se zeptat kdyz si nadefinuju filtry do rout aby mi to bralo i anglictinu (podle dokumentace) jak potom provedu preklad toho skutecneho linku v templatu? Napriklad {link :Front:Clanek:} aby tam bylo {link :Front:Article:}, nejlepe nak pomoci ITranslator? Je to vubec mozne nebo jakym zpusobem se to resi?
- OndrejSlamecka
- Člen | 41
Tohle možné není. Proč bys to taky dělal? Link je vnitřní záležitost aplikace a URL se přeloží sama (v template nic překládat nemusíš, tam používáš vnitřní názvy aplikace).
Editoval OndrejSlamecka (24. 1. 2012 20:28)
- Filip111
- Člen | 244
A co tohle?
https://doc.nette.org/…tion/routing#…
Jestli je to ono, tak tu najdeš i několik zajímavých diskuzí.
- saimons
- Člen | 293
Ok, uz mi to je asi jasne. Ja jsem porad premyslel nad tim, jak routa pozna do jakeho jazyku to ma prelozit. Ale to musim pouzit Route::FILTER_IN ⇒ ‚filterInFunc‘, Route::FILTER_OUT ⇒ ‚filterOutFunc‘, kde si v metodach uz zjistim id jazyka a vratim si co je potreba. Rikam to dobre?
- saimons
- Člen | 293
Mzete mi poradit co mam spatne, myslel jsem si ze by to melo fungovat:
bootstrap.php
$router = $application->getRouter();
$router[] = new Route('<lang [a-z]{2}>/<presenter>/<action>', array(
'lang' => 'cs',
'module' => 'Front',
'presenter' => array(
Route::VALUE => 'Stranka',
Route::FILTER_IN => 'Translator\RouterTranslations::urlToPresenter',
Route::FILTER_OUT => 'Translator\RouterTranslations::presenterToUrl',
),
'action' => 'default',
));
Preklad
<?php
namespace Translator;
use Nette\Object,
Nette\Application\Request;
class RouterTranslations extends Object {
public static $translations = array(
'cs' => array(
'stranka' => 'stranka',
'informace' => 'informace',
),
'en' => array(
'article' => 'stranka',
'informations' => 'informace',
),
);
public static function presenterToUrl($presenter, Request $request) {
$lang = $request->params['lang'];
$table = array_flip(self::$translations[$lang]);
return $table[$presenter];
}
public static function urlToPresenter($url, Request $request) {
$lang = $request->params['lang'];
$table = self::$translations[$lang];
return $table[$url];
}
}
Hlasi mi to:
Argument 2 passed to Translator\RouterTranslations::presenterToUrl() must be an instance of Nette\Application\Request, none given
Jakym zpusobem lze zjistit aktualni jazyk? Musim jeste nekde neco vytvorit v konfiguraci?
Editoval saimons (25. 1. 2012 16:59)
- finwe
- Člen | 58
V tvém případě ti do metody na překlad přijde vždy jen jeden parametr, a to buď část URL, tedy ‚article‘, nebo interní označení presenteru, tedy ‚stranka‘ druhým směrem. Čekat tam presenter a request je lichá domněnka. šlo by udělat
$lang = ... // zjištění jazyka patrně parsováním URI ještě v bootstrapu
...
Route::FILTER_IN => function($urlPart) use ($lang) {
return Translator\RouterTranslations::urlToPresenter($urlPart, $lang); // Změnit rozhraní metody
},
- newPOPE
- Člen | 648
finwe napsal(a):
toto je divoke riesenie. skus si pozriet FilterRoute v podstate je dolezite len toto: Fígl je v tom, že Router zpracuje adresu normálně a filtračním funkcím předává parametr i výsledný PresenterRequest a následně vracenými hodnotami přepíše původní.
ja som nieco take cez vikend potreboval a je to presne to co potrebujem. dostat jazyk (vsetky parametre) do filter in filter out
Editoval newPOPE (30. 1. 2012 14:33)
- saimons
- Člen | 293
newPOPE napsal(a):
finwe napsal(a):
toto je divoke riesenie. skus si pozriet FilterRoute v podstate je dolezite len toto: Fígl je v tom, že Router zpracuje adresu normálně a filtračním funkcím předává parametr i výsledný PresenterRequest a následně vracenými hodnotami přepíše původní.
ja som nieco take cez vikend potreboval a je to presne to co potrebujem. dostat jazyk (vsetky parametre) do filter in filter out
Ajo tohle jsem mel na mysli, jen jsem nak zapomel na tu tridu, myslel jsem si, ze je to soucasti Nette. :) Diky.