Перевод ошибок валидации

Комментарии: 5  Просмотры: 14 344

В данном уроке мы реализуем перевод наших ошибок валидации на русский язык. Сейчас мы имеем массив с ошибками в красивом виде, но на английском языке. Если вы заглядывали в файл system/messages/validation.php со встроенными в Кохану сообщениями об ошибках, то вы конечно увидели, что это обычный массив с теми самыми ошибками, которые выводит валидатор.

return array(
    'alpha'         => ':field must contain only letters',
    'alpha_dash'    => ':field must contain only numbers, letters and dashes',
    'alpha_numeric' => ':field must contain only letters and numbers',
    'color'         => ':field must be a color',
...
    'max_length'    => ':field must not exceed :param2 characters long',
    'not_empty'     => ':field must not be empty',
    'numeric'       => ':field must be numeric',
    'phone'         => ':field must be a phone number',
    'range'         => ':field must be within the range of :param2 to :param3',
    'regex'         => ':field does not match the required format',
    'url'           => ':field must be a url',
);

Я скопировал код не полностью, а только начало и конец, так как массив достаточно большой. Но уже по этим данным наглядно видно, что ключом массива является название правила, а значением — текст ошибки, причем параметр :field при выводе заменяется на название поля, а параметры :param2 и :param3 — это те самые дополнительные параметры вроде максимальной длины строки или диапазона от/до, что позволяет нам не только выдавать ошибки вида «Поле Пароль не соответствует указанной длине», а еще и такие замысловатые как «Поле Пароль должно быть от 3 до 8 символов в длину».
Самые проницательные могут сказать, а давайте прямо тут в массиве поменяем английский текст на русский. Да, это будет работать. Вы можете проверить это, только естественно сначала скопируйте файл validation.php в папку сообщений нашего проекта application/messages. Поскольку для комментариев нам в принципе не требуются какие-то «специальные» ошибки, мы не будем переименовывать этот файл в comments.php, а лучше поправим строку

$errors = $post -> errors('comments');

на

$errors = $post -> errors('validation');

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

Array
(
    [user] => user должно быть длиннее 2 символов
    [email] => email должно быть адресом электронной почты
    [message] => message не должно быть пустым
)

На самом деле перевод ошибок делается немного по другому. В Кохане существует специальный класс I18n, с помощью которого реализуется мультиязычность в проекте. Если вы делали правки в файле validation.php, верните все в исходное состояние. Теперь создайте внутри папки application/i18n папку ru и в нее положите файл ru.php. На данный момент это будет файл перевода наших ошибок, причем можно переводить как сообщения, так и названия полей. У меня он выглядит следующим образом.

<?php defined('SYSPATH') or die('No direct script access.');
 
return array(
 ':field must contain only letters'                     => ':field должно содержать только буквы',
 ':field must contain only numbers, letters and dashes' => ':field должно содержать только буквы, цифры и подчеркивания',
 ':field must contain only letters and numbers'         => ':field должно содержать только буквы и цифры',
 ':field must be a color'                               => ':field должно быть кодом цвета',
 ':field must be a credit card number'                  => ':field должно быть номером кредитной карты',
 ':field must be a date'                                => ':field должно быть датой',
 ':field must be a decimal with :param2 places'  => ':field должно быть десятичным числом с :param2 количеством цифр',
 ':field must be a digit'                               => ':field должно быть целым числом',
 ':field must be a email address'                       => ':field должно быть адресом электронной почты',
 ':field must contain a valid email domain'        => ':field должно быть существующим адресом электронной почты',
 ':field must equal :param2'                            => ':field должно быть идентичным :param2',
 ':field must be exactly :param2 characters long'       => ':field должно быть длиной :param2 символов',
 ':field must be one of the available options'          => ':field должно быть одним из параметров',
 ':field must be an ip address'                         => ':field должно быть ip-адресом',
 ':field must be the same as :param2'                   => ':field должно равняться :param2',
 ':field must be at least :param2 characters long'      => ':field не должно быть короче :param2 символов',
 ':field must not exceed :param2 characters long'       => ':field не должно быть длиннее :param2 символов',
 ':field must not be empty'                             => ':field не должно быть пустым',
 ':field must be numeric'                               => ':field должно быть числом',
 ':field must be a phone number'                        => ':field должно быть номером телефона',
 ':field must be within the range of :param2 to :param3'=> ':field должно находиться между :param2 и :param3',
 ':field does not match the required format'            => ':field не соответствует требуемому формату',
 ':field must be a url'                                 => ':field должно быть URL-адресом',
 
 'user'                                                 => 'Поле Юзер',
 'email'                                                => 'Поле Емейл',
 'message'                                              => 'Поле Текст сообщения',
);

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

/**
 * Set the default language
 */
I18n::lang('ru-ru');

Теперь файл перевода будет искаться в файле i18n/ru/ru.php, где он собственно и лежит. Еще раз выведите сообщения об ошибках и на этот раз они должны выглядеть вот так:

Array
(
    [user] => Поле Юзер не должно быть короче 2 символов
    [email] => Поле Емейл должно быть адресом электронной почты
    [message] => Поле Текст сообщения не должно быть пустым
)

К сожалению класс I18n не умеет должным образом склонять слова (т.е. при некоторых условиях мы можем получить текст ошибки вроде «Поле Юзер не должно быть короче 1 символов»). Если для вас это критично, вы можете использовать другие средства, например GetText.
Спасибо за внимание и до встречи в следующем уроке.

<< Назад | Вперед >> | Обсудить на форуме


К записи оставлено 5 коммент.

Хорошо, а как быть если у меня на сайте 3 языка? Где указывать язык для перевода? Последним аргументом к errors()?

Можно просто для других языков поменять так, например для английского указать

I18n::lang('en-en');

и в application/i18n/en/en.php поменять весь текст на английский.

Добрый день, в файле /system//18n/es.php текст
return array
(
‘Spanish’ => ‘Espa?ol’,
‘Hello, world!’ => ‘?Hola, mundo!’,
);
так понимаю перевод на Испанский. В наш файл я добавил (на остальными переводами):
return array
(
‘Russian’ => ‘Русский’,
‘hello, world!’ => ‘Привет, мир!’,
‘My first sait’ => ‘Мой первый сайт на Кохане’,
…..
однако при выводе этих английских фраз они на русский не меняются. Подскажите, что я не правильно понял.

Да, и еще, если в bootstrap вместо ru-ru прописать имя переменной и задавать ее в теле программы, будет менятся язык сайта?

:field must be a email address — нужно заменить артикль a на an — иначе сообщение не будет переведено



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.