在核心模块(有时是模板)中,我看到了用于翻译的辅助类:
Mage::helper('someModule')->__('translate me');
为什么这样优于:
$this->__('translate me');
在核心模块(有时是模板)中,我看到了用于翻译的辅助类:
Mage::helper('someModule')->__('translate me');
为什么这样优于:
$this->__('translate me');
Answers:
只是理论化,但是当您打电话时
$this->__('Foo')
在模板中,Magento将使用哪个模块的CSV转换文件来转换Foo?
始终不清楚哪个模块的翻译帮助程序Magento最终会调用以翻译字符串/键。由于Magento允许您在不同的模块中为不同的字符串使用相同的键,因此了解所使用的模块的翻译数据通常很重要。实际上,如果跨多个模块使用模板,则使用$this->__()
可能被认为“有害”,因为根据布局系统在其中使用模板的块上下文,它将返回不同的值。
我的猜测是方便性帮助程序是在前面添加的,但是开发人员快速开始实例化构建模板就可以帮助实例化,因此他们知道哪个模块的翻译文件可以翻译字符串,并且该模式可以传播到框架测试中。这行代码本身是模棱两可的。
$this->__('Foo');
但是您可以确定这行代码将使用Mage_Catalog
本地化信息。
Mage::helper('catalog')->__('Foo')
因为要使用显式模块。
如果$this->__()
在块上下文中使用,则将块的模块用于翻译。因此,如果您要使用特殊的模块,则必须使用Mage::helper('mymodule')->__()
Mage_Checkout::My Cart
语法的原因,您可以有两个不同的位置。因此使用哪个模块进行翻译很重要
基本上,我要说的和其他人一样。
如果使用,Mage::helper(...)
请确保使用特定的帮助程序进行翻译。
例如,让我们来看一下Mage_Adminhtml_Block_Catalog_Product_Grid
。
对于列标题,有: 'header'=> Mage::helper('catalog')->__('Name'),
。如果$this->__
将使用目录Mage_Adminhtml
模块而不是使用目录帮助程序,则将翻译该文本。
但是,在这种情况下,使用命名助手的逻辑很有意义。
我只是想展示一个案例,在其中使用$this->__('..')
而不是助手方法会导致问题。我从经验上讲。
让我们来阻止Mage_Catalog_Block_Breadcrumbs
。一行看起来像这样: Mage::helper('catalog')->__('Home')
。
您可能会认为自己在catalog
模块中,因此可以$this
代替使用。但是,如果您通过称为的块覆盖该块Namespace_Module_Block_Breadcrumbs
怎么办?
如果$this
使用,那么用于翻译的模块将是Namespace_Module
,您可能不希望那样。
有两种选择可以避免这种情况。在大多数核心模块中已经使用命名助手。
或者,您作为开发人员可以将其添加到block类中:
public function getModuleName() {
return 'Mage_Catalog';
}
然后,您确定$this->__
将使用目录模块翻译块中使用的所有文本(还包括渲染块的模板)。