はじめに
ちょっと真面目に公開してみようかというソースコードを書くことになったので、Git のcommit メッセージも英語にしようかということに。ただ、下記のような問題もあって、何か良い方法はないかと思案することに。
- 仲間内でならともかく公開する前提でのレベルの英訳になっているか自信がない
- 日本語も並べて書いておかないと日本語メンバーにとっても読みづらい
- でも英語・日本語両方別々に書くのは面倒
そこで、commit メッセージを自動翻訳する方法がないかと調べてみると、DeepL APIを使ってうまくやっている事例を発見。ただ、文字化けしているのか、試してみてもどうもうまくいかないのでちょっと粘ってみました。
事前準備
まず、リポジトリに依存しない共通の準備作業をしておきます。
DeepL のAPIキーを取得する
とりあえず小規模での開発を想定して、DeepL の無償版を使用します。
まず、下記からDeepLにログインしてください。アカウントがなければ作成しておきましょう。
続いて、アカウントアイコンをクリックし、「アカウント」を選択します。
出てきた画面から「APIキーと制限」を選択し、APIキー(*1)を控えておきます。
jq をインストールする
DeepL API からの応答はJSON 形式で返ってくるため、これを解析できるようjq をインストールしておきます(Windows ではデフォルトでインストールされていないようです)。
上記から必要な実行ファイルを取得し、適当な場所に配置して
配置されたパス(*2)をメモしておきます。
commit メッセージの文字コード設定
コマンドライン上で下記を実行し、commit メッセージの文字コードをUTF-8 にしておきます。
ここでの文字コード設定が変わっていると問題発生する可能性があるので、念のため確認しておきましょう。
git config --global i18n.commitEncoding utf-8
git config --global i18n.logOutputEncoding utf-8
環境変数ファイルを記述する
上述した環境変数などの設定はすべて環境変数ファイルに記述しておきます。
今回はホームディレクトリ(C:/User/XXX/)の直下に.env.git.deepl というファイルを作成し、
このファイルの中身を下記のように記述しておきます。
# DeepL APIキーなどを設定
export DEEPL_API_KEY="APIキー(*1)"
# Gitの文字コード設定(念のため)
export LANG="ja_JP.UTF-8"
export LC_ALL="ja_JP.UTF-8"
export PATH=$PATH:(配置されたパス(*2))
(配置されたパス(*2))の部分は下記のようにドライブ名とディレクトリ名をセットにして記述します。
この記述により、環境変数PATH にパスを追加し、jq コマンドを実行できるようにします。
/c/Users/XXX/YYY/jq
また、DEEPL_API_KEYに指定したAPIキーはこの後のスクリプトで使用します。
環境変数確認
bash を起動し、
jq コマンドを実行して下記のように表示されればOKです。
$ source ~/.env.git.deepl
$ jq --help
jq - commandline JSON processor [version 1.8.1]
Usage: jq [options] <jq filter> [file...]
jq [options] --args <jq filter> [strings...]
jq [options] --jsonargs <jq filter> [JSON_TEXTS...]
jq is a tool for processing JSON inputs, applying the given filter to
its JSON text inputs and producing the filter's results as JSON on
standard output.
The simplest filter is ., which copies jq's input to its output
unmodified except for formatting. For more advanced filters see
the jq(1) manpage ("man jq") and/or https://jqlang.org/.
Example:
$ echo '{"foo": 0}' | jq .
{
"foo": 0
}
Command options:
-n, --null-input use `null` as the single input value;
-R, --raw-input read each line as string instead of JSON;
-s, --slurp read all inputs into an array and use it as
...
念のため、API キーの中身も確認しておきましょう。
$ source ~/.env.git.deepl
$ echo $DEEPL_API_KEY
(DEEPL_API_KEY の中身)
リポジトリ毎の事前準備
本節で説明する作業はリポジトリ毎に実施する必要があります。
スクリプトを記述する
.git/hooks/prepare-commit-msg がなければ追加し、以下のように記述します。
#!/bin/bash
MSG_FILE=$1
ORIGINAL_MSG=$(cat "$MSG_FILE")
source ~/.env.git.deepl
# DeepL APIで翻訳(要APIキー)
EN_MSG=$(curl -s --ssl-no-revoke -X POST "https://api-free.deepl.com/v2/translate" \
-d "auth_key=$DEEPL_API_KEY" \
--data-urlencode "text@${MSG_FILE}" \
-d "target_lang=EN" \
| jq -r '.translations[0].text')
# 英語を先頭に追加
echo -e "$EN_MSG\n---\n$ORIGINAL_MSG" > "$MSG_FILE"
他のサイトを見て試した時にはまったのが--data-urlencode の部分です。
最初に試した時は--data-urlencode ではなく-d オプションのままでパラメータを付与しており、
これがどうもよくなかったようです。
日本語テキストを送信するときは--data-urlencode を使用してURLエンコードをしてやらないと
DeepL 側で日本語文字(UTF-8)を受理したと判定されないようで、おかしな結果が返ってきます。
DeepL API からの応答を見てみても、日本語ではなくほかの言語として認識されていることが確認できるかと思います。
動作確認
早速試してみましょう。
下記のようなメッセージでcommit してみます。
すると下記のようなコミットメッセージが記録されていることが確認できます。
上手くいきました!
英訳されたメッセージが最初にきて、後半には日本語の原文がきています。