デザインテンプレートパッケージCSVに翻訳を実装する方法は?echo $ this-> __( 'Text')はどのように機能しますか?


29

次のようなデザインパッケージをセットアップしています。

design/frontend/package_name/theme_name/locale/

私が持っている下

de_DEen_GBなど、私が対応している下で、translate.csvさまざまな文字列を含むファイル:"Key", "Translation"

私はテーマにさまざまな文字列を実装しようとしています echo $this->__('Text')

ただし、機能していないようです(('Text')表示されているのは文字列のみです)。Magentoが翻訳対象のCSVから文字列を取得するときの基本的な理解が不足していると思います。誰かがこれらのcsvファイルを動作させる方法を説明できますか?


どのバージョンのMagentoを実行していますか?
philwinkle

Magento vを使用しています:1.7.0.2
ワッフル

これを通常のmagentoテンプレートファイルの外部で呼び出していますか?たぶん、ヘルパークラスを呼び出して<?php echo Mage :: helper( 'core')-> __( 'Text');のようにする必要があります。?>また、[システム]> [構成]> [開発者]
-SaveTheMage

回答:


84

TL; DR

翻訳がどのように機能するかの詳細に興味がない場合は、以下の
「翻訳が機能していない場合の確認事項」セクション、特にサブセクション
「モジュールスコープ翻訳の競合のソリューションまでの内容をスキップしてください

Magento翻訳の概要

Magentoは翻訳ソースを優先します(最高から最低まで):

  1. DB(core_translateテーブル)
  2. テーマtranslate.csvファイル
  3. app/locale/*/*.csvファイル

翻訳配列はどのように構築されますか?

モジュール翻訳

最初にapp/locale/*/*.csv、アクティブなモジュールetc/config.xmlファイルから参照されているすべてのファイルが解析されます。プロセスのウォークスルーは
次のとおりです。Magentoが次のconfig.xmlセクションを見つけたと仮定します。

<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
    <translate>
        <modules>
            <Mage_Catalog>
                <files>
                    <default>Mage_Catalog.csv</default>
                </files>
            </Mage_Catalog>
        </modules>
    </translate>
</frontend>

また、そのファイルでは、現在のストアビューに設定されたロケールに対して次の翻訳が指定されています。

"AAA","BBB"

このような状況では、Magentoは翻訳配列に次のレコードを作成します。

array(
    "AAA" => "BBB",
    "Mage_Catalog::AAA" => "BBB"
)

2番目の値はModule Scope Translationです。接頭辞付きのモジュール名は、翻訳ファイル宣言を含む構成XMLノードから取得されます。

同じ翻訳が2番目のモジュールファイルによって再び指定された場合、たとえばSome_Module.csv、翻訳がの"AAA","CCC"場合、設定は上書きされません"AAA"。代わりに、2番目のモジュール名を持つ新しいレコードのみを追加します"Some_Module::AAA" => "CCC"

開発者モードが有効になっている場合、別のモジュール変換で同じキーを持つ2番目のレコードが見つかると、レコードの設定解除さ"AAA"れます。これにより、開発中にモジュール変換の競合を簡単に見つけることができます。

テーマ翻訳

次に、translate.csv現在のロケールのテーマフォールバックの最初のファイルから読み込まれた翻訳は、翻訳配列内の既存のレコードを単純に置き換えます。
したがって、前の例を続けると、translate.csvレコード"AAA","DDD"は次の翻訳データにつながります。

array(
    "AAA" => "DDD", // This is overwritten by the translate.csv file
    "Mage_Catalog::AAA" => "BBB",
    "Some_Module::AAA" => "CCC"
)

もちろんtranslate.csv、新しい翻訳キーを持つレコードは配列に追加されます。

データベース翻訳

core_translateテーブルからの翻訳は、基本的にテーマの翻訳と同様に翻訳配列にマージされます。
モジュールまたはテーマの翻訳からの既存のキーは、データベースレコードによって上書きされ、新しいキーが追加されます。

翻訳検索

場合__()メソッドが呼び出され、Magentoのは、最初の現在のモジュールに一致する配列に翻訳を探し。
現在のモジュールは、__()クラスが呼び出されるクラス名によって決定されます。たとえば、ブロック内の責任メソッドは次のようになります。

// Excerpt from Mage/Core/Block/Abstract.php
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;
}

ヘルパーとコントローラーのメソッドはそれに応じて機能します。

ルックアップシナリオの例

例として、lets say $this->__('AAA')はテンプレートファイルで呼び出されます。関連するブロックのタイプがの場合Mage_Core_Block_Template、Magentoは最初にMage_Core::AAAレコードをチェックします。見つからない場合、キーの翻訳にフォールバックしますAAA
シナリオ例では、これによりDDDtranslate.csvファイルから)翻訳が行われます。

