首页 > 解决方案 > 在多语言网站中生成链接

问题描述

我有多语言网站。为了本地化网站,我使用如下中间件:

public function handle($request, Closure $next)
{
    App::setlocale('pl');
    Cookie::queue(Cookie::make('lang', 'pl'), true, 1440);
    return $next($request);
}

我的 roote 名称如下所示:“pl.articles”或“en.acritcles”,因此我使用 cookie 生成链接到视图中。例如:

@if(Cookie::get('lang') == 'pl')
    <li><a href="{{ route('pl.allwomens') }}">@lang('category.womens')</a></li>
@else
  <li><a href="{{ route('en.allwomens') }}">@lang('category.womens')</a></li>
@endif

它有效,但我有一个小问题。实际上,当我更改语言时,链接将指向以前的版本。所以我必须重新加载网站才能更改链接。有时我点击一些链接,我的网站的语言会改变。我再次单击,语言将恢复到以前的版本。问题出在哪里?我在一个组中使用中间件

Route::group(['prefix' => 'pl', 'middleware' => ['PLLanguage', 'globalStats']], function(){

标签: phplaravelcookiesmiddlewaremultilingual

解决方案


创建名为“语言”的中间件

<?php namespace App\Http\Middleware;

use Closure, Session, Auth;

class SetLanguage {


    protected $languages = ['en','pl'];

    public function handle($request, Closure $next)
    {
        if(isset($request->applocale)){

            if(in_array($request->applocale, $this->languages)){
                if(!Session::has('locale'))
                { 
                    Session::put('locale', $request->applocale);

                } else if( Session::get('locale') != $request->applocale ){
                    Session::put('locale', $request->applocale);
                    app()->setLocale(Session::get('locale'));
                }
            }

            else abort(500, 'Bad request, requested language not found');

        }

        app()->setLocale(Session::get('locale'));

        return $next($request);
    }
}

将此中间件放在您的 Web 组中的 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\SetLanguage::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

创建语言更改表

<a href="#" onclick="setLanguage(event, 'en')">English</a>
<a href="#" onclick="setLanguage(event, 'pl')">ქართული&lt;/a>
<form action="/setlanguage" method="POST" style="display: none" id="languageForm">
    @csrf
    <input id="applocale" type="text" name="applocale" >
</form>
<script>
    function setLanguage(e, lang){
        e.preventDefault();
        $('#applocale').val(lang);
        $('#languageForm').submit();
    }
</script>

所以语言将在每个表单提交上设置

那么在你的观点中你可以使用

@php $lang = app()->getLocale(); @endphp
<li><a href="{{ route($lang.'.allwomens') }}">@lang('category.womens')</a></li>

推荐阅读