Часто необходимо реализовать проект на различных языках и с различными региональными особенностями. 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)

Свойство Тип Описание
$categorystringКатегория сообщения. По сути - это имя файла или путь к категории и имя файла.
$messagestringИсходное сообщение.
$paramsarrayПараметры, которые будут применяться к сообщению с помощью strtr. Первый параметр может быть число без ключа, этот параметр можно указать в сообщении с помощью {n}.
$sourcestringУказывает какие источники сообщений использовать. По умолчанию null, что означает использовать стандартные сообщения yii.
$languagestringЦелевой язык. По умолчанию язык приложения.
{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