动态/php创建的文本的Magento翻译失败


Magento translation of dynamic/php created text fails

我有一个函数,可以在注册表中的表单字段中添加带数字的标签。对于每个额外的输入字段,它都会添加一个标签,如Address-2、Address-3等。我想使用CSV翻译文件将这些标签从"Address-2"更改为"Number","Address-3"更改为"District"等,但它不起作用。我有正确的CSV路径,因为我在文件中有正确翻译的其他文本。

我正在使用以下代码:

<?php for ($_i=2, $_n=$this->helper('customer/address')->getStreetLines(); $_i<=$_n; $_i++): ?>
<label for="<?php echo $this->getPrefix();?><?php echo $this->__('_street%s', $_i) ?>" <?php echo $this->__('Address %s', $_i) ?>
</label>
<?php endfor;?>

但是Magento没有翻译这些标签,我想是因为%s变量,这是翻译的一部分。

我在CSV文件中尝试了不同的组合,如"地址2"、"地址"2",但都不起作用。关于如何翻译(通过CSV或更改PHP代码本身),有什么想法或建议吗?

通常,您可以将实体数据的翻译存储在数据库中,然后按存储范围检索。这是EAV存储的用途之一。

另一种方法是将这些翻译存储在自定义主题中,并在每个存储中更改主题。

在您的情况下,对我来说,决定因素是(1)您存储在DB中的这些表单是否真的是可任意配置的,或者(2)如果这是一个分布式模块,其中任何一个都表示EAV存储。否则,走主题翻译路线。

基于OP评论的更新

"I need the variable translated"意味着(传统上)您只能使用存储范围将翻译存储在实体的数据库中。您可以通过多种方式来实现这一点,但考虑到这是对另一个扩展的扩展,破坏DB模式似乎是不可能的。你也可以操纵内联翻译,但这似乎很难理解(很想听到其他的)。

这是可以使用core_block_abstract_to_html_after事件的情况。该事件接受块实例和渲染的html。在事件观察器中,您可以通过字符串替换来执行转换,但由于此事件是为所有块激发的,因此您希望将其配置为块类型的单例AND测试。

<?php
class Ns_Mn_Model_FormTranslate
{
    public function translateLabelValues(Varien_Event_Observer $o)
    {
        if ($o->getBlock() instanceof The_Specific_Block_Class) {
            $html = $o->getHtml();
            $html = //your translation logic here
            $o->setHtml($html); //this will be used
        }
    }
}

这里的主要警告是block_html缓存将不会包含这个转换后的输出。或者,使用基于配置的类重写来重写原始类,并将转换逻辑添加到_html()方法中。