Локализация и плюрализация в Laravel 5

Категория: Laravel

Мультиязычность (переводы) и формы множественного числа (окончания существительных при числительных).

Мультиязычность

Языковые файлы (переводы) хранятся в каталогах 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

категория: Laravel