Flow routování, šablon a jazyků

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

Dobrý den,

rád bych se poradil, jak řešit následující situaci. Mám fyzickou stránku:

domain.tld/cs/doprava

Šablona stránky se setuje v presenteru, routing vypadá zatím takto (provizorně):

$router[] = new Route('cs/doprava', "Delivery:default");

Stránka je plná textů a obrázků + interkativního obsahu v HTML. Jak by jste řešili stav, kdy chcete udělat en + de verzi (identicky, jiný jazyk a URL + meta)? Dávat text do lang-u (neon) mi přijde nesmysl, váhám mezi použití DB, popřípadě dalších šablon. Pokud bych vybral fyzické šablony, jak řešit URL v routeru?

Díval jsem se na vendor Kdyby/Translation, ten by to měl umět, není mi však jasné, jak si nastavit jinou URL, tzn:

$router[] = new Route('[<locale=cs>]/doprava', "Delivery:default"); // Zavolá se metoda renderDefault() z DeliveryPresenter

$router[] = new Route('[<locale=en>]/delivery', "Delivery:default"); // toto nebude fungovat

Volat metodu např. renderDefaultCS a změnit v routeru?

Cíl je, aby v presenteru i routeru bylo co nejméně „balastu“.

greeny
Člen | 405
+
+1
-

Já bych normálně udělal v presenteru něco jako:

<?php

if (file_exists($filename = __DIR__ . '/templates/Delivery/default.' . $this->locale '.latte')) {
	$this->template->setFile($filename);
} else {
	$this->error('Not existing localization');
}

?>
Zdeno1981
Člen | 115
+
+2
-

Ahoj @DanHundrt,

řešení pro fyzické stránky je celkem jednoduché v presenteru budeš potřebovat parametr $lang, viz https://doc.nette.org/…n/presenters#…

Šablonu pak budeš určovat dle toho parametru, za předpokladu, že názvy šablon budeš mít Delivery.cs.latte, Delivery.en.latte atd…

public function beforeRender()
{
	parent::beforeRender();

		// Nastav si dle toho šablonu.
		$this->setView($this->lang);

		// kdyby jsi potřeboval parametr lang v šabloně.
		$this->template->lang = $this->lang;
}

Jazyky v šabloně pak můžeš takhle přepínat:

<a n:href="this, 'lang' => 'cs'">Czech</a>
<a n:href="this, 'lang' => 'en'">English</a>

Routa ti pak bude stačit jedna:

$router[] = new Route('[<lang=cs cs|de|en>]/doprava', "Delivery:default");

Snad jsem ti pomohl :)

Editoval Zdeno1981 (13. 2. 2017 10:50)

Dan Hundrt
Člen | 74
+
0
-

Super díky, moc, zítra zkusím.

Šablonu pak budeš určovat dle toho parametru, za předpokladu, že názvy šablon budeš mít Delivery.cs.latte, Delivery.en.latte atd… Tady má ještě mám dotaz, jestli půjde měnit URL, něco jako:

  1. cs/doprava
  2. en/delivery
  3. de/lieferung

Router v této konfiguraci bude vracet cs/doprava vždy, jestli se nepletu:

$router[] = new Route('[<lang=cs cs|de|en>]/doprava', "Delivery:default");
$router[] = new Route('[<lang=cs cs|de|en>]/delivery', "Delivery:default");
$router[] = new Route('[<lang=cs cs|de|en>]/lieferung', "Delivery:default");

Tady musím definovat v Presenteru pro každou url metodu render zvlášť?

Díky moc :-)

Editoval Dan Hundrt (13. 2. 2017 23:09)

Marek Bartoš
Nette Blogger | 1264
+
0
-

@DanHundrt tak, jak jsi to zapsal ti to matchne cs/doprava, de/doprava, en/doprava a pro ty další 2 to samé (cs/delivery, atd.)

To, co hledáš jsou transformace a překlady
Pomocí callbacku si parametry přeložíš a zkontroluješ, zda jsou ve stejném jazyce.

Eventuální a jednodušší varianta je si nadefinovat routu pro každý jazyk zvlášť

$router[] = new Route('[<lang=cs>]/doprava', "Delivery:default");

Editoval Mabar (14. 2. 2017 0:30)

Dan Hundrt
Člen | 74
+
0
-

Jo teď jsem na to zrovna narazil, sorry :-)

Dám na tebe, nasetuji zvlášť.

Díky