我点开程序一看,程序第一行就写着import,
却歪歪斜斜的每行上都是着MATLAB几个大字。
我横竖睡不着,仔细看了半夜,
才从字缝里看出字来,满页都写着
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀——Java

其实用的java的部分也不是很多,而且用的都是MATLAB自带的java包,主体还是MATLAB,这篇文章主要是手把手教你如何用MATLAB+java+app designer制作一款划词翻译工具:

-1注

2021a版本MATLAB相对于之前版本有些变更,已在文中注明


0使用效果

效果图片:

如下图所示,只要复制新内容(任何复制方式均可,包括直接ctrl+c的方式),就会有一个翻译框蹦出来,显示句子的原文和翻译:

效果动图:

即使最小化或者关闭翻译窗口,再次 [划词] 依旧会蹦出窗口


1如何获得剪切板内容?

这一部分是用的java的库,代码如下:

import java.awt.Toolkit
import java.awt.datatransfer.DataFlavorclip=Toolkit.getDefaultToolkit().getSystemClipboard();
clipTf=clip.getContents([]);
clipContent=clipTf.getTransferData(DataFlavor.stringFlavor)

2如何获得鼠标在全屏位置

这步是为了让翻译内容显示在鼠标附近,这步可以用java来写也可以用matlab来写:

Java版本:

import java.awt.MouseInfo;
mousepoint=MouseInfo.getPointerInfo().getLocation();

MATLAB版本:

root=get(0);
mousepoint=root.PointerLocation;

2021-8-5日改:
若MATLAB版本为2021a
则使用:

root=get(0);
mousepoint=root.PointerLocation;
mousepoint=mousepoint./root.ScreenSize(3:4);
mousepoint=mousepoint.*[1280,720];

3如何翻译整段文字

参考大佬 肆拾伍 的博文:matlab 使用有道翻译API (推荐!)
过程描述一下即为:

clipContent='剪切板里的内容'
website=['http://fanyi.youdao.com/openapi.do?keyfrom=cxvsdffd33&key=1310976914&type=data&doctype=xml&version=1.1&q=',clipContent,'&only=translate"'];
webContent=webread(website);
trans_begin=regexpi(webContent,'<paragraph><![CDATA[');
trans_end=regexpi(webContent,']></paragraph>');
transContent=webContent(trans_begin+20:trans_end-2);

也就是把链接中一部分改为想要翻译的文本,通过webread获取返回的结果,再通过正则表达将翻译部分切割出来。因为是用的有道德API因此程序需要连网使用。


4如何在点击关闭按钮时隐藏窗口而不是删除

假设我们创建了一个窗口:

% figure窗口构建
transFig=uifigure('units','pixels');
transFig.Position=[10,65,300,200];
transFig.NumberTitle='off';
transFig.MenuBar='none';
transFig.Name='translation tool | by slandarer';
transFig.Color=[1,1,1];
transFig.Resize='off';
transFig.Visible='on';

我们可以为其创建 CloseRequestFcn 回调函数,并在其中只隐藏窗口而不删除窗口:

% 通过设置回调函数,让点击右上角关闭时窗口隐藏而不是被删除
set(transFig,'CloseRequestFcn',@closeFig)
function closeFig(~,~)transFig.Visible='off';
end

2021-8-5日改:
若MATLAB版本为2021a
为了在新版本方便关闭程序:
我们将while循环的参数设为runflag,并编写如下代码:

% 上下文菜单
ContextMenu=uicontextmenu(transFig);
Menu=uimenu(ContextMenu);
Menu.Text='关闭划词翻译工具';
set(Menu,'MenuSelectedFcn',@closeFig2)
function closeFig2(~,~)runflag=false;delete(transFig)clc;
end
transFig.ContextMenu=ContextMenu;

这样右键工具时就会出现关闭工具的选项:


5如何让复制后窗口显示在最上方

transFig是我们之前创建的figure,我们将其窗口状态更改为全屏,这时候他就会位于最上方且全屏,此时再将窗口状态更改为正常状态,则窗口会在保持在最上方的同时退出全屏:

transFig.WindowState='fullscreen';
transFig.WindowState='normal';

2021-8-5日改:
若MATLAB版本为2021a
则使用:

transFig.Visible='off';
transFig.Visible='on';

6完整代码

