web-dev-qa-db-ja.com

多言語サイトのワークフローを改善する

私のクライアントは、drupal 7.で多言語コンテンツを管理するのに大変な時間を費やしています。多言語の管理に国際化モジュールとdrupal 7のデフォルト機能を使用しています。これは、私のクライアントが実行するワークフローの例であり、課題を示す太字のステートメントが含まれています。

  1. クライアントは、コンテンツタイプページの新しいコンテンツを追加し始めます。タイトルを記入し、言語として英語を選択します。
  2. クライアントはメニュー設定をクリックし、[メニューリンクを提供]を選択します。親アイテムの下で、クライアントはドロップダウンツリーからバージョン情報を選択します。
  3. クライアントがページを公開します。
  4. クライアントは[翻訳]をクリックしてページを翻訳します。
  5. クライアントはフランス語の翻訳の追加をクリックして、コンテンツの追加ページを表示します。
  6. クライアントはすべてのフィールドに気づきますメニュー設定が入力されている場合を除きます。これはクライアントを苛立たせます。クライアントは、CMSがA ProposメニューリンクがAboutメニューリンクと同等のフランス語であることを認識し、それに応じて入力されていることを期待します。しかし、代わりに、クライアントは何百ものリンクを通過する必要があります。

ここに、大きな問題を説明する別のワークフロー例があります。

  1. クライアントはサイトマップを再構築したいと考えています。
  2. クライアントはCMSの英語ページに移動し、メニュー設定に移動し、親項目をホームメニューリンクに変更します。
  3. クライアントが[保存]を押します。
  4. クライアントは同じページのフランス語版に移動します。 クライアントは親アイテムのプロセスを繰り返す必要がありますが、Accuielメニューリンクを見つけます。クライアントは、CMSがAccuielメニューリンクがホームメニューリンクのフランス語バージョンであることを認識できるほどスマートであることを期待しているため、クライアントを苛立たせますページがAboutからHomeに移動され、次にフランス語のページがA ProposからAccuielに移動されているはずです。

現在のところ、クライアントは2つのWebサイトを個別に管理しているように感じています。誰かがクライアントのワークロードを約半分に減らすことができるワークフローを提案できますか? drupal英語のサイトマップの変更をフランス語に反映させるだけで、作業負荷が約半分になります。

2
John

わかりました、ハックを作成しました!!!そして、あまりうまく行われていないハックも。これが何をするかです。私のハックはCMS>Add Content>Menu Settings>Parent Itemの上にボタンを配置します。ボタンには「メニュー項目とメイン言語を同期する」と表示されます。したがって、たとえば、AwardsTournaments>Year 2011からAchievements>Celebrationに移動する場合、CMS>A Propos>Menu Settingsに移動して[メニュー項目を主言語と同期]をクリックすると、PrixTournois>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
John

これが問題であると言える限り、メニュー項目は接続されていないので、それらにリンクする唯一のものは、接続先のノードとその翻訳セットを介することです。

もう1つの可能性はありますが、これをこのように使用したことはありません。メニュー項目を翻訳可能にすることであり、i18n内にリンクを正しい言語にリダイレクトするモジュールがあります。

1
Attiks