| 1 |
<?php
|
| 2 |
// $Id $
|
| 3 |
|
| 4 |
/**
|
| 5 |
* @file
|
| 6 |
* Author: Sven Decabooter
|
| 7 |
* Provides an easy interface to translate menu items
|
| 8 |
* Parts of the code inspired by i18nmenu module by Jose A. Reyero
|
| 9 |
*/
|
| 10 |
|
| 11 |
/**
|
| 12 |
* Implementation of hook_help().
|
| 13 |
*/
|
| 14 |
function menutranslation_help($section = '') {
|
| 15 |
$output = '';
|
| 16 |
switch ($section) {
|
| 17 |
case "admin/help#menutranslation" :
|
| 18 |
$output = t("Provides an easy interface to translate menu items");
|
| 19 |
break;
|
| 20 |
}
|
| 21 |
return $output;
|
| 22 |
}
|
| 23 |
|
| 24 |
/**
|
| 25 |
* Valid permissions for this module
|
| 26 |
* @return array An array of valid permissions for the module
|
| 27 |
*/
|
| 28 |
function menutranslation_perm() {
|
| 29 |
return array('translate menus', 'administer menutranslation');
|
| 30 |
}
|
| 31 |
|
| 32 |
/**
|
| 33 |
* Implementation of hook_menu().
|
| 34 |
*/
|
| 35 |
function menutranslation_menu($may_cache) {
|
| 36 |
$items = array();
|
| 37 |
if ($may_cache) {
|
| 38 |
$items[] = array(
|
| 39 |
'path' => 'admin/settings/menutranslation',
|
| 40 |
'title' => t('Menu Translation'),
|
| 41 |
'description' => t('Provides an easy interface to translate menu items'),
|
| 42 |
'callback' => 'drupal_get_form',
|
| 43 |
'callback arguments' => 'menutranslation_admin',
|
| 44 |
'access' => user_access('administer menutranslation'),
|
| 45 |
'type' => MENU_NORMAL_ITEM
|
| 46 |
);
|
| 47 |
$items[] = array(
|
| 48 |
'path' => 'admin/build/menu/menutranslation',
|
| 49 |
'title' => t('Menu Translation'),
|
| 50 |
'callback' => 'menutranslation_page',
|
| 51 |
'access' => user_access('translate menus'),
|
| 52 |
'type' => MENU_LOCAL_TASK
|
| 53 |
);
|
| 54 |
}
|
| 55 |
else {
|
| 56 |
menutranslation_translate_menus();
|
| 57 |
}
|
| 58 |
return $items;
|
| 59 |
}
|
| 60 |
|
| 61 |
function menutranslation_admin() {
|
| 62 |
$form = array();
|
| 63 |
$menu_options = menu_get_root_menus();
|
| 64 |
|
| 65 |
$form['menutranslation_menu'] = array(
|
| 66 |
'#type' => 'select',
|
| 67 |
'#title' => t('Menu(s) to translate'),
|
| 68 |
'#default_value' => variable_get('menutranslation_menu', 0),
|
| 69 |
'#options' => $menu_options,
|
| 70 |
'#multiple' => true,
|
| 71 |
'#size' => count($menu_options),
|
| 72 |
'#description' => t('Select which menu(s) should be translatable. Hold Shift key to select multiple items.')
|
| 73 |
);
|
| 74 |
|
| 75 |
menu_rebuild();
|
| 76 |
|
| 77 |
return system_settings_form($form);
|
| 78 |
}
|
| 79 |
|
| 80 |
function menutranslation_page($mid = 0, $lang = NULL) {
|
| 81 |
$output = '';
|
| 82 |
if ($mid != 0 && $lang == NULL) {
|
| 83 |
// show add/edit form
|
| 84 |
$output .= _menutranslation_lang_list($mid);
|
| 85 |
}
|
| 86 |
elseif ($mid != 0 && $lang != NULL) {
|
| 87 |
// show translation form
|
| 88 |
$output .= _menutranslation_translate($mid, $lang);
|
| 89 |
}
|
| 90 |
else {
|
| 91 |
// show menu item list
|
| 92 |
if ($selected_menus = variable_get('menutranslation_menu', array())) {
|
| 93 |
foreach ($selected_menus as $mid) {
|
| 94 |
$output .= theme('menutranslation_menutable',$mid);
|
| 95 |
}
|
| 96 |
}
|
| 97 |
else {
|
| 98 |
drupal_set_message('Please select a menu that you want to translate in the <a href="/admin/settings/menutranslation">menutranslation settings</a>.', 'error');
|
| 99 |
}
|
| 100 |
}
|
| 101 |
return $output;
|
| 102 |
}
|
| 103 |
|
| 104 |
function theme_menutranslation_menutable($mid) {
|
| 105 |
$header = array(t('Menu item'), t('Operations'));
|
| 106 |
$menu = menu_get_item($mid);
|
| 107 |
$rows = array();
|
| 108 |
_menutranslation_render_rows($rows, $menu, 0);
|
| 109 |
$table = theme('table', $header, $rows);
|
| 110 |
$output .= theme('box', $menu['visible'][$mid]['title'], $table);
|
| 111 |
return $output;
|
| 112 |
}
|
| 113 |
|
| 114 |
function _menutranslation_render_rows(&$rows, $menu = NULL, $depth = 0) {
|
| 115 |
$curr_depth = $depth;
|
| 116 |
if (isset($menu['children'])) {
|
| 117 |
$depth++;
|
| 118 |
foreach ($menu['children'] as $mid) {
|
| 119 |
$menu = menu_get_item($mid);
|
| 120 |
$rows[] = array(array('data' => theme('menutranslation_show_depth',$curr_depth) . $menu['title']), array('data' => l(t('add/edit translation'), 'admin/build/menu/menutranslation/'. $mid)));
|
| 121 |
_menutranslation_render_rows($rows, $menu, $depth);
|
| 122 |
}
|
| 123 |
}
|
| 124 |
}
|
| 125 |
|
| 126 |
function theme_menutranslation_show_depth($depth) {
|
| 127 |
$depthstring = '';
|
| 128 |
if ($depth > 0) {
|
| 129 |
for ($i=1;$i<$depth;$i++) {
|
| 130 |
$depthstring .= ' ';
|
| 131 |
}
|
| 132 |
$depthstring .= '- ';
|
| 133 |
}
|
| 134 |
return $depthstring;
|
| 135 |
}
|
| 136 |
|
| 137 |
function _menutranslation_lang_list($mid) {
|
| 138 |
if (is_numeric($mid)) {
|
| 139 |
$menu_item = menu_get_item($mid);
|
| 140 |
$sql_title = "SELECT title FROM {menu} WHERE mid = '%d'";
|
| 141 |
$result = db_fetch_array(db_query($sql_title, $mid));
|
| 142 |
$title = $result['title'];
|
| 143 |
return theme('menutranslation_translationtable',$mid,$title);
|
| 144 |
}
|
| 145 |
}
|
| 146 |
|
| 147 |
function theme_menutranslation_translationtable($mid,$title){
|
| 148 |
// set breadcrumb
|
| 149 |
drupal_set_breadcrumb(array(l(t('Home'), NULL), l(t('Administer'), 'admin'), l(t('Menutranslation'), 'admin/build/menu/menutranslation')));
|
| 150 |
// set title
|
| 151 |
drupal_set_title(t('Translation for menu item') .'<em> '. $title .'</em>');
|
| 152 |
// get languages
|
| 153 |
$languages = _i18n_locale_supported_languages();
|
| 154 |
$translation_arr = array();
|
| 155 |
$header = array(t('Language'), t('Translation'), t('Operations'));
|
| 156 |
foreach ($languages as $lang => $lang_name) {
|
| 157 |
$translation = _menutranslation_get_translation($mid,$lang);
|
| 158 |
$label = ($translation != t('n/a'))?t('edit translation'):t('create translation');
|
| 159 |
$rows[] = array(array('data' => $lang_name), array('data' => $translation), array('data' => l($label, 'admin/build/menu/menutranslation/'. $mid .'/'. $lang)));
|
| 160 |
}
|
| 161 |
return theme('table', $header, $rows);
|
| 162 |
}
|
| 163 |
|
| 164 |
function _menutranslation_get_translation($mid,$lang){
|
| 165 |
$sql = "SELECT title FROM {menutranslation} WHERE mid = '%d' AND lang = '%s'";
|
| 166 |
$result = db_fetch_array(db_query($sql, $mid, $lang));
|
| 167 |
$translation = ($result['title'] != NULL)?$result['title']:t('n/a');
|
| 168 |
return $translation;
|
| 169 |
}
|
| 170 |
|
| 171 |
function _menutranslation_translate($mid, $lang) {
|
| 172 |
$sql_title = "SELECT title FROM {menu} WHERE mid = '%d'";
|
| 173 |
$result = db_fetch_array(db_query($sql_title, $mid));
|
| 174 |
drupal_set_breadcrumb(array(l(t('Home'), NULL), l(t('Administer'), 'admin'), l(t('Menutranslation'), 'admin/build/menu/menutranslation'), l(t('Translation for menu item @item', array('@item' => $result['title'])), 'admin/build/menu/menutranslation/'. $mid)));
|
| 175 |
$lang_arr = _i18n_locale_supported_languages();
|
| 176 |
drupal_set_title($lang_arr[$lang] .' translation:');
|
| 177 |
return drupal_get_form('menutranslation_form', $mid, $lang);
|
| 178 |
}
|
| 179 |
|
| 180 |
function menutranslation_form($mid, $lang) {
|
| 181 |
$sql = "SELECT title FROM {menutranslation} WHERE mid = '%d' AND lang = '%s'";
|
| 182 |
$result = db_fetch_array(db_query($sql, $mid, $lang));
|
| 183 |
$mode = ($result)?'update':'insert';
|
| 184 |
$form['translation'] = array(
|
| 185 |
'#type' => 'textfield',
|
| 186 |
'#title' => t('Translation'),
|
| 187 |
'#default_value' => $result['title'],
|
| 188 |
'#size' => 60,
|
| 189 |
'#maxlength' => 64,
|
| 190 |
'#description' => t('Specify the translation for this menu item'),
|
| 191 |
);
|
| 192 |
$form['mid'] = array('#type' => 'hidden', '#value' => $mid);
|
| 193 |
$form['lang'] = array('#type' => 'hidden', '#value' => $lang);
|
| 194 |
$form['mode'] = array('#type' => 'hidden', '#value' => $mode);
|
| 195 |
$form['submit'] = array(
|
| 196 |
'#type' => 'submit',
|
| 197 |
'#value' => t('Save'),
|
| 198 |
);
|
| 199 |
return $form;
|
| 200 |
}
|
| 201 |
|
| 202 |
|
| 203 |
function menutranslation_form_submit($form_id, $form_values) {
|
| 204 |
if ($form_values['mode'] == 'insert') {
|
| 205 |
db_query("INSERT INTO {menutranslation} (mid, lang, title) VALUES (%d, '%s', '%s')", $form_values['mid'], $form_values['lang'], $form_values['translation']);
|
| 206 |
}
|
| 207 |
elseif ($form_values['mode'] == 'update') {
|
| 208 |
db_query("UPDATE {menutranslation} SET title = '%s' WHERE mid = %d AND lang = '%s'", $form_values['translation'], $form_values['mid'], $form_values['lang']);
|
| 209 |
}
|
| 210 |
cache_clear_all(NULL, 'cache_menu');
|
| 211 |
drupal_goto('admin/build/menu/menutranslation/'. $form_values['mid']);
|
| 212 |
}
|
| 213 |
|
| 214 |
function menutranslation_translate_menus() {
|
| 215 |
global $_menu;
|
| 216 |
global $user;
|
| 217 |
global $locale;
|
| 218 |
$cid = "$user->uid:$locale";
|
| 219 |
cache_clear_all($cid, 'cache_menu');
|
| 220 |
foreach ($_menu['items'] as $mid => $item) {
|
| 221 |
if (($item['type'])) {
|
| 222 |
$sql = "SELECT title FROM {menutranslation} WHERE mid = '%d' AND lang = '%s'";
|
| 223 |
$result = db_fetch_array( db_query( $sql, $mid, $locale ) );
|
| 224 |
$title = $result['title'];
|
| 225 |
if ($title) {
|
| 226 |
$_menu['items'][$mid]['title'] = $title;
|
| 227 |
}
|
| 228 |
}
|
| 229 |
}
|
| 230 |
cache_set($cid, 'cache_menu', serialize($_menu), time() + (60 * 60 * 24));
|
| 231 |
}
|