function copyTrans
import java.awt.Toolkit
import java.awt.datatransfer.DataFlavor
import java.awt.datatransfer.StringSelection% 获取剪切板文本
% clip=Toolkit.getDefaultToolkit().getSystemClipboard();
% clipTf=clip.getContents([]);
% clipContent=clipTf.getTransferData(DataFlavor.stringFlavor)
clip=Toolkit.getDefaultToolkit().getSystemClipboard();% 获取鼠标位置
% ---------------------------------------------------
% 方法一:
% import java.awt.MouseInfo;
% mousepoint=MouseInfo.getPointerInfo().getLocation();
% ---------------------------------------------------
% 方法二
% root=get(0);
% mousepoint=root.PointerLocation;% 旧的剪切板内容:若是剪切板内容与之前不同则进行翻译过程
lastContent='translation tool made by slandarer';
tText=StringSelection(lastContent);
clip.setContents(tText,[])warning off% figure窗口构建
transFig=uifigure('units','pixels');
transFig.Position=[10,65,300,200];
transFig.NumberTitle='off';
transFig.MenuBar='none';
transFig.Name='translation tool | by slandarer';
transFig.Color=[1,1,1];
transFig.Resize='off';
transFig.Visible='on';% 通过设置回调函数,让点击右上角关闭时窗口隐藏而不是被删除
set(transFig,'CloseRequestFcn',@closeFig)
function closeFig(~,~)transFig.Visible='off';
end% 文本标签创建
oriTextAreaLabel=uilabel(transFig);
oriTextAreaLabel.FontSize=16;
oriTextAreaLabel.FontColor=[0.35,0.39,0.19];
oriTextAreaLabel.Position=[10 175 150 20];
oriTextAreaLabel.FontWeight='bold';
oriTextAreaLabel.Text=' 原文(Original text)';transTextAreaLabel=uilabel(transFig);
transTextAreaLabel.FontSize=16;
transTextAreaLabel.FontColor=[0.35,0.39,0.19];
transTextAreaLabel.Position=[10 80 150 20];
transTextAreaLabel.FontWeight='bold';
transTextAreaLabel.Text=' 翻译(Translation)';
% 文本框创建
oriTextArea=uitextarea(transFig);
oriTextArea.FontSize=15;
oriTextArea.FontColor=[0.4 0.4 0.4];
oriTextArea.Position=[10 105 280 60];
oriTextArea.Value='translation tool made by slandarer';transTextArea=uitextarea(transFig);
transTextArea.FontSize=15;
transTextArea.FontColor=[0.4 0.4 0.4];
transTextArea.Position=[10 10 280 60];
transTextArea.Value='翻译工具由slandarer';while 1pause(0.5)clipTf=clip.getContents([]);clipContent=clipTf.getTransferData(DataFlavor.stringFlavor);if ~strcmp(lastContent,clipContent)% 通过接口获取翻译website=['http://fanyi.youdao.com/openapi.do?keyfrom=cxvsdffd33&key=1310976914&type=data&doctype=xml&version=1.1&q=',...clipContent,'&only=translate"'];webContent=webread(website);trans_begin=regexpi(webContent,'<paragraph><![CDATA[');trans_end=regexpi(webContent,']></paragraph>');transContent=webContent(trans_begin+20:trans_end-2);% 命令行展示disp(' ')disp('翻译:')disp(transContent)% 更改工具窗口的文本oriTextArea.Value=clipContent;transTextArea.Value=transContent; % 将窗口显示在其他窗口上面transFig.Visible='on';transFig.WindowState='fullscreen';transFig.WindowState='normal';% 根据鼠标位置更改窗口位置root=get(0);mousepoint=root.PointerLocation;transFig.Position=[mousepoint(1),mousepoint(2)-200,300,200];lastContent=clipContent;end
end
end

若版本为2021a及以后,则使用:

