วัน: 15 ธันวาคม 2012

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 = [
 &apos;en&apos; => &apos;English (United States) &apos;,
 &apos;jp&apos; => &apos;Japanese (Japan) &apos;,
 &apos;th&apos; => &apos;Thai (Thailand) &apos;,
 ];
 
 public function init () {
 if (php_sapi_name () === &apos;cli&apos;) {
 return true;
 }
 
 parent::init () ;
 $languageNew = Yii::$app->request->get (&apos;language&apos;) ;
 $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 ([
 &apos;name&apos; => &apos;language&apos;,
 &apos;value&apos; => $languageNew,
 ])) ;
 }
 }
 elseif ($cookies->has (&apos;language&apos;)) {
 Yii::$app->language = $cookies->getValue (&apos;language&apos;) ;
 }
 
 }
 
 public function run () {
 $languages = $this->languages;
 $current = $languages[Yii::$app->language];
 unset ($languages[Yii::$app->language]) ;
 
 $items = [];
 foreach ($languages as $code => $language) {
 $temp = [];
 $temp[&apos;label&apos;] = $language;
 $temp[&apos;url&apos;] = Url::current ([&apos;language&apos; => $code]) ;
 array_push ($items, $temp) ;
 }
 
 echo ButtonDropdown::widget ([
 &apos;label&apos; => $current,
 &apos;dropdown&apos; => [
 &apos;items&apos; => $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 แปลภาษาไว้จะเปลี่ยนตามภาษาที่เลือกรึเปล่า