العودة إلى المدونة

ترجمة Django للمطورين المستقلين: من أسابيع إلى دقائق

2026-02-11 7 دقيقة قراءة
ترجمة Django للمطورين المستقلين: من أسابيع إلى دقائق

لقد بنيت تطبيق Django. إنه يعمل، والمستخدمون يسجلون، والآن تريد الوصول إلى أشخاص لا يتحدثون الإنجليزية. المشكلة واضحة بمجرد النظر إليها: إطار عمل التدويل في Django ممتاز في استخراج النصوص القابلة للترجمة، لكنه لا يفعل شيئاً على الإطلاق لملء الترجمات. هذا الجزء يعود إليك.

إذا كنت مطوراً منفرداً أو فريقاً من شخصين، فإن الفجوة بين makemessages وتطبيق مترجم بالكامل قد تبدو هائلة. سأستعرض الخيارات الواقعية، وأشرح لماذا تفشل معظمها بالنسبة للفرق الصغيرة، وأعرض سير عمل يحول الترجمة من مهمة تستغرق أسابيع إلى أمر يستغرق دقيقتين.

الخيارات التقليدية (ولماذا تؤلم)

الخيار 1: النسخ واللصق من Google Translate

المحاولة الأولى الأكثر شيوعاً. تفتح ملف .po الخاص بك، وتنسخ كل msgid في Google Translate، وتلصق النتيجة كـ msgstr، وتكرر. لكل نص. في كل لغة.

تطبيق Django نموذجي يحتوي على 200-500 نص قابل للترجمة. إذا كنت تترجم إلى خمس لغات، فهذا يعني 1,000-2,500 دورة نسخ ولصق. حتى لو استغرقت كل واحدة 30 ثانية فقط، فأنت تتحدث عن 8-20 ساعة من العمل المرهق. وهذا قبل إصلاح أخطاء التنسيق والعناصر النائبة المعطلة والمصطلحات غير المتسقة التي تتسلل حتماً.

والأسوأ أنه عليك فعل ذلك مرة أخرى في السبرنت التالي عندما تضيف نصوصاً جديدة.

الخيار 2: مترجمون محترفون

تكلفة الترجمة الاحترافية عادة بين $0.10 و$0.25 لكل كلمة. تطبيق Django يحتوي على 500 نص بمتوسط 8 كلمات لكل منها يعني حوالي 4,000 كلمة. بسعر $0.15/كلمة، هذا $600 لكل لغة، أو $3,000 لخمس لغات.

بالنسبة لشركة ناشئة ممولة من رأس المال المغامر، هذا مبلغ زهيد. أما بالنسبة لمطور منفرد يتقاضى $9/شهر لكل مستخدم، فقد يلتهم إيراداتك بالكامل لهذا الربع.

الخيار 3: Fiverr وأسواق العمل الحر

يمكنك العثور على مترجمين على Fiverr بسعر $20-50 لكل لغة. بعضهم ماهرون حقاً. كثيرون يلصقون نصك في Google Translate ببساطة ويتقاضون منك مقابل ذلك. ينتهي بك الأمر بنفس الجودة كالخيار 1، بالإضافة إلى جولة إضافية من التواصل وأسبوع من الانتظار.

الخيار 4: Crowdin أو Transifex أو Weblate

هذه المنصات قوية، لكنها مصممة لمشاريع بها فرق ترجمة مخصصة. عبء الإعداد (مزامنة المستودعات، تكوين ذاكرة الترجمة، إدارة وصول المساهمين) مبالغ فيه عندما تكون الشخص الوحيد في المشروع. الاشتراكات الشهرية تبدأ من $30-150/شهر للمستويات المدفوعة، وحتى المستويات المجانية تتطلب منك الحفاظ على تكامل طرف ثالث آخر.

الخيار 5: لصق كل شيء في ChatGPT

