惊了,MATLAB竟能制作如此方便的划词翻译工具???
Posted slandarer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了惊了,MATLAB竟能制作如此方便的划词翻译工具???相关的知识,希望对你有一定的参考价值。
我点开程序一看,程序第一行就写着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.DataFlavor
clip=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 1
pause(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 runflag
pause(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以上是关于惊了,MATLAB竟能制作如此方便的划词翻译工具???的主要内容,如果未能解决你的问题,请参考以下文章
python 抓取有道词典网页版本翻译内容,并去掉翻译无关的广告等内容。结合GoldenDict的划词翻译,可以作为Linux的下的有道词典客户端。效果还不错