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 - 因此您的解决方案无效。
更好的解决方案是:
- 将当前语言存储到服务器会话中(避免完全使用cookie)
- 非常早地评估当前滞后设置,以便应用程序在处理响应时正确转换字符串(例如在Controller init或on beforeAction中)
以上是关于Yii 2:更改语言仅在刷新后工作的主要内容,如果未能解决你的问题,请参考以下文章
当另一个片段中的数据发生更改时,如何刷新一个片段中的 RecyclerView