Magento 翻译是如何工作的? [英] How does Magento translate works?
问题描述
我想仅使用一个 csv 文件来翻译前端 Magento 商店.所以我这样做了:
I want to translate a frontend Magento store using only one csv file. So I've done this:
我创建了一个名为 Translator 的自定义模块.在其 config.xml 中,我放置了以下几行:
I've created a custom module called Translator. In its config.xml I've put these lines:
<config>
....
<translate>
<modules>
<MyPackage_Translator>
<files>
<default>MyPackage_Translator.csv</default>
</files>
</MyPackage_Translator>
</modules>
</translate>
</config>
然后我在我的 Helper 文件夹中创建了默认的 Data.php 帮助程序.
Then I've created de default Data.php helper in my Helper folder.
然后在 app/locale/de_DE 中,我创建了 MyPackage_Translator.csv 文件,我在其中放置了所有字符串.
Then in app/locale/de_DE I've created the MyPackage_Translator.csv file where I put all my strings.
现在,如果在 phtml(不管模块)文件中,如果我执行以下操作:
Now, if in a phtml(regardless the module) file, if I do something like:
echo $this->__('My string');
效果很好.但我很好奇为什么 Magento 会在 MyPackage_Translator.csv 中查找字符串?
it works pretty well. But I'm curios why does Magento looks in the MyPackage_Translator.csv for the string?
我也注意到,如果我使用 $this->__('some string');在 Customer 模块中,Magento 将首先在 app/locale/de_DE/Mage_Customer.csv 文件中查找字符串,如果在那里找不到字符串,则它会在我的 MyPackage_Translator.csv 文件中查找.这是为什么?例如,为什么它不在 Enterprise_Customer.csv 文件中查找?
I also noticed that, if I'm using $this->__('some string'); in the Customer module, Magento will look first in app/locale/de_DE/Mage_Customer.csv file for the string, and if it doesn't find the string there, then it will look in my MyPackage_Translator.csv file. Why is that? Why it doesn't look in Enterprise_Customer.csv file for example?
有人能解释一下 Magento 在寻找翻译文件时的工作流程吗?
Can someone explain me the workflow Magento does when it's looking for the translation file?
推荐答案
当你调用 $this->__('some text');
When you call $this->__('some text');
你可以从查看Mage_Core_Helper_Abstract
/**
* Translate
*
* @return string
*/
public function __()
{
$args = func_get_args();
$expr = new Mage_Core_Model_Translate_Expr(array_shift($args), $this->_getModuleName());
array_unshift($args, $expr);
return Mage::app()->getTranslator()->translate($args);
}
接下来是Mage_Core_Model_App
/**
* Retrieve translate object
*
* @return Mage_Core_Model_Translate
*/
public function getTranslator()
{
if (!$this->_translator) {
$this->_translator = Mage::getSingleton('core/translate');
}
return $this->_translator;
}
交给Mage_Core_Model_Translate
/**
* Translate
*
* @param array $args
* @return string
*/
public function translate($args)
{
$text = array_shift($args);
if (is_string($text) && ''==$text
|| is_null($text)
|| is_bool($text) && false===$text
|| is_object($text) && ''==$text->getText()) {
return '';
}
if ($text instanceof Mage_Core_Model_Translate_Expr) {
$code = $text->getCode(self::SCOPE_SEPARATOR);
$module = $text->getModule();
$text = $text->getText();
$translated = $this->_getTranslatedString($text, $code);
}
else {
if (!empty($_REQUEST['theme'])) {
$module = 'frontend/default/'.$_REQUEST['theme'];
} else {
$module = 'frontend/default/default';
}
$code = $module.self::SCOPE_SEPARATOR.$text;
$translated = $this->_getTranslatedString($text, $code);
}
//array_unshift($args, $translated);
//$result = @call_user_func_array('sprintf', $args);
$result = @vsprintf($translated, $args);
if ($result === false) {
$result = $translated;
}
if ($this->_translateInline && $this->getTranslateInline()) {
if (strpos($result, '{{{')===false || strpos($result, '}}}')===false || strpos($result, '}}{{')===false) {
$result = '{{{'.$result.'}}{{'.$translated.'}}{{'.$text.'}}{{'.$module.'}}}';
}
}
return $result;
}
返回结果文本.这是对如何处理所有内容的快速演练,您应该查看类本身以获得更深入的了解.
which returns the resulting text. This is a quick walk through of how everything would be handled, you should view the classes themselves to get a more in depth understanding.
这篇关于Magento 翻译是如何工作的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!