Меню

Yii2 настройки на русский язык



Yii 2 — Интернационализация проекта (мультиязычность)

Рассмотрим пример интернационализации сайта на Yii 2 на двух языках: ru и en.

В Yii 2 уже встроен компонент отвечающий за интернационализацию, называется он i18n . Для того что бы можно было начать им пользоваться, достаточно добавить его в конфигурацию приложения в раздел components . Также, для полноценной работы этого компонента, требуется PHP расширение intl.

В данной статье будет рассмотрен пример интернационализации сайта на Yii 2 на двух языках: ru и en.

Существуют два варианта записей идентификаторов языков:

  • сокращенные, например ru, en;
  • полные, например: ru-RU, en-US.

Мы будем использовать сокращенный вариант (ru и en), т.к. его вполне достаточно для требуемой функциональности и он более лаконично воспринимается визуально.

В качестве кодовой базы можно использовать как уже готовый сайт на Yii 2, так и basic шаблон предоставляемый фреймворком. Как установить basic шаблон можно прочитать в этой статье.

Задача

Сформулируем требования, чего необходимо добиться:

  • переключение сайта между двумя языками: ru и en;
  • отображение языка в адресной строке в виде http://site.com/en/ ;
  • автоматическое перенаправление пользователя на наиболее подходящий для него язык, если он перешел на сайт без указания языка;
  • хранение переводов должно осуществляется в PHP файлах в виде массивов;
  • переводы статических страниц должны содержаться в отдельных представлениях для разных языков.

Конфигурация

Начинаем реализацию с прописывания требуемых для этого конфигураций в файл \config\web.php :

В этой конфигурации:

sourceLanguage — исходный язык сообщений, т.е. тот который будет использован в виде ключей переводов, в данном случае en .

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

components -> urlManager — в данной секции включаем ЧПУ, для более наглядного отображения URL’ов.

components -> i18n — эта секция предназначена для конфигурирования компонента интернационализации. Ключ массива common* — означает категорию к которой будут относиться переводы из соответствующего файла common.php . Название категории можно указать и любое другое, или например сделать несколько категорий, но для примера обойдемся одной. В секции ‘class’ => ‘yii\i18n\PhpMessageSource’ необходимо указать как именно мы будем хранить сообщения, в данном случае указано что в виде PHP файлов (в виде ассоциативных массивов). Кроме yii\i18n\PhpMessageSource существуют и другие варианты, например сообщения можно хранить в БД. В секции ‘basePath’ => ‘@app/messages’ указан путь по которому будут располагаться PHP файлы с переводами.

Файл со списком переводов

Теперь необходимо создать PHP файл, который будет содержать в себе ассоциативный массив с переводами.

При конфигурировании компонента i18n мы указали:

Это означает что файл с переводами должен иметь такое же имя, как и имя категории, т.е. common.php . Храниться он должен по такому пути \messages\ru\common.php .

Для нашего примера с двумя языками (ru и en), достаточно создать один файл с переводами только для русского языка, т.к. переводы английского языка будут в виде ключей для всех остальных переводов. Т.е. везде по сайту будут английские сообщения, при переключении на русский язык, фреймворк будет их подменять на русские.

Например если бы мы хотели добавить какой либо дополнительный язык, например de , то кроме файла \messages\ru\common.php нам нужно было бы еще создать аналогичный для немецкого языка \messages\de\common.php . Но в нашем примере будет только один файл \messages\ru\common.php , создадим его, пока с пустым массивом:

Вносим переводы

Теперь необходимо внести переводы по коду сайта и также добавить их в файл \messages\ru\common.php .

Для вывода переводов в Yii 2 существует специальный метод Yii::t() . Пример использования:

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

После этого необходимо добавить русский перевод в файл \messages\ru\common.php :

В качестве ключа используем английский перевод, а в качестве значения русский.

Необходимо проделать такие действия по всему коду, т.е. все отображаемые тексты позаменять на английские, причем выводить их надо с помощью Yii::t() . И также добавить для всех английских текстов переводы в файл \messages\ru\common.php .

Переключение языков

У пользователя должна быть возможность как то переключаться между языками. Для этого необходимо отображать ссылки для переходя на русский или английский язык. Для этой цели создадим специальный скрипт представления \views\layouts\main\select-language.php :

Далее необходимо подключить этот скрипт в главном шаблоне представления \views\layouts\main.php , для этого следующую строку:

нужно заменить на:

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

Использование стороннего UrlManager

