🗣️

Git のコミットメッセージを自動翻訳する

2022/08/04に公開

はじめに

さまざまな理由で Git のコミットメッセージを母国語以外で書く必要がある場面があるかと思います。母国語以外でコミットメッセージを書こうとすると、言語の壁から "fixed" 1 単語みたいな意味のないコミットメッセージになりがちです(要出典)。これを避けるためにコミットメッセージを母国語で書いて機械翻訳することを考えます。

prepare-commit-msg フック

Git の prepare-commit-msg を使うと、コミットメッセージの書き換えが簡単にできます。

prepare-commit-msg は 3 つの引数をとり、 1 つ目の引数($1)がコミットメッセージを含むファイル名です。このファイルを上書きすることでコミットメッセージを書き換えることができます。

例えば以下のようにするとコミットメッセージがつねに hoge になります。

.git/hooks/prepare-commit-msg
#!/bin/bash

COMMIT_MSG_FILE="$1"

echo "hoge" >"$COMMIT_MSG_FILE"

機械翻訳 API

メッセージの翻訳には好きな機械翻訳 API が利用できます。例えば以下に挙げるようなものがあります。

機械翻訳 API 処理 Markdown 対応 無料枠
Amazon Translate 非同期 200 万文字
Azure Cognitive Services Translator(テキスト翻訳) 同期 200 万文字
Azure Cognitive Services Translator(ドキュメント翻訳) 非同期 200 万文字
Cloud Translation 同期 50 万文字
DeepL API 同期 50 万文字

※ 2022 年 8 月 4 日時点

コミットメッセージを自動翻訳する

Azure Cognitive Services Translator(テキスト翻訳)を使う場合を例にします。この翻訳サービスは Markdown をサポートしませんが、 Markdown テキストを送っても経験的にそんなにフォーマットは崩れません。英語に翻訳する場合は以下のように prepare-commit-msg フックを作成します。

.git/hooks/prepare-commit-msg
#!/bin/bash

COMMIT_MSG_FILE="$1"

commit_message=$(
  cat "${COMMIT_MSG_FILE}" \
  | sed -z 's/\n/\\n/g;s/"/\\"/g'
)
translation_result=$(
  curl -X POST "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=en" \
    -H 'Content-Type: application/json' \
    -H 'Ocp-Apim-Subscription-Key: <作成したリソースのキー>' \
    -H 'Ocp-Apim-Subscription-Region: <作成したリソースのリージョン>' \
    -d "[{\"Text\":\"${commit_message}\"}]"
)

echo $translation_result | jq -r ".[0].translations[0].text" >"$COMMIT_MSG_FILE"

補遺

より便利に使うための Tips。

翻訳後に修正が必要な場合

機械翻訳を修正する必要がある場合は、 git rebase -i HEAD で reword すれば好きなエディターでコミットメッセージを修正できます。

全リポジトリー一括対応

デフォルトではリポジトリー内の .git/hooks 内にフックのファイルを指定しますが、 core.hooksPath の config でオーバーライドすることができます。 git config --global core.hooksPath で全リポジトリーのデフォルトのフックを指定することができます。

上記のスクリプトの URL パラメーターの to に与える値を環境変数で指定するようにすれば、コミット時に必要なときだけ翻訳するように変えるのも簡単です。

Discussion