2016-05-19 2 views
0

Ниже приводится то, что я сделал для достижения многоязычной функции для статического текста.Laravel 5.0, веб-сайт с несколькими языками

Шаг 1: Откройте config/app.php и добавьте следующее ниже: 'locale' => 'xx'.

'locales' => ['en' => 'English', 'sv' => 'Swedish'], 

Шаг 2: Префикс ваши маршруты

префикс наших маршрутов, мы изменяем метод карты в приложение/Провайдеры/RouteServiceProvider.php. Изменение метода карты к следующему:

public function map(Router $router, Request $request) 
{ 
    $locale = $request->segment(1); 
    $this->app->setLocale($locale); 

    $router->group(['namespace' => $this->namespace, 'prefix' => $locale], function($router) { 
     require app_path('Http/routes.php'); 
    }); 
} 

Затем добавьте в верхней части файла:

use Illuminate\Routing\Router; 
use Illuminate\Http\Request; 

Шаг 3: Создание языка промежуточного программного

Теперь создайте файл с именем языка. PHP в приложение/HTTP/Middleware с этим содержанием:

<?php namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Routing\Redirector; 
use Illuminate\Http\Request; 
use Illuminate\Foundation\Application; 
use Illuminate\Contracts\Routing\Middleware; 

class Language implements Middleware { 

    public function __construct(Application $app, Redirector $redirector, Request $request) { 
     $this->app = $app; 
     $this->redirector = $redirector; 
     $this->request = $request; 
    } 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     // Make sure current locale exists. 
     $locale = $request->segment(1); 

     if (! array_key_exists($locale, $this->app->config->get('app.locales'))) { 
      $segments = $request->segments(); 
      $segments[0] = $this->app->config->get('app.fallback_locale'); 

      return $this->redirector->to(implode('/', $segments)); 
     } 

     $this->app->setLocale($locale); 

     return $next($request); 
    } 

} 

Теперь сделать это промежуточное запустить на ll, добавив его в свойство $ middleware в приложении/Http/Kernel.php. Рекомендуется добавить его в начало массива.

protected $middleware = [ 
    'App\Http\Middleware\Language', 
    'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 
    'Illuminate\Cookie\Middleware\EncryptCookies', 
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 
    'Illuminate\Session\Middleware\StartSession', 
    'Illuminate\View\Middleware\ShareErrorsFromSession', 
    'Illuminate\Foundation\Http\Middleware\VerifyCsrfToken', 
]; 

Все выше были взяты из here

После всего выше, мои маршруты не выбирают язык автоматически ... мой корень

Route::get('/', '[email protected]'); 
Route::get('/about', '[email protected]'); 

И если я дам полный путь на страницах, таких как http://localhost:8000/pl/about

Он работает.

Но я хочу, чтобы он автоматически выбирал путь, потому что не нужно указывать полные URL-адреса на страницах.

Правильно ли это и как это можно достичь?

Я знаю, что каким-то образом мне нужно работать на routes.php, но я не знаю, как заставить его работать.

У меня очень ограниченные знания в Laravel, как я работаю на мой первый проект в Laravel

+0

На самом деле вам нужно просто взять заголовок языка принятия из самого запроса. Вы можете прочитать об этом здесь. Https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 –

+0

Не думаю, что я это понимаю ... что я должен делать? и где я должен разместить этот заголовок принимающего языка – rgoyal

+0

Также в форме submit Я получаю следующую ошибку 'NotFoundHttpException в строке RouteCollection.php 145:' – rgoyal

ответ

0

Во-первых, хороший сайт, не должны использовать различные языки для разных сайтов, а это должно происходить на основе принимает заголовок языка. (Принимая во внимание, что локали не совпадают с местоположениями. Например, сайт США и сайт в Великобритании могут использовать разные URL-адреса или домены даже, поскольку предложения сайта меняются между местоположениями).

Что вы должны сделать в контексте Laravel, это реализовать промежуточное программное обеспечение, которое будет читать заголовок языков принятия из запроса и сравнить языки, которые нужны с тем, что предлагает сайт, в вашем случае en и sv. Таким образом, URL-адрес не определяет язык, а настройки браузера пользователя. Если я использую браузер на шведском языке, в идеале, сайт должен предоставить мне тот же язык, если он доступен.

В промежуточном слое можно использовать следующий код:

App::setLocale($request->getPreferredLanguage(['en', 'sv'])) 

установку языка на основе запроса.

Затем, используя базовые системы, уже доступные в Laravel, вы можете просто перевести свои переводы в правильные файлы, а затем вывести правильные строки локали на основе запроса. Отрицание беспорядка, который обнаруживает локаль через маршрутизацию или использует разные представления для каждой локали.

+0

Спасибо за ваш ответ. Но я никогда не использовал язык приема, поэтому не знаю, где его определить и как получить доступ к нему. Должен ли я использовать этот код 'App :: setLocale ($ request-> getPreferredLanguage (['en', 'sv']))' в языковой промежуточной версии, которую у меня есть? – rgoyal

+0

Да, это должно быть все, что вам нужно сделать в команде handle –

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

  • Нет связанных вопросов^_^