Мультиязычность сайта в doit-cms
Многоязычность
Фреймворк позволяет легко организовать многоязычность сайтов, особенно простых.
Многоязычность предполагает следующие принципы:
- Разноязычные версии сайта располагаются по адресам site.ru/ru/, site.ru/en/ и т.д.
- Язык - двухбуквенный символ (например, ru, en, ua, uk, uz, tt, de, fr и так далее).
- Каждый элемент (страница, новость и т.д.) имеет несколько языковых версий. При отсутствии наполнения в англоязычном элементе отображается русскоязычный вариант (по умолчанию).
- По-умолчанию выбирется русский язык.
- Переводятся два типа данных: поля (заголовки новостей, тексты и т.д.) и константные надписи (часть вёрстки, заголовки, надписи в подвале сайта и т.д.)
Подготовка
Для того, чтобы активировать режим мультиязычности, необходимо:
- Создать папку lang в папке app
- Создать файлы 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>
Итог
Для того, чтобы сделать многоязычный сайт, необходимо:
- Создать папку lang с нужными языками (некоторые из них могут быть пустыми)
- Создать столбцы en_title, en_text в таблицах и дать их редактировать адмнистратору
- Расставить фрагменты вроде {"News"|t} в шаблонах и перевести их в файлах перевода в папке lang
- Расставить {langlink} для нормального функционирования ссылок
Оригинал: https://github.com/ramainen/doit-cms/blob/master/docs/multilang.md
Скачать Пример папки app