Skip to content
··3分で読めます

DIALØGUEに48時間で5言語を追加した話

Claude Codeにローカライゼーションの方法を教える計画書を作成し、5言語で並行して実行する様子を見守りました。直訳ではなく、ネイティブに響くコピーへの変換です。

数日前、あるユーザーがDIALØGUEはスペイン語に対応しているか質問してきました。

対応していませんでした。

48時間後、5つの言語に対応しました — スペイン語、ベトナム語、日本語、韓国語、中国語(普通話)です。UIボタンを翻訳しただけではありません。完全なネイティブローカライゼーションです。それぞれの市場向けに作られたように聞こえるPodcastです。

5言語を48時間で、というとチームを雇ったか徹夜したかのように聞こえますが、そうではありません。

Claude Codeにハイレベルな指示を与えました。Claude Codeが計画書を作成し、それを実行しました — 異なるファイルに対して並行エージェントを同時に動かすことも多かったです。

---

秘訣:一度計画を立て、素早く実行する

面白いのはここです:計画書を書いたのは私ではありません。Claude Codeが — 私のガイダンスのもとで — 書いたのです。

私が説明したのは、欲しいもののイメージです:「自然に翻訳する方法を説明するローカライゼーションスタイルガイドを作ってほしい。直訳ではなく。スペイン語、ベトナム語、日本語、韓国語、中国語の例を含めて。敬語レベルと文化的コンテキストもカバーして。」

Claude Codeは1,000行以上のスタイルガイド、包括的なチェックリスト、そしてバックエンドパイプラインのプレイブックを作成しました。そして自分で作った計画に従って作業を実行したのです。

1. スタイルガイド

翻訳用語集ではなく、哲学ドキュメントです。ローカライズの_方法_を、すべての言語のBefore/After例付きで説明しています。

スペイン語のエントリー例:

| English | Literal (Wrong) | Natural (Right) |

|---------|-----------------|-----------------|

| "Ideas, Produced" | "Ideas, Producidas" | "De la Idea, al Podcast" |

| "Researched, Not Recycled" | "Investigado, No Reciclado" | "Contenido Original, Sin Copiar" |

| "You Direct" | "Tú Diriges" | "Tú Decides" |

直訳は文法的に正しいですが、Google翻訳のように聞こえます。自然なバージョンは_意図_を捉えています — スペイン語を話すマーケターが実際に書くような表現です。

このガイドは敬語レベル(日本語はです/ます形、韓国語は합쇼체を使用)、文化的コンテキスト、よくある間違いをカバーしています。Claude Codeが翻訳する際、これらの原則 — 自分で書いた原則 — に自動的に従います。

2. ローカライゼーションチェックリスト

新しい言語のために変更が必要なすべてのファイルの包括的なチェックリストです:

必須(必ず必要):

- フロントエンド: `messages/{locale}.json` (約2,200キー)

- バックエンド: `locales/{locale}.json` (約82キー)

- Language Utils: `language_utils.py`の3つの関数

- Speech Generation: `gemini_voice_instructions.py`の1つの関数

- Voice Preview: ローカライズされた7つの文

- Content Moderation: キーワード + プロンプト

- Smoke Tests: テストマトリックスに追加

オプション(品質向上):

- スタイルごとのホスト/オーディエンスプロファイル

- ローカライズされたプロンプトテンプレート

- スタイルごとのボイス指示

このチェックリストにより、見落としがなくなります。Claude Codeはこれを体系的に処理します。

3. バックエンドプレイブック

Podcast生成が言語をどのように処理するかを正確にドキュメント化しています:

- アウトライン生成がGemini 3 Flashを言語指示とともに使用する方法

- ダイアログ生成がClaude Sonnet 4.5を文化的コンテキストとともに使用する方法

- 音声生成がGemini TTSを言語固有のガイダンスとともに使用する方法

これら3つのドキュメントが揃えば、新しい言語の追加は機械的な作業になります。Claude Codeがチェックリストを読み、スタイルガイドに従い、プレイブックに沿ってファイルを更新します。

---

「とりあえず翻訳すればいい」の問題点

正直に言うと、最初の本能は全てを翻訳APIに通して終わりにすることでした。「Create Podcast」が「Crear Podcast」になれば、みんな先に進めるでしょう?

そのアプローチではゴミができあがります。ベトナム語と英語の間で育った私はこれを身をもって学びました — 直訳は伝えたいことの魂を殺してしまうのです。

翻訳は言葉を保存し、ローカライゼーションは意味を保存します。スタイルガイドはこの違いをエンコードしています。

| Language | Literal Translation | Native Localization |

|----------|--------------------|--------------------|

| Vietnamese | "Ý tưởng, Được Sản Xuất" | "Từ Ý Tưởng → Đến Podcast" |

| Japanese | "アイデア、制作された" | "アイデアを、カタチに" (Ideas into form) |

| Korean | "아이디어, 제작됨" | "아이디어를, 현실로" (Ideas into reality) |

| Spanish | "Ideas, Producidas" | "De la Idea, al Podcast" |

| Chinese | "想法,已制作" | "从想法,到播客" |

すべての言語にこのレベルの注意が必要でした。すべてのボタン、すべてのエラーメッセージ、すべてのマーケティングコピーに。

そしてこれはUIだけの話です。実際のPodcast生成はもっと難しいのです。

---

Podcastにはネイティブのホストが必要

予想していなかったことがあります:ホスト名が重要だということです。とても。

英語版では、デフォルトのホストはAlexとMayaです。一般的で、記憶に残りにくい、問題なく機能する名前です。

でもベトナム語のPodcastを生成するのにホストがまだAlexとMaya?違和感があります。ベトナム人として言わせてもらうと — アメリカのショーの下手な吹き替えに聞こえます :D

そこで各言語にネイティブのホスト名を設定しました:

| Language | Host 1 | Host 2 |

|----------|--------|--------|

| English | Alex | Maya |

| Vietnamese | Minh | Lan |

| Japanese | 太郎 (Tarō) | 花子 (Hanako) |

| Korean | 민준 (Minjun) | 수진 (Sujin) |

| Spanish | Carlos | María |

| Chinese | 明辉 | 雅琴 |

でも名前だけでは足りません。AIは文化的コンテキストを理解する必要があります。

日本のテックPodcastはアメリカのものとは異なる会話の規範があります。敬語のレベル、意見の相違の表現方法、やり取りのリズム — すべてが異なります。

そこで言語固有のAIプロンプト指示を作成しました。ベトナム語の指示には「bạn」(カジュアルだが敬意のある「あなた」)を指定。日本語の指示にはです/ます形(丁寧だがフレンドリー)を指定。韓国語の指示には합쇼체(フォーマルな丁寧語)を指定。

これは自動化できない類のものです。アジア太平洋の市場で長年働いてきた経験から、私はこれらのコミュニケーションパターンを直感的に知っています — コツは、その文化的知識をAIが従えるプロンプトにエンコードすることでした。でもエンコードしてしまえば、Claude Codeは何千もの文字列に一貫して適用してくれます。

---

実際に機能するAIモデルの選択

技術的な観点から面白くなるのはここからです。

DIALØGUEは3つの異なるタスクに3つの異なるAIモデルを使用しています。複雑さを求めたわけではなく、各モデルがそれぞれの特定のジョブで本当に優れているからです。

タスク1:リサーチ & アウトライン → Gemini 3 Flash

ユーザーがトピックを入力すると、最初のステップはリサーチです。AIは以下を行う必要があります:

1. ウェブで最新情報を検索する

2. 調査結果を構造化されたアウトラインに統合する

3. ソースを適切に引用する

これにはグラウンディング(リアルタイムウェブ検索)と構造化出力(JSONスキーマ準拠)の両方が必要です。

問題は:ほとんどのモデルは両方を同時にできないことです。Gemini 2.5 Flashはグラウンディングをサポートしています。構造化出力もサポートしています。でも同時にはできません。どちらかを選ぶ必要があります。

Gemini 3 Flash Previewは、私が見つけた中で両方の機能を同時にサポートする唯一のモデルです。そのため、アウトライン生成を担当しています。

```python
GEMINI_MODEL = "gemini-3-flash-preview"

# Key capability:
GEMINI_MODEL_CONFIGS = \{
    "gemini-3-flash-preview": {
        "supports_grounding": True,
        "supports_structured_output": True,
        "supports_grounding_with_structured_output": True,  # This is the key
    \}
}
```

アウトラインは約60秒で、実際のソース付きで適切に構造化されて返ってきます。

タスク2:ダイアログ生成 → Claude Sonnet 4.5

ユーザーがアウトラインを承認すると、AIがフルスクリプトを書きます — 両ホストが話すすべての言葉を。

これはクリエイティブライティングです。個性、自然なリズム、本物の会話の感覚が必要です。

複数のモデルでテストしました。Claudeのダイアログは一貫してより人間的に聞こえます。やり取りが自然です。ホストが自然にお互いの話を遮ります。お互いの論点を発展させます。

主観的ですが、何百ものテストPodcastを生成した後、違いは明らかです。Claude Sonnet 4.5がダイアログ生成を担当しています。

```python
ANTHROPIC_MODEL = "claude-sonnet-4-5-20250929"
```

タスク3:音声生成 → Gemini 2.5 Flash TTS

最後に、スクリプトを音声にする必要があります。2つの声、適切なペーシング、感情表現。

Gemini 2.5 Flash TTSは、マルチスピーカーサポート付きの30の異なるボイスを提供しています。Charon(情報的、男性)とKore(しっかりした、女性)を同じ音声ファイルに入れ、スピーカー間を自然に切り替えることができます。

品質は十分高く、ユーザーからは本物の声優かとよく聞かれます。

```python
# Multi-speaker synthesis with Gemini TTS
response = client.models.generate_content(
    model="gemini-2.5-flash-preview-tts",
    contents=transcript,
    config=types.GenerateContentConfig(
        response_modalities=["AUDIO"],
        speech_config=types.SpeechConfig(
            multi_speaker_voice_config=types.MultiSpeakerVoiceConfig(
                speaker_voice_configs=speaker_configs
            )
        )
    )
)
```

パイプライン

つまり、フルフローは:

```
User Input
    ↓
[Gemini 3 Flash] Research + Structured Outline (~60 sec)
    ↓
User Review & Feedback
    ↓
[Claude Sonnet 4.5] Full Dialogue Script (~2-3 min)
    ↓
User Review & Edit
    ↓
[Gemini 2.5 Flash TTS] Multi-speaker Audio (~3-5 min)
    ↓
Finished Podcast
```

各モデルが最も得意なことを行います。合計生成時間は15〜30分のPodcastで約8〜10分です。

---

驚いた機能

ユーザーから予想外のリクエストがありました:UIとは異なる言語でPodcastを生成する機能です。

ベトナム人ユーザーはベトナム語でアプリを操作することに慣れていても、国際的なオーディエンス向けに英語のPodcastを作りたいかもしれません。あるいは、スペイン語を話すマーケターが日本語でコンテンツをテストしたいかもしれません。

そこでPodcast言語セレクターを追加しました。UIは英語のまま、中国語でPodcastを生成できます。ホストは中国語の名前(明辉と雅琴)になり、ダイアログは中国語の会話パターンに従い、音声は適切なボイスを使用します。

小さな機能ですが、ユーザーができることを劇的に拡大します。

---

並行エージェント:力を倍増させるもの

本当のスピードは並行エージェントから来ました。チェックリストには明示的にこう記載されています:

> "バックエンドファイルには並行エージェントを実行 - バックエンドファイルは小さく、並行処理が可能(language_utils.py、content_moderation.py、gemini_voice_instructions.py、locales/{locale}.json)"

「韓国語サポートを追加して」と言うと、Claude Codeは複数のエージェントを起動しました:

- 1つのエージェントがフロントエンド翻訳ファイルを更新

- 別のエージェントが`language_utils.py`に韓国語のケースを追加

- 別のエージェントが`gemini_voice_instructions.py`を更新

- 別のエージェントが`content_moderation.py`に韓国語を追加

すべて同時に実行されます。完了すると、Claude Codeが変更をマージしてテストを実行しました。

これがチェックリストが「必須」ファイルと「オプション」ファイルを区別する理由です — Claude Codeが何を並行化し、何を後回しにできるかを知るためです。

フロントエンド翻訳ファイル(約2,200キー)については、チェックリストにチャンキング戦略が指定されています:

- Chunk 1: `common`, `nav`, `bottomNav` (約110キー)

- Chunk 2: `homepage`, `auth` (約180キー)

- Chunk 3: `dashboard`, `create` (約330キー)

- 以下同様...

これによりトークン制限の問題を防ぎ、Claude Codeが名前空間ごとに翻訳し、それぞれをスタイルガイドと照らし合わせてレビューできます。

スコープ:

- 5言語を追加

- 言語あたり合計約2,500の翻訳文字列

- 言語あたり10以上のAIプロンプトテンプレート

- 言語あたり1つのデモPodcastを生成

- 言語あたり複数の並行エージェント

重要な洞察:私はコードを書いていません。計画も書いていません。方向性を示し、出力をレビューし、Claude Codeに残りを任せました — 多くの場合、並行して。今でもちょっと信じられないです :P

---

次のステップ

6つの言語で約20億人の潜在ユーザーをカバーしています。これは意味のあるリーチです。

でも、何が足りないかすでに考えています(マーケターの性は止まりません):

1. アラビア語 - 右から左のレイアウトサポートは複雑

2. ヒンディー語 - 巨大な市場、異なる文字体系

3. ポルトガル語 - ブラジルは巨大なPodcast市場

4. フランス語 - ヨーロッパ展開

5. タガログ語 - フィリピンのクリエイターコミュニティが強い

それぞれに同じレベルの注意が必要です。翻訳ではなくネイティブローカライゼーション。コピーされたテンプレートではなく文化的プロンプト。(これが可能だったのは、クリーンなアーキテクチャでアプリ全体を14日で再構築したばかりだったからです。)

良いニュース:計画書は再利用可能です。次の言語の追加はさらに速くなるはずです。そしてローカライゼーションは現在構築中のネイティブiOSアプリにも引き継がれます — 同じ7言語、同じSupabaseバックエンドです。

---

ぜひ試してみてください

この仕上がりには本当に誇りを感じています — 特にベトナム語のローカライゼーションです。ベトナム人のオーディエンス向けに作られたように聞こえるPodcast、彼らに向けて翻訳されたのではないPodcastを聞くと、予想外に心に響くものがありました。

DIALØGUEは現在以下をサポートしています:

- English - オリジナル

- Vietnamese - Từ Ý Tưởng → Đến Podcast

- Japanese - アイデアを、カタチに

- Korean - 아이디어를, 현실로

- Spanish - De la Idea, al Podcast

- Chinese - 从想法,到播客

あなたの言語でPodcastを作成 →

UIは選択した設定に従います。そして覚えておいてください — UI設定に関係なく、これらの言語のどれでもPodcastを生成できます。

新規ユーザーは2つの無料Podcastでお試しいただけます。

---

まとめ

振り返ってみると、最も驚いたのは広告業界での経験がどれほど重要だったかということです。アジア市場全体でキャンペーンを適応させてきた長年の経験から、ローカライゼーションは決して言葉だけの問題ではないと学びました — 文化的な直感の問題です。AIコーディングプロジェクトにおいて、それが最も価値あるスキルになるとは思っていませんでした。

AIコーディングアシスタントを使うビルダーへ:

1. 書くのではなく、指揮する。 計画書を書いたのは私ではありません — 欲しいものを説明し、Claude Codeがそれを作成しました。そして自分の計画に従いました。最初は奇妙でした、自分のブリーフも書く人に委任するようなもので。でもうまくいきます。

2. 構造がスケールを可能にする。 スタイルガイド、チェックリスト、プレイブック — これらはもう人間だけのものではありません。これが最大のアンロックだと思います:AIエージェントが体系的に実行できるように要件を構造化すること。(マーケティングブリーフを書いてきた長年の経験が、思いもよらない形で報われました。)

3. モデルをタスクに合わせる。 間違っているかもしれませんが、単一のモデルがすべてで最高ということはまだないと思います。DIALØGUEの場合:

- Gemini 3 Flash — グラウンドされた構造化リサーチ

- Claude Sonnet 4.5 — 自然なダイアログ

- Gemini 2.5 Flash TTS — マルチスピーカー音声

4. 翻訳ではなく、ローカライズする。 ユーザーは違いがわかります。これは強調しすぎることはありません — 3つの国に住み、十数の市場で働いてきた者として、怠惰な翻訳が製品に何をするか見てきました。文化的知識をプロンプトにエンコードし、AIに一貫して適用させましょう。

この件については以上です。多言語対応のものを構築している方、あるいは検討中の方 — ローカライゼーションにどうアプローチしているか聞きたいです。AIを使っていますか?従来のエージェンシールートですか?文化的コンテキストこそが難しい部分で、翻訳そのものではないという意見に賛成ですか?ぜひ教えてください。

よろしくお願いします、Chandler

続きを読む

私の歩み
つながる
言語
設定