UnicoreCMS

Языки и переводы

Перевод интерфейса и перевод контента устроены по-разному

В проекте два независимых слоя перевода.

Интерфейс. Надписи на кнопках, заголовки форм, тексты ошибок. Они одинаковые у всех проектов на UnicoreCMS и лежат в общем словаре ключей.

Контент. Ваши новости, товары, описания серверов и привилегий. Их знаете только вы и переводите прямо в форме редактирования записи.

Языки

Управление контентом → Локализация, кнопка Языки. При первом запуске движок заводит русский и английский и сам заливает интерфейсные ключи. Дальше добавляйте свои.

ПолеЧто делает
КодДве буквы или две через дефис: ru, en, pt-br
НазваниеКак язык называется в переключателе
ВключёнПоказывать ли его игрокам
По умолчаниюНа каком языке сайт откроется у нового посетителя
ПриоритетПорядок в переключателе

Выключенный язык исчезает из переключателя, а переводы никуда не деваются. Готовьте локализацию не спеша и включайте, когда будет готова.

Удаление языка уносит переводы

Вместе с языком стираются все его строки, и интерфейсные, и переводы контента. Если язык просто не нужен сейчас, снимите галочку «Включён» вместо удаления.

Языка нет в URL

В адресах нет /ru/news и /en/news. Выбранный язык хранится в куке и уезжает на сервер заголовком x-locale, поэтому у страницы один адрес и в поисковой выдаче нет дублей.

Перевод интерфейса

На той же странице: выбираете язык в списке наверху и правите значения ключей прямо в таблице. Ключей около тысячи, поэтому есть поиск сразу по ключу и по значению. Правки копятся, пока не нажмёте Сохранить.

Ключи сгруппированы по префиксам: admin.* для админки, cfg.* для подписей настроек, rcon.* для окна шаблонов команд. Всё остальное относится к публичному сайту.

Заводить ключи вручную обычно не нужно, они попадают в словарь сами, как только появляются в коде. Кнопка Добавить ключ нужна редко, а вот удаление ключа стирает его сразу во всех языках, так что осторожнее.

Непереведённая строка помечена подсказкой «Нет перевода» и на сайте показывается сама собой, вместо текста. Выглядит некрасиво, но вёрстку не ломает.

Перевод контента

В форме редактирования новости, товара, сервера или привилегии есть переключатель языков. Выберите английский, и поля превратятся в поля перевода. Кнопка Скопировать оригинал переносит русский текст в поле перевода, чтобы было от чего отталкиваться.

Цветная точка рядом с каждым языком показывает, насколько он заполнен для этой записи. Общие поля вроде цены, картинок и связей правятся только на основном языке: переводится один текст.

Что переводится, перечислено на странице про контент. Незаполненный перевод означает «показать оригинал», так что пустого поля вместо названия товара на сайте не будет.

Запись одна на все языки

Перевод надстраивается над записью, а не копирует её. У товара один ID, одна цена, один остаток; переводы подменяют текстовые поля при отдаче. Поэтому пятый язык не создаёт пятую копию каталога.

Как это устроено под капотом

Все переводы контента лежат в одной таблице с составным ключом: язык, тип сущности, ID записи, путь до поля. Строка выглядит так:

en | product | 42 | name        | Diamond Sword
en | product | 42 | description | A very sharp sword
en | server  | hitech | table.0.title | Version

Одна таблица вместо десятка «news_translations», «products_translations» и так далее. Порядок колонок в ключе задаёт кластерный индекс: все переводы одной записи лежат в базе физически рядом. На замерах с 20 000 строк выборка переводов одной записи занимает доли миллисекунды.

Путь с цифрой (table.0.title) указывает на элемент вложенного списка: строку в таблице характеристик сервера или особенность донат-группы.

Как выбирается язык

Для посетителя сайта:

  1. Кука с выбранным языком, если он уже переключался.
  2. Иначе включается язык по умолчанию из списка языков.

Админка использует отдельную куку: переводчик может держать сайт на английском, а панель на русском.

При переключении языка страница перезагружается целиком. Часть данных на сайте подгружается императивно, и от мягкого обновления на экране оставались бы куски старого языка.

Письма

Письма тоже переводятся. Движок помнит язык каждого пользователя, и письмо активации уходит на нём. Если перевода нет, отправится оригинал.

Чего пока нет

  • Поиск в магазине ищет по оригинальным названиям, не по переводам.
  • Названия ролей не переводятся.

Содержание