隐私说明
您的密钥等私有信息不会被北冥翻译上传到第三方保存,但是会保存在uTools的数据库中,北冥翻译使用JavaScript直接请求翻译API,中间不经过其它服务器,以下是核心js内容:
var app = new Vue({
el:'#app',
data:{
'content':'',
'results':'',
'api_name':'baidu',
'is_click':{
'baidu':true,
'youdao':false,
'sogou':false,
'tmt':false
},
from:'auto',//源语言
to:'',//目标语言
is_load:false,//是否显示加载按钮,默认不显示
is_active:'',//是否激活了设置按钮
modal:"modal",
baidu:{
api_url:'https://fanyi-api.baidu.com/api/trans/vip/translate',
appid:'',
secret_key:''
},
youdao:{
api_url:'https://openapi.youdao.com/api',
appid:'',
secret_key:''
},
sogou:{
},
tmt:{
},//错误消息
err_msg:{
'content':'',
'status':false
},//成功消息
suc_msg:{
'content':'',
'status':false
},//全局消息提示框
g_msg:{
'content':'',
'status':''
}
},
methods: {
//百度翻译
baidu_func:function(){
console.log('运行百度翻译!');
var appid = this.baidu.appid;
var key = this.baidu.secret_key;
var salt = (new Date).getTime();
var query = this.content;
// 多个query可以用\n连接 如 query='apple\norange\nbanana\npear'
var from = document.getElementById("from").value;
//
var to = get_to_lang(this.content);
var str1 = appid + query + salt +key;
var sign = MD5(str1);
const params = new URLSearchParams();
params.append('q', query);
params.append('appid', appid);
params.append('salt', salt);
params.append('from', from);
params.append('to', to);
params.append('sign', sign);
axios
.post(this.baidu.api_url,params)
.then(
response => (
deal_baidu_results(response.data)
)
)
.catch(function (error) { // 请求失败处理
console.log(error);
});
},
test:function(){
console.log('测试方法');
},
//有道翻译
youdao_func:function(){
var appKey = this.youdao.appid;
var key = this.youdao.secret_key;//注意:暴露appSecret,有被盗用造成损失的风险
var salt = (new Date).getTime();
var curtime = Math.round(new Date().getTime()/1000);
var query = this.content;
// 多个query可以用\n连接 如 query='apple\norange\nbanana\npear'
var from = 'auto';
var to = get_to_lang(this.content);
var str1 = appKey + truncate(query) + salt + curtime + key;
var sign = CryptoJS.SHA256(str1).toString(CryptoJS.enc.Hex);
const params = new URLSearchParams();
params.append('q', query);
params.append('appKey', appKey);
params.append('salt', salt);
params.append('from', from);
params.append('to', to);
params.append('sign', sign);
params.append('signType', 'v3');
params.append('curtime', curtime);
axios
.post(this.youdao.api_url,params)
.then(
response => (
deal_youdao_results(response.data)
)
)
.catch(function (error) { // 请求失败处理
console.log(error);
});
},
sogou_func:function(){
this.is_load = false;
console.log('用户切换到搜狗翻译!');
},
tmt_func:function(){
this.is_load = false;
console.log('用户切换到搜狗翻译!');
},
//用户点击切换语言的时候重新触发翻译,第一个
switch_lang:function(source){
//判断点击的源语言还是目标语言
if( source == 'from' ) {
from = document.getElementById(source).value;
this.from = document.getElementById(source).value;
}
else if( source == 'to' ) {
this.to = document.getElementById(source).value;
to = document.getElementById(source).value;
}
//每次点击语言切换的时候都运行一次翻译接口
//显示加载按钮
this.is_load = true;
this.run_translation();
},
//设置接口属性
choose_api:function(api_name){
switch (api_name) {
case 'baidu':
this.api_name = 'baidu';
console.log(this.api_name);
//this.baidu_func();
break;
case 'youdao':
this.api_name = 'youdao';
console.log(this.api_name);
//this.youdao_func();
break;
case 'sogou':
this.api_name = 'sogou';
console.log(this.api_name);
break;
case 'tmt':
this.api_name = 'tmt';
console.log(this.api_name);
break;
default:
this.api_name = 'baidu';
console.log(this.api_name);
break;
}
},
//运行翻译接口
run_translation:function(){
console.log('运行了翻译接口!');
console.log(this.api_name);
//如果源内容是空的,不运行接口
if( this.content == '' ){
console.log('空内容,不运行接口!');
//隐藏加载按钮
this.is_load = false;
return false;
}
switch (this.api_name) {
case 'baidu':
//console.log('运行百度接口!');
//this.test();
this.baidu_func();
//console.log('运行百度接口!');
break;
case 'youdao':
this.youdao_func();
//console.log('运行有道接口!');
break;
case 'sogou':
this.sogou_func();
global_msg('还在开发中!');
//console.log('运行有道接口!');
break;
case 'tmt':
this.tmt_func();
global_msg('还在开发中!');
//console.log('运行有道接口!');
break;
default:
this.baidu_func();
break;
}
},//自动运行翻译接口
auto_run:function(){
this.is_load = true;
this.run_translation();
utools.removeSubInput();
},
//用户点击切换翻译接口时
switch_api:function(api_name){
this.is_load = true;
//设置接口
this.choose_api(api_name);
//激活选项
//批量将激活按钮设置为false
for(let key in this.is_click){
this.is_click[key] = false;
}
//然后再将点击了的选项激活
this.is_click[api_name] = true;
//运行对应接口
this.run_translation();
},//用户点击设置按钮
setting:function(){
//点击设置按钮,激活弹窗
this.is_active = 'is-active';
},
//关闭设置按钮
close_window:function(){
this.is_active = '';
},//点保存按钮
save_setting:function(api){
switch (api) {
case 'baidu':
u_set('bm_baidu_appid',this.baidu.appid);
u_set('bm_baidu_secret_key',this.baidu.secret_key);
global_msg('已保存!');
console.log(this.baidu.appid);
console.log('百度设置成功!');
break;
case 'youdao':
u_set('bm_youdao_appid',this.youdao.appid);
u_set('bm_youdao_secret_key',this.youdao.secret_key);
global_msg('已保存!');
console.log('有道设置成功!');
break;
default:
break;
}
console.log('保存成功');
},//插件初始化
init:function(){
//设置百度API信息
this.baidu.appid = u_get('bm_baidu_appid');
this.baidu.secret_key = u_get('bm_baidu_secret_key');
//设置有道API信息
this.youdao.appid = u_get('bm_youdao_appid');
this.youdao.secret_key = u_get('bm_youdao_secret_key');
console.log('插件初始化完成!');
},//打开url
open_url:function(url){
utools.shellOpenExternal(url);
}
}
});
function get_to_lang(content){
//获取目标语言
var to = document.getElementById("to").value;
//如果目标语言不是auto,则直接返回
if( to != 'auto' ) {
return to;
}
var pattern = new RegExp("[\u4E00-\u9FA5]+");
var pattern2 = new RegExp("[A-Za-z]+");
//如果是中文则返回英文
if(pattern.test(content)){
return 'en';
}
else if(pattern2.test(content)){
return 'zh';
}
}
//将百度翻译结果处理拼接
function deal_baidu_results(results){
console.log('百度翻译处理结果!');
//关闭加载按钮
app.is_load = false;
console.log(results);
if( results.error_code > 0 ) {
console.log('百度接口发生了错误!');
app.err_msg.content = results.error_msg;
app.err_msg.status = true;
//定时关闭提示信息
window.setTimeout(function(){
app.err_msg.status = false;
},5000);
return false;
}
else{
results = results.trans_result;
var content = '';
for(i = 0;i < results.length;i++) {
content += results[i].dst + "\n";
}
app.results = content;
}
}
//将有道翻译结果处理拼接
function deal_youdao_results(results){
console.log('有道翻译结果!');
//关闭加载按钮
app.is_load = false;
//打印结果数据
console.log(results);
//当发生错误时
if( results.errorCode > 0 ) {
switch (results.errorCode) {
case '101':
error_msg = '缺少必填的参数!';
break;
case '102':
error_msg = '不支持的语言类型!';
break;
case '103':
error_msg = '翻译文本过长!';
break;
case '104':
error_msg = '不支持的API类型!';
break;
case '105':
error_msg = '不支持的签名类型!';
break;
case '106':
error_msg = '不支持的响应类型!';
break;
case '107':
error_msg = '不支持的传输加密类型!';
break;
case '108':
error_msg = '应用ID无效!';
break;
case '109':
error_msg = 'batchLog格式不正确!';
break;
case '109':
error_msg = 'batchLog格式不正确!';
break;
case '111':
error_msg = '开发者账号无效!';
break;
case '112':
error_msg = '请求服务无效!';
break;
case '113':
error_msg = 'q不能为空!';
break;
default:
error_msg = '未知错误!';
break;
}
console.log('有道接口发生了错误!');
app.err_msg.content = error_msg;
app.err_msg.status = true;
//定时关闭提示信息
window.setTimeout(function(){
app.err_msg.status = false;
},5000);
return false;
}
else{
results = results.translation;
var content = '';
for(i = 0;i < results.length;i++) {
content += results[i] + "\n";
}
app.results = content;
}
}
//有道自身提供的内容处理
function truncate(q){
var len = q.length;
if(len<=20) return q;
return q.substring(0, 10) + len + q.substring(len-10, len);
}
//简化utools官方的键值对
function u_get(key){
var result = utools.db.get(key);
if( result == null ){
return null;
}
else{
return utools.db.get(key).data;
}
}
function u_set(key,value){
//保存百度密钥
var result = utools.db.get(key);
if( result == null ){
utools.db.put({
_id: key,
data: value
});
}
else{
utools.db.put({
_id: key,
data: value,
_rev: result._rev
});
}
}
//全局消息提示框
function global_msg(content){
app.g_msg.content = content;
app.g_msg.status = true;
window.setTimeout(function(){
app.g_msg.status = false;
},3000);
}
//复制结果
//复制链接
function copy_result(){
var copy = new clipBoard('', {
beforeCopy: function() {
//var content = app.results;
},
copy: function() {
return app.results;
},
afterCopy: function() {
}
});
global_msg('结果已复制!');
}