улучшение рабочего процесса для многоязычного сайта


Мой клиент испытывает ужасные трудности с управлением многоязычным контентом в drupal 7. Я использую модуль интернационализации и возможности drupal 7 по умолчанию для управления несколькими языками. Вот пример рабочего процесса, который выполняет мой клиент, с выделенными жирным шрифтом заявлениями, указывающими на проблемы.

  1. Клиент начинает добавлять новое содержимое страницы типа контента. Он заполняет заголовок и выбирает язык как английский.
  2. Клиент нажимает на настройки меню и выбирает Предоставьте ссылку на меню. В разделе Родительский элемент клиент выбирает из раскрывающегося дерева О себе.
  3. Клиент публикует страницу.
  4. Клиент нажимает кнопку Перевести, чтобы перевести страницу.
  5. Клиент нажимает кнопку добавить перевод для французского языка, чтобы увидеть страницу добавления контента.
  6. Клиент замечает, что все поля , кроме настроек меню, заполнены. Это раздражает клиента. Клиент ожидает, что CMS будет знать, что ссылка меню A Propos является французским эквивалентом ссылки меню About, и иметь заполненный соответствующим образом. Но вместо этого клиент должен пройти через сотни ссылок.

Вот еще один пример рабочего процесса, который иллюстрирует большую проблему.

  1. Клиент хочет изменить структуру карты сайта.
  2. Клиент переходит на страницу на АНГЛИЙСКОМ языке в CMS, переходит в настройки меню и изменяет родительский элемент на ссылку Главного меню.
  3. Клиент нажимает кнопку Сохранить.
  4. Клиент переходит на французскую версию той же страницы. Клиенту необходимо повторить процесс родительского элемента но найдите ссылку на меню Accuiel. Это раздражает клиента, потому что клиент ожидает, что CMS будет достаточно умной, чтобы знать, что ссылка на меню Accuiel - это французская версия ссылки на главное меню, и когда английская страница была перемещена из "О" в "Домой", то французская страница должна была переместиться из предложения в Accuiel.

В нынешнем виде клиент чувствует, что он управляет двумя веб-сайтами по отдельности. Может ли кто-нибудь предложить рабочий процесс, который может сократить рабочую нагрузку клиента примерно вдвое? Просто имея drupal, отражающий изменения карты сайта с английского на французский, сократит рабочую нагрузку примерно вдвое.

Author: John, 2011-08-23

2 answers

Насколько я могу судить, это проблема, пункты меню не подключены, поэтому единственное, что их связывает, - это узел, к которому они подключены, и их наборы переводов.

Еще одна возможность, но я никогда не использовал ее подобным образом, состоит в том, чтобы сделать пункты меню переводимыми, и внутри i18n есть модуль, который перенаправляет ссылки на нужный язык.

 1
Author: Attiks, 2011-08-23 21:49:43

Хорошо, я создал хак!!! И очень плохо сделанный взлом тоже. Вот что он делает. Мой хак поместит кнопку над 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.

Вот мой код.....надеюсь, он не слишком глючный...

Добавить в /темы/семь/семь.информация следующая строка

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
Author: John, 2011-08-29 00:13:28