Jak na primitivni vicejazycny web?

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

Ahoj,

chtel jsem se zeptat, jak by se udelal opravdu primitivni vicejazycny web. Mel jsem takovou predstavu, ze odkazy by vypadaly nejak takto:

mujweb.cz/cs/about (pro CZ verzi)
mujweb.cz/en/about (pro EN verzi)

s tim ze by bohate stacil jeden presenter ale sablony by byly umisteny v:

templates/presenter/cs/about.latte
templates/presenter/en/about.latte

Lze neco takoveho udelat co nejjednoduseji? neni potreba prekladat v CZ verzi about na o-nas apod. neni potreba vyuzivat prekladove slovniky, nic sloziteho..

Dekuji za tipy, pripadne rady.

Editoval tomasnikl (26. 8. 2011 11:37)

voda
Člen | 561
+
0
-

Viděl bych to napersistentní proměnou $lang, a pak upravit (přepsat) metodu Nette\Application\UI\Presenter::formatTemplateFiles(), aby počítala s proměnou $lang. A samozřejmě nastavit správně routy.

22
Člen | 1478
+
0
-

ehm, proč by se měla přepisovat metoda Nette\Application\UI\Presenter::formatTemplateFiles()? přece stačí upravit akorát routu, nee?

Editoval 22 (26. 8. 2011 11:46)

tomasnikl
Člen | 137
+
0
-

o upraveni routy jsem se jiz pokousel vcera, ale nedarilo se mi. Jak by upravena routa prosim mela vypadat? pripadne, neresilo se na foru neco blizce podobneho? na toto tema nemuzu bohuzel nikde nic najit

uestla
Backer | 796
+
0
-

Třeba nějak takhle:

$router[] = new Route('<lang cs|en>/<action>', array(
	'lang' => 'cs',
	'presenter' => 'Homepage',
	'action' => 'default',
));

V BasePresenteru mít

/** @persistent */
public $lang;

A následně v HomepagePresenteru:

protected function beforeRender()
{
	parent::beforeRender()
	$this->setView( $this->lang . '/' . $this->action );
}

Tím by to mělo brát šablony ze složky s jazykem. Píšu to sem z paty, je možné, že jsem něco opomenul…

tomasnikl
Člen | 137
+
0
-

jo takhle… to dava smysl, az budu mit cas tak vyzkousim, zatim dekuju

voda
Člen | 561
+
0
-

@**22**: Pokud chce mít pro každý jazyk vlastní šablonu. Nebo to jde udělat jak navrhuje uestla.

@**tomasnikl**: Routy si nech až na konec, začni tím ostatním.

22
Člen | 1478
+
0
-

@voda: uestlovo řešeni jsem bral jako best practise, ale ta úprava metody? jak by to mělo prosím vypadat a co je výhodou takové úpravy?

Editoval 22 (26. 8. 2011 13:10)

tomasnikl
Člen | 137
+
0
-

vyzkousel jsem to reseni co psal uestela, ale nejak mi to nefunguje.. moc mi neni jasne, jak HomePresenter vi, ze v

$this->lang

je jazyk. Dal jsem si tedy vypsat:

echo $this->lang;

a i kdyz jsem v url jazyk mel, tak mi to nevypsalo nic.. a tim padem mi to nenacetlo ani pozadovanou sablonu. Reseni od uestely je asi dobre, ale nefunguje mi rozpoznani jazyku, nebude tam nekde chybka?

Editoval tomasnikl (26. 8. 2011 12:56)

22
Člen | 1478
+
0
-

že by sis měl nastavit do $lang nějakou defult hodnotu bych to viděl nebo jak myslíš, že se tam dostane? :-)

Editoval 22 (26. 8. 2011 13:13)

voda
Člen | 561
+
0
-

@**22**: mě ani řešení přes setView nenapadlo, pokud chci jiný umístění šablon, tak jdu automaticky upravit metodu formatTemplateFiles. Úprava je jednoduchá, tačí doplnit $lang:

return array(
	"$dir/templates/$presenter/$this->lang/$this->view.latte"
);

Rovnou jsme odstranil ostatní varianty zápisu, ketrý se stejně nepoužijou.

Editoval voda (26. 8. 2011 13:26)

22
Člen | 1478
+
0
-

jo takhle, už jsem tě pochopil.

nanuqcz
Člen | 822
+
0
-

tomasnikl napsal(a):

vyzkousel jsem to reseni co psal uestela, ale nejak mi to nefunguje.. moc mi neni jasne, jak HomePresenter vi, ze v

$this->lang

je jazyk.

Neví, musíš ho tam dát sám. Třeba takhle:

