DbHelp.ru
Маленький Yii блог
Комментарии
Гость: wh0cd200920 [url=http://prednisoloneacetate.shop/]prednisolone 1[/url] [url=http://inderal.fun/]inde...
Гость: 24 Oct 2014 The latest seasons of Emmy award-winning talk show The Ellen DeGeneres Show and fantasy ...
Гость: loan services quickcash personal loans online cheap personal loans
Гость: wh0cd200920 [url=http://buystrattera.us.com/]generic for strattera[/url] [url=http://cleocingel.us.o...
Гость: wh0cd200920 [url=http://tadaciponline.store/]tadacip 20mg[/url] [url=http://synthroidonline.store/]s...



Сервер Ultima Online - Forest Wars (от создателя данного блога)

Многоязычность субдоменов и URL-правила

Рубрика: Перевод Cookbook

Оцените эту статью:

Рейтинг: 0.00 (0)
25 Дек. 2009
Опубликовать в Twitter Написать в Facebook Опубликовать в своем блоге livejournal.com

Yii Framework Blog img http://dbhelp.rucookbook Это руководство предназначено для более-менее продвинутых пользователей. Если вы только что начали работу с Yii Framework-ом, вам стоит вернутся на эту страницу позднее :-)

---

 

Некоторые размышления

В Yii мы обычно определяем статические правила маршрутизации (url-rules) в основном конфигурационном файле. В настоящее время в Yii нет встроенной поддержки субдоменов и динамических маршрутов. При разработке многоязычного приложения, вы обычно определяете url-правила на английском языке, независимо от языка клиента. Это хорошо работает, но для профессиональных сайтов и порталов — вы можете использовать совершенно другой подход!

Давайте представим что мы создаем сайт на двух языках (английском и немецком). Правила для страницы «контакты» скорее всего выглядело бы следующим образом:

<?php
...
 
'components' => array(
  'urlManager' => array(
    'rules' => array(
      'contact' => 'site/contact',
    ),
  ),
),
 
...
?>

Доступ к странице мы могли бы получить по ссылке:

http://www.example.com/contact

Теперь подумаем как сделать вот так:

http://en.example.com/contact  
http://de.example.com/kontakt

Как вы видите, мы используем субдомен — как определитель языка пользователя (EN – для английскойго, DE – для немецкого) и слово «Контакт» как url-правило. Как я уже говорил ранее, такой подход Yii не поддерживает.

Прежде чем я покажу вам решение — ознакомтесь со всеми недостатками и приемуществами. Оцените самостоятельно стоит ли использовать данный подход для ваших приложений.

Недостатки

  • Если вы используете субдомены для размещения основной информации на них, это скорее всего приведет к падению вашего PageRank основного домена. (например example.com вероятно пострадает)
  • Google заявляет что лучше использовать домен верхнего уровня вместо субдоменов. Так что если вы являетесь владельцем example.com , example.de – тогда вы не должны использовать данный подход. Но вы конечно можете переписать часть кода под работы с доменами верхнего уровня, вместо субдоменов.
  • Для небольших сайтов нет смысла использовать данный подход. Реальное приемущество вы получите на веб-сайтах с посещаемостью не меньше чем 10 000 уникалов в сутки.

 

Приемущества

 

  • Вы можете развить ваш сайт в реальный многоязычный портал, как например YouTube, и проверять статистику с одно аккаунта Google Analytics для разных субдоменов.
  • Google будет отображать ссылки (http://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=47334) для каждого языка. Это правильнее с точки зрения SEO
  • Пользователи будут счастливы :)

 

Решение

Создадим новый компонент, который будет включать в себя все необходимые свойства и функции:

<?php
 
class I18n extends CApplicationComponent
{
 
    public $supportedLanguages;
    public $urlRulesPath;
    public $activeLanguage;
 
    public function init()
    {
 
        if (true === (bool)preg_match("/^(?<protocol>(http|https):\/\/)(((?<languageCode>[a-z]{2})\.)*)((.*\.)*(?<domain>.+\.[a-z]+))$/", Yii::app()->request->hostInfo, $matches))
        {
 
            if (2 !== strlen($matches['languageCode']) && false !== ($language = $this->isSupportedLanguage($matches['languageCode'])))
            {
                $this->activeLanguage = $language;  
            }
            else
            {
 
                $this->activeLanguage = $this->guessClientLanguage();
 
                $redirectUrl = "{$matches['protocol']}{$this->activeLanguage['code']}.{$matches['domain']}";
 
            }
 
        }
        else
        {
            throw new CException("Unable to parse host info - please request this page with a domain (eg http://example.com/) instead of an ip-address!");
        }
 
        Yii::app()->setLanguage($this->activeLanguage['code']);
 
        Yii::app()->urlManager->rules = include("{$this->urlRulesPath}/{$this->activeLanguage['code']}.php");
 
        if (false !== Yii::app()->urlManager->cacheID && null !== ($cache = Yii::app()->getComponent(Yii::app()->urlManager->cacheID)))
        {
            $keyPrefix = $cache->keyPrefix;
            $cache->keyPrefix = "{$keyPrefix}.{$this->activeLanguage['code']}";
            Yii::app()->urlManager->init();
            $cache->keyPrefix = $keyPrefix;                 
        }
        else
        {
            Yii::app()->urlManager->init();
        }
 
        if (true === isset($redirectUrl))
        {
            Yii::app()->request->redirect($redirectUrl);
        }
 
    }
 
    public function guessClientLanguage()
    {
 
        if (false === isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) || false === (bool)preg_match("/([a-z]{2}+)[-_][A-z]{2}+/", $_SERVER['HTTP_ACCEPT_LANGUAGE'], $match) || false === ($language = $this->isSupportedLanguage($match[1])))
        {
            if (false === ($language = $this->getFallbackLanguage()))
            {
                throw new CException("Unable to return the fallback language - please set it in config!");
            }
        }
 
        return $language;
 
    }
 
    public function getFallbackLanguage()
    {
 
        foreach ($this->supportedLanguages as $supportedLanguage)
        {
            if (true === isset($supportedLanguage['fallback']) && true === $supportedLanguage['fallback'])
            {
                return $supportedLanguage;
            }
        }
 
        return false;
 
    }
 
    public function isSupportedLanguage($languageCode)
    {
 
        foreach ($this->supportedLanguages as $supportedLanguage)
        {
            if ($supportedLanguage['code'] === $languageCode)
            {
                return $supportedLanguage;
            }
        }
 
        return false;
 
    }
 
}
 
?>

В основной конфигурации мы добавим этот компонент в массив предварительной загрузки:

<?php
...
 
preload => array('log', 'i18n'),
 
...
?>

Еще нам требуется добавить компонент в тело конфигурационнго файла, с описанием основных параметров работы:

<?php
...
 
'components' => array(
  'i18n' => array(
    'class' => 'I18n',
    'urlRulesPath' => dirname(__FILE__) . '/i18n/urlRules',
    'supportedLanguages' => array(
      array('code' => 'en', 'name' => 'english', 'fallback' => true),
      array('code' => 'de', 'name' => 'german'),
    ),
  ),
),
 
...
?>

Файлы правил маршрутизации (protected/i18n/urlRules/*.php ) должны иметь примерно следующий формат:

<?php
 
/* ../protected/i18n/urlRules/de.php */
 
return array(
  'kontakt' => 'site/contact',
)

Вывод

Не стесняйтесь поделиться своими мыслями и замечаниями! Спасибо.

 



Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
Другие yii статьи:

  1. Первым делом здравствуйте! :) Сразу хотел бы вам обьяснить что вы находитесь на странице интернет блога DbHelp, который полностью ... "Шаг 0: Поговорим?"

  2. Иногда полезно смотреть на текущюю стадию разработки нашего любимого Yii Framework-а. next Можно заметить что версия 1.0.10 уже ... "Yii::registerAutoloader()"

  3. В данном переводе раскрыта идея как закрыть сайт от гостей. т.е. пользователи должны войти в систему прежде чем смогут увидеть ... "Закрываем сайт от лишних глаз"

[guest] Гость

Было сказано: Воскресенье, 07 Январь 2018

higojudb http://livecopys.com generic viagra online <a href="http://skyrank.com">cialis online</a> mkbp http://lizlarssen.com - buy viagra online

[guest] Гость

Было сказано: Воскресенье, 07 Январь 2018

Best Buy Discount Generic Macrobid Direct Overnight Shipping http://costofcial.com - cialis Kamagra En Hipertension Pulmonar Bentyl Cash Delivery For Sale Cialis Y De <a href=http://costofcial.com>cheap cialis</a> Propecia Era Bueno Cheap 1 Pill Of Cefixime 400 Mg Pastilla Cialis Efectos Ebay Levitra http://costofcial.com - online pharmacy Levitra Cuanto Dura El Efecto Birth Control Pill And Cephalexin

[guest] Гость

Было сказано: Воскресенье, 07 Январь 2018

<a href="http://essaywritingserviceus.com/">college essay writing service</a>
on writing the college application essay http://essaywritingserviceus.com

[guest] Гость

Было сказано: Воскресенье, 07 Январь 2018

Cialis Che Cos'E Cialis Ohne Rezept http://costofcial.com - cialis Real Cod Only Stendra No Prescription Medication In House Pharmacy Uk Cialis Delivered Overnight <a href=http://costofcial.com>cialis</a> Sildenafil100mg Doryx 100mg C.O.D. Zithromax Abscess Tooth Levitra Krankenkasse Cialis Trial Packs Express Shipping http://costofcial.com - cialis price Mail Order Stendra Avanafil discount generic isotretinoin website mastercard store Winston-Salem Cialis Contrareembolso Foros

[guest] Гость

Было сказано: Воскресенье, 07 Январь 2018

<a href="http://buyviagracy.com/">buy viagra now</a>
generic viagra http://buyviagracy.com

[guest] Гость

Было сказано: Вторник, 09 Январь 2018

<a href="http://canadlan-pharmacy.com/">cheap viagra online canadian pharmacy</a>
viagra pills http://canadlan-pharmacy.com

[guest] Гость

Было сказано: Вторник, 09 Январь 2018

<a href="http://essaywritingserviceus.com/">personal essay examples</a>
a essay http://essaywritingserviceus.com

[guest] Гость

Было сказано: Понедельник, 15 Январь 2018

fwjxyp <a href=http://cialisxtl.com/cialis-5mg-best-price>cialis</a>

Перейти к странице:

Оставить комментарий


Код:
Имя: