`translate5.py` は、様々なドキュメント形式 (.docx, .pptx, .pdf, .html, .md, .txt) をAI翻訳API (OpenAI GPT, Google Gemini, DeepL) を使用して翻訳・校正するPythonスクリプトです。

---

## 1. プログラムの動作

このプログラムは以下のステップで動作します。

1.  **ライブラリのチェックと初期化**:
    *   スクリプト開始時に、必要な非標準ライブラリ (`chardet`, `bs4`, `jinja2`, `html2text`, `pdf2docx`, `docx`, `pptx`, `markitdown`) がすべてインストールされているかを確認します。不足している場合はエラーを表示して終了します。
    *   設定ファイル (`translate5.env`, `ai.env`) または環境変数からAPIキーやモデル設定などの共通設定を読み込みます。
    *   `argparse` を使用してコマンドライン引数を解析し、翻訳モード、入力ファイル、使用するAPI、モデル、プロンプトなどを設定します。
2.  **プロンプト設定の読み込み**:
    *   `translate5.ini` ファイルを以下の優先順位で検索し、翻訳および整形用のプロンプトを読み込みます。
        1.  現在の作業ディレクトリ
        2.  入力ファイルが存在するディレクトリ
        3.  スクリプトが置かれているディレクトリ
    *   コマンドライン引数 (`--translate_prompt`, `--reformat_prompt`) でプロンプトが指定されていればそれが最優先されます。`ini` ファイルにもCLIにもない場合は、スクリプトに組み込まれたデフォルトのプロンプトが使用されます。
3.  **入力ファイルの解析と前処理**:
    *   入力ファイルの拡張子からファイルタイプを判別します。
    *   **PDF (.pdf)**:
        *   デフォルトでは `pdf2docx` を使用して一時的に `.docx` ファイルに変換され、DOCXとして処理されます。
        *   `--use_md` オプションが指定されている場合は、`markitdown` を使用してMarkdown形式のテキストに変換されます。この際、必要に応じて `reformat_prompt` を用いた整形処理も行われます。
    *   **Word (.docx)**: `python-docx` を使用してドキュメントを読み込みます。
    *   **PowerPoint (.pptx)**: `python-pptx` を使用してプレゼンテーションを読み込みます。
    *   **HTML (.html)**:
        *   デフォルトでは `BeautifulSoup` を使用してHTML構造を解析し、テキストノードを抽出します。
        *   `--use_md` オプションが指定されている場合は、`html2text` を使用してMarkdown形式のテキストに変換されます。
    *   **Markdown (.md)** または **Plain Text (.txt)**: ファイル内容をそのままテキストとして読み込みます。
4.  **テキストの抽出と翻訳**:
    *   DOCX、PPTX、HTMLファイルの場合、ドキュメント構造（段落、図形、テーブル、ノートなど）から翻訳対象のテキストブロックを抽出します。
    *   翻訳対象とするテキストは、`--min_translate_length` で指定された最小長を満たし、`--limit_to_multibyte_str` の設定に応じて多バイト文字を含むかどうかのチェックを受けます。
    *   抽出されたテキストは、指定されたAPI (`openai5`, `openai`, `google`, `gemini`, `deepl`) とプロンプトを使用して翻訳・校正されます。
    *   `tkai_lib` に含まれる関数 (`query_openai4`, `query_openai5`, `query_google2`, `query_deepl`) を介して各APIへリクエストが送信されます。
    *   翻訳後、結果の長さや特定の記号の有無に基づいて品質チェック (`check_translation`) が行われます。不適切な翻訳は破棄され、元のテキストが維持されます。
    *   APIのレート制限を考慮し、各API呼び出し後に `tsleep_rpm` で指定された秒数だけプログラムが一時停止します。
5.  **結果の保存**:
    *   翻訳された内容は、元のファイル形式 (または `--use_md` オプションが指定された場合はMarkdown形式) で新しいファイルとして保存されます。ファイル名には `_revised` が付加されます。
    *   翻訳プロセスで抽出された原文と翻訳文のペアは `data` リストに格納されます。
    *   オプションで、この `data` と `html_template_path` で指定されたJinja2テンプレートを使用して、原文と翻訳文を比較するHTMLレポート (`_compare.html`) が生成されます。

## 2. 必要な非標準ライブラリとインストールコマンドとインストール方法

プログラムの実行には、以下のPythonライブラリが必要です。

```bash
pip install chardet beautifulsoup4 Jinja2 html2text pdf2docx python-docx python-pptx markitdown
```

