This module provides support for multilingual blocks
These are not real blocks, but metablocks that group together a number of normal blocks and display the right one depending on language
In the block administration pages you will find a new tab for creating "Multilingual blocks". Set them up as usual and define which one of the other blocks will be shown for each language.
'); case 'admin/build/block/i18n': return t('These are not real blocks, but metablocks that group together a number of normal blocks and display the right one depending on language
'); } } /** * Implementation of hook_db_rewrite_sql() */ function i18nblocks_db_rewrite_sql($query, $primary_table, $primary_key) { if ($primary_table == 'b' && $primary_key == 'bid') { $return['join'] = 'LEFT JOIN {i18n_blocks_language} i18n ON b.module = i18n.module AND b.delta = i18n.delta'; $return['where'] = i18n_db_rewrite_where('i18n', 'block', 'simple'); return $return; } } /** * Implementation of hook_menu() */ /* function i18nblocks_menu() { $items[] = array('path' => 'admin/build/block/i18n', 'title' => t('Add multilingual block'), 'access' => user_access('administer blocks'), 'callback' => 'i18nblocks_admin', 'type' => MENU_LOCAL_TASK); return $items; } /** * Implementation of hook_block() */ function i18nblocks_block($op = 'list', $delta = 0, $edit = array()) { switch($op) { case 'list': $blocks = array(); $result = db_query("SELECT * FROM {i18n_blocks}"); while ($data = db_fetch_object($result)) { $blocks[$data->i18ndelta]['info'] = $data->info; } return $blocks; case 'view': return i18nblocks_get_block($delta, i18n_get_lang()); break; case 'configure': //return i18nblocks_form(i18nblocks_get_metablock($delta, TRUE), $delta); case 'save': //i18nblocks_save($edit, $delta); break; } } /** * Implementation of hook_locale(). */ function i18nblocks_locale($op = 'groups') { switch ($op) { case 'groups': return array('blocks' => t('Blocks')); } } /** * Implementation of block form_alter(). * * Remove block title for multilingual blocks. */ function i18nblocks_form_alter(&$form, $form_state, $form_id) { if ($form_id == 'block_admin_configure') { $form['i18n'] = array( '#type' => 'fieldset', '#title' => t('Multilingual settings'), '#collapsible' => TRUE, ); // For i18nblocks, just a help text if (($module = $form['module']['#value']) == 'i18nblocks') { $form['i18n']['text'] = array('#value' => t('This is a translatable block.')); // Unset block title unset($form['block_settings']['title']); $form['block_settings']['title'] = array('#type' => 'value', '#value' => ''); } else { $block = i18nblocks_get_language($module, $form['delta']['#value']); $form['i18n'] = array( '#type' => 'fieldset', '#title' => t('Multilingual settings'), '#collapsible' => TRUE, ); // Language options will depend on block type $options = array('' => t('All languages')) + locale_language_list('name'); if ($module == 'block') { $options[I18N_BLOCK_LOCALIZE] = t('Translatable block'); } $form['i18n']['language'] = array( '#type' => 'radios', '#title' => t('Language'), '#default_value' => $block->language, '#options' => $options, ); // Pass i18ndelta value $form['i18n']['i18ndelta'] = array('#type' => 'value', '#value' => $block->i18ndelta); $form['#submit'][] = 'i18nblocks_block_admin_configure_submit'; } } // Content type setting: Optional nodeasblock synchronization /** elseif(module_exists('nodeasblock') && $form_id == 'node_type_form' && isset($form['identity']['type'])) { $form['workflow']['nodeasblockset']['i18n_nodeasblock'] = array( '#type' => 'radios', '#title' => t('Create translation blocks automatically'), '#default_value' => variable_get('i18n_nodeasblock_'. $form['#node_type']->type, 0), '#options' => array(0 => t('Disabled'), 1 => t('Enabled')), '#description' => t('Automatic synchronization with blocks generated by nodeasblock module.'), ); } // Node form with nodeasblock settings elseif (isset($form['type']) && ($node = $form['#node']) && $form['type']['#value'] .'_node_form' == $form_id && variable_get("i18n_nodeasblock_$node->type", 0) && isset($form['nodeasblockset'])) { if ($i18nblock = _i18nblocks_nodeasblock($node)) { $block = i18nblocks_get_metablock($i18nblock['delta']); // Override form default values, but not block title foreach( array('block_settings', 'user_vis_settings', 'role_vis_settings','page_vis_settings') as $category) { if (isset($form['nodeasblockset'][$category])) { foreach(element_children($form['nodeasblockset'][$category]) as $field) { if(isset($block->$field) && $field != 'title') { $form['nodeasblockset'][$category][$field]['#default_value'] = $block->$field; } } } } // Override first level value foreach(array('status', 'region', 'weight', 'visibility', 'pages', 'custom') as $field) { if($form['nodeasblockset'][$field]['#type'] == 'value') { $form['nodeasblockset'][$field]['#value'] = $block->$field; } elseif(isset($form['nodeasblockset'][$field]['#default_value'])) { $form['nodeasblockset'][$field]['#default_value'] = $block->$field; } } $form['nodeasblockset']['i18ntxt'] = array('#value' => t('Some block settings have been overridden by the translation block')); } else { // Prepare a new block $i18nblock = array( 'type' => 'nodeasblock', 'info' => '', 'i18nblocks' => array(), 'delta' => '', 'new' => TRUE ); } $form['i18nblock'] = array('#type' => 'value', '#value' => $i18nblock); } */ } /** * Forms api callback. Submit function */ function i18nblocks_block_admin_configure_submit($form, &$form_state) { $values = $form_state['values']; i18nblocks_set_language($values['module'], $values['delta'], $values['language']); i18nblocks_save($values); } /** * Get block language data */ function i18nblocks_get_language($module, $delta) { $block = db_fetch_object(db_query("SELECT l.*, b.i18ndelta FROM {i18n_blocks_language} l LEFT JOIN {i18n_blocks} b ON l.module = b.module AND l.delta = b.delta WHERE l.module = '%s' AND l.delta = %d", $module, $delta)); // If no result, return default settings return $block ? $block : (object)array('language' => '', 'i18ndelta' => 0); } /** * Set block language data */ function i18nblocks_set_language($module, $delta, $language) { db_query("DELETE FROM {i18n_blocks_language} WHERE module = '%s' AND delta = %d", $module, $delta); if ($language) { db_query("INSERT INTO {i18n_blocks_language} (module, delta, language) VALUES('%s', %d, '%s')", $module, $delta, $language); } } /** * Update i18n block data. Only for localizable blocks */ function i18nblocks_save($values) { dargs(); if ($values['language'] == I18N_BLOCK_LOCALIZE) { $values['info'] = t('[Translatable]'.' '.$values['info']); if ($values['i18ndelta']) { drupal_write_record('i18n_blocks', $values, 'i18ndelta'); } else { drupal_write_record('i18n_blocks', $values); } } else { db_query("DELETE FROM {i18n_blocks} WHERE module = '%s' AND delta = %d", $values['module'], $values['delta']); } } /** * Load and translate block data */ function i18nblocks_get_block($delta, $language){ // Get block metadata $meta = db_fetch_object(db_query("SELECT i.*, b.title FROM {i18n_blocks} i INNER JOIN {blocks} b ON i.delta = b.delta AND i.module = b.module WHERE i.i18ndelta = '%d'", $delta)); // Get block data from module $block = module_invoke($meta->module, 'block', 'view', $meta->delta); if ($block) { // Override the default title if ($meta->title) { // Check plain here to allow module generated titles to keep any markup. $block['subject'] = $meta->title == '