2016-11-23 3 views
0

Я хочу добавить многоязычную поддержку на свой сайт, но я не знаю, как реализовать ее лучше всего. Документация Laravel (https://laravel.com/docs/5.3/localization) очень редка, поэтому я провел некоторое исследование, но все, похоже, используют другое решение и используют URL-адреса с языком внутри него - например, example.com/en/pagename.Как добавить многоязычный язык в Laravel 5.3 с помощью СЕССИИ

Я хочу схему URL без тега языка. Что-то вроде этого: example.com/pagename

Теперь, в зависимости от языка пользователей, URL должны быть переведены:

example.com/pagename (english) example.com/seitenname (german)

Исходный язык должен быть обнаружен с помощью настроек браузера/языка. Пользователь также должен иметь возможность переключаться между предоставленными языками.

На моем сайте пользователь может зарегистрироваться для учетной записи. Он сможет сохранить свой предпочтительный язык в базе данных - скажем, в таблице users в поле pref_lang. Чтобы это было просто в этом случае, это просто строка типа «en» (английский) или «de» (немецкий).

Переводя маршрутов легко путем создания языковых файлов, как это:

// resources/lang/de/routes.php 

return array(
    'contact' => 'kontakt', 
    'pagename' => 'seitenname' 
); 

... и один для EN:

// resources/lang/en/routes.php 

return array(
    'contact' => 'contact', 
    'pagename' => 'pagename' 
); 

... combinded с такими маршрутами, например:

// routes/web.php 

Route::get('/', function() { 
    return view('pages.dashboard'); 
}); 

Route::get('/{contact}', function() { 
    return view('pages.contact'); 
}); 

Route::get('/{pay2gether-system}', function() { 
    return view('pages.pagename'); 
}); 

Теперь только вопрос, как я могу создать такую ​​кнопку «языкового переключателя», сохранить язык с настройки браузера/действие переключателя или из базы данных на СЕССИИ и как я могу повторно использовать ее для маршрутов и URL-адресов в тегах HTML <a href="#">?

ответ

1

Я сделал это пару раз, и это довольно легко осуществить. Выполните следующие шаги, и если у вас есть другие вопросы, не стесняйтесь спрашивать.

  1. Создать стол language в таблице users. Так я установил его в прошлом, $table->string('language')->default('en');
  2. Создайте новое промежуточное программное обеспечение для обнаружения изменения языка, например: SetLanguage.
  3. Добавить промежуточное программное обеспечение в нижней части группы промежуточного программного обеспечения web в app\Http\Kernel.php.
  4. Вставьте следующее внутри метода handle.

    if ($request->has('language')) { 
        if (auth()->user()) { 
         auth()->user()->language = $request->language; 
         auth()->user()->save(); 
        } 
        App::setLocale($request->language); 
    } elseif (auth()->user()) { 
        App::setLocale(auth()->user()->language); 
    } 
    return $next($request); 
    
  5. Создание поставщика услуг и зарегистрировать его в config/app.php и в способе загрузки вставьте следующий код.

    view()->composer('template.name', function($view) { 
        $languages = []; 
        $folders = File::directories(base_path('resources/lang/')); 
        foreach ($folders as $folder) { 
         $languages[] = str_replace('\\', '', last(explode('/',$folder))); 
        } 
        $view->with('languages', $languages); 
    }); 
    
  6. Теперь в вашем template.name.blade.php вы можете перебрать языков, которые доступны в вашем приложении.

В своем раскрывающемся списке вы должны использовать {{ url('/') . '?language=' . $language }} в качестве ссылки при прохождении. Вы можете изменить ключ language на что-то еще, но если вы это сделаете, вам также придется изменить его в промежуточном программном обеспечении.

+0

Спасибо, но где Laravel читает первый/по умолчанию язык из браузера, если он еще не установлен в базе данных? Это пропало, или? Кроме того: я не хочу хранить язык в подобном '{{url ('/'). '? language ='. $ language}} ', но в файле cookie/session. Разве это невозможно? – user2966991

+0

В базе данных есть значение по умолчанию, оно установлено в 'en'. Вы можете изменить его на все, что захотите. – tomirons

0

Я хотел бы сделать что-то в Middleware:

public function handle($request, Closure $next) 
{ 
    if ($request->has('language')) { 
     $path = $request->path(); 
     $locale = $request->get('language'); 

     # save locale 
     Cookie::queue(Cookie::make(
      'language', $locale, 1440 // 24h 
     )); 

     # set locale 
     \App::setLocale($locale); 

     return redirect($path)->withCookie(cookie('language')); 
    } 

    if ($locale = $request->cookie('language')) { 
     \App::setLocale($locale); 
    } 

    return $next($request); 
} 

Сейчас в Поставщиков:

public function boot() 
{ 
    View::composer('template.name', function($view) { 
     $directory = base_path('resources/lang/'); 
     $languages = \File::directories($directory); 
     $view->with('languages', array_map('basename', $languages)); 
    }); 
} 

И в представлении:

<ul class="dropdown-menu" role="menu"> 
    @foreach ($languages as $lang) 
     <li> 
      <a href="{{ url()->current() . '/?language=' . $lang }}" title="">{{ $lang }}</a> 
     </li> 
    @endforeach 
</ul> 

Я не совсем уверен, что если это лучшее решение ... Возможно, кто-то, у кого больше опыта работы в Laravel, может показать нам другое решение

+0

Оптимизация кода на самом деле не является предметом вопроса. Вы имеете в виду другой ответ? Это недостаточно ясно. –

Смежные вопросы