2013-12-12 79 views
1

我正在嘗試創建多語言應用程序。我已經實現了可翻譯內容的能力,下一步應該向用戶展示它。我想要具有根據URL改變語言的能力。我發現了一些用於這些目的的組件,但它們都創建了我不喜歡的url。例如,我的應用程序的默認語言是英語,我的內容翻譯成法語。例如,我有頁面「聯繫人」。而由應用程序生成的URL將爲:mysite.com/en/contacts,mysite.com/fr/contacts,但我希望默認語言爲mysite.com/contacts,法語爲mysite.com/fr/contacts語言。它也是網站的根源。 mysite.com/ - 用於默認語言,mysite.com/fr用於法語。 有沒有實現這些功能的方法?Yii和多種語言的網址

回答

0

我發現非常巧妙的方法解決上http://www.elisdn.ru

我的問題

重新實現CHttpRequest

class DLanguageHttpRequest extends CHttpRequest 
{ 
    private $_requestUri; 

    public function getRequestUri() 
    { 
     if ($this->_requestUri === null) 
      $this->_requestUri = DMultilangHelper::processLangInUrl(parent::getRequestUri()); 

     return $this->_requestUri; 
    } 

    public function getOriginalUrl() 
    { 
     return $this->getOriginalRequestUri(); 
    } 

    public function getOriginalRequestUri() 
    { 
     return DMultilangHelper::addLangToUrl($this->getRequestUri()); 
    } 
} 

重新實現CUrlManager

class DLanguageUrlManager extends CUrlManager 
{ 
    public function createUrl($route, $params=array(), $ampersand='&') 
    { 
     $url = parent::createUrl($route, $params, $ampersand); 
     return DMultilangHelper::addLangToUrl($url); 
    } 
} 

更改配置

return array(
    'sourceLanguage'=>'en', 
    'language'=>'ru', 

    'components'=>array(
     'request'=>array(
      'class'=>'DLanguageHttpRequest', 
      ... 
     ), 
     'urlManager'=>array(
      'class'=>'DLanguageUrlManager', 
      ... 
     ), 
    ), 

    ... 

    'params'=>array(
     'translatedLanguages'=>array(
      'ru'=>'Russian', 
      'en'=>'English', 
      'de'=>'Deutsch', 
     ), 
     'defaultLanguage'=>'ru', 
    ), 
); 

創建DMultilangHelper

class DMultilangHelper 
{ 
    public static function enabled() 
    { 
     return count(Yii::app()->params['translatedLanguages']) > 1; 
    } 

    public static function suffixList() 
    { 
     $list = array(); 
     $enabled = self::enabled(); 

     foreach (Yii::app()->params['translatedLanguages'] as $lang => $name) 
     { 
      if ($lang === Yii::app()->params['defaultLanguage']) { 
       $suffix = ''; 
       $list[$suffix] = $enabled ? $name : ''; 
      } else { 
       $suffix = '_' . $lang; 
       $list[$suffix] = $name; 
      } 
     } 

     return $list; 
    } 

    public static function processLangInUrl($url) 
    { 
     if (self::enabled()) 
     { 
      $domains = explode('/', ltrim($url, '/')); 

      $isLangExists = in_array($domains[0], array_keys(Yii::app()->params['translatedLanguages'])); 
      $isDefaultLang = $domains[0] == Yii::app()->params['defaultLanguage']; 

      if ($isLangExists && !$isDefaultLang) 
      { 
       $lang = array_shift($domains); 
       Yii::app()->setLanguage($lang); 
      } 

      $url = '/' . implode('/', $domains); 
     } 

     return $url; 
    } 

    public static function addLangToUrl($url) 
     if (self::enabled()) 
     { 
      $domains = explode('/', ltrim($url, '/')); 
      $isHasLang = in_array($domains[0], array_keys(Yii::app()->params['translatedLanguages'])); 
      $isDefaultLang = Yii::app()->getLanguage() == Yii::app()->params['defaultLanguage']; 

      if ($isHasLang && $isDefaultLang) 
       array_shift($domains); 

      if (!$isHasLang && !$isDefaultLang) 
       array_unshift($domains, Yii::app()->getLanguage()); 

      $url = '/' . implode('/', $domains); 
     } 

     return $url; 
    } 
} 

所有這些步驟後,你的應用程序將要 更多信息here

1

我使用XUrlManager擴展XUrlManager on GitHub

的Yii基於UrlManager規則的URL。如果你想URL不帶/ lang/code - 你只需要創建正確的規則。例如,如果您dublicate記錄規則陣列:

'rules'=>array(
    '<_c:\w+>/<_a:\w+>'=>'<_c>/<_a>', 
    '<language:\w{2}>/<_c:\w+>/<_a:\w+>'=>'<_c>/<_a>', 
); 

您的網址,將產生withou/EN /和/ FR /,但URL與代碼工作過。默認情況下,XUrlManager使用先前選擇的語言並將其存儲在會話或cookie中。

如果你只想隱藏/ EN /和使用/ FR /和其他人一樣,您可以更改XUrlManager擴展與:

public function createUrl($route,$params=array(),$ampersand='&') 
{ 
    if(!isset($params['language']) && Yii::app()->language!=='en') 
     $params['language']=Yii::app()->language; 
    return parent::createUrl($route,$params,$ampersand); 
} 
+0

謝謝您的回答網址!我認爲這是正確的方式。 P.S:沒有注意到Yii :: app() - > language!=='en' – LosYear

+1

如果僅僅使用默認語言 - 而不是在規則部分使用雙記錄。爲了創建URL,Yii找到第一個沒有語言代碼的正確記錄並創建簡單的URL。如果您使用langcode發送請求 - Yii會使用代碼查找下一個記錄。 – BaBL86

+0

或者您可以在我的回答中修改createUrl部分:if($ params ['language'] === Yii :: app() - > language){unset($ params ['language']);} – BaBL86