Laravel уже поддерживает локализацию, и его система фильтров существенно упрощает добавление локализации контента для любого количества языков. Эта статья описывает простой подход к локализации с использованием фильтров путей.
Для проверки я создал следующие тестовые файлы перевода и шаблона. Я также убедился, что параметры конфигурации соответствуют локализации по умолчанию, как мне и нужно. Я добавил в виде комментариев названия файлов, которые содержат этот код. Здесь используется встроенная функциональность Laravel для обработки различных строк локализации в зависимости от языка, в представлении я использовал вспомогательную функцию trans для извлечения локализованных строк.
// 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. Для любого пути, которому мы хотим добавить локализацию, нам надо убедиться, что он сначала проходит через этот фильтр.
Route::filter('localization', function() {
App::setLocale(Route::input('lang'));
});
Теперь в app/routes.php надо всего лишь убедиться, что мы используем фильтр для всех путей, которые хотим локализовать. Ниже показано как сейчас выглядит файл routes.php в целях тестирования. Если вы хотите локализовать все пути, вам всего лишь надо обернуть их в PHPRoute::group
как в следующем примере.
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
из группы путей, а в фильтре надо только проверить настройку локализации пользователя, которая может храниться как атрибут модели пользователя. Кроме того вы можете проверить заголовки запросов и попытаться получить оттуда их язык.
// 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)
Пытался так сделать не получилось. Потом просто занес переменнуб языка в сессию и задал ей значение в контроллере. Как по мне даже лучше получилось ( нету приставок ru/en в url)
Может кому пригодится:
Route::get('/ru', function(){
Session::put('local', 'ru');
return Redirect::back();
});
Route::get('/en', function(){
Session::put('local', 'en');
return Redirect::back();
});
Потом при загрузке:
$lang = Session::get('local');
App::setLocale($lang);
Сайт на одном языке будет. Если без урл, то лучше в куках храни язык.
Спасибо, статья помогла.
только в строке префикса убрал знак вопрос, и все заработало
'prefix' => '{lang}'
Конечно придется поработать со ссылками
PHPHTML::link(App::getLocale().'/admin/items_list', 'Новости')
но это уже не проблема.