web-tip.top
WTT

Простий багатомовний веб-сайт із плагіном RainLab.Translate

23.02.2024

Я буду створювати простий багатомовний вебсайт з допомогою плагіна 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;
}

На цьому все!