Мультиязычность сайта в doit-cms

Многоязычность

Фреймворк позволяет легко организовать многоязычность сайтов, особенно простых.

Многоязычность предполагает следующие принципы:

  1. Разноязычные версии сайта располагаются по адресам site.ru/ru/, site.ru/en/ и т.д.
  2. Язык - двухбуквенный символ (например, ru, en, ua, uk, uz, tt, de, fr и так далее).
  3. Каждый элемент (страница, новость и т.д.) имеет несколько языковых версий. При отсутствии наполнения в англоязычном элементе отображается русскоязычный вариант (по умолчанию).
  4. По-умолчанию выбирется русский язык.
  5. Переводятся два типа данных: поля (заголовки новостей, тексты и т.д.) и константные надписи (часть вёрстки, заголовки, надписи в подвале сайта и т.д.)

Подготовка

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

  1. Создать папку lang в папке app
  2. Создать файлы ru.ini, en.ini в папке app/lang. Названия языков и их количество может отличаться.

Перевод данных из базы данных

Для добавления нового поля, которое будет иметь языковой вариант, необходимо просто создать копию существующего с префиксом en_. То есть для текстовой страницы спсок полей (fields/pages.ini) может быть следующим:

[admin.fields]
small url "Адрес страницы (необязательно)"
small title "Название"
small en_title "Название на английском"
rich text "Текст"
rich en_text "Текст на английском"

Далее, при переходе по адресу site.ru/en/страница все поля, значения английских версий заполнены, будут вставлены автоматически. Изменений в роутере делать не надо. Такие поля, как image (изображения) в английской версии, как правило, не нуждаются, но для некоторых случаев могут быть использованы.

Данный принцип касается любых полей, если есть столбец en_adress, то при запросе и выводе свойства adress объекта ActiveRecord, будет выведено значение из en_adress. Это касается любого языка, но для русского языка префикс не нужен.

В шаблоне для перевода данных из базы данных ничего менять не надо, в коде тоже.

Перевод данных в вёрстке

Для перевода надписей (например "позвоните нам"), необходимо заполнить файлы переводов. Для этого необходимо в файле lang/ru.ini добавить следующие строчки:

[translate]
Call us=Позвоните нам
About us=О нас

Далее в шаблоне вставляется код {"Call us"|t}

Другой вариант:

<?php
    print t("Call us");
?>

Функция t() пытается найти перевод в файлах языка и, если не находит, то выводит текст, который ей передали. Таким образом, найдя перевод, она выводит его для русской версии, и выводит саму фразу "Call us" в английской.

Если фразы более сложные, или языков больше двух, то можно использовать файлы более широко. Например, для фрагмента {"SLOGAN"|t}

ru.ini:

[translate]
SLOGAN=Мы всегда впереди всех!

en.ini:

[translate]
SLOGAN=We always on top!

Кроме того, файлы lang/xx.ini могут содержать другие директивы, кроме блока translate.

Расстановка ссылок

В меню сайта и других местах необходимо правильно расставить ссылки: английская версия сайта должна содержать ссылки на английские страницы.

Если раньше на сайте был код:

<ul>
    <li><a href="/news/{.url}">{.title}</a></li>
</ul>
<a href="/about">{"About"|t}</a>

То его надо изменить следующим образом:

<ul>
    <li><a href="{langlink}/news/{.url}">{.title}</a></li>
</ul>
<a href="{langlink}/about">{"About"|t}</a>

Переменная langlink, она же d()->langlink - автоматически инициируемая переменная. Она содержит пустую строку для русского языка и, например, /en для английского и необходима для формирования ссылок.

Переменная lang, она же d()->lang - автоматически инициируемая переменная. Она содержит ru для русского языка и, например, en для английского.

Даты

Для вывода дат можно использовать функцию ml_userdate, аналог userdate, но автоматически переводящей язык. Например:

<div>
    Дата новости:
    <span>{.date|ml_userdate}</span>
</div>

Итог

Для того, чтобы сделать многоязычный сайт, необходимо:

  1. Создать папку lang с нужными языками (некоторые из них могут быть пустыми)
  2. Создать столбцы en_title, en_text в таблицах и дать их редактировать адмнистратору
  3. Расставить фрагменты вроде {"News"|t} в шаблонах и перевести их в файлах перевода в папке lang
  4. Расставить {langlink} для нормального функционирования ссылок

Оригинал: https://github.com/ramainen/doit-cms/blob/master/docs/multilang.md


Скачать Пример папки app