我正在使用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, '/');
}
}
任何想法会导致这种奇怪的行为吗?谢谢
答案 0 :(得分:0)
收到服务器的第一响应后,将在浏览器中创建cookie。因此,它永远不会在首次请求时起作用-从技术上讲是不可能的。假设用户已启用cookie,它将自第二个请求开始工作。请注意,浏览器可能禁用了cookie-因此您的解决方案将无法正常工作。
更好的解决方案是: