Free

Claude에게 글 한 편을 19개 언어로 번역시키기

글 한 편 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에 보내는 법.


핵심 결정: 번역 vs 로컬라이제이션

이 두 단어 차이가 크다.

번역은 A 언어의 의미를 B 언어로 옮기는 것—Google Translate가 하는 일. 읽으면 "맞다", 그런데 "평평하다".

로컬라이제이션은 원문의 어조, 리듬, 전문성을 유지하면서 대상 언어 독자의 "기술 블로그 어조"로 다시 쓰는 것. 결과는 네이티브가 쓴 것처럼 읽힌다.

Claude한테 번역시키는 건 5분 작업, 로컬라이제이션은 prompt에 다음을 명시해야 함:

  • 대상 독자(개발자, 기술 팀)
  • 어조 레퍼런스(어느 블로그 스타일)
  • 원문 유지해야 할 용어(API 이름, 프레임워크 이름, 명령어, URL)
  • 재구성 허용 지점(긴 문장 분할, 비유를 대상 언어 독자가 익숙한 것으로 교체)

how2claude의 /write-article 명령어는 각 언어에 스타일 요건을 박아둠:

언어 파일 스타일 요건
ja.md 기술 블로그 어조, 자연스러운 일본어
ko.md 기술 블로그 어조, 자연스러운 한국어
zh-TW.md 대만 용어 습관, 번체자
ar.md 표준 아랍어(현대 서면어)
id.md 표준 인도네시아어

한 줄 차이로 보이지만 Claude한테는 결정적—이 줄 없으면 기본적으로 "교과서 번역"을 생성한다.

파일 구조: 19개 언어가 한 디렉터리에 같이 산다

초고 하나당 디렉터리 하나, 파일 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 쓰고 18개 언어로 방사

잘못 가는 흐름 두 가지:

틀림: 체인 번역. 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가 흐트러짐.

5가지 실전 함정

1. 트윗 글자 수 제한은 언어마다 다름

X는 CJK(중·일·한) 문자에 더 엄격한 계수를 매긴다. Claude에게 트윗 생성시킬 때 이렇게 요구했음:

  • 중국어 트윗 ≤ 140자
  • 기타 언어 ≤ 280자

처음 생성 때 중국어 트윗 3개가 초과(160, 164, 152자). Claude가 영어 트윗을 직역한 탓—영어 260자를 중국어로 옮기면 딱 선에 걸린다.

규칙: 중국어 트윗은 번역이 아니라 재작성. 요건: 140자 상한, 훅 있어야, 세부 손실 허용.

2. 번체 중국어는 문자 변환이 아님

zhzh-TW에서 제일 게을러지기 쉬움: 변환기에 넣어 간체→번체 변환. 글자는 맞는데 어휘가 안 맞음:

zh zh-TW(틀림) zh-TW(맞음)
文件 文件 檔案
信息 信息 資訊
软件 軟件 軟體
视频 視頻 影片

Claude한테 zh-TW 시킬 때는 둘 다 말할 것: "대만 용어 습관, 번체자". "번체자만"이라고 하면 문자 변환만 나옴.

3. RTL 언어(ar, he)는 레이아웃에서 헛딛음

아랍어, 히브리어는 오른쪽에서 왼쪽으로 쓴다. Rails 쪽은 <html dir="rtl">, Tailwind는 rtl: variants. 그런데 번역 자체도 함정이 있음:

  • 코드 블록 내 영어는 번역 안 함, 그런데 아랍어 단락이 코드 블록을 감쌀 때 브라우저에 unicode-bidi: isolate를 넣지 않으면 코드가 RTL 방향으로 "빨려간다"
  • 구두점 혼용: 아랍어는 , 대신 ،, ? 대신 ؟ 사용. Claude 기본값은 영어 구두점, 명시 지정 필요
  • 숫자 방향: 아랍어로 숫자는 왼쪽에서 오른쪽(2026), 전체 단락 흐름은 오른쪽에서 왼쪽. 브라우저가 처리해주지만 Claude가 원시 텍스트 쓸 때 자주 섞음

4. Claude는 기본적으로 저자 목소리를 "묵직하게" 만든다

원문의 구어 표현("일거에", "함정 밟음", "엎어짐")을 Claude는 일본어·한국어로 기본적으로 서면 표현(「一気に実装」「落とし穴」「失敗」)으로 옮김—의미는 맞지만 저자 어조가 사라짐.

수정: prompt에 명시—"원문의 직접적, 살짝 자조적, 격식 안 차린 기술 블로그 어조 유지, 학술화 금지". 그래도 일부 언어(독일어, 러시아어)는 원문보다 살짝 "격식"있게 안착함—언어 자체가 서면 bias 있음.

5. 플레이스홀더와 변수는 번역 안 함

코드 내 문자열은 두 종류—UI 텍스트(번역함)와 플레이스홀더/변수명(번역 안 함):

t("pricing.page_title")        # 번역 안 함(i18n key)
"user_id"                      # 번역 안 함(변수명)
"Monthly subscription"         # 본문에서 독자에게 예시로 보여준다면 → 번역 안 함

코드 인접 문자열은 "번역 안 함"을 기본값으로 두는 게 안전. 진짜 번역해야 하는 건 i18n locale 파일(config/locales/xx.yml), 그건 별건.

배포: 한 번의 POST로 19개 언어

/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개 언어로 번역시키는 완전 체크리스트:

  1. zh(혹은 en) 먼저 확정, 그걸로 다른 18개 언어 방사 번역—체인 금지.
  2. 언어별 스타일 요건을 prompt에 포함: "자연스러운 일본어"로는 부족, "기술 블로그 어조, 자연스러운 일본어"라고 말할 것.
  3. title과 summary는 별도 번역, 본문 첫 단락에서 뽑지 말 것. meta.json에서 19개 언어 title/summary 집중 관리.
  4. 번역 안 할 것 명시 나열: 코드 블록, 명령어, API 이름, URL, i18n key, 변수명. 번역할 것은 설명문, 비유, 단락 구성.
  5. 트윗은 번역이 아니라 재작성. 중국어 140자, 기타 280자. 영어 직역은 항상 제한 초과.
  6. 번체 중국어는 "대만 용어 + 번체자"라고 말할 것, 안 그러면 문자 변환만 되고 어휘는 대륙 그대로.
  7. RTL 언어(ar, he)는 Rails 쪽에서 dir="rtl" + Tailwind rtl: variants. 구두점 혼용과 코드 블록 분리는 별도 처리.
  8. 모든 언어 한 번의 POST—19 content + 19 title/summary + 각 연결 계정의 트윗, 한 요청으로 백엔드에 묶어서 보냄.

진짜 병목은 번역 품질이 아님—Claude 4급 모델은 일본어·한국어·아랍어·러시아어로의 번역 품질이 네이티브에 가까움. 병목은 글 한 편을 19개 언어 독자 앞에 내놓을 각오가 있는가. 기술적으로 5분이면 끝남. 콘텐츠적으로 200배의 독자에게 동시에 전할 의지만 있으면 된다.