글 한 편 19개 언어: 파일 구조, 번역 prompt, 5가지 실전 함정, 한 번에 POST하는 법.
Anthropic과 OpenAI의 공식 문서는 영어만 있다. 이게 전 세계 AI 개발자 콘텐츠 생태계의 큰 공백이다. how2claude가 하는 일이 바로 이 공백을 메우는 것—매 글을 19개 언어로 동시 발행: zh / en / zh-TW / ja / ko / es / pt-BR / id / vi / tr / ar / fr / de / it / ru / uk / pl / he / th.
사람한테 시키는 건 비현실적(글 한 편당 20명 번역자, 편당 수천 달러). Claude한테 시키면 한계 비용이 거의 제로—근데 그냥 "ja로 번역해"라고 던지면 기계 번역 티 물씬 나고 저자 목소리 다 날아간 원고가 돌아온다. 이 글은 이걸 제대로 하는 완전한 흐름: 파일 구조, 번역 prompt 쓰는 법, Claude가 반드시 헛딛는 지점, 19개 언어 + 언어별 트윗을 한 번의 POST로 API에 보내는 법.
이 두 단어 차이가 크다.
번역은 A 언어의 의미를 B 언어로 옮기는 것—Google Translate가 하는 일. 읽으면 "맞다", 그런데 "평평하다".
로컬라이제이션은 원문의 어조, 리듬, 전문성을 유지하면서 대상 언어 독자의 "기술 블로그 어조"로 다시 쓰는 것. 결과는 네이티브가 쓴 것처럼 읽힌다.
Claude한테 번역시키는 건 5분 작업, 로컬라이제이션은 prompt에 다음을 명시해야 함:
how2claude의 /write-article 명령어는 각 언어에 스타일 요건을 박아둠:
| 언어 파일 | 스타일 요건 |
|---|---|
ja.md |
기술 블로그 어조, 자연스러운 일본어 |
ko.md |
기술 블로그 어조, 자연스러운 한국어 |
zh-TW.md |
대만 용어 습관, 번체자 |
ar.md |
표준 아랍어(현대 서면어) |
id.md |
표준 인도네시아어 |
한 줄 차이로 보이지만 Claude한테는 결정적—이 줄 없으면 기본적으로 "교과서 번역"을 생성한다.
초고 하나당 디렉터리 하나, 파일 20개:
docs/drafts/let-claude-translate-articles/
├── meta.json # 모든 19개 언어의 title + summary
├── zh.md # 중국어(원문, 먼저 작성)
├── en.md # 영어(첫 번째 번역 배치)
├── zh-TW.md
├── ja.md
├── ko.md
├── ...(나머지 14개)
└── th.md
meta.json:
{
"category_slug": "use-cases",
"series_slug": "writing",
"free": true,
"title": {
"zh": "让 Claude 把一篇文章翻译成 19 种语言",
"en": "Letting Claude Translate One Article Into 19 Languages",
"ko": "Claude에게 글 한 편을 19개 언어로 번역시키기",
"...": "..."
},
"summary": {
"ko": "글 한 편 19개 언어: 파일 구조, 번역 prompt, 5가지 실전 함정, 한 번에 POST하는 법.",
"...": "..."
}
}
각 .md 파일의 첫 줄은 # 제목, 이후는 본문. title은 md 첫 줄에서 가져오지 않고 meta.json에서 가져옴—이렇게 하면 각 언어의 title이 따로 다듬어진 짧은 문장이 되고, 본문 안에서 늘어진 제목이 안 된다.
잘못 가는 흐름 두 가지:
틀림: 체인 번역. zh → en → ja → ko → ...
문제: ja는 en 기반, ko는 ja 기반, 한 번 점프할 때마다 원뜻이 조금씩 새어나감. th(태국어) 도달 시 4차 정보.
맞음: 방사 번역. zh 확정 → zh 기반으로 en / ja / ko / ar / id / ... 한 번에 생성.
모든 언어가 원문에서 직접 생성, 중간 지점 없음.
구체 prompt 구조(/write-article에 패키징됨):
이것은 X에 관한 기술 블로그 글, 중국어 원문:
[zh.md 전문]
다음 언어로 번역, 언어별 요건:
- ja.md: 기술 블로그 어조, 자연스러운 일본어
- ko.md: 기술 블로그 어조, 자연스러운 한국어
- ar.md: 표준 아랍어(현대 서면어)
...
요건:
1. 저자의 직접적, 전문적, 살짝 자조적인 어조 유지
2. 코드 블록, 명령어, API 이름, URL은 번역 안 함
3. 제목, 소제목, 단락 흐름 재구성 허용
4. title 따로 출력, 짧고 후킹 있게, 원제의 직역 아님
18개 언어 병행 번역, Claude 한 세션으로 끝. 중요한 한 가지: 같은 세션/같은 모델 버전에서 할 것—세션 건너뛰기나 모델 건너뛰기로 voice가 흐트러짐.
X는 CJK(중·일·한) 문자에 더 엄격한 계수를 매긴다. Claude에게 트윗 생성시킬 때 이렇게 요구했음:
처음 생성 때 중국어 트윗 3개가 초과(160, 164, 152자). Claude가 영어 트윗을 직역한 탓—영어 260자를 중국어로 옮기면 딱 선에 걸린다.
규칙: 중국어 트윗은 번역이 아니라 재작성. 요건: 140자 상한, 훅 있어야, 세부 손실 허용.
zh → zh-TW에서 제일 게을러지기 쉬움: 변환기에 넣어 간체→번체 변환. 글자는 맞는데 어휘가 안 맞음:
| zh | zh-TW(틀림) | zh-TW(맞음) |
|---|---|---|
| 文件 | 文件 | 檔案 |
| 信息 | 信息 | 資訊 |
| 软件 | 軟件 | 軟體 |
| 视频 | 視頻 | 影片 |
Claude한테 zh-TW 시킬 때는 둘 다 말할 것: "대만 용어 습관, 번체자". "번체자만"이라고 하면 문자 변환만 나옴.
아랍어, 히브리어는 오른쪽에서 왼쪽으로 쓴다. Rails 쪽은 <html dir="rtl">, Tailwind는 rtl: variants. 그런데 번역 자체도 함정이 있음:
unicode-bidi: isolate를 넣지 않으면 코드가 RTL 방향으로 "빨려간다", 대신 ،, ? 대신 ؟ 사용. Claude 기본값은 영어 구두점, 명시 지정 필요2026), 전체 단락 흐름은 오른쪽에서 왼쪽. 브라우저가 처리해주지만 Claude가 원시 텍스트 쓸 때 자주 섞음원문의 구어 표현("일거에", "함정 밟음", "엎어짐")을 Claude는 일본어·한국어로 기본적으로 서면 표현(「一気に実装」「落とし穴」「失敗」)으로 옮김—의미는 맞지만 저자 어조가 사라짐.
수정: prompt에 명시—"원문의 직접적, 살짝 자조적, 격식 안 차린 기술 블로그 어조 유지, 학술화 금지". 그래도 일부 언어(독일어, 러시아어)는 원문보다 살짝 "격식"있게 안착함—언어 자체가 서면 bias 있음.
코드 내 문자열은 두 종류—UI 텍스트(번역함)와 플레이스홀더/변수명(번역 안 함):
t("pricing.page_title") # 번역 안 함(i18n key)
"user_id" # 번역 안 함(변수명)
"Monthly subscription" # 본문에서 독자에게 예시로 보여준다면 → 번역 안 함
코드 인접 문자열은 "번역 안 함"을 기본값으로 두는 게 안전. 진짜 번역해야 하는 건 i18n locale 파일(config/locales/xx.yml), 그건 별건.
/publish-article 명령어는 초고를 how2claude.com/api/articles로 POST:
{
"category_slug": "use-cases",
"series_slug": "writing",
"free": true,
"thread": true,
"title": { "zh": "...", "en": "...", "ja": "...", ... },
"summary": { "zh": "...", "en": "...", ... },
"content": { "zh": "<md>", "en": "<md>", ... },
"tweets": { "en": ["...", "..."], "zh": [...], ... }
}
요청 하나가 약 300KB(19개 언어 × 약 15KB). 서버가 DB로 분해:
articles 테이블, title / summary / content는 jsonb, locale 키x_queue_tweets 테이블, locale + account로 분배, 배포 큐에 투입트윗은 X 계정 연결된 locale로만 보냄(현재 en/zh/ja/ko/ar/id 6개), 미연결 언어는 tweets에 [] 보냄. 계정 확인:
Account.all.each { |a| puts "#{a.locale}: #{a.name}" }
# en: @how2claude
# zh: @howtoclaude
# ja: @how2claude_ja
# ko: @how2claude_ko
# ar: @how2claude_ar
# id: @how2claude_id
Claude에게 글 한 편을 19개 언어로 번역시키는 완전 체크리스트:
dir="rtl" + Tailwind rtl: variants. 구두점 혼용과 코드 블록 분리는 별도 처리.진짜 병목은 번역 품질이 아님—Claude 4급 모델은 일본어·한국어·아랍어·러시아어로의 번역 품질이 네이티브에 가까움. 병목은 글 한 편을 19개 언어 독자 앞에 내놓을 각오가 있는가. 기술적으로 5분이면 끝남. 콘텐츠적으로 200배의 독자에게 동시에 전할 의지만 있으면 된다.