Laravel уже поддерживает локализацию, и его система фильтров существенно упрощает добавление локализации контента для любого количества языков. Эта статья описывает простой подход к локализации с использованием фильтров путей.
Для проверки я создал следующие тестовые файлы перевода и шаблона. Я также убедился, что параметры конфигурации соответствуют локализации по умолчанию, как мне и нужно. Я добавил в виде комментариев названия файлов, которые содержат этот код. Здесь используется встроенная функциональность Laravel для обработки различных строк локализации в зависимости от языка, в представлении я использовал вспомогательную функцию %%(t)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
{{ trans('localization_test.title') }}
{{ trans('localization_test.subtitle') }}
// Убедитесь, что эти настройки указаны в app/config/app.php
'locale' => 'en'
'fallback_locale' => 'en'
%%
Первое, что мы должны сделать, это создать наш фильтр. Добавьте следующий код в %%(t)app/filters.php%%. Он проверяет значение переменной %%(t)lang%% и задаёт язык, который Laravel будет использовать при обработке локализации. В нашем случае, значение %%lang%% извлекается из URL. Для любого пути, которому мы хотим добавить локализацию, нам надо убедиться, что он сначала проходит через этот фильтр.
%%
Route::filter('localization', function() {
App::setLocale(Route::input('lang'));
});
%%
Теперь в %%(t)app/routes.php%% надо всего лишь убедиться, что мы используем фильтр для всех путей, которые хотим локализовать. Ниже показано как сейчас выглядит файл %%(t)routes.php%% в целях тестирования. Если вы хотите локализовать все пути, вам всего лишь надо обернуть их в %%Route::group%% как в следующем примере.
%%
Route::group(['prefix' => '{lang?}', 'before' => 'localization'], function() {
Route::get('/', function() {
return View::make('localization_test');
});
});
%%
В результате при переходе по таким URL, как %%(t)yoursite.com/en%% или %%(t)yoursite.com/fr%% будет строиться шаблон с правильными строками перевода. Кроме того, поскольку мы задали %%locale%% и %%fallback_locale%%, при переходе на %%(t)yoursite.com%% будет автоматически показан английский инртерфейс.
Побочный эффект использования подобного фильтра в том, что для получения переведенных путей, находящихся в упомянутой %%Route::group%%, необходимо только указание языкового префикса. Такие URL, как %%(t)yoursite.com/fr/blog%%, %%(t)yoursite.com/en/blog%% и %%(t)yoursite.com/blog%%, будут показывать одну и ту же страницу с ожидаемым переводом, если они добавлены в эту группу.
Также этот метод может быть использован для добавления локализованных путей для определенных пользователей с помощью нескольких настроек. Надо всего лишь удалить префикс %%lang%% из группы путей, а в фильтре надо только проверить настройку локализации пользователя, которая может храниться как атрибут модели пользователя. Кроме того вы можете проверить заголовки запросов и попытаться получить оттуда их язык.
%%
// 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 намного более подробная информация о ((док4:localization==локализации)) и ((док4:routing==маршрутах)), которую вам стоит прочитать, если вы еще не успели. Если у вас есть какие-либо другие интересные способы сделать локализацию, пожалуйста, напишите мне в Твиттер ((https://twitter.com/ryannielson==@RyanNielson)) или в комментариях к статье.