Jika Anda pernah bekerja dengan framework internasionalisasi (i18n) bawaan Django, Anda tahu framework ini menangani string statis dengan baik. Membungkus teks dalam gettext() atau menggunakan tag template {% trans %} mengekstrak string ke file .po, yang diisi oleh penerjemah. Sistemnya sudah teruji dan bekerja sangat baik untuk kode dan template.
Tapi bagaimana dengan konten yang disimpan di database Anda?
Nama produk, judul artikel, deskripsi kategori, jawaban FAQ, konten buatan pengguna. Semua ini tidak ada di kode sumber Anda. Perintah makemessages Django tidak akan pernah menemukannya, dan file .po tidak bisa membantu Anda di sini. Jika aplikasi Anda menyajikan konten dinamis kepada pengguna dalam berbagai bahasa, Anda membutuhkan strategi yang berbeda.
Begini caranya: gunakan django-modeltranslation untuk menambahkan field yang dapat diterjemahkan ke model Anda, lalu otomatiskan terjemahan dengan AI menggunakan TranslateBot.
Paket Terjemahan Database Django
Beberapa paket pihak ketiga menyelesaikan masalah terjemahan database, masing-masing dengan arsitektur yang berbeda.
django-modeltranslation
Menambahkan kolom khusus bahasa langsung ke tabel yang sudah ada. Field title menjadi title_en, title_de, title_fr, dan seterusnya. Query tetap cepat karena semuanya ada di tabel yang sama. Antarmuka admin menampilkan semua bahasa secara berdampingan.
- Kelebihan: Tanpa JOIN, query cepat, akses transparan melalui field descriptor, ekosistem matang
- Kekurangan: Perubahan skema untuk setiap bahasa baru, tabel lebih lebar
django-parler
Membuat tabel terjemahan terpisah untuk setiap model. Tabel asli tetap bersih, dan terjemahan disimpan di tabel terkait yang dihubungkan melalui foreign key.
- Kelebihan: Skema bersih, mudah menambah bahasa tanpa migrasi
- Kekurangan: Membutuhkan JOIN untuk konten terjemahan, pola query sedikit lebih kompleks
django-translations
Menggunakan satu tabel terjemahan dengan generic foreign key yang menunjuk ke model apa pun. Semua terjemahan untuk semua model masuk ke satu tabel.
- Kelebihan: Perubahan skema minimal, bekerja dengan model apa pun
- Kekurangan: Query generic foreign key bisa lambat, API kurang transparan
Field JSON Manual
Anda bisa menyimpan terjemahan dalam JSONField:
class Product(models.Model):
name_translations = models.JSONField(default=dict)
# {"en": "Running Shoes", "de": "Laufschuhe", "fr": "Chaussures de course"}
- Kelebihan: Tanpa dependensi tambahan, fleksibel
- Kekurangan: Tanpa integrasi ORM, tanpa dukungan admin, semuanya manual
Mana yang Harus Anda Gunakan?
Untuk sebagian besar proyek, django-modeltranslation adalah pilihan terbaik. Ini adalah paket paling matang, memiliki integrasi admin Django terbaik, dan menyimpan semua data di tabel yang sama untuk query cepat. Komprominya (tabel lebih lebar dan migrasi per bahasa baru) dapat dikelola untuk sebagian besar aplikasi. Sisa panduan ini menggunakan django-modeltranslation.
Menyiapkan django-modeltranslation Langkah demi Langkah
Langkah 1: Instal Paket
TranslateBot menyertakan django-modeltranslation sebagai dependensi opsional. Instal keduanya sekaligus:
pip install translatebot-django[modeltranslation]
Atau jika Anda menggunakan uv:
uv add --dev translatebot-django[modeltranslation]
Langkah 2: Konfigurasi Pengaturan Django
Dua hal yang penting di settings.py: urutan aplikasi dan daftar bahasa.
# 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'),
]
Aplikasi modeltranslation harus ditempatkan sebelum django.contrib.admin agar dapat mem-patch kelas admin untuk menampilkan field terjemahan.
Langkah 3: Daftarkan Model untuk Terjemahan
Buat file translation.py di setiap aplikasi yang memiliki model yang dapat diterjemahkan. Untuk aplikasi toko e-commerce:
# 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')
Hanya sertakan field yang berisi teks yang dapat dibaca manusia. Jangan daftarkan field seperti slug, price, atau sku.
Langkah 4: Buat dan Jalankan Migrasi
python manage.py makemigrations
python manage.py migrate
Setelah ini, tabel shop_product Anda memiliki kolom baru:
| Kolom | Tipe |
|---|---|
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 |
Setiap bahasa yang Anda definisikan di LANGUAGES mendapat kolomnya sendiri untuk setiap field yang terdaftar.
Masalahnya: Field Terjemahan yang Kosong
Sekarang Anda sudah memiliki skema, tapi setiap kolom _de, _fr, dan _nl kosong. Jika Anda memiliki 500 produk dengan 3 field yang dapat diterjemahkan dan 3 bahasa target, itu berarti 4.500 field kosong yang menunggu untuk diisi.
Menerjemahkan konten tersebut secara manual tidak realistis. Bahkan dengan layanan terjemahan profesional, Anda perlu mengekspor data, mengirimkannya, menunggu pengiriman, dan mengimpor hasilnya kembali. Untuk tim kecil atau pengembang solo, ini biasanya berarti fitur tersebut tidak pernah diluncurkan.
Di sinilah TranslateBot berperan.
Mengotomatiskan Terjemahan dengan TranslateBot
Perintah manajemen translate dari TranslateBot dapat mengisi semua field kosong tersebut menggunakan AI. Konfigurasi API key Anda terlebih dahulu:
# settings.py
TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini" # Fast and cost-effective
Lalu terjemahkan semua model terdaftar ke bahasa target:
python manage.py translate --target-lang de --models
Perintah tunggal itu menemukan setiap model yang terdaftar di django-modeltranslation, mengidentifikasi field yang kosong untuk bahasa target, dan mengisinya dengan terjemahan yang dihasilkan AI.
Terjemahkan Model Tertentu
Jika Anda hanya ingin menerjemahkan produk dan bukan kategori:
python manage.py translate --target-lang de --models Product
Atau beberapa model tertentu:
python manage.py translate --target-lang de --models Product Category
Pratinjau dengan Dry Run
Selalu pratinjau sebelum menulis ke database:
python manage.py translate --target-lang de --models --dry-run
Ini menunjukkan persis apa yang akan diterjemahkan tanpa memodifikasi record apa pun.
Terjemahkan Ulang Konten yang Sudah Ada
Secara default, TranslateBot melewati field yang sudah memiliki terjemahan. Untuk menimpa terjemahan yang sudah ada (misalnya, setelah meningkatkan model AI atau menambahkan konteks):
python manage.py translate --target-lang de --models --overwrite
Terjemahkan Semua Bahasa Sekaligus
Jika Anda menghilangkan --target-lang dan memiliki LANGUAGES yang didefinisikan di pengaturan, TranslateBot menerjemahkan ke semua bahasa yang dikonfigurasi:
python manage.py translate --models
Cara Kerja Pipeline Terjemahan
Inilah yang terjadi saat Anda menjalankan perintah terjemahan.
-
Penemuan. TranslateBot meng-query registri django-modeltranslation untuk menemukan semua model terdaftar dan field yang dapat diterjemahkan.
-
Deteksi sumber. Untuk setiap record, dibaca konten sumbernya. Pertama memeriksa field dasar (misalnya,
name), lalu mundur ke field khusus bahasa pertama yang terisi (misalnya,name_en). Record tanpa konten sumber dilewati. -
Pengelompokan. Record dikelompokkan ke dalam batch dan dikirim ke penyedia AI. Ini menjaga panggilan API tetap efisien dan menghindari batas rate.
-
Terjemahan. Setiap batch diterjemahkan menggunakan model AI yang dikonfigurasi. Anda dapat menggunakan penyedia LLM apa pun yang didukung oleh LiteLLM (OpenAI, Anthropic, Google, Azure, dan banyak lainnya) atau DeepL.
-
Penulisan atomik. Semua pembaruan database untuk satu kali terjemahan dibungkus dalam satu transaksi. Jika terjadi kesalahan, seperti error API atau pelanggaran constraint database, tidak ada data parsial yang disimpan. Semua atau tidak sama sekali.
Contoh Alur Kerja Lengkap
Berikut contoh lengkap dari definisi model hingga konten terjemahan, menggunakan model Product e-commerce.
Definisikan 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
Daftarkan untuk Terjemahan
# shop/translation.py
from modeltranslation.translator import register, TranslationOptions
from .models import Product
@register(Product)
class ProductTranslationOptions(TranslationOptions):
fields = ('name', 'description', 'short_description')
Jalankan Migrasi
python manage.py makemigrations shop
python manage.py migrate
Tambahkan Konteks Terjemahan (Opsional)
Buat file TRANSLATING.md di root proyek Anda untuk memberikan konteks AI tentang domain produk Anda:
# 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
Terjemahkan
# 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
Verifikasi di Admin
Buka admin Django dan buka produk mana saja. Anda akan melihat field terjemahan sudah terisi:
- Name [de]: Ultraleichte Trail-Laufschuhe
- Description [de]: Diese leichten Trail-Laufschuhe bieten hervorragenden Grip...
- Short description [de]: Leicht, schnell und griffig auf jedem Untergrund.
Ulangi untuk setiap bahasa target:
python manage.py translate --target-lang fr --models Product
python manage.py translate --target-lang nl --models Product
Atau terjemahkan semua bahasa sekaligus:
python manage.py translate --models Product
Praktik Terbaik
Cadangkan database Anda sebelum menjalankan terjemahan massal di produksi. TranslateBot menggunakan transaksi atomik, jadi eksekusi yang gagal tidak akan meninggalkan data parsial. Tapi memiliki cadangan memberi Anda cara untuk kembali jika kualitas terjemahan tidak sesuai harapan.
# PostgreSQL example
pg_dump mydb > backup_before_translation.sql
Gunakan dry run terlebih dahulu. Selalu jalankan dengan --dry-run sebelum menerapkan terjemahan ke model atau bahasa baru. Tinjau output untuk memastikan konten sumber terdeteksi dengan benar dan terjemahan terlihat masuk akal.
Terjemahkan satu model pada satu waktu untuk database besar. Ini memudahkan peninjauan hasil dan menjalankan ulang model tertentu jika diperlukan.
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
Tambahkan konteks terjemahan. File TRANSLATING.md dengan terminologi khusus domain dan panduan nada secara signifikan meningkatkan kualitas terjemahan. Ini sangat penting untuk bidang khusus seperti kedokteran, hukum, atau produk teknis.
Jaga bahasa sumber Anda tetap terisi. TranslateBot membaca dari field dasar atau field bahasa sumber. Pastikan alur kerja entri data Anda selalu mengisi bahasa sumber. Field sumber kosong berarti terjemahan kosong.
Kombinasikan dengan terjemahan file PO untuk cakupan penuh. Terjemahkan string kode dan konten database Anda:
# 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
Dengan cara ini setiap string yang dilihat pengguna Anda, baik dari template maupun database, sudah diterjemahkan.
Langkah Selanjutnya
- Baca referensi perintah lengkap untuk semua opsi yang tersedia
- Siapkan integrasi CI untuk memeriksa terjemahan yang hilang secara otomatis
- Jelajahi model AI yang didukung untuk menemukan keseimbangan terbaik antara kualitas dan biaya untuk proyek Anda