আপনি যদি কখনো একাধিক ভাষায় একটি 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 ঘণ্টারও বেশি সময় লেগেছে, বেশিরভাগই রিভিউ, ফরম্যাটিং সংশোধন এবং ভাঙা প্লেসহোল্ডার ঠিক করতে।
সময়ের সাথে সাথে সমস্যাগুলো জটিল হয়:
- প্লেসহোল্ডার ভেঙে যায়।
Welcome, %(name)s!-এর মতো একটি স্ট্রিং Google Translate-এ কপি করুন, এবং আপনি প্রায়ইWillkommen, %(Name)s!বাBienvenue, %(nom)s!ফিরে পাবেন। এই সূক্ষ্ম বিকৃতি রানটাইম ক্র্যাশ ঘটায়। - সঙ্গতি বিচ্যুত হয়। গ্লসারি ছাড়া, "dashboard" একটি ফাইলে "Instrumententafel" এবং অন্যটিতে "Dashboard" হিসেবে অনুবাদ হয়। তিন মাস পরে, কেউ মনে করতে পারে না কোনটি ইচ্ছাকৃত ছিল।
- স্প্রিন্ট স্ট্রিং যোগ করে। প্রতিটি ফিচার ব্রাঞ্চ নতুন অনুবাদযোগ্য স্ট্রিং যোগ করে। গত ত্রৈমাসিকে আপনি পূর্ণ অনুবাদের জন্য অর্থ দিলেও, এখন আপনার
.poফাইলগুলোতে 40টি অনুবাদহীন এন্ট্রি ছড়িয়ে আছে। - AI সহকারী একবার সাহায্য করে। আপনি ChatGPT বা Claude-এ একটি
.poফাইল পেস্ট করে ভালো ফলাফল পেতে পারেন। কিন্তু পরের স্প্রিন্টে, যখন 15টি নতুন স্ট্রিং আসে, আপনি শুরু থেকে প্রম্পট করছেন, পুরো ফাইল আবার অনুবাদ করছেন, এবং আশা করছেন যে আগে থেকে যা ছিল তার সাথে সামঞ্জস্যপূর্ণ থাকবে।
মূল কারণ হলো অনুবাদকে একবারের ঘটনা হিসেবে দেখা হয়, একটি ক্রমবর্ধমান, পুনরাবৃত্তিযোগ্য প্রক্রিয়া হিসেবে নয়।
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 |
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-তে পাঠানো হয়।
এটি ব্যবহারিক কারণে গুরুত্বপূর্ণ:
- খরচ। আপনি শুধু নতুন স্ট্রিংয়ের জন্য অর্থ দেন, পুরো ফাইলের জন্য নয়।
- গতি। 15টি স্ট্রিং অনুবাদ করতে সেকেন্ড লাগে, মিনিট নয়।
- স্থিতিশীলতা। আপনি যে অনুবাদগুলো ইতিমধ্যে পর্যালোচনা এবং অনুমোদন করেছেন সেগুলো কখনো ওভাররাইট হয় না (যদি না আপনি স্পষ্টভাবে
--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
সাধারণ ডেভেলপার ওয়ার্কফ্লো হয়ে যায়:
- একটি ফিচার ব্রাঞ্চে নতুন অনুবাদযোগ্য স্ট্রিং যোগ করুন।
- CI ব্যর্থ হয় কারণ সেই স্ট্রিংগুলো অনুবাদহীন।
- লোকালি
python manage.py translateচালান। - আপডেটেড
.poফাইল কমিট করুন। - 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 অনুবাদ বিকল্পগুলোর তুলনায় সাশ্রয়ী কিনা। 5টি ভাষায় 500টি অনুবাদযোগ্য স্ট্রিং সহ একটি প্রোজেক্টের জন্য একটি মোটামুটি তুলনা:
| পদ্ধতি | আনুমানিক খরচ | সময় বিনিয়োগ |
|---|---|---|
| ম্যানুয়াল (ডেভেলপার সময়) | পকেট থেকে $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-এর মতো প্রিমিয়াম মডেলগুলো এমন প্রোজেক্টের জন্য রাখুন যেখানে নির্ভুলতা গুরুত্বপূর্ণ, যেমন মার্কেটিং কপি, আইনি টেক্সট, বা ডোমেইন-নির্দিষ্ট পরিভাষা।
গুরুত্বপূর্ণ স্ট্রিং পর্যালোচনা করুন। বেশিরভাগ UI টেক্সটের জন্য AI অনুবাদ যথেষ্ট ভালো, কিন্তু আইনগতভাবে বাধ্যতামূলক, নিরাপত্তা-সমালোচনামূলক, বা উচ্চ-ঝুঁকিপূর্ণ প্রসঙ্গে গ্রাহক-মুখী যেকোনো কিছু একজন নেটিভ স্পিকার দিয়ে পর্যালোচনা করান।
ঘণ্টা থেকে সেকেন্ডে
Django-র i18n ফ্রেমওয়ার্ক অনুবাদ এক্সট্র্যাক্ট এবং কম্পাইল করতে চমৎকার। ফাঁক সবসময় অনুবাদ পদক্ষেপেই ছিল — একাধিক ভাষায় শত শত msgstr মান পূরণ করার ক্লান্তিকর, ত্রুটি-প্রবণ কাজ।
TranslateBot সেই ফাঁক পূরণ করে। এটি ইনস্টল করুন, একটি AI প্রদানকারীর দিকে নির্দেশ করুন, এবং একটি কমান্ড চালান। নতুন স্ট্রিং অনুবাদ হয়। বিদ্যমান স্ট্রিং অপরিবর্তিত থাকে। প্লেসহোল্ডার অক্ষত থাকে। CI যা কিছু ছুটে যায় তা ধরে ফেলে।
আপনার .po ফাইলগুলো একটি ভার হওয়া বন্ধ করে এবং বিল্ডের আরেকটি অংশ হয়ে যায়।
pip install translatebot-django
translatebot.dev-এ শুরু করুন।