ต่อจาก ทำ yii 2 ให้รับหลายภาษา หลังจากใส่คำแปรให้ text ต่างๆ แล้วเราจะแยกเก็บ database ภาษาต่างๆ ออกจากกัน คนไทยก็อยากจะอ่านภาษาไทย คนจีนก็อ่านเป็นแต่ภาษาตัวเอง
- ติดตั้ง OmgDef/yii2-multilingual-behavior โดยแก้ composer.json ใส่[code language=”php”]
"require": {
…
"omgdef/yii2-multilingual-behavior": "~2.0"
…
},
[/code]run composer update - สร้างตาราง โดยแยกตารางหลักที่เก็บ id และฟิลย์ที่ใช้ร่วมกัน อีกตารางเก็บ field ที่แยกตามภาษาต่างๆเช่น content, title[code language=”sql”]
CREATE TABLE IF NOT EXISTS `post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`enabled` tinyint(1) NOT NULL DEFAULT ‘1’,
`log_created` datetime NOT NULL,
`log_updated` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `postLang` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`post_id` int(11) NOT NULL,
`language` varchar(6) NOT NULL,
`title` varchar(255) NOT NULL,
`content` TEXT NOT NULL,
PRIMARY KEY (`id`),
KEY `post_id` (`post_id`),
KEY `language` (`language`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;ALTER TABLE `postLang`
ADD CONSTRAINT `postlang_ibfk_1` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
[/code]อย่าลืมใส่ id และ language มันจำเป็นต้องใช้ เก็บว่า record นี้เป็นภาษาอะไร - สร้าง model โดยใช้ gii ตามปกติทั้ง 2 ตาราง
- เปิด model ของตารางหลัก ตัวอย่างคือ ..\model\Post.php ใส่ code[code language=”php”]
…
use omgdef\multilingual\MultilingualBehavior;
use omgdef\multilingual\MultilingualQuery;
…
public static function find()
{
$q = new MultilingualQuery(get_called_class());
$q->multilingual();
return $q;
}public function behaviors()
{
return [
‘ml’ => [
‘class’ => MultilingualBehavior::className(),
‘languages’ => [
‘en’,
‘jp’,
‘th’,
],
‘defaultLanguage’ => ‘en’,
‘langForeignKey’ => ‘post_id’,
‘tableName’ => "{{%postlang}}",
‘attributes’ => [
‘content’,
‘title’,
]
]
];
}
…
[/code]- languages ภาษาทั้งหมดที่ใช้ได้
- defaultLanguage ภาษาเริ่มต้น
- langForeignKey ใส่ฟิลย์ที่ เชื่อมทั้ง 2 ตารางไว้ด้วยกัน (primary key)
- tableName ชื่อตารางที่เก็บส่วนแปลภาษาไว้
- attributes ฟิลย์ทั้งหมด ที่ต้องการทำระบบแปลภาษา
- เปิด ไฟล์ _form.php ที่เราใช้กับโมเดลนี้ขึ้นมา ใส่[code language=”php”]
…
<?= $form->field($model, ‘title_jp’)->textInput([‘maxlength’ => 255]) ?>
<?= $form->field($model, ‘title_en’)->textInput([‘maxlength’ => 255]) ?>
<?= $form->field($model, ‘title_th’)->textInput([‘maxlength’ => 255]) ?>
…
[/code] - แก้จุดอื่นๆ อย่าง view index.php ตามรูปแบบ ฟิลย์_ตัวย่อภาษา
ทดลอง save ดู ตารางใน database จะเก็บข้อมูลไว้
About the author