Skip to content
··8분 읽기

48시간 만에 DIALØGUE에 5개 언어를 추가했습니다

Claude Code에게 단순한 번역이 아닌 현지화 방법을 가르치는 기획 문서를 작성한 후, 5개 언어에 걸쳐 병렬로 실행되는 과정을 지켜보았습니다. 직역 표현이 원어민다운 카피로 바뀌었습니다.

며칠 전, 한 사용자가 DIALØGUE가 스페인어를 지원하는지 물었습니다.

지원하지 않았습니다.

48시간 후, 다섯 개 언어를 지원하게 되었습니다—스페인어, 베트남어, 일본어, 한국어, 중국어(만다린). 번역된 UI 버튼이 아닙니다. 완전한 네이티브 현지화입니다. 각 시장을 위해 만들어진 것처럼 들리는 팟캐스트입니다.

다섯 개 언어를 48시간 만에 추가했다면, 팀을 고용하거나 밤을 새운 것처럼 들립니다. 그렇지 않았습니다.

Claude Code에게 하이레벨 방향을 제시했습니다. Claude Code가 기획 문서를 작성한 후 실행했습니다—종종 서로 다른 파일에서 병렬 에이전트를 동시에 실행하면서.

---

비결: 한 번 계획하고, 빠르게 실행하기

여기서 흥미로운 부분이 있습니다: 기획 문서를 제가 작성하지 않았습니다. Claude Code가 작성했습니다—제 가이드와 함께.

제가 원하는 것을 설명했습니다: "직역이 아닌 자연스러운 번역 방법을 설명하는 현지화 스타일 가이드를 만들어 줘. 스페인어, 베트남어, 일본어, 한국어, 중국어에 대한 예시를 포함해. 격식 수준과 문화적 맥락을 다뤄 줘."

Claude Code는 1,000줄 이상의 스타일 가이드, 종합적인 체크리스트, 그리고 백엔드 파이프라인 플레이북을 생성했습니다. 그런 다음 자체 계획을 따라 작업을 실행했습니다.

1. 스타일 가이드

번역 용어집이 아닌—철학 문서입니다. 모든 언어에 대해 전후 비교 예시와 함께 현지화하는 _*방법*_을 설명합니다.

스페인어 예시 항목:

