หมวดหมู่: Yii

YII2: Widget เปลี่ยนภาษาYII2: Widget เปลี่ยนภาษา

หลังจากทำให้ yii รองรับหลายภาษาในเรื่อง ทำ yii 2 ให้รับหลายภาษา เรามาทำตัวเปลี่ยนภาษากันต่อ โดยเขียนเป็น Widget เพื่อที่สามารถนำไปใช้ได้สะดวก

เป้าหมายคือ

  1. สามารถเปลี่ยนภาษาได้โดยใช้ตัวแปร get language=EN หรือภาษาอะไรก็ได้ จะเรียกใช้จาก link ธรรมดาก็ได้ หรือเลือกผ่าน widget ก็ได้
  2. จดจำได้ว่า 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;
...
&lt;?= languageSwitcher::Widget () ?>
...

ทดสอบโดยเปลี่ยนเป็นภาษาอื่นดู บริเวณที่เราใส่ code แปลภาษาไว้จะเปลี่ยนตามภาษาที่เลือกรึเปล่า