Jak na primitivni vicejazycny web?
- tomasnikl
- Člen | 137
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
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.
- uestla
- Backer | 799
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
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)
- voda
- Člen | 561
@**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)
- nanuqcz
- Člen | 822
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;
}
- Bernard Williams
- Člen | 207
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
- uestla
- Backer | 799
@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
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)
- tomasnikl
- Člen | 137
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ěnnoupublic $lang
) právě zajistí to automatické naplnění, tak si ho tam doplň.
- nanuqcz
- Člen | 822
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ší :-)