[英]Add a language parameter in url in zend framework
我在zend framework中有一個站點。 現在,我正在用多種語言制作網站。 為此,我需要修改URL。
例如,如果站點名稱是www.example.com,那么我想使其像
www.example.com/ch
www.example.com/fr
可能有一些解決方法,您可以要求我創建一個文件夾名稱ch並將代碼副本放入其中。 但是為此,我必須在更新服務器上的文件時管理多個文件夾。
最好或正確的方法是什么?
我的潰敗代碼是
public function _initRouter() {
$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$routes = array(
'page' => new Zend_Controller_Router_Route('page/:slug', array('controller' => 'staticpage', 'action' => 'page', 'slug' => ''))
);
$router->addRoutes($routes);
}
謝謝
您必須在路線中添加語言作為參數。 這是一個示例: http : //devzone.zend.com/1765/chaining-language-with-default-route/
如果用戶只是從example.com開始,則需要一個函數來讓用戶選擇一種語言和一種默認語言。
您可能希望從用戶的HTTP請求中獲取當前的瀏覽器和語言標題。
看一下Zend_Locale和Zend_Translate。
您可以使用$ locale = new Zend_Locale('browser');之類的東西。 檢測用戶的瀏覽器語言。
然后查看Zend_Translate或您的翻譯引擎是否有可用的語言,並將其設置為cookie或會話以存儲日期。
如果用戶隨后導航到某些語言更改站點,例如example.com/?language=zh-CN,則您可能希望根據用戶的選擇來設置語言環境,然后重新檢查翻譯中是否可用。
如果不是,請返回原始默認語言並顯示錯誤頁面或類似內容。
如果您想讓Zend_Router網址依賴於語言,由於復制粘貼,反向鏈接或鏈接的論壇帖子,這可能是一個糟糕的選擇,則需要在每條路由之前添加一些內容。
在我的應用程序中,我在主bootstrap.php文件中使用類似以下內容的東西。 為了簡化起見,我刪減了部分內容。
protected function _initTranslate() {
$session = new Zend_Session_Namespace("globals");
// Get current registry
$registry = Zend_Registry::getInstance();
/**
* Set application wide source string language
* i.e. $this->translate('Hallo ich bin ein deutscher String!');
*/
if(!$session->current_language) {
try {
$locale = new Zend_Locale('browser'); //detect browser language
}
catch (Zend_Locale_Exception $e) {
//FIXME: get from db or application.ini
$locale = new Zend_Locale('en_GB'); //use the default language
}
}
else {
$locale = new Zend_Locale($session->current_language);
}
$translate = new Zend_Translate(
array(
'adapter' => 'array',
'content' => realpath(APPLICATION_PATH . '/../data/i18n/'),
'locale' => $locale,
'scan' => Zend_Translate::LOCALE_DIRECTORY,
'reload' => false,
'disableNotices' => true, //dont get exception if language is not available
'logUntranslated' => false //log untranslated values
)
);
if(!$translate->isAvailable($locale->getLanguage())) {
$locale = new Zend_Locale('en_GB'); //default
}
$translate->setLocale($locale);
$session->current_language = $locale->getLanguage();
//Set validation messages
Zend_Validate_Abstract::setDefaultTranslator($translate);
//Max lenght of Zend_Form Error Messages (truncated with ... ending)
Zend_Validate::setMessageLength(100);
//Zend_Form Validation messages get translated into the user language
Zend_Form::setDefaultTranslator($translate);
/**
* Both of these registry keys are magical and makes do automagical things.
*/
$registry->set('Zend_Locale', $locale);
$registry->set('Zend_Translate', $translate);
return $translate;
}
這是每個訪客的默認翻譯設置。
為了根據某些HTTP參數設置用戶語言,我決定創建一個插件,該插件將在每個請求上運行,查看是否設置了全局語言參數(key = _language),然后嘗試設置新語言。
然后,根據用戶的選擇,將用戶重定向到新路由。
因此,如果用戶單擊英語鏈接(example.com/de/test/123?_language=zh-CN),他將被重定向到example.com/en/test/123。
class Application_Plugin_Translate extends Core_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$frontController = Zend_Controller_Front::getInstance();
// Get the registry object (global vars)
$registry = Zend_Registry::getInstance();
// Get our translate object from registry (set in bootstrap)
$translate = $registry->get('Zend_Translate');
// Get our locale object from registry (set in bootstrap)
$locale = $registry->get('Zend_Locale');
// Create Session block and save the current_language
$session = new Zend_Session_Namespace('globals');
//get the current language param from request object ($_REQUEST)
$language = $request->getParam('_language',$session->current_language);
// see if a language file is available for translate (scan auto)
if($translate->isAvailable($language)) {
//update global locale
$locale = $registry->get('Zend_Locale');
$locale->setLocale($language);
$registry->set('Zend_Locale', $locale);
//update global translate
$translate = $registry->get('Zend_Translate');
$translate->setLocale($locale);
$registry->set('Zend_Translate', $translate);
//language changed
if($language!=$session->current_language) {
//update session
$session->current_language = $language;
$redirector = new Zend_Controller_Action_Helper_Redirector;
$redirector->gotoRouteAndExit(array());
}
}
else {
$request->setParam('_language', '');
unset($session->current_language);
$redirector = new Zend_Controller_Action_Helper_Redirector;
$redirector->gotoRouteAndExit(array());
}
}
}
最后,要為路由器准備新的語言路由,您需要設置基本語言路由並根據其他路由鏈接其他語言。
public function _initRouter() {
$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$languageRoute = new Zend_Controller_Router_Route(
':language',
array(
'language' => "de"
),
array('language' => '[a-z]{2}')
);
$defaultRoute = new Zend_Controller_Router_Route(
':@controller/:@action/*',
array(
'module' => 'default',
'controller' => 'index',
'action' => 'index'
)
);
$router->addRoute(
'default',
$defaultRoute
);
$languageDefaultRoute = $languageRoute->chain($defaultRoute);
$router->addRoute(
'language',
$languageDefaultRoute
);
}
祝您項目順利,希望它對您和其他人有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.