В данном уроке мы реализуем перевод наших ошибок валидации на русский язык. Сейчас мы имеем массив с ошибками в красивом виде, но на английском языке. Если вы заглядывали в файл 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.
Спасибо за внимание и до встречи в следующем уроке.
<< Назад | Вперед >> |
Пожалуйста, зарегистрируйтесь для комментирования.
Хорошо, а как быть если у меня на сайте 3 языка? Где указывать язык для перевода? Последним аргументом к errors()?
Можно просто для других языков поменять так, например для английского указать
и в 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 — иначе сообщение не будет переведено