5.3 关于多语言站点的配置

最近做项目碰到一个多语言站点的需求,网上差了许多资料终于是初步完成了需求,记录了自己做的时候的步骤,也不知道会不会有bug,欢迎指正。废话不多说,我们开始。

1.配置文件修改

打开 config/app.php 文件,将你需要加入的站点添加到 'locale' => 'en', 后面:
'locales' => ['en' => 'English', 'de' => 'German'],

2.修改路由服务提供者

打开 app/Providers/RouteServiceProvider.php 找到 map 以及 mapWebRoutes 方法,并作如下修改:

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

        $this->mapApiRoutes();

        $this->mapWebRoutes($locale);

        //
    }
    protected function mapWebRoutes($locale)
    {
            Route::group([
                'middleware' => 'web',
                'prefix' => $locale,
                'namespace' => $this->namespace,
            ], function ($router) {
                require base_path('routes/web.php');
            });
    }

3.创建Language中间件

使用命令: artisan make:middleware Language 编辑此文件,并在Kernel.php注册中间件:

<?php

namespace App\Http\Middleware;

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

class Language
{
    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)
    {
        $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);
    }
}

好了,到这一步,需求大体上都解决了,你可以类似于以下形式访问不同的语言站了:
www.domain.com/en --> 指定到英语站
www.domain.com/cn --> 指定到中文站
www.domain.com --> www.domain.com/en (默认配置为英语站) --> 指定到英语站

但是貌似我的需求貌似还没有达到,我需要在不带语言后缀的时候自动访问我的默认语言站点,而不是由路由规则在后面自动给我添加上我默认的语言站点后缀。
好,那么我继续来改代码。

1.在Kernel.php中注销Language.php

2.修改路由服务提供者

打开 app/Providers/RouteServiceProvider.php 修改 mapWebRoutes 方法

 protected function mapWebRoutes($locale)
    {

        if (array_key_exists($locale, $this->app->config->get('app.locales'))) {
            Route::group([
                'middleware' => 'web',
                'prefix' => $locale,
                'namespace' => $this->namespace,
            ], function ($router) {
                require base_path('routes/web.php');
            });
        }else{
            Route::group([
                'middleware' => 'web',
                'namespace' => $this->namespace,
            ], function ($router) {
                require base_path('routes/web.php');
            });
        }
    }

好了,这样一来,当我直接访问 www.domain.com 的时候,就能访问英语站了而不会在后缀带上en了:simple_smile:

参考文章:https://laracasts.com/discuss/channels/tip...

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!