Yii2 - 制作超链接以在不同语言之间切换

时间:2014-12-01 16:58:39

标签: php internationalization translation yii2

你好。

在Yii1.1中,我可以在siteController中执行操作,然后使用:Yii::app()->controller->createUrl('actionname', array('language'=>'new language to toggle'));

我可以在索引文件中创建带有CHTML的hiperlinks,当点击时,这些hiperlinks将网站的整个翻译从葡萄牙语改为其他语言,并且一直到处都是。

现在我开始使用Yii2并且控制器不再具有createUrl()了。其他方法也不这样做。我试过run,runAction,尝试使用Url :: class,没什么。

另外,在Yii2制作中<?php echo Html::a('Portuguese', Yii::$app->language = "pt"); ?> 什么都不做!!!单击时,超链接不会更改站点的语言。


有没有人知道如何在Yii 2中创建一个hiperlink或其他方式来完全切换整个网站语言。我需要有两个版本的本网站 - &gt;英语和葡萄牙语。

我需要像这样执行 - &gt; 点击英文单词时会翻译成英文,点击葡萄牙语时会将网站更改为葡萄牙语。

任何想法?

非常感谢提前。


对编码的新编辑 我在siteController中编写了这段代码,现在这些网站切换了语言,但只有在第二次鼠标点击时才会切换切换,内容会刷新。谁知道为什么?

以下是我的行动

public function beforeAction($action) {
    if (Yii::$app->session->has('lang')) {
        Yii::$app->language = Yii::$app->session->get('lang');
    } else {
        Yii::$app->language = 'us';
    }
    return parent::beforeAction($action);
}

public function actionLangus(){  
    Yii::$app->session->set('lang', 'us'); //or $_GET['lang']
    return $this->render('index');
}

  public function actionLangpt(){  
    Yii::$app->session->set('lang', 'pt'); //or $_GET['lang']
    return $this->render('index');
}

我选择了渲染('index'),因为重定向没有找到要显示的视图。

非常感谢您提供解决方案......

1 个答案:

答案 0 :(得分:2)

您可以在Yii2中执行以下操作:

\yii\helpers\Html::a('Change Language',\yii\helpers\Url::toRoute(['controller/action',['language'=>'NEW_LANGUAGE']]));
\yii\helpers\Html::a('Change Language',['controller/action',['language'=>'NEW_LANGUAGE']]);

或者:

use yii\helpers\Html;
use yii\helpers\Url;

Html::a('Change Language',Url::toRoute(['controller/action',['language'=>'NEW_LANGUAGE']]));
Html::a('Change Language',['controller/action',['language'=>'NEW_LANGUAGE']]);

然后,在你的行动中,你需要做:

//validation
Yii::$app->language= "NEW_LANGIAGE";
// store current language using state or cookie or database

<强>更新

行动代码:

//please put some validation on $_GET['lang']
Yii::$app->session->set('lang', 'us'); //or $_GET['lang']
$this->redirect('controller/action'); // redirecting user to somewhere

然后在你的控制器的beforeAction

public function beforeAction($action) {
    if (Yii::$app->session->has('lang')) {
        Yii::$app->language = Yii::$app->session->get('lang');
    } else {
        //or you may want to set lang session, this is just a sample
        Yii::$app->language = 'us';
    }
    return parent::beforeAction($action);
}

通过上面的代码,在每个操作中,它会检查语言是否在会话中设置。如果是,它会改变语言。如果没有,它会将语言设置为us作为默认值。在您的更改语言操作中,它只是将新语言设置为会话,该语言由$_GET请求提供。然后它将用户重定向到另一个页面。 请注意,这只是一个建议,其他人可能会使用不同的方法,例如创建引导程序组件,使用控制器init()方法,将lang存储到cookie或数据库中等等。 /强>