**`tkai_lib` について**:
コード中で `tkai_lib` がインポートされていますが、これは一般的なPyPIライブラリではありません。`translate5.py` と同じディレクトリ、またはPythonがモジュールを検索できるパスに `tkai_lib.py` ファイルが存在する必要があります。このファイルには、OpenAI、Google、DeepLなどの各種AIサービスへリクエストを送信するためのAPIラッパー関数が実装されていると想定されます。

## 3. 必要な入力ファイル

1.  **翻訳対象ドキュメント**:
    *   コマンドライン引数 `--infile` で指定される主要な入力ファイルです。
    *   対応するファイル形式: `.docx`, `.pptx`, `.pdf`, `.html`, `.md`, `.txt`
    *   例: `my_report.docx`, `presentation.pptx`, `article.pdf`, `webpage.html`, `notes.md`, `draft.txt`

2.  **設定ファイル (オプション)**:
    *   `translate5.env`: プログラム固有の設定やAPIキーなど。
    *   `ai.env`: AIサービス共通の設定やAPIキーなど。
    *   これらのファイルはスクリプトの実行ディレクトリに配置されることが一般的です。APIキーは環境変数として設定することも可能です（例: `OPENAI_API_KEY=sk-xyz...`）。

3.  **プロンプト設定ファイル (オプション)**:
    *   `translate5.ini`: 翻訳や整形に使用するカスタムプロンプトを定義するファイルです。
    *   このファイルは、カレントディレクトリ、入力ファイルがあるディレクトリ、またはスクリプトが置かれているディレクトリのいずれかに配置されている場合、自動的に読み込まれます。このファイルが存在しない場合や特定のセクションがない場合は、組み込みのデフォルトプロンプトが使用されます。
    *   例 (`translate5.ini` の内容):
        ```ini
        [translate]
        role = あなたは専門的な日本語を正確に英語に翻訳するアシスタントです。
        prompt = 以下の日本語テキストを、専門用語を維持し、自然な英語に翻訳してください。\n\n#翻訳してほしいテキスト\n{{ text }}
        ```

4.  **HTMLテンプレートファイル**:
    *   `template_translate.html` (デフォルト): 翻訳比較レポートを生成する際に使用されるJinja2テンプレートファイルです。
    *   `--html_template_path` オプションでパスを指定できます。スクリプトはカレントディレクトリやスクリプトディレクトリでもこのファイルを検索します。

5.  **`tkai_lib.py`**:
    *   カスタムライブラリファイルであり、`translate5.py` と同じディレクトリ、またはPythonが認識できるパスに存在する必要があります。

## 4. 実行後に生成される出力ファイル

プログラム実行後には、以下のファイルが生成される可能性があります。

1.  **翻訳済み出力ファイル**:
    *   入力ファイルの形式と `use_md` オプションの有無に応じて、ファイル名に `_revised` が付加されたファイルが出力されます。
    *   **通常の翻訳**:
        *   `input.docx` → `input_revised.docx`
        *   `input.pptx` → `input_revised.pptx`
        *   `input.html` → `input_revised.html`
        *   `input.md` → `input_revised.md`
        *   `input.txt` → `input_revised.txt`
    *   **PDF入力 (use_md なし)**:
        *   `input.pdf` → `input_revised.docx`
    *   **`--use_md` オプション使用時**:
        *   `input.docx` (`--use_md`) → `input_revised.md`
        *   `input.pptx` (`--use_md`) → `input_revised.md`
        *   `input.html` (`--use_md`) → `input_revised.md`
        *   `input.pdf` (`--use_md`) → `input_revised.md`

2.  **中間ファイル (特定のシナリオで生成)**:
    *   **PDFからDOCXへの変換時**: `input.pdf` が入力の場合、内部的に `input.docx` が一時ファイルとして生成されます（ユーザーが直接利用することは稀です）。
    *   **`--use_md` オプション使用時**:
        *   `input.docx` / `input.pptx` / `input.html` / `input.pdf` → `input.md` (元のドキュメントから変換されたMarkdown形式のテキスト)
        *   `input.pdf` が `--use_md` で整形プロンプトを適用した場合 → `input_reformat.md` (整形後のMarkdownファイル)

3.  **翻訳比較HTMLレポート**:
    *   `input_file_compare.html`: 翻訳前の原文と翻訳後のテキストを並べて表示するHTML形式の比較レポート。

## 5. コマンドラインでの使用例 (Usage)

### 基本的なコマンドライン引数

