# aardio 范例: AI 图文翻译 - 免 API key



```aardio
import win.ui;
import win.dlg.message;
import fonts.fontAwesome;
/*DSG{{*/
var winform = win.form(text="AI 图文翻译 - 免 API key";right=1169;bottom=573)
winform.add(
bkplus={cls="bkplus";left=-16;top=516;right=1171;bottom=575;anchors={left=1;right=1;bottom=1};bgcolor=0xD2D2D2;z=1};
btnOcr={cls="plus";text="识别文本 / AI 翻译";left=920;top=532;right=1089;bottom=562;align="left";anchors={right=1;bottom=1};color=0x3C3C3C;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome');padding={left=8}};iconText='\uF0F6';notify=1;textPadding={left=25};z=6};
btnOpen={cls="plus";text="打开图像文件";left=459;top=532;right=592;bottom=562;align="left";anchors={left=1;bottom=1};color=0x3C3C3C;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome');padding={left=8}};iconText='\uF03E';notify=1;textPadding={left=25};z=4};
btnPaste={cls="plus";text="粘粘自剪贴板";left=326;top=532;right=445;bottom=562;align="left";anchors={left=1;bottom=1};color=0x3C3C3C;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome');padding={left=8}};iconText='\uF0EA';notify=1;textPadding={left=25};z=5};
btnScreenClip={cls="plus";text="截屏";left=242;top=532;right=312;bottom=562;align="left";anchors={left=1;bottom=1};color=0x3C3C3C;font=LOGFONT(h=-13);iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome');padding={left=8}};iconText='\uF030';notify=1;textPadding={left=25};z=8};
comboLanguage={cls="combobox";left=728;top=537;right=866;bottom=563;anchors={right=1;bottom=1};edge=1;items={};mode="dropdownlist";vscroll=1;z=9};
edit={cls="richedit";left=589;top=0;right=1168;bottom=515;anchors={top=1;right=1;bottom=1};aw=1;edge=1;hscroll=1;link=1;multiline=1;vscroll=1;z=3};
picturebox={cls="plus";text="请复制图像到剪贴板 / 或拖放文件到此处";left=0;top=0;right=584;bottom=515;anchors={left=1;top=1;bottom=1};aw=1;bgcolor=0xFFFFFF;color=0x999999;edge=1;font=LOGFONT(h=-16);iconStyle={font=LOGFONT(h=-60;name='FontAwesome')};iconText='\uF03E';repeat="scale";textPadding={top=100};z=2};
splitter={cls="splitter";left=583;top=0;right=588;bottom=515;anchors={top=1;bottom=1};bgcolor=0xFFFFFF;frame=1;z=7};
static={cls="static";text="目标语言：";left=613;top=533;right=726;bottom=563;align="right";anchors={right=1;bottom=1};center=1;transparent=1;z=10}
)
/*}}*/

var ocr = function(winform,lang,imgBuffer){

	import web.rest.aiChat;
	
	// 免 API key 的 AI 图文翻译，速度飞快
	var aiClient = web.rest.aiChat(
		url = "https://index-translate.bilibili.com/v1";
		model = "Index-Translate-35B-A3B"
	)
	
	import web.rest.aiChat.messages;
	var msg = web.rest.aiChat.messages();
	msg.prompt("请识别图像并直接输出识别结果（不要翻译）：" ,imgBuffer);
	
	var empty;
	var resp,err = aiClient.messages(msg,
		function(deltaText,reasoning){
			if(!empty){
				winform.edit.text = "";
				empty = true;
			}
			
			winform.edit.appendText(deltaText);
		}
	)
		
	var msg = web.rest.aiChat.messages();	
	msg.prompt('请直接翻译以下内容到`'+lang+'`语言（直接输出翻译结果，不要进行任何解释）：\n\n' + winform.edit.text);
	winform.edit.print("");
	
	var resp,err = aiClient.messages(msg,
		function(deltaText,reasoning){
			winform.edit.appendText(deltaText);
		}
	)
	
	winform.btnOcr.disabledText = null;	
	winform.picturebox.disabledText = null;	
}

winform.btnOcr.oncommand = function(id,event){
	if(winform.picturebox.backgroundBitmap){ 
		winform.edit.text = "识别中 ..."
		winform.btnOcr.disabledText = ['\uF254','\uF251','\uF252','\uF253','\uF250',text='识别中 ...']
		
		var lang = winform.comboLanguage.selText;
		thread.invoke(ocr,winform,lang,winform.picturebox.backgroundBitmap.saveToBuffer("image/png"));
	}
	else {
		winform.msgErr("请先复制图像到剪贴板 / 或打开图像文件")
	} 
}

import fsys.dlg;
winform.btnOpen.oncommand = function(id,event){
	var path = fsys.dlg.open("图像文件|*.jpg;*.jpeg;*.jfif;*.bmp;*.gif;*.png;*.tif;*.tiff;*.webp||",,,winform)
	if(path){
		if(string.endsWith(path,".webp",true)){
			import gdip.webp;
		}
		winform.picturebox.background = path; 
		winform.picturebox.backgroundBitmap = gdip.bitmap(path);
		winform.picturebox.text = null;
        winform.picturebox.iconText = null;
	}
}

winform.onDropFiles = function(files){
	var path = files[1]
	if(path){
		if(string.endsWith(path,".webp",true)){
			import gdip.webp;
		}
		
		winform.picturebox.backgroundBitmap = gdip.bitmap(path);
		if(winform.picturebox.backgroundBitmap){
			winform.picturebox.background = path; 
		} 
	}
}

import win.clip.bitmap;
winform.btnPaste.oncommand = function(id,event){
	var bmp = win.clip.bitmap.read()
	if(bmp){ 
		winform.picturebox.backgroundBitmap = bmp;
		winform.picturebox.background = bmp;
		winform.picturebox.text = null;
        winform.picturebox.iconText = null;
	}
}

import win.clip.viewer;
winform.clipViewer = win.clip.viewer(winform);
winform.clipViewer.onDrawClipboard = function(){ 
	if(winform.screenclip){ 
		win.showForeground(winform.hwnd);
		winform.screenclip = false
	}
	winform.btnPaste.oncommand();
}
winform.btnPaste.oncommand()

winform.btnScreenClip.oncommand = function(id,event){
	winform.show(6/*_SW_MINIMIZE*/);
	winform.screenclip = true;
	
	import win.clip.screen;
	win.clip.screen();
}

winform.onActivate = function(state,hwndOther,minimized){
	if(state){
		winform.screenclip = false;		
	}
} 

winform.edit.enablePopMenu()

winform.splitter.split(winform.picturebox,winform.edit);

var btnSkin = {
    color = {
        default = 0xFF3C3C3C;
        hover = 0xFF0078D4;
        active = 0xFF005A9E;
        disabled = 0xFFAAAAAA; 
    };
    background = {
        hover = 0x1A0078D4;
        active = 0x330078D4;
    }
}

for i,ctrl in [
    winform.btnPaste,
    winform.btnOcr,
    winform.btnOpen,
    winform.btnScreenClip
] {
    ctrl.skin(btnSkin);
}

winform.comboLanguage.items = ["zh（中文）","en（英语）","ja（日语）","ko（韩语）","ru（俄语）","fr（法语）","de（德语）","it（意大利语）","es（西班牙语）","pt（葡萄牙语）","ms（马来语）","th（泰语）","vi（越南语）"]

winform.comboLanguage.selIndex = 1;

winform.show();
win.loopMessage();
```

