Реализация мультиязычности в KVS

Локализация контента

KVS поддерживает полную локализацию контента в Ultimate пакете.

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

После этого работа с переводами контента и объектов категоризации станет возможна в разделе Администрирование -> Локализация данных. Этот раздел предоставляет унифицированный интерфейс для перевода всех типов объектов, которые поддерживают локализацию в KVS. Если переводить видео и альбомы вам удобнее в основных редакторах этих объектов, то в персональных настройках вы можете включить отображение языковых полей на страницах редактирования видео / альбомов и работать там. Все действия по переводу объектов пишутся в лог аудита и могут быть обработаны плагином Анализ лога аудита. Таким образом вы запросто сможете контролировать работу переводчиков и рассчитывать их оплату.

При выводе информации на сайте данные контента будут выводиться в зависимости от текущей локали сайта. Для этого не нужно вносить никаких изменений в шаблоны сайта. Если часть данных каких-либо объектов не переведена (например, переведено только 50% видео), то по оставшимся объектам будут выводиться непереведенные данные, т.е. сайт может вполне работать и в случае частичной локализации контента.

Построение языковых частей проекта

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

Языковые сателлиты позволяют построить независимый проект, связанный только на уровне базы данных, что крайне рекомендуется для проектов с большим набором информации, т.к. этот подход позволяет в случае повышенной нагрузки выносить языковые части на отдельные сервера, либо на отдельные диски (для корректной работы большого объема кэша).

Языковые сателлиты позволяют создавать языковые копии на произвольных доменах (например, domain.com и domain.ru). В случае построения в пределах одного домена допускается построение языковых версий сайта только на сабдоменах лицензии (например, de.domain.com), либо через папки (например, domain.com/de/).

Языковые сателлиты имеют независимые шаблоны и рекламу (это не препятствует опциональному наличию одной копии шаблонов и/или рекламы и настройки гибкой синхронизации остального набора копий с главным). В случае построения в пределах одного домена все различия описываются в одном варианте шаблона, что может привести к затруднению в работе с ним.

Языковые сателлиты содержат уникальную статистику. В случае построения в пределах одного домена отдельной статистики по посещаемости языковых частей проекта нет.

Построение в пределах одного домена лицензии

Для этого в /admin/include/setup.php необходимо описать различия между языковыми версиями подобным образом в случае использования сабдоменов:

if ($_SERVER['SERVER_NAME']== 'de.domain.com') { $config['project_url']="http://de.domain.com"; $config['locale']="de"; } elseif ($_SERVER['SERVER_NAME']== 'fr.domain.com') { $config['project_url']="http://fr.domain.com"; $config['locale']="fr"; } else { $config['project_url']="http://domain.com";}

При использовании папок код будет выглядеть следующим образом:

if (strpos($_SERVER['SCRIPT_NAME'], '/de/')!==false) { $config['project_url']="http://domain.com/de"; $config['locale']="de"; } elseif (strpos($_SERVER['SCRIPT_NAME'], '/fr/')!==false) { $config['project_url']="http://domain.com/fr"; $config['locale']="fr"; } else { $config['project_url']="http://domain.com";}

В случае сабдоменов необходимо настроить их document root на ту же директорию, где находятся файлы основного домена.

В случае папок необходимо вручную синхронизировать корневой .htaccess файл между корнем и языковыми папками, который описывает пути на сайте. В этом плане проще использовать сабдомены, это позволит избежать различий в .htaccess файле.

Языковые сателлиты

Этот подход подразумевает установку отдельных сателлитов KVS на языковые сабдомены и подключение их к основной базе. Поскольку сателлиты содержат разные наборы страниц и шаблонов сайта, это позволяет подключить новые языки сайта без переноса основных шаблонов сайта на языковые ключи (т.е. скопировать основные шаблоны и заменить в них нужный текст на новый язык), что может быть проще в случае подключения 1 языка. При необходимости подключения нескольких дополнительных языков проще будет переводить шаблоны сайта на языковые ключи, т.к. после этого для подключения нового языка достаточно перевести только языковой файл.

Основным плюсом данного подхода является возможность выноса языковых сайтов на отдельные сервера или HDD. Дополнительным плюсом также может служить наличие отдельной статистики по каждому языковому сателлиту, возможность использовать различные наборы рекламы, а при желании и любые различия в дизайне и структуре сайтов. Минусы данного подхода - необходимость поддержки дополнительных инсталляций KVS (включая обновление каждого в отдельности), а также необходимость отдельно вносить изменения в шаблоны сайта. Последний недостаток можно устранить при использовании языковых ключей на основном сайте. В этом случае можно настроить автоматическую серверную репликацию всех изменений шаблонов и конфигурации страниц с основного сайта на сателлиты.

Для перевода сателлита в одну из поддерживаемых локалей вам необходимо добавить такую строчку в файл /admin/include/setup.php:

$config['locale']='de'; // укажите один из поддерживаемых языковых кодов, который назначается для данного сателлита, после этого сателлит будет отображаться в указанной локали.

Языковые ключи

Для использования языковых ключей в шаблонах сайта вам необходимо создать файл /langs/default.php с определением всех ключей и их значений для локали по умолчанию. Затем скопировать содержимое этого файла в языковые файлы с именами /langs/de.php, /langs/fr.php и т.д. для всех поддерживаемых локалей и отдать их переводчикам. Сами файлы должны иметь такой формат:

<?php $lang['key1']="Text 1"; $lang['section1']['key1']="Section 1 Text 1"; $lang['section1']['key2']="Section 1 Text 2"; $lang['section2']['subsection1']['key1']="Section 2 Subsection 1 Text 1"; ... ?>

Количество и вложенность секций может быть любой по вашему желанию.

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

$lang['site_title']="Site name - best videos and community site"; $lang['posted_by']="Posted by"; $lang['duration']="Duration"; ... $lang['main_menu']['home']="Home"; $lang['main_menu']['videos']="Videos"; ...

Далее в шаблонах сайта можно использовать такие ключи для вывода тех или иных текстовок:

{{$lang.site_title}} {{$lang.posted_by}} {{$lang.duration}} {{$lang.main_menu.home}} {{$lang.main_menu.videos}}

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

$lang['titles']['videos_by_category']="Videos for category %1%"; $lang['confirmations']['delete_messages']="Are you sure to delete %1% messages from %2% user?"; {{$lang.titles.videos_by_category|replace:"%1%":$category_info.title}} {{$lang.confirmations.delete_messages|replace:"%1%":$selected_count|replace:"%2%":$username}}

При необходимости применения модификатора к языковому ключу в динамической переменной следует пользоваться подобным синтаксисом:

{{assign var=nav_page_num value=$nav.page_num[index]|string_format:"%d"}} {{$nav_page_num}} – в результате эта переменная содержит нужное для вывода значение.