| 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.py`의 3개 함수

- 음성 생성: `gemini_voice_instructions.py`의 1개 함수

- 음성 미리듣기: 7개의 현지화된 문장

- 콘텐츠 검수: 키워드 + 프롬프트

- 스모크 테스트: 테스트 매트릭스에 추가

선택 (품질 향상):

- 스타일별 호스트/청중 프로필

- 현지화된 프롬프트 템플릿

- 스타일별 음성 지시사항

이 체크리스트는 빠뜨리는 것이 없도록 보장합니다. Claude Code는 이를 체계적으로 처리합니다.

3. 백엔드 플레이북

팟캐스트 생성이 언어를 처리하는 방법을 정확히 문서화합니다:

- 아웃라인 생성이 언어 지시사항과 함께 Gemini 3 Flash를 사용하는 방법

- 대화 생성이 문화적 맥락과 함께 Claude Sonnet 4.5를 사용하는 방법

- 음성 생성이 언어별 가이드와 함께 Gemini TTS를 사용하는 방법

이 세 가지 문서가 준비되면, 새 언어를 추가하는 것은 기계적인 작업이 됩니다. 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에 불과합니다. 실제 팟캐스트 생성이 더 어렵습니다.

---

팟캐스트에는 네이티브 호스트가 필요합니다

예상하지 못했던 것이 있습니다: 호스트 이름이 매우 중요합니다.

영어 버전에서 기본 호스트는 Alex와 Maya입니다. 평범하고, 기억에 남지 않지만, 잘 작동합니다.

하지만 베트남어 팟캐스트를 생성하는데 호스트가 여전히 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가 문화적 맥락을 이해해야 합니다.

일본의 테크 팟캐스트는 미국의 것과 다른 대화 규범을 가지고 있습니다. 격식 수준, 의견 불일치를 표현하는 방식, 주고받는 대화의 리듬—모든 것이 다릅니다.

그래서 언어별 AI 프롬프트 지시사항을 만들었습니다. 베트남어 지시사항은 "bạn"(비격식이지만 존중하는 "당신")을 지정합니다. 일본어 지시사항은 です/ます체(공손하지만 친근한)를 지정합니다. 한국어 지시사항은 합쇼체(격식 존대)를 지정합니다.

이것은 자동화할 수 없는 종류의 일입니다. 아시아-태평양 시장에서 일한 수년간의 경험을 통해 이러한 커뮤니케이션 패턴을 직관적으로 알고 있습니다 — 핵심은 그 문화적 지식을 AI가 따를 수 있는 프롬프트로 인코딩하는 것이었습니다. 하지만 한번 인코딩되면, Claude Code가 수천 개의 문자열에 일관되게 적용합니다.

---

실제로 작동하는 AI 모델 선택

여기서 기술적 관점에서 흥미로워집니다.

DIALØGUE는 세 가지 다른 작업에 세 가지 다른 AI 모델을 사용합니다. 복잡성을 원해서가 아니라, 각 모델이 특정 작업에서 진정으로 더 뛰어나기 때문입니다.

작업 1: 리서치 & 아웃라인 → Gemini 3 Flash

사용자가 주제를 입력하면, 첫 번째 단계는 리서치입니다. AI는 다음을 수행해야 합니다:

1. 최신 정보를 위해 웹 검색

2. 발견한 내용을 구조화된 아웃라인으로 종합

3. 출처를 적절히 인용

이것은 그라운딩(실시간 웹 검색) AND 구조화된 출력(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의 대화가 일관되게 더 인간적으로 들립니다. 주고받는 대화가 자연스럽게 느껴집니다. 호스트들이 자연스럽게 서로를 끊습니다. 서로의 요점을 발전시킵니다.

주관적이지만, 수백 개의 테스트 팟캐스트를 생성한 후 차이가 눈에 띕니다. Claude Sonnet 4.5가 대화 생성을 담당합니다.

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

작업 3: 오디오 생성 → Gemini 2.5 Flash TTS

마지막으로, 스크립트가 오디오가 되어야 합니다. 두 목소리, 적절한 페이싱, 감정 표현.

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분짜리 팟캐스트의 총 생성 시간은 약 8-10분입니다.

---

놀라웠던 기능 하나

사용자들이 제가 생각하지 못했던 것을 요청했습니다: UI와 다른 언어로 팟캐스트를 생성하는 것.

베트남어 사용자가 앱을 베트남어로 편하게 탐색하면서 국제 청중을 위해 영어 팟캐스트를 만들고 싶을 수 있습니다. 또는 스페인어를 사용하는 마케터가 일본어로 콘텐츠를 테스트하고 싶을 수 있습니다.

그래서 팟캐스트 언어 선택기를 추가했습니다. UI는 영어로 두면서 만다린으로 팟캐스트를 생성할 수 있습니다. 호스트는 중국 이름(明辉와 雅琴)을 가지게 되고, 대화는 중국어 대화 패턴을 따르며, 오디오는 적절한 목소리를 사용합니다.

작은 기능이지만, 사용자가 할 수 있는 것을 극적으로 확장합니다.

---

병렬 에이전트: 힘의 배수

진정한 속도는 병렬 에이전트에서 나왔습니다. 체크리스트에 이것이 명시적으로 기록되어 있습니다:

> "백엔드 파일에 대해 병렬 에이전트를 실행하세요 - 백엔드 파일은 더 작아서 병렬로 처리할 수 있습니다 (language_utils.py, content_moderation.py, gemini_voice_instructions.py, locales/{locale}.json)."

"한국어 지원을 추가해"라고 하면, Claude Code가 여러 에이전트를 생성했습니다:

- 프론트엔드 번역 파일을 업데이트하는 에이전트 하나

- `language_utils.py`에 한국어 케이스를 추가하는 에이전트 하나

- `gemini_voice_instructions.py`를 업데이트하는 에이전트 하나

- `content_moderation.py`에 한국어를 추가하는 에이전트 하나

모두 동시에 실행됩니다. 완료되면, Claude Code가 변경사항을 병합하고 테스트를 실행했습니다.

이것이 체크리스트가 "필수" 파일과 "선택" 파일을 구분하는 이유입니다—Claude Code가 무엇을 병렬화하고 무엇을 나중으로 미룰 수 있는지 알 수 있도록.

프론트엔드 번역 파일(~2,200개 키)에 대해, 체크리스트는 청킹 전략을 지정합니다:

- 청크 1: `common`, `nav`, `bottomNav` (~110개 키)

- 청크 2: `homepage`, `auth` (~180개 키)

- 청크 3: `dashboard`, `create` (~330개 키)

- 기타 등등...

이것은 토큰 제한 문제를 방지하고 Claude Code가 네임스페이스별로 번역하면서 각각을 스타일 가이드와 대조 검토할 수 있게 합니다.

규모:

- 5개 언어 추가

- 언어당 총 ~2,500개 번역 문자열

- 언어당 10개 이상의 AI 프롬프트 템플릿

- 언어당 1개의 데모 팟캐스트 생성

- 언어당 여러 병렬 에이전트

핵심 인사이트: 코드를 작성하지 않았습니다. 계획을 작성하지 않았습니다. 방향을 제시하고, 출력을 검토하고, 나머지는 Claude Code에게 맡겼습니다 — 종종 병렬로. 여전히 약간 놀랍습니다 :P

---

다음 단계

6개 언어는 약 20억 명의 잠재적 사용자를 커버합니다. 의미 있는 도달 범위입니다.

하지만 이미 무엇이 빠져 있는지 생각하고 있습니다 (제 안의 마케터는 멈추지 않습니다):

1. 아랍어 - 오른쪽에서 왼쪽 레이아웃 지원이 복잡합니다

2. 힌디어 - 거대한 시장, 다른 문자 체계

3. 포르투갈어 - 브라질은 거대한 팟캐스트 시장입니다

4. 프랑스어 - 유럽 확장

5. 타갈로그어 - 강력한 필리핀 크리에이터 커뮤니티

각 언어에 동일한 수준의 주의가 필요합니다. 번역이 아닌 네이티브 현지화. 복사된 템플릿이 아닌 문화적 프롬프트. (이것은 깨끗한 아키텍처로 전체 앱을 14일 만에 재구축했기 때문에 가능했습니다.)

좋은 소식: 기획 문서는 재사용 가능합니다. 다음 언어를 추가하는 것은 더 빨라야 합니다. 그리고 현지화는 현재 개발 중인 네이티브 iOS 앱에도 이어집니다 — 7개 언어 모두, 같은 Supabase 백엔드.

---

직접 사용해 보세요

이 결과물이 정말 자랑스럽습니다 — 특히 베트남어 현지화가요. 베트남 청중을 위해 만들어진 것처럼 들리는 팟캐스트를, 그들에게 번역된 것이 아닌 팟캐스트를 듣는 것은, 예상하지 못한 방식으로 마음에 와닿았습니다.

DIALØGUE는 이제 다음을 지원합니다:

- English - 오리지널

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

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

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

- Spanish - De la Idea, al Podcast

- Chinese - 从想法,到播客

당신의 언어로 팟캐스트를 만들어 보세요 →

UI는 선택한 설정을 따릅니다. 그리고 기억하세요—UI 설정과 관계없이 이 언어들 중 어떤 것으로든 팟캐스트를 생성할 수 있습니다.

신규 사용자에게는 테스트를 위한 2개의 무료 팟캐스트가 제공됩니다.

---

핵심 교훈

돌이켜보면, 가장 놀라웠던 것은 제 광고 업계 배경이 얼마나 중요했는지입니다. 아시아 시장에 걸쳐 캠페인을 적응시킨 수년간의 경험이 현지화는 단순히 단어에 관한 것이 아니라 — 문화적 직관에 관한 것이라고 가르쳐 주었습니다. 이것이 AI 코딩 프로젝트에 가져온 가장 가치 있는 기술이 될 줄은 몰랐습니다.

AI 코딩 어시스턴트를 사용하는 개발자들을 위해:

1. 작성하지 말고 지시하세요. 기획 문서를 작성하지 않았습니다 — 원하는 것을 설명하면 Claude Code가 생성했습니다. 그런 다음 자체 계획을 따랐습니다. 처음에는 이상했습니다, 자체 브리프를 작성하는 사람에게 위임하는 것처럼요. 하지만 효과가 있습니다.

2. 구조가 확장을 가능하게 합니다. 스타일 가이드, 체크리스트, 플레이북 — 이것들은 더 이상 인간만을 위한 것이 아닙니다. 이것이 가장 큰 성과라고 생각합니다: AI 에이전트가 체계적으로 실행할 수 있도록 요구사항을 구조화하는 것입니다. (마케팅 브리프를 작성한 수년간의 경험이 예상치 못한 방식으로 빛을 발했습니다.)

3. 모델을 작업에 맞추세요. 제가 틀릴 수도 있지만, 아직 모든 것에 최고인 단일 모델은 없다고 생각합니다. DIALØGUE의 경우:

- Gemini 3 Flash: 그라운딩된 구조화된 리서치

- Claude Sonnet 4.5: 자연스러운 대화

- Gemini 2.5 Flash TTS: 멀티스피커 오디오

4. 번역하지 말고 현지화하세요. 사용자들은 차이를 알 수 있습니다. 이것은 아무리 강조해도 지나치지 않습니다 — 세 나라에서 살고 십여 개 시장에서 일한 사람으로서, 게으른 번역이 제품에 무엇을 하는지 보아왔습니다. 문화적 지식을 프롬프트에 인코딩하고 AI가 일관되게 적용하도록 하십시오.

이번 글은 여기까지입니다. 다국어 서비스를 구축하고 계시거나 — 심지어 고려만 하고 계시더라도 — 현지화에 어떻게 접근하고 계신지 듣고 싶습니다. AI를 사용하고 계신가요? 전통적인 에이전시 방식으로 하고 계신가요? 번역 자체가 아니라 문화적 맥락이 어려운 부분이라는 데 동의하시나요? 알려주십시오.

감사합니다,

Chandler

계속 읽기

나의 여정
연결
언어
환경설정