Может войдёшь?
Черновики Написать статью Профиль

Простая локализация маршрутов в Laravel с помощью фильтров

перевод

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

Для проверки я создал следующие тестовые файлы перевода и шаблона. Я также убедился, что параметры конфигурации соответствуют локализации по умолчанию, как мне и нужно. Я добавил в виде комментариев названия файлов, которые содержат этот код. Здесь используется встроенная функциональность Laravel для обработки различных строк локализации в зависимости от языка, в представлении я использовал вспомогательную функцию trans для извлечения локализованных строк.

PHP
// app/lang/en/localization_test.php
return array(
    
'title' => 'English title',
    
'subtitle' => 'English subtitle',
);

// app/lang/fr/localization_test.php
return array(
    
'title' => 'French title',
    
'subtitle' => 'French subtitle',
);

// app/views/localization_test.php
<h1>{{ trans('localization_test.title') }}</h1>
<
h2>{{ trans('localization_test.subtitle') }}</h2>

// Убедитесь, что эти настройки указаны в app/config/app.php
'locale' => 'en'
'fallback_locale' 
=> 'en'

Первое, что мы должны сделать, это создать наш фильтр. Добавьте следующий код в app/filters.php. Он проверяет значение переменной lang и задаёт язык, который Laravel будет использовать при обработке локализации. В нашем случае, значение PHPlang извлекается из URL. Для любого пути, которому мы хотим добавить локализацию, нам надо убедиться, что он сначала проходит через этот фильтр.

PHP
Route::filter('localization', function() {
    
App::setLocale(Route::input('lang'));
});

Теперь в app/routes.php надо всего лишь убедиться, что мы используем фильтр для всех путей, которые хотим локализовать. Ниже показано как сейчас выглядит файл routes.php в целях тестирования. Если вы хотите локализовать все пути, вам всего лишь надо обернуть их в PHPRoute::group как в следующем примере.

PHP
Route::group(['prefix' => '{lang?}''before' => 'localization'], function() {
    
Route::get('/', function() {
        return 
View::make('localization_test');
    });
});

В результате при переходе по таким URL, как yoursite.com/en или yoursite.com/fr будет строиться шаблон с правильными строками перевода. Кроме того, поскольку мы задали PHPlocale и PHPfallback_locale, при переходе на yoursite.com будет автоматически показан английский инртерфейс.

Побочный эффект использования подобного фильтра в том, что для получения переведенных путей, находящихся в упомянутой PHPRoute::group, необходимо только указание языкового префикса. Такие URL, как yoursite.com/fr/blog, yoursite.com/en/blog и yoursite.com/blog, будут показывать одну и ту же страницу с ожидаемым переводом, если они добавлены в эту группу.

Также этот метод может быть использован для добавления локализованных путей для определенных пользователей с помощью нескольких настроек. Надо всего лишь удалить префикс PHPlang из группы путей, а в фильтре надо только проверить настройку локализации пользователя, которая может храниться как атрибут модели пользователя. Кроме того вы можете проверить заголовки запросов и попытаться получить оттуда их язык.

PHP
// app/routes.php
Route::group(['before' => 'localization'], function() {
    
Route::get('/', function() {
        return 
View::make('localization_test');
    });
});

// app/filters.php
Route::filter('localization', function() {
    
App::setLocale(Auth::user()->locale);
});

Надеюсь, статья будет полезной. В документации Laravel намного более подробная информация о локализации и маршрутах, которую вам стоит прочитать, если вы еще не успели. Если у вас есть какие-либо другие интересные способы сделать локализацию, пожалуйста, напишите мне в Твиттер @RyanNielson или в комментариях к статье.

Как вы считаете, полезен ли этот материал? Да Нет

Комментарии (3)

Andrey_Petko

Пытался так сделать не получилось. Потом просто занес переменнуб языка в сессию и задал ей значение в контроллере. Как по мне даже лучше получилось ( нету приставок ru/en в url)

Может кому пригодится:

PHP
Route::get('/ru', function(){
   
Session::put('local''ru');
    return 
Redirect::back();
});


Route::get('/en', function(){
    
Session::put('local''en');
    return 
Redirect::back();
});

Потом при загрузке:

PHP
      $lang Session::get('local');
      
App::setLocale($lang);
Ilya

Сайт на одном языке будет. Если без урл, то лучше в куках храни язык.

amadey18

Спасибо, статья помогла.
только в строке префикса убрал знак вопрос, и все заработало

PHP
'prefix' => '{lang}'

Конечно придется поработать со ссылками
PHPHTML::link(App::getLocale().'/admin/items_list''Новости')
но это уже не проблема.

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.