【问题标题】:where to place Yii::app()->language = $_SESSION['lang '] to affect ALL Yii translations?在哪里放置 Yii::app()->language = $_SESSION['lang '] 以影响所有 Yii 翻译?
【发布时间】:2011-11-20 17:53:37
【问题描述】:

如果放在 protected/views/layouts/main.php 中,

 Yii::app()->language = $_SESSION['lang'];

不会影响模块(因为大部分内容是之前生成的)。 例如:Yii-user 模块。

Yii::app()->language = $lang; 放在 Yii 的包含流中以影响所有模块及其语言设置的最佳文件是什么?

【问题讨论】:

    标签: php module translation yii


    【解决方案1】:

    在 config/main.php 中读取 $_SESSION 时,我们必须记住,如果 Yii 处理会话,第二个 session_start() 将导致 PHP E_Notice

    Yii 可以处理会话: link, 并且默认情况下应该打开它们,但是在将 $_SESSION 代码添加到 config.php 时,我需要自己添加一个“手动” session_start()。

    【讨论】:

      【解决方案2】:

      我修改了protected/components/Controller.php,添加了

               function init()
      {
          parent::init();
      
          Yii::app()->language = $_SESSION['lang']; //or some more code;
      }
      

      效果很好。 我还尝试在同一目录中创建 MyController.php 并扩展Controller.php,它也可以工作,但它会减慢整个应用程序的速度(很可能加载器会努力尝试加载类,或者因为操作是每次调用该类时都执行;))。

      【讨论】:

        【解决方案3】:

        您可以设置一个“基本”控制器来扩展您的控制器(如果您还没有这样的设置)并将您的语言设置放在那里,如下所述:http://www.yiiframework.com/wiki/26/setting-and-maintaining-the-language-in-application-i18n/

        但是,如果您在常规 PHP 会话中确实有该值并且想要设置全局默认值,您还应该能够在主配置文件中设置它,例如:

        return array(
            'language' => $_SESSION['lang'],
            'name' => 'My Web Application',
            ... rest of your config settings...
        

        【讨论】:

        • 非常感谢!我正在做与您发布的第二个示例类似的事情(它工作得非常好),但认为向配置文件添加额外的代码和验证可能太多了;)。顺便说一句,据我所知,模块控制器也扩展了 Controller 类,因此必须在每个模块内的所有控制器文件中进行更改(?)
        • ...控制器扩展了 CController。所以我应该让Controller扩展MyController,对吧?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        相关资源
        最近更新 更多