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 - 因此您的解决方案将不起作用。
更好的解决方案是:
- 将当前语言存储到服务器会话中(完全避免使用 cookie)
- 尽早评估当前滞后设置,以便应用程序在处理响应时正确翻译字符串(例如在控制器初始化中,或 on beforeAction)
我正在使用 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 - 因此您的解决方案将不起作用。
更好的解决方案是:
- 将当前语言存储到服务器会话中(完全避免使用 cookie)
- 尽早评估当前滞后设置,以便应用程序在处理响应时正确翻译字符串(例如在控制器初始化中,或 on beforeAction)