ทำระบบรองรับหลายภาษาใน CodeIgniter 4

Sirichai Teerapattarasakul

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 เพื่อให้จำไว้เรียกใช้ภาษาได้ทั้งระบบ หวังว่าคงมีประโยชน์ครับ