Viacjazyčný reťazec v špecifickej route
- sabrx
- Člen | 47
Ako najlepšie riešiť preklad špecifickej cesty, ako je táto:
$router[] = new Route('category/[<cat>-<title>]', array(
'presenter' => 'Catalog',
'action' => 'default',
));
Problémy:
- Dá sa v jednej route určiť viac verzií category, tzn. niečo ako (category|kategoria|kategorie), aby tieto cesty skočili vždy do tejto jednej routy?
- Jazyk sa ukladá do session, ale v RouterFactory nie je možný prístup k Nette session, keďže presenter ešte neexistuje ⇒ jazyk musí byť súčasťou URL? Podľa jazyka by sa vybral vo funkcii FILTER_OUT správny preklad category.
Vďaka za pomoc.
- greeny
- Člen | 405
- viz Transformace a překlady
- k Session můžeš přistoupit i bez Presenteru, stačí si vyžádat Session v konstruktoru od RouterFactory :)
- Oli
- Člen | 1215
ad 1) Musel by jsi to category dat jako nazev presenteru a potom podle jazyka
zobrazovat presentery z prekladove tabulky nebo
na to jit uplně jinak. Každopádně regulární výrazy nemůžou být na
„text“, ale jdou pouzít na paramtry
v <presenter cateogry|kategoria>
ad 2) Session imho není problém dostat do RouterFactory: https://doc.nette.org/…ttp/sessions
- sabrx
- Člen | 47
Podarilo sa mi to teda dosiahnut tymto sposobom:
$router[] = new Route('category/<cat>-<title>', array(
'presenter' => 'Catalog',
'action' => 'default',
NULL => array(
Route::FILTER_OUT => function(array $params) {
if ($this->lang == "en") {
return $params;
} else {
return null;
}
},
),
));
$router[] = new Route('kategoria/<cat>-<title>', array(
'presenter' => 'Catalog',
'action' => 'default',
NULL => array(
Route::FILTER_OUT => function(array $params) {
if ($this->lang == "sk") {
return $params;
} else {
return null;
}
},
),
));
Problem je len to, ze kolko je jazykov, tolko musi byt aj ciest, a to len pre tuto jednu cestu.
Nejake transformacie som skusal, ale vobec to nefungovalo. V pripade prekladovej tabulky mi nie je jasne, ako obmedzit konkretnu routu na dany presenter, v tomto pripade na Catalog, lebo keby som uviedol ako masku „<presenter>/<cat>-<title>“, tato routa by sa aplikovala aj na ostatne presentery, co je neziaduce.
- greeny
- Člen | 405
Fuj fuj fuj :)
Takhle ti to fakt nefunguje?
$router[] = new Route('<presenter>/<cat>-<title>', [
'action' => 'default',
'presenter' => [
Route::VALUE => 'Homepage',
Route::FILTER_TABLE => [
"kategorie" => "Category", // cz
"kategoria" => "Category", // sk
"category" => "Category", // en
"domu" => "Homepage", // cz
"domov" => "Homepage", // sk
"home" => "Homepage", // en
"clanek" => "Article", // cz
"clanok" => "Article", // sk
"article" => "Article", // en
// ...
],
],
]);
- greeny
- Člen | 405
EDIT: Pozdě sem si přečetl, že to chceš omezit jen na daný presenter, pak je možnost takováhle:
$router[] = new Route('<presenter kategorie|kategoria|category>/<cat>-<title>', [
'action' => 'default',
'presenter' => [
Route::VALUE => 'Category',
Route::FILTER_TABLE => [
"kategorie" => "Category", // cz
"kategoria" => "Category", // sk
"category" => "Category", // en
],
],
]);
- greeny
- Člen | 405
Sorry, chyba se vloudila :)
$router[] = new Route('<presenter kategorie|kategoria|category>/<cat>-<title>', [
'action' => 'default',
'presenter' => [
Route::VALUE => 'Category',
Route::FILTER_TABLE => [
"kategoria" => "Category",
"clanok" => "Article",
],
],
]);
Musíš definovat jen ty přeložené :) a jen pro jeden jazyk ;)
- greeny
- Člen | 405
Pokud máš jen dva jazyky, tak ti stačí to co jsem ti poslal, protože anglický názvy by se měly použít normálně (pokud máš anglický názvy v presenterech).
Pro víc jazyků to je těžší, pokud chceš generovat odkazy mezi danými jazykovými mutacemi. Pak už je lepší vykašlat se na FILTER_TABLE a použít FILTER_IN a FILTER_OUT + nějakej Translator.
IMHO by i na dva jazyky byl lepší translator.
Ale na druhou stranu většina webů nemá lokalizované URL, takže pokud to skutečně nevyžaduješ, tak bych se na to vykašlal a nechal to anglicky :)