Laravel自身就提供了多语言方案,文档中可以看到。但是文档并没有实际demo,笔者根据自己经验带大家实践一下。笔者的思路是通过 cookie
来保存用户的语言设置。
首先自己先新建个项目。就拿首页 welcome.blade.php
做例子,实现英文,中文,繁体切换。
<div>
<a href="{{ url('lang/zh-CN') }}">中文</a>
<a href="{{ url('lang/en') }}">English</a>
<a href="{{ url('lang/zh-TW') }}">繁體</a>
</div>
cookie
把页面转成对应的语言。
php artisan make:middleware ChangeLanguage
中间件代码
public function handle($request, Closure $next)
{
if (!empty($request->cookie('lang'))) {
\App::setLocale($request->cookie('lang'));
}
return $next($request);
}
Kernel.php
文件中加入中间件
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
//语言中间件
\App\Http\Middleware\ChangeLanguage::class,
],
...
]
翻译文件有两种,一种是 php
数组文件,类似于 config
的配置文件,一种是 json
文件。根据实际情况使用翻译文件。
新建如下的文件夹和绿色文件。文件内容:
<? php
// en.index.php
return [
'documentation' => 'Documentation',
'forge' => 'Forge',
'news' => 'News'
];
<? php
// zh-CN.index.php
return [
'documentation' => '文档',
'forge' => '锻造',
'news' => '新闻'
];
<? php
// zh-TW.index.php
return [
'documentation' => '文檔',
'forge' => '鍛造',
'news' => '新聞'
];
//en.json
{"laracasts":"laracasts"}
//zh-CN.json
{"laracasts":"laravel学习网站"}
//zh-TW.json
{"laracasts":"laravel學習網站"}
方法有三种 __()
、 trans()
和 @lang
。
<div class="links">
<a href="https://laravel.com/docs">{{ trans('index.documentation') }}</a>
<a href="https://laracasts.com">{{ __('laracasts') }}</a>
<a href="https://laravel-news.com">@lang('index.news')</a>
<a href="https://forge.laravel.com">{{ trans('index.forge') }}</a>
<a href="https://github.com/laravel/laravel">{{ trans('GitHub') }}</a>
</div>
访问该路由,访问该路由会保存一个永久的 cookie
Route::get('/lang/{locale}', function ($locale) {
if (in_array($locale, ['en', 'zh-CN', 'zh-TW'])) {
\Cookie::queue(\Cookie::forever('lang', $locale));
}
return back()->withInput();
});
点击第一步做出来的三个按钮就可以看到上面的语言变化了。
通过这种方式就算下次重新打开网页也是最后一次设置的语言。而且不会影响其他的路由,对比通过不同路由地址访问不同的语言和复制增加语言模板。这种方式简单通用易维护。
相关阅读