magentoコアテンプレートでモジュールの翻訳ファイルを使用する


15

私が取り組んでいる拡張機能では、モジュールのconfig.xmlを介してレイアウトXMLを追加しています。このレイアウトには、フロントエンドにいくつかの変更が加えられています。ただし、これらのブロックの一部は、Magentoコアモジュールに属します。テンプレートはすべて期待どおりに正しく表示されています。

モジュール自体にパッケージ化したテンプレートは、自分のモジュールの翻訳ファイルを使用しています。Magentoコアにパッケージ化されたテンプレートは、翻訳されていません。それぞれのコアモジュールに翻訳ファイルを追加すると、その翻訳ファイルが使用され、テンプレートに翻訳済みと表示されます。

Magentoコアモジュールの翻訳ファイルが見つからない場合に、Magentoにモジュールの翻訳ファイルを使用させる方法はありますか?ここで他にできることはありますか?


現在のテーマ翻訳ファイルに翻訳を追加するか、バックエンドでインライン翻訳インターフェースを使用できます。
ドミトロZavalkin

私は翻訳自体に拡張機能をパッケージ化したかったのですが、上記ではそれをインストールする人に指示を追加する必要がありました。コードから実行できるオプションはありますか?
Mridulアガルワル

4
tempalte $this->__()またはでの翻訳の使用方法によって異なりMage::helper('...')->__()ます。最初の場合、ブロックに翻訳ヘルパーを使用させることができます。しかし、一般的な場合、唯一のオプションはcore_translateテーブルのデータアップグレードです。:ここでは国際qestionsが詳細に説明されているblog.belvg.com/...
ドミトロZavalkin

より簡単な実践的なソリューションについては、ブロック上書きするときに翻訳の損失を回避するも参照してください
hakre

回答:


20

どのようにアプローチしても、あなたの問題には「創造的な」解決策が必要であり、開発者/保守者が使用する開発者のメモに値するものです。最初に、いくつかの背景、次にメモ、最後に<--tl; drで簡単で合理的な解決策があると思います。

Zyavaが指摘したように、翻訳は翻訳を行うモジュールの対象となります。テンプレートはブロックインスタンスでレンダリングされ、ブロックインスタンスには、module_name変換を呼び出すときに使用されるプロパティがあります。ref Mage_Core_Block_Abstract::__()

public function __()
{
    $args = func_get_args();
    $expr = new Mage_Core_Model_Translate_Expr(array_shift($args), $this->getModuleName());
    array_unshift($args, $expr);
    return Mage::app()->getTranslator()->translate($args);
}

module_name(参考文献プロパティは、(通常は)オンデマンドで派生し、クラス名に基づいています::getModuleName()):

public function getModuleName()
{
    $module = $this->getData('module_name');
    if (is_null($module)) {
        $class = get_class($this);
        $module = substr($class, 0, strpos($class, '_Block'));
        $this->setData('module_name', $module);
    }
    return $module;
}

そのため、module_nameプロパティが既に設定されている場合、そのモジュール変換が適用されます。コアレイアウトの既存のブロックの場合、このプロパティはレイアウトXMLを介して設定できます。例えば:

<default>
    <action block="root" method="setModuleName">
        <name>Your_Module</name>
    </action>
</default>

ほら!モジュールCSVは、そのインスタンスの翻訳を所有しています。これアプローチかもしれません。もちろん、ブロックインスタンス(もちろんテンプレートファイルを含む)のモジュール固有のヘルパーを介して他のモジュールの翻訳が適用されるという厄介な状況があり、レイアウトXMLの翻訳には常に当てはまります。また、このアプローチは、module_nameパラメーターを使用するモジュール出力の無効化動作を中断します。

解決

結局のところ、モジュールに対して複数の翻訳ファイルを指定することが可能です。コアでは実行されません(各モジュールは1つの.csvファイルのみを宣言します)が、機能はMage_Core_Model_Translate次のとおりです。

public function getModulesConfig()
{
    if (!Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')) {
        return array();
    }

    $config = Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')->children();
    if (!$config) {
        return array();
    }
    return $config;
}

そして

protected function _loadModuleTranslation($moduleName, $files, $forceReload=false)
{
    foreach ($files as $file) {
        $file = $this->_getModuleFilePath($moduleName, $file);
        $this->_addData($this->_getFileData($file), $moduleName, $forceReload);
    }
    return $this;
}

ファイルのコンテンツがマージされているため(テスト済み)、カスタムCSVでオーバーライドする文字列のみを指定できます。たとえば、製品ページの追加情報文字列を翻訳する場合(Mage_Catalogモジュールによって翻訳される)、次のように機能します。

app / locale / Custom.csv

"Additional Information","More Info, Dude"

あなたのモジュール設定で- 内容が後でマージ<depends />Mage_Catalogれることを保証するためにオンにする必要があります-以下はCustom.csv翻訳ペアをオリジナルの上にマージさせます:

<frontend>
    <translate>
        <modules>
            <Mage_Catalog>
                <files>
                    <additional>Custom.csv</additional>
                </files>
            </Mage_Catalog>
        </modules>
    </translate>
</frontend>

このアプローチの良い点は、上書きする主要な翻訳を1つのファイルに収集できることです。


@Francescoそれが必要です。翻訳キャッシュをクリアしますか?うまくいかないようであれば、これを新しい質問として投稿してください(そして後世のためにここにリンクしてください)。
ベンマーク

$ this> _とヘルパーの両方で機能することを確認します。あなたは正しい、それは私のせいだった(私は以前の誤ったコメントを削除しました)
Fra
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.