異なるシナリオでは、関連付けられたブロックが可能性がありますMage_Catalog_Block_Product_View。この場合、Magentoは最初に翻訳レコードをチェックし、翻訳Mage_Catalog::AAAを見つけますAAA

したがって、実際には、モジュールスコープの翻訳は、一般的な翻訳よりも優先されます。どの変換が使用されるかは、クラスが__()メソッドの呼び出し元のモジュールに依存します。

翻訳が機能していない場合の確認事項

translate.csvファイルからの翻訳が使用されていない場合は、次のチェックリストに従ってください。

  1. 翻訳キャッシュはオフ/更新されていますか?(解決策:キャッシュをクリアします)
  2. あるtranslate.csvファイルには、現在のストアのテーマフォールバックには本当に?(解決策:テーマの構成を修正)
  3. core_translateテーブルに翻訳の競合する記録がありますか?(解決策:から競合するレコードを削除しますcore_translate
  4. 前の点がすべて原因でない場合は、別のモジュールからの翻訳が競合している必要があります。(解決策:以下を参照)

モジュールスコープの変換の競合のソリューション

最後のケースに該当する場合は、翻訳translate.csv 行うモジュールのモジュールスコープを使用して、もう一度翻訳を追加します。
この例では、テーマの翻訳AAADDD介して常に翻訳したい場合は、次のようにしますtranslate.csv

"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"

実際には、競合がある場合、つまり翻訳が機能しない場合にのみ、モジュールスコープを翻訳に追加します。

その他の注意事項

インライン翻訳

Magentoのインライン変換機能はcore_translate、モジュールスコーププレフィックスを使用してカスタム変換をテーブルに追加します。

下位互換性

以前は、テーマの翻訳の優先度は、Magentoバージョン1.3までのデータベースの翻訳よりも高くなりました。

XML翻訳

Magentoは時々のtranslate=""引数を評価しconfig.xmlsystem.xmlXMLをレイアウトして子ノードの値を変換します。
これらのケースでは、module=""引数を使用して翻訳スコープのモジュールを指定するヘルパークラスを指定できます。XMLに引数が指定されてい
ない場合modulecore/dataヘルパーを使用して子ノードの値を変換します。

さらに詳しい情報

この投稿でMagentoの翻訳プロセスの詳細について説明しましたが、それはあまり情報を知りたくないからです。

  • 翻訳配列が構築されている間のいくつかの技術的な詳細
  • モジュールに追加の翻訳ファイルを使用する可能性
  • core_translateレコードのストアビュースコープ
  • さまざまな翻訳方法を使用する長所と短所

さらに情報が必要な場合は、別の質問をしてください。


1
わかりました。すみませんが、すみませんが、他の誰かが私に言わずにキャッシュをオンにしました。ため息。この情報は、Magentoの翻訳プロセスを理解する上で非常に役立ちました。多くの感謝、これは間違いなく私は__()関数がどのように機能するかについて持っていたすべての質問に答えます。
ワッフル

Magentoの翻訳アーキテクチャの概要については、gist.github.com
antonmakarenko

@Vinai、素晴らしい答え。ここで質問を投稿した翻訳の問題を解決するのに本当に役立ちまし。驚いたことに、Mage_Taxは私のテーマの翻訳と矛盾していました。これは、Magentoが翻訳に優先順位を付けることを意図している方法に反しているようです
Holly 14年

14

翻訳ソース

翻訳はさまざまなソースからマージされます。それぞれのXMLファイルからのモジュール翻訳、現在のテーマからのテーマ翻訳translate.csv、およびデータベースからのインライン翻訳

翻訳は厳密にモジュール固有にすることができます(モジュール内でのみ有効)。これは常にインライン翻訳の場合であり、オプションでテーマ翻訳の場合も同様です。これを実現するには、translate.csvでモジュールプレフィックスを使用してそれらを定義する必要があります。

"Mage_Catalog::Add to cart","In die Einkaufstüte legen"

Mage_Catalog.csvDEVELOPER MODEがオンになっている場合、モジュールからの翻訳(など)は厳密にモジュール固有です。それ以外の場合、最初にロードされたモジュールからの翻訳は、テキストに対する独自の翻訳を持たないすべてのモジュールに対してグローバルに使用されます。

異なるソースからの各テキストが翻訳配列にマージされる方法を示すフローチャートを組み立てました。

翻訳マージ data は翻訳配列です

イービルエッジケース

翻訳された文字列が未翻訳の文字列と等しい場合、翻訳は無視されます。一見便利な最適化のように思えますが、この方法では、変更された翻訳が唯一のものでグローバルになるため、あるモジュールでは変更せずに別のモジュールで変更した文字列を簡単に翻訳することはできません。

翻訳検索

どのモジュールの翻訳が検索されるかは、メソッド__()が呼び出されたクラスのモジュールに依存します。次に、変換配列のルックアップは次のとおりです。

翻訳検索 data は翻訳配列です

スコープ定義

1つのクラスのモジュールを変更する可能性があります。これは、ブロックとヘルパーに特に役立ちます。ベストプラクティスは、コアクラスを書き換えるときに常にモジュール名を明示的に設定することです。動作方法は、ヘルパー、ブロック、コントローラーによって異なります(Magento CE 1.9.1以降)

ブロックの例:

class IntegerNet_AwesomeModule_Block_Catalog_Product extends Mage_Catalog_Block_Product
{
    public function getModuleName()
    {
        return 'Mage_Catalog';
    }
}

ブロックの場合module_name、レイアウトXMLでパラメーターを設定することもできます。

<block type="integernet_awesomemodule/catalog_product" name="test" module_name="Mage_Catalog" />

ヘルパーの例:

class IntegerNet_AwesomeModule_Helper_Catalog extends Mage_Catalog_Helper_Data
{
    protected $_moduleName = 'Mage_Catalog';
}

フロントエンドコントローラーの場合_realModuleName、管理コントローラーのプロパティを設定できます_usedModuleName(一貫性を保つため)

その他の翻訳方法

XMLファイル(config.xml、system.xml、レイアウト)で、ノードをtranslate属性で変換するかどうかを指定できます。またmodule、スコープを指定する属性を追加する必要がありますが、ここでの値は上記のモジュール名ではなく、ヘルパーエイリアスである必要があります。

<one_column module="page" translate="label">
    <label>1 column</label>
    <template>page/1column.phtml</template>
    <layout_handle>page_one_column</layout_handle>
    <is_default>1</is_default>
</one_column>

JavaScriptでは、Translatorグローバルに利用可能なオブジェクトを使用できます。

Translator.translate('Please wait, loading...');

ただし、JavaScriptで使用する翻訳を翻訳者オブジェクトで使用できるようにする必要があります。これは、モジュールjstranslator.xmletcディレクトリ内のファイルを介して行われます。

<?xml version="1.0"?>
<jstranslator>
    <loading translate="message" module="core">
        <message>Please wait, loading...</message>
    </loading>
</jstranslator>

loading任意の文字列を指定できますが、グローバルに一意である必要があります。translateおよびmodule属性は、他のXMLファイルのように使用されています。の値messageとその翻訳がJS Translatorオブジェクトに追加されます。

トラブルシューティング

複雑なルールをすべて知っていても、翻訳がそのまま機能している(または機能していない)理由がわかりにくい場合があります。これを簡単にするために、翻訳の出所を示す「翻訳ヒント」モジュールを開発しました。

ここで入手:https : //github.com/schmengler/TranslationHints

スクリーンショット: 翻訳のヒント


私のブログ投稿とトピックに関するスライドに基づいて:


2
無料のYireo EmailOverrideモジュールを使用すると、テーマにカスタムCSVモジュールファイルも配置できることを言及して、スパムを送信しないことを願っています。translate.csvだけではありません。
Jisse Reitsma

6

キャッシュをクリアしましたか?

システムは、テストしているファイルのロケールに設定されていますか?

Magentoは、テーマの翻訳を読み込むときに探しているファイルを見つけることができますか(一時的なvar_dump; exit;ステートメントが役立つはずです)。

#File: app/code/core/Mage/Core/Model/Translate.php
protected function _loadThemeTranslation($forceReload = false)
{
    $file = Mage::getDesign()->getLocaleFileName('translate.csv');
    $this->_addData($this->_getFileData($file), false, $forceReload);
    return $this;
}

_getTranslatedStringメソッドは、データ配列で探しているものを見つけることができますか?

#File: app/code/core/Mage/Core/Model/Translate.php
protected function _getTranslatedString($text, $code)
{
    $translated = '';
    if (array_key_exists($code, $this->getData())) {
        $translated = $this->_data[$code];
    }
    elseif (array_key_exists($text, $this->getData())) {
        $translated = $this->_data[$text];
    }
    else {
        $translated = $text;
    }
    return $translated;
}

どのキャッシュもアクティブではありません。システムがロケールに設定されているかどうかはわかりませんが、それに応じて(ショップを変更することにより)特定のテンプレートファイルで翻訳が機能します。例えば、私の中の文字列translate.csvで正しく翻訳物/app/design/frontend/package_name/default/template/catalog/product/view.phtmlではなく、中/app/design/frontend/package_name/default/template/page/html/topmenu.phtml
waffl

あなたは正しかった、誰かが私に言わずにキャッシュをオンにした。おopび申し上げます。情報をありがとうございます。
ワッフル

3
@waffl謝罪する必要はありません—すべてのMagento開発者は、少なくとも週に1回はそれを行うと思います。
アランストーム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.