ब्लॉग पर वापस जाएं

Django i18n: .po फ़ाइल अनुवाद को स्वचालित करने की संपूर्ण मार्गदर्शिका

2026-01-28 10 मिनट पढ़ने का समय
Django i18n: .po फ़ाइल अनुवाद को स्वचालित करने की संपूर्ण मार्गदर्शिका

अगर आपने कभी एक से अधिक भाषा में Django ऐप शिप किया है, तो आप यह प्रक्रिया जानते हैं। आप अपनी स्ट्रिंग्स को gettext() में रैप करते हैं, makemessages चलाते हैं, सैकड़ों एंट्रीज वाली एक .po फ़ाइल खोलते हैं, और लाइन दर लाइन अनुवाद शुरू करते हैं। दो भाषाओं और पचास स्ट्रिंग्स के लिए, यह सहनीय है। छह भाषाओं और पाँच सौ स्ट्रिंग्स के लिए, यह एक पूरा कार्य दिवस है जो कभी वापस नहीं मिलेगा।

यह गाइड Django की अंतर्राष्ट्रीयकरण (i18n) पाइपलाइन को शुरू से अंत तक कवर करती है, बताती है कि यह कहाँ विफल होती है, और दिखाती है कि AI-संचालित अनुवाद के साथ दर्दनाक हिस्से को कैसे स्वचालित किया जाए।

मानक Django i18n वर्कफ़्लो

Django का बिल्ट-इन i18n सिस्टम अच्छी तरह डिज़ाइन किया गया है। कोर लूप इस प्रकार दिखता है:

चरण 1: अपने Python कोड और टेम्पलेट्स में अनुवाद के लिए स्ट्रिंग्स चिह्नित करें:

from django.utils.translation import gettext as _

def dashboard(request):
    welcome = _("Welcome back, %(name)s!") % {"name": request.user.first_name}
    return render(request, "dashboard.html", {"welcome": welcome})
{% load i18n %}
<h1>{% trans "Account Settings" %}</h1>
<p>{% blocktrans %}You have {{ count }} unread messages.{% endblocktrans %}</p>

चरण 2: स्ट्रिंग्स को .po फ़ाइलों में निकालें:

python manage.py makemessages -l de -l fr -l nl

यह आपके पूरे कोडबेस को स्कैन करता है और प्रति भाषा एक .po फ़ाइल जनरेट करता है, जिसमें हर अनुवाद योग्य स्ट्रिंग होती है:

#: myapp/views.py:4
msgid "Welcome back, %(name)s!"
msgstr ""

#: templates/dashboard.html:2
msgid "Account Settings"
msgstr ""

चरण 3: हर खाली msgstr का हाथ से अनुवाद करें।

चरण 4: तैयार .po फ़ाइलों को बाइनरी .mo फ़ाइलों में कंपाइल करें:

python manage.py compilemessages

चरण 1, 2, और 4 तेज़ हैं। चरण 3 वह जगह है जहाँ प्रक्रिया टूट जाती है।

मैनुअल अनुवाद स्केल क्यों नहीं करता

एक सामान्य Django एप्लिकेशन में लगभग 200 से 2,000 अनुवाद योग्य स्ट्रिंग्स होती हैं। इसे लक्ष्य भाषाओं की संख्या से गुणा करें, और आप एक गंभीर समय प्रतिबद्धता देख रहे हैं।

यह कोई सैद्धांतिक शिकायत नहीं है। एक प्रसिद्ध Django Forum थ्रेड में, एक डेवलपर ने बताया कि प्रति .po फ़ाइल मैनुअल अनुवाद में 8+ घंटे लगे। एक Django कोर कॉन्ट्रीब्यूटर ने बताया कि एक सिंगल रिलीज़ में कम्युनिटी द्वारा सबमिट किए गए अनुवादों को शामिल करने में 10 घंटे से अधिक लगे, मुख्य रूप से समीक्षा, फ़ॉर्मेटिंग सुधार, और टूटे हुए प्लेसहोल्डर्स को ठीक करने में।

समस्याएं समय के साथ बढ़ती जाती हैं:

मूल कारण यह है कि अनुवाद को एक बार की घटना के रूप में माना जाता है, न कि एक वृद्धिशील, दोहराने योग्य प्रक्रिया के रूप में।

AI के साथ अनुवाद को स्वचालित करना

विचार सीधा है: मानव द्वारा प्रत्येक .po फ़ाइल खोलने और msgstr मान भरने के बजाय, एक टूल फ़ाइल पढ़ता है, अनअनुवादित स्ट्रिंग्स को AI मॉडल या अनुवाद API को भेजता है, परिणाम वापस लिखता है, और बाकी सब कुछ (टिप्पणियाँ, फ़ाइल संरचना, प्लेसहोल्डर्स, बहुवचन रूप) सुरक्षित रखता है।

TranslateBot Django एक ओपन-सोर्स पैकेज है जो बिल्कुल यही करता है। यह Django के मैनेजमेंट कमांड सिस्टम में प्लग होता है, इसलिए यह आपके मौजूदा वर्कफ़्लो में फिट बैठता है।

चरण-दर-चरण सेटअप

1. पैकेज इंस्टॉल करें

pip install translatebot-django

या, अगर आप uv (अनुशंसित) का उपयोग करते हैं:

uv add --dev translatebot-django

इसे डेव डिपेंडेंसी के रूप में इंस्टॉल करना जानबूझकर है। आपको TranslateBot की ज़रूरत केवल अनुवाद जनरेट करते समय होती है, प्रोडक्शन में रनटाइम पर नहीं।

2. INSTALLED_APPS में जोड़ें

# settings.py
INSTALLED_APPS = [
    # ...
    "translatebot_django",
]

3. अपना AI प्रदाता कॉन्फ़िगर करें

# settings.py
import os

TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini"

TranslateBot अंदरूनी तौर पर LiteLLM का उपयोग करता है, जिसका मतलब है कि आप एक स्ट्रिंग बदलकर 100+ मॉडल्स में से किसी भी एक पर स्विच कर सकते हैं:

प्रदाता TRANSLATEBOT_MODEL मान
OpenAI gpt-4o-mini, gpt-4o
Anthropic claude-sonnet-4-5-20250929
Google gemini/gemini-2.5-flash
Azure OpenAI azure/gpt-4o-mini
DeepL इसके बजाय TRANSLATEBOT_PROVIDER = "deepl" का उपयोग करें

DeepL के लिए, एक्स्ट्रा इंस्टॉल करें: pip install translatebot-django[deepl]। DeepL का फ्री टियर आपको प्रति माह 500,000 कैरेक्टर बिना किसी लागत के देता है, जो अधिकांश छोटे-से-मध्यम प्रोजेक्ट्स के लिए पर्याप्त है।

4. अपनी भाषाएँ परिभाषित करें

# settings.py
LANGUAGES = [
    ("en", "English"),
    ("de", "German"),
    ("fr", "French"),
    ("nl", "Dutch"),
    ("ja", "Japanese"),
]

5. अनुवाद चलाएँ

python manage.py translate

बस इतना ही। TranslateBot आपके प्रोजेक्ट में .po फ़ाइलों को स्कैन करता है, अनअनुवादित एंट्रीज की पहचान करता है, उन्हें ऑप्टिमाइज़्ड बैचों में कॉन्फ़िगर किए गए AI मॉडल को भेजता है, और परिणाम वापस लिखता है। मौजूदा अनुवाद अछूते रहते हैं।

एकल भाषा का अनुवाद करने के लिए:

python manage.py translate --target-lang nl

आउटपुट इस प्रकार दिखता है:

Translating to Dutch (nl)...
Found 42 strings to translate
Translating batch 1/2...
Translating batch 2/2...
Successfully translated 42 strings

6. हमेशा की तरह कंपाइल करें

python manage.py compilemessages

आपका पूरा वर्कफ़्लो अब यह है:

python manage.py makemessages -l de -l fr -l nl -l ja
python manage.py translate
python manage.py compilemessages

तीन कमांड। हर भाषा। हर स्प्रिंट।

डिज़ाइन से वृद्धिशील

दोहराने योग्य वर्कफ़्लो के लिए सबसे महत्वपूर्ण सुविधा वृद्धिशील अनुवाद है। TranslateBot केवल उन एंट्रीज का अनुवाद करता है जहाँ msgstr खाली है। अगर आपके पास 500 स्ट्रिंग्स हैं और इस स्प्रिंट में 15 नई हैं, तो केवल वे 15 API को भेजी जाती हैं।

यह व्यावहारिक कारणों से मायने रखता है:

  1. लागत। आप केवल नई स्ट्रिंग्स के लिए भुगतान करते हैं, पूरी फ़ाइल के लिए नहीं।
  2. गति। 15 स्ट्रिंग्स का अनुवाद सेकंड में होता है, मिनटों में नहीं।
  3. स्थिरता। जिन अनुवादों की आपने पहले से समीक्षा और स्वीकृति दी है, वे कभी ओवरराइट नहीं होते (जब तक आप स्पष्ट रूप से --overwrite पास नहीं करते)।

प्लेसहोल्डर सुरक्षा

Django कई प्लेसहोल्डर फ़ॉर्मेट्स का उपयोग करता है: %(name)s, %s, %d, {0}, {name}, और इनलाइन HTML टैग्स जैसे <strong> या <a href="...">। अगर इनमें से कोई भी अनुवाद में बिगड़ जाता है, तो आपको रनटाइम एरर या टूटा हुआ मार्कअप मिलता है।

TranslateBot AI मॉडल को सभी प्लेसहोल्डर फ़ॉर्मेट्स को संरक्षित रखने का निर्देश देता है और आउटपुट को मान्य करता है। इस तरह की स्ट्रिंग:

Welcome to %(site_name)s! You have <strong>%(count)d</strong> new messages.

डच में इस प्रकार अनुवादित होती है:

Welkom bij %(site_name)s! Je hebt <strong>%(count)d</strong> nieuwe berichten.

हर प्लेसहोल्डर बरकरार रहता है।

TRANSLATING.md के साथ गुणवत्ता नियंत्रण

AI मॉडल संदर्भ समझने पर बेहतर अनुवाद करते हैं। TranslateBot आपके प्रोजेक्ट रूट में TRANSLATING.md फ़ाइल खोजता है और इसकी सामग्री को हर अनुवाद अनुरोध में शामिल करता है।

# Translation Context

## About This Project
A B2B project management tool for construction companies.

## Terminology
- "project" means a construction project, not a software project
- "plan" means a building plan/blueprint, not a subscription plan
- Keep "Gantt chart" as-is in all languages

## Tone
- German: use formal "Sie" form (business context)
- French: use formal "vous" form
- Dutch: use informal "je" form

## Do Not Translate
- Brand name: "BuildFlow"
- Feature names: "SmartSchedule", "CostTracker"

यह फ़ाइल आपके कोड के साथ वर्शन-कंट्रोल्ड है, इसलिए आपकी पूरी टीम एक ही अनुवाद संदर्भ साझा करती है। आप विशेष शब्दावली वाले ऐप्स के लिए प्रति-ऐप TRANSLATING.md फ़ाइलें भी रख सकते हैं। एक मेडिकल रिकॉर्ड्स मॉड्यूल और एक बिलिंग मॉड्यूल की अपनी-अपनी शब्दावली हो सकती है।

कमिट करने से पहले प्रीव्यू

--dry-run फ़्लैग बिना कोई API कॉल किए या फ़ाइलें संशोधित किए, ठीक-ठीक दिखाता है कि क्या अनुवादित किया जाएगा:

python manage.py translate --target-lang fr --dry-run
Found 15 untranslated entries
Dry run mode: skipping LLM translation

Would translate 'Welcome to our site'
Would translate 'Hello, %(name)s!'
...

Dry run complete: 15 entries would be translated

यह बड़े अनुवाद रन से पहले या जब कोई नया टीम सदस्य API लागत वहन करने से पहले कमांड को समझना चाहता है, तब उपयोगी है।

CI/CD इंटीग्रेशन

बिना प्रवर्तन के अनुवादों का पुराना होना अपरिहार्य है। TranslateBot में CI पाइपलाइन के लिए डिज़ाइन किया गया 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

--makemessages फ़्लैग पहले makemessages -a --no-obsolete चलाता है, यह सुनिश्चित करता है कि जाँच से पहले .po फ़ाइलें वर्तमान सोर्स कोड को दर्शाती हैं। अगर कोई एंट्री अनअनुवादित या फ़ज़ी है, तो कमांड एग्ज़िट कोड 1 के साथ बाहर निकलता है और बिल्ड विफल करता है:

locale/de/LC_MESSAGES/django.po: 2 untranslated, 0 fuzzy
locale/nl/LC_MESSAGES/django.po: 0 untranslated, 1 fuzzy
CommandError: Translation check failed

सामान्य डेवलपर वर्कफ़्लो यह बन जाता है:

  1. फ़ीचर ब्रांच में नई अनुवाद योग्य स्ट्रिंग्स जोड़ें।
  2. CI विफल होता है क्योंकि वे स्ट्रिंग्स अनअनुवादित हैं।
  3. लोकली python manage.py translate चलाएँ।
  4. अपडेटेड .po फ़ाइलें कमिट करें।
  5. CI पास होता है।

अनुवाद कभी चुपचाप सिंक से बाहर नहीं होते।

डेटाबेस कंटेंट का अनुवाद

अगर आपका एप्लिकेशन डेटाबेस में अनुवाद योग्य कंटेंट स्टोर करता है (प्रोडक्ट नाम, ब्लॉग पोस्ट टाइटल, कैटेगरी लेबल), TranslateBot django-modeltranslation के साथ भी इंटीग्रेट होता है:

pip install translatebot-django[modeltranslation]
# Translate all registered model fields
python manage.py translate --target-lang de --models

# Translate specific models only
python manage.py translate --target-lang de --models Product Category

वही वृद्धिशील लॉजिक लागू होता है: केवल वे फ़ील्ड अनुवादित होते हैं जहाँ लक्ष्य भाषा का मान खाली है।

लागत तुलना

सबसे आम सवालों में से एक यह है कि क्या AI अनुवाद विकल्पों की तुलना में लागत-प्रभावी है। 500 अनुवाद योग्य स्ट्रिंग्स और 5 भाषाओं वाले प्रोजेक्ट के लिए एक अनुमानित तुलना:

दृष्टिकोण अनुमानित लागत समय निवेश
मैनुअल (डेवलपर समय) $0 प्रत्यक्ष लागत, 20-40+ घंटे बहुत अधिक
पेशेवर अनुवाद सेवा $500-2,000+ कम (लेकिन धीमा टर्नअराउंड)
SaaS लोकलाइज़ेशन प्लेटफ़ॉर्म $50-200/माह मध्यम
TranslateBot + GPT-4o-mini ~$0.05 (एक बार) मिनट
TranslateBot + DeepL Free $0 (प्रति माह 500k कैरेक्टर तक) मिनट
TranslateBot + Claude/GPT-4o ~$0.30 (एक बार) मिनट

संख्याएँ स्ट्रिंग काउंट और लक्ष्य भाषाओं के अनुसार बदलती हैं, लेकिन परिमाण के क्रम का अंतर सुसंगत है। चल रहे रखरखाव के लिए (हर स्प्रिंट में जोड़ी गई 20-50 नई स्ट्रिंग्स का अनुवाद), AI लागत अनिवार्य रूप से शून्य है।

सर्वोत्तम प्रथाएँ

--dry-run से शुरू करें। अपने पहले वास्तविक अनुवाद रन से पहले, प्रीव्यू करें कि क्या होगा। यह विश्वास बनाता है और कॉन्फ़िगरेशन समस्याओं को जल्दी पकड़ता है।

अनुवाद से पहले .po फ़ाइलें कमिट करें। अगर कुछ गलत होता है, तो git checkout आपको तुरंत साफ़ स्थिति में वापस ले आता है।

पहले दिन से TRANSLATING.md लिखें। एक संक्षिप्त फ़ाइल भी, जिसमें आपका प्रोजेक्ट विवरण और कुछ शब्दावली नियम हों, अनुवाद गुणवत्ता को मापनीय रूप से बेहतर बनाती है।

CI में check_translations जोड़ें। यह एकल कदम सबसे आम i18n विफलता मोड को रोकता है: वे स्ट्रिंग्स जो अनुवाद के लिए चिह्नित थीं लेकिन वास्तव में कभी अनुवादित नहीं हुईं।

लागत दक्षता के लिए gpt-4o-mini या DeepL का उपयोग करें। GPT-4o या Claude जैसे प्रीमियम मॉडल उन प्रोजेक्ट्स के लिए बचाकर रखें जहाँ सटीकता मायने रखती है, जैसे मार्केटिंग कॉपी, कानूनी टेक्स्ट, या डोमेन-विशिष्ट शब्दावली।

महत्वपूर्ण स्ट्रिंग्स की समीक्षा करें। AI अनुवाद अधिकांश UI टेक्स्ट के लिए पर्याप्त अच्छे हैं, लेकिन किसी भी कानूनी रूप से बाध्यकारी, सुरक्षा-महत्वपूर्ण, या उच्च-जोखिम संदर्भ में ग्राहक-सामना करने वाली सामग्री की एक मूल भाषी द्वारा समीक्षा करवाएँ।

घंटों से सेकंड तक

Django का i18n फ़्रेमवर्क अनुवादों को निकालने और कंपाइल करने में उत्कृष्ट है। अंतर हमेशा अनुवाद चरण में ही रहा है — कई भाषाओं में सैकड़ों msgstr मान भरने का थकाऊ, त्रुटि-प्रवण काम।

TranslateBot उस अंतर को भरता है। इसे इंस्टॉल करें, एक AI प्रदाता की ओर इंगित करें, और एक कमांड चलाएँ। नई स्ट्रिंग्स अनुवादित हो जाती हैं। मौजूदा स्ट्रिंग्स अछूती रहती हैं। प्लेसहोल्डर्स बरकरार रहते हैं। CI किसी भी चूक को पकड़ता है।

आपकी .po फ़ाइलें एक बोझ नहीं रहतीं और बिल्ड का एक सामान्य हिस्सा बन जाती हैं।

pip install translatebot-django

translatebot.dev पर शुरू करें।

.po फ़ाइलें मैन्युअल रूप से संपादित करना बंद करें

TranslateBot AI के साथ Django अनुवाद को स्वचालित करता है। एक कमांड, सभी भाषाएं, प्रति अनुवाद बेहद कम लागत।