como criar bloco estático multilíngue

23

Eu preciso criar um bloco estático multilíngue. Até agora, criei um bloco estático com o ID 'delivery_returns'.

Estou chamando-o em catalog \ product \ view.phtml assim:

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

Entendo que para traduzir este bloco:

  1. Eu deveria apenas criar outro.
  2. Escolha meu idioma desejado no campo store_view
  3. e mantenha o identificador de bloco estático igual ao original.

Este método funciona com 'footer_links' e também com outro bloco estático que criei, chamado 'header_links', mas aparentemente não está funcionando com o bloco 'delivery_returns'. Alterar o idioma da loja não carrega o bloco 'delivery_returns' traduzido

o que estou perdendo? Existe uma maneira melhor de conseguir isso?

ruuter
fonte

Respostas:

25
  1. Crie um bloco estático para cada idioma, todos com o mesmo identificador.
  2. Renderize o bloco com o cms/blockbloco. Ele adicionará automaticamente o ID da loja para carregar a versão correta do bloco.

Aqui está uma maneira fácil de carregar e renderizar o bloco diretamente no arquivo de modelo:

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

Como alternativa, declare o bloco em um arquivo de layout e renderize-o com <?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
fonte
1
Eu não sabia disso. Impressionante.
22413 philwinkle
Lembre-se de que isso apresenta alguns problemas em relação ao cache do bloco. Ainda não tenho certeza de como corrigir, além de desativar o cache magento para este bloco específico ... :(
Joris Kroos
Mais informações sobre questões Chache Magento com blocos com múltiplas visões loja Veja community.magento.com/t5/Version-Upgrades/...
Joris Kroos
8

A resposta abaixo fala sobre como definir o ID da loja antes de carregar o modelo, mas, como @benmarks observou no comentário abaixo, isso é desnecessário, como acontece no _toHtml () do bloco.

Como em muitos outros modelos de mage, tente definir o ID da loja desejado antes de carregar o 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
fonte
2
Não é necessário - o cms/blockfaz isso durante a renderização; Veja Mage_Cms_Block_Block::_toHtml()(link)
benmarks
Você está certo. Estranho, eu não notei. Eu até aponto o OP para esse método que você está falando.
Nevevind
Na verdade, ao obter o bloco , Mage define o ID da loja. Considerando que instanciei diretamente o modelo e que não tinha o ID da loja definido. Veja Mage_Cms_Block_Block::_toHtml().
precisa saber é o seguinte
Não sei o que você quer dizer - não vejo nada Mage_Core_Model_Blockque defina o ID da loja.
benmarks 27/08/13
Não estou falando do bloco, mas do Mage_Cms_Block_Block .
nevvermind
4

Consegui isso de uma de algumas maneiras:

  1. Apenas use um nome de bloco estático diferente, copie e traduza e consulte-o no seu tema separadamente.
  2. Você pode usar o `{{translate text =" text to translate "}} em qualquer página de bloco estático cms, implementando a seguinte solução alternativa:

    • copie app / code / core / Mage / Core / Model / Email / Template / Filter.php para app / code / local / Mage / Core / Model / Email / Template / Filter.php e modifique o seguinte:

-

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

Mais informações / fonte:

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

philwinkle
fonte
Sim, eu vi essas soluções. Mas ambos são soluções alternativas. Com o método um, eu tenho que duplicar product \ view.phtml para cada visualização de armazenamento. O método 2 precisa de edição de arquivo .csv. Portanto, ambos NÃO são adequados para o cliente não desenvolvedor trabalhar. Não existe uma maneira adequada de fazer isso? Com o meu método, o cliente pode criar e alterar o conteúdo do bloco estático e funciona com header_links e footer_links. Eu não entendo por que não trabalhar com delivery_returns: S
ruuter 09/02
Eu gostaria que houvesse uma maneira 'mais fácil' - a única outra maneira de lidar com isso seria extrair o conteúdo via ajax e carregá-lo de uma fonte externa.
philwinkle
FWIW - Tive muita sorte com a solução 2; Eu uso os dois regularmente.
22413 philwinkle
Pensei no ajax, mas isso torna ainda mais difícil para o cliente alterar o conteúdo. Acho que vou escolher o seu método 1. e criar diferentes arquivos view.phtml para cada idioma. Se não houver uma solução melhor, marcaremos sua resposta como aceita. Tnx de qualquer maneira!
ruuter
1

Você pode baixar um módulo que criei com base nesta resposta aqui: https://github.com/miguelbalparda/MB_Translate/ Disponibiliza o tradutor interno do Magento nas páginas CMS / Block.

mbalparda
fonte
As respostas de link único não são as melhores. Por favor, explique o que sua extensão faz. Sei o que faz e recomendo, mas deixo um pouco claro para todos.
Marius
Certamente, disponibiliza o tradutor embutido do Magento nas páginas CMS / Block.
Mbalparda
Adicione sua resposta.
Marius