Логотип

Документация по макросам и шаблонам UMI.CMS

Интернационализация шаблонов сайта

Интернационализация TPL-шаблонов
Интернационализация XSLT-шаблонов
Интернационализация PHP-шаблонов

Теперь, когда у нас есть контент, переведенный на нужный нам язык — нужно добиться вывода его в соответствующей языковой версии шаблона.

Интернационализация TPL-шаблонов

Для интернационализации TPL-шаблонов предусмотрен механизм, отслеживающий наличие в имени шаблона особого элемента, соответствующего префиксу языковой версии сайта, созданного в системе.

Соответственно, для создания шаблонов для новой языковой версии достаточно просто сделать копию имеющихся шаблонов, которые используются на сайте, и добавить в имена файлов этот элемент. При этом шаблоны для страниц, указанные в настройках модуля «Структура», могут носить любое название.

Например, из шаблона главной страницы вызывается макрос %vote insertlast('home')%. Для того, чтобы создать автоматически подключаемую английскую версию этого шаблона, необходимо скопировать файл ~/templates/%имя%/tpls/vote/home.tpl и назвать его home.en.tpl. Тем самым мы укажем системе, что при отображении главной страницы английской версии сайта нужно использовать именно этот шаблон для вывода блока голосования.
Остаётся только перевести текстовое содержимое файла на английский язык.

Интернационализация XSLT-шаблонов

При интернационализации XSLT-шаблонов используется специальный протокол «Ulang» и возможности самого языка XSLT.

С помощью xslt-сущностей мы можем определить набор языковых констант для каждой языковой версии сайта. Наборы таких констант следует помещать в директорию ~/templates/%имя%/xslt/i18n/ в файлы constants.%префикс%.dtd. В нашем случае должно быть минимум два файла - constants.dtd(для основной языковой версии, обычно - русской) и constants.en.dtd(для английской языковой версии). В них должен содержаться одинаковый набор констант, с разными значениями. Константы записываются в файл таким образом:

 

<!ENTITY login "Login"> 

Обратите внимание, что файл constants.dtd является файлом констант основной языковой версии. Соответственно, если вы переходите, например, на английскую языковую версию сайта, но файл constants.en.dtd отсутствует - данные будут получены из файла constants.dtd.

После тега ENTITY идёт имя константы (login), а затем её значение (Login).

Теперь в xslt-шаблонах мы можем вызывать эту константу при помощи тега xsl:text таким образом:

<xsl:text>&login;</xsl:text>

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

 

<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file">

сразу после заголовка документа:

 

<?xml version="1.0" encoding="utf-8"?>

Теперь, в зависимости от текущей языковой версии сайта, будет подключаться определенный файл: constants.ru.dtd, constants.en.dtd и т.д.

В обоих случаях трудоёмкость операции можно значительно уменьшить, запланировав отображение сайта на нескольких языках заранее - на этапе планирования и в самом начале работ.

 

Интернационализация PHP-шаблонов

Интернационализация PHP-шаблонов имеет лишь некоторые отличия от предыдущего примера. 
Сначала мы определяем набор языковых констант для каждой версии и помещаем их в папку ~/templates/%имя%/php/i18n/ в файлы i18n.%префикс%.php. 
В них должен содержаться одинаковый набор констант, с разными значениями. Константы записываются в файл таким образом:

<?php 
return
[ 'yes' => 'Yes', 'no' => 'No'
];

<?php 
return [ 'yes' => 'Да', 'no' => 'Нет'
];

Для интернационализации мы используем функцию translate, описанную в системной реализации PHP-шаблоназитора, которой передаём значение необходимой
нам константы.

Например, мы хотим иметь на сайте русскую и английскую версию опции "Купить в один клик":
1. Создаём файлы
~/templates/%имя%/php/i18n/i18n.en.php
~/templates/%имя%/php/i18n/i18n.ru.php

2. В них прописываем имя константы и её значение

'purchase_one_click' => 'Купить в один клик'
'purchase_one_click' => '1-Click order'

3. После этого в шаблоне, где мы собираемся выводить эту опцию, вместо "Купить в один клик" мы пишем
конструкцию следующего вида:

<=$this->translate(название_нужной константы) ?>

В нашем случае это будет выглядеть как

<=$this->translate('purchase_one_click') ?>

Во всех случаях трудоёмкость операции можно значительно уменьшить, запланировав отображение сайта на нескольких языках заранее - на этапе планирования и в самом начале работ.