如何使用会话向Laravel 5.3添加多语言

如何使用会话向Laravel 5.3添加多语言,laravel,laravel-routing,laravel-5.3,multilingual,Laravel,Laravel Routing,Laravel 5.3,Multilingual,我想为我的网站添加多语言支持,但我不知道如何最好地实现它。Laravel文档()非常罕见,因此我做了一些研究,但每个人似乎都使用不同的解决方案,并且使用带有内部语言的URL,例如example.com/en/pagename 我想要一个没有语言标记的URL模式。类似这样的内容:example.com/pagename 现在,根据用户的语言,URL应翻译为: example.com/pagename(英语) example.com/seitenname(德语) 浏览器设置/语言应检测初始语言。用户

我想为我的网站添加多语言支持,但我不知道如何最好地实现它。Laravel文档()非常罕见,因此我做了一些研究,但每个人似乎都使用不同的解决方案,并且使用带有内部语言的URL,例如
example.com/en/pagename

我想要一个没有语言标记的URL模式。类似这样的内容:
example.com/pagename

现在,根据用户的语言,URL应翻译为:

example.com/pagename(英语)
example.com/seitenname(德语)

浏览器设置/语言应检测初始语言。用户还可以选择在提供的语言之间切换

在我的网站上,用户可以注册帐户。他将能够在数据库中保存自己喜欢的语言,比如在字段
pref_lang
中的表
users
。在本例中,为了保持简单,它只是一个类似“en”(英语)或“de”(德语)的字符串

通过创建如下语言文件,可以轻松地翻译路线:

// resources/lang/de/routes.php

return array(
    'contact'   => 'kontakt',
    'pagename'   => 'seitenname'
);
…一个用于EN:

// resources/lang/en/routes.php

return array(
    'contact'   => 'contact',
    'pagename'   => 'pagename'
);
…结合这些路线,例如:

// routes/web.php

Route::get('/', function () {
    return view('pages.dashboard');
});

Route::get('/{contact}', function () {
    return view('pages.contact');
});

Route::get('/{pay2gether-system}', function () {
    return view('pages.pagename');
});

现在的问题是,我如何创建这样一个“语言切换”按钮,在会话中存储来自浏览器设置/切换操作或数据库的语言,以及如何在HTML
标记中的路由和URL中重复使用它?

