আপনি যদি 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 সেটআপ করা
ধাপ ১: প্যাকেজ ইনস্টল করুন
TranslateBot django-modeltranslation-কে একটি ঐচ্ছিক ডিপেন্ডেন্সি হিসেবে বান্ডেল করে। একবারে উভয়ই ইনস্টল করুন:
pip install translatebot-django[modeltranslation]
অথবা আপনি uv ব্যবহার করলে:
uv add --dev translatebot-django[modeltranslation]
ধাপ ২: 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-এর আগে আসতে হবে যাতে এটি অনুবাদ ফিল্ড দেখানোর জন্য অ্যাডমিন ক্লাসগুলো প্যাচ করতে পারে।
ধাপ ৩: অনুবাদের জন্য মডেল নিবন্ধন করুন
অনুবাদযোগ্য মডেল আছে এমন প্রতিটি অ্যাপে একটি 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-র মতো ফিল্ড নিবন্ধন করবেন না।
ধাপ ৪: মাইগ্রেশন তৈরি এবং চালান
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 কলাম খালি। যদি আপনার কাছে ৩টি অনুবাদযোগ্য ফিল্ড এবং ৩টি লক্ষ্য ভাষা সহ ৫০০টি পণ্য থাকে, তাহলে এটি ৪,৫০০টি খালি ফিল্ড যা পূরণ হওয়ার অপেক্ষায়।
সেই কন্টেন্ট ম্যানুয়ালি অনুবাদ করা বাস্তবসম্মত নয়। এমনকি পেশাদার অনুবাদ পরিষেবা দিয়েও, আপনাকে ডেটা এক্সপোর্ট করতে হবে, পাঠাতে হবে, ডেলিভারির জন্য অপেক্ষা করতে হবে, এবং ফলাফল আবার ইমপোর্ট করতে হবে। একটি ছোট দল বা একক ডেভেলপারের জন্য, এর মানে সাধারণত হয় ফিচারটি কখনো শিপ হয় না।
এখানেই 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 মডেল অন্বেষণ করুন