Yii 2:更改语言仅在刷新后工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yii 2:更改语言仅在刷新后工作相关的知识,希望对你有一定的参考价值。

我正在使用Yii 2框架来构建自定义应用程序。我的网站有英语和法语两种版本。字符串正在被翻译得很好,但是当我希望从UI实际更改语言时,我遇到了一个问题。

基本上我的网站有两个子域名,一个是en.domain.com,另一个是fr.domain.com。如果用户第一次访问其中一个域,我的代码会检测子域,将正确的语言设置为Yii并创建一个cookie来存储语言代码。如果用户已经拥有cookie并访问任何这些子域,则代码将使用cookie来设置语言。如果用户单击“FR”或“EN”来更改语言,JS脚本将删除cookie并重定向到其他子域(基本上与他第一次访问网站时的流程相同)。

现在,问题在于当用户第一次尝试访问网站的法语(翻译)版本时,它不起作用。执行代码,设置cookie(我可以看到它),但没有任何内容被翻译。但是,当我刷新页面时,它工作正常,一切都被翻译。然后,如果我在一个和另一个之间切换,它运作良好。这总是第一次(这是有问题的,因为当谷歌和用户要求法语版本时,它仍然是英文,直到他们重新加载)。

这是我的BaseController的代码片段(我的所有控制器都是从这一个扩展而来的,因此每次加载页面时都会执行此代码):

<?php
namespace appcontrollers;

use Yii;
use yiiwebController;

/**
 * Class BaseController
 * @package appcomponents
 */
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. 非常早地评估当前滞后设置,以便应用程序在处理响应时正确转换字符串(例如在Controller init或on beforeAction中)

以上是关于Yii 2:更改语言仅在刷新后工作的主要内容,如果未能解决你的问题,请参考以下文章

ListView 仅在刷新后显示项目

Yii2 GridView Triger仅在点击时过滤

如何修复 Firebase Auth 仅在刷新后工作?

当另一个片段中的数据发生更改时,如何刷新一个片段中的 RecyclerView

仅在按照意图进行时才更改片段(在这种情况下,他们实际上共享应用程序)

每 2 秒刷新一次从 JSON 响应中填充的 listView