Laravel 应用程序在尝试切换语言时默认为fallback_locale

问题描述 投票:0回答:1

我正在尝试(第一次)构建一个系统,通过菜单选择来更改我的网络应用程序上的语言。 为了测试的目的,我尝试使用两种语言:法语和英语。

我已经使用 Laravel 10 构建了我的应用程序,因此我按照 Laravel 文档进行设置: 我的资源文件夹中有一个 lang 文件夹,其中有一个 en 和一个 fr 文件夹,每个文件夹都有一个 messages.php 来存放密钥。

我检查了我的 app.php、我的 kernel.php,制作了一个 SetLocale 中间件和一个 LanguageChange 控制器。 为了说明我的问题,这里有一些代码:

SetLocale 中间件如下:

<?php

 namespace App\Http\Middleware;

 use Closure;
 USE illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\App;
 use Illuminate\Support\Facades\Request;

 class SetLocale
 {
    public function handle($request, Closure $next)
    {
        $language = session('locale', config('app.fallback_locale'));
        Log::info('Session locale: ' . session('locale'));
        App::setLocale($language);
        Log::info('Selected locale: ' . $language);
        return $next($request);
    }

 }

LanguageChange 控制器如下:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\App; // Add this line
use Illuminate\Http\Request;

class LanguageController extends Controller
{
    public function changeLanguage(Request $request, $locale)

    {
        // Log the current session 'locale' value


        $request->session()->put('locale', $locale);
        // Log the current session 'locale' value
        Log::info('Session locale: ' . session('locale'));
        $language = session('locale', config('app.fallback_locale'));
        App::setLocale($language);

        session(['locale' => $locale]);
        return redirect()->back();
    }



}

正如我之前提到的,我已将应用程序区域设置设置为 fr,并将后备设置为 en,并将 available.locales 设置为 en 和 fr。

这是我正在测试的元素:

            <form method="POST" action="{{ route('change.language', 'en') }}">
                @csrf
                <button type="submit">Change to English</button>
            </form>

            <form method="POST" action="{{ route('change.language', 'fr') }}">
                @csrf
                <button type="submit">Change to French</button>
            </form>
            <div class="TextPresentation">
                <h2>{{__('messages.welcome')}}</h2>

                <p> {{__('messages.description')}}</p>
                <br/>
                <br/>
                <p>{{__('messages.contact')}}
                </p><a href="#">{{__('messages.Malt')}}</a>,<a href="#">{{__('messages.Fiverr')}}</a>
            </div>

最后是表单动作的路线:

Route::match(['get','post'], '/change-language/{locale}', [LanguageController::class, 'changeLanguage'])->name('change.language');

一个表单,有 2 个用于更改语言的按钮,以及一个文本块,其中的元素调用 lang 文件夹的键。 当手动更改时(或者准确地说,当我手动更改fallback_locale时),翻译完成,向我展示了两件事: 1)访问lang文件,因为按键根据fallback_locale的语言调用正确的文本 2)似乎有什么东西强制应用程序默认为fallback_locale。

我不知道如何找出原因。我使用 log 方法来查看发生了什么,它显示以下内容:

[2023-09-19 22:01:00] local.INFO: Session locale:   
[2023-09-19 22:01:00] local.INFO: Selected locale: fr  
[2023-09-19 22:01:00] local.INFO: Session locale: fr  
[2023-09-19 22:01:00] local.INFO: Session locale:   
[2023-09-19 22:01:00] local.INFO: Selected locale: fr  

(这是单次按下其中一个表单按钮) 会话区域设置似乎从未正确设置。并且选定的区域设置始终与应用程序的fallback_locale相匹配。

我不太确定如何诊断和调试问题。我最初尝试让页面根据浏览器首选项设置动态更改其语言,并且它成功了。但是当我尝试让用户通过选择语言来拥有代理权时,我现在面临这个问题......

我将不胜感激任何帮助/建议;-;

php laravel localization locale laravel-10
1个回答
0
投票

更改路线至

Route::get('/change-language', [LanguageController::class, 'changeLanguage'])->name('changeLang');

在 Blade 中,使用它进行语言切换。

 <select class="form-control changeLang">
      <option value="en" {{ session()->get('locale') == 'en' ? 'selected' : '' }}>English</option>
      <option value="fr" {{ session()->get('locale') == 'fr' ? 'selected' : '' }}>France</option>
 </select>

<script type="text/javascript">
  
    var url = "{{ route('changeLang') }}";
  
    $(".changeLang").change(function(){
        window.location.href = url + "?lang="+ $(this).val();
    });
  
</script>

在控制器中

 public function changeLanguage(Request $request, $locale) {

      App::setLocale($request->lang);
      session()->put('locale', $request->lang);

      return redirect()->back();
 }

在中间件中(只需使用它),使用类似

LanguageSwitch

的文件名
public function handle($request, Closure $next)
{
    if (session()->has('locale')) {
        App::setLocale(session()->get('locale'));
    }
      
    return $next($request);
}
© www.soinside.com 2019 - 2024. All rights reserved.