#laravel #localization #routes
#laravel #локализация #маршруты
Вопрос:
Я использую laravel 5.3 и setLocale
не работает
Если я использую setLocate
в Route -> не работает, например:
Route::get('loc/{locale?}', function($locale) {
App::setLocale($locale);
return redirect()->back();});
Но если я использую это в другом месте моих файловых маршрутов, это работает!
Я упомянул в коде, что указывает:
$locale = 'en';
App::setLocale($locale);
Поэтому я использую homecontroller :
Route::get('loc/{locale}', 'HomeController@language');
В файле homecontroller:
public function language($locale)
{
App::setLocale($locale);
return redirect()->back();
}
Этот метод также не работает
Комментарии:
1. У вас ошибка? Если нет, можете ли вы показать в своем контроллере
dd(app()->getLocale())
после установки локали?2. Нет, у меня нет ошибки. Если я использую
dd(app()->getLocale())
послеsetLocate
, я вижу — «en» или «ru», это то, что я выбрал, НО мой lengauge не меняется на сайте. Если я изменю язык в файлеapp.php
-> хорошо, мой язык изменится
Ответ №1:
На самом деле, App::setLocale($locale)
ваши изменения не сохраняются. Итак, если вы хотите динамический способ изменения локали, у вас есть 2 варианта :
- Добавьте локаль в URI:
ru.example.com
илиexample.com/ru
.
Затем вы можете получить локализацию из запроса.
- Сохраняйте локаль для пользователя или приложения, например, в базе данных.
Когда вы нажмете example.com/ru
, вот что произойдет:
// HomeController.php
public function language($locale)
{
// Validate locale if needed
// Update or create the locale in settings table
AppSetting::updateOrCreate(['name' => 'locale'], ['value' => $locale]);
// Redirect back
return redirect()->back();
}
Тогда в вашем AppProvidersAppServiceProvider
:
// App/Providers/AppServiceProvider.php
public function boot()
{
// Get the locale stored in the settings table
$locale = AppSetting::where('name', 'locale')->first();
// Setup the app locale
app()->setLocale($locale ? $locale->value : config('app.locale'));
}
Таким образом, ваша settings
таблица будет выглядеть следующим образом :
id | name | value
-- | --------- | ---------------
1 | locale | ru
2 | timezone | Europe/Brussels
3 | copyright | @2016 ACME Inc