Yii 2:仅在刷新后才能更改语言

时间:2018-09-01 14:14:46

标签: php cookies yii yii2

我正在使用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, '/');
    }


}

任何想法会导致这种奇怪的行为吗?谢谢

1 个答案:

答案 0 :(得分:0)

收到服务器的第一响应后,将在浏览器中创建cookie。因此,它永远不会在首次请求时起作用-从技术上讲是不可能的。假设用户已启用cookie,它将自第二个请求开始工作。请注意,浏览器可能禁用了cookie-因此您的解决方案将无法正常工作。

更好的解决方案是:

  1. 将当前语言存储到服务器会话中(完全避免使用cookie)
  2. 非常早地评估当前滞后设置,以便应用程序在处理响应时(例如在Controller init或on beforeAction中)正确转换字符串