หลังจากทำให้ yii รองรับหลายภาษาในเรื่อง ทำ yii 2 ให้รับหลายภาษา เรามาทำตัวเปลี่ยนภาษากันต่อ โดยเขียนเป็น Widget เพื่อที่สามารถนำไปใช้ได้สะดวก
เป้าหมายคือ
- สามารถเปลี่ยนภาษาได้โดยใช้ตัวแปร get language=EN หรือภาษาอะไรก็ได้ จะเรียกใช้จาก link ธรรมดาก็ได้ หรือเลือกผ่าน widget ก็ได้
- จดจำได้ว่า user เคยเลือกภาษาอะไรไว้
สร้างไฟล์ common\components\languageSwitcher.php เนื้อหาคือ
languageSwitcher.php
<?php
/*
author :: Pitt Phunsanit
website :: https://pitt.plusmagi.com
change language by get language=EN, language=TH,...
or select on this widget
*/
namespace common\components;
use Yii;
use yii\base\Widget;
use yii\bootstrap\ButtonDropdown;
use yii\helpers\Url;
use yii\web\Cookie;
class languageSwitcher extends Widget
{
/* ใส่ภาษาของคุณที่นี่ */
public $languages = [
'en' => 'English (United States) ',
'jp' => 'Japanese (Japan) ',
'th' => 'Thai (Thailand) ',
];
public function init () {
if (php_sapi_name () === 'cli') {
return true;
}
parent::init () ;
$languageNew = Yii::$app->request->get ('language') ;
$cookies = Yii::$app->request->cookies;
if ($languageNew) {
if (isset ($this->languages[$languageNew])) {
Yii::$app->language = $languageNew;
Yii::$app->response->cookies->add (new \yii\web\Cookie ([
'name' => 'language',
'value' => $languageNew,
])) ;
}
}
elseif ($cookies->has ('language')) {
Yii::$app->language = $cookies->getValue ('language') ;
}
}
public function run () {
$languages = $this->languages;
$current = $languages[Yii::$app->language];
unset ($languages[Yii::$app->language]) ;
$items = [];
foreach ($languages as $code => $language) {
$temp = [];
$temp['label'] = $language;
$temp['url'] = Url::current (['language' => $code]) ;
array_push ($items, $temp) ;
}
echo ButtonDropdown::widget ([
'label' => $current,
'dropdown' => [
'items' => $items,
],
]) ;
}
คำสั่ง php_sapi_name () มีไว้เพื่่อตรวจสอบไม่ให้ทำงานถ้าโดนเรียกใช้ใน console เพราะว่า class cookie ของ console จะใช้ต่างจากปกติ
ไปเปิดไฟล์ common\config\main.php เพิ่ม code
main.php
...
'bootstrap' => [
...
'languageSwitcher',
...
],
...
...
'components' => [
...
'languageSwitcher' => [
'class' => 'common\components\languageSwitcher',
],
...
],
...
เปิดไฟล์ frontend\views\layouts\main.php เพิ่ม
main.php
...
use common\components\languageSwitcher;
...
<?= languageSwitcher::Widget () ?>
...
ทดสอบโดยเปลี่ยนเป็นภาษาอื่นดู บริเวณที่เราใส่ code แปลภาษาไว้จะเปลี่ยนตามภาษาที่เลือกรึเปล่า