Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] 1.4 Zmiana języka strony
Forum PHP.pl > Forum > PHP > Frameworki
Micchaleq
Witam serdecznie,


Mam pewien problem nie wiem jak to rozwiązać.

Otóż zrobiłem sobie tłumaczenie strony i chciałbym aby uzytkownik miał możliwość wyboru języka ( to normalne )

język ustawiam sobie za pomocą
$this->getUser()->setCulture('en');

aby go zmienić muszę oczywiście podmienić en na inny, ale po tym muszę wyczyścić pamięć.

Jak teraz zrobić tak by po kliknięciu użytkownik widział ten język który chce widzieć?

W sumie to problemem dla mnie jest czyszczenie sama akcja(kliknięcie ) i powrót są oczywiste.
chemik1982
Ja to rozwiązałem w taki sposób. W app.yml mam zdefiniowane języki:
  1. all:
  2. cultures:
  3. pl:
  4. title: polski
  5. panel_title: polski
  6. image: pl.png
  7. default: true
  8. en:
  9. title: english
  10. panel_title: angielski
  11. image: gb.png
  12. default: false
  13. de:
  14. title: deutsch
  15. panel_title: niemiecki
  16. image: de.png
  17. default: false
  18. ru:
  19. title: русский язык
  20. panel_title: rosyjski
  21. image: ru.png
  22. default: false


Flagi na froncie pokazuję korzystając z komponentu:

  1. public function executeSwitchI18n() {
  2. $this->routing = sfContext::getInstance()->getRouting();
  3. $uri = $this->routing->getCurrentInternalUri();
  4. $pathinfo = $this->routing->parse($this->request->getPathInfo());
  5. unset($pathinfo['module']);
  6. unset($pathinfo['action']);
  7. unset($pathinfo['sf_culture']);
  8. unset($pathinfo['_sf_route']);
  9. $this->pathinfo = $pathinfo;
  10. $this->module = $this->getRequest()->getParameter('module');
  11. $this->action = $this->getRequest()->getParameter('action');
  12. $this->routingName = $this->routing->getCurrentRouteName();
  13. $this->cultures = sfConfig::get('app_cultures');
  14. }


Podam Ci jeszcze routing.yml

  1. homepage:
  2. url: /:sf_culture/
  3. param: { sf_culture: <?php $languages = sfContext::getInstance()->getRequest()->getLanguages(); echo substr(strip_tags($languages[0]),0,2); ?>, module: home, action: index }
  4. requirements: { sf_culture: (?tongue.gifl|en|de|ru) }
  5. send:
  6. url: /wyslij.html
  7. param: { module: home, action: send }
  8. news:
  9. url: /:sf_culture/aktualnosci/:page
  10. param: { module: news, action: index, page: 1 }
  11. requirements: { sf_culture: (?tongue.gifl|en|de|ru) }
  12. news_entity:
  13. url: /:sf_culture/aktualnosci/:page/:slug
  14. param: { module: news, action: item, page: 1 }
  15. requirements: { sf_culture: (?tongue.gifl|en|de|ru) }
  16. download:
  17. url: /:sf_culture/pliki-do-pobrania.html
  18. param: { module: home, action: download }
  19. requirements: { sf_culture: (?tongue.gifl|en|de|ru) }
  20. contact:
  21. url: /:sf_culture/kontakt
  22. param: { module: pages, action: contact }
  23. requirements: { sf_culture: (?tongue.gifl|en|de|ru) }
  24. gallery:
  25. url: /:sf_culture/galeria-zdjec
  26. param: { module: gallery, action: index }
  27. requirements: { sf_culture: (?tongue.gifl|en|de|ru) }
  28. pages:
  29. url: /:sf_culture/:slug
  30. param: { module: pages, action: index }
  31. requirements: { sf_culture: (?tongue.gifl|en|de|ru) }
  32. default_index:
  33. url: /:module
  34. param: { action: index }
  35. default:
  36. url: /:module/:action/*


A widokiem się pobaw wink.gif.
Micchaleq
Dzięki za szybką odpowiedz.

Czy mógłbyś jeszcze do swojego komponentu dopisać komentaże co robi która linijka bo nie do końca wszystkie te instrukcje rozumiem.
chemik1982
Zapoznaj się:
Changing the Culture for a User

Pobaw się trochę. Jeśli Ci nie wyjdzie to napisz z czym masz problem - wtedy postaram się pomóc.
Micchaleq
Ok konkretne pytanie:

Dlaczego takie coś mi nie działa ?
Czy da się to tak zapisać jak niżej? ( czyszcze cache i ustawiam język ? )

  1. public function executeEnglish(){
  2.  
  3. $this->getUser()->setCulture('en_EN');
  4. $this->redirect('kontakt/index');
  5. }


w layout mam

  1. <a href="<?php url_for('kontakt/polish'); ?>">Polski</a>
  2. <a href="<?php url_for('kontakt/english'); ?>">Angielski</a>



PS:

Jeszcze jedno pytanko bo zauważyłem, że ustawiająć w executeIndex culture nie muszę czyścić zadnego cache.
Więc czy wystarczy przez te execute/english przekazać do adresu en i odczytać go w indexie? i czy to zadziała na wszystkie strony.

Ponieważ nie chce sobie utrudniać jak na razie i chce by dowolnie ( bez względu na jakiej podstronie znajduje się użytkownik ) mogl wybrać jezyk i przerzuciło go na strone główną.

Dobra na pytania powyżej odpowiedziałem sobie sam teraz ostatnie pytanie:

Czy da się jakoś zautomatyzować dodawanie tego języka w adresie w prosty sposób?

tzn aktualnie każdy moduł musiałbym sobie wywoływać z echo url_for(przykladowy/edit?lang= . $lang . &slug = . $id)

pzy czym w kazdym module bede musiał dodawać :

  1. $this->lang = $request->getParameter('lang');
Valantir
Nigdy się z tłumaczeniem nie bawiłem... ale może da się przechowywać język w cookie... smile.gif Potem napisz sobie filtr, który będzie ustawiał język i tyle:)
Micchaleq
Witam,

niestety nie pisałem jeszcze takich filtrów.

Czy możesz po krótce napisać mi co i jak albo jakiś link do artykulu bo to co znajduje nie wiele mi wyjaśnia.
Valantir
Pliki umieszczasz w:
nazwa_aplikacji->config->filters.yml
Kod
rendering: ~
remember_me:
  class: sfGuardRememberMeFilter
security:  ~

nazwa_filtra_jaka_chcesz_wstawic:
  class:  klasa_filtra
# insert your own filters here

cache:     ~
execution: ~

nazwa_aplikacji->lib->twoja_nazwa_pliku_zawierajacego_klase
Kod
<?php
class nazwa_filtra extends sfFilter
{
  public function execute ($filterChain)
  {
    //Treść filtra czyli w Twoim wypadku tworzenie sesji jeżeli takowa nie istnieje i jej ustawienie.
  }
}
?>


Oczywiście mówię-nie pracowałem nigdy z tłumaczeniami więc... to tylko propozycja:)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.