function copyTrans
import java.awt.Toolkit
import java.awt.datatransfer.DataFlavor
import java.awt.datatransfer.StringSelection
import java.awt.MouseInfo;% 获取剪切板文本
% clip=Toolkit.getDefaultToolkit().getSystemClipboard();
% clipTf=clip.getContents([]);
% clipContent=clipTf.getTransferData(DataFlavor.stringFlavor)
clip=Toolkit.getDefaultToolkit().getSystemClipboard();% 获取鼠标位置
% ---------------------------------------------------
% 方法一:
% import java.awt.MouseInfo;
% mousepoint=MouseInfo.getPointerInfo().getLocation();
% ---------------------------------------------------
% 方法二
% root=get(0);
% mousepoint=root.PointerLocation;% 旧的剪切板内容:若是剪切板内容与之前不同则进行翻译过程
lastContent='translation tool made by slandarer';
tText=StringSelection(lastContent);
clip.setContents(tText,[])warning off% figure窗口构建
transFig=uifigure('units','pixels');
transFig.Position=[10,65,300,200];
transFig.NumberTitle='off';
transFig.MenuBar='none';
transFig.Name='translation tool | by slandarer';
transFig.Color=[1,1,1];
transFig.Resize='off';
transFig.Visible='on';runflag=true;
% 通过设置回调函数,让点击右上角关闭时窗口隐藏而不是被删除
set(transFig,'CloseRequestFcn',@closeFig)
function closeFig(~,~)transFig.Visible='off';
end% 文本标签创建
oriTextAreaLabel=uilabel(transFig);
oriTextAreaLabel.FontSize=16;
oriTextAreaLabel.FontColor=[0.35,0.39,0.19];
oriTextAreaLabel.Position=[10 175 150 20];
oriTextAreaLabel.FontWeight='bold';
oriTextAreaLabel.Text=' 原文(Original text)';transTextAreaLabel=uilabel(transFig);
transTextAreaLabel.FontSize=16;
transTextAreaLabel.FontColor=[0.35,0.39,0.19];
transTextAreaLabel.Position=[10 80 150 20];
transTextAreaLabel.FontWeight='bold';
transTextAreaLabel.Text=' 翻译(Translation)';
% 文本框创建
oriTextArea=uitextarea(transFig);
oriTextArea.FontSize=15;
oriTextArea.FontColor=[0.4 0.4 0.4];
oriTextArea.Position=[10 105 280 60];
oriTextArea.Value='translation tool made by slandarer';transTextArea=uitextarea(transFig);
transTextArea.FontSize=15;
transTextArea.FontColor=[0.4 0.4 0.4];
transTextArea.Position=[10 10 280 60];
transTextArea.Value='翻译工具由slandarer';% 上下文菜单
ContextMenu=uicontextmenu(transFig);
Menu=uimenu(ContextMenu);
Menu.Text='关闭划词翻译工具';
set(Menu,'MenuSelectedFcn',@closeFig2)
function closeFig2(~,~)runflag=false;delete(transFig)clc;
end
transFig.ContextMenu=ContextMenu;while runflagpause(0.5)clipTf=clip.getContents([]);clipContent=clipTf.getTransferData(DataFlavor.stringFlavor);if ~strcmp(lastContent,clipContent)% 通过接口获取翻译website=['http://fanyi.youdao.com/openapi.do?keyfrom=cxvsdffd33&key=1310976914&type=data&doctype=xml&version=1.1&q=',...clipContent,'&only=translate"'];webContent=webread(website);trans_begin=regexpi(webContent,'<paragraph><![CDATA[');trans_end=regexpi(webContent,']></paragraph>');transContent=webContent(trans_begin+20:trans_end-2);% 命令行展示disp(' ')disp('翻译:')disp(transContent)% 更改工具窗口的文本oriTextArea.Value=clipContent;transTextArea.Value=transContent; % 将窗口显示在其他窗口上面transFig.Visible='off';transFig.Visible='on';%transFig.WindowState='fullscreen';%transFig.WindowState='normal';% 根据鼠标位置更改窗口位置root=get(0);mousepoint=root.PointerLocation;mousepoint=mousepoint./root.ScreenSize(3:4);mousepoint=mousepoint.*[1280,720];% root=get(0);% mousepoint=root.PointerLocationtransFig.Position=[mousepoint(1),mousepoint(2)-200,300,200];lastContent=clipContent;end
end
end

