[ Jezdimir Lončar @ 20.06.2010. 22:21 ] @
Pozdrav svima. Prije par dana sam prešao na rad sa ZendFrameworkom, i naišao sam na jedan problem. Naime, svi sajtovi na kojima radim su multilanguage sajtovi, i sada oni treba da se rewrite-uju da rade sa ZF-om. Elem, long story short, morao sam da smislim način kako da dodam tu multi-language opciju. Trebalo mi je dosta vremena da smislim rešenje, pa sam odlučio sa vama da ga podjelim, u slučaju da još neko od ZF newbies-a ima sličan problem :) Sajt ima putanju npr: http://sajt.com/news/index A treba da ima: http://sajt.com/jezik/news/index I u zavisnosti od toga jezik treba da učita odgovarajući language fajl. 1. DIO - Rute Ja sam rutu definisao kroz PHP (bootstrap file). Code: /////////////////////////////////////////////// // DIO ZA MULTILANG /////////////////////////////////////////////// $router = $front->getRouter(); # MORA DA SE POZOVE ROUTER! $route = new Zend_Controller_Router_Route( ':language/:controller/:action/*', array( 'language' => 'lat', 'module' => 'default', 'controller' => 'index', 'action' => 'index' ) ); $router->addRoute('lang_default', $route); $front->registerPlugin(new Jezici_Plugin_Language()); 2. DIO - Postavljanje language fajla Language fajlove stavljate u: application/languages/ime_jezika.php Npr, ako je gore pomenuti parametar (jezik) postavljen na eng, ovaj fajl treba da se zove eng.php. Format fajla: Code: <?php # Definisi array $lang = array(); # Definisi locale define("LANG_LOCALE","sr_SR"); # Pocetak jezickog fajla $lang["naslov_sajta"] = "ZF Pocetak"; 3. DIO - Plugin Plugin je gdje se vecina toga odvija, oko podesavanja jezika itd. Elem, ideju (i dio koda) sam uzeo sa http://www.gsdesign.ro/blog/us...-framework-language-component/ , međutim taj kod mi i nije baš odgovarao, i baš sam se namučio dok sam shvatio kako šta ide (opet, s' obzirom da sam tek ozbiljno počeo ZF-om da se bavim - i to posle xy neuspjelih pokušaja). Plugin se stavlja u library/Jezici/Plugin/Language.php Code: <?php /** * Ovaj plugin omogucava dinamicko mjenjanje jezika * @author Blazeme < [email protected] > * @copyright 2010 BildStudio d.o.o. * @version 1.0.0 (18. Jun 2010) * @see http://www.gsdesign.ro/blog/us...-framework-language-component/ (link orginalnog plugina) */ class Jezici_Plugin_Language extends Zend_Controller_Plugin_Abstract { public function routeShutdown(Zend_Controller_Request_Abstract $request) { # Podesi standardni jezik / locale $standardni_jezik = "lat"; $standardni_locale = "sr_SR"; # Podesi Local settings $locale = new Zend_Locale(); $parametri = $this->getRequest()->getParams(); # Preuzmi parametre sa rute $jezik = $parametri["language"]; # Podesi putanje: # Predefinisana putanja gdje se jezici nalaze $putanja = getcwd().'/application/languages/'.$jezik.'.php'; # Ovaj jezik se ukljucuje ako odabrani ne postoji. $standardni_jezik_putanja = getcwd().'/application/languages/'.$standardni_jezik.'.php'; ////////////////////////////////////////////////////////////// // Provjere ///////////////////////////////////////////////////////////// # Provjeri postojanje fajla # I ako postoji definisi jezicku promjenjivu koju mozemo da koristimo u programu, ako negdje zatreba if(file_exists($putanja)){ include $putanja; $trenutni_jezik = $jezik; } # Fajl ne postoji, prelazimo na standardni jezik else { # Vidi da li standardni jezik postoji (failsave) - ako je programer nesta pogrijesio if(file_exists($standardni_jezik)){ # Ukljuci ako postoji include $standardni_jezik_putanja; $trenutni_jezik = $standardni_jezik; } # Ne postoje ni standardni ni odabrani jezik. # Prikazi gresku 404 else{ throw new Zend_Controller_Action_Exception('Jezik ne postoji!',404); } } # Jos jedna stvar - provjeri LANG_LOCALE defined("LANG_LOCALE") || define("LANG_LOCALE",$standardni_locale); # Kraj provjera ////////////////////////////////////////////////////////////// // Provjere KRAJ ///////////////////////////////////////////////////////////// # Ispodesavaj promjenjive / registry / prevodilac # Podesi jezicku promjenjivu - $lang (array) i postavi Array tip adaptera za prevodjenje. #Podesi LOCALE kao onaj sto je definisan u LANG file-u $translate = new Zend_Translate('array', $lang, LANG_LOCALE ); Zend_Form::setDefaultTranslator($translate); # Postavi $translate kao standardni prevodilac Zend_Registry::set('Zend_Locale', $locale); # Podesi Zend_Locale za globalnu upotrebu Zend_Registry::set('Zend_Translate', $translate); # Podesi prevodilac za globalnu upotrebu # Da uvijek mozemo da vidimo koji je trenutni jezik, mada ovo i nije potrebno Zend_Registry::set('jezik', $trenutni_jezik); } } Eto to bi bilo to, otprilike, ja sam radio još neke izmjene na frameworku, al bi u svakom slučaju trebalo da i kod vas radi. Inače, bih bih zahvalan ako imate nekih predloga i to, post sam malo na brzinu napisao, al u svakom slučaju se nadam da će nekome koristiti. P.S. Ne bih znao jel ok po pravilniku što ovde iskucah ovako neko gotovo rešenje / kod, ako modovi smatraju da nije neka obrišu :) [Ovu poruku je menjao Goran Rakić dana 20.06.2010. u 23:34 GMT+1] |