lina_dictoにて、選択テキストを右クリックメニューでGoogle検索とGoogle翻訳にかける機能を実装しました。
右クリックメニューはcontextmenuで設定できます。
プロセス間通信がんばってねという記述もありますが、必要ありません。
window.getSelection();の戻り値で取れます。
返り値はオブジェクトなのでtoString()を忘れないよう注意。
Google検索のURLは
`'https://www.google.com/search?q=' + keyword.replace(/\s+/, '+');`
といった感じで生成。
Google翻訳のURL生成
```
static get_google_translate_url(keyword, src_lang, dst_lang)
{
// ex. eo to ja, `https://translate.google.co.jp/#eo/ja/bona`
const link = 'https://translate.google.co.jp'
+ '/#' + src_lang
+ '/' + dst_lang
+ '/' + encodeURIComponent(keyword);
return link;
}
{
// ex. eo to ja, `https://translate.google.co.jp/#eo/ja/bona`
const link = 'https://translate.google.co.jp'
+ '/#' + src_lang
+ '/' + dst_lang
+ '/' + encodeURIComponent(keyword);
return link;
}
```
ブラウザはOpenにURLを渡すとデフォルトブラウザが開きます。
`require('electron').shell.openExternal(link)`
結果、lina_dictoで使っている右クリックメニューのコードは以下。
```
static init()
{
//! context menu (light click menu)
var menu = new Menu();
menu.append(new MenuItem({
label: 'Copy',
accelerator: 'CmdOrCtrl+C',
role: 'copy'
}));
menu.append(new MenuItem({
label: 'Paste',
accelerator: 'CmdOrCtrl+V',
role: 'paste'
}));
menu.append(new MenuItem({
label: 'goto google search(external browser)',
click: function(){
const keyword = window.getSelection().toString();
if(0 == keyword){
alert("text no selected");
return;
}
const link = 'https://www.google.com/search?q=' + keyword.replace(/\s+/, '+');
//const src_lang =;
//const dst_lang = '';
//const link = ExternalBrowser.get_google_translate_url(
// keyword, src_lang, dst_lang);
ExternalBrowser.open(link);
}
}));
menu.append(new MenuItem({
label: 'goto google translate(external browser)',
click: function(){
const keyword = window.getSelection().toString();
if(0 == keyword){
alert("text no selected");
return;
}
const isEsp = Esperanto.is_esperanto_string(keyword);
const src_lang = (isEsp ? Language.get_code_by_google() : 'ja');
const dst_lang = ((! isEsp) ? Language.get_code_by_google() : 'ja');
const link = ExternalBrowser.get_google_translate_url(
keyword, src_lang, dst_lang);
ExternalBrowser.open(link);
}
}));
window.addEventListener('contextmenu', function (e) {
e.preventDefault();
menu.popup(remote.getCurrentWindow());
}, false);
return true;
}
{
//! context menu (light click menu)
var menu = new Menu();
menu.append(new MenuItem({
label: 'Copy',
accelerator: 'CmdOrCtrl+C',
role: 'copy'
}));
menu.append(new MenuItem({
label: 'Paste',
accelerator: 'CmdOrCtrl+V',
role: 'paste'
}));
menu.append(new MenuItem({
label: 'goto google search(external browser)',
click: function(){
const keyword = window.getSelection().toString();
if(0 == keyword){
alert("text no selected");
return;
}
const link = 'https://www.google.com/search?q=' + keyword.replace(/\s+/, '+');
//const src_lang =;
//const dst_lang = '';
//const link = ExternalBrowser.get_google_translate_url(
// keyword, src_lang, dst_lang);
ExternalBrowser.open(link);
}
}));
menu.append(new MenuItem({
label: 'goto google translate(external browser)',
click: function(){
const keyword = window.getSelection().toString();
if(0 == keyword){
alert("text no selected");
return;
}
const isEsp = Esperanto.is_esperanto_string(keyword);
const src_lang = (isEsp ? Language.get_code_by_google() : 'ja');
const dst_lang = ((! isEsp) ? Language.get_code_by_google() : 'ja');
const link = ExternalBrowser.get_google_translate_url(
keyword, src_lang, dst_lang);
ExternalBrowser.open(link);
}
}));
window.addEventListener('contextmenu', function (e) {
e.preventDefault();
menu.popup(remote.getCurrentWindow());
}, false);
return true;
}
```
0 件のコメント:
コメントを投稿