【问题标题】:Laravael - Language switcher not workingLaravel - 语言切换器不起作用
【发布时间】:2018-06-11 17:41:58
【问题描述】:

我正在尝试以两种语言(英语或德语)动态显示文本。但我没有完成任务,因为什么都没发生。

我做了以下事情:

中间件:

 public function handle($request, Closure $next) {
    if (!\Session::has('locale')) {
        \Session::put('locale', \Config::get('app.locale'));
    }

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

    return $next($request);
 }

 }

控制器:

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Session;
use App;
use Illuminate\Http\Request;
class LanguageController extends Controller {

protected $langs = ['en', 'de'];

public function changeLanguage($lang) {
    if (in_array($lang, $this->langs)) {
        App::setLocale($lang);
        Session::put('locale', $lang);
    }
    return redirect()->back();
}
}

内核:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\LanguageMiddleware::class,
];

查看:

  <div class="dropdown">
        <button class="dropbtn">{{trans('translations.lang')}}</button>
        <div class="dropdown-content">
        @if(Session::get('locale')=='en')
            <a href="lang/de">Deutsch</a>
        @else
             <a href="lang/en">English</a>
        @endif
        </div>
</div>

路线:

Route::get('lang/{id}', 'LanguageController@changeLanguage');

使用 Laravel 5.4

提前致谢:)

【问题讨论】:

  • 查看使用浏览器开发者工具呈现的内容。

标签: laravel controller middleware


【解决方案1】:

你可以像这样定义和中间件:

namespace App\Http\Middleware;

use Closure;

/**
 * Class LocaleMiddleware.
 */
class LocaleMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure                 $next
     *
     * @return mixed
     */
protected $languages = ['en','de'];

public function handle($request, Closure $next)
{
    if(!session()->has('locale'))
    {
        session()->put('locale', $request->getPreferredLanguage($this->languages));
    }

    app()->setLocale(session('locale'));

    return $next($request);
    }
}

在您的控制器上创建更改方法

public function changeLanguage($languague)
{
    if(Session::has(locale)){
        session()->set('locale', $language);}
    else{
        session()->set('locale', 'en');
    }

    return redirect()->back();
    }

路线的样子

Route::get('lang/{languague}', 'LanguageController@changeLanguage');

【讨论】:

  • 不幸的是,什么也没发生:/
  • 我认为问题出在 session()->set('locale', $language);我收到以下错误:调用未定义的方法 Illuminate\Session\Store::set() 但是如果我使用 session(['locale', $language]);我没有得到错误..
  • 在 laravel 5.4 上道歉,会话中不存在 set 方法。你描述了正确的方法。我会更正我的答案
  • 所以当在视图中使用 {{trans('translations.username')}} 时,我得到了 translations.username 而不是我为翻译输入的字符串。语言也没有变化。表示视图中的 if 不会更新
  • 基本上它不适用于德语。仅采用默认 en
【解决方案2】:

在你的路由命令中你发送 $id 但在你的控制器的函数中你输入的是 $lang 而不是 $id。错误可能是为此而来的。

你必须拥有这个

public function changeLanguage($id) {

【讨论】:

  • 不,我没有得到任何东西
猜你喜欢
  • 1970-01-01
  • 2014-09-01
  • 2021-07-09
  • 1970-01-01
  • 2021-08-13
  • 2020-01-12
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多