, .
, , - , :
http://domain.com/language-code/controller-name/action-name
, "-" Zend.
, Zend_Translate .
, "" , .
:
resources.frontController.plugins.Language = Plugin_Language
resources.frontController.actionHelperPaths.Controller_Helper = APPLICATION_PATH "/controllers/helpers"
resources.locale.default = "en_US"
resources.locale.force = false
resources.translate.adapter = "Csv"
resources.translate.data = APPLICATION_PATH "/languages"
resources.translate.locale = "auto"
resources.translate.disableNotices = true
resources.translate.scan = directory
resources.router.routes.module.type = Zend_Controller_Router_Route_Module
resources.router.routes.module.abstract = On
resources.router.routes.language.type = Zend_Controller_Router_Route
resources.router.routes.language.route = ":language"
resources.router.routes.language.reqs.language = "^[a-z]{2}$"
resources.router.routes.language.defaults.language = "en"
resources.router.routes.default.type = Zend_Controller_Router_Route_Chain
resources.router.routes.default.chain = "language,module"
resources.view.helperPath.View_Helper = APPLICATION_PATH "/views/helpers"
:
class Plugin_Language extends Zend_Controller_Plugin_Abstract {
public function routeStartup(Zend_Controller_Request_Abstract $request){
if (substr($request->getRequestUri(), 0, -1) == $request->getBaseUrl()){
$language = Zend_Registry::get("Zend_Locale")->getLanguage();
if (!Zend_Registry::get('Zend_Translate')->isAvailable($language)){
Zend_Registry::set(
"Zend_Locale",
new Zend_Locale("default")
);
$language = Zend_Registry::get("Zend_Locale")->getLanguage();
Zend_Registry::get("Zend_Translate")->setLocale(
Zend_Registry::get('Zend_Locale')
);
}
$request->setRequestUri($request->getRequestUri().$language."/");
$request->setParam("language", $language);
}
}
public function routeShutdown(Zend_Controller_Request_Abstract $request){
$language = $request->getParam("language");
if (!Zend_Registry::get('Zend_Translate')->isAvailable($language))
throw new Zend_Controller_Router_Exception('Translation language is not available', 404);
Zend_Registry::set(
"Zend_Locale",
new Zend_Locale($language)
);
Zend_Registry::get("Zend_Translate")->setLocale(
Zend_Registry::get("Zend_Locale")
);
}
}
:
class Controller_Helper_Language extends Zend_Controller_Action_Helper_Abstract {
public function getCurrent(){
if (!Zend_Registry::isRegistered("Zend_Locale"))
return null;
return Zend_Registry::get("Zend_Locale")->getLanguage();
}
public function getTranslator(){
if (!Zend_Registry::isRegistered("Zend_Translate"))
return null;
return Zend_Registry::get("Zend_Translate");
}
}
URL- ( ). URL-, , :
class View_Helper_Url extends Zend_View_Helper_Url {
protected function _getCurrentLanguage(){
return Zend_Controller_Action_HelperBroker::getStaticHelper('Language')
->getCurrent();
}
public function Url($urlOptions = array(), $name = null, $reset = true, $encode = true){
$urlOptions = array_merge(
array(
"language" => $this->_getCurrentLanguage()
),
$urlOptions
);
return parent::url($urlOptions,$name,$reset,$encode);
}
}
.