Я буду створювати простий багатомовний вебсайт з допомогою плагіна RainLab.Translate. Плагін дозволяє переводити текстові рядки, поля в адмін панелі, поштові шаблони, налаштування теми та інше. Про все це сказано в документації до плагіна.
Основна мова - англійська, другорядна - українська. Головна версія буде без префіксу в url, а сторінки української версії будуть мати префікс uk (наприклад web-tip.top/uk).
1) Встановлюємо плагін RainLab.Translate і в налаштуваннях додаємо англійську мову (en, мова за змовчуванням), та українську (uk).
2) Підключаємо компоненти [localePicker] та [alternateHrefLangElements] в наш layout, та відмічаємо forceUrl щоб Translate плагін додавав префікс до url:
[localePicker]
forceUrl = 1
[alternateHrefLangElements]
3) В місце де потрібно відображати вибір мови вставляємо:
<a href="#" data-request="onSwitchLocale" data-request-data="locale: 'en'" class="{{ activeLocale == 'en' ? 'css клас для активного перемикача' : '' }}">EN</a>
<a href="#" data-request="onSwitchLocale" data-request-data="locale: 'uk'" class="{{ activeLocale == 'uk' ? 'css клас для активного перемикача' : '' }}">UA</a>
4) До тегу html додаємо локаль:
<html lang="{{ activeLocale ?: 'en' }}" translate="no" dir="ltr">
5) В head виводимо alternale посилання:
{% component 'alternateHrefLangElements' %}
6) В .env додаємо TRANSLATE_PREFIX_LOCALE (відключаємо примусове додавання префіксу для мови за змовчуванням):
TRANSLATE_PREFIX_LOCALE=false
В старій версії RainLab.Translate ця опція не винесена в .env, тому потрібно в конфігі плагіна (plugins/rainlab/translate/config/config.php) встановити для prefixDefaultLocale значення false.
7) В секції php коду додаємо код який буде видаляти префікс з url (301 редірект на url без префікса), якщо хтось додасть його вручну:
function onStart(){
if($this->removeDefaultLocalePrefixFromUrl()){
return Redirect::to($this->removeDefaultLocalePrefixFromUrl(), 301);
}
}
function removeDefaultLocalePrefixFromUrl(){
$translator = \RainLab\Translate\Classes\Translator::instance();
$defaultLocale = $translator->getDefaultLocale();
$url = \Request::getUri();
$root = \Request::root();
if(strpos($url, '/'.$defaultLocale.'/') !== FALSE or $url == $root.'/'.$defaultLocale){
return str_replace('/'.$defaultLocale, "", $url);
}
return false;
}
На цьому все!