هذا يعمل بشكل جيد بشكل مدهش من حيث الجودة. تلصق محتويات ملف .po في ChatGPT أو Claude، وتطلب ترجمات، وتحصل على نتائج معقولة. المشكلة أنه لا يتوسع. عليك استخراج النصوص غير المترجمة يدوياً، وتنسيق الموجه، وتحليل الاستجابة مرة أخرى إلى تنسيق .po، والتعامل مع التجزئة عندما تتجاوز حدود السياق. يعمل مرة واحدة. ينهار كسير عمل قابل للتكرار.

نهج الأتمتة

ماذا لو كانت خطوة الترجمة بأكملها أمراً واحداً؟ هذه هي الفكرة وراء TranslateBot، أمر إدارة Django مفتوح المصدر يقرأ ملفات .po الخاصة بك، ويرسل النصوص غير المترجمة إلى مزود ذكاء اصطناعي، ويكتب الترجمات بالتنسيق الصحيح.

إليك كيفية إعداده.

الخطوة 1: تثبيت TranslateBot

uv add --dev translatebot-django

أو باستخدام pip:

pip install translatebot-django

أضفه إلى تطبيقاتك المثبتة:

# settings.py
INSTALLED_APPS = [
    # ...
    'translatebot_django',
]

الخطوة 2: تكوين مزود الذكاء الاصطناعي

أضف إعدادين:

# settings.py
import os

TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini"

يعمل TranslateBot مع OpenAI وAnthropic Claude وGoogle Gemini وأكثر من 100 نموذج آخر من خلال LiteLLM. كما يدعم DeepL كواجهة ترجمة مخصصة.

الخطوة 3: إنشاء TRANSLATING.md (اختياري لكن موصى به)

ملف TRANSLATING.md في جذر مشروعك يعطي الذكاء الاصطناعي سياقاً عن تطبيقك. هذا ما يفصل الترجمة الآلية العامة عن الترجمات التي تناسب منتجك فعلاً:

# 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

يُرسل هذا الملف مع كل طلب ترجمة، لذا يستخدم الذكاء الاصطناعي باستمرار النبرة والمصطلحات الصحيحة.

الخطوة 4: الترجمة

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."))

قبل الالتزام: تنفذ ثلاثة أوامر:

python manage.py makemessages -a --no-obsolete
python manage.py translate
python manage.py compilemessages

يكتشف أمر translate الإدخالات الجديدة غير المترجمة ويترجم تلك فقط. إذا أضفت 5 نصوص جديدة وتدعم 5 لغات، فإنه ينجز 25 ترجمة في استدعاء API واحد. العملية بأكملها تستغرق أقل من دقيقة.

تلتزم بالكود والقوالب وملفات .po/.mo المحدثة معاً. الترجمات جزء من تدفق التطوير الطبيعي، وليست مشروعاً منفصلاً.

معاينة قبل الالتزام

إذا أردت رؤية الترجمات قبل كتابتها على القرص، استخدم وضع التشغيل التجريبي:

python manage.py translate --dry-run

يطبع هذا كل ترجمة في الطرفية دون تعديل أي ملفات.

مقارنة التكاليف

هنا تصبح الأتمتة صعبة الدحض.

النهج 500 نص، 5 لغات الوقت التكلفة المتكررة
النسخ واللصق اليدوي مجاني ~40 ساعة ~8 ساعات/سبرنت
مترجمون محترفون ~$3,000 1-2 أسبوع ~$600/سبرنت
مترجمو Fiverr ~$100-250 3-7 أيام ~$50/سبرنت
Crowdin/Transifex $30-150/شهر إعداد: ساعات مستمر
TranslateBot + GPT-4o-mini ~$0.05 ~دقيقتان ~$0.01/سبرنت
TranslateBot + DeepL Free $0 ~دقيقتان $0

تطبيق Django صغير إلى متوسط يحتوي على حوالي 500 نص قابل للترجمة عادة ما يكلف أقل من $0.01 لكل لغة مع gpt-4o-mini. بالنسبة لمعظم المشاريع الفردية، يغطي المستوى المجاني من DeepL (500,000 حرف/شهر) كل شيء بدون تكلفة.

