Kotchasan Framework Documentation

Kotchasan Framework Documentation

คลาส Language - ระบบจัดการภาษา

TH 05 Feb 2026 06:23

คลาส 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: -1

parse()

แปลภาษาจาก 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.php

2. การใช้ 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