شما یک اپلیکیشن Django ساختید. کار میکند، کاربران ثبتنام میکنند و حالا میخواهید به افرادی که انگلیسی صحبت نمیکنند دسترسی پیدا کنید. مشکل همان لحظهای که نگاه میکنید واضح است: فریمورک بینالمللیسازی Django در استخراج رشتههای قابل ترجمه عالی است، اما مطلقاً هیچ کاری برای پر کردن ترجمهها انجام نمیدهد. آن بخش بر عهده شماست.
اگر یک توسعهدهنده تنها یا یک تیم دو نفره هستید، فاصله بین makemessages و یک اپلیکیشن کاملاً ترجمهشده میتواند بسیار بزرگ به نظر برسد. من گزینههای واقعبینانه را بررسی میکنم، توضیح میدهم که چرا بیشتر آنها برای تیمهای کوچک جواب نمیدهند و یک گردش کار نشان میدهم که ترجمه را از یک کار چند هفتهای به یک دستور دو دقیقهای تبدیل میکند.
گزینههای سنتی (و چرا دردناک هستند)
گزینه ۱: کپی-پیست از Google Translate
رایجترین تلاش اول. فایل .po خود را باز میکنید، هر msgid را در Google Translate کپی میکنید، نتیجه را به عنوان msgstr پیست میکنید و تکرار میکنید. برای هر رشته. در هر زبان.
یک اپلیکیشن معمولی Django ۲۰۰ تا ۵۰۰ رشته قابل ترجمه دارد. اگر به پنج زبان ترجمه میکنید، ۱,۰۰۰ تا ۲,۵۰۰ چرخه کپی-پیست است. حتی اگر هر کدام فقط ۳۰ ثانیه طول بکشد، ۸ تا ۲۰ ساعت کار خستهکننده پیش رو دارید. و این قبل از اصلاح خطاهای قالببندی، placeholderهای خراب و اصطلاحات ناسازگار است که اجتنابناپذیر وارد میشوند.
بدتر از آن، باید دوباره این کار را در اسپرینت بعدی انجام دهید وقتی رشتههای جدید اضافه میکنید.
گزینه ۲: مترجمان حرفهای
ترجمه حرفهای معمولاً هر کلمه ۰.۱۰ تا ۰.۲۵ دلار هزینه دارد. یک اپلیکیشن Django با ۵۰۰ رشته با میانگین ۸ کلمهای تقریباً ۴,۰۰۰ کلمه میشود. با ۰.۱۵ دلار به ازای هر کلمه، هر زبان ۶۰۰ دلار و پنج زبان ۳,۰۰۰ دلار میشود.
برای یک استارتاپ با سرمایهگذاری VC، این خطای گرد کردن است. برای یک توسعهدهنده تنها که ماهیانه ۹ دلار از هر کاربر دریافت میکند، میتواند کل درآمد یک فصل را ببلعد.
گزینه ۳: Fiverr و بازارهای فریلنسری
میتوانید مترجمانی را در Fiverr با ۲۰ تا ۵۰ دلار برای هر زبان پیدا کنید. برخی واقعاً ماهر هستند. بسیاری صرفاً متن شما را در Google Translate پیست میکنند و برای این امتیاز از شما هزینه میگیرند. در نهایت همان کیفیت گزینه ۱ را دریافت میکنید، به علاوه یک دور رفت و برگشت اضافی ارتباط و یک هفته انتظار.
گزینه ۴: Crowdin، Transifex یا Weblate
این پلتفرمها قدرتمند هستند، اما برای پروژههایی با تیمهای ترجمه اختصاصی طراحی شدهاند. سربار راهاندازی (همگامسازی مخازن، پیکربندی حافظه ترجمه، مدیریت دسترسی مشارکتکنندگان) وقتی تنها فرد پروژه هستید بیش از حد است. اشتراکهای ماهانه از ۳۰ تا ۱۵۰ دلار در ماه برای سطوح پولی شروع میشود و حتی سطوح رایگان نیاز دارند که یک ادغام شخص ثالث دیگر را نگهداری کنید.
گزینه ۵: همه چیز را در ChatGPT پیست کنید
این در واقع از نظر کیفیت به طرز شگفتآوری خوب کار میکند. محتویات فایل .po خود را در ChatGPT یا Claude پیست میکنید، ترجمه میخواهید و نتایج معقولی دریافت میکنید. مشکل این است که مقیاسپذیر نیست. باید رشتههای ترجمهنشده را به صورت دستی استخراج کنید، پرامپت را قالببندی کنید، پاسخ را دوباره به فرمت .po تبدیل کنید و وقتی از محدودیتهای context فراتر رفتید، دستهبندی را مدیریت کنید. یک بار کار میکند. به عنوان یک گردش کار تکرارپذیر خراب میشود.
رویکرد اتوماسیون
اگر کل مرحله ترجمه یک دستور واحد بود چه؟ این ایده پشت TranslateBot است، یک دستور مدیریتی متنباز Django که فایلهای .po شما را میخواند، رشتههای ترجمهنشده را به یک ارائهدهنده AI ارسال میکند و ترجمهها را در قالب صحیح بازنویسی میکند.
نحوه راهاندازی به این صورت است.
مرحله ۱: نصب TranslateBot
uv add --dev translatebot-django
یا با pip:
pip install translatebot-django
آن را به اپلیکیشنهای نصبشده اضافه کنید:
# settings.py
INSTALLED_APPS = [
# ...
'translatebot_django',
]
مرحله ۲: پیکربندی ارائهدهنده AI
دو تنظیم اضافه کنید:
# settings.py
import os
TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini"
TranslateBot با OpenAI، Anthropic Claude، Google Gemini و بیش از ۱۰۰ مدل دیگر از طریق LiteLLM کار میکند. همچنین از DeepL به عنوان یک بکاند ترجمه اختصاصی پشتیبانی میکند.
مرحله ۳: ایجاد TRANSLATING.md (اختیاری اما توصیهشده)
یک فایل TRANSLATING.md در ریشه پروژه شما به AI زمینهای درباره اپلیکیشن شما میدهد. این همان چیزی است که ترجمه ماشینی عمومی را از ترجمههایی که واقعاً با محصول شما مطابقت دارند جدا میکند:
# Translation Context
## About This Project
A personal finance tracker for freelancers. Users track invoices,
expenses, and tax obligations.
## Tone
- Friendly and informal
- Use "du" in German, "tu" in French
- Keep financial terms precise
## Terminology
- "invoice" = "Rechnung" (German), "facture" (French)
- "dashboard" = keep as English loanword in all languages
- "freelancer" = keep as English loanword in German
این فایل همراه با هر درخواست ترجمه ارسال میشود، بنابراین AI به طور مداوم از لحن و اصطلاحات صحیح استفاده میکند.
مرحله ۴: ترجمه
python manage.py makemessages -l de -l fr -l nl -l es -l ja
python manage.py translate
python manage.py compilemessages
سه دستور. همین. TranslateBot تمام رشتههای ترجمهنشده را در تمام فایلهای .po شما پیدا میکند، آنها را به صورت دستهای ترجمه میکند و نتایج را بازنویسی میکند. به طور پیشفرض فقط ورودیهای خالی ترجمه میشوند، بنابراین اجرای مجدد دستور پس از افزودن رشتههای جدید فقط موارد جدید را ترجمه میکند.
این در عمل چگونه به نظر میرسد
اینجا یک گردش کار واقعبینانه اسپرینت برای یک توسعهدهنده تنها که پنج زبان را پشتیبانی میکند آمده است:
دوشنبه: شما یک ویژگی جدید میسازید. در حین کار با استفاده از gettext() و {% trans %} چند رشته قابل ترجمه جدید اضافه میکنید.
from django.utils.translation import gettext_lazy as _
class InvoiceView(View):
def post(self, request):
# New string added during development
messages.success(request, _("Invoice sent successfully."))
قبل از commit: سه دستور را اجرا میکنید:
python manage.py makemessages -a --no-obsolete
python manage.py translate
python manage.py compilemessages
دستور translate ورودیهای جدید ترجمهنشده را تشخیص میدهد و فقط آنها را ترجمه میکند. اگر ۵ رشته جدید اضافه کردهاید و ۵ زبان را پشتیبانی میکنید، ۲۵ ترجمه را در یک فراخوانی API واحد انجام میدهد. کل فرآیند کمتر از یک دقیقه طول میکشد.
commit میکنید کد، قالبها و فایلهای بهروزرسانیشده .po/.mo را با هم. ترجمهها بخشی از جریان توسعه عادی شما هستند، نه یک پروژه جداگانه.
پیشنمایش قبل از commit
اگر میخواهید ترجمهها را قبل از نوشتن روی دیسک ببینید، از حالت dry-run استفاده کنید:
python manage.py translate --dry-run
این هر ترجمه را بدون تغییر هیچ فایلی در ترمینال چاپ میکند.
مقایسه هزینه
اینجاست که استدلال علیه اتوماسیون دشوار میشود.
| رویکرد | ۵۰۰ رشته، ۵ زبان | زمان | هزینه تکراری |
|---|---|---|---|
| کپی-پیست دستی | رایگان | ~۴۰ ساعت | ~۸ ساعت/اسپرینت |
| مترجمان حرفهای | ~$3,000 | ۱-۲ هفته | ~$600/اسپرینت |
| مترجمان Fiverr | ~$100-250 | ۳-۷ روز | ~$50/اسپرینت |
| Crowdin/Transifex | $30-150/ماه | راهاندازی: ساعتها | مداوم |
| TranslateBot + GPT-4o-mini | ~$0.05 | ~۲ دقیقه | ~$0.01/اسپرینت |
| TranslateBot + DeepL Free | $0 | ~۲ دقیقه | $0 |
یک اپلیکیشن Django کوچک تا متوسط با حدود ۵۰۰ رشته قابل ترجمه معمولاً با gpt-4o-mini کمتر از ۰.۰۱ دلار برای هر زبان هزینه دارد. برای بیشتر پروژههای انفرادی، سطح رایگان DeepL (۵۰۰,۰۰۰ کاراکتر در ماه) همه چیز را بدون هزینه پوشش میدهد.
برای روشن بودن: ترجمههای AI کامل نیستند. ترجمههای انسانی ارزان هم همینطور. تفاوت این است که ترجمههای AI تقریباً هیچ هزینهای ندارند، فوراً تحویل داده میشوند و هر وقت بخواهید میتوانید دوباره اجرا شوند.
ادغام CI: هرگز رشتههای ترجمهنشده را منتشر نکنید
یکی از مفیدترین الگوهایی که به عنوان یک توسعهدهنده تنها پیدا کردهام، افزودن بررسی ترجمه به CI است. TranslateBot شامل یک دستور check_translations است که اگر هر فایل .po ورودیهای ترجمهنشده یا fuzzy داشته باشد، شکست میخورد:
# .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
اگر یک تگ {% trans %} جدید در یک قالب اضافه کنید و فراموش کنید translate را اجرا کنید، CI آن را میگیرد:
locale/de/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
locale/fr/LC_MESSAGES/django.po: 1 untranslated, 0 fuzzy
CommandError: Translation check failed
این ترجمهها را از چیزی که باید به یاد بیاورید به چیزی که نمیتوانید فراموش کنید تبدیل میکند.
نکات عملی
با دو یا سه زبان شروع کنید. لازم نیست روز اول با ۱۵ زبان راهاندازی کنید. زبانهایی را انتخاب کنید که بیشترین کاربر یا بزرگترین بازار قابل دسترسی را دارید. آلمانی، فرانسوی و اسپانیایی بخش بزرگی از بازارهای اروپایی را پوشش میدهند.
از گویشوران بومی بخواهید رشتههای حیاتی را بررسی کنند. ترجمههای AI برای بیشتر متنهای رابط کاربری به اندازه کافی خوب هستند، اما عنوان صفحه فرود و جریان onboarding شما شایسته یک چشم انسانی هستند. از یک دوست، یک کاربر یا کسی در یک انجمن اجتماعی بخواهید ۱۰ دقیقه صرف بررسی قابلمشاهدهترین رشتهها کند.
قبل از بازنویسی از dry-run استفاده کنید. اگر نیاز دارید همه چیز را دوباره ترجمه کنید (مثلاً پس از بهروزرسانی TRANSLATING.md با راهنمای اصطلاحات بهتر)، ابتدا تغییرات را پیشنمایش کنید:
python manage.py translate --overwrite --dry-run
TRANSLATING.md را در کنترل نسخه نگه دارید. این بخشی از پیکربندی ترجمه پروژه شماست. وقتی اصطلاحات یا راهنمای لحن را بهروزرسانی میکنید، اجرای بعدی translate آن تغییرات را برای هر رشته جدید منعکس میکند.
در صورت نیاز هر اپ را جداگانه ترجمه کنید. اگر فقط رشتهها را در یک اپ تغییر دادهاید، میتوانید محدوده ترجمه را مشخص کنید:
python manage.py translate --app billing
از هفتهها به دقیقهها
فریمورک بینالمللیسازی Django یکی از بهترینها در هر فریمورک وب است. ابزارهای makemessages، دایرکتوریهای locale و compilemessages بالغ و قابل اعتماد هستند. تنها قطعهای که گم بود خود مرحله ترجمه بود. آن قبلاً بخش گران و کند بود.
با TranslateBot، گردش کار به این صورت میشود:
- کد را با
gettext()و{% trans %}مثل همیشه بنویسید makemessagesرا اجرا کنید تا رشتهها استخراج شوندtranslateرا اجرا کنید تا ترجمهها پر شوندcompilemessagesرا اجرا کنید تا کامپایل شوند- همه چیز را با هم commit کنید
برای یک توسعهدهنده تنها، این بدان معناست که بومیسازی دیگر پروژهای نیست که برای «یک روزی» برنامهریزی میکنید. چیزی است که امروز میتوانید انجام دهید، در زمانی که طول میکشد یک فنجان قهوه درست کنید.
TranslateBot متنباز است و در PyPI و GitHub در دسترس است. نصبش کنید، دستور را اجرا کنید و اپلیکیشن خود را در عرض چند دقیقه به زبان جدید ببینید.