web-dev-qa-db-ja.com

D7:ローカライズされたメニューをプログラムでインポートする

6つのローカライズバージョン(英語、ドイツ語、ロシア語など)を含むサイトを構築しています。そのため、サイトには、言語間で共通の構造を持つローカライズされたナビゲーションメニューがあるはずです。

いくつかのDrupal API呼び出しが必要なメニュー構造を作成する最も早い方法ですが、メニュー項目をインポートすることを決定しました。したがって、menu_link_save()関数を使用すると、言語フィールドが正しく設定されます...しかし、異なる言語でインポートされたアイテムは互いに混合し、すべて一緒に表示されます:-(

Drupal管理インターフェースを介してインポートしたメニュー項目を開いて保存すると、適切に動作し、サイトがその言語である場合にのみ表示されます。また、この項目の[オプション]データベースフィールドに値が入力されます他のインポートされたアイテムと比較したいくつかの追加データを使用して。

だから私の質問です:メニュー項目をすべての必要なオプションで保存するには、どのi18n APIまたは他の関数を呼び出す必要がありますか?たぶん、メニューを簡単にインポートするより良い方法がありますか?

前もって感謝します!

3
unb

I18nで直接プレイする必要はありません。必要なのは正しい構成です。 translatedlocalizedの項目にも違いがあります。翻訳されたアイテムは別のページを参照している場合があり、(他のカスタマイズに加えて)別の説明がある場合があります。ローカライズされたアイテムは、言語ごとにメニューのタイトルが異なるだけの同じアイテムです。

翻訳済みアイテムが欲しいと思います。ここにいくつかのコメント付きのレシピがあります:

 <?php 
 $menu_item = array(
    'link_title' => 'The menu link title',
    'menu_name'  => 'machine-name-of-the-menu', // It uses '-', not '_'
    'customized' => 1, // Must be 1 in order to not dispaly the link in any language
    'link_path'  => 'node/' . $node->nid, // menu_link_save() does not like aliases. Then 'nid' is used
    'language'  => 'en', // language is required in order to make the item translatable
  );
  $mlid = menu_link_save($menu_item); // You don't need to receive it in a variable
  $ml = menu_link_load($mlid); // I'm loading $mlid just to display the result and verify it
  print_r($ml); // Use print_r() only if you are testing on the block "Execute PHP"

「カスタマイズ」の必要性とパスエイリアスの問題を理解するためにhardの時間がありました。

1
Mac_Weber