duangou2046 2018-06-21 11:15
浏览 89

在多语言网站中生成链接

I have multi-language website. In order to locale website I use middleware which look like this:

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

My names of roote looks like this: 'pl.articles' or 'en.acritcles' so I use cookie to generate links into view. For example:

@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

It works but I have a little problem. Actully when I change a language, links will bo to a previous version. So I must reload website in order to change links to. Sometimes I click some link and langage of my website will chang. I click again and language will come back to previous version. Where is the problem? I use middleware in a group

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

1条回答 默认 最新

  • dongle7882 2018-06-21 12:02
    关注

    Create Middleware called "Language"

    <?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);
        }
    }
    

    put this middleware in your Web group in Kernel.php file

    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',
        ],
    ];
    

    create language change form

    <a href="#" onclick="setLanguage(event, 'en')">English</a>
    <a href="#" onclick="setLanguage(event, 'pl')">ქართული</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>
    

    so language will be set on every form submit

    then in your views you can use

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

报告相同问题?

悬赏问题

  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 路易威登官网 里边的参数逆向
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏
  • ¥15 gg加速器加速游戏时,提示不是x86架构
  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入