لنكن واضحين: ترجمات الذكاء الاصطناعي ليست مثالية. والترجمات البشرية الاقتصادية أيضاً ليست مثالية. الفرق أن ترجمات الذكاء الاصطناعي لا تكلف شيئاً تقريباً، وتصل فوراً، ويمكن إعادة تشغيلها وقتما تشاء.

تكامل CI: لا تنشر أبداً نصوصاً غير مترجمة

من أكثر الأنماط فائدة التي وجدتها كمطور منفرد هو إضافة فحص ترجمة إلى CI. يتضمن TranslateBot أمر check_translations الذي يفشل إذا كان أي ملف .po يحتوي على إدخالات غير مترجمة أو ضبابية:

# .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

هذا يحول الترجمات من شيء تتذكر فعله إلى شيء لا يمكنك نسيانه.

نصائح عملية

ابدأ بلغتين أو ثلاث. لا تحتاج للإطلاق بـ 15 لغة في اليوم الأول. اختر اللغات التي لديك فيها أكثر المستخدمين أو أكبر سوق قابل للوصول. الألمانية والفرنسية والإسبانية تغطي مساحة كبيرة في الأسواق الأوروبية.

اطلب من متحدثين أصليين مراجعة النصوص الحرجة. ترجمات الذكاء الاصطناعي جيدة بما يكفي لمعظم نصوص واجهة المستخدم، لكن عنوان صفحتك الرئيسية وتدفق الإعداد الأولي يستحقان نظرة بشرية. اطلب من صديق أو مستخدم أو شخص في منتدى مجتمعي قضاء 10 دقائق في مراجعة النصوص الأكثر ظهوراً.

استخدم التشغيل التجريبي قبل الكتابة فوق الملفات. إذا احتجت يوماً لإعادة ترجمة كل شيء (مثلاً، بعد تحديث TRANSLATING.md بإرشادات مصطلحات أفضل)، عاين التغييرات أولاً:

python manage.py translate --overwrite --dry-run

احتفظ بـ TRANSLATING.md في التحكم بالإصدارات. إنه جزء من تكوين الترجمة لمشروعك. عندما تحدث إرشادات المصطلحات أو النبرة، سيعكس تشغيل translate التالي تلك التغييرات لأي نصوص جديدة.

ترجم حسب التطبيق عند الحاجة. إذا غيرت نصوصاً في تطبيق واحد فقط، يمكنك تحديد نطاق الترجمة:

python manage.py translate --app billing

من أسابيع إلى دقائق

إطار عمل التدويل في Django هو من الأفضل في أي إطار عمل ويب. أدوات makemessages وأدلة locale وcompilemessages ناضجة وموثوقة. القطعة الوحيدة المفقودة كانت خطوة الترجمة نفسها. كانت تلك هي الجزء المكلف والبطيء.

مع TranslateBot، يصبح سير العمل:

  1. اكتب الكود مع gettext() و{% trans %} كالمعتاد
  2. شغّل makemessages لاستخراج النصوص
  3. شغّل translate لملء الترجمات
  4. شغّل compilemessages للتجميع
  5. التزم بكل شيء معاً

بالنسبة لمطور منفرد، هذا يعني أن التوطين لم يعد مشروعاً تخطط له "يوماً ما". إنه شيء يمكنك فعله اليوم، في الوقت الذي يستغرقه تحضير فنجان قهوة.

TranslateBot مفتوح المصدر ومتاح على PyPI وGitHub. ثبّته، شغّل الأمر، وشاهد تطبيقك بلغة جديدة في دقائق.

توقف عن تحرير ملفات .po يدويًا

يُؤتمت TranslateBot ترجمات Django بالذكاء الاصطناعي. أمر واحد، جميع لغاتك، بتكلفة زهيدة لكل ترجمة.