论坛's Archiver

水鑫日 发表于 2008-9-8 17:27

在 ubiquity 中使用中文命令

Ubiquity 为网络应用带来了创新的使用方式,使我们能更加快捷方便的取得并使用各种资讯与服务。但是由于是外国开发者的作品,使用的命令都是英文,对于我们来说有些命令使用中文更加方便实用(如才发布的饭否脚本)。
我这里给出一个根据自带的 google 翻译修改的中文命令脚本,一点都不复杂,大家看一下就会自己改了。[code]// -----------------------------------------------------------------
// TRANSLATE COMMANDS
// -----------------------------------------------------------------

var Languages = {
  '阿拉伯文' : 'ar',
  '简体中文' : 'zh-CN',
  '繁体中文' : 'zh-TW',
  '丹麦文' : 'da',
  '荷兰文': 'nl',
  '英文' : 'en',
  '芬兰文' : 'fi',
  '法文' : 'fr',
  '德文' : 'de',
  '希腊文' : 'el',
  '印度文' : 'hi',
  '意大利文' : 'it',
  '日文' : 'ja',
  '韩文' : 'ko',
  '挪威文' : 'no',
  '波兰文' : 'pl',
  '葡萄牙文' : 'pt-PT',
  '罗马尼亚文' : 'ro',
  '俄文' : 'ru',
  '西班牙文' : 'es',
  '保加利亚文' : 'bg',
  '捷克文' : 'cs',
  '克罗地亚文' : 'hr',
  '瑞典文' : 'sv'
};

var key;
var noun_type_language_zh = new CmdUtils.NounType( "语言", [key for (key in Languages)]);

function translateTo( text, langCodePair, callback ) {
  var url = "http://ajax.googleapis.com/ajax/services/language/translate";

  if( typeof(langCodePair.from) == "undefined" ) langCodePair.from = "";
  if( typeof(langCodePair.to) == "undefined" ) langCodePair.to = "";

  var params = Utils.paramsToString({
    v: "1.0",
    q: text,
    langpair: langCodePair.from + "|" + langCodePair.to
  });

  Utils.ajaxGet( url + params, function(jsonData){
    var data = Utils.decodeJson(jsonData);

    // The usefulness of this command is limited because of the
    // length restriction enforced by Google. A better way to do
    // this would be to split up the request into multiple chunks.
    // The other method is to contact Google and get a special
    // account.

    try {
      var translatedText = data.responseData.translatedText;
    } catch(e) {
      // If we get either of these error messages, that means Google wasn't
      // able to guess the originating language. Let's assume it was English.
      // TODO: Localize this.
      var BAD_FROM_LANG_1 = "invalid translation language pair";
      var BAD_FROM_LANG_2 = "could not reliably detect source language";
      var errMsg = data.responseDetails;
      if( errMsg == BAD_FROM_LANG_1 || errMsg == BAD_FROM_LANG_2 ) {
        // Don't do infinite loops. If we already have a guess language
        // that matches the current forced from language, abort!
        if( langCodePair.from != langCodePair.de )
          translateTo( text, {from:langCodePair.de, to:langCodePair.to, de:langCodePair.de}, callback );
        return;
      }
      else {
        displayMessage( "Translation Error: " + data.responseDetails );
      }
      return;
    }

    if( typeof callback == "function" )
      callback( translatedText );
    else
      CmdUtils.setSelection( text + "<br/><b style='color:red'>翻译结果:</b>" + translatedText );

    CmdUtils.setLastResult( translatedText );
  });
}

var Translated;

