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

article/2025/10/7 1:52:34

我点开程序一看,程序第一行就写着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

http://chatgpt.dhexx.cn/article/HJ0WrIl7.shtml

相关文章

python实现划词翻译

最近因为编程&#xff0c;需要大量地看一些说明文档&#xff0c;无奈说明文档都是英文的&#xff0c;可把我这个半桶水折腾死了&#xff0c;太多词汇不知道&#xff0c;一个个复制翻译太麻烦了。于是我根据自己的需要&#xff0c;用python写了一个划词翻译。 一&#xff1a;使…

划词翻译简单实现

环境&#xff1a;archlinux &#xff0c;其余linux系统类似 安装依赖 sudo pacman -S xsel sudo pacman -S translate-shell sudo pacman -S libnotify脚本书写 创建脚本 touch word_translate.sh chmod x word_translate.sh vim word_tranlate.sh#!/bin/bashwhile true; d…

Chrome划词插件-有道词典

当我们在阅读文章&#xff0c;查找资料或者查看英文文献时&#xff0c;经常会遇到不认识的英文单词&#xff0c;这时&#xff0c;我们往往会复制单词百度一下才行。 其实&#xff0c;遇到这种情况&#xff0c;我们可以直接下载一个有道词典的Chrome划词插件&#xff0c;遇到需…

PDF划词翻译插件

PDF划词翻译插件 1、打开一个拓展插件的下载网站2、下载沙拉查词并安装3、进入详情&#xff0c;设置为允许打开文件网址4、固定她5、打开她的设置最终划词结果 1、打开一个拓展插件的下载网站 点击此网站地址 2、下载沙拉查词并安装 打开开发者模式&#xff0c;把下载好的.cr…

福昕pdf阅读器的划词翻译功能如何添加(图文并茂)

一、打开福昕阅读器 二、可在上方工具栏&#xff0c;点击“帮助”&#xff0c;关于福昕阅读器领鲜版查看安装的版本信息&#xff0c;如图1-1&#xff0c;图1-2 图1-1 图1-2 三、找到上方工具栏的图标按键&#xff0c;名为“自定义快速访问工具栏”&#xff0c;如图1-3&#…

谷歌浏览器无法翻译成中文,谷歌翻译,最新(沉浸式翻译和划词翻译,chrome无法翻译,谷歌浏览器无法翻译此网页)

简介&#xff1a;谷歌浏览器自带的翻译功能&#xff0c;对我们来说用处很大&#xff0c;但有的时候突然就会变成“无法翻译此网页”&#xff0c;之前给大家提供过两种无法翻译此网页的解决方案&#xff0c;这次再给大家分享下两款别的翻译方法&#xff1b; 一、上次介绍&#x…

关于网页划词翻译

2013-4-21 近日偶然看到js页面文字选中后分享到新浪微博实现&#xff0c;发现原来竟然只要一句话就可以实现获取划词。便萌生自己写个划词翻译的东东&#xff0c;方便自己看文档。 我首先想到了之前看到的油猴插件&#xff0c;最早是在看优酷去广告插件的原理时知道这个东西。感…

基于Edge浏览器的沙拉划词插件使用教程(好用的翻译插件)

1.使用目的 - 使用沙拉划词实现网页多种翻译源进行实时翻译。 - 使用沙拉划词实现PDF翻译。 2.安装方法 2.1 打开edge扩展 点击工具栏右侧… 然后点击扩展 进入扩展 2.2 下载沙拉划词 2.2.1 点击获取扩展 2.2.2点击搜索 搜索沙拉划词 回车搜索 正常获取并添加扩展 出现沙…

PDF划词翻译软件

PDF划词翻译 一个简单的PDF划词翻译软件。 Github仓库地址&#xff1a;https://github.com/WCX1024979076/simple_pdf_translator Github下载地址&#xff1a; https://github.com/WCX1024979076/simple_pdf_translator/releases/tag/v0.1.0 Gitee仓库地址&#xff1a; htt…

推荐一个谷歌浏览器插件:划词翻译

