
Django i18n: अंतरराष्ट्रीयकरण और अनुवाद गाइड
settings.py से प्रोडक्शन तक: Django का अनुवाद सिस्टम कॉन्फ़िगर करें, PO फ़ाइलें लिखें, बहुवचन संभालें और AI से अनुवाद स्वचालित करें।
इंस्टॉल करें और स्ट्रिंग निकालें
Django का i18n फ़्रेमवर्क बिल्ट-इन है -- आपको बस इसे चालू करना है। बेहतर locale fallbacks के लिए django-locale-chain इंस्टॉल करें, फिर अपने Python कोड और टेम्पलेट से अनुवाद योग्य स्ट्रिंग को PO फ़ाइलों में निकालने के लिए makemessages का उपयोग करें।
pip install django-locale-chain# Extract all translatable strings from Python and template files
python manage.py makemessages -l de -l ja -l es -l fr
# After translating .po files, compile to .mo (binary)
python manage.py compilemessages
# Project structure after running makemessages:
# locale/
# ├── de/
# │ └── LC_MESSAGES/
# │ ├── django.po <-- translate this
# │ └── django.mo <-- compiled (auto-generated)
# ├── ja/
# │ └── LC_MESSAGES/
# │ ├── django.po
# │ └── django.mo
# └── es/
# └── LC_MESSAGES/
# ├── django.po
# └── django.moसेटिंग्स और Middleware कॉन्फ़िगर करें
settings.py में USE_I18N = True सेट करके, समर्थित LANGUAGES सूची परिभाषित करके और अपने MIDDLEWARE stack में LocaleMiddleware जोड़कर अंतरराष्ट्रीयकरण चालू करें। LocaleMiddleware URL prefix, session, cookies या Accept-Language header से यूज़र की भाषा का पता लगाता है।
# settings.py
from django.utils.translation import gettext_lazy as _
# Default language
LANGUAGE_CODE = 'en'
# Enable i18n
USE_I18N = True
USE_L10N = True
# Languages your site supports
LANGUAGES = [
('en', _('English')),
('de', _('German')),
('ja', _('Japanese')),
('es', _('Spanish')),
('fr', _('French')),
('pt-br', _('Brazilian Portuguese')),
]
# Where Django looks for .po files
LOCALE_PATHS = [
BASE_DIR / 'locale',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware', # <-- enables i18n
'locale_chain.middleware.LocaleChainMiddleware', # <-- smart fallbacks
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]URL अंतरराष्ट्रीयकरण
अपने URLs में सक्रिय language code का prefix अपने-आप जोड़ने के लिए i18n_patterns() का उपयोग करें। इससे हर भाषा को अपना URL namespace (/en/about/, /de/about/) मिलता है, जो SEO के लिए बेहतर है और यूज़र को किसी विशिष्ट भाषा के लिंक साझा करने देता है।
# urls.py
from django.conf.urls.i18n import i18n_patterns
from django.urls import path, include
urlpatterns = [
# Non-localized URLs (API, admin, etc.)
path('api/', include('api.urls')),
]
urlpatterns += i18n_patterns(
# These get prefixed with the language code: /en/about/, /de/about/
path('', include('myapp.urls')),
path('admin/', admin.site.urls),
prefix_default_language=False, # Skip prefix for default language
)अनुवाद के लिए स्ट्रिंग चिह्नित करें
Django दो मुख्य translation functions प्रदान करता है: अनुरोध के समय मूल्यांकित होने वाली स्ट्रिंग के लिए gettext() (जिसका alias _() है) और import के समय मूल्यांकित होने वाली स्ट्रिंग के लिए gettext_lazy()। टेम्पलेट में {% trans %} और {% blocktrans %} tags का उपयोग करें।
Views में (Python कोड)
from django.utils.translation import gettext as _
from django.utils.translation import ngettext
from django.http import HttpResponse
def greeting_view(request):
# Simple translation
welcome = _("Welcome to our site")
# Translation with variables (Python string formatting)
user_greeting = _("Hello, %(name)s!") % {"name": request.user.username}
# Plurals
count = request.user.order_set.count()
order_text = ngettext(
"You have %(count)d order.",
"You have %(count)d orders.",
count,
) % {"count": count}
return HttpResponse(f"{welcome}<br>{user_greeting}<br>{order_text}")टेम्पलेट में
{# Load the i18n template tags #}
{% load i18n %}
{# Simple translation #}
<h1>{% trans "Welcome to our site" %}</h1>
{# Translation with variables #}
{% blocktrans with name=user.username %}
Hello, {{ name }}!
{% endblocktrans %}
{# Plurals in templates #}
{% blocktrans count count=order_count %}
You have {{ count }} order.
{% plural %}
You have {{ count }} orders.
{% endblocktrans %}
{# Mark strings as translatable but don't output them (for attributes, etc.) #}
{% trans "Submit" as submit_label %}
<button type="submit">{{ submit_label }}</button>Models और Forms में
from django.db import models
from django.utils.translation import gettext_lazy as _
class Product(models.Model):
name = models.CharField(_("product name"), max_length=200)
description = models.TextField(_("description"), blank=True)
class Meta:
verbose_name = _("product")
verbose_name_plural = _("products")
def __str__(self):
return self.name
# IMPORTANT: Use gettext_lazy (_) for anything evaluated at import time:
# - Model field labels, verbose_name, help_text
# - Form field labels
# - Class-level attributes
# Use gettext for anything evaluated at request time:
# - View functions, template tagsPO फ़ाइल फ़ॉर्मैट
makemessages चलाने के बाद Django प्रत्येक भाषा के लिए .po (Portable Object) फ़ाइलें जनरेट करता है। इनमें msgid/msgstr जोड़े होते हैं। msgstr values का अनुवाद करें, फिर Django द्वारा रनटाइम पर पढ़ी जाने वाली बाइनरी .mo फ़ाइलें जनरेट करने के लिए compilemessages चलाएँ।
# locale/de/LC_MESSAGES/django.po
msgid "Welcome to our site"
msgstr "Willkommen auf unserer Seite"
msgid "Hello, %(name)s!"
msgstr "Hallo, %(name)s!"
#, python-format
msgid "You have %(count)d order."
msgid_plural "You have %(count)d orders."
msgstr[0] "Sie haben %(count)d Bestellung."
msgstr[1] "Sie haben %(count)d Bestellungen."
msgid "product name"
msgstr "Produktname"
msgid "description"
msgstr "Beschreibung"
msgid "product"
msgstr "Produkt"
msgid "products"
msgstr "Produkte"
msgid "Submit"
msgstr "Absenden"बहुवचन और Variables संभालें
Django बहुवचन के लिए ngettext() का उपयोग करता है, जो GNU gettext के plural rules का पालन करता है। प्रत्येक भाषा यह परिभाषित करती है कि उसमें कितने plural forms हैं और सही form चुनने का formula क्या है। PO फ़ाइलें इसे Plural-Forms header से घोषित करती हैं।
# English: 2 forms (singular, plural)
msgid "%(count)d item"
msgid_plural "%(count)d items"
msgstr[0] "%(count)d item"
msgstr[1] "%(count)d items"
# German: 2 forms (singular, plural)
msgstr[0] "%(count)d Artikel"
msgstr[1] "%(count)d Artikel"
# Russian: 3 forms (one, few, many)
msgstr[0] "%(count)d товар" # 1 item
msgstr[1] "%(count)d товара" # 2-4 items
msgstr[2] "%(count)d товаров" # 5+ items
# Arabic: 6 forms (zero, one, two, few, many, other)
msgstr[0] "لا عناصر" # 0
msgstr[1] "عنصر واحد" # 1
msgstr[2] "عنصران" # 2
msgstr[3] "%(count)d عناصر" # 3-10
msgstr[4] "%(count)d عنصرًا" # 11-99
msgstr[5] "%(count)d عنصر" # 100+
# Japanese: 1 form (no plural distinction)
msgstr[0] "%(count)d個のアイテム"
# In Python code, always use ngettext:
from django.utils.translation import ngettext
msg = ngettext(
"%(count)d item",
"%(count)d items",
count,
) % {"count": count}अनुवाद की गुणवत्ता स्वचालित करें
आम समस्याएँ
gettext() और gettext_lazy() को लेकर भ्रम
compilemessages चलाना भूल जाना
LOCALE_PATHS कॉन्फ़िगर न होना
URLs में i18n_patterns का न होना
django-locale-chain के साथ बेहतर Locale Fallbacks
कोई regional variant उपलब्ध न होने पर Django का translation system सीधे LANGUAGE_CODE पर लौटता है। आपके पास pt-PT अनुवाद होने पर भी pt-BR यूज़र को अंग्रेज़ी दिखाई देती है। django-locale-chain gettext fallback chains इंस्टॉल करके इसे ठीक करता है: आपकी डिफ़ॉल्ट भाषा पर लौटने से पहले pt-BR के लिए पहले pt-PT और फिर pt आज़माया जाता है।
# settings.py -- Smart fallback with django-locale-chain
# pip install django-locale-chain
MIDDLEWARE = [
# ...
'django.middleware.locale.LocaleMiddleware',
'locale_chain.middleware.LocaleChainMiddleware', # after LocaleMiddleware
# ...
]
# That's it! 75 built-in fallback chains are now active:
# pt-BR user → tries pt-PT → tries pt → falls back to LANGUAGE_CODE
# es-MX user → tries es-419 → tries es → falls back to LANGUAGE_CODE
# fr-CA user → tries fr → falls back to LANGUAGE_CODE
# Optional: customize specific chains
LOCALE_FALLBACK_CHAINS = {
"pt-BR": ["pt-PT", "pt"],
"es-MX": ["es-419", "es"],
"fr-CA": ["fr"],
}
# Or configure programmatically in AppConfig.ready():
from locale_chain import configure
class MyAppConfig(AppConfig):
name = "myapp"
def ready(self):
configure(overrides={"zh-Hant-HK": ["zh-Hant-TW", "zh-Hant"]})अनुशंसित प्रोजेक्ट संरचना
myproject/
├── myproject/
│ ├── settings.py # i18n config, MIDDLEWARE, LANGUAGES
│ ├── urls.py # i18n_patterns for URL prefixing
│ └── wsgi.py
├── myapp/
│ ├── models.py # gettext_lazy for field labels
│ ├── views.py # gettext for request-time strings
│ └── templates/
│ └── myapp/
│ └── index.html # {% load i18n %}, {% trans %}, {% blocktrans %}
├── locale/ # Created by makemessages
│ ├── de/
│ │ └── LC_MESSAGES/
│ │ ├── django.po # German translations
│ │ └── django.mo # Compiled binary
│ ├── ja/
│ │ └── LC_MESSAGES/
│ │ ├── django.po
│ │ └── django.mo
│ └── es/
│ └── LC_MESSAGES/
│ ├── django.po
│ └── django.mo
├── manage.py
└── requirements.txtइनका भी अनुवाद करें:
i18n Agent अभी आज़माएँ
अपनी अनुवाद फ़ाइल यहाँ छोड़ें
JSON, YAML, PO, XML, CSV, Markdown, Properties
या ब्राउज़ करने के लिए क्लिक करें
लक्षित भाषाएँ
django-locale-chain के साथ Locale Fallback
जब pt-BR जैसे regional locale में कोई translation key उपलब्ध नहीं होती, तो Django पहले parent locale pt की जाँच करने के बजाय सीधे template language पर पहुँच जाता है।
pip install django-locale-chain# settings.py
LOCALE_CHAINS = {
'pt-BR': ['pt', 'es', 'en'],
'zh-Hant-HK': ['zh-Hant', 'zh', 'en'],
}
MIDDLEWARE = [
...
'django_locale_chain.middleware.LocaleChainMiddleware',
...
]समर्थित frameworks और 75 बिल्ट-इन chains की पूरी सूची के लिए हमारी Locale Fallback Guide देखें। Learn more →