更改Yii2中的语言

时间:2018-04-18 08:45:40

标签: yii2

我想使用英语和挪威语的下拉菜单更改语言。 代码工作正常,但问题是它只工作一次,每当我刷新页面语言改为英语。

查看页面。

<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; } } 它正在运行,但我不想将此代码放在每个页面中。

3 个答案:

答案 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"));
    }
);