iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
佛心分享-IT 人自學之術

後端小白自學 Laravel系列 第 26

第 26 天:多語言支持

  • 分享至 

  • xImage
  •  

文件:本地化

使用 Laravel 的語言文件進行多語言支持


Laravel 使用語言文件來支持多語言功能,這些文件存放在 resources/lang 目錄下。

創建語言文件
resources/lang 目錄下,創建一個以語言代碼命名的子目錄,例如 enes,然後在每個子目錄中放置相應的語言文件,例如 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 中用來動態設置應用程序語言的函數。

  1. 控制器中設置語言:
    當使用者選擇不同語言時,可以在控制器中設置語言。

    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();
        }
    }
    
  2. 中間件中設置語言:
    希望基於用戶會話或請求中設置的語言選擇動態更改語言,可以使用中間件來實現這個功能。

    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,
        ],
    ];
    
  3. 視圖中設置語言:
    在視圖中動態設置語言,比如根據用戶的設置顯示不同的內容。

    // 在 Blade 模板中
    @php
     App::setLocale($userPreferredLocale); // 假設 $userPreferredLocale 是用戶偏好的語言代碼
    @endphp
    
  4. 路由中設置語言:
    在路由中設置語言,根據 URL 中的語言參數來選擇語言。

    Route::get('/{locale}/dashboard', function ($locale) {
        if (in_array($locale, ['en', 'zh'])) {
            App::setLocale($locale);
        }
        return view('dashboard');
    });
    

上一篇
第 25 天:數據存儲與處理 Session
下一篇
第 27 天:實戰項目 - 後台任務管理應用測試
系列文
後端小白自學 Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言