【问题标题】:How to add multilanguage to Laravel 5.3 using SESSION如何使用 SESSION 向 Laravel 5.3 添加多语言
【发布时间】:2017-04-07 19:02:50
【问题描述】:

我想为我的网站添加多语言支持,但我不知道如何最好地实现它。 Laravel 文档 (https://laravel.com/docs/5.3/localization) 非常少见,因此我进行了一些研究,但似乎每个人都使用不同的解决方案,并且使用的 URL 包含其中的语言 - 例如 example.com/en/pagename

我想要一个没有语言标签的 URL 架构。像这样的东西:example.com/pagename

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

example.com/pagename (english) example.com/seitenname (german)

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

在我的网站上,用户可以注册一个帐户。他将能够将他的首选语言保存在数据库中——比如在表users 中的字段pref_lang 中。在这种情况下,为了简单起见,它只是一个像“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 <a href="#"> 标签中的 URL?

【问题讨论】:

    标签: laravel laravel-routing laravel-5.3 multilingual


    【解决方案1】:

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

    1. users 表中创建language 列。这就是我过去设置的方式,$table->string('language')->default('en');
    2. 创建一个新的中间件来检测语言变化,例如:SetLanguage
    3. 将中间件添加到app\Http\Kernel.php 中的web 中间件组的底部。
    4. 将以下内容粘贴到handle 方法中。

      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);
      
    5. 创建一个服务提供者并将其注册到您的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);
      });
      
    6. 现在,您可以在您的 template.name.blade.php 中循环浏览您的应用程序中可用的语言。

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

    【讨论】:

    • 谢谢,但是 Laravel 在哪里从浏览器读取第一种/默认语言,如果它还没有在数据库中设置?那不见了,还是?另外:我不想将语言存储在 {{ url('/') . '?language=' . $language }} 中,而是存储在 cookie / session 中。这不可能吗?
    • 数据库中有一个默认值,设置为en。您可以将其更改为您喜欢的任何内容。
    【解决方案2】:

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

    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>
    

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

    【讨论】:

    • 代码优化并不是问题的重点。你指的是另一个答案吗?还不够清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多