คุณสร้างแอป Django ขึ้นมาแล้ว มันใช้งานได้ ผู้ใช้กำลังสมัครเข้ามา และตอนนี้คุณต้องการเข้าถึงคนที่ไม่ได้พูดภาษาอังกฤษ ปัญหาชัดเจนทันทีที่คุณมอง: เฟรมเวิร์กการทำให้เป็นสากลของ Django ยอดเยี่ยมในการดึงสตริงที่แปลได้ แต่ไม่ได้ทำอะไรเลยในการเติมคำแปล ส่วนนั้นเป็นหน้าที่ของคุณ
หากคุณเป็นนักพัฒนาคนเดียวหรือทีมสองคน ช่องว่างระหว่าง makemessages กับแอปที่แปลเสร็จสมบูรณ์อาจรู้สึกว่ากว้างใหญ่มาก ผมจะพาดูตัวเลือกที่เป็นจริง อธิบายว่าทำไมส่วนใหญ่ถึงไม่เวิร์กสำหรับทีมเล็ก และแสดงเวิร์กโฟลว์ที่เปลี่ยนการแปลจากงานหลายสัปดาห์เป็นคำสั่งสองนาที
ตัวเลือกแบบดั้งเดิม (และทำไมถึงลำบาก)
ตัวเลือกที่ 1: คัดลอก-วางจาก Google Translate
ความพยายามแรกที่พบบ่อยที่สุด คุณเปิดไฟล์ .po คัดลอกแต่ละ msgid ไปยัง Google Translate วางผลลัพธ์กลับเป็น msgstr แล้วทำซ้ำ สำหรับทุกสตริง ในทุกภาษา
แอป Django ทั่วไปมีสตริงที่แปลได้ 200-500 สตริง หากคุณแปลเป็นห้าภาษา นั่นคือ 1,000-2,500 รอบการคัดลอก-วาง แม้แต่ละครั้งใช้เวลาเพียง 30 วินาที คุณก็กำลังมองที่ 8-20 ชั่วโมงของงานน่าเบื่อ และนั่นยังไม่นับการแก้ไขข้อผิดพลาดด้านการจัดรูปแบบ placeholder ที่เสีย และคำศัพท์ที่ไม่สอดคล้องกันที่หลีกเลี่ยงไม่ได้
แย่กว่านั้น คุณต้องทำอีกครั้งในสปรินต์ถัดไปเมื่อเพิ่มสตริงใหม่
ตัวเลือกที่ 2: นักแปลมืออาชีพ
การแปลระดับมืออาชีพมักมีค่าใช้จ่าย $0.10 ถึง $0.25 ต่อคำ แอป Django ที่มี 500 สตริงเฉลี่ย 8 คำต่อสตริงเท่ากับประมาณ 4,000 คำ ที่ $0.15/คำ นั่นคือ $600 ต่อภาษา หรือ $3,000 สำหรับห้าภาษา
สำหรับสตาร์ทอัพที่ได้รับเงินทุน VC นั่นแค่ค่าปัดเศษ สำหรับนักพัฒนาคนเดียวที่เก็บ $9/เดือนต่อผู้ใช้ มันสามารถกินรายได้ทั้งไตรมาสของคุณได้
ตัวเลือกที่ 3: Fiverr และตลาดฟรีแลนซ์
คุณสามารถหานักแปลบน Fiverr ในราคา $20-50 ต่อภาษา บางคนมีทักษะจริงๆ หลายคนแค่วางข้อความของคุณใน Google Translate แล้วเรียกเก็บเงินจากคุณ คุณจบลงด้วยคุณภาพเดียวกับตัวเลือกที่ 1 บวกกับการสื่อสารไป-กลับเพิ่มเติมและการรอหนึ่งสัปดาห์
ตัวเลือกที่ 4: Crowdin, Transifex หรือ Weblate
แพลตฟอร์มเหล่านี้มีประสิทธิภาพ แต่ออกแบบมาสำหรับโปรเจกต์ที่มีทีมแปลเฉพาะ ค่าใช้จ่ายในการตั้งค่า (การซิงค์ที่เก็บข้อมูล การกำหนดค่าหน่วยความจำการแปล การจัดการสิทธิ์ผู้มีส่วนร่วม) มากเกินไปเมื่อคุณเป็นคนเดียวในโปรเจกต์ การสมัครสมาชิกรายเดือนเริ่มต้นที่ $30-150/เดือนสำหรับระดับที่ต้องจ่าย และแม้แต่ระดับฟรีก็ต้องให้คุณดูแลการเชื่อมต่อบุคคลที่สามอีกอัน
ตัวเลือกที่ 5: วางทุกอย่างลงใน ChatGPT
จริงๆ แล้วมันใช้งานได้ดีอย่างน่าประหลาดใจในเรื่องคุณภาพ คุณวางเนื้อหาไฟล์ .po ลงใน ChatGPT หรือ Claude ขอการแปล แล้วได้ผลลัพธ์ที่สมเหตุสมผล ปัญหาคือมันไม่สเกล คุณต้องดึงสตริงที่ยังไม่ได้แปลด้วยตนเอง จัดรูปแบบ prompt แยกวิเคราะห์การตอบกลับกลับเป็นรูปแบบ .po และจัดการ batching เมื่อเกินขีดจำกัด context ใช้ได้ครั้งเดียว พังเมื่อใช้เป็นเวิร์กโฟลว์ที่ทำซ้ำได้
แนวทางอัตโนมัติ
จะเป็นอย่างไรถ้าขั้นตอนการแปลทั้งหมดเป็นคำสั่งเดียว? นั่นคือแนวคิดเบื้องหลัง TranslateBot คำสั่งจัดการ Django แบบโอเพนซอร์สที่อ่านไฟล์ .po ของคุณ ส่งสตริงที่ยังไม่ได้แปลไปยังผู้ให้บริการ AI และเขียนคำแปลกลับในรูปแบบที่ถูกต้อง
นี่คือวิธีตั้งค่า
ขั้นตอนที่ 1: ติดตั้ง TranslateBot
uv add --dev translatebot-django
หรือใช้ pip:
pip install translatebot-django
เพิ่มลงใน installed apps ของคุณ:
# settings.py
INSTALLED_APPS = [
# ...
'translatebot_django',
]
ขั้นตอนที่ 2: กำหนดค่าผู้ให้บริการ AI ของคุณ
เพิ่มสองการตั้งค่า:
# 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 ในรูทโปรเจกต์ของคุณให้บริบทแก่ 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 จะใช้โทนและคำศัพท์ที่ถูกต้องอย่างสม่ำเสมอ
ขั้นตอนที่ 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."))
ก่อน commit: คุณรันสามคำสั่ง:
python manage.py makemessages -a --no-obsolete
python manage.py translate
python manage.py compilemessages
คำสั่ง translate ตรวจจับรายการใหม่ที่ยังไม่ได้แปลและแปลเฉพาะรายการเหล่านั้น หากคุณเพิ่ม 5 สตริงใหม่และรองรับ 5 ภาษา มันจะสร้าง 25 การแปลในการเรียก API ครั้งเดียว กระบวนการทั้งหมดใช้เวลาไม่ถึงหนึ่งนาที
คุณ commit โค้ด เทมเพลต และไฟล์ .po/.mo ที่อัปเดตแล้วพร้อมกัน การแปลเป็นส่วนหนึ่งของขั้นตอนการพัฒนาปกติของคุณ ไม่ใช่โปรเจกต์แยกต่างหาก
ดูตัวอย่างก่อน commit
หากคุณต้องการดูการแปลก่อนที่จะเขียนลงดิสก์ ให้ใช้โหมด dry-run:
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 | ~2 นาที | ~$0.01/สปรินต์ |
| TranslateBot + DeepL Free | $0 | ~2 นาที | $0 |
แอป Django ขนาดเล็กถึงกลางที่มีสตริงที่แปลได้ประมาณ 500 สตริงมักจะมีค่าใช้จ่ายต่ำกว่า $0.01 ต่อภาษาเมื่อใช้ gpt-4o-mini สำหรับโปรเจกต์เดี่ยวส่วนใหญ่ ระดับฟรีของ DeepL (500,000 ตัวอักษร/เดือน) ครอบคลุมทุกอย่างโดยไม่มีค่าใช้จ่าย
พูดให้ชัด: การแปลด้วย 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
สิ่งนี้เปลี่ยนการแปลจากสิ่งที่คุณต้องจำทำเป็นสิ่งที่คุณลืมไม่ได้
เคล็ดลับที่ใช้ได้จริง
เริ่มต้นด้วยสองหรือสามภาษา คุณไม่จำเป็นต้องเปิดตัวใน 15 ภาษาตั้งแต่วันแรก เลือกภาษาที่คุณมีผู้ใช้มากที่สุดหรือตลาดที่เข้าถึงได้มากที่สุด ภาษาเยอรมัน ฝรั่งเศส และสเปนครอบคลุมพื้นที่กว้างสำหรับตลาดยุโรป
ให้เจ้าของภาษาตรวจสอบสตริงที่สำคัญ การแปลด้วย AI ดีพอสำหรับข้อความ UI ส่วนใหญ่ แต่หัวเรื่องหน้า landing page และขั้นตอน onboarding ของคุณสมควรได้รับการตรวจสอบจากคน ขอให้เพื่อน ผู้ใช้ หรือใครสักคนในฟอรัมชุมชนใช้เวลา 10 นาทีตรวจสอบสตริงที่เห็นได้ชัดที่สุด
ใช้ dry-run ก่อนเขียนทับ หากคุณต้องแปลทุกอย่างใหม่ (เช่น หลังจากอัปเดต TRANSLATING.md ด้วยแนวทางคำศัพท์ที่ดีกว่า) ให้ดูตัวอย่างการเปลี่ยนแปลงก่อน:
python manage.py translate --overwrite --dry-run
เก็บ TRANSLATING.md ใน version control มันเป็นส่วนหนึ่งของการกำหนดค่าการแปลของโปรเจกต์ เมื่อคุณอัปเดตคำศัพท์หรือแนวทางโทน การรัน translate ครั้งถัดไปจะสะท้อนการเปลี่ยนแปลงเหล่านั้นสำหรับสตริงใหม่ทุกตัว
แปลแต่ละแอปเมื่อจำเป็น หากคุณเปลี่ยนสตริงในแอปเดียวเท่านั้น คุณสามารถกำหนดขอบเขตการแปลได้:
python manage.py translate --app billing
จากหลายสัปดาห์เป็นหลายนาที
เฟรมเวิร์กการทำให้เป็นสากลของ Django เป็นหนึ่งในเฟรมเวิร์กที่ดีที่สุดในเว็บเฟรมเวิร์กใดๆ เครื่องมือสำหรับ makemessages ไดเรกทอรี locale และ compilemessages มีความสมบูรณ์และเชื่อถือได้ ส่วนเดียวที่ขาดหายไปคือขั้นตอนการแปลเอง นั่นเคยเป็นส่วนที่แพงและช้า
ด้วย TranslateBot เวิร์กโฟลว์จะกลายเป็น:
- เขียนโค้ดด้วย
gettext()และ{% trans %}ตามปกติ - รัน
makemessagesเพื่อดึงสตริง - รัน
translateเพื่อเติมคำแปล - รัน
compilemessagesเพื่อคอมไพล์ - commit ทุกอย่างพร้อมกัน
สำหรับนักพัฒนาคนเดียว นี่หมายความว่าการทำให้เป็นภาษาท้องถิ่นไม่ใช่โปรเจกต์ที่คุณวางแผนไว้สำหรับ "สักวันหนึ่ง" อีกต่อไป มันเป็นสิ่งที่คุณสามารถทำได้วันนี้ ในเวลาที่ใช้ชงกาแฟสักแก้ว
TranslateBot เป็นโอเพนซอร์สและมีให้บน PyPI และ GitHub ติดตั้ง รันคำสั่ง แล้วดูแอปของคุณในภาษาใหม่ภายในไม่กี่นาที