как создать многоязычный статический блок

23

Мне нужно создать многоязычный статический блок. Пока что я создал статический блок с идентификатором delivery_returns.

Я звоню в каталог \ 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'

Что мне не хватает? Есть ли лучший способ добиться этого?

Ruuter
источник

Ответы:

25
  1. Создайте статический блок для каждого языка с одинаковым идентификатором.
  2. Рендеринг блока с cms/blockблоком. Он автоматически добавит идентификатор магазина, чтобы загрузить правильную версию блока.

Вот простой способ загрузить и визуализировать блок непосредственно в файле шаблона:

<?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
Более подробную информацию о вопросах chache Magento с блоками с несколькими видами магазинов см community.magento.com/t5/Version-Upgrades/...
Джорис Кроос
8

Ответ ниже говорит об установке идентификатора магазина перед загрузкой модели, но, как отмечено @benmarks в комментарии ниже, в этом нет необходимости, как это происходит в _toHtml () блока.

Как и во многих других моделях магов, попробуйте установить желаемый идентификатор магазина перед загрузкой модели:

$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());
nevvermind
источник
2
Не обязательно - это cms/blockделает во время рендеринга; см. Mage_Cms_Block_Block::_toHtml()(ссылка)
отметки
Вы правы. Странно, я не заметил. Я даже указываю ОП на тот самый метод, о котором вы говорите.
nevvermind
На самом деле, при получении блока Маг устанавливает идентификатор магазина. Принимая во внимание, что я непосредственно создал экземпляр модели , и для этого не был установлен идентификатор магазина. См Mage_Cms_Block_Block::_toHtml().
nevvermind
Я не уверен, что ты имеешь в виду - я не вижу ничего, из-за Mage_Core_Model_Blockчего устанавливается идентификатор магазина.
отметки
Я говорю не о блоке, а Mage_Cms_Block_Block .
nevvermind
4

Я сделал это одним из нескольких способов:

  1. Просто используйте другое имя статического блока, скопируйте и переведите, и обратитесь к нему в вашей теме отдельно.
  2. Вы можете использовать `{{translate text =" text to translate "}} в любой статической блочной странице cms, применяя следующий обходной путь:

    • Скопируйте 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

philwinkle
источник
Да, я видел эти решения. Но оба обходные пути. При первом способе мне нужно продублировать product \ view.phtml для каждого магазина. Способ 2 требует редактирования файла .csv. Таким образом, оба НЕ подходят для работы с клиентом, не являющимся разработчиком. Нет ли правильного способа сделать это? С помощью моего метода клиент может создавать и изменять содержимое статического блока, и он работает с header_links и footer_links. Я не понимаю, почему не работают с delivery_returns: S
ruuter
Мне бы хотелось, чтобы существовал «более простой» способ - единственный другой способ справиться с этим - извлечь контент через ajax и загрузить его из внешнего источника.
Philwinkle
FWIW - мне повезло с решением 2; Я использую оба на регулярной основе.
Philwinkle
Я думал о ajax, но это делает клиент еще сложнее менять контент. Я думаю, я выберу ваш метод 1. и создаю различные файлы view.phtml для каждого языка. Если в ближайшее время не будет найдено лучшее решение, я отмечу ваш ответ как принятый. Tnx в любом случае!
Руутер
1

Вы можете скачать модуль, который я создал на основе этого ответа, отсюда: https://github.com/miguelbalparda/MB_Translate/ Он предоставляет встроенный переводчик Magento на страницах CMS / Block.

mbalparda
источник
Ответы по одной ссылке не самые лучшие. Пожалуйста, объясните, что делает ваше расширение. Я знаю, что он делает, и я рекомендую это, но сделаю это немного понятным для всех.
Мариус
Конечно, он делает доступным встроенный переводчик Magento на страницах CMS / Block.
mbalparda
Добавьте свой ответ.
Мариус