หลังจากทำให้ yii รองรับหลายภาษาในเรื่อง ทำ yii 2 ให้รับหลายภาษา เรามาทำตัวเปลี่ยนภาษากันต่อ โดยเขียนเป็น Widget เพื่อที่สามารถนำไปใช้ได้สะดวก
เป้าหมายคือ
- สามารถเปลี่ยนภาษาได้โดยใช้ตัวแปร get language=EN หรือภาษาอะไรก็ได้ จะเรียกใช้จาก link ธรรมดาก็ได้ หรือเลือกผ่าน widget ก็ได้
- จดจำได้ว่า user เคยเลือกภาษาอะไรไว้
สร้างไฟล์ common\components\languageSwitcher.php เนื้อหาคือ
languageSwitcher.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ... 'bootstrap' => [ ... 'languageSwitcher' , ... ], ... ... 'components' => [ ... 'languageSwitcher' => [ 'class' => 'common\components\languageSwitcher' , ], ... ], ... |
เปิดไฟล์ frontend\views\layouts\main.php เพิ่ม
main.php
1 2 3 4 5 | ... use common\components\languageSwitcher; ... <?= languageSwitcher::Widget() ?> ... |
ทดสอบโดยเปลี่ยนเป็นภาษาอื่นดู บริเวณที่เราใส่ code แปลภาษาไว้จะเปลี่ยนตามภาษาที่เลือกรึเปล่า
About the author