Viacjazyčný reťazec v špecifickej route

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

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:

  1. 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?
  2. 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
+
0
-
  1. viz Transformace a překlady
  2. k Session můžeš přistoupit i bez Presenteru, stačí si vyžádat Session v konstruktoru od RouterFactory :)
Oli
Člen | 1215
+
0
-

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

jiri.pudil
Nette Blogger | 1029
+
0
-

ad 1) Můžeš si z toho category udělat foo parametr

sabrx
Člen | 47
+
-1
-

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
+
0
-

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
+
0
-

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
        ],
    ],
]);
sabrx
Člen | 47
+
0
-

@greeny: Skúšal som tvoje riešenie, ale vždy to vráti poslednú položku, tzn. kategoria sa preloži na category. Problém je aj generovanie odkazov, všetky by sa asi museli pracne prepísať v šablónach…

greeny
Člen | 405
+
0
-

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 ;)

sabrx
Člen | 47
+
0
-

Takže filtrovaciu tabuľku treba podhodiť vždy len pre aktuálny jazyk, ak to správne chápem.

greeny
Člen | 405
+
0
-

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 :)