【问题标题】:Yii2 - Make hyperlink to toggle between languagesYii2 - 制作超链接以在语言之间切换
【发布时间】:2014-12-01 16:58:39
【问题描述】:

你好。

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

我可以在索引文件中使用 CHTML 创建超链接,当单击这些超链接时,会将网站的整个翻译从葡萄牙语更改为其他语言,等等。

现在我从 Yii2 开始,控制器不再有 createUrl()。其他方法也不能那样工作。我尝试了 run、runAction,尝试了 Url:: 类,但什么也没有。

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


有谁知道如何在 Yii 2 中创建一个超链接或其他方式来完全切换整个网站的语言。我需要这个网站的两个版本 -> 英语和葡萄牙语。

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

有什么想法吗??

非常感谢。


问题的新编辑 我在我的 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');
}

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

非常感谢您的解决方案...

【问题讨论】:

  • 你需要重定向,只需创建一个动作来渲染页面并重定向到它。
  • 那是因为它首先改变了会话值,其次它呈现了一个视图。但是我们在beforeAction() 中控制我们的语言。所以需要重定向才能看到第一次点击的结果。
  • 我尝试了多种重定向方式,但它总是在浏览器中显示此消息:在此服务器上找不到请求的 URL /index.php。
  • 你如何重定向?
  • 这样效果很好-> return $this->redirect('index.php?r=site%2Findex');

标签: php internationalization translation yii2


【解决方案1】:

您可以在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或数据库中等等。

【讨论】:

  • 现在我不知道该做什么了。我做了这个动作:
  • 公共函数 actionLang(){ Yii::$app->language="us"; // 使用状态或 cookie 或数据库存储当前语言 return $this->render('index'); }
  • 但显然这并不能验证任何东西。你能提供更多的线索来写下 actionLang() 吗??
  • @AndréCastro 不客气,亲爱的,请检查我的更新,值得注意的是我使用 session 来存储当前语言。
  • 很抱歉,这次更新只改变了我们或pt之间的地址栏,并没有改变网站语言。当我在登录表单中更改为 pt 模式语言时,它会继续以我们的语言发送消息。
猜你喜欢
  • 2018-02-09
  • 2021-06-24
  • 2012-04-04
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
相关资源
最近更新 更多