Skip to content

feat: CLIメッセージのi18n対応(デフォルト英語・configで言語選択)#37

Merged
polidog merged 1 commit into
mainfrom
feat/35
Jun 29, 2026
Merged

feat: CLIメッセージのi18n対応(デフォルト英語・configで言語選択)#37
polidog merged 1 commit into
mainfrom
feat/35

Conversation

@polidog

@polidog polidog commented Jun 29, 2026

Copy link
Copy Markdown
Member

タスク

CLI の出力・エラーメッセージ(fmt.Print*/Fprint*/Errorf/errors.New)が日本語でハードコードされていたものを国際化(i18n)し、デフォルト英語・config/環境変数/フラグで言語を切り替えられるようにする(Agent Loop タスク #35)。

実装内容

  • internal/i18n パッケージを新設(他の internal パッケージに依存しない最下層パッケージ。循環 import を回避)
    • Resolve(flag, env, config)(純粋関数)/ SetLang / T(書式引数 %s/%d 対応)
    • catalog_en.go / catalog_ja.go(en/ja カタログ、計128キー)、keys.go(MsgKey 定数)
  • 言語解決の優先順位: --lang フラグ > ENV_SYNC_LANG 環境変数 > config の language > デフォルト en。不正/未対応コードは(他に有効な指定がなければ)en にフォールバック
  • AppConfig にトップレベル language フィールドを追加、ParseFlags--lang/--language を追加
  • メイン経路・init/setup サブコマンド・--help のいずれでも、usage/エラー出力前に言語が確定するよう ParseFlags の前で解決(PrescanLang でフラグ先読み)
  • ハードコード日本語メッセージ(約147箇所)をすべてカタログ化し英訳を用意
  • %w ラップは fmt.Errorf("%s: %w", i18n.T(key), err) 形式で保持(カタログに %w を入れない)
  • README.md / README.ja.md に言語設定の説明を追記

完了条件

  • config 未設定・環境変数なしで CLI 実行 → 英語(en)で表示
  • config に language: ja → 日本語で表示
  • 優先順位(フラグ > 環境変数 > config > デフォルト en)が動作し上書きが効く
  • 不正/未対応の言語コード → en にフォールバック
  • ハードコード日本語メッセージをカタログ化し英訳を用意
  • README に言語設定の説明を追記
  • go build ./... / go test ./... パス、i18n 解決ロジックの単体テスト追加

動作確認

  • lint / build 通過(go build / go vet / gofmt 差分なし)
  • 設計・計画適合レビュー通過(Critical なし/init/setup の config 反映を修正済み)
  • 自動テスト生成・通過(i18n 単体テスト + 言語切替の実バイナリ統合テスト TestLanguageResolution_Integration / TestHelpLanguage_Integration
  • コード品質チェック通過(Critical なし)
  • 受け入れテスト通過(--help / 存在しない env 指定で en/ja/優先順位/フォールバックを実バイナリで確認)

品質チェック結果

  • 🔴 Critical: 0
  • 🟡 Warning: 0
  • 🔵 Info: i18n はグローバル状態方式(CLI なので妥当、テストは t.Cleanup で復元)。%w ラップ・en/ja カタログ parity(TestCatalogKeyParity)は検証済み

パフォーマンス診断(静的解析)

  • 🟡 Warning(1件・非ブロッキング): sync パスで LoadAppConfig が複数回実行され、global config のパーミッションが 0600 でない場合に警告が重複出力されうる(性能影響は無視可能、UX 上の留意点。本 PR のスコープ外)
  • 🔵 Info: en/ja カタログ両言語常駐・argv 2回走査・i18n.T の毎回 map lookup — いずれも CLI 規模では無視可能。T/Resolve/SetLang/PrescanLang はすべて O(1)〜O(argv) で問題なし

🤖 Generated with Claude Code

- internal/i18n パッケージを新設(無依存の最下層、循環 import 回避)
  - Resolve(純粋関数)/ SetLang / T(書式引数対応)と en/ja カタログ
- 言語解決の優先順位: --lang フラグ > ENV_SYNC_LANG > config の language > デフォルト en
- AppConfig に language フィールド追加、ParseFlags に --lang/--language 追加
- init/setup サブコマンドおよび --help でも言語が確定するよう ParseFlags 前に解決
- 全ハードコード日本語メッセージ(約147箇所)をカタログ化し英訳を用意
- %w ラップは fmt.Errorf("%s: %w", i18n.T(key), err) 形式で保持
- README.md / README.ja.md に言語設定の説明を追記
- i18n 解決ロジックの単体テスト + 言語切替の実バイナリ統合テストを追加

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@polidog polidog merged commit 8124aae into main Jun 29, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants