Yii 2: изменение языка работает только после обновления - PullRequest
0 голосов
/ 01 сентября 2018

Я использую инфраструктуру Yii 2 для создания собственного приложения. Мой сайт доступен на английском и французском языках. Строки переводятся просто отлично, но у меня возникает проблема, когда я действительно хочу изменить язык из пользовательского интерфейса.

В основном мой веб-сайт состоит из двух поддоменов, один из которых en.domain.com, а другой - fr.domain.com. Если пользователь получает доступ к одному из этих доменов в первый раз, мой код обнаруживает поддомен, устанавливает правильный язык в Yii и создает cookie для хранения кода языка. Если у пользователя уже есть файл cookie и доступ к любому из этих поддоменов, код будет использовать файл cookie для установки языка. Если пользователь нажимает «FR» или «EN», чтобы изменить язык, JS-скрипт удаляет cookie-файл и перенаправляет его на другой поддомен (в основном тот же поток, что и при первом посещении веб-сайта).

Теперь проблема в том, что когда пользователь пытается получить доступ к французской (переведенной) версии веб-сайта в первый раз , он не работает. Код выполняется, cookie установлен (я его вижу), но ничего не переведено. Однако, когда я обновляю страницу, она работает просто отлично, и все переводится. Тогда, если я переключаюсь между одним и другим, это работает хорошо. Это всегда в первый раз (что проблематично, потому что, когда Google и пользователи запрашивают французскую версию, она все еще на английском, пока они не перезагрузятся).

Вот фрагмент кода моего BaseController (все мои контроллеры простираются от этого, поэтому этот код выполняется при каждой загрузке страницы):

<?php
namespace app\controllers;

use Yii;
use yii\web\Controller;

/**
 * Class BaseController
 * @package app\components
 */
class BaseController extends Controller
{
    public function init() {
        parent::init();

        // If no cookie
        if (!isset($_COOKIE["language"])) {

            $parsedUrl = parse_url(Yii::$app->HelperComponent->getUrl());
            $host = explode('.', $parsedUrl['host']);
            $subdomain = $host[0];

            if ($subdomain == 'fr')
                $code = "fr-CA";
            else
                $code = "en-US";
        }
        else {
            $code = $_COOKIE["language"];
        }

        Yii::$app->language = $code;
        setcookie("language", $code, time() + 31556926, '/');
    }


}

Есть идеи, что может вызвать это странное поведение? Спасибо

1 Ответ

0 голосов
/ 01 сентября 2018

Файл cookie будет создан в браузере после получения первого ответа с сервера. Так что он никогда не будет работать по первому требованию - технически невозможно. Он будет работать со второго запроса при условии, что пользователь включил файлы cookie. Обратите внимание, что в браузерах отключены файлы cookie, поэтому ваше решение не будет работать.

Лучшее решение будет:

  1. сохранить текущий язык в сеансе сервера (избегать полного использования куки)
  2. оцените текущую настройку задержки очень рано, поэтому приложение будет правильно переводить строки при обработке ответа (например, в init контроллера, или on beforeAction )
...