我想使用英语和挪威语的下拉菜单更改语言。 代码工作正常,但问题是它只工作一次,每当我刷新页面语言改为英语。
查看页面。
<div class="header">
<a href="#" class="link"></a>
</div>
.header {
position: relative;
}
.header .link {
position: absolute;
right: 0;
top: 0;
height: 100%;
width: 100px;
z-index: 2;
}
JS代码。
<select class="form-control user_language">
<option value="en">English</option>
<option value="nl">Norwegian</option>
</select>
控制器
<script>
$(".user_language").change(function(){
language=this.value;
$.ajax({
url:'<?=Yii::$app->request->baseUrl?>/site/changelanguage',
type:"GET",
data:{language:language},
success:function(result){
console.log(result);
location.reload();
},
});
});
</script>
每当我刷新页面时,我都检查过它工作了一次,语言就变成了英语。
如果我在每个页面中放置public function actionChangelanguage()
{
if(isset($_REQUEST['language']) && $_REQUEST['language']!=null)
{
Yii::$app->language='nl';
echo Yii::$app->language;
die;
}
}
它正在运行,但我不想将此代码放在每个页面中。
答案 0 :(得分:3)
Yii::$app->language
不是持久性的 - 如果您在一个请求中设置它,它对进一步的请求没有任何影响。如果要使设置语言保持持久,则应该在cookie或会话中保存值:
Yii::$app->session->set('language', $_REQUEST['language'])
并添加到您的配置中:
'on beforeRequest' => function ($event) {
Yii::$app->language = Yii::$app->session->get('language', 'en');
},
如果用户尚未选择他的语言,这会将会话语言更改为会话值或“en”。
答案 1 :(得分:0)
在操作 Changelanguage
中再做一件事,将所选语言保存到db中。然后使用init函数创建一个控制器。
class BaseController extends \yii\web\Controller {
public function init() {
$language = Setting::getLanguage(); // function to get language saved in table setting
\Yii::$app->language = $language;
}
}
然后从 BaseController 扩展所有控制器。然后,一旦您更改了语言,它将持续到您下次更新。
答案 2 :(得分:0)
您还可以在启动脚本@web/index.php
中添加语言选择:
require(__DIR__ . '/../events/LanguageEvent.php');
并在@app/events/LanguageEvent.php
中定义语言选择器:
use yii\base\Event;
use yii\base\Application;
Event::on(Application::class,
'beforeRequest',
function ($event) {
if (!Yii::$app->session->has('language')) {
$browserLang = \Yii::$app->request->getPreferredLanguage(['de-DE']);
Yii::$app->session->set("language",$browserLang);
}
Yii::$app->language = Yii::$app->session->get('language');
Yii::trace("test=".Yii::t("app","Remove"));
}
);