Claude Code の応答が、いつの間にか英語に切り替わるのを止める Stop hook です。
日本語で指示していても、ツールを何度も呼ぶ長い作業のあとや、英語のツール出力を読んだ直後に、途中報告や最終報告が英語で返ってくることがあります。CLAUDE.md に「日本語で応答する」と書いても、この切り替わりは止まりませんでした。そこで、ターンの終わりに本文を機械で検査し、英語だったら日本語で書き直させる hook を作りました。
- Claude がターンを終えようとすると、Stop hook が最後の応答の本文(hook の入力
last_assistant_message)と会話の記録(transcript)を読みます - そのターンの最終回答(最後のツール呼び出しより後に Claude が書いた本文)を取り出し、英字と日本語の文字数を数えます
- 英語主体の本文があれば、終了を止めて「日本語で書き直して」と差し戻します
- Claude が同じターンのうちに日本語で出し直します
ツールを呼ぶ前の途中の一言は検査しません。画面では実行ログの間に小さく出るだけで、英語が混ざっても最終回答が日本語なら読む側は困らないからです。
差し戻しは1ターンに1回だけです。書き直しがまた英語でも、そこで終了させるので、差し戻しが続くことはありません。
次のものは数えません。英語のコマンドや英文の下書きを見せるのは正当な使い方だからです。
- コードブロック(
```)とインラインコード - URL・メールアドレス・Markdown のリンク
- 英字が25文字未満の短い本文(「OK」程度の返事)
Claude Desktop(Claude Code)に、このリポジトリの URL を渡して頼むだけです。
https://github.com/minorun365/claude-code-japanese-guard これ設定しといて
あとは Claude Code が下の手順で入れてくれます。
ユーザーからこのリポジトリの設定を頼まれた Claude Code は、次の手順で入れてください。CLI で自分で入れる人も、同じ手順で入れられます。
-
hook を置く。
hooks/japanese-guard.pyを~/.claude/hooks/japanese-guard.pyに保存し、実行権限を付ける。mkdir -p ~/.claude/hooks curl -fsSL https://raw.githubusercontent.com/minorun365/claude-code-japanese-guard/main/hooks/japanese-guard.py -o ~/.claude/hooks/japanese-guard.py chmod +x ~/.claude/hooks/japanese-guard.py
-
~/.claude/settings.jsonに Stop hook を登録する。 既存の設定は消さず、hooks.Stopの配列に次の1件を足す。hooksやStopが無ければ作る。同じcommandがすでに登録されていれば、何もしない。{ "hooks": [ { "type": "command", "command": "~/.claude/hooks/japanese-guard.py" } ] }書き換えたあと、ファイルが JSON として読めることを確かめる。
python3 -c "import json,os;json.load(open(os.path.expanduser('~/.claude/settings.json')));print('OK')"自分の設定ファイルの書き換えが権限の都合で止められた場合は、無理に回避しない。足す内容をユーザーに示し、ユーザー自身で
settings.jsonに足してもらう。 -
動くことを確かめる。 何も渡さずに実行してエラーにならないこと(何も出力されなければ正常)を確かめる。
echo '{}' | ~/.claude/hooks/japanese-guard.py && echo OK
-
ユーザーに伝える。 入れたことと、設定が確実に読み込まれるのは新しく開いたセッションからであることを伝える。応答が英語になると、ターンの終わりに「日本語で書き直して」と差し戻されるようになる。
Python 3 だけで動きます。追加のパッケージは要りません。
環境変数で閾値を変えられます。
| 変数 | 既定 | 意味 |
|---|---|---|
JAPANESE_GUARD_MIN_LATIN |
25 |
英字がこれ未満の本文は判定しない |
JAPANESE_GUARD_RATIO |
3 |
英字の数が日本語の文字数のこの倍を超えたら英語主体とみなす |
JAPANESE_GUARD_WAIT |
3 |
最終回答が transcript へ書き込まれるのを待つ上限(秒)。Stop hook は書き込みより先に呼ばれることがあるため。last_assistant_message が英語なら待たずに差し戻す |
過去のセッションの記録に当てると、最後のターンで英語主体だった本文を表示します。
python3 ~/.claude/hooks/japanese-guard.py --check ~/.claude/projects/<プロジェクト>/<セッションID>.jsonlpython3 tests/test_japanese_guard.pyApache License 2.0