Laravel5 : ทำเว็บไซต์ให้รองรับหลายภาษา (Multi-language) บน Laravel 5.2
ปัจจุบันเว็บไซต์ที่เราใช้ๆกัน ก็ไม่ได้มีเพียงภาษาเดียวอีกต่อไปแล้ว ยิ่งเป็นเว็บไซต์ธุรกิจข้ามชาติยิ่งต้องรองรับหลายๆภาษาในตัวเอง และแน่นอนว่า Laravel ได้เตรียมพร้อมมาเพื่อสิ่งนี้แล้ว บทความนี้ผมจะพามาทำให้เว็บไซต์ ที่เขียนด้วย Laravel 5 Framework ให้รองรับหลายภาษากัน วิธีการสั้นๆ ไม่ยากเลย บางทีอาจจะง่ายกว่าที่คิดไว้อีกนะ
เริ่มต้น
เพิ่มภาษาให้กับแอปก่อนครับ เข้าไปที่ config/app.php
ตัวอย่างนี้ผมจะเพิ่มภาษาลงไปตามต้องการ คือ en ภาษาอังกฤษ , th ภาษาไทย ที่จริงจะตั้งชื่ออะไรก็ได้นะ แต่ควรตั้งให้สื่อเข้าใจ จะเป็นเป็นมาตรฐาน
'locales' => ['en' => 'English', 'th' => 'Thai'],
ส่วนถ้ากำหนด default ก็กำหนดที่ fallback_locale
'fallback_locale' => 'en',
สร้าง Class Language ใน Middleware
มากำหนด middleware ให้เว็บกำหนดภาษาตามกำหนดใน Session ครับ
สร้าง ไฟล์ใหม่ ชื่อ Language.php ใน app/Http/Middleware แล้วเติมโค้ดลงไป
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Routing\Redirector; use Illuminate\Http\Request; use Illuminate\Foundation\Application; use Illuminate\Contracts\Routing\Middleware; use Session; class Language implements Middleware { public function handle($request, Closure $next) { app()->setLocale(Session::get('locale')); return $next($request); } }
กำหนด Middleware ลงใน Kernel
ต่อมา เพิ่ม class ที่สร้างไปคือ Language มาใส่ลงใน app/Http/Kernel.php เติมไปที่ท้ายของ $middleware
protected $middleware = [ ... 'App\Http\Middleware\Language', ];
จะได้ประมาณนี้
ทีนี้เป็นอันเสร็จ step แรกแล้วครับ ต่อมาคือ มาสร้างที่เก็บคำศัพท์
สร้างโฟลเดอร์ภาษาสำหรับเก็บคำ
จากที่เรากำหนดภาษาไว้คือ en และ th เราก็ต้องสร้างที่เก็บภาษาให้ตรงตามกกำหนดไว้ครับ
เข้าไปที่ resources/lang แล้วสร้างโฟลเดอร์ภาษาตามต้องการให้ครบ ในที่นี้ของผมคือ th ,en (ปกติมันจะมี en มาให้ก่อน)
ลองสร้างไฟล์ home.php ในโฟลเดอร์ en
<?php return [ 'key' => 'messages', ]; ?>
โดยมันจะเก็บในรูปแบบ Array ข้างหน้า คือ key แล้วก็ตามด้วย ข้อความ ของภาษาไทยก็เช่นกัน
สร้างไฟล์ home.php ในโฟลเดอร์ th ก็ทำแบบเดียวกัน แค่เปลี่ยนข้อความด้านหลังเป็นภาษาไทย
ตัวอย่าง en/home.php
ตัวอย่าง th/home.php ชื่อไฟล์เดียวกัน และ key เหมือนเดิม
การนำไปใช้
พอเรากำหนดคำในแต่ละภาษาไว้เรียบร้อยแล้ว เราจะนำไปใช้กันครับ โดยการแสดงผลต้องเอาไปแสดงใน views
เช่น resources/views/home.blade.php
ตรงไหนที่เราจะพิมพ์ข้อความก็ เรียก
{{ trans('home.hello') }}
หรือ
<?php echo trans('home.hello') ?>
<?php echo Lang::get('home.hello'); ?>
มันก็จะแสดงข้อความที่มี key ว่า hello แล้วละ ถ้าเราเลือกภาษาอะไรก็จะเอามาแสดง
การเปลี่ยนภาษา
มีกำหนดภาษา ก็ต้องมีการเปลี่ยนภาษาได้ แนะนำว่าให้ไปทำที่ Controller ครับ อันนี้ตามสะดวกเลย
แค่เรียกใช้
// $lang is 'en' or 'th' Session::put('locale',$lang); \App::setLocale($lang);
โดยอาจจะทำหน้าเปลี่ยนสำหรับภาษาให้ผู้ใช้เลือกเปลี่ยน สร้างฟอร์มธรรมดาๆ แล้วไปเรียก controller
ส่วน พารามิเตอร์ก็เป็น en หรือ th นั่นเอง
ลองทดสอบเปลี่ยนภาษาดูครับ ผมทดสอบกับ Benznest Wallet ของผมดู ลองหน้า home.blade.php ครับ
ลองทดสอบเปลี่ยนภาษาเป็นภาษาอังกฤษ
แล้วใน Database ละ ?
อันนี้ก็ต้อง manual เองครับ อยู่ที่ฐานข้อมูลแล้วละ อาจจะสร้าง field เพิ่มขึ้นมาเพื่อเก็บอีกภาษานึงโดยเฉพาะ
จบแล้ว
ไม่ยากเลยกับการเพิ่มภาษาให้สนับสนุนหลายๆภาษาบนเว็บไซต์ของเราใช่มัยครับ โดย Laravel เตรียมมาให้แล้ว ใช้อย่างง่ายดาย สนุกสนาน ซึ่งมีเกร็ดเล็กน้อยๆอีกมากที่ผมก็กำลังศึกษาอยู่ ผมก็ไม่แน่ใจว่าการทำ multi language แบบนี้จะเป็นวิธีที่ดีที่สุดรึปล่าว สามารถศึกษาได้จากเว็บของ laravel โดยตรงครับ หวังว่าจะเป็นแนวทางแล้วประโยชน์กับผู้ที่สนใจครับ
ต้องขอตัวไปอัพเดท Benznest Wallet ให้เป็นฉบับสมบูรณ์ก่อน คำเยอะมากๆเลยละ
Reference
https://laravel.com/docs/5.0/localization