Spec-Zone.ru › Yii 2.0

Международная локализация

  1. Локаль и язык
  2. Перевод сообщений
  3. Форматирование сообщений
  4. Перевод представлений
  5. Форматирование дат и числовых значений
  6. Настройка среды PHP

Международная локализация (I18N) — это процесс разработки программного приложения, позволяющего адаптировать его к различным языкам и регионам без внесения изменений в код. Для веб-приложений это особенно важно, поскольку потенциальные пользователи могут находиться по всему миру. Yii предлагает полный спектр функций I18N, поддерживающих перевод сообщений, перевод представлений, форматирование дат и чисел.

Локаль и язык

Локаль

Локаль — это набор параметров, определяющих язык пользователя, страну и любые специальные варианты предпочтений пользователя, которые он хочет видеть в пользовательском интерфейсе. Обычно она идентифицируется по идентификатору, состоящему из идентификатора языка и идентификатора региона.

Например, идентификатор en-US обозначает локаль "английский язык, США".

Для обеспечения согласованности все идентификаторы локалей, используемые в приложениях Yii, должны быть приведены к каноническому формату ll-CC, где ll — двух- или трехбуквенный код языка в нижнем регистре в соответствии с ISO-639, а CC — двухбуквенный код страны в соответствии с ISO-3166. Более подробную информацию о локали можно найти в документации проекта ICU по адресу http://userguide.icu-project.org/locale#TOC-The-Locale-Concept.

Язык

В Yii мы часто используем термин "язык" для обозначения локали.

Приложение Yii использует два вида языков:

  • исходный язык: это язык, на котором написаны текстовые сообщения в исходном коде.
  • целевой язык: это язык, который должен использоваться для отображения контента конечным пользователям.

Так называемая служба перевода сообщений в основном переводит текстовое сообщение с исходного языка на целевой язык.

Настройка

Вы можете настроить языки приложения в "конфигурации приложения", как показано ниже:

return [
    // set target language to be Russian
    'language' => 'ru-RU',
    
    // set source language to be English
    'sourceLanguage' => 'en-US',
    
    ......
];

Значение по умолчанию для исходного языка — en-US, что означает американский английский. Рекомендуется не изменять это значение по умолчанию. Обычно найти людей, которые могут переводить с "английского на другие языки", гораздо проще, чем с "не английского на не английский".

Часто необходимо динамически устанавливать целевой язык в зависимости от различных факторов, таких как языковые предпочтения конечных пользователей. Вместо настройки в конфигурации приложения можно использовать следующее утверждение для изменения целевого языка:

// change target language to Chinese
\Yii::$app->language = 'zh-CN';

Подсказка: Если ваш исходный язык меняется в разных частях кода, вы можете переопределить исходный язык для различных источников сообщений, которые описаны в следующем разделе.

Перевод сообщений

С исходного языка на целевой

Служба перевода сообщений переводит текстовое сообщение с одного языка (обычно исходного языка) на другой (обычно целевой язык).

Перевод выполняется путем поиска сообщения, подлежащего переводу, в источнике сообщений, который хранит исходные и переведенные сообщения. Если сообщение найдено, возвращается соответствующее переведенное сообщение; в противном случае возвращается исходное сообщение без перевода.

Как реализовать

Для использования службы перевода сообщений необходимо выполнить следующие действия:

  1. Оборачивайте каждое текстовое сообщение, требующее перевода, вызовом метода Yii::t().
  2. Настройте один или несколько источников сообщений, в которых служба перевода сообщений может искать переведенные сообщения.
  3. Позвольте переводчикам переводить сообщения и хранить их в источнике(ах) сообщений.

1. Обернуть текстовое сообщение

Метод Yii::t() можно использовать следующим образом:

echo \Yii::t('app', 'This is a string to translate!');

где второй параметр относится к текстовому сообщению, подлежащему переводу, а первый — к имени категории, используемой для категоризации сообщения.

2. Настроить один или несколько источников сообщений

Метод Yii::t() вызовет метод i18n компонента приложения translate для выполнения фактической работы по переводу. Компонент можно настроить в конфигурации приложения следующим образом:

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],

В приведенном выше коде настраивается источник сообщений, поддерживаемый yii\i18n\PhpMessageSource.

Подстановочные знаки категорий с символом *

Шаблон app* указывает, что все категории сообщений, имена которых начинаются с app, должны переводиться с использованием этого источника сообщений.

