Мультиязычность

Перевод в коде и шаблонах

Переводы слов и строк, хранятся в обычных 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>

Перевод в данных

...

© Автор и разработчик Михаил Шершнёв, 2006–2021
E-mail: support@bwframework.ru