Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF]Tłumaczenie linków
Forum PHP.pl > Forum > PHP > Frameworki
uirapuru
Efekt, który chcę osiągnąć to tłumaczenie ścieżek url. Obecnie korzystam z komponentów

Zend_Locale (ustawia język w sesji)
Zend_Translate (ciągnie z pliku dla danego języka fragmenty urli, korzysta z Zend_Locale)
Zend_Navigation (buduje menu z tłumaczonymi ścieżkami przez Zend_Translate)
Zend_Controller_Router (tworzy i tłumaczy ścieżki).

Przykładowa konfiguracja wygląda tak (zauwazyłem, że ważna jest kolejność, więc tak ją cytuję):

CODE
locale.default = pl
locale.force = true

resources.translate.adapter = ini
resources.translate.content = APPLICATION_PATH "/languages/"
resources.translate.scan = Zend_Translate::LOCALE_FILENAME
resources.translate.registry_key = "Zend_Translate"
resources.translate.options.scan = "filename"
resources.translate.disableNotices = false
resources.translate.options.logUntranslated = false

resources.router.defaultTranslator = "Zend_Translate"

resources.router.routes.module.type = Zend_Controller_Router_Route_Module

resources.router.routes.lang.type = Zend_Controller_Router_Route
resources.router.routes.lang.route = ":lang"
resources.router.routes.lang.reqs.lang = "(pl|en|fr)"
resources.router.routes.lang.defaults.module = default
resources.router.routes.lang.defaults.controller = index
resources.router.routes.lang.defaults.action = index

resources.router.routes.some-page-part.type = Zend_Controller_Router_Route
resources.router.routes.some-page-part.route = "@routeWhosSally"
resources.router.routes.some-page-part.defaults.module = default
resources.router.routes.some-page-part.defaults.controller = index
resources.router.routes.some-page-part.defaults.action = branch
resources.router.routes.some-page-part.defaults.id = sally

resources.router.routes.some-page.type = Zend_Controller_Router_Route_Chain
resources.router.routes.some-page.chain = "lang, some-page-part"

; na koniec wszystkich routingów dałem defaultowy

resources.router.routes.default.type = Zend_Controller_Router_Route_Chain
resources.router.routes.default.chain = "lang, module"

; nawigacja

resources.navigation.pages.some-page.label = "menu/top/some-page"
resources.navigation.pages.some-page.module = "default"
resources.navigation.pages.some-page.controller = "index"
resources.navigation.pages.some-page.action = "branch"
resources.navigation.pages.some-page.params.id = 'someId'
resources.navigation.pages.some-page.order = 1
resources.navigation.pages.some-page.route = some-page


Wspomniany na początku pliku konfiguracyjnego plugin Language ma jedną metodę ustawiającą w rejestrze aktualny język na podstawie routingu:

  1. public function routeShutdown(Zend_Controller_Request_Abstract $request)
  2. {
  3. $sLanguage = $request->getParam('lang', Zend_Registry::get("config")->defaultLanguage);
  4. $oTranslate = Zend_Registry::get('Zend_Translate');
  5. if ($oTranslate->isAvailable($sLanguage))
  6. {
  7. $oTranslate->setLocale($sLanguage);
  8. }
  9. else
  10. {
  11. $mLocale = $oTranslate->getLocale();
  12. if ($mLocale instanceof Zend_Locale)
  13. {
  14. $sLanguage = $mLocale->getLanguage();
  15. }
  16. else
  17. {
  18. $sLanguage = $mLocale;
  19. }
  20. }
  21. $oFrontController = Zend_Controller_Front::getInstance();
  22. $oRouter = $oFrontController->getRouter()->setGlobalParam('lang', $sLanguage);
  23. }


Prawie wszystko działa jak należy. Wejście na adres www.strona.com lub www.strona.com/pl powoduje, że wszystkie ścieżki generują się po polsku, np. w wyżej wymienionej nawigacji otrzymuję

www.strona.com/pl/jakas-strona

Wystarczy, że zmienię na adres strony na www.strona.com/en i zmieniają się wszystkie tłumaczenia na angielskie, w nawigacji dostaję

www.strona.com/en/some-page

**Jest niemal idealnie, oprócz jednego szkopułu; kiedy wejdę na jeden z powyższych adresów (www.strona.com/pl/jakas-strona lub www.strona.com/en/some-page)
**to otrzymuję niezmiennie błąd (zależnie od podanej wersji językowej inny kontroler jest wymieniony)**:

Invalid controller specified (jakas-strona)
in E:\www\library\Zend\Controller\Dispatcher\Standard.php (line 248)

Wydaje mi się, że problem polega na tym, że w złym momencie zczytywane sa parametry routingu - dopiero po tym fakcie tworzone są routingi z pliku konfiguracyjnego. Próbowałem przenieść wszystko do bootstrap, potem do pluginu, ale nie zdało rezultatu. Domyslam sie, ze kolejnosc jaka powinna być to:

1. odczytanie języka z routingu (np. "pl")
2. ustawienie "pl" w Zend_Locale
3. załadowanie tłumaczeń z pliku pl.ini przez Zend_Translate
4. stworzenie i przetłumaczenie dalszej części routingów
5. odczytanie reszty parametrów z requestu i wykonanie odpowiedniego routingu.

Domyślam się, że tak się nie dzieje i parametry próbuje się odczytać na samym początku, kiedy routingi nie są jeszcze zainicjowane. Domyślam się również, że Zend_Navigation potrafi wygenerować odpowiednie ścieżki, ponieważ dzieje się to dużo później (po inicjowaniu widoku). Co w takiej sytuacji?
snapshot
Spróbuj zmienić metodę w pluginie na routeStartup
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.