Autor wpisu: matipl, dodany: 08.02.2011 09:01, tagi: php
Wstępnie chciałem napisać o lokalizacji, aby zaprezentować Wam jak można wykorzystać application.ini zamiast tworzyć własne zasoby (resource). Ale z drugiej strony może nie każdy wie jakie to proste w dzisiejszych czasach zrobić serwis wielojęzyczny z tłumaczeniem nie tylko statycznych napisów, ale również nawigacji czy lokalizacją kwot.
Do tłumaczeń korzystam z gettext (pliki .mo i .po). Moje pliki językowe znajdują się w project/languages i wygląda to tak:
matipl@host:~/project/languages$ ls en_GB.mo en_GB.po pl_PL.mo pl_PL.po
Gdy mamy stworzone własne tłumaczenia pora na skonfigurowanie zasobu translate w application.ini:
resources.translate.registry_key = "Zend_Translate" resources.translate.adapter = "gettext" resources.translate.content = APPLICATION_PATH "/../languages/" resources.translate.options.scan = "filename" resources.translate.disableNotices = false resources.translate.options.logUntranslated = false resources.translate.locale = "pl_PL"
W ten oto sposób możemy już korzystać z plików lokalizacyjnych opartych o Zend_Translate (skonfigurowany zasób znajduje się w Zend_Registry::get(‘Zend_Translate’)). Niestety nie wie on z jakiej wersji językowej (pl czy en) chcemy skorzystać.
W tym celu stworzyłem plugin Zextend_Controller_Plugin_Locale, który pobiera wybrany (lub domyślny) język użytkownika i konfiguruje Zend_Translate. Dodatkowo mówimy widokowi i nawigacji, że ma się wspierać przez Zend_Translate z tym konkretnym językiem, który skonfigurowaliśmy.
class Zextend_Controller_Plugin_Locale extends Zend_Controller_Plugin_Abstract { public function routeShutdown(Zend_Controller_Request_Abstract $request) { $view = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('view'); $locale = new Zend_Locale(Zextend_Lang::getActiveLang()); Zend_Registry::set('Zend_Locale', $locale); $translate = Zend_Registry::get('Zend_Translate'); $translate->setLocale($locale); $view->getHelper('translate')->setTranslator($translate); $view->navigation()->setTranslator($translate); Zend_Form::setDefaultTranslator($translate); Zend_Registry::set('Zend_Translate', $translate); } }
Na koniec wystarczy włączyć nasz plugin w application.ini:
resources.frontController.plugins.locale = "Zextend_Controller_Plugin_Locale"
Teraz możemy już swobodnie korzystać z tłumaczeń na naszej stronie, np. w widoku wywołując:
<h2><?php echo $this->translate('Contact') ?></h2>
Dla słowa „Contact” musimy mieć oczywiście odpowiedni wpis w plikach *.po. Dla wersji PL:
msgid "Contact" msgstr "Kontakt"
Po stworzeniu tłumaczenia pamiętajmy o wygenerowaniu pliku .mo komendą: msgfmt -o pl_PL.mo pl_PL.po.
Na koniec dodam, że w danych czasach sporo rzeczy robiłem poza application.ini. Chociażby przeciążałem zasób Db, aby wprowadzić SET NAMES UTF8, czy też w index.php wpisywało się dyrektywy PHP. A obecnie?