Làm website đa ngôn ngữ bằng Laravel 5.4

Post on: 2017-08-15 02:34:39 | in: Laravel
Làm website đa ngôn ngữ với Laravel 5.4 đơn giản và hiệu quả, đây là cách mình tìm hiểu trên mạng và thực hành mong mọi người đóng góp nhé!

Bài này mình sẽ không giới thiệu về Laravel mà tập trung vào thực hành với 2 ngôn ngữ là tiếng Việt và tiếng Anh từ đây mọi người có thể phát triển thêm.
Oke đầu tiên trong file config/app.php thêm

'locales' => ['en' => 'English', 'vn' => 'VietNam'],

Tạo middleware tên LangMiddleware trong thư mục App/Http/Middleware

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\App;

class LangMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $lang = $request->input('lang');
        if($lang){
            if(!array_key_exists($lang,config('app.locales'))){
                $lang = 'en';
            };
            $request->session()->put('lang', $lang);
            App::setLocale($lang);

        } else {
            $lang = $request->session()->get('lang');
            if(!array_key_exists($lang,config('app.locales'))){
                $request->session()->put('lang', $lang);
                $lang = 'en';
            };
            App::setLocale($lang);
        }
        View::share('lang',$lang);
        return $next($request);
    }
}

Trong App/Http/kernel.php

protected $routeMiddleware = [
      ...
      ...
      ...
      ...
      ...
       'lang' => \App\Http\Middleware\LangMiddleware::class,
   ];

Để tất cả web đều sử dụng được 2 ngôn ngữ thì trong Routers/web.php cần phải làm như sau:

Route::group(['middleware' => ['lang']], function() {
    Route::get('login','[email protected]');
    Route::get('logout','[email protected]');
    ...
}

Từ đầu đến giờ toàn nói đa ngôn ngữ nhưng chúng ta vẫn chưa động chạm gì đến phần hiển thị ngôn ngữ của site. Để site hiện thị đa ngôn ngữ trước tiên trong resources thêm thư mục lang chứa các thư mục con là vn, en chứa các file định dạng ngôn ngữ.

Ví dụ

Trong thư mục lang/vn tạo file label.php như sau:

return [
    'lbl_placeholder_lastname'=>'Họ và tên đệm',
    'lbl_placeholder_firstname' => 'Tên',
    'lbl_placeholder_phone'=>'Số điện thoại',
    'lbl_placeholder_email'=>'Email',
    'lbl_btn_register'=>'Đăng ký',
    'lbl_btn_login'=>'Đăng nhập',
    'lbl_sign_out'=>'Đăng xuất',
]
?>

Tương tự trong lang/en tạo file label.php

return [
    'lbl_placeholder_lastname'=>'Last name',
    'lbl_placeholder_firstname' => 'First name',
    'lbl_placeholder_phone'=>'Mobile number',
    'lbl_placeholder_email'=>'Email',
    'lbl_btn_register'=>'Register',
    'lbl_btn_login'=>'Login',
    'lbl_sign_out'=>'Sign out',
]
?>

Bình thường đối với những website chỉ có một ngôn ngữ duy nhất nội dung cần hiển thị sẽ được viết trực tiếp ra nhưng đối với site đa ngôn ngữ chúng ta sẽ sử dụng phần key trong file định dạng ngôn ngữ trong thư mục lang.
Ví dụ bạn muốn hiển thị nội dung 'Họ và tên đệm' đối với tiếng Việt hoặc 'Last name' đối với tiếng Anh, bạn chỉ cần dùng @lang('label.lbl_placeholder_lastname') thay vì để nội dung gốc của nó. Trong đó label là tên file, lbl_placeholder_lastname key tương ứng với  'Họ và tên đệm' hoặc 'Last name'.

Vậy là xong với cách này bạn có thể phát triển thêm website với ngôn ngữ tự hiển thị theo ngôn ngữ của người dùng hoặc đơn giản gán mặc định một ngôn ngữ thường sử dụng và cho phép người dùng thay đổi ngôn ngữ.
Đối với cách 2 trong file Controller.php bạn thêm ngôn ngữ mặc định của mình vào function  __construct như dưới:

public function __construct(Request $request)
{
      View::share("lang",'vn');
}

Để thay đổi ngôn ngữ ở bất kì vị trí nào trên site bạn có thể dùng:

<a href="{{url(Request::getPathInfo().'?lang=en')}}">English </a>
<a href="{{url(Request::getPathInfo().'?lang=vn')}}">VietNam </a>

Bạn tự thêm biểu tượng cờ tương ứng đối với các ngôn ngữ nhé.
Chúc bạn thành công!

Tag: laravel PHP nâng cao