Tôi Thêm 5 Ngôn Ngữ Cho DIALØGUE Trong 48 Giờ
Tôi xây dựng tài liệu kế hoạch dạy Claude Code cách bản địa hóa — không chỉ dịch — rồi nhìn nó thực thi song song trên 5 ngôn ngữ, biến các cụm từ theo nghĩa đen thành bản sao nghe tự nhiên.
Vài ngày trước, một người dùng hỏi DIALØGUE có hỗ trợ tiếng Tây Ban Nha không.
Không.
48 giờ sau, nó hỗ trợ năm ngôn ngữ — tiếng Tây Ban Nha, Việt, Nhật, Hàn, và Trung Quốc phổ thông. Không phải nút UI được dịch. Bản địa hóa đầy đủ. Podcast nghe như được tạo cho từng thị trường.
Năm ngôn ngữ trong 48 giờ nghe như tôi thuê một đội hoặc thức đêm. Không.
Tôi đưa hướng dẫn cấp cao cho Claude Code. Nó viết tài liệu kế hoạch, rồi thực thi — thường chạy parallel agent trên nhiều file cùng lúc.
---
Bí Quyết: Lên Kế Hoạch Một Lần, Thực Thi Nhanh
Đây là phần thú vị: tôi không viết tài liệu kế hoạch. Claude Code viết — với sự hướng dẫn của tôi.
Tôi mô tả những gì muốn: "Tạo hướng dẫn phong cách bản địa hóa giải thích cách dịch tự nhiên, không theo nghĩa đen. Bao gồm ví dụ cho tiếng Tây Ban Nha, Việt, Nhật, Hàn, và Trung. Bao gồm mức độ trang trọng và ngữ cảnh văn hóa."
Claude Code tạo ra hướng dẫn phong cách hơn 1.000 dòng, checklist toàn diện, và playbook pipeline backend. Rồi nó theo kế hoạch của chính mình để thực thi.
1. Hướng Dẫn Phong Cách
Không phải bảng thuật ngữ dịch — mà là tài liệu triết lý. Nó giải thích *cách* bản địa hóa, với ví dụ trước/sau cho mỗi ngôn ngữ.
Ví dụ cho tiếng Tây Ban Nha:
| Tiếng Anh | Dịch theo nghĩa đen (Sai) | Bản địa hóa tự nhiên (Đúng) |
|---------|-----------------|-----------------|
| "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" |
Bản dịch theo nghĩa đen đúng ngữ pháp nhưng nghe giống Google Translate. Bản tự nhiên nắm bắt *ý định* — là những gì một marketer nói tiếng Tây Ban Nha thực sự sẽ viết.
Hướng dẫn bao gồm mức độ trang trọng (tiếng Nhật dùng です/ます, tiếng Hàn dùng 합쇼체), ngữ cảnh văn hóa, lỗi thường gặp cần tránh. Khi Claude Code dịch, nó tự động tuân theo các nguyên tắc này — những nguyên tắc nó tự viết.
2. Checklist Bản Địa Hóa
Checklist toàn diện mọi file cần thay đổi cho ngôn ngữ mới:
Bắt buộc (phải có):
- Frontend: `messages/{locale}.json` (~2.200 key)
- Backend: `locales/{locale}.json` (~82 key)
- Language Utils: 3 hàm trong `language_utils.py`
- Speech Generation: 1 hàm trong `gemini_voice_instructions.py`
- Voice Preview: 7 câu bản địa hóa
- Content Moderation: Từ khóa + prompt
- Smoke Test: Thêm vào ma trận test
Tùy chọn (nâng cao chất lượng):
- Hồ sơ host/khán giả theo phong cách
- Template prompt bản địa hóa
- Hướng dẫn giọng nói theo phong cách
Checklist này đảm bảo không bỏ sót gì. Claude Code làm việc qua nó một cách có hệ thống.
3. Playbook Backend
Tài liệu chính xác cách tạo podcast xử lý ngôn ngữ:
- Outline generation dùng Gemini 3 Flash với hướng dẫn ngôn ngữ
- Dialogue generation dùng Claude Sonnet 4.5 với ngữ cảnh văn hóa
- Speech generation dùng Gemini TTS với hướng dẫn riêng theo ngôn ngữ
Với ba tài liệu này, thêm ngôn ngữ mới trở nên máy móc. Claude Code đọc checklist, theo hướng dẫn phong cách, và cập nhật file theo playbook.
---
Vấn Đề Với "Cứ Dịch Đi"
Phải thừa nhận, bản năng đầu tiên của tôi là chạy mọi thứ qua API dịch và xong. "Create Podcast" thành "Crear Podcast" và mọi người đi tiếp, đúng không?
Cách tiếp cận đó tạo ra rác. Tôi học được điều này khi lớn lên giữa tiếng Việt và tiếng Anh — dịch theo nghĩa đen giết chết linh hồn của điều bạn muốn nói.
Dịch bảo tồn từ ngữ, bản địa hóa bảo tồn ý nghĩa. Hướng dẫn phong cách mã hóa sự khác biệt này.
| Ngôn ngữ | Dịch theo nghĩa đen | Bản địa hóa tự nhiên |
|----------|--------------------|--------------------|
| Tiếng Việt | "Ý tưởng, Được Sản Xuất" | "Từ Ý Tưởng → Đến Podcast" |
| Tiếng Nhật | "アイデア、制作された" | "アイデアを、カタチに" (Ý tưởng thành hình) |
| Tiếng Hàn | "아이디어, 제작됨" | "아이디어를, 현실로" (Ý tưởng thành hiện thực) |
| Tiếng Tây Ban Nha | "Ideas, Producidas" | "De la Idea, al Podcast" |
| Tiếng Trung | "想法,已制作" | "从想法,到播客" |
Mỗi ngôn ngữ đều cần mức độ chú ý này. Mỗi nút, mỗi thông báo lỗi, mỗi đoạn copy marketing.
Và đó chỉ là UI. Tạo podcast thực tế khó hơn.
---
Podcast Cần Host Bản Địa
Đây là điều tôi không lường trước: tên host rất quan trọng.
Trong phiên bản tiếng Anh, host mặc định là Alex và Maya. Chung chung, dễ quên, ổn.
Nhưng nếu bạn tạo podcast tiếng Việt và host vẫn tên Alex và Maya? Nghe lệch. Là người Việt, tôi có thể nói — nghe giống bản lồng tiếng dở của show Mỹ :D
Nên mỗi ngôn ngữ có tên host bản địa:
| Ngôn ngữ | Host 1 | Host 2 |
|----------|--------|--------|
| Tiếng Anh | Alex | Maya |
| Tiếng Việt | Minh | Lan |
| Tiếng Nhật | 太郎 (Tarō) | 花子 (Hanako) |
| Tiếng Hàn | 민준 (Minjun) | 수진 (Sujin) |
| Tiếng Tây Ban Nha | Carlos | María |
| Tiếng Trung | 明辉 | 雅琴 |
Nhưng chỉ tên chưa đủ. AI cần hiểu ngữ cảnh văn hóa.
Podcast công nghệ ở Nhật có chuẩn mực hội thoại khác so với ở Mỹ. Mức độ trang trọng, cách bày tỏ bất đồng, nhịp điệu trao đổi qua lại — tất cả đều khác.
Nên tôi tạo hướng dẫn prompt AI riêng theo ngôn ngữ. Hướng dẫn tiếng Việt chỉ định dùng "bạn" (thân mật nhưng tôn trọng). Hướng dẫn tiếng Nhật chỉ định です/ます (lịch sự nhưng thân thiện). Hướng dẫn tiếng Hàn chỉ định 합쇼체 (lịch sự trang trọng).
Đây là thứ bạn không thể tự động hóa. Từ nhiều năm làm việc trên các thị trường châu Á - Thái Bình Dương, tôi biết các mô hình giao tiếp này một cách trực giác — mẹo là mã hóa kiến thức văn hóa đó thành prompt mà AI có thể tuân theo. Nhưng một khi đã mã hóa, Claude Code áp dụng chúng nhất quán trên hàng nghìn chuỗi ký tự.
---
Lựa Chọn Model AI Thực Sự Hiệu Quả
Đây là nơi thú vị từ góc độ kỹ thuật.
DIALØGUE sử dụng ba model AI khác nhau cho ba nhiệm vụ khác nhau. Không phải vì tôi muốn phức tạp, mà vì mỗi model thực sự tốt hơn ở nhiệm vụ cụ thể.
Nhiệm vụ 1: Nghiên Cứu & Outline -> Gemini 3 Flash
Khi người dùng nhập chủ đề, bước đầu tiên là nghiên cứu. AI cần:
1. Tìm kiếm web cho thông tin hiện tại
2. Tổng hợp kết quả thành outline có cấu trúc
3. Trích dẫn nguồn đúng cách
Điều này cần grounding (tìm kiếm web thời gian thực) VÀ structured output (tuân thủ JSON schema).
Vấn đề là: hầu hết model không thể làm cả hai cùng lúc. Gemini 2.5 Flash hỗ trợ grounding. Hỗ trợ structured output. Nhưng không đồng thời. Phải chọn một.
Gemini 3 Flash Preview là model duy nhất tôi tìm thấy hỗ trợ cả hai tính năng cùng lúc. Nên nó xử lý outline generation.
```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
}
}
```
Outline trả về trong khoảng 60 giây với nguồn thực, có cấu trúc đúng.
Nhiệm vụ 2: Tạo Đối Thoại -> Claude Sonnet 4.5
Khi người dùng duyệt outline, AI viết kịch bản đầy đủ — từng chữ cả hai host sẽ nói.
Đây là viết sáng tạo. Cần tính cách, nhịp điệu tự nhiên, cảm giác cuộc trò chuyện thật.
Tôi đã test với nhiều model. Đối thoại của Claude nhất quán nghe tự nhiên hơn. Qua lại nghe chân thực. Host ngắt lời nhau tự nhiên. Họ xây dựng dựa trên ý của nhau.
Nó chủ quan, nhưng sau khi tạo hàng trăm podcast test, sự khác biệt rõ ràng. Claude Sonnet 4.5 xử lý dialogue generation.
```python
ANTHROPIC_MODEL = "claude-sonnet-4-5-20250929"
```
Nhiệm vụ 3: Tạo Audio -> Gemini 2.5 Flash TTS
Cuối cùng, kịch bản cần thành audio. Hai giọng, nhịp điệu đúng, biểu cảm cảm xúc.
Gemini 2.5 Flash TTS cung cấp 30 giọng riêng biệt với hỗ trợ multi-speaker. Bạn có thể có Charon (thông tin, nam) và Kore (dứt khoát, nữ) trong cùng file audio, chuyển đổi tự nhiên giữa speaker.
Chất lượng đủ tốt để người dùng thường hỏi có phải diễn viên lồng tiếng thật không.
```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
)
)
)
)
```
Pipeline
Luồng đầy đủ:
```
User Input
↓
[Gemini 3 Flash] Nghiên cứu + Outline có cấu trúc (~60 giây)
↓
Người dùng Review & Phản hồi
↓
[Claude Sonnet 4.5] Kịch bản đối thoại đầy đủ (~2-3 phút)
↓
Người dùng Review & Chỉnh sửa
↓
[Gemini 2.5 Flash TTS] Audio multi-speaker (~3-5 phút)
↓
Podcast hoàn thành
```
Mỗi model làm điều nó giỏi nhất. Tổng thời gian tạo khoảng 8-10 phút cho podcast 15-30 phút.
---
Một Tính Năng Gây Bất Ngờ
Người dùng yêu cầu điều tôi không lường trước: tạo podcast bằng ngôn ngữ khác với UI.
Người dùng Việt có thể thoải mái điều hướng ứng dụng bằng tiếng Việt nhưng muốn tạo podcast tiếng Anh cho đối tượng quốc tế. Hoặc marketer nói tiếng Tây Ban Nha có thể muốn thử nội dung tiếng Nhật.
Nên tôi thêm bộ chọn ngôn ngữ podcast. UI có thể bằng tiếng Anh trong khi bạn tạo podcast tiếng Trung. Host sẽ có tên Trung (明辉 và 雅琴), đối thoại theo mô hình hội thoại Trung, và audio dùng giọng phù hợp.
Tính năng nhỏ, nhưng mở rộng đáng kể những gì người dùng có thể làm.
---
Parallel Agent: Nhân Tốc Độ
Tốc độ thực sự đến từ parallel agent. Checklist ghi rõ:
> "Chạy parallel agent cho file backend - File backend nhỏ hơn và có thể xử lý song song (language_utils.py, content_moderation.py, gemini_voice_instructions.py, locales/{locale}.json)."
Khi tôi nói "Thêm hỗ trợ tiếng Hàn," Claude Code sẽ sinh nhiều agent:
- Một agent cập nhật file dịch frontend
- Agent khác thêm case tiếng Hàn vào `language_utils.py`
- Agent khác cập nhật `gemini_voice_instructions.py`
- Agent khác thêm tiếng Hàn vào `content_moderation.py`
Tất cả chạy đồng thời. Khi xong, Claude Code merge các thay đổi và chạy test.
Đó là lý do checklist phân biệt file "Bắt buộc" và "Tùy chọn" — để Claude Code biết cái gì song song hóa và cái gì có thể đợi.
Với file dịch frontend (~2.200 key), checklist chỉ định chiến lược chia nhỏ:
- Chunk 1: `common`, `nav`, `bottomNav` (~110 key)
- Chunk 2: `homepage`, `auth` (~180 key)
- Chunk 3: `dashboard`, `create` (~330 key)
- Và tiếp...
Điều này ngăn vấn đề giới hạn token và cho Claude Code dịch từng namespace, review từng cái theo hướng dẫn phong cách.
Quy mô:
- 5 ngôn ngữ được thêm
- ~2.500 chuỗi dịch tổng cộng mỗi ngôn ngữ
- 10+ template prompt AI mỗi ngôn ngữ
- 1 podcast demo được tạo mỗi ngôn ngữ
- Nhiều parallel agent mỗi ngôn ngữ
Insight quan trọng: tôi không viết code. Tôi không viết kế hoạch. Tôi đưa hướng dẫn, review đầu ra, và để Claude Code xử lý phần còn lại — thường song song. Nó vẫn khiến tôi ngỡ ngàng :P
---
Tiếp Theo
Sáu ngôn ngữ phủ sóng khoảng 2 tỷ người dùng tiềm năng. Đó là phạm vi tiếp cận đáng kể.
Nhưng tôi đã nghĩ về những gì còn thiếu (marketer trong tôi không bao giờ dừng):
1. Tiếng Ả Rập - Hỗ trợ bố cục phải-sang-trái phức tạp
2. Tiếng Hindi - Thị trường khổng lồ, chữ viết khác
3. Tiếng Bồ Đào Nha - Brazil là thị trường podcast lớn
4. Tiếng Pháp - Mở rộng châu Âu
5. Tiếng Tagalog - Cộng đồng creator Philippines mạnh
Mỗi ngôn ngữ cần cùng mức độ chăm sóc. Bản địa hóa tự nhiên, không phải dịch. Prompt văn hóa, không phải template sao chép. (Điều này chỉ khả thi vì tôi vừa xây lại toàn bộ ứng dụng trong 14 ngày với kiến trúc sạch.)
Tin tốt: tài liệu kế hoạch có thể tái sử dụng. Thêm ngôn ngữ tiếp theo sẽ còn nhanh hơn. Và bản địa hóa cũng áp dụng cho ứng dụng iOS native tôi đang xây — tất cả 7 ngôn ngữ, cùng backend Supabase.
---
Hãy Thử
Tôi thực sự tự hào về kết quả — đặc biệt phần bản địa hóa tiếng Việt. Nghe podcast nghe như được tạo cho đối tượng Việt Nam, không phải dịch vào họ, chạm đến tôi theo cách tôi không ngờ.
DIALØGUE giờ hỗ trợ:
- Tiếng Anh - Bản gốc
- Tiếng Việt - Từ Ý Tưởng → Đến Podcast
- Tiếng Nhật - アイデアを、カタチに
- Tiếng Hàn - 아이디어를, 현실로
- Tiếng Tây Ban Nha - De la Idea, al Podcast
- Tiếng Trung - 从想法,到播客
Tạo podcast bằng ngôn ngữ của bạn ->
UI sẽ theo tùy chọn bạn chọn. Và nhớ rằng — bạn có thể tạo podcast bằng bất kỳ ngôn ngữ nào bất kể cài đặt UI.
Người dùng mới được 2 podcast miễn phí để thử.
---
Bài Học Rút Ra
Nhìn lại, điều khiến tôi bất ngờ nhất là kinh nghiệm quảng cáo quan trọng đến thế nào. Nhiều năm điều chỉnh chiến dịch trên các thị trường châu Á dạy tôi rằng bản địa hóa không bao giờ chỉ về từ ngữ — mà là trực giác văn hóa. Tôi không ngờ đó lại là kỹ năng giá trị nhất tôi mang đến một dự án lập trình AI.
Cho những người xây dựng dùng trợ lý lập trình AI:
1. Chỉ đạo, đừng viết. Tôi không viết tài liệu kế hoạch — tôi mô tả những gì muốn và Claude Code tạo ra. Rồi nó theo kế hoạch của chính mình. Ban đầu cảm giác kỳ lạ, như ủy thác cho người cũng tự viết brief. Nhưng nó hiệu quả.
2. Cấu trúc cho phép mở rộng. Hướng dẫn phong cách, checklist, playbook — không chỉ dành cho con người nữa. Tôi nghĩ đây là đột phá lớn nhất: cấu trúc yêu cầu để AI agent có thể thực thi một cách có hệ thống. (Nhiều năm viết brief marketing cuối cùng cũng được đền đáp theo cách bất ngờ.)
3. Chọn model phù hợp nhiệm vụ. Có thể tôi sai, nhưng tôi tin chưa có model đơn lẻ nào giỏi nhất mọi thứ. Với DIALØGUE:
- Gemini 3 Flash cho nghiên cứu có grounding, có cấu trúc
- Claude Sonnet 4.5 cho đối thoại tự nhiên
- Gemini 2.5 Flash TTS cho audio multi-speaker
4. Bản địa hóa, đừng dịch. Người dùng biết sự khác biệt. Tôi không thể nhấn mạnh đủ — là người đã sống ở ba quốc gia và làm việc trên hàng chục thị trường, tôi đã thấy dịch lười biếng làm gì với sản phẩm. Mã hóa kiến thức văn hóa vào prompt và để AI áp dụng nhất quán.
Đó là tất cả từ tôi về bài này. Nếu bạn đang xây dựng thứ gì đó đa ngôn ngữ — hoặc thậm chí đang nghĩ về nó — tôi rất muốn nghe cách bạn tiếp cận bản địa hóa. Bạn có dùng AI không? Đi theo hướng agency truyền thống? Bạn có đồng ý rằng ngữ cảnh văn hóa là phần khó, không phải bản dịch? Cho tôi biết nhé.
Thân mến,
Chandler





