Yii2. Тіл қосу. 1-бөлім

  • avatar
  • PHP / 15 қаңтар 2017, 18:46
  • 2259
Сайт жасауда көптілдік мүмкіндігі жиі қажет болады, әсіресе біздің Қазақстанда. Оны жүзеге асыру жолдары да көп. Бірақ осы мақалада мен Yii2 framework-та жасалған сайтында көптілділікті жүзеге асыру жолын көрсетпекшімін. Бұл менің қолданатын әдісім, қате, кем тұртары болса айта кетерсіз, біліп жүрейін.

Yii2-де тіл Yii::$app->language компонентінде сақталып тұрады. Үнсіз келісім бойынша ол 'en'-ге тең, яғни ағылшын тілінде тұр. Оны өзгерту үшін config->web.php (әрі қарай негізгі-конфигурация) файлында конфигурацияны өзгерту керек.
Мысалы
$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'language' => 'ru',

Жоғарыдағы кодта сайт тілін 'ru' деп өзгерттік, яғни орыс тіліне. Бұл статіқалық әдіс. Оны сайт администраторы ғана өзгерте алады, қолданушы өзгерте алмайды. Қолданушы тек сайт администраторы көрсеткен тілде ғана сайтты көре алады.

Динамиқалық түрде ауыстыру үшін проектте келесі әрекеттерді орындау керек.

— Тілдер тізімі. Фоматын және қай жерде сақталып тұратынын анықтау
— UrlManager-ді LangUrlManager деп өзгерту
— LangManager іске қосу

Yii2 сілтемелерді тек қана Html::a() және Url::to() арқылы құрастыру керек.

Тілдер тізімі.

Мына проекте тілдерді config->params.php де сақтап қойдым.
3 тіл қосамын: қазақша, ағылшынша және орысша. Үнсіз келісім бойынша сайттың тілі қазақша. Форматы мынадай.
    'defaultLang' => 'kz',
    
    'langs' =>[
    	'en' => 'English',
    	'kz' => 'Қазақша',
    	'ru' => 'Русский',
    ],

Әрине тілдерді қалай, қайда сақту ол әр сайт құрастырушының өз шешімі, базада сақтайма, бөлек файлда ма, қатып қалған стандарт жоқ (бар болса сілтемесін жазып қойыңыз комментте). Тілдердің форматы басқа болуы да мүмкін. Бөлек класс жаза ма, массивке тағы қосымша ақпарат қосама, ол да өз еркі.

UrlManager-ді LangUrlManager-ге өзгерту

немесе барлық сілтемеге бастапқы таңдалған тілді қосу.

Yii2 ішкі құрылысын толық білемін деп айта алмайм, барлық ақпараттар форумдардан, API, документациядан тірнектеп жинағаным. Түсінгенім бойнша сілтеме құрастыру үшін UrlManager компоненті қолданылады. Әр сілтемеге таңдалған тілді қосу үшін UrlManager компонентін өз ыңғайымызға қарай өзгертеміз. UrlManager дәл өзін өзгертпейміз, себебі ол Yii2-ның ядросына тұр, ал ядроны өзгерткен дұрыс емес. UrlManager-ды LangUrlManager деп кеңейтеміз, әрі қарай жұмыс LangUrlManager арқылы жүреді. LangUrlManager.php файлы basic\components папкасында орналасады. Ішіндегі коды былай:
<?php 
namespace app\components;
use yii\web\UrlManager;
use Yii;

class LangUrlManager extends UrlManager
{
    public function createUrl($params)
    {
        $params['language']=Yii::$app->language;
        return parent::createUrl($params);
    }
}
?>


LangUrlManager-ге негізгі-конфигурациясына енгізу керек
 'urlManager' => 
        [
            'class' => 'app\components\LangUrlManager',


және UrlManager-дің ережелерін өзгерту керек, толық нұсқасы
'urlManager' => 
        [
            'class' => 'app\components\LangUrlManager',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => 
            [                 
                '/' => 'site/index',
                '<language>/w?'=>'site/index',
                '<language>'=>'site/index',
                 '<language>/<alias:login|logout>' => 'site/<alias>',
              
                '<language:\w+>/<controller>' => '<controller>',
                '<language:\w+>/<controller>/<action>' => '<controller>/<action>',
            ],
        ],

осы әрекеттерден кейін барлық сілтеме алдына таңдалған тіл қосылып тұрады. Ол сілтмелер әріне Html және Url арқылы құрылған болу керек. Мысалы:

Html::a('text', ['/company/view','id' => $id]);
<a href="<?= Url::to(['/company/view','id' => $id]) ?>">Компания</a>

ал былай жазылған сілтемерге тіл қосылмайды
<a href="/company?id=<?= $id ?>">Компания</a>


Тілді таңдау

Келесі компонентіміз ол тіл дұрыс немесе қате екенін анықтайды және тіл таңдалмаған кезде, тілді үнсіз келісім бойынша таңдайды. Ол компоненттің аты LangManager.

LangManager.php basic\components папкасында орналасады.
Файлдың коды
<?php

namespace app\components;

use yii\base\Component;
use yii\base\BootstrapInterface;
use Yii;

class LangManager extends Component implements BootstrapInterface
{
    public function bootstrap($app)
    {
        $request = $app->request;

        // тілдер тізімін тексереді
        $lang_array = array_keys($app->params['langs']);

        $default_lang = $app->params['defaultLang'];
        if (!isset($lang_array) or !isset($default_lang))
        {
        	echo "Сайт тілі анықталмаған!";
        	die();
        }

        // қолданушы сұрауын "парсить ету"
        $parseResult = Yii::$app->urlManager->parseRequest($app->request);
        
        // дебаг қолданғанда тілге аударылмайды
        if (isset($parseResult[0]) && $parseResult[0] == 'debug'){
            return true;
        }
        if (isset($parseResult[1]['language']) && $parseResult[1]['language'] == 'debug'){
            return false;
        }

        if (isset($parseResult[1]['language']))
        {
        	$site_lang = $parseResult[1]['language'];
        	
        	if (in_array($site_lang, $lang_array))
        	{
        		$app->language = $site_lang;
        	}else
        	{
        		// үнсіз келісілген тілге аударады
       			return $app->getResponse()->redirect("/".$default_lang."/");
        	}
        }else
        {
        	// үнсіз келісілген тілге аударады
       		return $app->getResponse()->redirect("/".$default_lang."/");        	
        }
        
    }
}

Проектің толық нұсқасы мына жерде.

  • +4
0 пікір
Тек тіркелген қолданушылар ғана пікір қалдыра алады.