diff --git a/i18n_menu/i18n_menu.install b/i18n_menu/i18n_menu.install index d2b768c..e2e0a0a 100644 --- a/i18n_menu/i18n_menu.install +++ b/i18n_menu/i18n_menu.install @@ -45,4 +45,23 @@ function i18n_menu_schema_alter(&$schema) { */ function i18n_menu_update_7000() { // @todo -} \ No newline at end of file +} + +/** + * Set alter property for menu items with language + */ +function i18n_menu_update_7001() { + $query = db_select('menu_links', 'm') + ->fields('m', array('mlid', 'options')) + ->condition('language', LANGUAGE_NONE, '<>'); + foreach ($query->execute()->fetchAll() as $item) { + $options = unserialize($item->options); + if (empty($options['alter'])) { + $options['alter'] = TRUE; + db_update('menu_links') + ->condition('mlid', $item->mlid) + ->fields(array('options' => serialize($options))) + ->execute(); + } + } +} diff --git a/i18n_menu/i18n_menu.module b/i18n_menu/i18n_menu.module index fc2411c..122b91f 100644 --- a/i18n_menu/i18n_menu.module +++ b/i18n_menu/i18n_menu.module @@ -105,13 +105,20 @@ function i18n_menu_menu_link_alter(&$item) { // This should handle language only as the links are being manually updated if (i18n_object_langcode($item)) { $item['options']['langcode'] = $item['language']; + // Set alter property so it can be filtered out later + // on hook_menu_translated_menu_link_alter(). + $item['options']['alter'] = TRUE; } elseif (isset($item['language'])) { unset($item['options']['langcode']); } + else { + // All menu links must have a language property. + $item['language'] = LANGUAGE_NONE; + } // If we are handling custom menu items of menu module and no language is set, // invoke translation via i18n_string module. - if (isset($item['language']) && empty($item['language']) && $item['module'] == 'menu') { + if ($item['language'] == LANGUAGE_NONE && (empty($item['module']) || $item['module'] == 'menu')) { // Set title_callback to FALSE to avoid calling t(). $item['title_callback'] = FALSE; // Setting the alter option to true ensures that @@ -288,13 +295,23 @@ function i18n_menu_mode($name, $mode = NULL) { * @see i18n_menu_menu_link_alter() */ function i18n_menu_translated_menu_link_alter(&$item) { - if (!empty($item['customized']) && empty($item['language']) && !empty($item['access']) && empty($item['hidden']) && empty($item['i18n_menu'])) { - $item['link_title'] = _i18n_menu_link_title($item); - if ($description = _i18n_menu_link_description($item)) { - $item['localized_options']['attributes']['title'] = $description; + // Only process links to be displayed not processed before by i18n_menu. + if (!empty($item['access']) && empty($item['hidden']) && empty($item['i18n_menu'])) { + if (!empty($item['customized']) && !empty($item['language'])) { + $item['title'] = $item['link_title'] = _i18n_menu_link_title($item); + if ($description = _i18n_menu_link_description($item)) { + $item['localized_options']['attributes']['title'] = $description; + } + // Mark to skip localizing twice + $item['i18n_menu'] = TRUE; + } + // Check visibility for links with language. + if (!empty($item['language']) && $item['language'] != LANGUAGE_NONE) { + if ($item['language'] != i18n_language_interface()->language) { + $item['hidden'] = TRUE; + $item['i18n_menu'] = TRUE; + } } - // Mark to skip localizing twice - $item['i18n_menu'] = TRUE; } }