Мультиязычность в Yii2: как реализовать правила URL?

В интернет-блогах достаточно записей о том, как реализовать мультиязычность в Yii, например, здесь или здесь.
Но Yii2 привнес много изменений, да и время не стоит на месте, поэтому возник вопрос, как лучше сейчас реализовать url-управление мультиязычностью? Возможно появились новые методики?

Как я понял, существует несколько подходов.
1) прямое указывание языка в ссылке и переопределение UrlManager. Например, добавляется правило:
'<language:(ru|ua|en)>/<controller:\w+>/<action:\w+>'=>'<controller>/<action>'
и переопределяется класс. Так было в Yii1.
Но как я понял, в 2 версии (а может и раньше), появилась возможность в качестве правила давать класс UrlRule, и в этом классе уже делать свои правила парсинга: читать сырую документацию. Возможно ли решить этим классом автоматическое добавление в адрес сайта языка? Например, я делаю так: Yii::$app->urlManager->createUrl('video/index'); , а часть "ru" в начале адресной строки будет добавляться прозрачно, без дополнительных указаний. Получится ли так или нужно все равно переопределять UrlManager? Может существует более элегантное решение, о котором я не узнал?

2) ссылка для всех языков одинаковая; при первом заходе информацию о языке берем со свойств браузера или показываем модалку, в которой предлагаем выбрать язык. При выборе языка записываем информацию в cookies, и при следующем заходе берем её уже оттуда. Как я понял, это может немного вредить SEO, или разницы нету?

3) совмещение способов. Информацию о языке тоже записываем в cookies, но и в url его показываем (показался, наиболее оптимальным, хотя требует танца с бубном).

Какой способ предпочтительней?
Также получится ли создать правила с помощью расширения класса UrlRule?
  • Вопрос задан
  • 12780 просмотров
Пригласить эксперта
Ответы на вопрос 5
Я использую сдедующий подход:
1) В базе данных информация о страницах (или товарах, или других сущностях) хранится в двух таблицах: например, page и page_content. Первая таблица - это данные, которые не требуют перевода (например id, дата создания, дата обновления, слаг итд.). Вторая таблица - это текстовые данные, которые будут мультиязычными (meta_title, meta_description, meta_keywords, content). Во второй таблице (с контентом), должно быть поле для связи с первой таблицой (напр. поле page_id), а также поле для указания кода языка. Получается, что для одной записи в первой таблице существует несколько записей во второй таблице, каждая из которых - на разных языках.
2) В моделях нужно прописать связь один к одному для этих таблиц, в которых связующими будут поля по ID и по полю языка (параметр берётся из настроек приложения Yii::$app->language):
public function getPageContent()
{
    return $this->hasOne(PageContent::className(), ['page_id' => 'id'])->andWhere(['page_content.language_code' => Yii::$app->language]);
}

Теперь при выборке данных из первой таблицы, будут подтягиваться тексты из второй таблицы, на текущем языке приложения.
3) Для управления текущим языком приложения и удобного переключения с одного языка на другой (параметр языка хранится в ссылке), существует замечательный компонент Yii2 Locale URLs
Ответ написан
miraage
@miraage
Старый прогер
Думаю, для второго можно сделать так же.
Читайте с пункта "Прозрачная работа с языковыми адресами" (ctrl+f).

www.elisdn.ru/blog/39/yii-based-multilanguage-site...
Ответ написан
@LAV45
На самом деле все очень просто организуется, можете подсмотреть вот тут https://github.com/LAV45/yii2-translated-behavior#...
Ответ написан
Комментировать
at0m1x
@at0m1x
UrlManager переопределять скорее всего все таки предётся, но не обязательно это делать самому, можно использовать например: https://github.com/codemix/yii2-localeurls

Этот компонент позволяет избежать редактирования URL rules.

Подробно о том как это использовать можно почитать тут.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы