Vex*_*tus 3 php model-view-controller translation zend-framework
在我的ZF 1.11应用程序中,我将我的翻译器存储在注册表中,如下所示:
Zend_Registry::set('Zend_Translate', $translator);
Run Code Online (Sandbox Code Playgroud)
所以在我的视图脚本中,我可以这样访问翻译器:
$this->translate('abc');
Run Code Online (Sandbox Code Playgroud)
是否有任何聪明的方法可以使用此调用:
$this->_('abc');
Run Code Online (Sandbox Code Playgroud)
使用$ this-> translate会使视图变得混乱,而且很多人习惯于看到_().
虽然我普遍同意函数/方法名称应该有意义的概念,但我也同意_()翻译是一种广泛使用的标准,因此是可以接受的.
您可以通过向中间层添加包装器来完成此操作.例如,以下内容将使该方法可用于从MyProject_Controller_Action以下派生的所有控制器:
class MyProject_Controller_Action extends Zend_Controller_Action
{
protected $translator;
public function init()
{
$this->translator = Zend_Registry::get('Zend_Translate');
}
/**
* Translator wrapper
*
* @param string $string The string to be translated
* @return string $translated The translated string
*/
protected function _($string)
{
$translated = $this->translator->translate($string);
return $translated;
}
}
Run Code Online (Sandbox Code Playgroud)
当然也可以这样做Zend_View.
免责声明:通过直接调用注册表来混淆代码并不是最好的做法.实际上它是一个反模式,应该被DI取代.Zend Framework 2将使我们更容易避免注册表.可以通过构造函数将转换对象实际注入到类中来改进此代码.
不,不是我所知道的.无论如何,有几个与此相关的隐含问题.首先,您应该始终为函数(以及相关的变量)提供有意义的名称.也就是说,__()根本不是一个有意义的名字.事实上,恰恰相反,它没有任何意义.其次,最佳做法是使用下划线仅为 前缀private和protected函数(以及相应的变量).
最后,通过zend视图帮助程序的工作方式,如果名为__(),您几乎必须对系统进行"欺骗"以定位视图助手.你必须将它命名为类似的东西Zend_View_Helper___并且不起作用.更不用说,这需要为您的文件命名__.php.
我想你可以命名你的助手Zend_View_Helper_T,在这种情况下你可以翻译东西$this->t($string);(我测试了它并且它有效),但你应该再次使用有意义的名字.
编辑
直到现在还没有意识到你想从控制器中调用它,我决定修改我的答案,并对我从下选民收到的评论给出一点反馈.
由于以下原因,很难建议您创建一个包装类Zend_Controller_Action来创建函数_():
尽管如此,Markus的解决方案除了功能名称之外还很好(原因如前所述).我唯一要改变的是Zend_Registry::get()对_()函数的调用.如果你打算像你提到的那样调用那个函数,那么像这样的东西可能会更好:
class MyProject_Controller_Action extends Zend_Controller_Action
{
/**
* the translator object
* @var Zend_Translate
*/
protected $_translator;
public function init()
{
$this->_translator = Zend_Registry::get('Zend_Translate');
}
/**
* note my new method name, you don't have to use it but I still
* recommend it. the name is just a suggestion, if you prefer something
* like _translate() or _trnslte() then by all means (although I don't
* recommend abbreviations unless they're super obvious I guess).
*/
protected function _trans($string)
{
return $this->_translator->translate((string) $string);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3555 次 |
| 最近记录: |