Laravel 5 多语言支持

4

我是laravel的新手,正在尝试为我的应用程序添加多语言支持。 我已经下载了laravel 5的默认登录系统并集成了下面链接中的多语言支持教程。

https://laracasts.com/discuss/channels/tips/example-on-how-to-use-multiple-locales-in-your-laravel-5-website

但是它给了我带有多语言支持教程的 登录页面 URL localhost/en/login,但是当我使用没有集成多语言支持的 登录系统 时,它会给我登录页面的 URL laravel/auth/login
这是我的 kernel.php
class Kernel extends HttpKernel {

    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    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',
        'App\Http\Middleware\VerifyCsrfToken',
    ];

    /**
     * The application's route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'test'=> 'App\Http\Middleware\Test',
        'auth' => 'App\Http\Middleware\Authenticate',
        'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
        'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
    ];

}

这是我的 RouteServiceProvider.php 文件。
<?php namespace App\Providers;

use Illuminate\Routing\Router;
use Illuminate\Http\Request;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class RouteServiceProvider extends ServiceProvider {

    /**
     * This namespace is applied to the controller routes in your routes file.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @param  \Illuminate\Routing\Router  $router
     * @return void
     */
    public function boot(Router $router)
    {
        parent::boot($router);

        //
    }

    /**
     * Define the routes for the application.
     *
     * @param  \Illuminate\Routing\Router  $router
     * @return void
     */
    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'); });
    }    
}

我不知道如何将这个教程集成到这个默认的登录系统中。
提前致谢。
2个回答

3

不久之前,我也像你一样苦恼于所给的教程。经过研究和搜索,最终我得到了以下结果。请注意,我仍在努力。

步骤1:添加您的区域设置
config/app.php中,在locales下面添加skip_locales
'locales' => ['en' => '英语', 'sv' => '瑞典语'],
'skip_locales' => ['admin','auth','etc'],

步骤2:为您的路由添加前缀
将map方法更改为以下内容

public function map(Router $router, Request $request)
{
    $locale = $request->segment(1);
    $this->app->setLocale($locale);
    $skipLocales = $this->app->config->get('app.skip_locales');  

    // If the locale is added to skip_locales array continue without locale
    if (in_array($locale, $skipLocales)) {
        $router->group(['namespace' => $this->namespace], function($router)
        {
            require app_path('Http/routes.php');
        });
    }
    else {
        $router->group(['namespace' => $this->namespace, 'prefix' => $locale], function($router) {
            require app_path('Http/routes.php');
        });
    }
}

步骤三:创建语言中间件
将其内容更改为以下内容

<?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 the current local exists
        $locale = $request->segment(1);

        // If the locale is added to to skip_locales array continue without locale
        if (in_array($locale, $this->app->config->get('app.skip_locales'))) {
            return $next($request);
        } else {
            // If the locale does not exist in the locales array continue with the fallback_locale
            if (! array_key_exists($locale, $this->app->config->get('app.locales'))) {
                $segments = $request->segments();
                array_unshift($segments, $this->app->config->get('app.fallback_locale'));
                // $segments[0] = $this->app->config->get('app.fallback_locale');
                return $this->redirector->to(implode('/', $segments));
            }
        }
        $this->app->setLocale($locale);

        return $next($request);
    }

}

希望这能帮到你!

如何修改才能在Laravel 5.6中运行? - Viktor Jarnheimer
1
@viktor-jarnheimer 请看我在这里的回答 https://dev59.com/U4nca4cB1Zd3GeqP6Rsw#49087267 - subhendugiri

0

对于 Laravel 5.5 及以上版本,请在上述解决方案的第2步进行更改,具体请参见https://dev59.com/U4nca4cB1Zd3GeqP6Rsw#39384200

编辑 app/Providers/RouteServiceProvider.php 并更改如下:

public function map(Router $router, Request $request)
{
    $this->mapApiRoutes();
    $this->mapWebRoutes($router, $request);
}

and 
    protected function mapWebRoutes(Router $router, Request $request)
{
    //        Route::middleware('web')
    //            ->namespace($this->namespace)
    //            ->group(base_path('routes/web.php'));

    $locale = $request->segment(1);
    $this->app->setLocale($locale);
    $skipLocales = $this->app->config->get('app.skip_locales');

    // If the locale is added to skip_locales array continue without locale
    if (in_array($locale, $skipLocales)) {
        $router->group([
            'namespace' => $this->namespace, 'middleware' => 'web',
        ], function ($router) {
            require app_path('routes/web.php');
        });
    } else {
        $router->group([
            'namespace' => $this->namespace, 'middleware' => 'web', 'prefix' => $locale
        ], function ($router) {
            require app_path('routes/web.php');
        });
    }
}

请在此处添加描述。 - Mathews Sunny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接