Jika anda pernah bekerja dengan framework pengantarabangsaan (i18n) terbina dalam Django, anda tahu ia mengendalikan rentetan statik dengan baik. Membungkus teks dalam gettext() atau menggunakan tag templat {% trans %} mengekstrak rentetan ke dalam fail .po, yang kemudian diisi oleh penterjemah. Sistem ini telah terbukti kukuh dan berfungsi dengan baik untuk kod dan templat.
Tetapi bagaimana pula dengan kandungan yang disimpan dalam pangkalan data anda?
Nama produk, tajuk artikel, penerangan kategori, jawapan FAQ, kandungan yang dijana pengguna. Tiada satu pun yang wujud dalam kod sumber anda. Perintah makemessages Django tidak akan menemuinya, dan fail .po tidak dapat membantu anda di sini. Jika aplikasi anda menyajikan kandungan dinamik kepada pengguna dalam pelbagai bahasa, anda memerlukan strategi yang berbeza.
Begini caranya: gunakan django-modeltranslation untuk menambah medan yang boleh diterjemah pada model anda, kemudian automatikkan terjemahan dengan AI menggunakan TranslateBot.
Pakej Terjemahan Pangkalan Data Django
Beberapa pakej pihak ketiga menyelesaikan masalah terjemahan pangkalan data, masing-masing dengan seni bina yang berbeza.
django-modeltranslation
Menambah lajur khusus bahasa terus ke dalam jadual sedia ada anda. Medan title menjadi title_en, title_de, title_fr, dan seterusnya. Pertanyaan kekal pantas kerana semuanya berada dalam jadual yang sama. Antara muka admin menunjukkan semua bahasa secara bersebelahan.
- Kelebihan: Tiada JOIN, pertanyaan pantas, akses telus melalui deskriptor medan, ekosistem matang
- Kekurangan: Perubahan skema untuk setiap bahasa baharu, jadual lebih lebar
django-parler
Mencipta jadual terjemahan berasingan untuk setiap model. Jadual asal kekal bersih, dan terjemahan disimpan dalam jadual berkaitan yang disambung melalui kunci asing.
- Kelebihan: Skema bersih, mudah menambah bahasa tanpa migrasi
- Kekurangan: Memerlukan JOIN untuk kandungan terjemahan, corak pertanyaan sedikit lebih kompleks
django-translations
Menggunakan satu jadual terjemahan dengan kunci asing generik yang menunjuk kembali ke mana-mana model. Semua terjemahan untuk semua model masuk ke dalam satu jadual.
- Kelebihan: Perubahan skema minimum, berfungsi dengan mana-mana model
- Kekurangan: Pertanyaan kunci asing generik boleh menjadi perlahan, API kurang telus
Medan JSON Manual
Anda boleh menyimpan terjemahan dalam JSONField:
class Product(models.Model):
name_translations = models.JSONField(default=dict)
# {"en": "Running Shoes", "de": "Laufschuhe", "fr": "Chaussures de course"}
- Kelebihan: Tiada kebergantungan tambahan, fleksibel
- Kekurangan: Tiada integrasi ORM, tiada sokongan admin, semuanya manual
Yang Mana Patut Anda Gunakan?
Untuk kebanyakan projek, django-modeltranslation adalah pilihan terbaik. Ia adalah pakej paling matang, mempunyai integrasi admin Django yang terbaik, dan menyimpan semua data dalam jadual yang sama untuk pertanyaan pantas. Kompromi (jadual lebih lebar dan migrasi untuk setiap bahasa baharu) boleh diurus untuk majoriti aplikasi. Selebihnya panduan ini menggunakan django-modeltranslation.
Menyediakan django-modeltranslation Langkah demi Langkah
Langkah 1: Pasang Pakej
TranslateBot menggabungkan django-modeltranslation sebagai kebergantungan pilihan. Pasang kedua-duanya sekaligus:
pip install translatebot-django[modeltranslation]
Atau jika anda menggunakan uv:
uv add --dev translatebot-django[modeltranslation]
Langkah 2: Konfigurasikan Tetapan Django
Dua perkara penting dalam settings.py: susunan aplikasi dan senarai 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 mesti diletakkan sebelum django.contrib.admin supaya ia dapat menampal kelas admin untuk menunjukkan medan terjemahan.
Langkah 3: Daftarkan Model untuk Terjemahan
Cipta fail translation.py dalam setiap aplikasi yang mempunyai model boleh diterjemah. Untuk aplikasi kedai e-dagang:
# 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 medan yang mengandungi teks boleh dibaca manusia. Jangan daftarkan medan seperti slug, price, atau sku.
Langkah 4: Cipta dan Jalankan Migrasi
python manage.py makemigrations
python manage.py migrate
Selepas ini, jadual shop_product anda mempunyai lajur baharu:
| 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 |
Setiap bahasa yang anda tetapkan dalam LANGUAGES mendapat lajurnya sendiri untuk setiap medan yang didaftarkan.
Masalahnya: Medan Terjemahan Kosong
Anda kini mempunyai skema yang sedia, tetapi setiap lajur _de, _fr, dan _nl kosong. Jika anda mempunyai 500 produk dengan 3 medan boleh diterjemah dan 3 bahasa sasaran, itu 4,500 medan kosong yang menunggu untuk diisi.
Menterjemah kandungan itu secara manual tidak realistik. Walaupun dengan perkhidmatan terjemahan profesional, anda perlu mengeksport data, menghantarnya, menunggu penghantaran, dan mengimport keputusan kembali. Untuk pasukan kecil atau pembangun solo, ini biasanya bermakna ciri tersebut tidak pernah dilancarkan.
Di sinilah TranslateBot masuk.
Mengautomatikkan Terjemahan dengan TranslateBot
Perintah pengurusan translate TranslateBot boleh mengisi semua medan kosong tersebut menggunakan AI. Konfigurasikan kunci API anda terlebih dahulu:
# settings.py
TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini" # Fast and cost-effective
Kemudian terjemahkan semua model berdaftar ke bahasa sasaran:
python manage.py translate --target-lang de --models
Satu perintah itu mencari setiap model yang didaftarkan dengan django-modeltranslation, mengenal pasti medan yang kosong untuk bahasa sasaran, dan mengisinya dengan terjemahan yang dijana AI.
Terjemah Model Tertentu
Jika anda hanya mahu menterjemah 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
Pratonton dengan Dry Run
Sentiasa pratonton sebelum menulis ke pangkalan data:
python manage.py translate --target-lang de --models --dry-run
Ini menunjukkan kepada anda dengan tepat apa yang akan diterjemahkan tanpa mengubah sebarang rekod.
Terjemah Semula Kandungan Sedia Ada
Secara lalai, TranslateBot melangkau medan yang sudah mempunyai terjemahan. Untuk menimpa terjemahan sedia ada (contohnya, selepas menambah baik model AI anda atau menambah konteks):
python manage.py translate --target-lang de --models --overwrite
Terjemah Semua Bahasa Sekaligus
Jika anda meninggalkan --target-lang dan mempunyai LANGUAGES yang ditakrifkan dalam tetapan anda, TranslateBot menterjemah ke semua bahasa yang dikonfigurasikan:
python manage.py translate --models
Bagaimana Pipeline Terjemahan Berfungsi
Inilah yang berlaku apabila anda menjalankan perintah translate.
-
Penemuan. TranslateBot mempertanyakan registri django-modeltranslation untuk mencari semua model berdaftar dan medan boleh diterjemah mereka.
-
Pengesanan sumber. Untuk setiap rekod, ia membaca kandungan sumber. Ia menyemak medan asas terlebih dahulu (contohnya,
name), kemudian kembali ke medan khusus bahasa pertama yang diisi (contohnya,name_en). Rekod tanpa kandungan sumber dilangkau. -
Pengelompokan. Rekod dikumpulkan ke dalam kelompok dan dihantar ke penyedia AI. Ini memastikan panggilan API kekal cekap dan mengelak daripada mencapai had kadar.
-
Terjemahan. Setiap kelompok diterjemahkan menggunakan model AI yang dikonfigurasikan. Anda boleh menggunakan mana-mana penyedia LLM yang disokong oleh LiteLLM (OpenAI, Anthropic, Google, Azure, dan banyak lagi) atau DeepL.
-
Penulisan atomik. Semua kemas kini pangkalan data untuk sesi terjemahan dibungkus dalam satu transaksi. Jika apa-apa berlaku, seperti ralat API atau pelanggaran kekangan pangkalan data, tiada data separa disimpan. Semua atau tiada.
Contoh Aliran Kerja Lengkap
Berikut adalah contoh penuh dari definisi model hingga kandungan terjemahan, menggunakan model Product e-dagang.
Takrifkan 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
Tambah Konteks Terjemahan (Pilihan)
Cipta fail TRANSLATING.md di akar projek anda untuk memberi AI konteks 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
Terjemah
# 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
Sahkan dalam Admin
Buka admin Django dan pergi ke mana-mana produk. Anda akan melihat medan terjemahan telah diisi:
- 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 sasaran:
python manage.py translate --target-lang fr --models Product
python manage.py translate --target-lang nl --models Product
Atau terjemah semua bahasa sekaligus:
python manage.py translate --models Product
Amalan Terbaik
Sandarkan pangkalan data anda sebelum menjalankan terjemahan pukal pada pengeluaran. TranslateBot menggunakan transaksi atomik, jadi sesi yang gagal tidak akan meninggalkan data separa. Tetapi mempunyai sandaran memberi anda cara untuk kembali jika kualiti terjemahan tidak seperti yang dijangkakan.
# PostgreSQL example
pg_dump mydb > backup_before_translation.sql
Gunakan dry run dahulu. Sentiasa jalankan dengan --dry-run sebelum menerapkan terjemahan pada model atau bahasa baharu. Semak output untuk memastikan kandungan sumber dikesan dengan betul dan terjemahan kelihatan munasabah.
Terjemah satu model pada satu masa untuk pangkalan data besar. Ini memudahkan semakan keputusan dan menjalankan semula model tertentu jika perlu.
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
Tambah konteks terjemahan. Fail TRANSLATING.md dengan terminologi khusus domain dan garis panduan nada meningkatkan kualiti terjemahan dengan ketara. Ini amat penting untuk bidang khusus seperti perubatan, undang-undang, atau produk teknikal.
Pastikan bahasa sumber anda sentiasa diisi. TranslateBot membaca dari medan asas atau medan bahasa sumber. Pastikan aliran kerja kemasukan data anda sentiasa mengisi bahasa sumber. Medan sumber kosong bermakna terjemahan kosong.
Gabungkan dengan terjemahan fail PO untuk liputan penuh. Terjemah kedua-dua rentetan kod dan kandungan pangkalan data:
# 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 rentetan yang dilihat pengguna anda, sama ada daripada templat atau pangkalan data, telah diterjemahkan.
Langkah Seterusnya
- Baca rujukan perintah penuh untuk semua pilihan yang tersedia
- Sediakan integrasi CI untuk menyemak terjemahan yang hilang secara automatik
- Terokai model AI yang disokong untuk mencari keseimbangan terbaik antara kualiti dan kos untuk projek anda