多言語静的ブロックを作成する方法


23

多言語の静的ブロックを作成する必要があります。これまでに、「delivery_returns」というIDの静的ブロックを作成しました。

次のように、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」ブロックはロードされません

私は何が欠けていますか?これを達成するためのより良い方法はありますか?

回答:


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

複数の店舗を望むブロックとMagentoのchache問題に関する詳細情報を参照community.magento.com/t5/Version-Upgrades/...
ヨリス・クロース

8

以下の回答では、モデルをロードする前にストアIDを設定する方法について説明しますが、ブロックの_toHtml()で発生するため、以下のコメントで@benmarksが述べているように、これは不要です。

他の多くのMageモデルと同様に、モデルをロードする前に目的のストア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()(リンク)
ベンマーク

あなたが正しい。奇妙なことに、私は気づいていません。私はあなたが話しているまさにその方法にOPを指しています。
-nevvermind

実際、ブロックを取得するとき、MageはストアIDを設定します。一方、モデルを直接インスタンス化しましが、ストアIDが設定されていませんでした。をご覧くださいMage_Cms_Block_Block::_toHtml()
nevvermind

どういう意味かわかりません- Mage_Core_Model_BlockストアIDを設定するものは見当たりません。
ベンチマーク

それは私が話しているブロックではなく、Mage_Cms_Block_Blockです。
nevvermind

4

いくつかの方法のいずれかでこれを達成しました。

  1. 別の静的ブロック名を使用し、コピーして翻訳し、テーマで個別に参照するだけです。
  2. 次の回避策を実装することにより、任意のcms静的ブロックページで `{{translate text =" text to translate "}}を使用できます。

    • コピーアプリ/コード/コア/メイジ/コア/モデル/メール/テンプレート/ Filter.phpアプリへ/コード/ローカル/メイジ/コア/モデル/メール/テンプレート/ 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


はい、私はそれらのソリューションを見ました。しかし、両方とも回避策です。方法1では、ストアビューごとにproduct \ view.phtmlを複製する必要があります。方法2では、.csvファイルの編集が必要です。そのため、両方とも非開発者クライアントとの連携には適していません。これを行う適切な方法はありませんか?私の方法では、クライアントは静的ブロックコンテンツを作成および変更でき、header_linksおよびfooter_linksで動作します。delivery_returnsを使用しない理由がわかりません:S
ruuter

「もっと簡単な」方法があればいいのにと思います。それを処理する他の方法は、ajax経由でコンテンツを取り込み、外部ソースからロードすることだけです。
-philwinkle

FWIW-私はソリューション2で非常に幸運でした。私は両方を定期的に使用しています。
-philwinkle

私はajaxについて考えましたが、これはクライアントがコンテンツを変更することをさらに難しくします。私はあなたの方法1を選択し、言語ごとに異なるview.phtmlファイルを作成すると思います。すぐに優れたソリューションが思い付かない場合は、回答を承認済みとしてマークします。とにかくTnx!
-ruuter

1

この回答に基づいて作成したモジュールは、https//github.com/miguelbalparda/MB_Translate/からダウンロードできます これにより、CMS / BlockページでMagentoのインライントランスレーターを使用できます。


単一リンクの回答は最適ではありません。拡張機能の機能を説明してください。私はそれが何をするか知っています、そしてそれをお勧めしますが、それを皆に少しはっきりさせてください。
マリウス

確かに、CMS /ブロックページでMagentoのインライントランスレータを利用できます。
mbalparda

答えを追加してください。
マリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.