cómo crear bloque estático multilingüe

23

Necesito crear un bloque estático multilingüe. Hasta ahora he creado un bloque estático con la identificación 'delivery_returns'.

Lo estoy llamando en catalog \ product \ view.phtml así:

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

Entiendo que para traducir este bloque:

  1. Debería crear otro.
  2. Elija el idioma que desee del campo store_view
  3. y mantenga el identificador de bloque estático igual que el original.

Este método funciona con 'footer_links' y también con otro bloque estático que hice, llamado 'header_links', pero aparentemente no funciona con el bloque 'delivery_returns'. Cambiar el idioma de la tienda no carga el bloque traducido correspondiente 'delivery_returns'

¿Qué me estoy perdiendo? ¿Hay una mejor manera de lograr esto?

ruuter
fuente

Respuestas:

25
  1. Cree un bloque estático para cada idioma, todos con el mismo identificador.
  2. Renderiza el bloque con el cms/blockbloque. Agregará automáticamente la ID de la tienda para cargar la versión correcta del bloque.

Aquí hay una manera fácil de cargar y representar el bloque directamente en el archivo de plantilla:

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

Alternativamente, declare el bloque en un archivo de diseño y renderícelo con <?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>
Anders Thirsgaard Rasmussen
fuente
1
No sabía esto. Increíble.
philwinkle
Tenga en cuenta que esto da algunos problemas con respecto al almacenamiento en caché de bloques. Todavía no estoy seguro de cómo solucionarlo, además de desactivar el caché de magento para este bloque específico ... :(
Joris Kroos
Más información sobre los problemas de magento chache con bloques con múltiples vistas de la tienda, consulte community.magento.com/t5/Version-Upgrades/…
Joris Kroos
8

La respuesta a continuación habla de configurar la identificación de la tienda antes de cargar el modelo, pero, como @benmarks señaló en el comentario a continuación, esto es innecesario, ya que eso sucede en el bloque _toHtml ().

Al igual que con muchos otros modelos de mago, intente configurar la identificación de tienda deseada antes de cargar el modelo:

$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
fuente
2
No es necesario: cms/blockhace esto durante el renderizado; ver Mage_Cms_Block_Block::_toHtml()(enlace)
puntos de referencia
Tienes razón. Extraño, no me he dado cuenta. Incluso apunto el OP a ese mismo método del que estás hablando.
nevvermind
En realidad, cuando obtiene el bloque , Mage establece la identificación de la tienda. Mientras que hice una instancia directa del modelo , y eso no tenía establecida la identificación de la tienda. Ver Mage_Cms_Block_Block::_toHtml().
nevvermind
No estoy seguro de lo que quieres decir: no veo nada Mage_Core_Model_Blockque establezca la identificación de la tienda.
puntos de referencia
Ese no es el bloque del que estoy hablando, sino Mage_Cms_Block_Block .
nevvermind
4

He logrado esto de una de las pocas maneras:

  1. Simplemente use un nombre de bloque estático diferente, copie y traduzca, y consúltelo en su tema por separado.
  2. Puede usar `{{translate text =" text to translate "}} en cualquier página de bloque estático de cms implementando la siguiente solución:

    • copie app / code / core / Mage / Core / Model / Email / Template / Filter.php a app / code / local / Mage / Core / Model / Email / Template / Filter.php y modifique lo siguiente:

-

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

Más información / fuente:

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

philwinkle
fuente
Sí, vi esas soluciones. Pero ambos son soluciones alternativas. Con el método uno, tengo que duplicar product \ view.phtml para cada tienda. El método 2 necesita editar archivos .csv. Por lo tanto, ambos NO son adecuados para trabajar con clientes que no sean desarrolladores. ¿No hay una forma adecuada de hacer esto? Con mi método, el cliente puede crear y cambiar contenido de bloque estático y funciona con header_links y footer_links. No entiendo por qué no trabajar con delivery_returns: S
ruuter
Desearía que hubiera una forma 'más fácil': la única otra forma de manejarlo sería extraer el contenido a través de ajax y cargarlo desde una fuente externa.
philwinkle
FWIW - He tenido mucha suerte con la solución 2; Yo uso ambos de forma regular.
philwinkle
Pensé en ajax, pero esto hace que sea aún más difícil para el cliente cambiar el contenido. Creo que elegiré tu método 1. y crearé diferentes archivos view.phtml para cada idioma. Si no se le ocurre una solución mejor, marcaré su respuesta como aceptada. Tnx de todos modos!
ruuter
1

Puede descargar un módulo que he creado en base a esta respuesta desde aquí: https://github.com/miguelbalparda/MB_Translate/ Pone a disposición el traductor en línea de Magento en páginas CMS / Block.

mbalparda
fuente
Las respuestas de enlace único no son las mejores. Por favor explique qué hace su extensión. Sé lo que hace y lo recomiendo, pero que quede un poco claro para todos.
Marius
Claro, pone a disposición el traductor en línea de Magento en páginas CMS / Block.
mbalparda
Añádelo a tu respuesta.
Marius