*   `-i <path>`, `--infile <path>`: 翻訳対象の入力ファイルパス (必須)。
*   `--mode <mode>`: 翻訳モード。例: `je` (日→英), `ej` (英→日), `jj` (日→日校正), `ee` (英→英校正)。デフォルトは `je`。
*   `--api <api_name>`: 使用する翻訳API。`openai5`, `openai`, `google`, `gemini`, `deepl` から選択。デフォルトは `openai5`。
*   `--model <model_name>`: APIで使用するモデル名を上書きします (例: `gpt-4o`, `gemini-1.5-pro`)。
*   `--endpoint <url>`: DeepL APIのエンドポイントURL (DeepL使用時)。
*   `--max_tokens <num>`: 最大トークン数 / 出力長。
*   `--temperature <float>`: サンプリング温度 (クリエイティブさ)。デフォルトは `0.3`。
*   `--reasoning_effort <level>`: GPT-5 (仮称) の推論レベル (`low`, `medium`, `high`)。
*   `--tsleep_rpm <sec>`: APIのレート制限を避けるためのスリープ時間 (秒)。デフォルトは `0.5`。
*   `--use_md`: 入力ファイルを一度Markdownに変換してから処理します。
*   `--limit_to_multibyte_str`: 多バイト文字を含むテキストのみを翻訳対象とします。`--mode` が `j` から始まる場合はデフォルトで `True`。
*   `--process_unit <unit>`: DOCX/PPTX/HTMLの処理単位 (`paragraph` または `run`)。デフォルトは `paragraph`。
*   `--min_translate_length <num>`: 翻訳対象とする最小テキスト長。デフォルトは `5`。
*   `--allowed_translation_length_ratio <float>`: 翻訳後のテキスト長が元のテキスト長の許容比率 (例: 5.0 = 5倍) を超える場合、翻訳を破棄します。
*   `--output_html_path <path>`: 比較レポートHTMLの出力パス (デフォルトは `infile_compare.html`)。
*   `--html_template_path <path>`: 比較レポートHTML用のJinja2テンプレートファイルパス。デフォルトは `template_translate.html`。
*   `--translate_prompt <prompt_str>`: 翻訳プロンプトをCLIから直接上書きします。
*   `--reformat_prompt <prompt_str>`: 整形プロンプトをCLIから直接上書きします。

### 具体的な使用例

#### 例 1: 日本語DOCXファイルをOpenAI GPT-4oで英語に翻訳

```bash
python translate5.py -i my_document_ja.docx --mode je --api openai --model gpt-4o
```
*   `my_document_ja.docx` を読み込み、OpenAIのGPT-4oモデルで日本語から英語に翻訳します。
*   出力ファイル: `my_document_ja_revised.docx` と `my_document_ja_compare.html`。

#### 例 2: 英語PPTXファイルをGoogle Geminiで日本語に翻訳し、Markdown経由で処理

```bash
python translate5.py -i presentation_en.pptx --mode ej --api google --model gemini-1.5-pro --use_md
```
*   `presentation_en.pptx` をMarkdownに変換し、Google Gemini 1.5 Proで英語から日本語に翻訳します。
*   出力ファイル: `presentation_en_revised.md` (翻訳済みMarkdown), `presentation_en.md` (中間Markdown), `presentation_en_compare.html`。

#### 例 3: PDFファイルをDeepLで日本語に翻訳し、CLIでカスタムプロンプトを指定

```bash
python translate5.py -i research_paper.pdf --mode ej --api deepl \
    --translate_prompt "以下の英語テキストを、丁寧かつ学術的な日本語に翻訳してください。\n\n#翻訳テキスト\n{{ text }}"
```
*   `research_paper.pdf` をDOCXに変換後、DeepL APIで英語から日本語に翻訳します。
*   翻訳プロンプトはコマンドラインで指定されたものを使用します。
*   出力ファイル: `research_paper_revised.docx` と `research_paper_compare.html`。

#### 例 4: 短いTXTファイルをOpenAI GPT-5-nano (仮称) で日本語校正

```bash
python translate5.py -i short_memo_ja.txt --mode jj --api openai5 --model gpt-5-nano --min_translate_length 10 --reasoning_effort high
```
*   `short_memo_ja.txt` を読み込み、OpenAI GPT-5-nano (仮称) で日本語の校正を行います。
*   文字数が10文字未満のテキストは翻訳をスキップし、推論レベルを `high` に設定します。
*   出力ファイル: `short_memo_ja_revised.txt` と `short_memo_ja_compare.html`。

#### 例 5: HTMLファイルを英語から英語へ校正（リライト）

```bash
python translate5.py -i marketing_page.html --mode ee --api openai --model gpt-4o-mini \
    --translate_prompt "あなたはプロフェッショナルな英文校正者です。以下のテキストを、より簡潔で魅力的な英語に校正してください。\n\n#元のテキスト\n{{ text }}"
```
*   `marketing_page.html` を読み込み、OpenAI GPT-4o Miniで英語から英語への校正を行います。
*   校正プロンプトはCLIで指定されたものを使用します。
*   出力ファイル: `marketing_page_revised.html` と `marketing_page_compare.html`。