Tag Archive internationalization

Byphunsanit

YII 2 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;
...
<?= languageSwitcher::Widget() ?>
...

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