Интернационализация (I18N) является частью процесса разработки приложения, которое может быть адаптировано для
нескольких языков без изменения программной логики. Это особенно важно для веб-приложений, так как потенциальные
пользователи могут приходить из разных стран.
Yii располагает несколькими средствами, призванными помочь с интернационализацией веб-приложения: [переводом
сообщений][], [форматированием чисел и дат][].
Локализация и языки
-------------------
В Yii приложении определены два языка: [[yii\base\Application::$sourceLanguage|исходный язык]] н [[yii\base\
Application::$language|язык перевода]].
На "исходном языке" написаны сообщения в коде приложения. Если мы определяем исходным языком английский, то
в коде можно использовать конструкцию:
```php
echo\Yii::t('app','I am a message!');
```
Язык перевода определяет, в каком виде будет отображаться текущая страница, т.е. на какой язык будут переведены
оригинальные сообщения. Этот параметр определяется в конфигурации приложения:
```php
return[
'id'=>'applicationID',
'basePath'=>dirname(__DIR__),
// ...
'language'=>'ru-RU',// <- здесь!
// ...
]
```
> **Подсказка**: значение по умолчанию для [[yii\base\Application::$sourceLanguage|исходного языка]] - английский.
Вы можете установить значение текущего языка в самом приложении в соответствии с языком, который выбрал пользователь.
Это необходимо сделать до того, как будет сгенерирован какой-либо вывод, чтобы не возникло проблем с его
корректностью. Используйте простое переопределение свойства на нужное значение:
```php
\Yii::$app->language='ru-RU';
```
Формат для установки языка/локали: `ll-CC`, где `ll` - это двух или трёхбуквенный код языка в нижнем регистре в
соответствии со стандартом [ISO-639](http://www.loc.gov/standards/iso639-2/), а `CC` - это код страны в соответствии
со стандартом [ISO-3166](http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html).
> **Примечание**: больше информации о синтаксисе и концепции локалей можно получить в [документации проекта ICU](http://userguide.icu-project.org/locale#TOC-The-Locale-Concept).
Перевод сообщений
-----------------
Перевод используется для локализации сообщений, которые будут выведены в приложении в соответствии с языком,
который выбрал пользователь.
По сути, Yii просто находит в файле с сообщениями на выбранном языке строку, соответствующую сообщению на исходном
языке приложения. Для перевода сообщений, необходимо в самом приложении заключать их в метод [[Yii::t()]]. Первый
аргумент метода - это категория, которая позволяет группировать сообщения по определённому признаку, а второй - само
сообщение.
```php
echo\Yii::t('app','This is a string to translate!');
из одного из источников, определённых в `i18n`[компонентах приложения](concept-components.md). Сообщения - это набор
файлов или база данных, которая содержит переведённые строки. Следующая конфигурация определяет, что сообщения
должны браться из PHP-файлов:
```php
'components'=>[
// ...
'i18n'=>[
'translations'=>[
'app*'=>[
'class'=>'yii\i18n\PhpMessageSource',
//'basePath' => '@app/messages',
//'sourceLanguage' => 'en-US',
'fileMap'=>[
'app'=>'app.php',
'app/error'=>'error.php',
],
],
],
],
],
```
В приведённой конфигурации, `app*` - это шаблон, который определяет, какие категории обрабатываются источником. В нашем
случае, мы обрабатываем все, что начинается с `app`. Файлы с сообщениями находятся в `@app/messages` (папке `messages`
в вашем приложении). Массив [[yii\i18n\PhpMessageSource::fileMap|fileMap]] определяет, какой файл будет подключаться для
определённой категории. Если вы не хотите конфигурировать `fileMap`, можно положиться на соглашение, что название
категории является именем файла. Например, категория `app/error` относится к файлу `app/error.php` в рамках [[yii\i18n\PhpMessageSource::basePath|basePath]].
Переводя сообщение `\Yii::t('app', 'This is a string to translate!')` при установленном языке приложения `ru-RU`, Yii
сначала будет искать файл `@app/messages/ru-RU/app.php`, чтобы получить список доступных переводов. Если есть файл
`ru-RU`, Yii также попробует поискать `ru` перед тем, как примет решение, что попытка перевода не удалась.
Кроме хранения в PHP-файлах (используя [[yii\i18n\PhpMessageSource|PhpMessageSource]]), Yii предоставляет ещё два
класса:
-[[yii\i18n\GettextMessageSource]], использующий GNU Gettext для MO или PO файлов.
-[[yii\i18n\DbMessageSource]], использующий базу данных.
### Именованные указатели
Вы можете добавлять параметры в строку для перевода, которые в выводе будут заменены соответствующими значениями,
заключая параметр в фигурные скобки:
```php
$username='Alexander';
echo\Yii::t('app','Hello, {username}!',[
'username'=>$username,
]);
```
Обратите внимание, что в операции присваивания фигурные скобки не используются.
### Позиционные указатели
```php
$sum=42;
echo\Yii::t('app','Balance: {0}',$sum);
```
> **Подсказка**: старайтесь сохранять читаемость сообщений и избегать избыточного использования позиционных
параметров. Помните, что переводчик, скорее всего, будет располагать только файлом со строками и для него
должно быть очевидно, на что будет заменён тот или иной указатель.
### Указатели с расширенным форматированием
Чтобы использовать расширенные возможности, вам необходимо установить и включить [PHP-расширение intl](http://www.php.net/manual/en/intro.intl.php).
После этого вам станет доступен расширенный синтаксис указателей, а также сокращённая запись `{placeholderName, argumentType}`,
эквивалентная форме `{placeholderName, argumentType, argumentStyle}`, позволяющая определять стиль форматирования.
Полная документация доступна на [сайте ICU](http://icu-project.org/apiref/icu4c/classMessageFormat.html), но далее в
документации будут приведены примеры использования расширенных возможностей интернационализации.
#### Числа
```php
$sum=42;
echo\Yii::t('app','Balance: {0, number}',$sum);
```
Вы можете использовать один из встроенных форматов (`integer`, `currency`, `percent`):