如何创建多语言静态块


23

我需要创建多语言静态块。到目前为止,我已经创建了ID为'delivery_returns'的静态块。

我在catalog \ product \ view.phtml中这样称呼它:

$deliveryBlock = Mage::getModel('cms/block')->load('delivery_returns');
echo $deliveryBlock->getTitle();
echo $deliveryBlock->getContent();

我了解翻译此代码块:

  1. 我应该再创建一个。
  2. 从store_view字段中选择我想要的语言
  3. 并使静态块标识符与原始标识符相同。

该方法适用于“ footer_links”以及我创建的另一个静态块,称为“ header_links”,但显然它不适用于“ delivery_returns”块。更改商店语言不会加载相应的翻译后的“ delivery_returns”块

我想念什么?有没有更好的方法来实现这一目标?

Answers:


25
  1. 为每种语言创建一个静态块,所有块都具有相同的标识符。
  2. cms/block块渲染块。它将自动添加商店ID以加载正确版本的块。

这是直接在模板文件中加载和渲染块的简单方法:

<?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('delivery_returns')->toHtml() ?>

或者,在布局文件中声明该块,并使用进行渲染<?php echo $this->getChildHtml('delivery_returns') ?>

<block type="cms/block" name="product.delivery_returns" as="delivery_returns">
    <action method="setBlockId"><block_id>delivery_returns</block_id></action>
</block>

1
我不知道这个。太棒了
philwinkle

请注意,这会带来一些有关块缓存的问题。除了关闭该特定块的magento缓存外,还不确定如何解决... :(
Joris Kroos 2015年

关于与多个商店的观点块的Magento chache问题的更多信息请参见community.magento.com/t5/Version-Upgrades/...
里斯克罗斯

8

下面的答案是关于在加载模型之前设置商店ID的,但是,正如下面的注释中提到的@benmarks一样,这是不必要的,因为这发生在块的_toHtml()中。

与许多其他法师模型一样,请加载模型之前尝试设置所需的商店ID :

$deliveryBlock = Mage::getModel('cms/block')
                     ->setStoreId(Mage::app()->getStore()->getId())
                     ->load('delivery_returns');

echo $deliveryBlock->getTitle();

/**
 * You shouldn't print the content directly (although I'm assuming it's for debugging purposes only).
 * Use the code below, so as the possible content directives (the "{{ }}" thingies) would be interpreted.
 * Check out Mage_Cms_Block_Block::_toHtml().
 */
echo Mage::helper('cms')->getBlockTemplateProcessor()
                        ->filter($deliveryBlock->getContent());

2
不必要- cms/block在渲染期间执行此操作;看到Mage_Cms_Block_Block::_toHtml()(链接)
benmarks

你是对的。奇怪,我没注意到。我什至将OP指向您正在谈论的那种方法。
nevvermind

实际上,当获得块时,法师会设置商店ID。而我直接实例化了模型,但没有设置商店ID。请参阅Mage_Cms_Block_Block::_toHtml()
nevvermind 2013年

我不确定您的意思-我看不到Mage_Core_Model_Block设置商店ID的任何内容。
benmarks

那不是我在谈论的障碍,而是Mage_Cms_Block_Block
nevvermind

4

我已经通过以下几种方式之一完成了此任务:

  1. 只需使用其他静态块名称,进行复制和转换,然后在主题中分别引用它即可。
  2. 您可以通过以下解决方法在任何cms静态阻止页面中使用`{{translate text =“ text to translation”}}}:

    • app / code / core / Mage / Core / Model / Email / Template / Filter.php复制到app / code / local / Mage / Core / Model / Email / Template / Filter.php并修改以下内容:

-

public function translateDirective($construction)
{
    $params = $this->_getIncludeParameters($construction[2]);
    $text = $params['text'];
    return Mage::helper('page')->__($text);
} 

更多信息/来源:

http://jagdeepbanga.com/blog/magento_how_add_translation_ability_into_cms_page_or_static_block.html


是的,我看到了这些解决方案。但是两者都是解决方法。然后,使用方法一,我必须为每个storeview复制product \ view.phtml。方法2需要编辑.csv文件。因此两者都不适合非开发人员客户使用。没有正确的方法来做到这一点?使用我的方法,客户端可以创建和更改静态块内容,并且可以与header_links和footer_links一起使用。我不明白为什么不使用delivery_returns:S
ruuter

我希望有一种“更轻松”的方法-处理它的唯一其他方法是通过ajax提取内容并从外部源加载它。
philwinkle

FWIW-我对解决方案2感到很幸运;我经常使用两者。
philwinkle

我考虑过ajax,但这使客户端更改内容变得更加困难。我想我会选择您的方法1.并为每种语言创建不同的view.phtml文件。如果没有一个更好的解决方案,我将标记您的回答为已接受。反正还是Tnx!
ruuter

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.