【问题标题】:Laravel 5 multilanguage supportLaravel 5 多语言支持
【发布时间】:2015-05-30 13:24:51
【问题描述】:

我是 laravel 的新手,我正在尝试用多语言支持我的应用程序。 我已经下载了 laravel 5 的默认 Login System 并从下面的链接集成了多支持语言教程

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

但是它给了我login page url localhost/en/login 与多语言支持教程但是当我使用login system 而不集成多语言支持时它给了我登录页面的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'); });
    }    
}

我不知道如何将本教程集成到这个default login system中。

提前致谢。

【问题讨论】:

    标签: php laravel-5 multilingual laravel-routing


    【解决方案1】:

    前段时间我和你一样在给定的教程上苦苦挣扎。在研究/搜索之后,我最终变成了这样。请注意,我仍在努力。

    第 1 步:添加您的语言区域
    config/app.php 中,在 locales
    'locales' => ['en' => 'English', 'sv' => 'Swedish'],
    'skip_locales' => ['admin','auth','etc'],

    下添加 skip_locals

    第 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');
            });
        }
    }
    

    第 3 步:创建语言中间件
    用这个改变内容

    <?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);
        }
    
    }
    

    希望这会有所帮助!

    【讨论】:

    【解决方案2】:

    对于 laravel 5.5 及以上版本,请在上述解决方案的第 2 步更改https://stackoverflow.com/a/39384200/5180888

    编辑 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');
            });
        }
    }
    

    【讨论】:

    • 请在此处添加描述
    猜你喜欢
    • 2011-11-08
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多