Часто необходимо реализовать проект на различных языках и с различными региональными особенностями. Yii поддерживает интернационализацию на нескольких уровнях:
- Предоставляет региональные данные для всех возможных языков и их вариаций.
- Сервис для перевода сообщений и файлов.
- Форматирование дат и чисел в зависимости от региональных настроек.
Рассмотри пример работы с механизмом перевода сообщений.
Чтобы использовать механизм перевода сообщений, необходимо следующее:
- В файле конфигурации
protected/config/main.php
установить значенияCApplication::sourceLanguage
иCApplication::language
- Создать файлы перевода
protected/messages/IdЯзыка/ИмяКатегории.php
(Каждый такой файл просто возвращает массив переведённых сообщений). Обратите внимание, что при этом используетсяCPhpMessageSource
- Вызвать
Yii::t()
в нужных местах
Пример реализации:
В файле protected/config/main.php
добавим параметры: sourceLanguage
и language
.
<?php return array( //... 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', 'sourceLanguage' => 'en_US', 'language' => 'ru', //... );
sourceLanguage
- это язык, на котором сайт написан изначально.
language
- текущий язык пользователя.
Сразу после добавления этих параметров, стандартные сообщения yii будут на русском языке (например сообщения валидации форм). Так как в папке yii protected/framework/messages
уже есть перевод на русский (и еще на 36 других языков).
Для перевода собственных сообщений приложения, необходимо в папке protected/messages
создать папку с названием языка соответствующего стандарту ISO 639-1, то есть двухбуквенное обозначение нужного языка (Например: ru, uk, pl, ...).
Создадим перевод сообщений для русского языка. Для этого создадим папку protected/messages/ru
и файл в ней app.php
(имя файла можете выбрать самостоятельно) в котором будут храниться все переводы сообщений приложения. Пример файла app.php
:
<?php return array( 'Description' => 'Описание', 'Category' => 'Категория', //Пример использования склонений '... {n} user ...|users ...' => '... {n} пользователь ...|... {n} пользователя ...|... {n} пользователей ...', //Здесь {n} — специальный токен, который будет заменён на переданное число. //Пример использования и дополнительного параметра '{username} has a record|{username} has {n} records' => '{username} имеет только 1 запись|{username} имеет {n} записи|{username} имеет {n} записей', //... );
Перевод сообщений осуществляется при помощи метода Yii::t()
. Метод переводит данное сообщение с исходного языка sourceLanguage
приложения на текущий язык приложения language
.
Параметры Yii::t()
:
Yii::t($category, $message, $params, $source, $language)
Свойство | Тип | Описание |
---|---|---|
$category | string | Категория сообщения. По сути - это имя файла или путь к категории и имя файла. |
$message | string | Исходное сообщение. |
$params | array | Параметры, которые будут применяться к сообщению с помощью strtr . Первый параметр может быть число без ключа, этот параметр можно указать в сообщении с помощью {n} . |
$source | string | Указывает какие источники сообщений использовать. По умолчанию null , что означает использовать стандартные сообщения yii. |
$language | string | Целевой язык. По умолчанию язык приложения. |
{return} | string | Переведенное сообщение. |
Теперь там, где раньше выводился текст заменяем его на вызов Yii::t()
:
<?php //Ваш код... echo Yii::t('app', 'Description'); //Выведет: Описание echo Yii::t('app', '... {n} user ...|users ...', 10); //Выведет: ...10 пользователей ... echo Yii::t('app', '{username} has a record|{username} has {n} records', array(10, '{username}' => 'coder')); //Выведет: coder имеет 10 записей //Ваш код...
Таких файлов перевода может быть столько, сколько Вам необходимо. Для примера создадим файл перевода атрибутов модели Post
для модуля admin
.
В папке protected/modules/admin/messages/ru
создадим файл cmsPost.php
в котором будут храниться переводы атрибутов модели. Пример файла cmsPost.php
:
<?php return array( //... 'Header' => 'Заголовок', 'Text' => 'Текст', 'Visibility' => 'Выводить', 'Date' => 'Дата создания', //... );
В модели protected/modules/admin/models/CMSPosts.php
:
<?php class CMSPosts extends Post { //... public function attributeLabels() { return array( //... 'header' => Yii::t('adminModule.cmsPost', 'Header'), 'text' => Yii::t('adminModule.cmsPost', 'Text'), 'visibility' => Yii::t('adminModule.cmsPost', 'Visibility'), 'date' => Yii::t('adminModule.cmsPost', 'Date'), //... ); } //...
Теперь атрибуты в форме будут доступны как для английского, так и для русского языков.
Тоже самое можно сделать и для виджета. Например, виджет называется MainNavigation
и расположен в папке /protected/modules/admin/widgets/Menu
. Соответственно путь к виджету /protected/modules/admin/widgets/Menu/MainNavigation.php
. Создадим в папке /protected/modules/admin/widgets/Menu
папку messages
, а в ней папку ru
. Дальше создадим файл перевода сообщений, например cmsMenu.php
, заполним его. И теперь можем вызывать его из виджета следующим образом:
<?php class MainNavigation extends CWidget { //... echo Yii::t('MainNavigation.cmsMenu', 'Main page'); //...
Больше информации: http://yiiframework.ru/doc/guide/ru/topics.i18n
Комментарии
Комментарии отсутствуют, Вы можете быть первым