Node

日英翻訳スクリプト on コマンドライン

こんな使い方ができるコマンドラインのスクリプトを作りたかったんです、昔から。tejは作ったスクリプトの名前でtranslate english japanese

$ tej en 翻訳 # enは日本語→英語のモード指定。
translation
$ tej ja translation # jaは英語→日本語のモード指定。
翻訳

vscodeでターミナルウィンドウを開いておいて、変数名決める時にぱぱっと叩くような想定です。

はじまりはとある投稿から

3 分で作る無料の翻訳 API with Google Apps Scriptという投稿を読ませていただいたのがきっかけ。あとはこのAPIを叩くスクリプトを書くだけでいけそう!と思い立ちました。ありがとうございます。

概要

  1. コマンドライン引数から翻訳する情報を受け取る
  2. APIにポストして結果を出力する

作る環境はapiが叩ければなんでもいいんですが、手っ取り早くnodeにしました。

コマンドライン引数から翻訳する情報を受け取る

やることは以下の2個。引数の処理です。

  • 翻訳のモード(en->ja, ja->en)を確認
  • 翻訳する内容を整形

重要なのはprocess.argvの仕様(最初2行のコメント)で、他は一例程度にご覧ください。

tej.js
// コマンドライン引数はprocess.argvで取得。
// 0はnode、1はファイル名、2以降がコマンドライン引数

// 翻訳のモードを確認。コマンドラインから翻訳先(target)を受け取るので
// 翻訳元(source)を判定。
const tgt = process.argv[2];
let src = "en";
if (tgt === "en") {
    src = "ja";
} else if(tgt === "ja") {
    src = "en";
} else {
    // usage関数:使い方をconsole.logするだけの関数です。お好みに作って下さい。
    // 個人利用だしエラー処理なんざ必要ねぇ、というならいらないです。
    usage("Unexpected mode");
    return;
}

// 翻訳する内容を整形。arv[3]以降が翻訳する内容。
// コマンドライン引数はスペースごとに区切られて配列に格納される
//  → 英文だとバラバラになるので別途配列にまとめて、スペースでjoin。
let words = [];
for(let i = 3; i < process.argv.length; i++) {
    words.push(process.argv[i]);
}
const text = words.join(" ");

// 作成した情報をAPIを叩く関数に渡します。
trans(text, src, tgt);

APIに送信して結果を出力する

やることは以下。

  • URLとポスト用データを生成
  • APIにポスト
  • APIの返信結果を出力

今回は通信クライアントにaxiosを使いました。マニュアル通りに書いただけ!

tej.js
const axios = require("axios");
const qs = require("qs");

const trans = (word, source, target) => {
    // URLの生成
    // api keyの取得方法は、前述の
    // 「3 分で作る無料の翻訳 API with Google Apps Script」
    // をご覧ください。
    const url = "https://script.google.com/macros/s/[api key]/exec";

    // ポスト用データの生成。
    // querystringしてContent-Typeを指定。こうしないとpostデータが空になります。
    // https://github.com/axios/axios#using-applicationx-www-form-urlencoded-format
    const params = qs.stringify({
        'text': word,
        'source': source,
        'target': target
    });
    const headers = {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        }
    };

    // APIにポスト
    axios
        .post(url, params, headers)
        .then((response) => {
            // APIの返信結果を出力。何のてらいもないconsole.log。
            console.log(response.data);
        })
        .catch((error) => {
            // お情け程度のエラー処理。
            console.error(error);
        });
}

あとはエイリアスにでも登録しておしまい。例えばbash。

~/.bash_profile
alias tej='/path/to/node /path/to/tej.js '

おわりに

「コマンドラインから引数を受け取る」「apiを叩く」という初歩的な技術を使っただけでできてしまったので、新規性は一切ないんですが…強いて言えばコマンドラインからapiを叩くスクリプトの雛形にはなっているかな、と思います。vscodeとの連携がなかなか便利だったので思わずの初投稿です。