ต่อจาก ทำ yii 2 ให้รับหลายภาษา หลังจากใส่คำแปรให้ text ต่างๆ แล้วเราจะแยกเก็บ database ภาษาต่างๆ ออกจากกัน คนไทยก็อยากจะอ่านภาษาไทย คนจีนก็อ่านเป็นแต่ภาษาตัวเอง
- ติดตั้ง OmgDef/yii2-multilingual-behavior โดยแก้ composer.json ใส่
12345
"require"
: {
...
"omgdef/yii2-multilingual-behavior"
:
"~2.0"
...
},
run composer update
- สร้างตาราง โดยแยกตารางหลักที่เก็บ id และฟิลย์ที่ใช้ร่วมกัน อีกตารางเก็บ field ที่แยกตามภาษาต่างๆเช่น content, title
123456789101112131415161718192021
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
;
อย่าลืมใส่ id และ language มันจำเป็นต้องใช้ เก็บว่า record นี้เป็นภาษาอะไร
- สร้าง model โดยใช้ gii ตามปกติทั้ง 2 ตาราง
- เปิด model ของตารางหลัก ตัวอย่างคือ ..\model\Post.php ใส่ code
1234567891011121314151617181920212223242526272829303132
...
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'
,
]
]
];
}
...
- languages ภาษาทั้งหมดที่ใช้ได้
- defaultLanguage ภาษาเริ่มต้น
- langForeignKey ใส่ฟิลย์ที่ เชื่อมทั้ง 2 ตารางไว้ด้วยกัน (primary key)
- tableName ชื่อตารางที่เก็บส่วนแปลภาษาไว้
- attributes ฟิลย์ทั้งหมด ที่ต้องการทำระบบแปลภาษา
- เปิด ไฟล์ _form.php ที่เราใช้กับโมเดลนี้ขึ้นมา ใส่
12345
...
<?=
$form
->field(
$model
,
'title_jp'
)->textInput([
'maxlength'
=> 255]) ?>
<?=
$form
->field(
$model
,
'title_en'
)->textInput([
'maxlength'
=> 255]) ?>
<?=
$form
->field(
$model
,
'title_th'
)->textInput([
'maxlength'
=> 255]) ?>
...
- แก้จุดอื่นๆ อย่าง view index.php ตามรูปแบบ ฟิลย์_ตัวย่อภาษา
ทดลอง save ดู ตารางใน database จะเก็บข้อมูลไว้