用了有道云翻译官方的api,因此支持了英日韩译中和中译英(理论上是英日韩西俄法,但是自动识别只能识别出英日韩,其他的只会错译/无结果),原来的标题不再准确了所以重新发一次。

使用教程

  • 将文件下载并解压
  • WisteriaTranslate.lua放置于.../Dice[你的QQ号]/plugin目录下
  • json.lua放置于.../Diceki/lua/目录下,没有这个目录就新建文件夹建出来,如果同时安装了其他的需要json.lua的插件,只需要任意保留一个json.lua
  • 重启或.system load
  • 指令为.translate [内容]
  • 版本要求>590(感谢タブー術因为这份教程大部分都是抄的)

使用示例

源码

msg_order = {}

function encodeURI(s) --对传入参数编码,兼容中文
    s = string.gsub(s, "([^%w%.%- ])", function(c) return string.format("%%%02X", string.byte(c)) end)
    
    return string.gsub(s, " ", "+")
end

msg_order[".translate"]="translate"
function translate(msg)
    local rest = string.match(msg.fromMsg,"^[%s]*(.-)[%s]*$",11)--匹配文本
    local api="http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i="
    local polar=""
    
    if(rest and #rest>0)then
        rest=encodeURI(rest)--编码
        polar=api..rest--拼接
    else--空参,返回默认说明文字
        return"你摊开了墨绿色的羊皮纸卷,上面写到……\nWisteriaTranslate ver2.0 by 32w\n发布于dice!论坛,使用方法:.translate [翻译内容],支持英日韩译中和中译英"
    end
    
    json=require "json"
    res,data = http.get(polar)
    j=json.decode(data)
    
    if(j.errorCode==0)then
        return j.translateResult[1][1].tgt
    else
        return "泛着贝类光泽的笔迹溶解于书中,未找到对应翻译"
    --j=json.decode(data)
   end 
end

多行翻译

@Nightless 在楼下贴出的代码~附在这里
将这一内容替换 j.errorCode==0 那一段就能搞定了

if(j.errorCode==0)then
  local num1 = 1
  local text = ""
  local max1 = #j.translateResult
  repeat	--第一层
  local num2 = 1
  local max2 = #j.translateResult[num1]
    repeat--第二层
    text = text..string.sub(j.translateResult[num1][num2].tgt, 1)
    num2 = num2 + 1
    until (num2 > max2 )
    if(num1 < max1)then
    text = text.."{br}"
    end
  num1 = num1 + 1
  until( num1 > max1 )	--条件为真则跳出循环
  return text
else
  return "(摇头)这个我不知道哦。"
  --j=json.decode(data)
end 

文件

wisteriatranslate.zip
4kB
1 个月 后

请问一下,这个翻译插件是只能翻译一句话嘛?
我输入一段话(中间有句号)以后,翻译只会给出第一句的结果。但我把api……是叫这个吗?反正就是脚本里那个polar,直接粘贴到浏览器里,能显示出剩下的句子……
就是说,如果我想把脚本修改成能全部翻译,不会碰到句号就断掉后面句子的那种,有什么办法能改吗?

    Qwekkx 我我我我弄出来了!

    if(j.errorCode==0)then
      local num1 = 1
      local text = ""
      local max1 = #j.translateResult
      repeat	--第一层
      local num2 = 1
      local max2 = #j.translateResult[num1]
        repeat--第二层
        text = text..string.sub(j.translateResult[num1][num2].tgt, 1)
        num2 = num2 + 1
        until (num2 > max2 )
        if(num1 < max1)then
        text = text.."{br}"
        end
      num1 = num1 + 1
      until( num1 > max1 )	--条件为真则跳出循环
      return text
    else
      return "(摇头)这个我不知道哦。"
      --j=json.decode(data)
    end 

    在这段里这样子加个循环判定就可以了!
    多编辑了一次,把分段改成了条件判定,不然会多出来多余的一行(爬走)

      说点什么吧...