Select to Translate - помощник в переводе сайта

Аватар пользователя leLik leLik 29 сентября 2010 в 17:00

На днях пришла в голову идея простого, но полезного модуля, реализации которого я еще для Друпала не встречал (кстати, если нечто подобное уже имеется - прошу указать). Select to Translate - несложный модуль, позволяющий перевести выделенный мышью текст. Фактически, модуль просто передает выбранный текст стандартному механизму поиска строк для перевода, включенному в базовый набор Друпал. Соответственно для его функционирования должны быть включены такие модули как Locale и Content translation.
В двух словах, модуль действует следующим образом: после выделения текста, фрагмент отправляется с помощью метода jQuery $.ajax() обработчику, который генерирует всплывающий блок со ссылкой на поиск фразы для перевода.

Перейдем к коду.

В файле .info указываем зависимости, необходимые модулю для функционирования, группу, к которой относится наш модуль и версию ядра:

; $Id$
name = Select to Translate
description = Allows you to translate text by mouse selection.
dependencies[] = locale
dependencies[] = translation
package = Multilanguage
core = 6.x

Далее, собственно, основное тело модуля:

<?php
//реализация hook_menu()
function select_to_translate_menu() {
  $items = array();
  $items['transelect'] = array(
    'access arguments' => array('access select_to_translate content'), //указываем, чтобы можно было позволять/запрещать модуль ролям
    'title' => t('Select to Translate'),
    'page callback' => '_select_to_translate',
    'type' => MENU_CALLBACK,
  );
  return $items;
}

function select_to_translate_perm() {
  return array('access select_to_translate content');
}

function select_to_translate_theme() {
   return array(
     'select_to_translate_javascript' => array(
        'arguments' => array(),
     ),
   );  
}

function select_to_translate_init() {
  //добавляем css с правилами для нашего блока
  drupal_add_css(drupal_get_path('module', 'select_to_translate'). '/select_to_translate.css');
  theme('select_to_translate_javascript');
}

function theme_select_to_translate_javascript() {
  global $language;
  $thelang = $language->language;
  //добавляем переменную с активным языком для использования в js-файле модуля
  $js_variables = array('thelang' => $thelang);
  drupal_add_js(array('select_to_translate' => $js_variables), 'setting');
  //добавляем файл скриптов
  drupal_add_js(drupal_get_path('module', 'select_to_translate'). '/select_to_translate.js');
}

//функция-обработчик
function _select_to_translate($text){
  //генерируем ссылку на искомую строку для перевода
  $res = l(t('Translate'), 'admin/build/translate/search?string='. $text, array('attributes' => array('title' => t('Translate selected text'))));
  return drupal_json(array('link' => $res));
  exit;
}

Javascript:

// $Id$
//переменные для сохранения координат мыши после выделения текста
var mouseX = 0;
var mouseY = 0;
Drupal.behaviors.select_to_translate = function (context) {
    if(!window.Drupal){
        Drupal = {};
    }

    Drupal.Selector = {};
    //кросс-броузерный код получения выделенного текста
    Drupal.Selector.getSelected = function(){
        var t = "";
        if(window.getSelection){
            t = window.getSelection();
        }else if(document.getSelection){
            t = document.getSelection();
        }else if(document.selection){
            t = document.selection.createRange().text;
        }
        return t;
    }
    //обработчик события отпускания левой кнопки мыши
    Drupal.Selector.mouseup = function(e){
        if (e.which == 1) //проверка, что была нажата ЛКМ
        {
            var st = Drupal.Selector.getSelected();
            //сохраняем координаты указателя мыши
            mouseX = e.pageX;
            mouseY = e.pageY;
            if (st != ""){
                //отправляем запрос на получение ссылки
                $.ajax({
                    type: 'POST',
                    url: Drupal.settings.basePath + Drupal.settings.select_to_translate.thelang + '/transelect/' +st,
                    success: showTransBlock,
                    dataType: 'json',
                    data: 'js=1'
                });
            }
        }
    }

    $(document).ready(function(){
        //назначаем обработчики событий
        $(document).bind("mouseup", Drupal.Selector.mouseup);
        //убираем блок со ссылкой при клике по свободному месту документа
        $(document).bind("click", function() { $('#translate-it').remove(); });
    });
}

//Показываем блок со ссылкой
var showTransBlock = function (data) {
    uri = data.link.replace('%3F','?').replace('%3D','=');
    $('body').append('<div id="translate-it">' + uri + '</div>');
    var transblock = $('#translate-it');
    //убираем блок, когда мышка покидает его суверенные границы
    transblock.bind("mouseleave", function() { transblock.remove(); });
    transblock.css({left:mouseX+15, top:mouseY-30});
}

Файл стилей:

#translate-it {
    background-color:#8C9ED8;
    border:1px solid #fff;
    -moz-border-radius:5px 5px 5px 5px;
    -webkit-border-radius:5px 5px 5px 5px;
    border-radius:5px 5px 5px 5px;
    padding:3px;
    color:#fff;
    font-size:.8em;
    text-align:center;
    position:absolute;
    z-index:999;
    left:-9999px;
}

#translate-it a {
    color:#fff !important;
}

Вот и все, спасибо за внимание.
Все необходимые файлы прикреплены.

ВложениеРазмер
Иконка пакета select_to_translate.zip2.12 КБ
0 Thanks

Комментарии

Аватар пользователя leLik leLik 29 сентября 2010 в 19:08
"Химический Али" wrote:

Не понимаю зачем бы понадобилось искать родные друпаловские переводы.

Тут цель не поиск родных друпаловских переводов, а передать строку, как если бы вы зашли в интерфейс перевода в друпале и ввели искомую фразу ДЛЯ перевода.

Аватар пользователя P.Selfin@drupal.org P.Selfin@drupal.org 30 сентября 2010 в 14:11

Ром, ну поделись!!!
*с интонацией капризного ребенка*
Только для личных целей юзать буду. Вполне рабочая версия, мелкие недочеты мне по барабану.
зы предыдущий пост достиг получателя ;)

Аватар пользователя php5eng php5eng 31 октября 2010 в 0:39

Автор, почему Вы не создали проект на drupal.org?
Хотя бы с описанием на русском языке. Может потом кто нибудь через issues поможет перевести