我已经做了几次,而且很容易完成。按照以下步骤进行操作,如果您有任何其他问题,请随时提问

  • users
    表中创建
    language
    列。这就是我过去设置它的方式,
    $table->string('language')->default('en')
  • 创建新的中间件以检测语言更改,例如:
    SetLanguage
  • 将中间件添加到
    app\Http\Kernel.php
    web
    中间件组的底部
  • 将以下内容粘贴到
    句柄
    方法中

    if ($request->has('language')) {
        if (auth()->user()) {
            auth()->user()->language = $request->language;
            auth()->user()->save();
        }
        App::setLocale($request->language);
    } elseif (auth()->user()) {
        App::setLocale(auth()->user()->language);
    }
    return $next($request);
    
  • 创建一个服务提供者,并将其注册到
    config/app.php
    中,然后在引导方法中粘贴以下代码

    view()->composer('template.name', function($view) {
        $languages = [];
        $folders = File::directories(base_path('resources/lang/'));
        foreach ($folders as $folder) {
            $languages[] = str_replace('\\', '', last(explode('/',$folder)));
        }
        $view->with('languages', $languages);
    });
    
  • 现在,在
    template.name.blade.php中,您可以循环使用应用程序中可用的语言


  • 在您的下拉列表中,您应该使用
    {{url('/')。?language='.$language}}
    作为循环时的链接。您可以将
    语言
    键更改为其他内容,但如果更改,还必须在中间件中更改它。

    我已经做了几次,这很容易完成。按照以下步骤进行操作,如果您有任何其他问题,请随时提问

  • users
    表中创建
    language
    列。这就是我过去设置它的方式,
    $table->string('language')->default('en')
  • 创建新的中间件以检测语言更改,例如:
    SetLanguage
  • 将中间件添加到
    app\Http\Kernel.php
    web
    中间件组的底部
  • 将以下内容粘贴到
    句柄
    方法中

    if ($request->has('language')) {
        if (auth()->user()) {
            auth()->user()->language = $request->language;
            auth()->user()->save();
        }
        App::setLocale($request->language);
    } elseif (auth()->user()) {
        App::setLocale(auth()->user()->language);
    }
    return $next($request);
    
  • 创建一个服务提供者,并将其注册到
    config/app.php
    中,然后在引导方法中粘贴以下代码

    view()->composer('template.name', function($view) {
        $languages = [];
        $folders = File::directories(base_path('resources/lang/'));
        foreach ($folders as $folder) {
            $languages[] = str_replace('\\', '', last(explode('/',$folder)));
        }
        $view->with('languages', $languages);
    });
    
  • 现在,在
    template.name.blade.php中,您可以循环使用应用程序中可用的语言


  • 在您的下拉列表中,您应该使用
    {{url('/')。?language='.$language}}
    作为循环时的链接。您可以将
    语言
    键更改为其他内容,但如果更改,还必须在中间件中进行更改。

    我将在中间件中执行以下操作:

    public function handle($request, Closure $next)
    {
        if ($request->has('language')) {
            $path   = $request->path();
            $locale = $request->get('language'); 
    
            # save locale 
            Cookie::queue(Cookie::make(
                'language', $locale, 1440 // 24h
            ));
    
            # set locale
            \App::setLocale($locale);  
    
            return redirect($path)->withCookie(cookie('language'));
        }
    
        if ($locale = $request->cookie('language')) {
           \App::setLocale($locale);  
        }
    
        return $next($request);
    }
    
    现在在提供程序中:

    public function boot()
    {
        View::composer('template.name', function($view) {
            $directory = base_path('resources/lang/');
            $languages = \File::directories($directory);
            $view->with('languages', array_map('basename', $languages));
        });
    }
    
    并且认为:

    <ul class="dropdown-menu" role="menu">
        @foreach ($languages as $lang)
            <li>
                <a href="{{ url()->current() . '/?language=' . $lang }}" title="">{{ $lang }}</a>
            </li>
        @endforeach
    </ul>
    
      @foreach($lang形式的语言)
    • @endforeach

    我不确定这是否是最好的解决方案。。。也许在Laravel有更多经验的人可以向我们展示另一种解决方案

    我会在中间件中做一些事情:

    public function handle($request, Closure $next)
    {
        if ($request->has('language')) {
            $path   = $request->path();
            $locale = $request->get('language'); 
    
            # save locale 
            Cookie::queue(Cookie::make(
                'language', $locale, 1440 // 24h
            ));
    
            # set locale
            \App::setLocale($locale);  
    
            return redirect($path)->withCookie(cookie('language'));
        }
    
        if ($locale = $request->cookie('language')) {
           \App::setLocale($locale);  
        }
    
        return $next($request);
    }
    
    现在在提供程序中:

    public function boot()
    {
        View::composer('template.name', function($view) {
            $directory = base_path('resources/lang/');
            $languages = \File::directories($directory);
            $view->with('languages', array_map('basename', $languages));
        });
    }
    
    并且认为:

    <ul class="dropdown-menu" role="menu">
        @foreach ($languages as $lang)
            <li>
                <a href="{{ url()->current() . '/?language=' . $lang }}" title="">{{ $lang }}</a>
            </li>
        @endforeach
    </ul>
    
      @foreach($lang形式的语言)
    • @endforeach

    我不确定这是否是最好的解决方案。。。也许对Laravel有更多经验的人可以向我们展示另一种解决方案

    谢谢,但是如果数据库中还没有设置第一种/默认语言,Laravel从浏览器中从哪里读取?那不见了,还是?另外:我不想将语言存储在类似的
    {{url('/')。?language='.$language}}
    中,而是存储在cookie/会话中。这不可能吗?数据库中有一个默认值,它被设置为
    en
    。您可以将其更改为您想要的任何语言。谢谢,但是如果数据库中尚未设置第一语言/默认语言,Laravel从浏览器中从何处读取第一语言/默认语言?那不见了,还是?另外:我不想将语言存储在类似的
    {{url('/')。?language='.$language}}
    中,而是存储在cookie/会话中。这不可能吗?数据库中有一个默认值,它被设置为
    en
    。你可以把它改成你想要的任何东西。不过,代码优化并不是问题的关键。你指的是另一个答案吗?这还不够清楚。不过,代码优化并不是问题的关键。你指的是另一个答案吗?还不够清楚。