ZF 1.12 PoEdit i Zend_Translate

Ostatnio miałem niezłą rozkminę jak doprowadzić do sytuacji w której cały Zend, a nie tylko View może być tłumaczony poprzez Zend_Translate. Szukałem, szperałem i średnio ciekawe elementy znalazłem. Kilka rozwiązać od Hakjerów Interńetów, kilka od osób typu nyga nyga nyga coś wynygam i kilka porad pod Zenda którego pamięta moja babcia.

Pierwszym poradnikiem z którego coś wyciułałem był ten link: http://blog.hackix.com/2010/01/working-with-zend_translate-and-poedit-part-1/

No niestety, cwaniak pokazał fragment z bootstrapa i jara się że może tłumaczyć widoki. FAJNIE! Ale co z kontrolerami i modelem? One też czasami potrafią zwracać tekst do przetłumaczenia. Oto moje rozwiązanie, oczywiście może nie perfekcyjne i poszło by to walnąć w klasę rozszerzającą domyślne klasy – ale nie od tego tu jestem a od sprzedania pomysłu jak można to rozwiązać!

Więc tak, w Bootstrap.php posłużyłem się kodem który znalazłem, trochę do niego dodając.

protected function _initTranslations() {

        $locale = new Zend_Locale();

        $db = Zend_Registry::get("db");
        $sys = new Application_Model_DbTable_AccSysLanguage($db);
        $lang = $sys−>pobierz()−>toArray();

        foreach ($lang as $lang):
            $avalible[] = $lang['lng_Region'];
        endforeach;
        if (in_array($locale−>getLanguage(), $avalible)) {
            $locale−>setLocale($locale−>getLanguage());
        } else {
            $locale−>setLocale('en');
        }

        $translate = new Zend_Translate(array(
            'adapter' => 'gettext',
            'content' => APPLICATION_PATH . '/languages/' . strtoupper($locale−>getLanguage()) . '/' . strtolower($locale−>getLanguage()) . '.mo',
            'locale' => $locale));

        $translate−>setLocale($locale);
        $this−>bootstrap('view');
        $this−>getResource('view')−>getHelper('translate')−>setTranslator($translate);
        Zend_Form::setDefaultTranslator($translate);
        Zend_Registry::set('translate', $translate);
    }

No dobra, ale to nie koniec. Zend teraz wie jakie języki mam dostępne, jaki język chciał dostać użytkownik, jaki język dostanie użytkownik, pobrał sobie odpowiednie tłumaczenie i zarejestrował je do dalszego użytku. Teraz magia jest prosta, w widokach stosujemy zarejestrowany $this->translate(‚Ala ma kota, kot hejtuje Anie!’) i wszystko bangla. Przejdźmy do kontrolerów i modelu.

Do klasy Zend_Controller_Action dodałem funkcję:

public function lang($text) {
        $translate = Zend_Registry::get('translate');
        return (string) $translate−>translate($text);
}

W ten oto magiczny sposób w kontrolerze stosuję $this->lang(‚Ala ma kota, kot hejtuje Anie!’) i otrzymuję przetłumaczoną frazę. Analogicznie należy postąpić z modelami i ew. z formularzami. W Zend_Form niby coś jest z translacją, ale nie chciało mi się w to zbytnio wgryzać. Może właśnie Ty opiszesz jakiś fajny sposób na proste tłumaczenie form żeby nie murzynić z $this->lang();

Kasztelan Paweł

Programista samouk, zakochany w ZF i Laravel, szerzący opinię że PHP + JS + HTML + CSS to są języki w których może zostać stworzona aplikacja równie dobra, a nawet lepsza od twardego klienta.