Yii和多语言网址

时间:2013-12-12 13:28:06

标签: php url yii multilingual

我正在尝试创建多语言应用程序。我已经实现了可翻译内容的能力,下一步应该向用户展示。我希望能够根据URL更改语言。我已经为这些目的找到了几个组件,但它们都创建了我不喜欢的URL。例如,我的应用程序的默认语言是英语,我的内容被翻译成法语。例如,我有页面“联系人”。应用程序生成的URL将是:mysite.com/en/contacts,mysite.com/fr/contacts,但我希望mysite.com/contacts用于默认语言,mysite.com/fr/contacts用于法语语言。这也是网站根源的相似之处。 mysite.com/ - 用于默认语言,mysite.com/fr用于法语。 有没有实现这些功能的方法?

2 个答案:

答案 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