Налаштування багатомовності в MODX

<?php
$locale = $modx->getOption('locale');
setlocale(LC_ALL, $locale);

Коли наступним пунктом Дорожньої Карти стала багатомовність, то несподівано для себе не зміг знайти вичерпного документа, який би пояснював порядок дій крок за кроком, хоча раніше такі були. Може слабо шукав? Частина офіційної документації задіяних розширень загубилась в кабінеті №404, а поради на форумах іноді траплялись суперечливі або просто не працювали в . Тож іще за довго до того, як скінчити, вирішив, що обов'язково мушу звести знайдені мною дієві поради в один документ. Пост написаний з погляду адміністратора робочого одномовного сайту з певною кількістю сторінок, з розробленими раніше без урахування багатомовності шаблонами. Комусь та стане в пригоді.

Бекап

Не зайве нагадати зберегтися перш ніж перейти на новий рівень! Якщо є можливісь, такі речі треба взагалі робити на дзеркалі і запускати онлайн, коли все перевірено і працює. Вчимося на чужих помилках :)

Інсталюємо XRouting і Babel

В головному меню панелі керування сайтом знаходимо ExtrasInstaller. Тиснемо кнопку Download Extras і шукаємо XRouting. Цей додаток переспрямовує між перекладеними ресурсами. Востаннє розширення було оновлене 2015-го року. Є подібний додаток, оновлений востаннє 2016-го. Тож обидва вже трохи "пахнуть". А може вони настільки круті, що не потребують оновлень. Я ставив перший. А, є ще такий собі LangRouter і, мабуть, крім цих трьох є ще — вибір є, як виникне потреба.

Екран менеджера панкунків

Потім Download, потім Back to Package Manager, в Менеджері Пакунків знаходимо наш завантажений додаток, клацаємо Install. Готово.

Та сама процедура з додатком Babel. Але тут можемо зробити одразу деякі налаштування:

Екран початкових налаштувань Babel

В перше поле я вніс через кому перелік контекстів, які Babel має обслуговувати. Зробити це, або внести якісь зміни, можна і пізніше, знайшовши системну установку babel.contextKeys. Вміст третього поля збережеться в установці babel.syncTvs. Потім розберешся для чого воно.

Створюємо контексти і відповідні системні установки

З коробки MODX надає тобі два контексти: mgr і web. Тобто для бек- і фронтенду.

Контексти MODX з коробки

Тому наступний крок — створити контексти для кожної мовної версії сайту — клацаємо Create New і заповнюємо обов'язкові поля:

Створення нового контексту

Тепер у дереві ресурсів має з'явитися новостворений контекст:

Новий контекст у дереві ресурсів

Але це лише початок. Далі треба створити деякі системні установки, що використовуються в даному контексті. Власне, саме заради них ми й потребували окремих контекстів для кожної мови. Для цього клацніть пукт Update Context із меню правої кнопки мишки:

Оновити контекст

Ось вичерпний перелік необхідних установок:

Системні установки для контекстів

Ясна річ — мої дані наведено як зразок. Ви вказуєте ваші дані.

Важливо нічого не пропустити. Я свого часу не вказав http_host і змарнував море часу на пошук причини 404-ї помилки, коли переходив на перекладені сторінки за посиланнями, наданими [[BabelTranslation]].

Перекладаємо ресурси

Якщо все було зроблено правильно, тепер ви готові створити переклади ресурсів (веб-сторінок), обравши відповідний пункт меню на сторінці редагування ресурса біля кнопки Save:

Створити переклади

Правимо шаблони сторінок

Тепер ви можете переглянути свої нові сторінки за допомогою меню View редактора сторінки. І виглядають та/або працють вони не так, як ви хочете. Я помиляюся? Ну, тоді гортайте до наступного підрозділу. Але, швидше за все, ви маєте проблеми з JS, CSS і, можливо, картинками чи документами, — це все через відносні посилання. Тут кожна ситуація буде індивідуальною, все залежить від того, як верстався сайт. Тому лише зверну увагу на загальні випадки і на використання системних установок, які ми створювали для нових контекстів.

Перш за все вам може знадобитись встановити локаль в PHP, якщо маєте справу, наприклад, з форматами дат чи іншими локальними даними. Для цього на самому початку шаблона можете запустити сніпет із подібним вмістом:

<?php
$locale = $modx->getOption('locale');
setlocale(LC_ALL, $locale);

Цю локаль ви встановлювали однією з системних установок. Пригадуєте?

Тепер перевірте, чому не підвантажуються ресурси. Швидше за все, були вказані відносні шляхи, а база тепер змінилася:

<base href="[[++site_url]]">
<!--
    <base href="https://sampledom.ain/uk/">
        vs
    <base href="https://sampledom.ain/">
-->

Тож вам необхідно якимось чином вказати правильні шляхи до стилів та скриптів. Наприклад так:

<script defer src="[[++server_protocol]]://[[++http_host]]/[[++tpl]]/js/site.min.js"></script>

lexicon в поміч

Щоб не писати багато про Лексикон, ось стаття.

Я про всяк випадок створив власний простір імен. Бо раптом вони перезаписуються під час оновлення modx.

Простори імен

Тепер ось тут можна додавати і змінювати записи:

Керування лексиконом

Інші зауваження

Уважно перегляньте код сторінки, щоб знайти що ще треба поправити. Це може бути: lang-атрибут тега html, twitter- і opengraph-опис сторінок, хлібні крихти тощо.

Додавання перемикача мов у фронтенд

Ось настільки просто: Babel.BabelLinks

Допоможіть себе знайти

Альтернативні лінки

Google просить використовувати hreflang, щоб спростити їм життя, обробляючи твій сайт. Ти ж не проти? Для цього можеш спробувати різні варіації умовного виконання сніпета [[BabelTranslation]]. Мені не вдалося. Нажаль, не збереглося в пам'яті, що саме не вдавалося. Трохи переробив той сніпет під власні потреби і зберіг під новим ім'ям:

Карта сайту

Я використовую [[GoogleSiteMap]] для генеерації карти сайту. З якоїсь причини до карти не потрапляли переклади. За це відповідальна частина сніпета [[GoogleSiteMap]], що починається наступнимим рядками:

// Set context(s)
$context = array_filter(array_map('trim', explode(',', $modx->getOption('context', $scriptProperties, $modx->context->get('key'), true))));

Чомусь ця системна установка порожня. Не знаю, чи вона має встановлюватися вручну, чи якось інакше. Тому, щоб вона не була випадково перезаписана, зробив нову і підправив відповідно сніпет:

Нова установка для GoogleSiteMap

Якщо щось з описаного не працює, сміливо звертайся.