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:
推荐文章: