หลังจากทำให้ yii รองรับหลายภาษาในเรื่อง ทำ yii 2 ให้รับหลายภาษา เรามาทำตัวเปลี่ยนภาษากันต่อ โดยเขียนเป็น Widget เพื่อที่สามารถนำไปใช้ได้สดวก
เป้าหมายคือ
- สามารถเปลี่ยนภาษาได้โดยใช้ตัวแปร get language=EN หรือภาษาอะไรก็ได้ จะเรียกใช้จาก link ธรรมดาก็ได้ หรือเลือกผ่าน widget ก็ได้
- จดจำได้ว่า user เคยเลือกภาษาอะไรไว้
สร้างไฟล์ common\components\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
... 'bootstrap' => [ ... 'languageSwitcher', ... ], ... ... 'components' => [ ... 'languageSwitcher' => [ 'class' => 'common\components\languageSwitcher', ], ... ], ...
เปิดไฟล์ frontend\views\layouts\main.php เพิ่ม
... use common\components\languageSwitcher; ... <?= languageSwitcher::Widget() ?> ...
ทดสอบโดยเปลี่ยนเป็นภาษาอื่นดู บริเวณที่เราใส่ code แปลภาษาไว้จะเปลี่ยนตามภาษาที่เลือกรึเปล่า