Kung nakatrabaho ka na sa built-in na internationalization (i18n) framework ng Django, alam mong mahusay itong nagha-handle ng mga static string. Ang pag-wrap ng teksto sa gettext() o paggamit ng {% trans %} template tag ay nag-e-extract ng mga string sa .po files, na pinupunan ng mga tagapagsalin. Ang sistema ay battle-tested at gumagana nang mahusay para sa code at templates.
Pero paano ang content na naka-store sa iyong database?
Mga pangalan ng produkto, mga pamagat ng artikulo, mga paglalarawan ng kategorya, mga sagot sa FAQ, user-generated content. Wala sa mga ito ang nasa iyong source code. Hindi ito mahahanap ng makemessages command ng Django, at hindi ka matutulungan ng .po files dito. Kung ang iyong application ay nagse-serve ng dynamic content sa mga user sa maraming wika, kailangan mo ng ibang stratehiya.
Ganito gawin: gamitin ang django-modeltranslation para magdagdag ng translatable fields sa iyong mga model, pagkatapos i-automate ang translation gamit ang AI sa pamamagitan ng TranslateBot.
Mga Django Database Translation Package
Ilang third-party package ang lumulutas sa database translation problem, bawat isa ay may iba't ibang arkitektura.
django-modeltranslation
Nagdadagdag ng language-specific columns direkta sa iyong mga existing table. Ang title field ay nagiging title_en, title_de, title_fr, at iba pa. Mabilis pa rin ang mga query dahil lahat ay nasa iisang table. Ipinapakita ng admin interface ang lahat ng wika nang magkatabi.
- Mga Bentahe: Walang JOIN, mabilis na query, transparent access sa pamamagitan ng field descriptor, mature ecosystem
- Mga Disbentahe: Schema changes para sa bawat bagong wika, mas malapad na mga table
django-parler
Gumagawa ng hiwalay na translation table para sa bawat model. Nananatiling malinis ang original table, at ang mga translation ay naka-store sa related table na connected sa pamamagitan ng foreign key.
- Mga Bentahe: Malinis na schema, madaling magdagdag ng mga wika nang walang migration
- Mga Disbentahe: Kailangan ng JOIN para sa translated content, medyo mas kumplikadong query pattern
django-translations
Gumagamit ng iisang translations table na may generic foreign key na tumuturo sa kahit anong model. Lahat ng translation para sa lahat ng model ay napupunta sa isang table.
- Mga Bentahe: Minimal na schema changes, gumagana sa kahit anong model
- Mga Disbentahe: Mabagal ang generic foreign key query, hindi gaanong transparent na API
Manual JSON Field
Maaari mong i-store ang mga translation sa JSONField:
class Product(models.Model):
name_translations = models.JSONField(default=dict)
# {"en": "Running Shoes", "de": "Laufschuhe", "fr": "Chaussures de course"}
- Mga Bentahe: Walang extra dependencies, flexible
- Mga Disbentahe: Walang ORM integration, walang admin support, manual lahat
Alin ang Dapat Mong Gamitin?
Para sa karamihan ng mga proyekto, ang django-modeltranslation ang pinakamagandang pagpipilian. Ito ang pinaka-mature na package, may pinakamagandang Django admin integration, at pinapanatili ang lahat ng data sa iisang table para sa mabilis na query. Ang tradeoff (mas malapad na table at migration para sa bawat bagong wika) ay manageable para sa karamihan ng mga application. Ang natitira sa gabay na ito ay gumagamit ng django-modeltranslation.
Pag-setup ng django-modeltranslation Step by Step
Step 1: I-install ang Package
Bina-bundle ng TranslateBot ang django-modeltranslation bilang optional dependency. I-install ang dalawa nang sabay:
pip install translatebot-django[modeltranslation]
O kung gumagamit ka ng uv:
uv add --dev translatebot-django[modeltranslation]
Step 2: I-configure ang Django Settings
Dalawang bagay ang mahalaga sa settings.py: ang app order at ang language list.
# 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'),
]
Ang modeltranslation app ay dapat na mauna bago ang django.contrib.admin para ma-patch nito ang admin classes para ipakita ang translation fields.
Step 3: I-register ang mga Model para sa Translation
Gumawa ng translation.py file sa bawat app na may translatable models. Para sa isang e-commerce shop app:
# 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')
Isama lang ang mga field na naglalaman ng human-readable text. Huwag i-register ang mga field tulad ng slug, price, o sku.
Step 4: Gumawa at Patakbuhin ang mga Migration
python manage.py makemigrations
python manage.py migrate
Pagkatapos nito, ang iyong shop_product table ay may mga bagong column:
| Column | Type |
|---|---|
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 |
Bawat wika na iyong na-define sa LANGUAGES ay nakakakuha ng sariling column para sa bawat registered field.
Ang Problema: Mga Walang Laman na Translation Field
Mayroon ka nang schema, pero bawat _de, _fr, at _nl column ay walang laman. Kung mayroon kang 500 produkto na may 3 translatable field at 3 target na wika, iyon ay 4,500 walang laman na field na naghihintay na mapunan.
Hindi realistic ang manual na pagsasalin ng content na iyon. Kahit may professional translation service, kailangan mong i-export ang data, ipadala ito, hintayin ang delivery, at i-import ang mga resulta. Para sa isang maliit na team o solo developer, ito ay karaniwang nangangahulugan na hindi kailanman inilalabas ang feature.
Dito pumapasok ang TranslateBot.
Pag-automate ng mga Translation gamit ang TranslateBot
Ang translate management command ng TranslateBot ay maaaring punan ang lahat ng walang laman na field gamit ang AI. I-configure muna ang iyong API key:
# settings.py
TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini" # Fast and cost-effective
Pagkatapos, i-translate ang lahat ng registered model sa target language:
python manage.py translate --target-lang de --models
Ang isang command na iyon ay hinahanap ang bawat model na registered sa django-modeltranslation, tinutukoy ang mga field na walang laman para sa target language, at pinupunan ang mga ito ng AI-generated translations.
I-translate ang mga Specific Model
Kung gusto mo lang i-translate ang mga produkto at hindi ang mga kategorya:
python manage.py translate --target-lang de --models Product
O maraming specific model:
python manage.py translate --target-lang de --models Product Category
Preview gamit ang Dry Run
Laging mag-preview bago magsulat sa database:
python manage.py translate --target-lang de --models --dry-run
Ipinapakita nito nang eksakto kung ano ang ita-translate nang hindi binabago ang anumang record.
I-re-translate ang Existing Content
Bilang default, nilalaktawan ng TranslateBot ang mga field na mayroon nang translation. Para i-overwrite ang mga existing translation (halimbawa, pagkatapos mapahusay ang iyong AI model o magdagdag ng context):
python manage.py translate --target-lang de --models --overwrite
I-translate ang Lahat ng Wika nang Sabay-sabay
Kung aalisin mo ang --target-lang at may LANGUAGES na na-define sa iyong settings, ang TranslateBot ay nagta-translate sa lahat ng na-configure na wika:
python manage.py translate --models
Paano Gumagana ang Translation Pipeline
Ito ang nangyayari kapag pinatakbo mo ang translate command.
-
Discovery. Kino-query ng TranslateBot ang registry ng django-modeltranslation para hanapin ang lahat ng registered model at ang kanilang mga translatable field.
-
Source detection. Para sa bawat record, binabasa nito ang source content. Una nitong tine-check ang base field (hal.,
name), pagkatapos bumabalik sa unang populated na language-specific field (hal.,name_en). Nilalaktawan ang mga record na walang source content. -
Batching. Ang mga record ay pinagsasama-sama sa mga batch at ipinapadala sa AI provider. Pinapanatili nitong efficient ang mga API call at iniiwasan ang pag-hit sa rate limits.
-
Translation. Bawat batch ay tina-translate gamit ang na-configure na AI model. Maaari kang gumamit ng kahit anong LLM provider na sinusuportahan ng LiteLLM (OpenAI, Anthropic, Google, Azure, at marami pang iba) o DeepL.
-
Atomic writes. Lahat ng database update para sa isang translation run ay naka-wrap sa iisang transaction. Kung may mali, tulad ng API error o database constraint violation, walang partial data na nase-save. Lahat o wala.
Kumpletong Workflow Example
Narito ang isang kumpletong halimbawa mula sa model definition hanggang sa translated content, gamit ang isang e-commerce Product model.
I-define ang Model
# 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
I-register para sa Translation
# shop/translation.py
from modeltranslation.translator import register, TranslationOptions
from .models import Product
@register(Product)
class ProductTranslationOptions(TranslationOptions):
fields = ('name', 'description', 'short_description')
Patakbuhin ang mga Migration
python manage.py makemigrations shop
python manage.py migrate
Magdagdag ng Translation Context (Opsyonal)
Gumawa ng TRANSLATING.md file sa project root mo para bigyan ng context ang AI tungkol sa iyong product domain:
# 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
I-translate
# Preview first
python manage.py translate --target-lang de --models Product --dry-run
# Apply translations
python manage.py translate --target-lang de --models Product
Output:
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
I-verify sa Admin
Buksan ang Django admin at pumunta sa kahit anong produkto. Makikita mo ang mga translation field na napunan:
- Name [de]: Ultraleichte Trail-Laufschuhe
- Description [de]: Diese leichten Trail-Laufschuhe bieten hervorragenden Grip...
- Short description [de]: Leicht, schnell und griffig auf jedem Untergrund.
Ulitin para sa bawat target language:
python manage.py translate --target-lang fr --models Product
python manage.py translate --target-lang nl --models Product
O i-translate ang lahat ng wika nang sabay:
python manage.py translate --models Product
Mga Best Practice
I-back up ang iyong database bago magpatakbo ng bulk translation sa production. Gumagamit ang TranslateBot ng atomic transactions, kaya ang isang failed run ay hindi mag-iiwan ng partial data. Pero ang pagkakaroon ng backup ay nagbibigay sa iyo ng paraan para bumalik kung ang translation quality ay hindi tulad ng inaasahan mo.
# PostgreSQL example
pg_dump mydb > backup_before_translation.sql
Gamitin muna ang dry run. Laging patakbuhin gamit ang --dry-run bago mag-apply ng translations sa bagong model o wika. I-review ang output para matiyak na tama ang pagka-detect ng source content at makatuwiran ang mga translation.
Mag-translate ng isang model sa isang pagkakataon para sa malalaking database. Pinapadali nito ang pag-review ng mga resulta at pag-re-run ng mga specific model kung kinakailangan.
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
Magdagdag ng translation context. Ang TRANSLATING.md file na may domain-specific terminology at tone guidelines ay lubos na nagpapahusay sa translation quality. Ito ay lalong mahalaga para sa mga specialized field tulad ng medisina, batas, o technical products.
Panatilihing puno ang iyong source language. Nagbabasa ang TranslateBot mula sa base field o source language field. Tiyaking palaging pinupunan ng iyong data entry workflow ang source language. Ang mga walang laman na source field ay nangangahulugan ng walang laman na translation.
Pagsamahin sa PO file translation para sa buong coverage. I-translate ang parehong code string at database content:
# 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
Sa ganitong paraan, bawat string na makikita ng iyong mga user, mula man sa template o database, ay naisalin na.
Mga Susunod na Hakbang
- Basahin ang buong command reference para sa lahat ng available options
- I-setup ang CI integration para awtomatikong suriin ang mga nawawalang translation
- I-explore ang mga sinusuportahang AI model para mahanap ang pinakamagandang balanse ng quality at cost para sa iyong proyekto