私のクライアントは、drupal 7.で多言語コンテンツを管理するのに大変な時間を費やしています。多言語の管理に国際化モジュールとdrupal 7のデフォルト機能を使用しています。これは、私のクライアントが実行するワークフローの例であり、課題を示す太字のステートメントが含まれています。
ここに、大きな問題を説明する別のワークフロー例があります。
現在のところ、クライアントは2つのWebサイトを個別に管理しているように感じています。誰かがクライアントのワークロードを約半分に減らすことができるワークフローを提案できますか? drupal英語のサイトマップの変更をフランス語に反映させるだけで、作業負荷が約半分になります。
わかりました、ハックを作成しました!!!そして、あまりうまく行われていないハックも。これが何をするかです。私のハックはCMS>Add Content>Menu Settings>Parent Item
の上にボタンを配置します。ボタンには「メニュー項目とメイン言語を同期する」と表示されます。したがって、たとえば、Awards
がTournaments>Year 2011
からAchievements>Celebration
に移動する場合、CMS>A Propos>Menu Settings
に移動して[メニュー項目を主言語と同期]をクリックすると、Prix
をTournois>Annee 2011
からRéalisations>Célébration
に自動的に移動できます。
ここに私のコードがあります。
/themes/seven/seven.infoに次の行を追加します
scripts[] = lang.js
/themes/seven/lang.js
if (typeof jQuery == 'function'){
jQuery(document).ready(function($) {
var btn = document.createElement('input');
btn.value = 'Synchronize Menu with Main Language';
btn.type = 'button';
btn.style.padding = '5px 15px';
btn.style.border = '1px solid #666';
$(btn).click(mapMenu);
var loading = document.createElement('span');
loading.style.display = 'none';
loading.style.color = 'red';
loading.id = 'loading-sync';
loading.innerHTML = 'loading...';
$('.form-item.form-type-select.form-item-menu-parent').prepend(loading);
$('.form-item.form-type-select.form-item-menu-parent').prepend(btn);
});
}
function mapMenu() {
var sendurl = '/sync-menu/';
var params = 'menu=main-menu&l='+jQuery('#edit-language').val();
// translation already exists, so give nid
if(location.href.match(/^.*node\/\d+.*$/))
{
var nid = location.href.replace(/^.*node\//,'').replace(/\/.*/,'');
params += '&nid='+nid;
}
// no translation exists, so give the source nid
else if(location.href.match(/^.*translation=/))
{
var snid = location.href.replace(/^.*translation=/,'').replace(/&.*$/, '');
params += '&snid='+snid;
}
else
{
alert('No translation available for this menu');
}
jQuery.ajax({ url: sendurl, context: document.body, success: mapMenuCallBack, data:params, type:"GET"});
jQuery('#loading-sync').css('display','inline');
}
function mapMenuCallBack(responseText)
{
jQuery('#loading-sync').css('display','none');
if(!responseText) {alert('No translation available for this menu'); return;}
eval('var obj = '+responseText);
if(obj.plid) jQuery('#edit-menu-parent').val('main-menu:'+obj.plid);
if(obj.weight) jQuery('#edit-menu-weight').val(obj.weight);
}
/sync-menu/index.php
<?php
// this script is a hack to synchronize multilingual menues. i don't have time to learn Drupal 7 and the proper way to do things.
include('../sites/default/settings.php');
$cnx = mysql_connect($databases['default']['default']['Host'], $databases['default']['default']['username'], $databases['default']['default']['password']);
if(!$cnx) die('failed to connect');
$db = mysql_select_db($databases['default']['default']['database'], $cnx);
if(!$db) die('failed to select db');
$arr_translation = array();
//$menu_name = $_GET['menu'];
$menu_name = 'main-menu';
$lang = substr($_GET['l'],0,2);
$nid = isset($_GET['nid']) ? intval($_GET['nid']) : 0;
$src_nid = isset($_GET['snid']) ? intval($_GET['snid']) : 0;
if($nid)
{
$sql = "SELECT tnid FROM `node` WHERE nid = $nid";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
if($row)
{
$src_nid = $row['tnid'];
}
}
if($src_nid && $lang && $menu_name)
{
// find the menu id of source node
$sql = "SELECT * FROM `menu_links` WHERE menu_name = '$menu_name' AND link_path = 'node/$src_nid'";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
if($row)
{
$arr_translation['weight'] = $row['weight'];
// find the parent menu id of source node
$sql = "SELECT * FROM `menu_links` WHERE menu_name = '$menu_name' AND mlid = $row[plid]";
$result= mysql_query($sql);
$row = mysql_fetch_assoc($result);
if(!$row) exit;
// if parent menu item uses a "menu translation"
if($row['i18n_tsid'])
{
$sql = "SELECT * FROM `menu_links` WHERE i18n_tsid = $row[i18n_tsid] AND language = '$lang' AND i18n_tsid <> 0";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
if($row)
{
$arr_translation['plid'] = $row['mlid'];
print json_encode($arr_translation);
}
}
// if parent menu item uses a node translation, find the node it links to, get it's translation, get the relevant menu item
else
{
$src_nid = str_replace('node/','',$row['link_path']);
$sql = "SELECT nid FROM `node` WHERE language = '$lang' AND tnid = $src_nid";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
if($row)
{
$sql = "SELECT mlid FROM `menu_links` WHERE link_path = 'node/$row[nid]'";
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
if($row)
{
$arr_translation['plid'] = $row['mlid'];
print json_encode($arr_translation);
}
}
}
}
}
?>
これが問題であると言える限り、メニュー項目は接続されていないので、それらにリンクする唯一のものは、接続先のノードとその翻訳セットを介することです。
もう1つの可能性はありますが、これをこのように使用したことはありません。メニュー項目を翻訳可能にすることであり、i18n内にリンクを正しい言語にリダイレクトするモジュールがあります。