การสร้างเว็บไซต์ที่รองรับหลายภาษา (Multi-language) เป็นสิ่งจำเป็นสำหรับแพลตฟอร์มระดับสากล ในขณะที่ Yii2 ใช้ Widget และ PHP Variables ในการจัดการภาษา แต่เมื่อเราย้ายมาสู่ระบบ Backend ที่เน้นความแข็งแกร่งของข้อมูลอย่าง PostgreSQL การออกแบบโครงสร้างฐานข้อมูลให้รองรับ Localization อย่างเป็นระบบคือหัวใจสำคัญ บทความนี้จะนำเสนอแนวคิดในการจำลองฟังก์ชัน ‘Language Switcher’ โดยใช้พลังของ SQL และคุณสมบัติขั้นสูงของ PostgreSQL
🌐 หลักการออกแบบ Multi-language ใน PostgreSQL
แทนที่จะพึ่งพาโค้ดฝั่งแอปพลิเคชันทั้งหมด เราจะใช้ PostgreSQL จัดการโครงสร้างข้อมูลภาษา (Locale) และคำแปลต่างๆ การจัดการนี้ต้องอาศัยตารางหลัก 2 ส่วน คือ ตารางเก็บรายการภาษาที่รองรับ (Languages) และตารางสำหรับจัดเก็บเนื้อหาที่ถูกแปลแล้ว (Translations)
🛠️ โครงสร้างฐานข้อมูลพื้นฐาน
เราจะใช้ `jsonb` เพื่อความยืดหยุ่นในการเก็บ Metadata ของแต่ละภาษา และใช้ฟังก์ชัน SQL ในการดึงค่าปัจจุบันและสร้างลิงก์ต่างๆ
1. ตาราง Languages (รายการภาษา)
SQL
CREATE TABLE languages ( language_code VARCHAR(10) PRIMARY KEY, display_name VARCHAR(50), is_active BOOLEAN DEFAULT TRUE);
2. ตาราง Translations (คำแปลเนื้อหา)
ตารางนี้จะเก็บข้อความที่ถูกแปลแล้ว โดยเชื่อมโยงกับรหัสภาษาและ ID ของเนื้อหานั้นๆ
SQL
CREATE TABLE translations ( content_id INT, language_code VARCHAR(10), translated_text TEXT NOT NULL, PRIMARY KEY (content_id, language_code));
🚀 การจำลอง Widget เปลี่ยนภาษาด้วย SQL Function
ในโลกของ PHP เราใช้ Widget เพื่อสร้างปุ่มเปลี่ยนภาษา แต่ใน PostgreSQL เราจะใช้ Stored Function หรือ View ที่ซับซ้อนเพื่อทำหน้าที่นี้ โดยฟังก์ชันนี้จะต้องรับค่า Locale ปัจจุบัน (เช่น จาก Session/Cookie) และส่งคืนรายการลิงก์ทั้งหมดที่ผู้ใช้สามารถคลิกได้
เราสามารถใช้ `generate_series` ร่วมกับ `jsonb` เพื่อจำลองการวนลูปของภาษาต่างๆ:
SQL
CREATE OR REPLACE FUNCTION get_language_switcher_links(current_locale VARCHAR) RETURNS TABLE (link_text TEXT, target_url TEXT) AS $$ BEGIN RETURN QUERY SELECT l.display_name::TEXT AS link_text, '/' || l.language_code AS target_url FROM languages l WHERE l.is_active = TRUE AND l.language_code != current_locale ORDER BY l.display_name;END;$$ LANGUAGE plpgsql;
💡 การใช้งานและการดึงข้อมูล
หากผู้ใช้ปัจจุบันอยู่ในภาษา ‘th’ เราสามารถเรียกฟังก์ชันนี้เพื่อรับรายการลิงก์ทั้งหมดที่ควรแสดงใน Widget:
SQL
SELECT * FROM get_language_switcher_links('th');
✅ บทสรุป: ความเหนือกว่าของ PostgreSQL
การใช้ PostgreSQL ในการจัดการระบบ Multi-language ทำให้เราสามารถแยก Logic การแสดงผลภาษาออกจาก Business Logic หลักได้อย่างสมบูรณ์ เราไม่จำเป็นต้องเขียนโค้ด PHP เพื่อวนลูปหาภาษา แต่ให้ฐานข้อมูลทำหน้าที่นั้นแทน ด้วยฟังก์ชันและ View ที่ออกแบบมาอย่างดี ระบบจะมีความยืดหยุ่นสูง สามารถเพิ่มภาษาใหม่ได้เพียงแค่การ INSERT ข้อมูลในตาราง `languages` โดยไม่ต้องแก้ไขโครงสร้างหลักของแอปพลิเคชันเลย นี่คือแนวทางที่สถาปนิกระบบระดับ Senior ควรนำไปใช้เพื่อความ Scalability และ Maintainability สูงสุด