Ako na preklady parametrov vo frameworku s dvojsmernym routrom rubrika: Kódování: HTML

Anonym
položil/-a 16.6.2012
 
upravil/-a 16.6.2012

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 sa ArticleController::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.

Komentáře

  • Anonym : Cim viac nad tym uvazujem, prave to riesenie s callbackom by mohlo byt to prave-orechove. 18.6.2012
odkaz
4 Romcok
odpověděl/-a 16.6.2012

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:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.