为什么类使用帮助器而不是$ this进行翻译?


27

在核心模块(有时是模板)中,我看到了用于翻译的辅助类:

Mage::helper('someModule')->__('translate me');

为什么这样优于:

$this->__('translate me');

嘿,布伦丹,这个问题非常好,我感谢您的努力。+1。但是,Alanstorm为您的问题提供了有效的答案。因此,最好接受可用答案中的答案。谢谢:-)
拉杰夫K Tomy 2015年

给您的兄弟更多的力量:-)
拉杰夫K Tomy 2015年

Answers:


24

只是理论化,但是当您打电话时

$this->__('Foo')

在模板中,Magento将使用哪个模块的CSV转换文件来转换Foo?

始终不清楚哪个模块的翻译帮助程序Magento最终会调用以翻译字符串/键。由于Magento允许您在不同的模块中为不同的字符串使用相同的键,因此了解所使用的模块的翻译数据通常很重要。实际上,如果跨多个模块使用模板,则使用$this->__()可能被认为“有害”,因为根据布局系统在其中使用模板的块上下文,它将返回不同的值。

我的猜测是方便性帮助程序是在前面添加的,但是开发人员快速开始实例化构建模板就可以帮助实例化,因此他们知道哪个模块的翻译文件可以翻译字符串,并且该模式可以传播到框架测试中。这行代码本身是模棱两可的。

$this->__('Foo');

但是您可以确定这行代码将使用Mage_Catalog本地化信息。

Mage::helper('catalog')->__('Foo')

嗯,我明白了。实际上,我只看到在前端包中为活动主题创建的CSV文件为/ locale / {xyz} /translate.csv(不是每个模块)。我遇到了“字符串存在于不同的模块中并且需要不同的翻译”的问题,但是也遇到了“此字符串在该模块中具有多个实例并且需要不同的翻译”的问题,帮助者无法解决。通常,我可以坚持使用$ this和每个主题一个CSV。
布伦丹·福尔科夫斯基

@BrendanFalkowski是的,似乎就像是“模块开发人员”还是“主题开发人员”。我想您会发现使用内置的帮助程序。
艾伦·斯托姆

@AlanStorm绝对是您的最佳选择。
MTM

20

因为要使用显式模块。

如果$this->__()在块上下文中使用,则将块的模块用于翻译。因此,如果您要使用特殊的模块,则必须使用Mage::helper('mymodule')->__()


1
在所有情况下,翻译都与某个模块相关。仅调用$ this时,您引用的是当前模块,而调用长Mage :: helper('mymodule')-> __()时,您正在使用该模块翻译单词,就像从模块而不是CSV而不是默认的CSV。
mbalparda 2014年

正确。如果使用帮助程序,则将其明确显示。
Fabian Blechschmidt 2014年

1
显式的优点是什么?翻译CSV不能区分模块,还是它们?尚未听说他们有任何等级/继承关系。
布伦丹·福尔科夫斯基

不,所有CSV都已合并,但是由于Mage_Checkout::My Cart语法的原因,您可以有两个不同的位置。因此使用哪个模块进行翻译很重要
Fabian Blechschmidt 2014年

1
呵呵,因此,与前端包相比,助手对模块的意义要大得多,前端包中只有自己的CSV才可以覆盖核心。
布伦丹·福尔科夫斯基

9

基本上,我要说的和其他人一样。
如果使用,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->__将使用目录模块翻译块中使用的所有文本(还包括渲染块的模板)。


真好 面包屑理论很棒,我喜欢它。+1 :-)
拉杰夫·托米

2

原因之一(仅根据我的理解),当您使用帮助程序时,您会更具体地了解翻译文件,例如Mage::helper('catalog')它将在目录文件中找到该句子,而当您使用$this它时它将在所有翻译文件中随机搜索。那就是我所想的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.