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

เป้าหมายคือ

  1. สามารถเปลี่ยนภาษาได้โดยใช้ตัวแปร get language=EN หรือภาษาอะไรก็ได้ จะเรียกใช้จาก link ธรรมดาก็ได้ หรือเลือกผ่าน widget ก็ได้
  2. จดจำได้ว่า user เคยเลือกภาษาอะไรไว้

สร้างไฟล์ common\components\languageSwitcher.php เนื่้อหาคือ[code language=”php” title=”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,
],
]);
}
[/code]คำสั่ง php_sapi_name() มีไว้เพื่่อตรวจสอบไม่ให้ทำงานถ้าโดนเรียกใช้ใน console เพราะว่า class cookie ของ console จะใช้ต่างจากปกติ

ไปเปิดไฟล์ common\config\main.php เพิ่ม code[code language=”php” title=”main.php”]

‘bootstrap’ => [

‘languageSwitcher’,

],


‘components’ => [

‘languageSwitcher’ => [
‘class’ => ‘common\components\languageSwitcher’,
],

],

[/code]

เปิดไฟล์ frontend\views\layouts\main.php เพิ่ม[code language=”php” title=”main.php”]

use common\components\languageSwitcher;

<?= languageSwitcher::Widget() ?>

[/code]

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