Теперь нам необходимо сделать так, что бы в строке адреса отображался текущий язык, например http://site.com/en . К сожалению Yii 2 не предоставляет для этого каких либо встроенных возможностей, и даже сделать это какими то адекватными обходными путями не получиться, или по крайней мере сложно. Самым «правильным» выходом в этой ситуации будет переопределение стандартного класса yii\web\UrlManager на свой собственный, в котором будут заменены некоторые методы. Эти замененные методы должны брать на себя реализацию отображения языка в строке адреса.

Читайте также:  Настройка головной станции wisi

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

Писать собственную реализацию класса UrlManager мы не будем, т.к. данный «велосипед» уже создан и его можно просто подключить через Composer, что мы и сделаем. Переходим в консоле в корневую папку проекта, и выполняем команду (тут имеется ввиду что Composer установлен глобально):

Пакет codemix/yii2-localeurls дает нам следующие возможности:

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

Далее нам нужно переконфигурировать компонент urlManager так, что бы он использовал не стандартный класс фреймворка, а только что подключенный. Для этого в файле \config\web.php , в секцию componets -> urlManager добавляем следующие три строки:

Немного объяснений по данной конфигурации:

‘class’ => ‘codemix\localeurls\UrlManager’ — указываем фреймворку что бы вместо стандартного класса UrlManager был использован тот который мы только что подключили через Composer.

‘languages’ => [‘ru’, ‘en’] — на какие языки переведен проект.

