Yii 2:更改语言仅在刷新后有效

Yii 2 : Changing language only working after refresh

我正在使用 Yii 2 框架构建自定义应用程序。我的网站有英文和法文两种版本。字符串翻译得很好,但我 运行 遇到了一个问题,因为我想实际更改 UI.

的语言

基本上我的网站有两个子域,一个是 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, '/');
    }


}

知道是什么导致了这种奇怪的行为吗?谢谢

Cookie 将在浏览器 收到来自服务器的第一个响应 后创建。所以它永远不会在第一次请求时工作——技术上是不可能的。假设用户启用了 cookie,它将在第二次请求后工作。请注意,浏览器可能已禁用 cookie - 因此您的解决方案将不起作用。

更好的解决方案是:

  1. 将当前语言存储到服务器会话中(完全避免使用 cookie)
  2. 尽早评估当前滞后设置,以便应用程序在处理响应时正确翻译字符串(例如在控制器初始化中,或 on beforeAction