ทำระบบรองรับหลายภาษาใน CodeIgniter 4
Sirichai Teerapattarasakul / November 29, 2024
2 min read
บันทึกวิธีการทำระบบด้วย CodeIgniter 4 ให้รองรับหลายภาษา ตรงนี้จะทำเป็นแค่ภาษาไทยและภาษาอังกฤษ(Thai/English) เพื่อไว้ต่อยอดภาษาอื่นๆ มาดูวิธีการทำและการตั้งค่ากันครับ
ขั้นตอน 1: ตั้งค่า Config ให้ใช้งานได้หลายภาษา
เริ่มแรก, เปิดไฟล์ app/Config/App.php
แล้วตั้งค่าภาษาตามนี้:
public $supportedLocales = ['en', 'th']; // รหัสภาษา
public $defaultLocale = 'en'; // ภาษาเริ่มต้น
public $negotiateLocale = true; // เปิดให้ตั้งภาษาเริ่มต้นตามเว็บเบราว์เซอร์
ขั้นตอน 2: สร้างไฟล์ Language
สร้างไฟล์จัดการแต่ละภาษาก็บไว้ใน app/Language
โดยสร้างโฟลเดอร์ตั้งตามรหัสภาษา (Language codes) ตามนี้:
app/Language/
├── en/
│ ├── App.php
│ └── Validation.php
└── th/
├── App.php
└── Validation.php
ตัวอย่าง EN (app/Language/en/App.php
):
<?php
return [
'welcome' => 'Welcome',
'hello' => 'Hello, {0}!',
'goodbye' => 'Goodbye'
];
ตัวอย่าง TH (app/Language/th/App.php
):
<?php
return [
'welcome' => 'ยินดีต้อนรับ',
'hello' => 'สวัสดี, {0}!',
'goodbye' => 'ลาก่อน'
];
ขั้นตอน 3: การใช้งานใน Controllers
สร้าง Controller จากนั้นเรียกใช้ language service เพื่อที่จะดึงข้อความเป็นภาษาที่ตั้งค่าไว้ก่อนหน้านั้น:
<?php
namespace App\Controllers;
class Home extends BaseController
{
public function index()
{
// รับค่าภาษาที่ใช้ ณ ตอนนี้
$language = $this->request->getLocale();
// เรียกใช้ข้อความภาษา
$data = [
'welcome' => lang('Messages.welcome'),
'greeting' => lang('Messages.hello', ['John']),
];
return view('welcome_page', $data);
}
}
ขั้นตอน 4: ทำตัวเลือกเปลี่ยนภาษา
ให้สร้าง Route ที่ไฟล์ app/Config/Routes.php
:
$routes->get('lang/(:any)', 'Language::switchLanguage/$1');
จากนั้นสร้าง Controller เพื่อเปลี่ยนภาษา:
<?php
namespace App\Controllers;
class Language extends BaseController
{
public function switchLanguage($locale)
{
// ตรวจสอบ Config
if (in_array($locale, config('App')->supportedLocales)) {
// เก็บตัวเลือกภาษาไว้ในตัวแปร session
session()->set('language', $locale);
// ให้ Redirect กลับไปยังเพจปัจจุบัน
return redirect()->back();
}
// กรณีไม่ตรงเงื่อนไขให้ Redirect ยังเพจเริ่มต้น
return redirect()->to('/');
}
}
สร้างตัวเลือกเปลี่ยนภาษา อันนี้ทำเป็นลิงค์แบบง่ายๆ กรณีหลายภาษาอาจจะทำเป็น Dropdown Menun ให้เลือกก็ได้:
<!-- app/Views/language_switcher.php -->
<div class="language-switcher">
<?php foreach (config('App')->supportedLocales as $locale): ?>
<a href="<?= site_url('lang/' . $locale) ?>"
class="<?= ($locale === config('App')->defaultLocale) ? 'active' : '' ?>">
<?= strtoupper($locale) ?>
</a>
<?php endforeach; ?>
</div>
การทำงานคือเมื่อกดลิงค์ก็จะไปที่ Route โดยเรียกใช้ Class Controller Language
และส่งค่าส่งรหัสภาษาเข้า Method switchLanguage
เพื่อเปลี่ยนภาษาเข้าไปเก็บในตัวแปร Session เพื่อให้จำไว้เรียกใช้ภาษาได้ทั้งระบบ หวังว่าคงมีประโยชน์ครับ