Оставаться на том урле при смене языка, в случае если урлы абсолютно разные

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Ostry
Сообщения: 16
Зарегистрирован: 2018.03.04, 21:48

Оставаться на том урле при смене языка, в случае если урлы абсолютно разные

Сообщение Ostry »

Добрый день.

Еще один глупый вопрос от новичка, но не знаю как быть, использую https://klisl.com/multilingual_Yii2.html, урлы формируются из слагов, которые мы задаем в админке, есть два языка, в одно урл будет : https://domen/ua/ris/kurka/ в другой версии сайта https://domen/ris/kuritsa/, как сделать так , чтобы при переключении весрий оставаться на той же странице, где было осуществленно переключение. Если бы урлы были абсолютно одинаковы , вопросов бы не возникло...
uEhlO4a
Сообщения: 70
Зарегистрирован: 2017.08.12, 19:19

Re: Оставаться на том урле при смене языка, в случае если урлы абсолютно разные

Сообщение uEhlO4a »

пиши в сессию/печенье версию и т.д.
потом проверять в common\components\UrlManager.php
по сути, будет срабатывать сессия поверх адресной строки
но, мне кажется это приведет к проблемам
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Оставаться на том урле при смене языка, в случае если урлы абсолютно разные

Сообщение masson »

Код: Выделить всё

<?php
namespace frontend\controllers;

use common\components\Languages;
use Yii;
use yii\web\Controller;
use yii\web\Cookie;

class BaseController extends Controller
{
    public function __construct($id, $module = null)
    {
        // Устанавливаем language если он есть либо в GET, либо в SESSION, либо в COOKIE
        if ($short_lang = Yii::$app->request->get('app_language')) {
            $full_lang = Languages::getLanguage($short_lang);
            Yii::$app->language = $full_lang;
            Yii::$app->session->set('app_language', $full_lang);
            Yii::$app->response->cookies->add(new Cookie([
                'name' => 'app_language',
                'value' => $full_lang,
                'expire' => time() + (60 * 60 * 24 * 365), // (1 year)
            ]));
        } elseif ($full_lang = Yii::$app->request->cookies->getValue('app_language')) {
            Yii::$app->language = $full_lang;
        } elseif ($full_lang = Yii::$app->session->get('app_language')) {
            Yii::$app->language = $full_lang;
        } 
        // Иначе остается то что в конфиге
        
        parent::__construct($id, $module);
    }

Код: Выделить всё

class Languages
{
    public static function getLanguage($short_code)
    {
        $langs = [
            'ru' => 'ru-RU',
            'en' => 'en-GB',
            'zh' => 'zh-CN',
//            'de' => 'de-DE',
//            'fr' => 'fr-FR',
//            'es' => 'es-ES',
//            'it' => 'it-IT',
        ];

        if (!isset($langs[$short_code])) {
            throw new InvalidParamException('Не определен язык в справочнике ' . get_called_class());
        }

        return $langs[$short_code];
    }

Код: Выделить всё

class UrlManager extends \yii\web\UrlManager
{
    public function createUrl($params)
    {
        if (empty($params['app_language'])) {
            if ($full_lang = Yii::$app->session->get('app_language')) {
            } elseif ($full_lang = Yii::$app->request->cookies->getValue('app_language')) {
            } else {
                $full_lang = substr(Yii::$app->language, 0, 2);
            }

            $params['app_language'] = $full_lang;
        }

        return parent::createUrl($params);
    }
Ответить