我正在尝试创建多语言应用程序。我已经实现了可翻译内容的能力,下一步应该向用户展示。我希望能够根据URL更改语言。我已经为这些目的找到了几个组件,但它们都创建了我不喜欢的URL。例如,我的应用程序的默认语言是英语,我的内容被翻译成法语。例如,我有页面“联系人”。应用程序生成的URL将是:mysite.com/en/contacts,mysite.com/fr/contacts,但我希望mysite.com/contacts用于默认语言,mysite.com/fr/contacts用于法语语言。这也是网站根源的相似之处。 mysite.com/ - 用于默认语言,mysite.com/fr用于法语。 有没有实现这些功能的方法?
答案 0 :(得分:1)
我正在使用XUrlManager扩展程序XUrlManager on GitHub
Yii根据UrlManager规则生成网址。如果你想要没有/ lang / code的URL,你需要创建正确的规则。例如,如果您在rules数组中公开记录:
'rules'=>array(
'<_c:\w+>/<_a:\w+>'=>'<_c>/<_a>',
'<language:\w{2}>/<_c:\w+>/<_a:\w+>'=>'<_c>/<_a>',
);
您的网址将使用您/ en /和/ fr /生成,但带代码的网址也可以生成。默认情况下,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 :(得分: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