3. Позволить переводчикам переводить сообщения и хранить их в источнике(ах) сообщений

Класс yii\i18n\PhpMessageSource использует файлы PHP с простым массивом PHP для хранения переводов сообщений. Эти файлы содержат отображение сообщений в source language на перевод в target language.

Информация: Вы можете автоматически сгенерировать эти файлы PHP, используя команду message, которая будет представлена позже в этой главе.

Каждый файл PHP соответствует сообщениям одной категории. По умолчанию имя файла должно совпадать с именем категории. Пример для app/messages/nl-NL/main.php:.

<?php

/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

Сопоставление файлов

Вы можете настроить fileMap для сопоставления категории с файлом PHP с другим подходом к именованию.

В приведенном выше примере категория app/error сопоставляется с файлом PHP @app/messages/ru-RU/error.php (при условии, что ru-RU — целевой язык). Однако без этой настройки категория была бы сопоставлена с @app/messages/ru-RU/app/error.php вместо этого.

Другие типы хранилищ

Помимо хранения сообщений в файлах PHP, вы также можете использовать следующие источники сообщений для хранения переведенных сообщений в различных хранилищах:

  • yii\i18n\GettextMessageSource использует файлы GNU Gettext MO или PO для хранения переведенных сообщений.
  • yii\i18n\DbMessageSource использует таблицу базы данных для хранения переведенных сообщений.

Форматирование сообщений

При переводе сообщения вы можете встроить некоторые заполнительные символы и заменить их динамическими значениями параметров. Вы даже можете использовать специальный синтаксис заполнителя, чтобы форматировать значения параметров в соответствии с целевым языком. В этом подразделе мы опишем различные способы форматирования сообщений.

Параметры сообщений

В сообщении, подлежащем переводу, можно встроить один или несколько параметров (также называемых заполнителями), чтобы их можно было заменить заданными значениями. Задавая разные наборы значений, вы можете динамически изменять переведенное сообщение. В следующем примере заполнитель {username} в сообщении 'Hello, {username}!' будет заменен на 'Alexander' и 'Qiang' соответственно.

$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

При переводе сообщения, содержащего заполнители, заполнители должны оставаться такими, какие они есть. Это связано с тем, что заполнители будут заменены фактическими значениями при вызове Yii::t() для перевода сообщения.

Вы можете использовать либо именованные заполнители, либо позиционные заполнители, но не оба в одном сообщении.

Предыдущий пример демонстрирует, как использовать именованные заполнители. То есть каждый заполнитель записывается в формате {name}, и вы предоставляете ассоциативный массив, ключи которого — имена заполнителей (без фигурных скобок), а значения — соответствующие значения, которые будут заменены.

Позиционные заполнители используют нулевые целочисленные последовательности в качестве имен, которые заменяются предоставленными значениями в соответствии с их позициями в вызове Yii::t(). В следующем примере позиционные заполнители {0}, {1} и {2} будут заменены значениями $price, $count и $subtotal соответственно.

$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);

В случае единственного позиционного параметра его значение можно указать без обертывания в массив:

echo \Yii::t('app', 'Price: {0}', $price);

Подсказка: В большинстве случаев следует использовать именованные заполнители. Это связано с тем, что имена помогут переводчикам лучше понять переводимые сообщения.

Форматирование параметров

Вы можете указать дополнительные правила форматирования в заполнительных символах сообщения, чтобы значения параметров были отформатированы должным образом перед заменой заполнителей. В следующем примере значение параметра price будет обрабатываться как число и форматироваться как денежная сумма:

$price = 100;
echo \Yii::t('app', 'Price: {0,number,currency}', $price);

Примечание: Для форматирования параметров требуется установка расширения PHP intl.

Вы можете использовать короткий или полный формат для указания заполнителя с форматированием:

short form: {name,type}
full form: {name,type,style}

Примечание: Если вам нужно использовать специальные символы, такие как {, }, ', #, оберните их в '.

echo Yii::t('app', "Example of string with ''-escaped characters'': '{' '}' '{test}' {count,plural,other{''count'' value is # '#{}'}}", ['count' => 3]);

Полное описание формата см. в документации ICU. В дальнейшем мы покажем некоторые общие примеры использования.

Число

Значение параметра обрабатывается как число. Например,