地址&#xff1a;划词翻译插件 最近在看一些英文文档&#xff0c;遇到了一些词汇不认识&#xff0c;在谷歌浏览器上找到了这个翻译插件 谷歌浏览器自己有一个全文翻译的功能&#xff0c;对于一些技术类文档&#xff0c;有些词如果翻译错误了就会闹出笑话来&#xff0c;限于对…

一个简单的划词翻译工具

一个简单的划词翻译工具 看论文时经常要翻译&#xff0c;然而手动复制粘贴到翻译网站上又很麻烦&#xff0c;有些划词翻译工具比如有道的划词和取词&#xff0c;虽然不用按快捷键只选中文本就能翻译&#xff0c;但有时也会失灵什么的&#xff0c;于是就自己用python写了个调用百…

安装侧边翻译,划词翻译,看外文论文神器,比知云还好用Edge Translate

前言 写论文相信大家参考的大多数都是外文文献&#xff0c;但是想我这样英文水平不佳的小伙伴还是比较多的&#xff0c;所以看外文文献就很费劲。 有的小伙伴用谷歌或者百度翻译 一边复制翻译一边看&#xff0c; 后来用知云翻译方便的很多&#xff0c;但是每次…

论文阅读利器——划词翻译插件(桌面与浏览器)

对于喜爱学习&#xff0c;阅读文献的各位来说&#xff0c;满屏的英文字母常常会磨灭我们的热情&#xff0c;而一般的翻译软件又有些贵&#xff0c;或者是根本没有很好的效果。 那么&#xff0c;今天&#xff0c;在这里介绍几款开源的插件与软件。都是可以免费使用的。 一、Edg…

5个超好用的屏幕划词翻译软件,选中文字就能翻译

分享5个划词翻译工具&#xff0c;支持翻译多种语言&#xff0c;并且有多种翻译源和词典可以选择&#xff01; 一、划词翻译插件 1、Talent划词翻译 一个好用的划词翻译插件&#xff0c;支持Chrome、Edge、360等主流浏览器&#xff0c;安装之后选中词汇或者短句就会自动进行翻译…

递归算法整理合集

递归算法整理合集 ​递归是常见的算法和编程思想&#xff0c;也是初学者几乎最早接触的算法思想之一。递归算法的优点是代码简洁清晰&#xff0c;逻辑简单易懂&#xff1b;缺点一是算法运行复杂度较高&#xff0c;二是容易在具体代码实现的时候调用栈的层次考虑不周&#xff0…

【关于递归算法的讲解】

递归算法 递归算法的思想 利用递归求解问题的三个特性 递归算法求解的执行过程 递推关系 递归算法的应用举例 小结 递归算法 递归算法是一种通过自身调用自身或间接调用自身来达到问题解决的算法。递归的基本思想是把一个要求解的问题划分成一个或多个规模更小的子问题…

递归算法即案例

递归&#xff08;recursion&#xff09;&#xff1a;程序调用自身的编程技巧。 递归满足2个条件&#xff1a; 1. 有反复执行的过程&#xff08;调用自身&#xff09; 2. 有跳出反复执行过程的条件&#xff08;递归出口&#xff09; 项目中用到递归案例 递归读取文件获取字典…

【递归算法】递归算法的快速入门

&#x1f40b;作者简介&#xff1a;博主是一位.Net开发者&#xff0c;同时还是RPA和低代码平台的践行者。 &#x1f42c;个人主页&#xff1a;会敲键盘的肘子 &#x1f430;系列专栏&#xff1a;数据结构与算法 &#x1f980;专栏简介&#xff1a;图解经典算法&#xff0c;C#代…

递归算法详细解析

递归 程序调用自身的编程技巧称为递归&#xff08; recursion&#xff09;&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。一般来说&#xff0c;递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时&#xff0c;递归前…

递归算法详解

递归&#xff08;英语&#xff1a;recursion&#xff09;在电脑科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。 0、前言 递归其实和循环是非常像的&#xff0c;循环都可以改写成递归&#xff0c;递归未必能改写成循环&#xff0c;这是一个充分不必要的条…