Đa ngôn ngữ trong laravel 9

Đa ngôn ngữ trong laravel 9

Website của bạn muốn tiếp cận đến với nhiều khách hàng hơn , khách hàng thì có từ khắp nơi trên thế giới và có nhiều loại ngôn ngữ khác nhau để phục vụ tốt hơn thì chúng ta cần đa ngôn ngữ cho website .Hôm nay mình sẽ hướng dẫn cho các bạn code đa ngôn ngữ với laravel 9

Các bước dưới đây sẽ hướng dẫn các bạn code từng bước 1 tạo demo website đa ngôn ngữ 

1: Tạo Laravel Project

Đầu tiên, mở Terminal và chạy lệnh sau để tạo một dự án laravel mới:

composer create-project --prefer-dist laravel/laravel muntilang

 2: Tạo Middleware 

Tạo middleware với command : 

php artisan make:middleware Local

Code file app/Http/Middleware/Local.php như sau :

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Session;

class Local
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        $lang = Session::get('lang');
        App::setLocale($lang);
        \config(['app.locale'=>$lang]);
        Carbon::setLocale($lang);
        return $next($request);
    }
}

Trong file app/Http/Kernel.php :


namespace App\Http;

use App\Http\Middleware\Local;
use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array<int, class-string|string>
     */
    protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Illuminate\Http\Middleware\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array<string, array<int, class-string|string>>
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            Local::class,
        ],

        'api' => [
            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array<string, class-string|string>
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \App\Http\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];
}

Ta phải thêm Local::class, vào middlewaregroups : web

Tiếp theo chúng ta cần thêm file ngôn ngữ vào mục lang : lang/vi/mess.php

Ở đây chúng ta demo với ngôn ngữ sau :


return [
    'home'=>'Trang chủ',
];

3: Tạo controller chuyển ngôn ngữ :

Command sau sẽ giúp chúng ta tạo 1 controller :


namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;

class LangController extends Controller
{
    public function lang(Request $request)
    {
        $lang = $request->lang;
        switch ($lang){
            case 'vi':
                $language = 'vi';
                break;
            default:
                $language = 'en';
                break;
        }
        Session::put('lang',$language);
        return redirect()->back();
    }
}

4: Tạo router 

Chỉnh sửa router routes/web.php :

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('lang/{lang}',[\App\Http\Controllers\LangController::class,'lang'])->name('lang');
Route::get('/', function () {
    return view('welcome');
});

5: Chỉnh sửa view :

File resources/views/welcome.blade.php chúng ta chỉnh sửa code như sau :

<a href="{{ route('lang',['lang'=>'en']) }}" >English</a>
<a href="{{ route('lang',['lang'=>'vi']) }}" >Việt Nam</a>
<h1>{!! __('mess.home') !!}</h1>

Demo github ở link download các bạn có thể download về xem và