Django 앱을 만들었습니다. 잘 작동하고, 사용자들이 가입하고 있으며, 이제 영어를 못하는 사람들에게도 다가가고 싶습니다. 문제는 보는 순간 명확합니다: Django의 국제화 프레임워크는 번역 가능한 문자열을 추출하는 데는 뛰어나지만, 번역을 채워넣는 것은 전혀 해주지 않습니다. 그 부분은 여러분의 몫입니다.
혼자 개발하거나 두 명의 팀이라면, makemessages와 완전히 번역된 앱 사이의 간극이 엄청나게 느껴질 수 있습니다. 현실적인 옵션들을 살펴보고, 왜 대부분이 소규모 팀에게는 실패하는지 설명하고, 번역을 몇 주짜리 작업에서 2분짜리 명령어로 바꾸는 워크플로우를 보여드리겠습니다.
전통적인 옵션들 (그리고 왜 힘든지)
옵션 1: Google Translate에서 복사-붙여넣기
가장 흔한 첫 번째 시도입니다. .po 파일을 열고, 각 msgid를 Google Translate에 복사하고, 결과를 msgstr로 다시 붙여넣고, 반복합니다. 모든 문자열에 대해. 모든 언어에 대해.
일반적인 Django 앱에는 200-500개의 번역 가능한 문자열이 있습니다. 다섯 개 언어로 번역한다면, 1,000-2,500번의 복사-붙여넣기 사이클입니다. 각각 30초만 걸린다 해도, 8-20시간의 지루한 작업이 됩니다. 그리고 이것은 불가피하게 생기는 서식 오류, 깨진 placeholder, 일관성 없는 용어를 수정하기 전의 이야기입니다.
더 나쁜 것은, 다음 스프린트에서 새 문자열을 추가하면 다시 해야 한다는 것입니다.
옵션 2: 전문 번역가
전문 번역은 일반적으로 단어당 $0.10에서 $0.25가 듭니다. 평균 8단어인 500개 문자열이 있는 Django 앱은 대략 4,000단어입니다. 단어당 $0.15라면, 언어당 $600, 다섯 개 언어로 $3,000입니다.
VC 투자를 받은 스타트업이라면 반올림 오차 수준입니다. 사용자당 월 $9를 받는 1인 개발자라면, 분기 전체 수익을 잡아먹을 수 있습니다.
옵션 3: Fiverr와 프리랜서 마켓플레이스
Fiverr에서 언어당 $20-50에 번역가를 찾을 수 있습니다. 일부는 진정으로 실력이 있습니다. 많은 이들은 단순히 여러분의 텍스트를 Google Translate에 붙여넣고 그 대가를 청구합니다. 결국 옵션 1과 같은 품질에, 추가적인 커뮤니케이션 왕복과 일주일의 대기 시간이 더해집니다.
옵션 4: Crowdin, Transifex, 또는 Weblate
이 플랫폼들은 강력하지만, 전담 번역 팀이 있는 프로젝트를 위해 설계되었습니다. 설정 오버헤드(저장소 동기화, 번역 메모리 구성, 기여자 접근 관리)는 프로젝트에 혼자인 경우 과도합니다. 유료 티어의 월간 구독은 $30-150/월부터 시작하며, 무료 티어조차 또 다른 서드파티 통합을 유지해야 합니다.
옵션 5: ChatGPT에 모든 것을 붙여넣기
이것은 실제로 품질 면에서 놀라울 정도로 잘 작동합니다. .po 파일 내용을 ChatGPT나 Claude에 붙여넣고, 번역을 요청하면, 합리적인 결과를 얻습니다. 문제는 확장성이 없다는 것입니다. 번역되지 않은 문자열을 수동으로 추출하고, 프롬프트를 형식화하고, 응답을 .po 형식으로 다시 파싱하고, 컨텍스트 제한을 초과할 때 배치 처리를 해야 합니다. 한 번은 작동합니다. 반복 가능한 워크플로우로는 무너집니다.
자동화 접근법
전체 번역 단계가 하나의 명령어라면 어떨까요? 이것이 TranslateBot의 아이디어입니다. 여러분의 .po 파일을 읽고, 번역되지 않은 문자열을 AI 제공자에게 보내고, 올바른 형식으로 번역을 다시 쓰는 오픈소스 Django 관리 명령어입니다.
설정 방법은 다음과 같습니다.
1단계: TranslateBot 설치
uv add --dev translatebot-django
또는 pip으로:
pip install translatebot-django
설치된 앱에 추가하세요:
# settings.py
INSTALLED_APPS = [
# ...
'translatebot_django',
]
2단계: AI 제공자 설정
두 가지 설정을 추가하세요:
# settings.py
import os
TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini"
TranslateBot은 OpenAI, Anthropic Claude, Google Gemini, 그리고 LiteLLM을 통한 100개 이상의 다른 모델과 함께 작동합니다. 또한 전용 번역 백엔드로 DeepL도 지원합니다.
3단계: TRANSLATING.md 만들기 (선택사항이지만 권장)
프로젝트 루트에 있는 TRANSLATING.md 파일은 AI에게 여러분의 애플리케이션에 대한 맥락을 제공합니다. 이것이 일반적인 기계 번역과 실제로 제품에 맞는 번역을 구분하는 요소입니다:
# Translation Context
## About This Project
A personal finance tracker for freelancers. Users track invoices,
expenses, and tax obligations.
## Tone
- Friendly and informal
- Use "du" in German, "tu" in French
- Keep financial terms precise
## Terminology
- "invoice" = "Rechnung" (German), "facture" (French)
- "dashboard" = keep as English loanword in all languages
- "freelancer" = keep as English loanword in German
이 파일은 모든 번역 요청과 함께 전송되므로, AI가 일관되게 올바른 톤과 용어를 사용합니다.
4단계: 번역
python manage.py makemessages -l de -l fr -l nl -l es -l ja
python manage.py translate
python manage.py compilemessages
세 개의 명령어. 그게 다입니다. TranslateBot은 모든 .po 파일에서 번역되지 않은 모든 문자열을 찾아 배치로 번역하고 결과를 다시 씁니다. 기본적으로 비어 있는 항목만 번역되므로, 새 문자열을 추가한 후 명령어를 다시 실행하면 새로운 것만 번역합니다.
실제로 어떤 모습인지
다섯 개 언어를 지원하는 1인 개발자의 현실적인 스프린트 워크플로우입니다:
월요일: 새 기능을 만듭니다. 개발하면서 gettext()와 {% trans %}를 사용하여 새 번역 가능한 문자열을 몇 개 추가합니다.
from django.utils.translation import gettext_lazy as _
class InvoiceView(View):
def post(self, request):
# New string added during development
messages.success(request, _("Invoice sent successfully."))
커밋 전: 세 개의 명령어를 실행합니다:
python manage.py makemessages -a --no-obsolete
python manage.py translate
python manage.py compilemessages
translate 명령어가 새로 번역되지 않은 항목을 감지하고 그것만 번역합니다. 5개의 새 문자열을 추가하고 5개 언어를 지원한다면, 단일 API 호출로 25개의 번역을 만듭니다. 전체 과정은 1분도 걸리지 않습니다.
커밋합니다 코드, 템플릿, 그리고 업데이트된 .po/.mo 파일을 함께. 번역은 별도의 프로젝트가 아니라 일반적인 개발 흐름의 일부입니다.
커밋 전 미리보기
번역이 디스크에 쓰여지기 전에 확인하고 싶다면, dry-run 모드를 사용하세요:
python manage.py translate --dry-run
이것은 파일을 수정하지 않고 모든 번역을 터미널에 출력합니다.
비용 비교
여기서 자동화에 반대하기 어려워집니다.
| 접근 방식 | 500 문자열, 5개 언어 | 시간 | 반복 비용 |
|---|---|---|---|
| 수동 복사-붙여넣기 | 무료 | ~40시간 | ~8시간/스프린트 |
| 전문 번역가 | ~$3,000 | 1-2주 | ~$600/스프린트 |
| Fiverr 번역가 | ~$100-250 | 3-7일 | ~$50/스프린트 |
| Crowdin/Transifex | $30-150/월 | 설정: 수 시간 | 지속적 |
| TranslateBot + GPT-4o-mini | ~$0.05 | ~2분 | ~$0.01/스프린트 |
| TranslateBot + DeepL Free | $0 | ~2분 | $0 |
약 500개의 번역 가능한 문자열이 있는 소규모에서 중규모 Django 앱은 gpt-4o-mini로 언어당 일반적으로 $0.01 미만의 비용이 듭니다. 대부분의 1인 프로젝트에서 DeepL 무료 티어(월 500,000자)가 비용 없이 모든 것을 커버합니다.
분명히 하자면: AI 번역은 완벽하지 않습니다. 저가 인간 번역도 마찬가지입니다. 차이점은 AI 번역이 거의 비용이 들지 않고, 즉시 도착하며, 원할 때마다 다시 실행할 수 있다는 것입니다.
CI 통합: 번역되지 않은 문자열을 절대 배포하지 않기
1인 개발자로서 제가 찾은 가장 유용한 패턴 중 하나는 CI에 번역 검사를 추가하는 것입니다. TranslateBot에는 .po 파일에 번역되지 않았거나 fuzzy한 항목이 있으면 실패하는 check_translations 명령어가 포함되어 있습니다:
# .github/workflows/ci.yml
jobs:
translations:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- run: uv python install
- run: uv sync --frozen
- name: Install gettext
run: sudo apt-get update && sudo apt-get install -y --no-install-recommends gettext
- name: Check translations
run: uv run python manage.py check_translations --makemessages
템플릿에 새 {% trans %} 태그를 추가하고 translate 실행을 잊으면, CI가 잡아냅니다:
locale/de/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
locale/fr/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
CommandError: Translation check failed
이것은 번역을 기억해야 하는 것에서 잊을 수 없는 것으로 바꿔줍니다.
실용적인 팁
두세 개 언어로 시작하세요. 첫날부터 15개 언어로 출시할 필요는 없습니다. 사용자가 가장 많거나 가장 큰 잠재 시장이 있는 언어를 선택하세요. 독일어, 프랑스어, 스페인어는 유럽 시장에서 많은 부분을 커버합니다.
핵심 문자열은 원어민에게 검토를 받으세요. AI 번역은 대부분의 UI 텍스트에 충분히 좋지만, 랜딩 페이지 헤드라인과 온보딩 플로우는 사람의 눈이 필요합니다. 친구, 사용자, 또는 커뮤니티 포럼의 누군가에게 가장 눈에 띄는 문자열을 10분 정도 검토해달라고 요청하세요.
덮어쓰기 전에 dry-run을 사용하세요. 모든 것을 다시 번역해야 할 때(예: 더 나은 용어 가이드라인으로 TRANSLATING.md를 업데이트한 후), 먼저 변경 사항을 미리보세요:
python manage.py translate --overwrite --dry-run
TRANSLATING.md를 버전 관리에 보관하세요. 이것은 프로젝트의 번역 설정의 일부입니다. 용어나 톤 가이드라인을 업데이트하면, 다음 translate 실행 시 새 문자열에 대해 해당 변경 사항이 반영됩니다.
필요할 때 앱별로 번역하세요. 하나의 앱에서만 문자열을 변경했다면, 번역 범위를 지정할 수 있습니다:
python manage.py translate --app billing
몇 주에서 몇 분으로
Django의 국제화 프레임워크는 어떤 웹 프레임워크에서든 최고 수준입니다. makemessages, 로케일 디렉토리, compilemessages를 위한 도구는 성숙하고 신뢰할 수 있습니다. 유일하게 빠져있던 부분은 번역 단계 자체였습니다. 그것이 비싸고 느린 부분이었습니다.
TranslateBot을 사용하면 워크플로우는 다음과 같이 됩니다:
- 평소처럼
gettext()와{% trans %}로 코드 작성 makemessages를 실행하여 문자열 추출translate를 실행하여 번역 채우기compilemessages를 실행하여 컴파일- 모든 것을 함께 커밋
1인 개발자에게 이것은 로컬라이제이션이 더 이상 "언젠가" 계획하는 프로젝트가 아니라는 것을 의미합니다. 커피 한 잔 만드는 시간에 오늘 바로 할 수 있는 일입니다.
TranslateBot은 오픈소스이며 PyPI와 GitHub에서 사용할 수 있습니다. 설치하고, 명령어를 실행하고, 몇 분 안에 새로운 언어로 된 앱을 확인하세요.