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
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:
public function routeShutdown(Zend_Controller_Request_Abstract $request) { $sLanguage = $request->getParam('lang', Zend_Registry::get("config")->defaultLanguage); $oTranslate = Zend_Registry::get('Zend_Translate'); if ($oTranslate->isAvailable($sLanguage)) { $oTranslate->setLocale($sLanguage); } else { $mLocale = $oTranslate->getLocale(); if ($mLocale instanceof Zend_Locale) { $sLanguage = $mLocale->getLanguage(); } else { $sLanguage = $mLocale; } } $oFrontController = Zend_Controller_Front::getInstance(); $oRouter = $oFrontController->getRouter()->setGlobalParam('lang', $sLanguage); }
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?