Rahul Seth
Rahul Seth

Reputation: 453

How to create multilingual menu link programmatically in Drupal 7

I'm trying to create the menu link programmatically. But its not working where source language is other than english. Here is my code.

 $language_list = language_list();
 foreach ($language_list as $language_code => $language_object) {
   $menu_item = array(
      'link_title' => t('Fruit'),
      'menu_name' => 'menu-main-footer',
      'customized' => 1,
      'link_path' => $custom_path,
      'language' => $language_code,
      'weight' => 30,
    );
    menu_link_save($menu_item);
  }

Any one have some idea on this?

Upvotes: 0

Views: 1154

Answers (2)

jteks
jteks

Reputation: 641

I had to migrate an old menu to a new one with its localized translations so here is what I did :

$old_name = 'menu-old';
$new_name = 'menu-new';
$old_menu = menu_load($old_name);
if(isset($old_menu)){
  $old_mlids = db_query("SELECT mlid from {menu_links} WHERE menu_name=:menu_name", array(':menu_name' => $old_name))->fetchAll();
  if(!empty($old_mlids)){
    // Clean existing items in new menu.
    $new_mlids = db_query("SELECT mlid from {menu_links} WHERE menu_name=:menu_name", array(':menu_name' => $new_name))->fetchAll();
    if(!empty($new_mlids)){
      foreach($new_mlids as $record){
        menu_link_delete($record->mlid);
      }
    }
    // Copy old to new menu.
    foreach($old_mlids as $record){
      $old_menu_item = menu_link_load($record->mlid);
      $new_menu_item_config = array(
        'link_title' => $old_menu_item['link_title'],
        'link_path' => $old_menu_item['link_path'],
        'menu_name' => $new_name,
        'customized' => 1,
        'weight' => $old_menu_item['weight'],
        'expanded' => $old_menu_item['expanded'],
        'options' => $old_menu_item['options'],
      );
      $new_menu_item = $new_menu_item_config;
      menu_link_save($new_menu_item);

      // Migrate translations.
      $languages = language_list('enabled')[1];
      foreach($languages as $lang_code => $language_object){
        if ($lang_code == language_default('language')) {
          continue;
        }

        $translation_value = i18n_string_translate('menu:item:'.$old_menu_item['mlid'].':title', $old_menu_item['link_title'], array('langcode' => $lang_code));
        if($translation_value != $old_menu_item['link_title']){
          i18n_string_translation_update('menu:item:'.$new_menu_item['mlid'].':title', $translation_value, $lang_code, $old_menu_item['link_title']);
        }
      }
    }
  }
  // Delete old menu.
  menu_delete(array('menu_name' => $old_name));
}

Upvotes: 0

Rahul Seth
Rahul Seth

Reputation: 453

I changed my code. And it work for me.

 // Create menu translation set.
 $menu_translation_set = i18n_translation_set_create('menu_link');

  // Create translated menu link for all site enable language.
  $language_list = language_list();
  foreach ($language_list as $language_code => $language_object) {

     // Add Fruit link in menu-main-footer.
     // 'change-fruit' is node title.
     $fruit_path = drupal_get_normal_path('change-fruit', $language_code);
     if (!menu_link_get_preferred($fruit_path, 'menu-main-footer')) {
       $menu_item = array(
         'link_title' => t('fruit'),
         'menu_name' => 'menu-main-footer',
         'customized' => 1,
         'link_path' => $fruit_path,
         'language' => $language_code,
         'weight' => 30,
         'i18n_tsid' => $menu_translation_set->tsid,
       );
       menu_link_save($menu_item);
       $menu_translation_set->add_item($menu_item, $language_code);
       $menu_translation_set->save();
     } 
  }

May be helpful to other.

Upvotes: 1

Related Questions