百度翻译

今天偶然看到百度开放平台,发现上面还有一个百度翻译的API接口。
于是就写了一个简单的词典程序。代码如下。

#include <libsoup/soup.h>
#include <json-glib/json-glib.h>

#define CLIENT_ID “WOkykfPXheIbcGE2UvqRSU1f”

#define TARGET_URL “http://openapi.baidu.com/public/2.0/bmt/translate?
“from=auto&to=auto&client_id=” CLIENT_ID “&q=%s”

int main(int argc, char *argv)
{
if(argc!=2)
return;

gchar *q=argv[1];

SoupSession *session=soup_session_new();

gchar *target=g_strdup_printf(TARGET_URL,q);

SoupMessage *msg=soup_message_new("GET",target);
if(msg==NULL){
	g_error("Fail to create HTTP message 'GET %s'",target);
}

guint status;
status=soup_session_send_message(session,msg);
if(status!=SOUP_STATUS_OK){
	g_error("HTTP response %d",status);
}

SoupMessageBody *body=NULL;
g_object_get(msg,"response-body",&body,NULL);

JsonParser *parser=json_parser_new();
if(json_parser_load_from_data(parser,body->data,body->length,NULL)
			==FALSE){
	g_error("Invalid HTTP response\n%s",body->data);
}	

JsonNode *root_node=json_parser_get_root(parser);
JsonObject *root_obj=json_node_get_object(root_node);
const gchar *from=json_object_get_string_member(root_obj,"from");
const gchar *to=json_object_get_string_member(root_obj,"to");
JsonArray *results=json_object_get_array_member(root_obj,"trans_result");
g_printf("%s ==> %s\n",from,to);
gint i,len=json_array_get_length(results);
for (i = 0; i < len; i++) {
	JsonObject *res=json_array_get_object_element(results,i);
	const gchar *src=json_object_get_string_member(res,"src");
	const gchar *dst=json_object_get_string_member(res,"dst");
	g_printf("\t%s : %s\n",src,dst);
}


g_object_unref(parser);
g_object_unref(msg);
g_object_unref(session);

return 0;

}

保存后编译
gcc a.c pkg-config --libs --cflags libsoup-2.4 json-glib-1.0
其中 CLIENT_ID是注册百度开放平台开发者帐号后拿到的一个ID。

运行结果如图所示
Screenshot from 2014-04-05 20:01:05.png

Screenshot from 2014-04-05 20:02:03.png

我想是不是可以依据这个写一个简单的百度翻译的客户端。

可以呀,能否在Dash中实现呢,这样翻译就方便了

可以一试,可是我找不到任何关于创建dash的文档。
我搞不清楚这几个东西的概念与关系,
dash, unity-len,scope,

点击左上角的 图标,显示的是Dash , 可以进行搜索。


在Dash面板底部,如图,为lens,包括音乐,文件,视频,图片等等。
lens.png
scope可以看成是后台。
那视频搜索为例,Scope主要是从优库上获得数据,按照一定规则进行处理,将搜索结果显示在Dash面板上。

如果你感兴趣,可以看下源码
下面是视频搜索的在LP上的地址,可以下载源码
https://launchpad.net/unity-china-video-scope

我去看看的

没法看,用vala写的也就算了。
可是没有一点注释,文档说明

这是开发文档,http://developer.ubuntu.com/scopes/overview/
中文资料暂时没发现,等你翻译了。

之前有个非常简单的中文介绍文档,如果你感兴趣,可以给你

官网那个我看过,上面是14.04的,而且以手机平台在说明的(不知道桌面是否一样),主要是依赖的libunity-scope-dev,在13.10的源里没有。我想13.10与14.04的方式又不太一样吧。
13.10比较尴尬的是,一方面不能用以前quickly+python的方式创建unity-lens。一方面又与14.04不太一样。估计是因为为了统一平台做了改变吧。

相差不大,我用的1404测试版本也没有libunity-scope-dev 这个包。不记得有这个依赖。
我在1404上编译过music,video,以及photo 搜索,都没问题。

我觉得还是先写个简单的客户端形式好了

我写了一个很简单的客户端形式的百度翻译。
Screenshot from 2014-04-11 20:16:31.png
Screenshot from 2014-04-11 20:16:01.png
Screenshot from 2014-04-11 20:16:52.png

设置为窗口置顶,看英文的时候还是比较方便的。
不足的是这个翻译的结果有点单一。

有兴趣的可以下载试试

bzr branch lp:~wiiiky-v/+junk/wdict

或者

git clone https://github.com/wiiiky/wdict.git

依赖libsoup,libappindicator,json-glib还有就是gtk±3.0

sudo apt-get install libsoup2.4-dev libappindicator3-dev libjson-glib-dev libgtk-3-dev

添加了划词翻译的功能,
其实是周期为500ms的回调检查用户是否选中了一段文本,然后翻译