TL; DR
如果您对翻译的工作方式的细节不感兴趣,请跳过以下内容,直到下面的
“如果翻译不起作用应检查哪些内容” 部分,尤其是“
模块范围翻译冲突的解决方案 ”小节。
Magento翻译概述
Magento优先考虑翻译来源(从最高到最低):
- DB(
core_translate
表)
- 主题
translate.csv
文件
- 该
app/locale/*/*.csv
文件
如何构建翻译数组?
模块翻译
首先app/locale/*/*.csv
,etc/config.xml
分析从活动模块文件中引用的所有文件。这是该过程的演练:
假设Magento找到以下config.xml
部分:
<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<default>Mage_Catalog.csv</default>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
在该文件中,为当前商店视图配置的语言环境指定了以下转换:
"AAA","BBB"
在这种情况下,Magento在转换数组中创建以下记录:
array(
"AAA" => "BBB",
"Mage_Catalog::AAA" => "BBB"
)
第二个值是“ 模块范围转换”。带前缀的模块名称来自包含转换文件声明的config XML节点。
如果通过再次指定相同的转换第二模块文件,例如,在Some_Module.csv
翻译的"AAA","CCC"
,它将不会覆盖的"AAA"
设置。相反,它将仅添加带有第二个模块名称的新记录"Some_Module::AAA" => "CCC"
。
如果启用了开发人员模式,则如果在另一个模块转换中找到具有相同键的第二条记录,它甚至会取消该"AAA"
记录。这使得在开发过程中更容易发现模块翻译冲突。
主题翻译
其次,从translate.csv
主题后备中第一个文件加载的当前语言环境的翻译仅替换了翻译数组中的现有记录。
因此,继续前面的示例,一条translate.csv
记录"AAA","DDD"
将导致以下翻译数据:
array(
"AAA" => "DDD", // This is overwritten by the translate.csv file
"Mage_Catalog::AAA" => "BBB",
"Some_Module::AAA" => "CCC"
)
当然,translate.csv
带有新转换键的中的记录只是添加到数组中。
数据库翻译
从翻译core_translate
表基本上都合并到翻译阵列就像主题的翻译。
模块记录或主题转换中的现有键将被数据库记录覆盖,并添加新的键。
翻译查询
__()
调用该方法时,Magento首先在数组中查找与当前模块匹配的转换。
当前模块由__()
调用该类的类名称确定。例如,在块中,负责的方法如下所示:
// Excerpt from Mage/Core/Block/Abstract.php
public function getModuleName()
{
$module = $this->getData('module_name');
if (is_null($module)) {
$class = get_class($this);
$module = substr($class, 0, strpos($class, '_Block'));
$this->setData('module_name', $module);
}
return $module;
}
助手和控制器中的方法将相应地工作。
查找方案示例
例如,可以说$this->__('AAA')
在模板文件中被调用。如果相关块的类型为Mage_Core_Block_Template
,则Magento将首先检查Mage_Core::AAA
记录。如果找不到,它将退回到key的翻译AAA
。
在示例场景中,这将导致翻译DDD
(来自translate.csv
文件)。
在不同的情况下,关联的块可能是Mage_Catalog_Block_Product_View
。在这种情况下,Magento首先检查翻译记录Mage_Catalog::AAA
,然后找到翻译AAA
。
因此,实际上,模块作用域翻译的优先级高于任何通用翻译。使用哪种转换取决于类从调用__()
方法的哪个模块开始。
如何检查翻译是否正常
如果translate.csv
未使用文件翻译,请遵循以下清单:
- 翻译缓存是否已关闭/刷新?(解决方案:清除缓存)
- 该
translate.csv
文件确实在当前商店的主题回退中吗?(解决方案:修复主题配置)
core_translate
表格中的翻译记录是否有冲突?(解决方案:从中删除有冲突的记录core_translate
)
- 如果不是所有上述要点,则必须来自其他模块的翻译有冲突。(解决方案:请参见下文)
模块范围翻译冲突的解决方案
如果您发现最终的情况是真实的,只是第二次加翻译,以您translate.csv
与模块做翻译的模块范围。
在这个例子中,如果你总是希望AAA
被译为DDD
通过主题翻译,你可以在你做到这一点translate.csv
:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
在实践中,只有在发生冲突(即,翻译不起作用)时,才将模块作用域添加到翻译中。
附加条款
内联翻译
Magento的内联翻译功能还core_translate
使用模块作用域前缀将自定义翻译添加到表中。
向后兼容
过去,主题翻译的优先级高于数据库翻译,直到Magento 1.3或更高版本。
XML转换
Magento有时会评估中的translate=""
参数config.xml
,system.xml
并布局XML来转换子节点值。
在这种情况下,可以使用module=""
参数为转换范围指定模块来指定帮助程序类。
如果module
在XML中未指定任何参数,core/data
则使用助手来转换子节点值。
更多信息
我承认我在这篇文章中掩盖了Magento翻译过程的一些细节,但这仅仅是因为我不想提供太多信息。
- 构建转换数组时的一些技术细节
- 为模块使用其他翻译文件的可能性
- 存储
core_translate
记录的视图范围
- 使用不同翻译方法的利弊
如果需要更多信息,请询问另一个问题。