$sum = 42;
echo \Yii::t('app', 'Balance: {0,number}', $sum);

Можно указать необязательный параметр стиля, как integer, currency или percent.

$sum = 42;
echo \Yii::t('app', 'Balance: {0,number,currency}', $sum);

Также можно указать пользовательский шаблон для форматирования числа. Например,

$sum = 42;
echo \Yii::t('app', 'Balance: {0,number,,000,000000}', $sum);

Символы, используемые в пользовательском формате, можно найти в справочнике по API ICU в разделе "Special Pattern Characters".

END_OF_DOCUMENT_MARKER

Значение всегда форматируется в соответствии с локалью, в которую вы переводите, т. е. вы не можете изменить разделители десятичных или тысяч, символ валюты и т. д., не изменив локаль перевода. Если вам нужно настроить эти параметры, вы можете использовать yii\i18n\Formatter::asDecimal() и yii\i18n\Formatter::asCurrency().

Дата

Значение параметра должно быть отформатировано как дата. Например,

echo \Yii::t('app', 'Today is {0,date}', time());

Вы можете указать необязательный параметр стиля как short, medium, long, или full:

echo \Yii::t('app', 'Today is {0,date,short}', time());

Вы также можете указать пользовательский шаблон для форматирования значения даты:

echo \Yii::t('app', 'Today is {0,date,yyyy-MM-dd}', time());

Ссылка на форматирование.

Время

Значение параметра должно быть отформатировано как время. Например,

echo \Yii::t('app', 'It is {0,time}', time());

Вы можете указать необязательный параметр стиля как short, medium, long, или full:

echo \Yii::t('app', 'It is {0,time,short}', time());

Вы также можете указать пользовательский шаблон для форматирования значения времени:

echo \Yii::t('app', 'It is {0,date,HH:mm}', time());

Ссылка на форматирование.

Прописью

Значение параметра должно рассматриваться как число и форматироваться в прописной форме. Например,

// may produce "42 is spelled as forty-two"
echo \Yii::t('app', '{n,number} is spelled as {n,spellout}', ['n' => 42]);

По умолчанию число записывается в виде порядкового числительного. Это можно изменить:

// may produce "I am forty-seventh agent"
echo \Yii::t('app', 'I am {n,spellout,%spellout-ordinal} agent', ['n' => 47]);

Обратите внимание, что после spellout, и перед % не должно быть пробела.

Чтобы получить список доступных параметров для используемой вами локали, обратитесь к разделу «Схемы нумерации, Прописью» на сайте http://intl.rmcreative.ru/.

Порядковый номер

Значение параметра должно рассматриваться как число и форматироваться в виде порядкового номера. Например,

// may produce "You are the 42nd visitor here!"
echo \Yii::t('app', 'You are the {n,ordinal} visitor here!', ['n' => 42]);

Порядковый номер поддерживает больше способов форматирования для таких языков, как испанский:

// may produce 471ª
echo \Yii::t('app', '{n,ordinal,%digits-ordinal-feminine}', ['n' => 471]);

Обратите внимание, что после ordinal, и перед % не должно быть пробела.

Чтобы получить список доступных параметров для используемой вами локали, обратитесь к разделу «Схемы нумерации, Порядковый номер» на сайте http://intl.rmcreative.ru/.

Продолжительность

Значение параметра должно рассматриваться как количество секунд и форматироваться как строка продолжительности времени. Например,

// may produce "You are here for 47 sec. already!"
echo \Yii::t('app', 'You are here for {n,duration} already!', ['n' => 47]);

Продолжительность поддерживает больше способов форматирования:

// may produce 130:53:47
echo \Yii::t('app', '{n,duration,%in-numerals}', ['n' => 471227]);

Обратите внимание, что после duration, и перед % не должно быть пробела.

Чтобы получить список доступных параметров для используемой вами локали, обратитесь к разделу «Схемы нумерации, Продолжительность» на сайте http://intl.rmcreative.ru/.

Множественное число

Разные языки по-разному склоняют множественное число. Yii предоставляет удобный способ перевода сообщений в разных формах множественного числа, который хорошо работает даже для очень сложных правил. Вместо того, чтобы иметь дело с правилами склонения напрямую, достаточно предоставить перевод склоненных слов только в определенных ситуациях. Например,

// When $n = 0, it may produce "There are no cats!"
// When $n = 1, it may produce "There is one cat!"
// When $n = 42, it may produce "There are 42 cats!"
echo \Yii::t('app', 'There {n,plural,=0{are no cats} =1{is one cat} other{are # cats}}!', ['n' => $n]);

В аргументах правила множественного числа выше, = означает явное значение. Таким образом, =0 означает ровно ноль, =1 означает ровно один. other обозначает любое другое значение. # заменяется значением n в соответствии с целевым языком.

Формы множественного числа могут быть очень сложными на некоторых языках. В следующем примере на русском языке, =1 соответствует ровно n = 1, а one соответствует 21 или 101:

Здесь {n,plural,=0{котов нет} =1{есть один кот} one{# кот} few{# кота} many{# котов} other{# кота}}!

Эти other, few, many и другие специальные имена аргументов зависят от языка. Чтобы узнать, какие из них нужно указать для конкретной локали, обратитесь к разделу «Правила множественного числа, Порядковое числительное» на сайте http://intl.rmcreative.ru/. В качестве альтернативы, вы можете обратиться к ссылке на правила на unicode.org.

Примечание: Приведенный выше пример русского сообщения в основном используется как переведенное сообщение, а не исходное, если вы не установили язык источника приложения как ru-RU и переводите с русского.

Когда перевод не найден для исходного сообщения, указанного в Yii::t() вызове, к исходному сообщению будут применены правила множественного числа для языка источника приложения.

Существует параметр offset для случаев, когда строка имеет следующий вид:

$likeCount = 2;
echo Yii::t('app', 'You {likeCount,plural,
    offset: 1
    =0{did not like this}
    =1{liked this}
    one{and one other person liked this}
    other{and # others liked this}
}', [
    'likeCount' => $likeCount
]);

// You and one other person liked this

Выбор порядкового номера

Тип параметра selectordinal предназначен для выбора строки на основе правил языка для порядковых числительных для локали, в которую вы переводите:

$n = 3;
echo Yii::t('app', 'You are the {n,selectordinal,one{#st} two{#nd} few{#rd} other{#th}} visitor', ['n' => $n]);
// For English it outputs:
// You are the 3rd visitor

// Translation
'You are the {n,selectordinal,one{#st} two{#nd} few{#rd} other{#th}} visitor' => 'Вы {n,selectordinal,other{#-й}} посетитель',

// For Russian translation it outputs:
// Вы 3-й посетитель

Формат очень похож на используемый для множественного числа. Чтобы узнать, какие аргументы следует указать для конкретной локали, обратитесь к разделу «Правила множественного числа, Порядковый номер» на сайте http://intl.rmcreative.ru/. В качестве альтернативы, вы можете обратиться к ссылке на правила на unicode.org.

Выбор

Вы можете использовать тип параметра select для выбора фразы на основе значения параметра. Например,

// It may produce "Snoopy is a dog and it loves Yii!"
echo \Yii::t('app', '{name} is a {gender} and {gender,select,female{she} male{he} other{it}} loves Yii!', [
    'name' => 'Snoopy',
    'gender' => 'dog',
]);

В выражении выше, как female, так и male являются возможными значениями параметра, в то время как other обрабатывает значения, которые не совпадают ни с одним из них. После каждого возможного значения параметра вы должны указать фразу и заключить ее в пару фигурных скобок.

Указание исходного источника сообщений по умолчанию

Вы можете указать исходный источник сообщений по умолчанию, который будет использоваться как резервный вариант для категории, не соответствующей какой-либо настроенной категории. Это можно сделать, настроив категорию-шаблон *. Для этого добавьте следующее в конфигурацию приложения:

//configure i18n component

'i18n' => [
    'translations' => [
        '*' => [
            'class' => 'yii\i18n\PhpMessageSource'
        ],
    ],
],

Теперь вы можете использовать категории, не настраивая каждую, что аналогично поведению Yii 1.1. Сообщения для категории будут загружаться из файла в соответствии со стандартным переводом basePath, который является @app/messages:

echo Yii::t('not_specified_category', 'message from unspecified category');

Сообщение будет загружено из @app/messages/<LanguageCode>/not_specified_category.php.

Перевод сообщений модуля

Если вы хотите перевести сообщения для модуля и избежать использования одного файла перевода для всех сообщений, вы можете сделать это следующим образом:

<?php

namespace app\modules\users;

use Yii;

class Module extends \yii\base\Module
{
    public $controllerNamespace = 'app\modules\users\controllers';

    public function init()
    {
        parent::init();
        $this->registerTranslations();
    }

    public function registerTranslations()
    {
        Yii::$app->i18n->translations['modules/users/*'] = [
            'class' => 'yii\i18n\PhpMessageSource',
            'sourceLanguage' => 'en-US',
            'basePath' => '@app/modules/users/messages',
            'fileMap' => [
                'modules/users/validation' => 'validation.php',
                'modules/users/form' => 'form.php',
                ...
            ],
        ];
    }

    public static function t($category, $message, $params = [], $language = null)
    {
        return Yii::t('modules/users/' . $category, $message, $params, $language);
    }

}

В примере выше мы используем шаблон для соответствия и затем фильтруем каждую категорию по нужному файлу. Вместо использования fileMap, вы можете просто использовать соглашение о сопоставлении категории с одноименным файлом. Теперь вы можете использовать Module::t('validation', 'your custom validation message') или Module::t('form', 'some form label') напрямую.

Перевод сообщений виджетов

То же правило, что и для модулей выше, может быть применено и для виджетов, например:

<?php

namespace app\widgets\menu;

use yii\base\Widget;
use Yii;

class Menu extends Widget
{

    public function init()
    {
        parent::init();
        $this->registerTranslations();
    }

    public function registerTranslations()
    {
        $i18n = Yii::$app->i18n;
        $i18n->translations['widgets/menu/*'] = [
            'class' => 'yii\i18n\PhpMessageSource',
            'sourceLanguage' => 'en-US',
            'basePath' => '@app/widgets/menu/messages',
            'fileMap' => [
                'widgets/menu/messages' => 'messages.php',
            ],
        ];
    }

    public function run()
    {
        echo $this->render('index');
    }

    public static function t($category, $message, $params = [], $language = null)
    {
        return Yii::t('widgets/menu/' . $category, $message, $params, $language);
    }

}

Вместо использования fileMap, вы можете просто использовать соглашение о сопоставлении категории с одноименным файлом. Теперь вы можете использовать Menu::t('messages', 'new messages {messages}', ['{messages}' => 10]) напрямую.

Примечание: Для виджетов вы также можете использовать i18n-представления, применив к ним те же правила, что и к контроллерам.

Перевод сообщений фреймворка

Yii поставляется с сообщениями по умолчанию для ошибок валидации и некоторых других строк. Все эти сообщения находятся в категории yii. Иногда вам нужно исправить перевод сообщений фреймворка по умолчанию для вашего приложения. Для этого настройте компонент приложения i18n компонента следующим образом:

'i18n' => [
    'translations' => [
        'yii' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'sourceLanguage' => 'en-US',
            'basePath' => '@app/messages'
        ],
    ],
],

Теперь вы можете поместить ваши измененные переводы в @app/messages/<language>/yii.php.

Обработка отсутствующих переводов

Даже если перевод отсутствует в источнике, Yii отобразит запрашиваемое содержимое сообщения. Такое поведение очень удобно в случае, если ваше исходное сообщение является допустимым подробным текстом. Однако, иногда этого недостаточно. Возможно, вам нужно выполнить некоторую пользовательскую обработку ситуации, когда запрашиваемый перевод отсутствует в источнике. Это можно сделать, используя событие missingTranslation класса yii\i18n\MessageSource.

Например, вы можете пометить все отсутствующие переводы чем-то заметным, чтобы их можно было легко найти на странице. Сначала вам нужно установить обработчик события. Это можно сделать в конфигурации приложения:

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
                'on missingTranslation' => ['app\components\TranslationEventHandler', 'handleMissingTranslation']
            ],
        ],
    ],
],

Теперь вам нужно реализовать свой собственный обработчик события:

<?php

namespace app\components;

use yii\i18n\MissingTranslationEvent;

class TranslationEventHandler
{
    public static function handleMissingTranslation(MissingTranslationEvent $event)
    {
        $event->translatedMessage = "@MISSING: {$event->category}.{$event->message} FOR LANGUAGE {$event->language} @";
    }
}

Если yii\i18n\MissingTranslationEvent::$translatedMessage задано обработчиком события, оно будет отображено как результат перевода.

Примечание: каждый источник сообщений обрабатывает отсутствующие переводы отдельно. Если вы используете несколько источников сообщений и хотите, чтобы они обрабатывали отсутствующие переводы одинаково, вы должны назначить соответствующий обработчик событий каждому из них.

Использование команды message

Переводы могут храниться в файлах PHP, .po-файлах или в базе данных. Дополнительные параметры см. в соответствующих классах.

В первую очередь вам нужно создать файл конфигурации. Решите, где вы хотите его сохранить, и затем выполните команду

./yii message/config-template path/to/config.php

Откройте созданный файл и настройте параметры в соответствии со своими потребностями. Обратите особое внимание на:

  • languages: массив, представляющий, на какие языки ваше приложение должно быть переведено;
  • messagePath: путь к хранению файлов сообщений, который должен соответствовать параметру i18n параметра basePath в конфигурации.

Вы также можете использовать команду './yii message/config' для динамической генерации файла конфигурации со специфицированными параметрами через командную строку. Например, вы можете задать параметры languages и messagePath следующим образом:

./yii message/config --languages=de,ja --messagePath=messages path/to/config.php

Чтобы получить список доступных параметров, выполните следующую команду:

./yii help message/config

После завершения настройки файла вы можете наконец извлечь свои сообщения с помощью команды:

./yii message path/to/config.php

Также вы можете использовать параметры для динамического изменения параметров извлечения.

Затем вы найдете свои файлы (если вы выбрали файлы переводов) в каталоге messagePath.

Перевод представлений

Вместо перевода отдельных текстовых сообщений, иногда может потребоваться перевести весь скрипт представления. Для этого просто переведите представление и сохраните его в подкаталоге с именем целевого языка. Например, если вы хотите перевести скрипт представления views/site/index.php и целевой язык — ru-RU, вы можете перевести представление и сохранить его как файл views/site/ru-RU/index.php. Теперь, каждый раз, когда вы вызываете yii\base\View::renderFile() или любой метод, который вызывает этот метод (например, yii\base\Controller::render()) для отображения представления views/site/index.php, будет отображаться переведённое представление views/site/ru-RU/index.php.

Примечание: Если целевой язык целевой язык совпадает с исходным языком исходный язык, исходное представление будет отображаться независимо от наличия переведённого представления.

Форматирование дат и числовых значений

Подробные сведения см. в разделе Форматирование данных.

Настройка среды PHP

Yii использует расширение PHP intl для обеспечения большинства функций I18N, таких как форматирование дат и чисел в классе yii\i18n\Formatter и форматирование сообщений с использованием yii\i18n\MessageFormatter. Оба класса предоставляют механизм обратного вызова, когда расширение intl не установлено. Однако механизм обратного вызова работает хорошо только для целевого языка английский. Поэтому настоятельно рекомендуется устанавливать intl при необходимости I18N.

Расширение PHP intl основано на библиотеке ICU, которая предоставляет правила форматирования и знания для всех различных локалей. Разные версии ICU могут давать разные результаты форматирования дат и числовых значений. Чтобы обеспечить одинаковые результаты на всех средах, рекомендуется устанавливать одну и ту же версию расширения intl (и, следовательно, одну и ту же версию ICU) во всех средах.

Чтобы узнать, какая версия ICU используется PHP, можно запустить следующий скрипт, который покажет используемые версии PHP и ICU.

<?php
echo "PHP: " . PHP_VERSION . "\n";
echo "ICU: " . INTL_ICU_VERSION . "\n";
echo "ICU Data: " . INTL_ICU_DATA_VERSION . "\n";

Также рекомендуется использовать версию ICU, равную или большую, чем версия 49. Это обеспечит возможность использования всех функций, описанных в данном документе. Например, версия ICU ниже 49 не поддерживает использование # в правилах множественного числа. Полный список доступных версий ICU см. на странице http://site.icu-project.org/download. Обратите внимание, что нумерация версий изменилась после выпуска 4.8 (например, ICU 4.8, ICU 49, ICU 50 и т. д.).

Кроме того, информация в базе данных часовых поясов, поставляемой с библиотекой ICU, может быть устаревшей. Подробности по обновлению базы данных часовых поясов см. в руководстве ICU по обновлению данных часовых поясов. Хотя для форматирования вывода используется база данных часовых поясов ICU, база данных часовых поясов, используемая PHP, также может быть актуальной. Вы можете обновить её, установив последнюю версию пакета pecl timezonedb.

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API