‘enableDefaultLanguageUrlCode’ => true — этот флаг означает что мы хотим что бы текущий язык отображался в адресной строке всегда, даже если пользователь просто находиться на главной странице (т.е. адрес будет вида http://site.com/en ). При желании этот флаг можно и не указывать, по умолчанию он будет иметь значение false , что означает что на главной странице язык в адресной строке отображаться не будет (т.е. адрес будет вида http://site.com ).

Интернационализация статических страниц

В Yii 2 есть встроенный класс \yii\web\ViewAction , который предназначен для реализации статических страниц.

Но по умолчанию интернационализацию он не поддерживает.

Суть в том, что статические страницы имеют большой текст, который не удобно вставлять в файлы переводов (т.е. в нашем случае в файл \messages\ru\common.php ). Переводы для статических страниц лучше всего хранить в отдельных файлах — в разных скриптах преставлений которые будут соответствовать разным языкам.

Реализуем интернационализированные статические страницы, для этого в файле \controllers\SiteController.php , в методе actions() необходимо добавить следующую секцию:

В этой секции и находиться основной код который позволяет интернационализировать статические страницы, это ‘viewPrefix’ => ‘pages/’ . \Yii::$app->language . В параметре viewPrefix мы указываем по какому пути у нас будут находиться скрипты представлений для статических страниц, но в нашем случае мы еще и подставляем в этот путь текущий язык \Yii::$app->language .

Далее создадим два файла представления, которые будут соответствовать одной статической странице, но каждый будет для своего языка. Для английского \views\site\pages\en\some.php должен содержать текст: EN static page. . Для русского \views\site\pages\ru\some.php должен содержать текст Русская статическая страница. .

Теперь настроим ЧПУ для наглядного отображения адресов статических страниц, для этого в конфиге \config\web.php в секцию urlManager -> rules добавим правило:

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

  • http://site.com/ru/page/some — откроется русская статическая страница;
  • http://site.com/en/page/some — английская.

Заключение

В целом реализация интернационализации в Yii 2 не представляет ничего сложного, особенно если использовать сторонний компонент codemix/yii2-localeurls .

Задача, которая была описана в начале статьи полностью выполнена:

Источник

Интернационализация

Note: Этот раздел находится в разработке

Интернационализация (I18N) является частью процесса разработки приложения, которое может быть адаптировано для нескольких языков без изменения программной логики. Это особенно важно для веб-приложений, так как потенциальные пользователи могут приходить из разных стран.

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

Локализация и языки #

В Yii приложении определены два языка: исходный язык и язык перевода.

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

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

Tip: значение по умолчанию для исходного языка — английский.

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

Формат для установки языка/локали: ll-CC , где ll — это двух или трёхбуквенный код языка в нижнем регистре в соответствии со стандартом ISO-639, а CC — это код страны в соответствии со стандартом ISO-3166.

Note: больше информации о синтаксисе и концепции локалей можно получить в документации проекта ICU.

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

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

Читайте также:  Vim настройка для python

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

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

В приведённой конфигурации, app* — это шаблон, который определяет, какие категории обрабатываются источником. В нашем случае мы обрабатываем все, что начинается с app . Файлы с сообщениями находятся в @app/messages (папке messages в вашем приложении). Массив fileMap определяет, какой файл будет подключаться для определённой категории. Если вы не хотите конфигурировать fileMap , можно положиться на соглашение, что название категории является именем файла. Например, категория app/error относится к файлу app/error.php в рамках basePath.

Переводя сообщение \Yii::t(‘app’, ‘This is a string to translate!’) при установленном языке приложения ru-RU , Yii сначала будет искать файл @app/messages/ru-RU/app.php , чтобы получить список доступных переводов. Если такого файла нет в папке ru-RU , Yii также попробует поискать в папке ru перед тем, как примет решение, что попытка перевода не удалась.

Кроме хранения в PHP-файлах (используя PhpMessageSource), Yii предоставляет ещё два класса:

Именованные указатели #

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

Обратите внимание, что в операции присваивания фигурные скобки не используются.

Позиционные указатели #

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

Указатели с расширенным форматированием #

Чтобы использовать расширенные возможности, вам необходимо установить и включить PHP-расширение intl. После этого вам станет доступен расширенный синтаксис указателей, а также сокращённая запись , эквивалентная форме , позволяющая определять стиль форматирования.

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

Числа #

Вы можете использовать один из встроенных форматов ( integer , currency , percent ):

Или определить свой формат:

Встроенные форматы — это short , medium , long и full :

Используя свой формат:

Время #

Встроенные форматы — это short , medium , long и full :

Используя свой формат:

Числа прописью #

Порядковые числительные #

Выведет сообщение «Вы — 42-й посетитель!».

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

Выведет сообщение «Вы находитесь здесь уже 47 сек.».

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

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

Выведет сообщение «На диване нет кошек!».

В данном правиле

  • =0 означает ноль;
  • =1 соответствует ровно 1 ;
  • one — 21 , 31 , 41 и так далее;
  • few — от 2 до 4 , от 22 до 24 и так далее;
  • many — 0 , от 5 до 20 , от 25 до 30 и так далее;
  • other — для всех прочих чисел (например, дробных).
  • Решётка # заменяется на значение аргумента n .

Для некоторых языков правила могут быть более простыми. Например, для английского будет достаточно указать:

Следует помнить, что если вы используете указатель дважды, и в первый раз он используется как plural , второй раз он должен быть использован как number , иначе вы получите ошибку «Inconsistent types declared for an argument: U_ARGUMENT_TYPE_MISMATCH»:

Подробная документация о формах склонений для различных языков доступна на сайте unicode.org.

Вариации #

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

Выведет сообщение «Василий — мужчина и ему нравится Yii!».

В приведённом выражении, мужчина и женщина — это возможные варианты пола. На всякий случай, other обработает случай, если значение не совпадает с первыми двумя вариантами. Строки в скобках являются вторичными выражениями и могут быть просто строкой или строкой, содержащей дополнительные указатели.

Определение перевода по умолчанию #

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

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

Читайте также:  Настройка часовых поясов apache

Сообщение будет загружено из файла @app/messages/ /not_specified_category.php

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

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

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

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

Для виджетов применимо такое же правило, как и для модулей:

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

Note: для виджетов вы можете использовать i18n представления. На них распространяются те же правила, что и на контроллеры.

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

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

После этого разместите изменённые строки в файле @app/messages/ /yii.php .

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

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

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

Создадим обработчик события:

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

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

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

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

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

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

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

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

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

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

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

В результате вы найдете свой файлы (если вы выбрали перевод с помощью файлов) в своей директории messagePath .

Представления #

Вместо того, чтобы переводить сообщения так, как указано в предыдущем разделе, вы можете использовать i18n в ваших представлениях, чтобы обеспечить поддержку нескольких языков. Например, если существует представление views/site/index.php и для перевода его на русский язык необходимо отдельное представление, создайте папку ru-RU в папке с представлением текущего контроллера или виджета и создайте файл для русского языка: views/site/ru-RU/index.php . Yii загрузит файл для текущего языка, если он существует, или использует исходный views/site/index.php , если не сможет найти локализацию.

Note: если язык был определён, как en-US и соответствующих представлений не было найдено, Yii попробует найти представления в папке en перед тем, как использовать исходные.

Форматирование чисел и дат #

Настройка PHP-окружения #

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

PHP-расширение intl основано на библиотеке ICU, которая описывает правила форматирования для различных локалей. Поэтому следует помнить, что форматирование чисел и дат вместе с синтаксисом форматирования может отличаться в зависимости от версии библиотеки ICU, которая была скомпилирована в вашем дистрибутиве PHP.

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

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

Источник

Adblock
detector