function startup($lang)   //parametr $lang ti Nette předá automaticky, protože i v routě se jmenuje `lang`
{
    parent::startup();
    $this->lang = $lang;
}
tomasnikl
Člen | 137
+
0
-

dekuji Vam,

vyzkousim az budu mit chvilku

Bernard Williams
Člen | 207
+
0
-

Nazdárek,

přiznám se, že jsem to tady nečetl podrobně, ale pokud se jedná o jednoduché (statické) stránky, tak bych ty jazyky rozdělil třeba na moduly: CzModule, EnModule a pak si stačí hrát jen s routami. Brnkačka.

Bernard

voda
Člen | 561
+
0
-

@**xxxObiWan**: od toho to je ale persitentní proměnná, aby se o to člověk nemusel starat a nastavilo se to samo.

@**Bernard**: pak by ale musel mít v každém modulu presenter, takhle stačí jen jeden.

uestla
Backer | 796
+
0
-

@tomasnikl:

To je zvláštní, že ti to nefunguje. Schválně jsem si to zkusil na skeletonu a jazyk se mi nastavuje – spíš bych to viděl, že HomepagePresenter nedědí od BasePresenteru… ? Případně kde přesně voláš ono echo $this->lang?

@xxxObiWan:

Jinak IMHO není ani třeba nastavovat výchozí hodnotu, protože právě v definici routy se výchozí hodnota předá, čili k naplnění dojde vždy, nemýlím-li se… ?

EDIT: navíc parametry se předávají jen akčním metodám, ne těm společným (startup, beforeRender, aspo.), ne?

@tomasnikl:

Jinak trochu pro vysvětlení – ta provázanost je taková, že v routě je parametr „lang“ a pokud má presenter (na který routa směřuje) persistentní public property se stejným názvem (čili v našem případě „lang“), tak se automaticky naplní.

Editoval uestla (26. 8. 2011 15:01)

tomasnikl
Člen | 137
+
0
-

Ukazi tedy jak jsem to mel:
bootstrap:

// Setup router
$router = $container->router;
//$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
//$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
$router[] = new Route('<lang cs|en>/<action>', array(
        'lang' => 'cs',
        'presenter' => 'Homepage',
        'action' => 'default',
));

BasePresenter:

<?php
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
	public $lang;
}

HomepagePresenter:

<?php

class HomepagePresenter extends BasePresenter
{
	protected function beforeRender()
	{

        parent::beforeRender();
        $this->setView( $this->lang . '/' . $this->action );
        echo $this->lang; // Test
	}


	public function renderDefault()
	{
		$this->template->anyVariable = 'any value';
	}

}

kdyz dam url: localhost/nette/www/cs tak mi to me to redirectne localhost/nette/www (coz je ok). Kdyz tam misto cs dam ovsem en, tak mi to nevypise „en“ jak bych ocekaval.

I presto, ze vidim, ze je dostupny parametr lang s hodnotou en (v debug baru? nebo jak se tomu krumplu tam dole vpravo rika).

a vzdy mi to nacte sablonu Homepage/default.latte a ne Homepage/JAZYK/default.latte

Editoval tomasnikl (26. 8. 2011 15:18)

22
Člen | 1478
+
0
-

a kdo tam bude psát tu anotaci persistent???

Editoval 22 (26. 8. 2011 15:25)

tomasnikl
Člen | 137
+
0
-

jo aha :o) dekuji za info.. jiz to funguje.

uestla
Backer | 796
+
0
-

@tomasnikl:

Ta anotace (tj. ten komentář /** @persistent */ umístěný těsně nad proměnnou public $lang) právě zajistí to automatické naplnění, tak si ho tam doplň.

tomasnikl
Člen | 137
+
0
-

Ano, jiz jsem jej doplnil a vse funguje tak jak by melo, dekuji za informaci, to jsem nevedel a zatim jsem se k tomu neprocetl ani v dokumentaci.

uestla napsal(a):

@tomasnikl:

Ta anotace (tj. ten komentář /** @persistent */ umístěný těsně nad proměnnou public $lang) právě zajistí to automatické naplnění, tak si ho tam doplň.

nanuqcz
Člen | 822
+
0
-

voda napsal(a):

@**xxxObiWan**: od toho to je ale persitentní proměnná, aby se o to člověk nemusel starat a nastavilo se to samo.

Máš pravdu, uteklo mi je že @persistent

voda napsal(a):

navíc parametry se předávají jen akčním metodám, ne těm společným (startup, beforeRender, aspo.), ne?

To jsem nevěděl, musel jsem si to teď zkusit. A máš pravdu :-)

Omlouvám se za mylné informace, zase jsem o něco chytřejší :-)