Ako na preklady parametrov vo frameworku s dvojsmernym routrom rubrika: Kódování: HTML
Majme webovy framework s dvojsmernym routrom a s nadefinovanou routou:
<:lang>/article/<:slug> => 'article/view'
Pre tych co nevedia, obojsmerny router umoznuje:
- Zadat URL
en/article/my-foo-bar-interview. Zavola saArticleController::actionView(). - Vygenerovat si URL z routy. Napr. v YII frameworku:
$this->createUrl('article/view', array('lang'=>$lang, 'slug'=>$slug))
Ak $lang='sk' a $slug='moj-foo-bar-rozhovor', vysledna URL bude sk/article/moj-foo-bar-rozhovor. Mylim, ze na pochopenie to staci.
No a teraz k otazke - niekde na stranke je Widget na prepinanie jazykov. Povedzme klasicke vlajocky vo forme <a href> odkazov. Takyto widget vacsinou iteruje nad zoznamom jazykov aplikacie a pre aktualnu routu vola generovanie URL. Minimalny priklad:
foreach ($languages as $language) { $url = $this->createUrl($this->controller->route, array('lang'=>$language->twoCharCode)); echo "<a href=\"{$url}\">{$language->name}</a>"; }
Toto funguje pre genericke routy, ale pre nasu horeuvedenu so slugom to nebude fungovat - widget musi nejako do createUrl() dostat param spravny $slug - jedinecny pre kazdy jazyk. Mohol by som sice zobrat aktualny, ale to by viedlo k chybnym URL napr. sk/article/my-foo-bar-interview.
Pytam sa preto - ako do widgetu naprogramovat dohladanie spravneho slugu pre kazdy jazyk? Nepytam sa vsak na "nizkourovnove" riesenie (je mi jasne, ze si to musim vytiahnut z nejakej tabulky na zaklade jazyka a nejakeho identifikatora clanku). Moja otazka sa tyka architektury. Moj widget nema ponatia, ze clanky sa routuju cez nejaky slug. V inej sekcii applikacie sa multijazycnost moze aplikovat uplne inak. Nechcem sa dopracovat ku kodu:
foreach ($languages as $language) { $params = array('lang'=>$language->twoCharCode); if ($this->controller->route == 'article/view') { $params['slug'] = $superShinyArticleService->findArticle($id, $language)->slug; } $this->createUrl($this->controller->route, $params); }
Toto uz urcite riesilo milion programatorov. Mna zaujima nejake systemove riesenie - ja neviem, nejaky mixin do Controlleru/Widgetu, alebo event model, mozno ze widget moze obdrzat od aktualnej Controller::action() callback, ktora vrati vsetky params podla $lang. Proste ak mate vyriesenu multijazycnost PARAMETROV v obojsmernych routach, pls share.
Takéto problémy by mal každý lepší framework riešiť na svojom webe.
YII tu: http://www.yiiframework.com/wiki/294/seo-conform-multilingual-urls-langu...
Nette čiastočne tu: http://doc.nette.org/cs/routing#toc-transformace-a-preklady
Komentáře
-
Anonym
:
Toto je prave "staticke" riesenie multijazycnosti. Priklad v Yii je obycajne prepinanie Yii::app()->language pomocou formularika (Widgetu). Ako pisem vyssie, mne ide o prepinatko, ktore spravne do createUrl() vyplni $slug. Ale aj tak dik :)
—
18.6.2012
Pro zobrazení všech 4 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře