TL; DR
翻訳がどのように機能するかの詳細に興味がない場合は、以下の
「翻訳が機能していない場合の確認事項」セクション、特にサブセクション
「モジュールスコープ翻訳の競合のソリューション」までの内容をスキップしてください。
Magento翻訳の概要
Magentoは翻訳ソースを優先します(最高から最低まで):
- DB(
core_translate
テーブル)
- テーマ
translate.csv
ファイル
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
。
シナリオ例では、これによりDDD
(translate.csv
ファイルから)翻訳が行われます。
異なるシナリオでは、関連付けられたブロックが可能性がありますMage_Catalog_Block_Product_View
。この場合、Magentoは最初に翻訳レコードをチェックし、翻訳Mage_Catalog::AAA
を見つけますAAA
。
したがって、実際には、モジュールスコープの翻訳は、一般的な翻訳よりも優先されます。どの変換が使用されるかは、クラスが__()
メソッドの呼び出し元のモジュールに依存します。
翻訳が機能していない場合の確認事項
translate.csv
ファイルからの翻訳が使用されていない場合は、次のチェックリストに従ってください。
- 翻訳キャッシュはオフ/更新されていますか?(解決策:キャッシュをクリアします)
- ある
translate.csv
ファイルには、現在のストアのテーマフォールバックには本当に?(解決策:テーマの構成を修正)
core_translate
テーブルに翻訳の競合する記録がありますか?(解決策:から競合するレコードを削除しますcore_translate
)
- 前の点がすべて原因でない場合は、別のモジュールからの翻訳が競合している必要があります。(解決策:以下を参照)
モジュールスコープの変換の競合のソリューション
最後のケースに該当する場合は、翻訳translate.csv
を行うモジュールのモジュールスコープを使用して、もう一度翻訳を追加します。
この例では、テーマの翻訳AAA
をDDD
介して常に翻訳したい場合は、次のようにしますtranslate.csv
:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
実際には、競合がある場合、つまり翻訳が機能しない場合にのみ、モジュールスコープを翻訳に追加します。
その他の注意事項
インライン翻訳
Magentoのインライン変換機能はcore_translate
、モジュールスコーププレフィックスを使用してカスタム変換をテーブルに追加します。
下位互換性
以前は、テーマの翻訳の優先度は、Magentoバージョン1.3までのデータベースの翻訳よりも高くなりました。
XML翻訳
Magentoは時々のtranslate=""
引数を評価しconfig.xml
、system.xml
XMLをレイアウトして子ノードの値を変換します。
これらのケースでは、module=""
引数を使用して翻訳スコープのモジュールを指定するヘルパークラスを指定できます。XMLに引数が指定されてい
ない場合module
、core/data
ヘルパーを使用して子ノードの値を変換します。
さらに詳しい情報
この投稿でMagentoの翻訳プロセスの詳細について説明しましたが、それはあまり情報を知りたくないからです。
- 翻訳配列が構築されている間のいくつかの技術的な詳細
- モジュールに追加の翻訳ファイルを使用する可能性
core_translate
レコードのストアビュースコープ
- さまざまな翻訳方法を使用する長所と短所
さらに情報が必要な場合は、別の質問をしてください。