note_-_記事見出し

翻訳アプリ - hnyk

わい「アプリ公開なんて何年ぶりだよ」

Translate Tabという便利な翻訳ツールがMacにはあるんですが、レイアウトや動作に一部不満があったので「Electronだったら簡単にできるのでは?」と思い、作ってみました。

実際、組み始めると色々問題も出てきて…Translate Tabでよかったんじゃ?と思いましたがとりあえずは動く状態まで来ましたので後悔...じゃなくて公開します。

ちなみにTranslate Tabはコチラ

ちょっとまって!バグバグVerです!

そうですバグがあります、ええ忘れずに入れてます。

ダウンロード - バグバグVer

MacOSX版とWin10版を置いておきます。
双方とも署名はしていないので、セキュリティに怒られるともいますが気になる方は使用しないでください。

僕はOSXでしか使用していないのでWin10はおまけです。

💾hnyk 0.1.2 for MacOSX Catalina

💾hnyk 0.1.0 for Windows 10

普通に使う(Mac / Win)

インスコして起動するとメニューアイコン(winはタスクとレイ)に常駐します。

アイコンをクリックするとウインドウが開くので、左側に翻訳したい文面をコピペ or 入力すると右側に翻訳結果が出てきます。

PopClipで使う(Mac)

Macでは有名なPopClipというアプリの拡張を入れて使います。

MacでPopClipがインスコされている環境なら、以下をダウンロードして解凍->ダブクリで使えるようになります。

💾PopClip Extension

アプリと同じく署名していないのでダイアログで警告されます。

ホットキーで使う(Mac / Win)

右上のアイコンからメニューを呼び出し「Preference...」をクリックすると設定画面が表示されます。

スクリーンショット 2020-02-01 22.51.45

その中にHotkeyの項目があるので有効にしつつお好きなキーを設定してください。

スクリーンショット 2020-02-01 23.12.30

Read text from clipboard のチェックを入れると、ホットキーで呼び出した時にクリップボードのテキストを取得して翻訳します。英文などをコピーしてホットキーで呼び出すと翻訳されるという流れです。

BetterTouchToolなどで使う(Mac / Win)

BetterTouchToolなどのキーボードショートカットをカスタマイズできるアプリを組み合わせることで便利に使用できます。

カスタム内容としては「Cmd+C(Ctrl+C)」と「hnykのホットキー」を連続して呼び出すマクロを登録するという感じ。ショートカットキー1つで「翻訳対象をコピー」->「hnykで翻訳」とつなぐことができます。

Read text from clipboardのチェックを忘れずに。

BetterTouchTool for Macで使う

MacであればBetterTouchToolとosascriptを組み合わせて実行することができます。

動きとしてはBetterTouchToolのアクションで「選択したテキストを変数selected_textに保存します」を実行した後以下のシェルスクリプトを実行するようにしまます。

が、上記のCmd+Cからのアクションで動くので必要ないかも?

osascript  -l JavaScript <<EOF

const BetterTouchTool = Application('BetterTouchTool');
BetterTouchTool.includeStandardAdditions = true;

const selectedText = BetterTouchTool.get_string_variable("selected_text");

app = Application.currentApplication()
app.includeStandardAdditions = true
app.doShellScript("/Applications/hnyk.app/Contents/MacOS/hnyk --sourcetext=\"" + selectedText + "\"");

EOF

コマンド引数で使う(Mac / Win)

コマンド引数を以下のようにして渡すと翻訳してくれます。

Mac
/Applications/hnyk.app/Contents/MacOS/hnyk --sourcetext="translate this\!"

Win
hnyk.exe --sourcetext="translate me\!"

翻訳エンジンを変更する - Translate Shell(Mac / Win)

Translate Shellをインストールすることで翻訳エンジンとして使うことができます。

Macならhomebrewで入れると簡単ですね。WinはCygwin使うだとかWSL環境用意してどうのこうのらしいですが試してません、すみません🙇‍♂️

ホットキーの項目のように右上のアイコン ->「Preference...」で設定を開くと「Translate Engine」という項目があるので、ここでTranslate Shellを有効にしてください。

スクリーンショット 2020-02-01 23.12.30

翻訳エンジンを変更する - Custom API(Mac / Win)

どこかに翻訳サーバーを立てれちゃう人は、Custom APIという形でエンジンを追加できます。

翻訳元データはPOSTでサーバーにリクエストされます。

Google Apps Scriptでは以下のようなスクリプトを用意することで使用可能です。GASを使う場合、公開する際のセキュリティにはお気をつけください、何かあっても責任は置いかねますよってのぉ ゴホッゴホッ👴

function doTranslate(text, source, target) {
 if (!source) source = '';
 var translated = LanguageApp.translate(text, source, target);
 return ContentService
 .createTextOutput(JSON.stringify({ translated: translated, source: source, target: target }))
   .setMimeType(ContentService.MimeType.JSON); 
}

function doGet(e) {
 var p = e.parameter;
 return doTranslate(p.text, p.source, p.target);
}

function doPost(e) {
 return doGet(e);
}

アイコン右クリックと左クリック(Mac)

Macではメニューアイコンを左と右でクリックするのは役割が違います。

👈左クリック - 最後に動かしたウィンドウ位置で表示/非表示
👉右クリック - メニューアイコン付近の位置で表示/非表示

どうやって翻訳してんの?

ご想像の通りGoogle Translate APIを使用しています。

node向けのライブラリがあるのでそれを使用しているのですが正直グレーなフローだと思われます。TranslateShellも同様の処理だと思うので結局はグレーですね。

気になるようならご自分で正当にAPIをキックするサーバーを用意し、Custom APIを登録してもらえればと思います。

API制限かかったらどうすんの

大量に翻訳してるとAPI制限で使用できなくなることがあります。

複数のエンジンを有効にしている場合、ダメだったエンジンは優先度が下がって他のエンジンを使うように作っておりますので、エンジンを複数有効にする・Custom APIを複数登録すれば実質無制限かもしれないですね😅

あとがき

数日自分で使ってますがなんか動いてますわ アハハ🤣

自分はPopClipとBetterTouchToolのホットキー組み合わせで使ってます。WinだとPantherbarのExtensionを作れば動くんだと思いますが、今はそこまで考えていません(誰か作ってくれたら嬉しいくらいで

今後は翻訳データのキャッシュ機能を入れるなりi18対応するなり、自分が欲しい機能を優先で入れていこうと思っていますが、本業で手を付けられない状態が続くと放置しちゃうかも?

実務で使ってるので完全に放置にはならないですけどね😇

更新履歴

0.1.2 / 2020-05-08
* 入力欄へ自動フォーカス
* サーバー機能完全削除

0.1.1 / 2020-05-07
* translate shellでの翻訳時にうまく変換されない文字があったバグ修正
* サーバー機能仮削除

0.1.0
* 初期リリース


この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
2
残念なプログラマ🤪 エラートラップ?なにそれ😇

こちらでもピックアップされています

アプリ/ Webアプリ
アプリ/ Webアプリ
  • 1本

自作アプリの公開など?

コメントを投稿するには、 ログイン または 会員登録 をする必要があります。