我正在尝试(第一次)构建一个系统,通过菜单选择来更改我的网络应用程序上的语言。 为了测试的目的,我尝试使用两种语言:法语和英语。
我已经使用 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相匹配。
我不太确定如何诊断和调试问题。我最初尝试让页面根据浏览器首选项设置动态更改其语言,并且它成功了。但是当我尝试让用户通过选择语言来拥有代理权时,我现在面临这个问题......
我将不胜感激任何帮助/建议;-;
更改路线至
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);
}