文件:本地化
Laravel 使用語言文件來支持多語言功能,這些文件存放在 resources/lang
目錄下。
創建語言文件
在 resources/lang
目錄下,創建一個以語言代碼命名的子目錄,例如 en
和 es
,然後在每個子目錄中放置相應的語言文件,例如 messages.php
。
resources/lang/en/messages.php
resources/lang/es/messages.php
編寫翻譯內容
在 messages.php
文件中,定義翻譯內容:
// resources/lang/en/messages.php
return [
'welcome' => 'Welcome to our application!',
];
// resources/lang/es/messages.php
return [
'welcome' => '¡Bienvenido a nuestra aplicación!',
];
使用翻譯內容
在 Blade 模板或控制器中使用 __('key')
函數來獲取翻譯內容
// 在 Blade 模板中
<h1>{{ __('messages.welcome') }}</h1>
// 在控制器中
return view('welcome', ['message' => __('messages.welcome')]);
設置默認語言
在 config/app.php
中設置應用程序的默認語言
'locale' => 'en',
動態更改語言
可以在應用中動態更改語言,例如根據用戶選擇的語言:
文件:設定地區
use Illuminate\Support\Facades\App;
public function setLocale($locale)
{
App::setLocale($locale);
session(['locale' => $locale]);
return redirect()->back();
}
在中間件中設置語言:
public function handle($request, Closure $next)
{
if (session()->has('locale')) {
App::setLocale(session('locale'));
}
return $next($request);
}
設置區域
在 config/app.php
中設置默認區域,也可以根據用戶的地理位置或其他條件來設置區域。
'locale' => 'en',
語言切換
創建一個語言切換功能,讓用戶可以選擇顯示語言:
// 在 Blade 模板中
<form action="{{ route('locale.change') }}" method="POST">
@csrf
<select name="locale" onchange="this.form.submit()">
<option value="en" {{ app()->getLocale() == 'en' ? 'selected' : '' }}>English</option>
<option value="es" {{ app()->getLocale() == 'es' ? 'selected' : '' }}>Español</option>
</select>
</form>
// 在路由中
Route::post('/locale/change', [LocaleController::class, 'change'])->name('locale.change');
// 在 LocaleController 中
public function change(Request $request)
{
$locale = $request->input('locale');
App::setLocale($locale);
session(['locale' => $locale]);
return redirect()->back();
}
第 18 天:驗證與自定義規則提過錯誤訊息可以自定義,因為是自定義所以也可以把 Laravel 的表單請求錯誤訊息通過語言文件進行本地化。
step 1 - 定義錯誤訊息
Laravel 的驗證錯誤訊息可以在 resources/lang/en/validation.php
文件中進行配置,如果還有其他語言也要加入翻譯,只需要在對應的語言目錄中創建相同的文件,例如:resources/lang/zh/validation.php
。
// resources/lang/en/validation.php
return [
'required' => 'The :attribute field is required.',
'email' => 'The :attribute must be a valid email address.',
];
// resources/lang/zh/validation.php
return [
'required' => ':attribute 是必填的。',
'email' => ':attribute 必須是一個有效的電子郵件地址。',
];
step 2 - 使用翻譯
在表單請求驗證中,Laravel 會自動使用對應語言的錯誤訊息。例如,如果用戶選擇了中文作為界面語言,那麼驗證錯誤訊息會顯示中文。
step 3 - 切換語言
在應用程序中設置默認語言或允許用戶選擇語言,可以根據之前的設置來管理錯誤訊息的顯示語言。
// 在 config/app.php 中設置默認語言
'locale' => 'zh',
step 4 - 動態設置語言App::setLocale('zh');
是 Laravel 中用來動態設置應用程序語言的函數。
在控制器
中設置語言:
當使用者選擇不同語言時,可以在控制器中設置語言。
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
class LanguageController extends Controller
{
public function switchLanguage($locale)
{
// 驗證語言是否有效
if (in_array($locale, ['en', 'zh'])) {
App::setLocale($locale);
session(['locale' => $locale]); // 可以將選擇的語言存儲在會話中
}
return redirect()->back();
}
}
在中間件
中設置語言:
希望基於用戶會話或請求中設置的語言選擇動態更改語言,可以使用中間件來實現這個功能。
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\App;
class SetLocale
{
public function handle($request, Closure $next)
{
$locale = $request->session()->get('locale', 'en'); // 默認語言為 'en'
App::setLocale($locale);
return $next($request);
}
}
然後在 Kernel.php
中註冊這個中間件:
protected $middlewareGroups = [
'web' => [
// 其他中間件
\App\Http\Middleware\SetLocale::class,
],
];
在視圖
中設置語言:
在視圖中動態設置語言,比如根據用戶的設置顯示不同的內容。
// 在 Blade 模板中
@php
App::setLocale($userPreferredLocale); // 假設 $userPreferredLocale 是用戶偏好的語言代碼
@endphp
在路由
中設置語言:
在路由中設置語言,根據 URL 中的語言參數來選擇語言。
Route::get('/{locale}/dashboard', function ($locale) {
if (in_array($locale, ['en', 'zh'])) {
App::setLocale($locale);
}
return view('dashboard');
});