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());
///////////////////////////////////////////////
// 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";
<?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);
}
}
<?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]
“I never think of the future - it comes soon enough.” - Albert Anštajn (Albert Einstein)