Kotchasan Framework Documentation
คลาส Language - ระบบจัดการภาษา
คลาส Language - ระบบจัดการภาษา
คลาส Language เป็นระบบจัดการภาษาสำหรับแอปพลิเคชันแบบ Multi-language รองรับการโหลดไฟล์ภาษา, ดึงค่าแปล, แทนที่ placeholder, และ format string
Namespace
Kotchasan\Languageภาพรวม
Language class ให้บริการ:
- โหลดและจัดการไฟล์ภาษา (PHP และ JS)
- ดึงค่าแปลจาก language key
- รองรับ Auto-detect ภาษาจาก browser
- Format string ด้วย sprintf และ placeholder replacement
- บันทึกไฟล์ภาษา
- แปลเนื้อหาที่มี
{LNG_KEY}placeholders
การกำหนดค่า
// ในไฟล์ config
define('INIT_LANGUAGE', 'auto'); // Auto-detect จาก browser
// หรือ
define('INIT_LANGUAGE', 'th'); // กำหนดภาษาเริ่มต้น
// กำหนดภาษาที่รองรับ
$cfg->languages = [
'th' => 'ภาษาไทย',
'en' => 'English'
];โครงสร้างไฟล์ภาษา
PHP Language File (language/th.php)
/* language/th.php */
return array(
'Hello' => 'สวัสดี',
'Welcome' => 'ยินดีต้อนรับ',
'YEAR_OFFSET' => 543,
'MONTH_LONG' => array(
1 => 'มกราคม',
2 => 'กุมภาพันธ์',
// ...
)
);JavaScript Language File (language/th.js)
var Hello = 'สวัสดี';
var Welcome = 'ยินดีต้อนรับ';Public Methods
get()
ดึงค่าแปลจาก language key
public static function get(string $key, mixed $default = null, mixed $value = null): mixedพารามิเตอร์:
$key- language key หรือข้อความภาษาอังกฤษ$default- ค่า default ถ้าไม่พบ key (default:nullจะใช้$key)$value- ถ้า key เป็น array สามารถระบุ key ย่อยได้
คืนค่า: ค่าแปล หรือ default value
ตัวอย่าง:
use Kotchasan\Language;
// พื้นฐาน
echo Language::get('Hello');
// Output: "สวัสดี" (ถ้าเป็นภาษาไทย)
// ระบุ default value
echo Language::get('Unknown Key', 'Not found');
// Output: "Not found"
// ดึงจาก array
echo Language::get('MONTH_LONG', null, 1);
// Output: "มกราคม" (เดือนที่ 1)
// ไม่ระบุ default (ใช้ key เป็น default)
echo Language::get('NonExistent');
// Output: "NonExistent"ตัวอย่างการใช้งานจริง:
// แสดงข้อความแจ้งเตือน
function showAlert($type)
{
$messages = [
'success' => Language::get('Operation completed successfully'),
'error' => Language::get('An error occurred'),
'warning' => Language::get('Please check your input')
];
return $messages[$type] ?? Language::get('Unknown message');
}
// ใช้กับ form labels
echo '<label>' . Language::get('Username') . '</label>';
echo '<label>' . Language::get('Password') . '</label>';getItems()
ดึงค่าแปลหลาย keys พร้อมกัน
public static function getItems(array $keys = []): arrayพารามิเตอร์:
$keys- array ของ language keys
คืนค่า: array ของค่าแปล
ตัวอย่าง:
use Kotchasan\Language;
// ดึงหลาย keys
$labels = Language::getItems([
'username' => 'Username',
'password' => 'Password',
'email' => 'Email',
'submit' => 'Submit'
]);
// ใช้งาน
foreach ($labels as $key => $label) {
echo "<label>{$label}</label>";
}
// ดึงโดยไม่ระบุ custom keys
$messages = Language::getItems(['Save', 'Cancel', 'Delete']);
// Result: ['Save' => 'บันทึก', 'Cancel' => 'ยกเลิก', 'Delete' => 'ลบ']replace()
แทนที่ placeholder ในข้อความ
public static function replace(string $key, mixed $replace): stringพารามิเตอร์:
$key- language key$replace- ค่าที่จะแทนที่ (string, array, หรือ object)
คืนค่า: ข้อความที่แทนที่แล้ว
ตัวอย่าง:
use Kotchasan\Language;
// ไฟล์ภาษา: 'Welcome user' => 'ยินดีต้อนรับ %s'
echo Language::replace('Welcome user', 'John');
// Output: "ยินดีต้อนรับ John"
// ใช้ array สำหรับหลาย placeholder
// ไฟล์ภาษา: 'Order summary' => 'คุณสั่งซื้อ :item จำนวน :qty ชิ้น'
echo Language::replace('Order summary', [
':item' => 'iPhone',
':qty' => '2'
]);
// Output: "คุณสั่งซื้อ iPhone จำนวน 2 ชิ้น"
// Placeholder ที่เป็น language key
// ไฟล์ภาษา: 'items_count' => 'Found :count items'
echo Language::replace('items_count', [':count' => '10']);
// Output: "Found 10 items"ตัวอย่างการใช้งานจริง:
// Notification system
function notify($template, $data)
{
return Language::replace($template, $data);
}
// ใช้งาน
echo notify('User :name has :action the file :filename', [
':name' => 'John',
':action' => 'uploaded',
':filename' => 'document.pdf'
]);
// Output: "User John has uploaded the file document.pdf"sprintf()
Format string ด้วย sprintf
public static function sprintf(string $key, mixed ...$values): stringพารามิเตอร์:
$key- language key$values- ค่าที่จะ format
คืนค่า: ข้อความที่ format แล้ว
ตัวอย่าง:
use Kotchasan\Language;
// ไฟล์ภาษา: 'Found results' => 'พบ %d รายการ'
echo Language::sprintf('Found results', 15);
// Output: "พบ 15 รายการ"
// หลาย parameters
// ไฟล์ภาษา: 'Price' => 'ราคา %s บาท (%d ชิ้น)'
echo Language::sprintf('Price', '1,500', 5);
// Output: "ราคา 1,500 บาท (5 ชิ้น)"
// Format decimal
// ไฟล์ภาษา: 'Score' => 'คะแนน: %.2f'
echo Language::sprintf('Score', 95.5678);
// Output: "คะแนน: 95.57"trans()
แปลเนื้อหาที่มี {LNG_KEY} placeholders
public static function trans(string $content): stringพารามิเตอร์:
$content- เนื้อหาที่ต้องการแปล
คืนค่า: เนื้อหาที่แปลแล้ว
ตัวอย่าง:
use Kotchasan\Language;
$html = '<h1>{LNG_Welcome}</h1><p>{LNG_Hello}</p>';
echo Language::trans($html);
// Output: "<h1>ยินดีต้อนรับ</h1><p>สวัสดี</p>"
// ใช้กับ template
$template = '
<div class="alert">
<strong>{LNG_Attention}</strong>
<p>{LNG_Please complete the form}</p>
</div>
';
echo Language::trans($template);ตัวอย่างการใช้งานจริง:
// Email template
$emailTemplate = '
<html>
<body>
<h2>{LNG_Dear user}</h2>
<p>{LNG_Thank you for registration}</p>
<p>{LNG_Please verify your email}</p>
</body>
</html>
';
$translatedEmail = Language::trans($emailTemplate);
// ส่ง email ที่แปลแล้วตามภาษาปัจจุบันname()
ดึงชื่อภาษาปัจจุบัน
public static function name(): stringคืนค่า: ชื่อภาษา (เช่น 'th', 'en')
ตัวอย่าง:
use Kotchasan\Language;
$currentLang = Language::name();
echo "Current language: {$currentLang}";
// Output: "Current language: th"
// ใช้ในการสร้าง URL
$url = "/products?lang=" . Language::name();
// เลือก CSS ตามภาษา
$cssFile = "styles-" . Language::name() . ".css";
echo "<link rel='stylesheet' href='{$cssFile}'>";setName()
กำหนดภาษาที่จะใช้
public static function setName(string $language): stringพารามิเตอร์:
$language- รหัสภาษา (เช่น 'th', 'en')
คืนค่า: ชื่อภาษาที่ตั้งค่า
ตัวอย่าง:
use Kotchasan\Language;
// เปลี่ยนเป็นภาษาอังกฤษ
Language::setName('en');
echo Language::get('Hello');
// Output: "Hello" (ภาษาอังกฤษ)
// เปลี่ยนกลับเป็นภาษาไทย
Language::setName('th');
echo Language::get('Hello');
// Output: "สวัสดี" (ภาษาไทย)ตัวอย่างการใช้งานจริง:
// Language switcher
if (isset($_GET['lang'])) {
$allowedLangs = ['th', 'en', 'zh'];
$lang = $_GET['lang'];
if (in_array($lang, $allowedLangs)) {
Language::setName($lang);
// Redirect to remove lang parameter
header('Location: ' . $_SERVER['PHP_SELF']);
exit;
}
}installedLanguage()
ดึงรายการภาษาที่ติดตั้ง
public static function installedLanguage(): arrayคืนค่า: array ของรหัสภาษา
ตัวอย่าง:
use Kotchasan\Language;
$languages = Language::installedLanguage();
print_r($languages);
// Output: ['th' => 'th', 'en' => 'en', 'zh' => 'zh']
// สร้าง language selector
echo '<select name="language">';
foreach ($languages as $code) {
$selected = ($code === Language::name()) ? 'selected' : '';
echo "<option value='{$code}' {$selected}>{$code}</option>";
}
echo '</select>';installed()
โหลดข้อมูลภาษาทั้งหมดจากไฟล์
public static function installed(string $type): arrayพารามิเตอร์:
$type- ประเภทไฟล์ ('php' หรือ 'js')
คืนค่า: array ของข้อมูลภาษาทั้งหมด
ตัวอย่าง:
use Kotchasan\Language;
// โหลดไฟล์ PHP
$phpLangs = Language::installed('php');
foreach ($phpLangs as $item) {
echo "Key: {$item['key']}\n";
echo "TH: {$item['th']}\n";
echo "EN: {$item['en']}\n";
}
// โหลดไฟล์ JS
$jsLangs = Language::installed('js');save()
บันทึกไฟล์ภาษา
public static function save(array $languages, string $type): stringพารามิเตอร์:
$languages- ข้อมูลภาษาที่จะบันทึก$type- ประเภทไฟล์ ('php' หรือ 'js')
คืนค่า: ข้อความ error (ว่างถ้าสำเร็จ)
ตัวอย่าง:
use Kotchasan\Language;
// เตรียมข้อมูลภาษา
$languages = [
[
'id' => 0,
'key' => 'Hello',
'th' => 'สวัสดี',
'en' => 'Hello'
],
[
'id' => 1,
'key' => 'Goodbye',
'th' => 'ลาก่อน',
'en' => 'Goodbye'
]
];
// บันทึก
$error = Language::save($languages, 'php');
if (empty($error)) {
echo "บันทึกสำเร็จ";
} else {
echo "Error: {$error}";
}load()
โหลดไฟล์ภาษา
public static function load(string $lang): voidพารามิเตอร์:
$lang- รหัสภาษา
ตัวอย่าง:
use Kotchasan\Language;
// โหลดภาษาไทย
Language::load('th');
echo Language::get('Hello');
// Output: "สวัสดี"
// โหลดภาษาอังกฤษ
Language::load('en');
echo Language::get('Hello');
// Output: "Hello"languageFolder()
ดึง path ของโฟลเดอร์ภาษา
public static function languageFolder(): stringคืนค่า: path ของโฟลเดอร์ภาษา
ตัวอย่าง:
use Kotchasan\Language;
$folder = Language::languageFolder();
echo $folder;
// Output: "/var/www/html/language/"
// ตรวจสอบไฟล์ภาษา
$langFile = $folder . 'th.php';
if (file_exists($langFile)) {
echo "Thai language file exists";
}arrayKeyExists()
ตรวจสอบว่า language variable เป็น array และมี key ที่ระบุ
public static function arrayKeyExists(string $name, string $key): boolพารามิเตอร์:
$name- ชื่อ language variable$key- key ที่ต้องการตรวจสอบ
คืนค่า: true ถ้ามี, false ถ้าไม่มี
ตัวอย่าง:
use Kotchasan\Language;
// ตรวจสอบว่า MONTH_LONG[1] มีหรือไม่
if (Language::arrayKeyExists('MONTH_LONG', 1)) {
echo Language::get('MONTH_LONG', null, 1);
// Output: "มกราคม"
}
// ตรวจสอบก่อนใช้
if (Language::arrayKeyExists('COLORS', 'red')) {
$color = Language::get('COLORS', null, 'red');
} else {
$color = 'Unknown color';
}keyExists()
ตรวจสอบว่า language key มีอยู่ใน array ของภาษา
public static function keyExists(array $languages, string $key): intพารามิเตอร์:
$languages- array ของข้อมูลภาษา$key- key ที่ต้องการค้นหา
คืนค่า: index ของ key (หรือ -1 ถ้าไม่พบ)
ตัวอย่าง:
use Kotchasan\Language;
$languages = [
['id' => 0, 'key' => 'Hello', 'th' => 'สวัสดี'],
['id' => 1, 'key' => 'Goodbye', 'th' => 'ลาก่อน']
];
$index = Language::keyExists($languages, 'Hello');
echo $index;
// Output: 0
$index = Language::keyExists($languages, 'Unknown');
echo $index;
// Output: -1parse()
แปลภาษาจาก Theme parsing (callback สำหรับ preg_replace_callback)
public static function parse(array $match): stringพารามิเตอร์:
$match- array จาก regex match
คืนค่า: ค่าแปล
ตัวอย่าง:
use Kotchasan\Language;
// ใช้กับ preg_replace_callback
$content = '{LNG_Hello} {LNG_World}';
$translated = preg_replace_callback(
'/{LNG_([^}]+)}/',
[Language::class, 'parse'],
$content
);
echo $translated;
// Output: "สวัสดี World"ตัวอย่างการใช้งานครบวงจร
1. ระบบ Multi-language สมบูรณ์
use Kotchasan\Language;
class LanguageManager
{
/**
* เริ่มต้นระบบภาษา
*/
public static function init()
{
// ตรวจสอบ query parameter
if (isset($_GET['switch_lang'])) {
$lang = $_GET['switch_lang'];
if (in_array($lang, ['th', 'en', 'zh'])) {
Language::setName($lang);
header('Location: ' . strtok($_SERVER['REQUEST_URI'], '?'));
exit;
}
}
}
/**
* สร้าง language switcher HTML
*/
public static function createSwitcher()
{
$languages = [
'th' => 'ภาษาไทย',
'en' => 'English',
'zh' => '中文'
];
$current = Language::name();
$html = '<div class="language-switcher">';
foreach ($languages as $code => $name) {
$active = ($code === $current) ? 'active' : '';
$url = '?switch_lang=' . $code;
$html .= "<a href='{$url}' class='{$active}'>{$name}</a>";
}
$html .= '</div>';
return $html;
}
/**
* แปลข้อความพร้อม parameters
*/
public static function trans($key, $params = [])
{
$text = Language::get($key);
foreach ($params as $placeholder => $value) {
$text = str_replace($placeholder, $value, $text);
}
return $text;
}
}
// ใช้งาน
LanguageManager::init();
echo LanguageManager::createSwitcher();
echo LanguageManager::trans('Welcome :name', [':name' => 'John']);2. Form Validation Messages
use Kotchasan\Language;
class FormValidator
{
private $errors = [];
public function validate($data, $rules)
{
foreach ($rules as $field => $rule) {
if ($rule === 'required' && empty($data[$field])) {
$this->errors[$field] = Language::sprintf(
'field_required',
ucfirst($field)
);
}
if ($rule === 'email' && !filter_var($data[$field], FILTER_VALIDATE_EMAIL)) {
$this->errors[$field] = Language::get('invalid_email');
}
if (is_array($rule) && isset($rule['min'])) {
if (strlen($data[$field]) < $rule['min']) {
$this->errors[$field] = Language::sprintf(
'min_length',
ucfirst($field),
$rule['min']
);
}
}
}
return empty($this->errors);
}
public function getErrors()
{
return $this->errors;
}
public function getErrorsHtml()
{
$html = '<ul class="errors">';
foreach ($this->errors as $error) {
$html .= "<li>{$error}</li>";
}
$html .= '</ul>';
return $html;
}
}
// ไฟล์ภาษา:
// 'field_required' => 'กรุณากรอก %s'
// 'invalid_email' => 'อีเมลไม่ถูกต้อง'
// 'min_length' => '%s ต้องมีอย่างน้อย %d ตัวอักษร'3. Multi-language Content Management
use Kotchasan\Language;
class ContentManager
{
/**
* บันทึกเนื้อหาหลายภาษา
*/
public function saveContent($contentId, $multilangData)
{
$languages = Language::installedLanguage();
foreach ($languages as $lang) {
if (isset($multilangData[$lang])) {
- $this->saveContentForLanguage(
$contentId,
$lang,
$multilangData[$lang]
);
}
}
}
/**
* ดึงเนื้อหาตามภาษาปัจจุบัน
*/
public function getContent($contentId)
{
$lang = Language::name();
$content = $this->loadContentForLanguage($contentId, $lang);
// Fallback to default language if not found
if (empty($content)) {
$content = $this->loadContentForLanguage($contentId, 'th');
}
return $content;
}
/**
* ตรวจสอบว่ามีการแปลครบทุกภาษาหรือไม่
*/
public function hasAllTranslations($contentId)
{
$languages = Language::installedLanguage();
foreach ($languages as $lang) {
$content = $this->loadContentForLanguage($contentId, $lang);
if (empty($content)) {
return false;
}
}
return true;
}
private function saveContentForLanguage($id, $lang, $data)
{
// Implementation
}
private function loadContentForLanguage($id, $lang)
{
// Implementation
return [];
}
}4. Language Editor
use Kotchasan\Language;
class LanguageEditor
{
/**
* โหลดข้อมูลภาษาสำหรับแก้ไข
*/
public function load()
{
return Language::installed('php');
}
/**
* บันทึกการแก้ไข
*/
public function save($languages)
{
$error = Language::save($languages, 'php');
if (empty($error)) {
// บันทึก JS file ด้วย
Language::save($languages, 'js');
return ['success' => true];
}
return ['success' => false, 'message' => $error];
}
/**
* เพิ่ม language key ใหม่
*/
public function addKey($key, $translations)
{
$languages = $this->load();
$newItem = [
'id' => count($languages),
'key' => $key
];
foreach ($translations as $lang => $value) {
$newItem[$lang] = $value;
}
$languages[] = $newItem;
return $this->save($languages);
}
/**
* ลบ language key
*/
public function deleteKey($key)
{
$languages = $this->load();
$newLanguages = array_filter($languages, function($item) use ($key) {
return $item['key'] !== $key;
});
// Re-index
$indexed = array_values($newLanguages);
for ($i = 0; $i < count($indexed); $i++) {
$indexed[$i]['id'] = $i;
}
return $this->save($indexed);
}
}Best Practices
1. การจัดระเบียบไฟล์ภาษา
// ✅ ดี: จัดกลุ่มตามหมวดหมู่
<?php
return [
// Common
'Save' => 'บันทึก',
'Cancel' => 'ยกเลิก',
'Delete' => 'ลบ',
// User Management
'User not found' => 'ไม่พบผู้ใช้',
'Invalid password' => 'รหัสผ่านไม่ถูกต้อง',
// Products
'Product added' => 'เพิ่มสินค้าแล้ว',
'Out of stock' => 'สินค้าหมด'
];
// ✅ ดี: แยกไฟล์สำหรับส่วนใหญ่
// language/th/common.php
// language/th/users.php
// language/th/products.php2. การใช้ Placeholders
// ✅ ดี: ใช้ named placeholders
'Order total' => 'รวมทั้งหมด :amount บาท (:items รายการ)'
Language::replace('Order total', [
':amount' => '1,500',
':items' => '5'
]);
// ✅ ดี: ใช้ sprintf สำหรับตัวเลข
'Items count' => 'พบ %d รายการ'
Language::sprintf('Items count', 15);
// ❌ ไม่ดี: Hard-code ข้อความ
echo "พบ " . $count . " รายการ"; // ไม่มีทางแปลได้3. Fallback และ Default Values
// ✅ ดี: ระบุ default value
$message = Language::get('custom_message', 'Default message');
// ✅ ดี: Fallback ให้ภาษาอื่น
$text = Language::get('new_feature');
if ($text === 'new_feature') { // ไม่มีการแปล
Language::setName('en'); // ลองภาษาอื่น
$text = Language::get('new_feature');
Language::setName('th'); // กลับมาภาษาเดิม
}4. Performance
// ✅ ดี: Cache language data
class CachedLanguage
{
private static $cache = [];
public static function get($key, $default = null)
{
$lang = Language::name();
$cacheKey = $lang . '_' . $key;
if (!isset(self::$cache[$cacheKey])) {
self::$cache[$cacheKey] = Language::get($key, $default);
}
return self::$cache[$cacheKey];
}
}
// ✅ ดี: ดึงหลายค่าพร้อมกัน
$labels = Language::getItems([
'Save', 'Cancel', 'Delete', 'Edit'
]);
// ❌ ไม่ดี: เรียกทีละตัว
$save = Language::get('Save');
$cancel = Language::get('Cancel');
$delete = Language::get('Delete');สรุป
คลาส Language เป็นระบบจัดการภาษาที่:
- ✅ รองรับ Multi-language แบบเต็มรูปแบบ
- ✅ Auto-detect ภาษาจาก browser
- ✅ จัดการไฟล์ PHP และ JS
- ✅ Format string ได้หลากหลาย
- ✅ Editor ภาษาในระบบ
- 📁 Default folder:
language/ - 🌐 Default language: Thai (th)
เหมาะสำหรับ:
- เว็บไซต์หลายภาษา
- ระบบ CMS
- แอปพลิเคชันสากล
- ระบบที่ต้องการ user customization
ขนาดไฟล์: 506 บรรทัด
Public Methods: 16 methods
รองรับ: PHP และ JavaScript language files