CmdUtils.CreateCommand({
  name: "翻译(中)",
  description: "默认翻译到中文。",
  icon: "http://www.google.com/favicon.ico",
  help: "You can specify the language to translate to, and the language to translate from.  For example," +
        " try issuing &quot;translate mother from english to chinese&quot;. If you leave out the the" +
        " languages, Ubiquity will try to guess what you want. It works on selected text in any web page, but" +
        " there's a limit to how much it can translate at once (a couple of paragraphs.)",
  takes: {"待翻译文本": noun_arb_text},
  modifiers: {"从": noun_type_language_zh, "到": noun_type_language_zh},

  execute: function( directObj ) {
    // Default to translating to English if no to language
    // is specified.
    // TODO: Choose the default in a better way.

    if( Translated != null )
      CmdUtils.setSelection( directObj.text + "<br/><b style='color:red'>翻译结果:</b>" + Translated );
    else
      translateTo( directObj.text, {to:"zh-CN", de:"en"} );
    Translated = null;
  },

  preview: function( pblock, directObj, modifiers ) {
    var toLang = modifiers.到.text || "简体中文";
    var fromLang = modifiers.从.text;
    var toLangCode = Languages[toLang];
    var fromLangCode = Languages[fromLang];
    Translated = null;

    translateTo( directObj.text, {from:fromLangCode, to:toLangCode, de:"en"}, function( translation ) {
      pblock.innerHTML = "将选中的文本替换为" + toLang + "翻译:<br/><small style='padding:10px;color: #CCC;display:block;'>" + translation + "</small>";
      Translated = translation;
    });

  }
});

CmdUtils.CreateCommand({
  name: "翻译(英)",
  description: "默认翻译到英文。",
  icon: "http://www.google.com/favicon.ico",
  takes: {"待翻译文本": noun_arb_text},
  modifiers: {"从": noun_type_language_zh, "到": noun_type_language_zh},

  execute: function( directObj ) {
          if( Translated != null )
      CmdUtils.setSelection( directObj.text + "<br/><b style='color:red'>翻译结果:</b>" + Translated );
    else
      translateTo( directObj.text, {to:"en", de:"zh-CN"} );
    Translated = null;
  },

  preview: function( pblock, directObj, modifiers ) {
    var toLang = modifiers.到.text || "英文";
    var fromLang = modifiers.从.text;
    var toLangCode = Languages[toLang];
    var fromLangCode = Languages[fromLang];
    Translated = null;

    translateTo( directObj.text, {from:fromLangCode, to:toLangCode, de:"zh-CN"}, function( translation ) {
      pblock.innerHTML = "将选中的文本替换为" + toLang + "翻译:<br/><small style='padding:10px;color: #CCC;display:block;'>" + translation + "</small>";
      Translated = translation;
    });

  }
})[/code]这其中需要注意有这么几个:
1、命令[code]name: "命令"[/code]2、参数提示符[code]modifiers: {"参数提示符1": noun_type_xxxx, "参数提示符2": noun_type_xxxx}[/code]3、参数及描述[code]var xxxx = {'参数1','参数2','参数3'};
var noun_type_xxxx = new CmdUtils.NounType( "参数描述", xxxx]);[/code]如有需要发送的英文参数可以采用以下格式汉化[code]var xxxx = {'参数1':'实际参数1','参数2':'实际参数2','参数3':'实际参数3'};
var key;
var noun_type_xxxx = new CmdUtils.NounType( "参数描述", [key for (key in xxxx)]);[/code][b]modifiers.参数提示符1.text[/b] 中就是根据 [b]noun_type_xxxx[/b] 中定义取得的命令参数。

看到这里大家应该都会了吧,这下大可根据自己的需要尽情地修改。
PS:由于不想配置文件太大(edit 页面添加的命令保存在 prefs.js 中,keyconfig 也是如此,所以我只添加精简实用的命令),我是直接修改的 builtincmds.js 文件,用 UTF-8 保存,不需要重启就可以看到效果。直接修改还有一个好处就是可以删除不许需要的命令。

[[i] 本帖最后由 水鑫日 于 2008-9-9 15:45 编辑 [/i]]

zjlyzhy 发表于 2008-9-8 20:09

唔,很感兴趣。ubiquity很好很强大。非常喜欢,顶一下了

hillhill 发表于 2008-9-8 23:20

lz请问keyconfig的设置应该如何备份。

zillac 发表于 2008-9-9 02:44

我觉得在 显示 之外的地方, 使用中文书写代码不是非常明智.

不过或许见仁见智

水鑫日 发表于 2008-9-9 14:31

[b]回复 3楼 hillhill 的帖子[/b]
最直接的方法就是备份 prefs.js

[b]回复 4楼 zillac 的帖子[/b]
[i]汉字[/i] 会被编码成 [i]\u6C49\u5B57[/i] 的形式,不会影响代码运行

nihao19586 发表于 2008-11-13 05:19

看帖不顶不厚道~~我顶~~~~

**** 作者被禁止或删除 内容自动屏蔽 ****

页: [1]

© 2004-2009 Mozest.com