Laravel 本地化(多语言)

Laravel自身就提供了多语言方案,文档中可以看到。但是文档并没有实际demo,笔者根据自己经验带大家实践一下。笔者的思路是通过 cookie 来保存用户的语言设置。

首先自己先新建个项目。就拿首页 welcome.blade.php 做例子,实现英文,中文,繁体切换。

1. 下面有几个链接都是英文标题。我们在下面增加三个按钮作语言切换

<div>
    <a href="{{ url('lang/zh-CN') }}">中文</a>
    <a href="{{ url('lang/en') }}">English</a>
    <a href="{{ url('lang/zh-TW') }}">繁體</a>
</div>

2. 创建一个新的中间件,让中间件去读取 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,
        ],

        ...
]

3. 新建翻译文件

翻译文件有两种,一种是 php 数组文件,类似于 config 的配置文件,一种是 json 文件。根据实际情况使用翻译文件。

新建如下的文件夹和绿色文件。文件内容:

 


翻译文件.png
<? 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學習網站"}

4. html中使用翻译方法

方法有三种 __()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>

5. 创建设置语言路由及方法

访问该路由,访问该路由会保存一个永久的 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();
});

总结

点击第一步做出来的三个按钮就可以看到上面的语言变化了。
通过这种方式就算下次重新打开网页也是最后一次设置的语言。而且不会影响其他的路由,对比通过不同路由地址访问不同的语言和复制增加语言模板。这种方式简单通用易维护。

 联系我们

  • 邮箱:admin@admincms.top
  • 官方博客:blog.admincms.top
  • 官方微信公众号:huayuejishu
扫描二维码关注Joker.Liu微信公众号
TOP博客官方微信公众号二维码