jak stworzyć wielojęzyczny blok statyczny

23

Muszę utworzyć wielojęzyczny blok statyczny. Do tej pory utworzyłem blok statyczny o identyfikatorze „delivery_returns”.

Nazywam to w katalogu \ product \ view.phtml w następujący sposób:

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

Rozumiem, że aby przetłumaczyć ten blok:

  1. Powinienem po prostu stworzyć kolejny.
  2. Wybierz żądany język z pola store_view
  3. i zachowaj statyczny identyfikator bloku taki sam jak oryginał.

Ta metoda działa z „footer_links”, a także z innym statycznym blokiem, który utworzyłem, zwanym „header_links”, ale najwyraźniej nie działa z blokiem „delivery_returns”. Zmiana języka sklepu nie ładuje odpowiedniego przetłumaczonego bloku „delivery_returns”

czego mi brakuje? Czy istnieje lepszy sposób na osiągnięcie tego?

ruuter
źródło

Odpowiedzi:

25
  1. Utwórz blok statyczny dla każdego języka, wszystkie z tym samym identyfikatorem.
  2. Renderuj blok za pomocą cms/blockbloku. Automatycznie doda identyfikator sklepu, aby załadować poprawną wersję bloku.

Oto prosty sposób na załadowanie i renderowanie bloku bezpośrednio w pliku szablonu:

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

Alternatywnie zadeklaruj blok w pliku układu i wyrenderuj go za pomocą <?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
źródło
1
Nie wiedziałem tego. Niesamowite.
philwinkle,
Pamiętaj, że daje to pewne problemy dotyczące buforowania bloków. Nie wiem, jak to naprawić, oprócz wyłączenia pamięci podręcznej Magento dla tego konkretnego bloku ... :(
Joris Kroos
Więcej informacji na temat problemów z pamięcią podręczną Magento w blokach z wieloma widokami sklepu można znaleźć na stronie community.magento.com/t5/Version-Upgrades/...
Joris Kroos
8

Poniższa odpowiedź mówi o ustawianiu identyfikatora sklepu przed załadowaniem modelu, ale, jak zauważył @benmarks w komentarzu poniżej, nie jest to konieczne, ponieważ dzieje się tak w bloku _toHtml ().

Podobnie jak w przypadku wielu innych modeli magów, spróbuj ustawić żądany identyfikator sklepu przed załadowaniem modelu:

$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
źródło
2
Niepotrzebne - cms/blockrobi to podczas renderowania; patrz Mage_Cms_Block_Block::_toHtml()(link)
benmarks
Masz rację. Dziwne, nie zauważyłem. Wskazuję nawet OP na tę właśnie metodę, o której mówisz.
nevvermind
Właściwie, kiedy dostajesz blok , Mag ustawia identyfikator sklepu. Podczas gdy bezpośrednio utworzyłem instancję modelu , a to nie miało ustawionego identyfikatora sklepu. Zobaczyć Mage_Cms_Block_Block::_toHtml().
nevvermind
Nie jestem pewien, co masz na myśli - nie widzę niczego, w Mage_Core_Model_Blockczym ustawiłby się identyfikator sklepu.
zyskuje
Nie o tym mówię, ale o Mage_Cms_Block_Block .
nevvermind
4

Dokonałem tego na jeden z kilku sposobów:

  1. Wystarczy użyć innej statycznej nazwy bloku, skopiować i przetłumaczyć i odnieść się do niej osobno w motywie.
  2. Możesz użyć `{{translate text =" text to translate "}} na dowolnej stronie statycznego bloku cms, wdrażając następujące obejście:

    • skopiuj aplikację / code / core / Mage / Core / Model / Email / Template / Filter.php do app / code / local / Mage / Core / Model / Email / Template / Filter.php i zmodyfikuj:

-

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

Więcej informacji / źródło:

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

philwinkle
źródło
Tak, widziałem te rozwiązania. Ale oba są obejścia. Metodą pierwszą muszę następnie skopiować produkt \ view.phtml dla każdego widoku sklepu. Metoda 2 wymaga edycji pliku .csv. Oba NIE są odpowiednie dla klientów niebędących programistami. Czy nie ma odpowiedniego sposobu, aby to zrobić? Za pomocą mojej metody klient może tworzyć i zmieniać zawartość bloków statycznych i działa z linkami nagłówka i stopki. Nie rozumiem, dlaczego nie pracować z delivery_returns: S
ruuter
Chciałbym, aby istniał „łatwiejszy” sposób - jedynym innym sposobem, aby sobie z tym poradzić, jest ściągnięcie zawartości przez ajax i załadowanie jej z zewnętrznego źródła.
philwinkle
FWIW - Miałem wielkie szczęście z rozwiązaniem 2; Oba używam regularnie.
philwinkle
Myślałem o ajax, ale to jeszcze bardziej utrudnia klientowi zmianę treści. Chyba wybiorę twoją metodę 1. i utworzę różne pliki view.phtml dla każdego języka. Jeśli nikt nie wymyśli lepszego rozwiązania, oznaczę twoją odpowiedź jako przyjętą. W każdym razie Tnx!
ruuter
1

Moduł, który utworzyłem na podstawie tej odpowiedzi, możesz pobrać stąd: https://github.com/miguelbalparda/MB_Translate/ Udostępnia on wbudowanego tłumacza Magento na stronach CMS / Block.

mbalparda
źródło
Odpowiedzi na pojedyncze łącza nie są najlepsze. Proszę wyjaśnić, co robi rozszerzenie. Wiem, co robi i polecam, ale wyjaśniam to wszystkim.
Marius
Jasne, udostępnia wbudowanego tłumacza Magento na stronach CMS / Block.
mbalparda
Dodaj swoją odpowiedź.
Marius