【问题标题】:Design Pattern for passing a translation object around? For PHP传递翻译对象的设计模式?对于 PHP
【发布时间】:2010-12-04 17:45:53
【问题描述】:

我正在更新一个基于 Zend MVC 框架的多语言 php Web 应用程序,并且我正在尝试找出将翻译对象传递给不同类/层的最佳方法。

我的大部分翻译都是在视图级别完成的,但在少数情况下,我需要从自定义库返回状态消息。

我可以为库创建一个属性并设置翻译器,但我想知道是否有更好的方法将翻译器对象集成到现有应用程序中?

【问题讨论】:

    标签: model-view-controller design-patterns zend-framework translation


    【解决方案1】:

    将用户的语言保存在Memento 中,并将其传递给程序逻辑,当您需要进行翻译时,使用它来识别语言。

    【讨论】:

      【解决方案2】:

      如果使用 Zend_Translate,最好使用寄存器。

      Zend_Registry::set('Zend_Translate', $translate);
      

      这样所有类都可以自动找到它(Zend_Form, Zend_Validate, ...)

      【讨论】:

      • 如果我没记错的话,翻译器已经使用该密钥注册,以便从视图脚本、验证器和表单中使用。
      【解决方案3】:

      您总是可以在 bootstrap.php 中实例化翻译器,这样它就可以作为全局的所有类使用。我就是这样做的,因为您可能需要在任何地方使用它。它并不优雅,但它使您不必在类需要引发异常或返回错误消息的任何地方添加代码。

      【讨论】:

      • 是的,这是我倾向于的一种选择,正如您所说,这并不优雅,但最实用。不过,我可能根本不需要这样做,尝试将特定于语言的代码提升一个级别,以便库只是发回控制器应该知道的状态代码。感谢您的回复。
      【解决方案4】:

      如果你没有那么多控制器设置,你能不扩展基本控制器并在那里实例化翻译器吗?那么它应该可以在整个系统中使用。

      类似这样的扩展:

      <?php
      class BaseController extends Zend_Controller_Action
      {
        public function init()
        {
          //setup translation object
        }
      }
      ?>
      

      【讨论】:

        【解决方案5】:

        您可能要考虑使用依赖注入器容器,其中翻译器是您传递给所需对象的条目,而无需手动构造对象。这样您就可以轻松测试并制作更高质量(和可测试)的代码

        在此处查看其他问题 How to use dependency injection in Zend Framework?

        或这篇关于将 ZF 2 DI 插入 ZF1 的文章 http://adam.lundrigan.ca/2011/06/using-zenddi-in-zf1/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-11
          相关资源
          最近更新 更多