Мультиязычность
Перевод в коде и шаблонах
Переводы слов и строк, хранятся в обычных PHP-файлах, называемыми "словарями".
3 варианта организации переключения языков, каждый имеет свои особенности.
- Через URL, например http://site.com/ru/my-article/ и http://site.com/en/my-article/
Самый лучший вариант для SEO. - Через разные домены/поддомены, например http://ru.site.com/my-article/ и http://en.site.com/my-article/
- Динамическое переключение, через параметр: http://site.com/?_language=ru и http://site.com/?_language=en
Лучший вариант для динамических интерфейсов.
// Загрузить словарь с именем my_dictionary, физический путь /var/www/site.ru/internals/dictionaries/ru/my_dictionary.php
// Вызывать необходимо 1 раз.
$dictionary = app::load_dictionary('my_dictionary');
// Также можно загружать словарь (файл) находящийся в поддиректории и по желанию, можно указывать имя файла с расширением.
// Загрузить словарь с именем my_dictionary, физический путь /var/www/site.ru/internals/dictionaries/ru/my_dir/my_dictionary.php
$dictionary = app::load_dictionary('my_dir/my_dictionary.php');
// Загрузить словарь указанного языка.
$dictionary = app::load_dictionary('my_dictionary', 'russian');
// Выполнить перевод.
echo $dictionary->translate('Hello World!');
// Можно так.
echo app::get_dictionary('my_dictionary')->translate('Hello World!');
// Более короткий вариант.
echo dict('my_dictionary')->t('Hello World!');
// Самый короткий вариант (не загружает словарь, нельзя выбрать словарь, нельзя указать язык).
echo t('Hello World!');
Перевод в Smarty-шаблоне будет иметь примерно такой вид.
<p>{t('Name')}: {$vars.name}</p>
Перевод в PHTML-шаблоне будет иметь примерно такой вид.
<p><?=t('Name');?>: <?=$vars['name'];?></p>
Как выглядит файл словаря.
Для файлов словарей выделена директория /internals/dictionaries, внутри которой находятся поддиректории, именами которых является код языка, например:
/internals/dictionaries/ru
/internals/dictionaries/en
/internals/dictionaries/cn
Список доступных языков задаётся в конфигурационном файле в параметре $config['languages'].
Внутри языковых директорий располагаются словари. Словарь - это обычный PHP-файл, внутри которого находится ассоциативный массив $list. Регистр ключей не имеет значения при использовании через функции перевода. Пример:
<?
$list['Template engine Native'] = 'Шаблонный движок Native';
$list['Name'] = 'Имя';
?>
Словари можно группировать в директории. Загрузить такой словарь можно с указанием пути, пример:
// Также можно загружать словарь (файл) находящийся в поддиректории и по желанию, можно указывать имя файла с расширением.
// Загрузить словарь с именем my_dictionary, физический путь /var/www/site.ru/internals/dictionaries/ru/my_dir/my_dictionary.php
$dictionary = app::load_dictionary('my_dir/my_dictionary.php');
Перевод в модулях
Принцип перевода такой же, как и для приложения. Загружать словари можно на этапе инициализации, то есть в ".metadata/init.php"
Словари модуля загружаются в объект модуля, и недоступны через app::get_dictionary(). Словари модуля загружаются и вызываются через методы модуля:
- $module->get_dictionary()
- $module->load_dictionary()
- $module->t()
Перевод в Smarty-шаблоне будет иметь примерно такой вид.
<p>{app::get_module('my_module')->t('Name')}: {$vars.name}</p>
Перевод в PHTML-шаблоне будет иметь примерно такой вид.
<p><?=app::get_module('my_module')->t('Name');?>: <?=$vars['name'];?></p>
Перевод в данных
...