gnome shell google translater extension 選字取詞翻譯

最近換 fedora 15 一切都很好…

只有以前在 windows 上面用的選字翻譯 google translate client 沒有 linux 的版本,搜尋一下發現在 linux pygtk 上選詞已經被實作成事件了~ gdk.SELECTION_PRIMARY,因此實作起來應該不難,

開始了今天的旅程……順便解釋幾點概念 :

gnome-shell :

linux 桌面 gnome 的第三版,做了很大介面的改變,畫面跟架構都是, gnome 背後是採用 gtk 在運作,相似的桌面環境專案有 KDE(採用 nokia Qt)

pygtk , pygi:

gtk 有很多語言的實作版本,在 python 版本被稱為 pygtk ,目前版本似乎是 gtk 2.x,在新的 gnome 開始採用 GObject 的概念,因此 gnome shell 裡面現在有一個叫 pygi (pygobject) 是想把 gtk api 動態 binding 到各語言的專案?(這邊是以前在聽過人分享的),然後這邊的版本是 gtk3,使用上的差亦是一個是 import gtk 一個是 from gi.repository import Gtk,

這裡有文件教你怎麼從舊(pygtk)的轉到新(pygi)的 https://live.gnome.org/PyGObject/IntrospectionPorting 。

gnome shell extensions

然後就是 gnome-shell 上面要開發程式啥咪都可以用 ,只是有一個稱為 gnome shell extension 的開發好像主要是用 gjs (gnome javascript),因此可以玩一下新版本的 ECMAScript,但是 api 都不一樣哭哭..,也不知道文件在哪只能瞎找範例來套。

但是 gtk 的 binding 都能用就是哩~ 可以用 gnome-shell-extension-tool 建立一個範例來參考~

message tray

gnome shell 訊息通知的一個機制 ,就是整個桌面最下方的 bar ,包含了右邊的常駐小圖示,

跟下方的想 Notification 提醒視窗,出現一下會消失,播放軟體用來顯示音樂的換首,而我是想要用那個框框來顯示翻譯的內容跟前往字典的按鈕~

google 翻譯

成品可能還要整理一下…大致上作法是用 python 去監聽滑鼠選字事件,可以分為被動跟主動,

被動就是複製字才觸發,主動就是選字就觸發。

然後用 dbus 執行 gjs 把字的內容加到 message tray 裡面然後顯示兩個按鈕,一個按鈕可以連去 google 字典,一個可以連去 google 搜尋…目前是用複製才觸發,因為選字觸發的時機點控制不好 message tray 會大爆發…但是我懶的改…

程式

貼出一段用 python 把文字查出來以後丟往這個 js 來顯示…,其實應該能用 python 直接做完是更一致啦…

const St = imports.gi.St;
const Mainloop = imports.mainloop;
const Main = imports.ui.main;
const Shell = imports.gi.Shell;
const PopupMenu = imports.ui.popupMenu;
const Gettext = imports.gettext;
const MessageTray = imports.ui.messageTray;
const Util = imports.misc.util;
const Lang = imports.lang;

let source = new MessageTray.SystemNotificationSource();
Main.messageTray.add(source);
let src = '翻譯文字';
let text = '翻譯結果';
let notification = new MessageTray.Notification(source, text, null);
notification.addButton('gt::dict', "Dictionary");
notification.addButton('gt::search', "Search");
notification.src = src;
notification.connect('action-invoked', Lang.bind(notification, function(n, actionid) {
    if(actionid == 'gt::dict') {
        Util.spawn(["google-chrome", "http://www.google.com.tw/m/search?site=dictionary&gdm=1&wtr=1&q="+this.src]);
    }
    else if(actionid == 'gt::search') {
        Util.spawn(["google-chrome", "http://www.google.com.tw/#?hl=zh-TW&q="+this.src]);
    }
}));
notification.setTransient(true);
source.notify(notification);

參考資源:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *