यदि आपने Django के अंतर्निहित अंतर्राष्ट्रीयकरण (i18n) फ्रेमवर्क के साथ काम किया है, तो आप जानते हैं कि यह स्थैतिक स्ट्रिंग्स को अच्छी तरह से संभालता है। टेक्स्ट को gettext() में लपेटना या {% trans %} टेम्पलेट टैग का उपयोग करना स्ट्रिंग्स को .po फ़ाइलों में निकालता है, जिन्हें अनुवादक भरते हैं। यह सिस्टम युद्ध-परीक्षित है और कोड और टेम्पलेट्स के लिए बहुत अच्छा काम करता है।
लेकिन आपके डेटाबेस में संग्रहीत सामग्री का क्या?
उत्पाद नाम, लेख शीर्षक, श्रेणी विवरण, FAQ उत्तर, उपयोगकर्ता-जनित सामग्री। इनमें से कुछ भी आपके सोर्स कोड में नहीं रहता। Django का makemessages कमांड इन्हें कभी नहीं खोज पाएगा, और .po फ़ाइलें यहाँ आपकी मदद नहीं कर सकतीं। यदि आपका एप्लिकेशन कई भाषाओं में उपयोगकर्ताओं को डायनामिक सामग्री प्रदान करता है, तो आपको एक अलग रणनीति की आवश्यकता है।
इसे कैसे करें: अपने मॉडल्स में अनुवाद योग्य फ़ील्ड जोड़ने के लिए django-modeltranslation का उपयोग करें, फिर TranslateBot का उपयोग करके AI से अनुवाद स्वचालित करें।
Django डेटाबेस अनुवाद पैकेज
कई थर्ड-पार्टी पैकेज डेटाबेस अनुवाद समस्या को हल करते हैं, प्रत्येक की अलग-अलग वास्तुकला होती है।
django-modeltranslation
आपकी मौजूदा तालिकाओं में सीधे भाषा-विशिष्ट कॉलम जोड़ता है। एक title फ़ील्ड title_en, title_de, title_fr आदि बन जाता है। क्वेरी तेज़ रहती हैं क्योंकि सब कुछ एक ही तालिका में होता है। एडमिन इंटरफ़ेस सभी भाषाओं को एक साथ दिखाता है।
- फ़ायदे: कोई JOIN नहीं, तेज़ क्वेरी, फ़ील्ड डिस्क्रिप्टर के माध्यम से पारदर्शी पहुँच, परिपक्व इकोसिस्टम
- नुकसान: हर नई भाषा के लिए स्कीमा बदलाव, चौड़ी तालिकाएँ
django-parler
प्रत्येक मॉडल के लिए एक अलग अनुवाद तालिका बनाता है। मूल तालिका साफ़ रहती है, और अनुवाद फ़ॉरेन की के माध्यम से जुड़ी संबंधित तालिका में संग्रहीत होते हैं।
- फ़ायदे: साफ़ स्कीमा, माइग्रेशन के बिना भाषाएँ जोड़ना आसान
- नुकसान: अनुवादित सामग्री के लिए JOIN की आवश्यकता, थोड़ा अधिक जटिल क्वेरी पैटर्न
django-translations
किसी भी मॉडल की ओर इशारा करने वाली जेनेरिक फ़ॉरेन की के साथ एक एकल अनुवाद तालिका का उपयोग करता है। सभी मॉडलों के सभी अनुवाद एक तालिका में जाते हैं।
- फ़ायदे: न्यूनतम स्कीमा बदलाव, किसी भी मॉडल के साथ काम करता है
- नुकसान: जेनेरिक फ़ॉरेन की क्वेरी धीमी हो सकती हैं, कम पारदर्शी API
मैनुअल JSON फ़ील्ड
आप अनुवादों को JSONField में संग्रहीत कर सकते हैं:
class Product(models.Model):
name_translations = models.JSONField(default=dict)
# {"en": "Running Shoes", "de": "Laufschuhe", "fr": "Chaussures de course"}
- फ़ायदे: कोई अतिरिक्त डिपेंडेंसी नहीं, लचीला
- नुकसान: कोई ORM इंटीग्रेशन नहीं, कोई एडमिन सपोर्ट नहीं, सब कुछ मैनुअल
आपको कौन सा उपयोग करना चाहिए?
अधिकांश प्रोजेक्ट्स के लिए, django-modeltranslation सबसे अच्छा विकल्प है। यह सबसे परिपक्व पैकेज है, इसमें सबसे अच्छा Django एडमिन इंटीग्रेशन है, और तेज़ क्वेरी के लिए सभी डेटा एक ही तालिका में रखता है। इसका ट्रेडऑफ़ (चौड़ी तालिकाएँ और हर नई भाषा के लिए एक माइग्रेशन) अधिकांश एप्लिकेशन के लिए प्रबंधनीय है। इस गाइड का शेष भाग django-modeltranslation का उपयोग करता है।
django-modeltranslation को चरण दर चरण सेटअप करना
चरण 1: पैकेज इंस्टॉल करें
TranslateBot django-modeltranslation को एक वैकल्पिक डिपेंडेंसी के रूप में बंडल करता है। दोनों को एक साथ इंस्टॉल करें:
pip install translatebot-django[modeltranslation]
या यदि आप uv उपयोग करते हैं:
uv add --dev translatebot-django[modeltranslation]
चरण 2: Django सेटिंग्स कॉन्फ़िगर करें
settings.py में दो चीज़ें महत्वपूर्ण हैं: ऐप का क्रम और भाषा सूची।
# settings.py
INSTALLED_APPS = [
'modeltranslation', # Must be BEFORE django.contrib.admin
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Your apps
'shop',
'translatebot_django',
]
LANGUAGE_CODE = 'en'
LANGUAGES = [
('en', 'English'),
('de', 'German'),
('fr', 'French'),
('nl', 'Dutch'),
]
modeltranslation ऐप को django.contrib.admin से पहले आना चाहिए ताकि यह अनुवाद फ़ील्ड दिखाने के लिए एडमिन क्लासेज़ को पैच कर सके।
चरण 3: अनुवाद के लिए मॉडल रजिस्टर करें
प्रत्येक ऐप में जिसमें अनुवाद योग्य मॉडल हैं, एक translation.py फ़ाइल बनाएँ। एक ई-कॉमर्स शॉप ऐप के लिए:
# shop/translation.py
from modeltranslation.translator import register, TranslationOptions
from .models import Product, Category
@register(Product)
class ProductTranslationOptions(TranslationOptions):
fields = ('name', 'description', 'short_description')
@register(Category)
class CategoryTranslationOptions(TranslationOptions):
fields = ('name', 'description')
केवल उन फ़ील्ड्स को शामिल करें जिनमें मानव-पठनीय टेक्स्ट है। slug, price, या sku जैसे फ़ील्ड्स को रजिस्टर न करें।
चरण 4: माइग्रेशन बनाएँ और चलाएँ
python manage.py makemigrations
python manage.py migrate
इसके बाद, आपकी shop_product तालिका में नए कॉलम होंगे:
| कॉलम | प्रकार |
|---|---|
name |
varchar(200) |
name_en |
varchar(200) |
name_de |
varchar(200) |
name_fr |
varchar(200) |
name_nl |
varchar(200) |
description |
text |
description_en |
text |
description_de |
text |
description_fr |
text |
description_nl |
text |
short_description |
text |
short_description_en |
text |
short_description_de |
text |
short_description_fr |
text |
short_description_nl |
text |
आपने LANGUAGES में जो भी भाषा परिभाषित की है, उसे प्रत्येक रजिस्टर्ड फ़ील्ड के लिए अपना कॉलम मिलता है।
समस्या: खाली अनुवाद फ़ील्ड
अब आपके पास स्कीमा तैयार है, लेकिन हर _de, _fr, और _nl कॉलम खाली है। यदि आपके पास 3 अनुवाद योग्य फ़ील्ड और 3 लक्ष्य भाषाओं वाले 500 उत्पाद हैं, तो यह 4,500 खाली फ़ील्ड हैं जो भरे जाने की प्रतीक्षा कर रहे हैं।
उस सामग्री का मैन्युअल रूप से अनुवाद करना यथार्थवादी नहीं है। पेशेवर अनुवाद सेवा के साथ भी, आपको डेटा निर्यात करना होगा, इसे भेजना होगा, डिलीवरी की प्रतीक्षा करनी होगी, और परिणामों को वापस आयात करना होगा। एक छोटी टीम या अकेले डेवलपर के लिए, इसका आमतौर पर मतलब यह होता है कि यह फ़ीचर कभी लॉन्च नहीं होता।
यहीं TranslateBot काम आता है।
TranslateBot के साथ अनुवाद स्वचालित करना
TranslateBot का translate मैनेजमेंट कमांड AI का उपयोग करके उन सभी खाली फ़ील्ड्स को भर सकता है। पहले अपनी API कुंजी कॉन्फ़िगर करें:
# settings.py
TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini" # Fast and cost-effective
फिर सभी रजिस्टर्ड मॉडलों को लक्ष्य भाषा में अनुवाद करें:
python manage.py translate --target-lang de --models
वह एकल कमांड django-modeltranslation के साथ रजिस्टर्ड हर मॉडल को खोजता है, लक्ष्य भाषा के लिए खाली फ़ील्ड्स की पहचान करता है, और उन्हें AI-जनित अनुवादों से भरता है।
विशिष्ट मॉडल अनुवाद करें
यदि आप केवल उत्पादों का अनुवाद करना चाहते हैं, श्रेणियों का नहीं:
python manage.py translate --target-lang de --models Product
या कई विशिष्ट मॉडल:
python manage.py translate --target-lang de --models Product Category
ड्राई रन के साथ पूर्वावलोकन करें
डेटाबेस में लिखने से पहले हमेशा पूर्वावलोकन करें:
python manage.py translate --target-lang de --models --dry-run
यह आपको बिल्कुल दिखाता है कि क्या अनुवाद किया जाएगा बिना किसी रिकॉर्ड को संशोधित किए।
मौजूदा सामग्री को पुनः अनुवाद करें
डिफ़ॉल्ट रूप से, TranslateBot उन फ़ील्ड्स को छोड़ देता है जिनमें पहले से अनुवाद है। मौजूदा अनुवादों को ओवरराइट करने के लिए (उदाहरण के लिए, AI मॉडल में सुधार या संदर्भ जोड़ने के बाद):
python manage.py translate --target-lang de --models --overwrite
एक बार में सभी भाषाओं का अनुवाद करें
यदि आप --target-lang छोड़ देते हैं और आपकी सेटिंग्स में LANGUAGES परिभाषित है, तो TranslateBot सभी कॉन्फ़िगर की गई भाषाओं में अनुवाद करता है:
python manage.py translate --models
अनुवाद पाइपलाइन कैसे काम करती है
जब आप अनुवाद कमांड चलाते हैं तो यह होता है।
-
खोज। TranslateBot django-modeltranslation की रजिस्ट्री से क्वेरी करके सभी रजिस्टर्ड मॉडल और उनके अनुवाद योग्य फ़ील्ड खोजता है।
-
स्रोत पहचान। प्रत्येक रिकॉर्ड के लिए, यह स्रोत सामग्री पढ़ता है। यह पहले बेस फ़ील्ड (जैसे,
name) की जाँच करता है, फिर पहले भरे हुए भाषा-विशिष्ट फ़ील्ड (जैसे,name_en) पर वापस आता है। बिना स्रोत सामग्री वाले रिकॉर्ड छोड़ दिए जाते हैं। -
बैचिंग। रिकॉर्ड्स को बैचों में समूहित किया जाता है और AI प्रदाता को भेजा जाता है। यह API कॉल को कुशल रखता है और रेट लिमिट से टकराने से बचाता है।
-
अनुवाद। प्रत्येक बैच को कॉन्फ़िगर किए गए AI मॉडल का उपयोग करके अनुवाद किया जाता है। आप LiteLLM द्वारा समर्थित किसी भी LLM प्रदाता (OpenAI, Anthropic, Google, Azure, और कई अन्य) या DeepL का उपयोग कर सकते हैं।
-
एटॉमिक राइट्स। एक अनुवाद रन के सभी डेटाबेस अपडेट एक ही ट्रांज़ैक्शन में लपेटे जाते हैं। यदि कुछ भी गलत होता है, जैसे API त्रुटि या डेटाबेस बाधा उल्लंघन, तो कोई आंशिक डेटा सहेजा नहीं जाता। सब कुछ या कुछ भी नहीं।
पूर्ण कार्यप्रवाह उदाहरण
यहाँ मॉडल परिभाषा से अनुवादित सामग्री तक का पूर्ण उदाहरण है, ई-कॉमर्स Product मॉडल का उपयोग करते हुए।
मॉडल परिभाषित करें
# shop/models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
short_description = models.CharField(max_length=500, blank=True)
price = models.DecimalField(max_digits=10, decimal_places=2)
sku = models.CharField(max_length=50, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
अनुवाद के लिए रजिस्टर करें
# shop/translation.py
from modeltranslation.translator import register, TranslationOptions
from .models import Product
@register(Product)
class ProductTranslationOptions(TranslationOptions):
fields = ('name', 'description', 'short_description')
माइग्रेशन चलाएँ
python manage.py makemigrations shop
python manage.py migrate
अनुवाद संदर्भ जोड़ें (वैकल्पिक)
अपने प्रोजेक्ट रूट में एक TRANSLATING.md फ़ाइल बनाएँ ताकि AI को आपके उत्पाद डोमेन के बारे में संदर्भ मिले:
# Translation Context
## About This Project
E-commerce store for outdoor sports equipment.
## Terminology
- "trail runners" refers to trail running shoes, not people
- Keep brand names (Nike, Salomon, Arc'teryx) untranslated
- "Gore-Tex" is a brand name, do not translate
## Tone
- Use informal "du" form in German
- Product descriptions should sound enthusiastic but not exaggerated
अनुवाद करें
# Preview first
python manage.py translate --target-lang de --models Product --dry-run
# Apply translations
python manage.py translate --target-lang de --models Product
आउटपुट:
Translating Product model fields to German (de)...
Found 142 products with untranslated fields
Translating batch 1/15...
Translating batch 2/15...
...
Translating batch 15/15...
Successfully translated 142 products
एडमिन में सत्यापित करें
Django एडमिन खोलें और किसी भी उत्पाद पर जाएँ। आपको अनुवाद फ़ील्ड भरे हुए दिखाई देंगे:
- Name [de]: Ultraleichte Trail-Laufschuhe
- Description [de]: Diese leichten Trail-Laufschuhe bieten hervorragenden Grip...
- Short description [de]: Leicht, schnell und griffig auf jedem Untergrund.
प्रत्येक लक्ष्य भाषा के लिए दोहराएँ:
python manage.py translate --target-lang fr --models Product
python manage.py translate --target-lang nl --models Product
या एक बार में सभी भाषाओं का अनुवाद करें:
python manage.py translate --models Product
सर्वोत्तम प्रथाएँ
प्रोडक्शन पर बल्क अनुवाद चलाने से पहले अपने डेटाबेस का बैकअप लें। TranslateBot एटॉमिक ट्रांज़ैक्शन का उपयोग करता है, इसलिए एक विफल रन आंशिक डेटा नहीं छोड़ेगा। लेकिन बैकअप आपको अनुवाद गुणवत्ता अपेक्षा अनुसार न होने पर वापस लौटने का तरीका देता है।
# PostgreSQL example
pg_dump mydb > backup_before_translation.sql
पहले ड्राई रन का उपयोग करें। एक नए मॉडल या भाषा पर अनुवाद लागू करने से पहले हमेशा --dry-run के साथ चलाएँ। आउटपुट की समीक्षा करें ताकि सुनिश्चित हो सके कि स्रोत सामग्री सही ढंग से पहचानी गई है और अनुवाद उचित लगते हैं।
बड़े डेटाबेस के लिए एक बार में एक मॉडल का अनुवाद करें। इससे परिणामों की समीक्षा करना आसान होता है और आवश्यकता पड़ने पर विशिष्ट मॉडलों को फिर से चलाना।
python manage.py translate --target-lang de --models Product
python manage.py translate --target-lang de --models Category
python manage.py translate --target-lang de --models Article
अनुवाद संदर्भ जोड़ें। डोमेन-विशिष्ट शब्दावली और टोन दिशानिर्देशों वाली TRANSLATING.md फ़ाइल अनुवाद गुणवत्ता में महत्वपूर्ण सुधार करती है। यह चिकित्सा, कानून, या तकनीकी उत्पादों जैसे विशेष क्षेत्रों के लिए विशेष रूप से महत्वपूर्ण है।
अपनी स्रोत भाषा भरी रखें। TranslateBot बेस फ़ील्ड या स्रोत भाषा फ़ील्ड से पढ़ता है। सुनिश्चित करें कि आपका डेटा प्रविष्टि कार्यप्रवाह हमेशा स्रोत भाषा भरता है। खाली स्रोत फ़ील्ड का मतलब खाली अनुवाद है।
पूर्ण कवरेज के लिए PO फ़ाइल अनुवाद के साथ संयोजित करें। अपने कोड स्ट्रिंग्स और डेटाबेस सामग्री दोनों का अनुवाद करें:
# Static strings in code and templates
python manage.py makemessages -l de -l fr -l nl
python manage.py translate
python manage.py compilemessages
# Dynamic content in the database
python manage.py translate --models
इस तरह आपके उपयोगकर्ता जो भी स्ट्रिंग देखते हैं, चाहे वह टेम्पलेट से आए या डेटाबेस से, अनुवादित होती है।
अगले कदम
- सभी उपलब्ध विकल्पों के लिए पूर्ण कमांड रेफ़रेंस पढ़ें
- छूटे हुए अनुवादों की स्वचालित जाँच के लिए CI इंटीग्रेशन सेटअप करें
- अपने प्रोजेक्ट के लिए गुणवत्ता और लागत का सर्वोत्तम संतुलन खोजने के लिए समर्थित AI मॉडल एक्सप्लोर करें