Локализация и плюрализация в Laravel 5
Мультиязычность (переводы) и формы множественного числа (окончания существительных при числительных).
Мультиязычность
Языковые файлы (переводы) хранятся в каталогах app/lang/{lang}/ в формате масива с ключами:
return array(
'select_language' => 'Выберите язык',
'hi_user' => 'Привет, :name'
);
Установить язык локали:
App::setLocale('es'); // es, ru
Получить локализованную строку (trans - это ф-ция хелпер):
echo Lang::get('messages.select_language');
echo trans('messages.select_language');
echo Lang::get('messages.hi_user', ['name' => 'Валентин']);
Плюрализация
Формы множественного числа.
Синтаксис метода получения множественного числа:
Lang::choice($key, $number, $replace = array(), $locale = null);
Пример:
Lang::choice('отзыв|отзыва|отзывов', $comments_count, [], 'ru');
Правила установки окончания взяты из компонента Symfony Translation (Laravel использует этот же компонент. Читать подробнее):
'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many',
Универсальные хелперы плюрализации
<?php
if (!function_exists('plural_word')) {
/**
* Example usage: str_plural_ru('черновик', 2, '|а|ов'); # Return: черновика
*
* @param string $word
* @param number $count
* @param string $endings
* @return string
*/
function plural_word(string $word, $count, string $endings)
{
$endings = preg_split('/[,\|-]/', $endings);
$cases = [2, 0, 1, 1, 1, 2];
$ending = sprintf($endings[ ($count%100>4 && $count%100<20) ? 2 : $cases[min($count%10, 5)] ], $count);
return $word.$ending;
}
}
if (!function_exists('plural_text')) {
/**
* Example usage: plural_text('Перенесли 2 черновик%s в товары.', '|а|ов');
* @param string $text
* @param string $endings
* @return string
*/
function plural_text(string $text, string $endings)
{
if (!preg_match('/(\d+)/', $text, $match)) {
return $text;
}
$count = $match[1];
$endings = preg_split('/[,\|-]/', $endings);
$cases = [2, 0, 1, 1, 1, 2];
$ending = sprintf($endings[ ($count%100>4 && $count%100<20) ? 2 : $cases[min($count%10, 5)] ], $count);
$text = str_replace('%s', $ending, $text);
return $text;
}
}
#laravel localization, #plural laravel