惊了,MATLAB竟能制作如此方便的划词翻译工具???相关推荐

  1. 看看咱是如何用MATLAB白嫖遥遥领先于同行的神仙级翻译工具 — DeepL

    伙伴们不用惊讶,标题仅仅是借用余大嘴的专用修饰语"遥遥领先于同行"而已,但讲DeepL翻译器遥遥领先于同行也不为过,下图是官方给出的采用盲测的方式与其他同类产品的对比图,这应该不是 ...

  2. 调用worldlingo.com翻译服务,制作的一个多国语言翻译工具

    worldlingo的自动翻译服务功能免费而且相当强大,支持12种语言的相互翻译. 只是每次要开个IE浏览器使用,前几天刚好在做WEBRequest相关的程序,有个现成的Http请求库,就用它做了一个 ...

  3. python制作查询工具发给别人使用_用Python做一个简单的翻译工具

    编程本身是跟年龄无关的一件事,不论你现在是十四五岁,还是四五十岁,如果你热爱它,并且愿意持续投入其中,必定会有所收获. 本文就来自编程教室一位"小"读者的投稿(互助学习1群里的同学 ...

  4. 【前端实例代码】霓虹灯按钮动画效果悬停2| html CSS特效 惊艳| 前端开发 网页制作 基础入门教程

    b站视频演示效果: [web前端特效源码]霓虹灯按钮动画效果悬停2| html CSS特效 惊艳| 前端开发 网页制作 基础入门教程 效果图: 完整代码: <!DOCTYPE html> ...

  5. 【前端实例代码】霓虹灯按钮动画效果悬停| html CSS特效 惊艳| 前端开发 网页制作 基础入门教程

    b站视频演示效果: [web前端特效源码]霓虹灯按钮动画效果悬停| html CSS特效 惊艳| 前端开发 网页制作 基础入门教程 效果图: 完整代码: <!DOCTYPE html> & ...

  6. MATLAB 3D 动画制作(一)- 3D 图形设计

    MATLAB 3D 动画制作(一)- 3D 图形设计  MATLAB 3D Animation -- 3D object design  Auther: Sonictl Northeastern Un ...

  7. matlab图形设计界面 文献翻译,毕业设计基于matlab的数字图像识别的设计与实现文献翻译V8.1(资料4)...

    <[毕业设计]基于matlab的数字图像识别的设计与实现文献翻译.doc>由会员分享,可免费在线阅读全文,更多与<毕业设计基于matlab的数字图像识别的设计与实现文献翻译(V8.1 ...

  8. pandas访问分组里面的数据_实战用pandas+PyQt5制作一款数据分组透视处理工具

    早起导读:pandas是Python数据处理的利器,如果每天都要使用pandas执行同样的操作,如何制作一个有界面的软件更高效的完成?本文提供了一种基于PyQt5的实现思路. 关键词:pandas P ...

  9. Excel制作饼图的法宝!Smartbi可视化工具图表制作

    大家都知道,用Excel做饼图很简单,选取表格,插入饼图就完成了.可是饼图做地好不好看,还是有技巧的,今天,Smatrbi亮几招,大家就不用羡慕别人报告中的饼图漂亮又酷炫,我们自己也能够做出来. 如何 ...

最新文章

  1. 如何使用Leangoo管理Sprint Backlog
  2. python程序员在公司都是做什么的-在一家公司呆了 10 年的程序员,最后都怎么了?...
  3. 基坑计算理论m法弹性支点法_基坑支护结构设计应注意的一些问题
  4. 计算约化重叠积分氟化氢HF
  5. 计算机网络的拓扑结构主要有新型,计算机网络中主要拓扑结构有 ______。
  6. C语言关于符号#和##
  7. 小米miuiVS华为鸿蒙,华为鸿蒙2.0 vs 小米MIUI 12.5
  8. java连接sql server数据库的代码如何改成连接mysql_Java连接sql server或mysql数据库(代码)...
  9. 李宏毅机器学习——无监督学习(五)
  10. lua luarocks_通过Luarocks使Lua开发变得容易
  11. android QQ好友分享
  12. 推荐两款github敏感信息搜集工具(gsil、gshark)
  13. 《关键对话——何谓关键对话》读书笔记(一)
  14. react 使用recoil 减少不必要的组件渲染
  15. 计算机分享硬盘,共享磁盘是什么怎么设置
  16. 《JavaSE-第七章》之抽象的类-实例的对象-合理的封装
  17. python入门——热量转换 I
  18. HDU 1415(Jugs)
  19. 计算机教育属于什么教育学类,应用电子技术教育专业属于什么门类
  20. [DP46题] HDU 1864 最大报销额

热门文章

  1. python下标越界怎么解决_Python异常处理
  2. 【c++】2020大一下c++期中考前小练习1
  3. 「入门运维必看」一篇让小白彻底搞懂性能调优!
  4. 如何批量将图片转换成jpg格式?
  5. C#chart绘折线图动态添加数据
  6. 苹果手机壳_外观防护兼具,5款时尚简约苹果XS Max手机壳精选
  7. eve-ng中模拟飞塔HA测试实验及理论
  8. 利用Python导入股票列表
  9. 惠普打印机2132故障灯大全图解_绝对干货!二手打印机选购攻略!
  10. 专访中科云创周北川:用AI来做工业设备的故障诊断,目前还停留在“鸡尾酒疗法”阶段