konto usunięte

Temat: Tłumaczenie ścieżek po raz n-ty...

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ę):

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:

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 http://strona.com lub http://strona.com/pl powoduje, że wszystkie ścieżki generują się po polsku, np. w wyżej wymienionej nawigacji otrzymuję

http://strona.com/pl/jakas-strona

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

http://strona.com/en/some-page

**Jest niemal idealnie, oprócz jednego szkopułu; kiedy wejdę na jeden z powyższych adresów (http://strona.com/pl/jakas-strona lub http://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?Grzegorz Kaszuba edytował(a) ten post dnia 13.11.11 o godzinie 16:10
Paweł K.

Paweł K. Web & Mobile
Developer

Temat: Tłumaczenie ścieżek po raz n-ty...

mam u siebie podobne rozwiązanie, jedynie konfiguracji nie opieram na application.ini, tylko na bootstrapie i dodatkowo w pluginie Language mam dodatkową metodę


public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$config = Zend_Registry::get('config');
$language = substr($request->getServer('HTTP_HOST'), 0, 2);
$langs = array($config->language->enabled);
if(!in_array($language, $langs)){
$language = $config->language->default;
}
Zend_Registry::set('language',$language);
$translations = include realpath(APPLICATION_PATH . '/languages/'.$language.'.route.php'); $routeTranslator = new Zend_Translate('Array', $translations, $language); Zend_Controller_Router_Route::setDefaultTranslator($routeTranslator);
Zend_Registry::set('routeTranslator', $routeTranslator); }


Mam nadzieje, że to Ci coś pomoże. W razie pytań zapraszam na PW.Paweł K. edytował(a) ten post dnia 15.11.11 o godzinie 11:38

Następna dyskusja:

Parytety po raz kolejny.




Wyślij zaproszenie do