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)) или в комментариях к статье.