我正在嘗試創建多語言應用程序。我已經實現了可翻譯內容的能力,下一步應該向用戶展示它。我想要具有根據URL改變語言的能力。我發現了一些用於這些目的的組件,但它們都創建了我不喜歡的url。例如,我的應用程序的默認語言是英語,我的內容翻譯成法語。例如,我有頁面「聯繫人」。而由應用程序生成的URL將爲:mysite.com/en/contacts,mysite.com/fr/contacts,但我希望默認語言爲mysite.com/contacts,法語爲mysite.com/fr/contacts語言。它也是網站的根源。 mysite.com/ - 用於默認語言,mysite.com/fr用於法語。 有沒有實現這些功能的方法?Yii和多種語言的網址
1
A
回答
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);
}
相關問題
- 1. 多種語言的網址
- 2. 與多種語言的網址問題
- 3. 多語言網址
- 4. 多語言網址
- 5. 多語言網站網址
- 6. 多語言網站和網址命名
- 7. 多種語言的網站
- 8. 多種語言的網站和視圖
- 9. 多語言網站網址和語言路徑
- 10. Codeigniter多語言網址
- 11. 多語言網站的網址結構
- 12. Yii:多語言網站 - 最佳實踐
- 13. 使用每種語言的相同地址優化多語言網站
- 14. preg_match_all和多種語言
- 15. cakePhp和多種語言
- 16. cakephp多種語言的網站
- 17. 多語言標識的主頁網址
- 18. 使用ASP.NET MVC的多語言網址
- 19. Laravel 4中的多語言網址
- 20. asp.net mvc的多語言網址/路由
- 21. Yii語言源語言和翻譯
- 22. Yii框架和多語言內容
- 23. Yii中不同語言的不同網址
- 24. 製作JSF網站多種語言
- 25. 在網站中添加多種語言
- 26. Joomla多種語言
- 27. 多種語言+ Htaccess
- 28. Yii2多種語言
- 29. Magento ::多個國家和多種語言
- 30. 多種語言的多種字體
謝謝您的回答網址!我認爲這是正確的方式。 P.S:沒有注意到Yii :: app() - > language!=='en' – LosYear
如果僅僅使用默認語言 - 而不是在規則部分使用雙記錄。爲了創建URL,Yii找到第一個沒有語言代碼的正確記錄並創建簡單的URL。如果您使用langcode發送請求 - Yii會使用代碼查找下一個記錄。 – BaBL86
或者您可以在我的回答中修改createUrl部分:if($ params ['language'] === Yii :: app() - > language){unset($ params ['language']);} – BaBL86