问题
I want to change language using dropdown for English and Norwegian. Code is working fine but issue is it is working for only one time, whenever I refresh page language is change to English.
view page.
<select class="form-control user_language">
<option value="en">English</option>
<option value="nl">Norwegian</option>
</select>
JS Code.
<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>
Controller
public function actionChangelanguage()
{
if(isset($_REQUEST['language']) && $_REQUEST['language']!=null)
{
Yii::$app->language='nl';
echo Yii::$app->language;
die;
}
}
I have checked that it working for one time whenever I refresh page, language is change to English.
If I put Yii::$app->language='nl'; in every page it is working but I don't want to put this code in every page.
回答1:
Yii::$app->language is not persistent - if you set it in one request, it does not have any effect on further requests. If you want to make setting language persistent, you should save value in cookie or session:
Yii::$app->session->set('language', $_REQUEST['language'])
And add to your config:
'on beforeRequest' => function ($event) {
Yii::$app->language = Yii::$app->session->get('language', 'en');
},
This will change app language to value from session or 'en' if user does not chosen his language yet.
回答2:
In action Changelanguage do one more thing, save the selected language into db. Then make a controller with init function as like.
class BaseController extends \yii\web\Controller {
public function init() {
$language = Setting::getLanguage(); // function to get language saved in table setting
\Yii::$app->language = $language;
}
}
Then extend all your controllers from BaseController. Then once you change a language then it will last until your next update.
来源:https://stackoverflow.com/questions/49895120/change-language-in-yii2