あなたはDjangoアプリを作りました。動いていて、ユーザーも登録してくれています。そして今、英語を話さない人々にもリーチしたいと思っています。問題は見た瞬間に明らかです。Djangoの国際化フレームワークは翻訳可能な文字列を抽出するのには優れていますが、翻訳を埋めることについては何もしてくれません。その部分はあなた自身でやる必要があります。
個人開発者や2人チームの場合、makemessagesと完全に翻訳されたアプリとの間のギャップは途方もなく感じるかもしれません。現実的な選択肢を紹介し、なぜそのほとんどが小さなチームには向かないのかを説明し、翻訳を数週間の作業から2分のコマンドに変えるワークフローをお見せします。
従来の選択肢(そしてなぜつらいのか)
選択肢1:Google Translateからコピペ
最もよくある最初の試み。.poファイルを開き、各msgidをGoogle Translateにコピーし、結果をmsgstrとして貼り付けて、繰り返す。すべての文字列について。すべての言語で。
典型的なDjangoアプリには200〜500の翻訳可能な文字列があります。5言語に翻訳する場合、1,000〜2,500回のコピペサイクルになります。1回あたり30秒しかかからないとしても、8〜20時間の単調な作業です。しかもそれは、フォーマットエラー、壊れたプレースホルダー、不可避的に忍び込む用語の不一致を修正する前の話です。
さらに悪いことに、次のスプリントで新しい文字列を追加したら、またやり直しです。
選択肢2:プロの翻訳者
プロの翻訳は通常、1語あたり$0.10〜$0.25です。平均8語の500文字列を持つDjangoアプリは約4,000語です。$0.15/語で、1言語あたり$600、5言語で$3,000です。
VCから資金調達したスタートアップにとっては端数です。しかしユーザーあたり月$9を課金している個人開発者にとっては、四半期の収益をすべて食い尽くす可能性があります。
選択肢3:Fiverrとフリーランスマーケットプレイス
Fiverrで1言語あたり$20〜50で翻訳者を見つけることができます。本当にスキルのある人もいます。多くはあなたのテキストをGoogle Translateに貼り付けて、その分を請求しているだけです。結局、選択肢1と同じ品質になり、さらにコミュニケーションの往復と1週間の待ち時間が加わります。
選択肢4:Crowdin、Transifex、またはWeblate
これらのプラットフォームは強力ですが、専任の翻訳チームがいるプロジェクト向けに設計されています。セットアップのオーバーヘッド(リポジトリの同期、翻訳メモリの設定、コントリビューターのアクセス管理)は、プロジェクトに自分一人しかいない場合には過剰です。有料プランの月額サブスクリプションは$30〜150/月から始まり、無料プランでもさらに別のサードパーティ統合を維持する必要があります。
選択肢5:すべてをChatGPTに貼り付ける
品質の面では、これは驚くほどうまくいきます。.poファイルの内容をChatGPTやClaudeに貼り付け、翻訳を依頼すると、妥当な結果が得られます。問題は、スケールしないことです。未翻訳の文字列を手動で抽出し、プロンプトをフォーマットし、レスポンスを.po形式にパースし直し、コンテキスト制限を超えた場合のバッチ処理を行う必要があります。1回は機能します。繰り返し可能なワークフローとしては破綻します。
自動化アプローチ
翻訳ステップ全体が1つのコマンドだったら?それがTranslateBotの背後にあるアイデアです。オープンソースのDjango管理コマンドで、.poファイルを読み取り、未翻訳の文字列をAIプロバイダーに送信し、正しい形式で翻訳を書き戻します。
セットアップ方法はこちらです。
ステップ1:TranslateBotをインストール
uv add --dev translatebot-django
またはpipで:
pip install translatebot-django
インストール済みアプリに追加:
# settings.py
INSTALLED_APPS = [
# ...
'translatebot_django',
]
ステップ2:AIプロバイダーを設定
2つの設定を追加:
# 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
3つのコマンド。以上です。TranslateBotはすべての.poファイルから未翻訳の文字列をすべて見つけ、バッチで翻訳し、結果を書き戻します。デフォルトでは空のエントリのみが翻訳されるため、新しい文字列を追加した後にコマンドを再実行すると、新しいものだけが翻訳されます。
実際にはどう見えるか
5言語をサポートする個人開発者のための現実的なスプリントワークフローがこちらです:
月曜日:新機能を開発します。開発中に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."))
コミット前:3つのコマンドを実行:
python manage.py makemessages -a --no-obsolete
python manage.py translate
python manage.py compilemessages
translateコマンドは新しい未翻訳エントリを検出し、それらだけを翻訳します。5つの新しい文字列を追加して5言語をサポートしている場合、1回の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で通常1言語あたり$0.01未満です。ほとんどの個人プロジェクトでは、DeepLの無料枠(月500,000文字)がゼロコストですべてをカバーします。
はっきり言うと:AI翻訳は完璧ではありません。低価格の人間翻訳も完璧ではありません。違いは、AI翻訳はほぼ無料で、即座に届き、いつでも再実行できることです。
CI統合:未翻訳の文字列を絶対にリリースしない
個人開発者として見つけた最も便利なパターンの1つは、CIに翻訳チェックを追加することです。TranslateBotにはcheck_translationsコマンドが含まれており、.poファイルに未翻訳またはファジーなエントリがある場合に失敗します:
# .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
これにより、翻訳は「覚えておくべきこと」から「忘れることができないこと」に変わります。
実用的なヒント
2〜3言語から始める。 初日に15言語でローンチする必要はありません。最もユーザーが多い言語や最大のアドレス可能市場を選びましょう。ドイツ語、フランス語、スペイン語はヨーロッパ市場の多くをカバーします。
ネイティブスピーカーに重要な文字列をレビューしてもらう。 AI翻訳はほとんどのUIテキストには十分ですが、ランディングページの見出しとオンボーディングフローは人間の目に値します。友人、ユーザー、またはコミュニティフォーラムの誰かに、最も目立つ文字列のレビューに10分を使ってもらいましょう。
上書き前にdry-runを使う。 すべてを再翻訳する必要がある場合(例えば、TRANSLATING.mdをより良い用語ガイドラインで更新した後)、まず変更をプレビューしましょう:
python manage.py translate --overwrite --dry-run
TRANSLATING.mdをバージョン管理に入れる。 プロジェクトの翻訳設定の一部です。用語やトーンのガイドラインを更新すると、次のtranslate実行で新しい文字列にその変更が反映されます。
必要に応じてアプリ単位で翻訳する。 1つのアプリの文字列だけを変更した場合、翻訳の範囲を限定できます:
python manage.py translate --app billing
数週間から数分へ
Djangoの国際化フレームワークは、あらゆるWebフレームワークの中でも最高の1つです。makemessages、localeディレクトリ、compilemessagesのツールは成熟しており信頼できます。唯一欠けていたのは翻訳ステップそのものでした。それが高コストで遅い部分でした。
TranslateBotを使えば、ワークフローはこうなります:
- 通常通り
gettext()と{% trans %}でコードを書く makemessagesを実行して文字列を抽出translateを実行して翻訳を埋めるcompilemessagesを実行してコンパイル- すべてを一緒にコミット
個人開発者にとって、これはローカライゼーションがもはや「いつか」のために計画するプロジェクトではないことを意味します。コーヒーを一杯淹れる時間で、今日できることです。
TranslateBotはオープンソースで、PyPIとGitHubで利用可能です。インストールして、コマンドを実行し、数分であなたのアプリを新しい言語で確認しましょう。