Gavr_Gavr
@Gavr_Gavr

Как поменять префикс url при смене языка в laravel?

У меня есть контроллер который меняет язык.
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use mysql_xdevapi\Session;

class languagesController extends Controller
{
    public function changeLocale($locale) {
        session(['locale'=>$locale]);

        App::setLocale('$locale');

        return redirect()->back();
    }
}

Языка всего два поэтому я просто в ссылке передаю данные для изменения языка:
<a class="language-btn__link" href="{{ route('locale', __('main.change_lang_link')) }}">

Вот мой роут:
<?php

use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Route;

Route::get('/locale/{locale}',  'App\Http\Controllers\LanguagesController@changeLocale')->name('locale');

Route::get('/', function () { return view('home');})->name('index');
Route::get('/home', function () {return view('home');})->name('home');

Вот фасад:
<?php

namespace App\Http\Middleware;

class LanguageSwitcher
{
    public function handle($request, \Closure $next)
    {
       \App::setlocale(session ('locale'));

        return $next($request);
    }
}

Сейчас перевод работает, но я бы хотел добавлять префикс к url что б получалось /home/ru или /ru

Вопрос, как это сделать? и попутно вопрос, как определить подгрузить сразу префикс по умолчанию при первой загрузке страницы?

Я пробовал задавать в роуте переменную:
Route::get('/{lang}/home', function (Lang $lang) {return view('home');})->name('home');

И в ссылке писать так
href="{{ route('index', ['lang' => __('main.change_lang_link')]) }}"

Но это не работает. Как правильно это сделать?
  • Вопрос задан
  • 427 просмотров
Решения вопроса 2
delphinpro
@delphinpro Куратор тега Laravel
frontend developer
Возьмите готовый пакет mcamara/laravel-localization
Ну или подсмотрите как там реализовано.
Ответ написан
Gavr_Gavr
@Gavr_Gavr Автор вопроса
В общем благодаря пакету mcamara/laravel-localization у меня получилось реализовать эту идею. Единственное что я все таки не смог до конца разобраться в сути этого пакета, поэтому думаю что моя реализация написана на коленке и не совсем соответствует его логике - но работает )).

Короче - качаем пакет, все по инструкции как написано, настраиваем нужные языки в файле config/laravellocalization.php

В роутах я написал так:

<?php

use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/locale/{locale}',  'App\Http\Controllers\LanguagesController@changeLocale')->name('locale');

Route::group(
   ['prefix' => LaravelLocalization::setLocale()],
   function(){

   }
);

Route::get('/', function () { return view('home');})->name('index');
Route::get('/es', function () {App::setlocale('es'); return view('home');})->name('indexES');
Route::get('/ru', function () {App::setlocale('ru'); return view('home');})->name('indexRU');

Route::get('/home', function () {return view('home');})->name('home');
Route::get('/es/home', function () {App::setlocale('es'); return view('home');})->name('homeES');
Route::get('/ru/home', function () {App::setlocale('ru'); return view('home');})->name('homeRU');

По непонятным для меня причинам фасад App::setlocale() не передавал инфо, и был недоступен в группе этих роутов, поэтому мне пришлось их вынести (я думаю что это не правильно, но другого решения я не нашел). В инструкции написано что роуты которые переводятся надо указывать в группе, но как передать им там язык, я так и не понял (. Если кто то знает, напишите пожалуйста.

Ссылка для переключения языков:
href="{{ LaravelLocalization::getLocalizedURL(__('main.change_lang_link')) }}"

А вот все ссылки на другие страницы выглядят так:
href="{{LaravelLocalization::getLocalizedURL(__('main.set_lang'), 'home')}}"


Полет нормальный, страницы загружаются в нужных языках и возвращают 404 в случае установки неправильного языка (например если в ручную написать /br/home',)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы