移动互联网产品运营
« »
2010年08月15日 产品体验

调用Google Ajax API实现划词翻译

醉意游人调用google Ajax api实现划词翻译,我觉得很有搞头,就顺着他的路子继续走了下去。今天折腾一天,算是把想法都实践出来。

上传到网络的地址是:http://liuyangzi.com/uploads/translate.html,欢迎点击试用。

一、调用google ajax api实现中英文互译

在网页 添加Google AJAX 语言 API,需要添加Google AJAX API 脚本标签并调用 google.load("language", "1")


<script type="text/javascript" src="http://www.google.com/jsapi"></script> 

<script type="text/javascript"> 

  google.load("language", "1"); 

</script>

调用google翻译需要两个容器,传递要翻译的内容和翻译结果。这里使用为什么使用两个函数呢,translate()和translateAll(),划词翻译和全文翻译的目的。


   function translate(input,output) {
      google.language.detect(input, function(result) {
        if (!result.error && result.language) {
          google.language.translate(input,src,dest,
              function(result) {
            var translated = document.getElementById("translation");
            if (result.translation) {
              output.innerHTML = result.translation;}
          }); }}); }

 function translateAll(){
    var input = detailContent.innerHTML;
    var output=document.getElementById("destination");
  }

我在页面添加了一个下拉框,允许选择“英译汉”和“汉译英”。


<select id="langpair"> 
    <option value="en|zh-CN">英译汉</option>
    <option value="zh-CN|en">汉译英</option>  
</select>

但是google.language.translate()如何知道是汉译英还是英译汉呢。下面的代码就解决了这个问题。


  var langpair = document.getElementById('langpair');   
  var pair = langpair.options[langpair.selectedIndex].value.split('|');   
  var src = pair[0]; var dest = pair[1];   

划词翻译后的文本放在哪,这里主要是采用生成一个follow_mouse的对象来实现。

<style>
 #follow_mouse{border:1px solid #4D3939; padding:5px; display:none; background:#E28A8A; width:500px; position:absolute;}
</style>

划词翻译要实现划词的功能,首先需要给textarea添加鼠标事件

 <textarea  id="source" onKeyup="savePos(this)" onMouseDown="savePos(this)"
 onMouseUp="initialize(this)" onFocus="savePos(this)"></textarea>

然后具体定义鼠标事件

     function savePos(textBox){
         if(typeof(textBox.selectionStart) == "number"){
             start = textBox.selectionStart;
             end = textBox.selectionEnd;
         }
         else if(document.selection){
             var range = document.selection.createRange();
             if(range.parentElement().id == textBox.id){
                 var range_all = document.body.createTextRange();
                 range_all.moveToElementText(textBox);
                 for (start=0; range_all.compareEndPoints("StartToStart", range) < 0; start++)
                     range_all.moveStart('character', 1);
                 for (var i = 0; i <= start; i ++){
                     if (textBox.value.charAt(i) == '\n')
                         start++;
                 }
                  var range_all = document.body.createTextRange();
                  range_all.moveToElementText(textBox);
                  for (end = 0; range_all.compareEndPoints('StartToEnd', range) < 0; end ++)
                      range_all.moveStart('character', 1);
                      for (var i = 0; i <= end; i ++){
                          if (textBox.value.charAt(i) == '\n')
                              end ++;
                      }
                 }
             }
     }
 function initialize(textBox){
  clearTimeout(timer);
  savePos(textBox);
  var text=detailContent.value;
  var output=document.getElementById("follow_mouse");
  var input=text.substring(start,end);
  if(input!=""){
   output.style.top=mousePos.y+20+"px";
   output.style.left=mousePos.x+"px";
   output.style.display="block";
   translate(input,output);
   timer=setTimeout(function(){
    output.style.display="none";
    output.innerHTML="正在翻译...";
   },2000);
  }  
 }

下一步就是对选中的文字翻译了

function getSelectedText() {
    if (window.getSelection) {
        return window.getSelection().toString();
    }

    else if (document.getSelection) {
        return document.getSelection();
    }

    else if (document.selection) {
        return document.selection.createRange().text;
    } 

}

二、音译
音译的意思是说比如我们中文说“三个妞”,可能音译成英语就是“Thank you”了。
比较可惜的是目前google音译api还不支持中文,阻扰了我的进一步探究。
使用音译api同理需要先加载google ajax api的js代码。这里贴出音译的完整代码。

<!DOCTYPE html public "-//W3C//DTD XHTML 1.0 Transitional//EN""<a href="http://www.w3.org/TR/xhtml/DTD/xhtmll-transitional.dtd">http://www.w3.org/TR/xhtml/DTD/xhtmll-transitional.dtd</a>">
<html >
<head>
<title>GOOGLE AJAX API</title>
<link rel="stylesheet" type="text/css" href="trans.css"/>
<meta http-equiv="content-type" content="text/html;charset=iso-8895-1"/>
    <script type="text/javascript" src="<a href="http://www.google.com/jsapi%22%3E%3C/script">http://www.google.com/jsapi"></script</a>>
    <link href="<a href="http://www.google.com/uds/modules/elements/transliteration/api.css">

http://www.google.com/uds/modules/elements/transliteration/api.css</a>"

      type="text/css" rel="stylesheet"/>
    <script type="text/javascript">
 
      // Load the Google Transliteration API
      google.load("elements", "1", {
            packages: "transliteration"
          });
 
      function onLoad() {
        var options = {
          sourceLanguage:
              google.elements.transliteration.LanguageCode.ENGLISH,
          destinationLanguage:
              google.elements.transliteration.LanguageCode.HINDI,
          shortcutKey: 'ctrl+g',
          transliterationEnabled: true
        };
        // Create an instance on TransliterationControl with the required
        // options.
        var control =
            new google.elements.transliteration.TransliterationControl(options);
 
        // Enable transliteration in the textfields with the given ids.
        var ids = [ "transl1", "transl2" ];
        control.makeTransliteratable(ids);
 
        // Show the transliteration control which can be used to toggle between
        // English & Hindi.
        control.showControl('translControl', {
            controlType: google.elements.transliteration.TransliterationControl.
                         ControlType.SINGLE_LANGUAGE_BUTTON
        });
      }
      google.setOnLoadCallback(onLoad);
    </script>
</head>
<body id="transliterate">
<ul id="tabnav">
<li><a href="translate.html">翻译</a></li>
<li><a href="transliterate.html">音译</a></li>
<li><a href="contact.html">联系羊子</a></li>
</ul>
<div id="content">
  <h1><center>音译 印度语 (可使用快捷键 Ctrl+g 在印度语和英语间切换)</center></h1>
    <div id='translControl'></div>
    <br><center><input type='textbox' id="transl1"/> </center><br><center>
    <textarea id="transl2" style="width:600px;height:200px"></textarea> </center><br><br>
  </body>

</div>
</body>
</html>

三、css样式
就介绍使用伪类改变背景字体,生成如页面所示的书签效果。

body#translate li.translate,body#transliterate li.transliterate,body#contact li.contact{
 border-bottom: 1px solid #fff;
 color: #000000;
 background-color: #fff;
}
body#translate li.translate a:link,body#translate li.translate a:visited,
body#transliterate li.transliterate a:link,body#transliterate li.transliterate a:visited,
body#contact li.contact a:link,body#contact li.contact a:visited,{
 color: #000000;
 background-color: #fff;
}

四、效果图

翻译页面:

音译页面:

可点击http://liuyangzi.com/uploads/translate.html查看最终效果。

2条评论

  1. 说:

    你好,看了你的项目,我真的很想拿你的项目来研究研究,希望你能发你的项目给我学习学习,很感谢你的帮助

  2. 羊叨 说:

    不好意思,这个项目文件我存以前的电脑,还没来得及导出来,电脑已经坏了。不过项目的关键代码我基本都放在文章里了。

发表评论 »