Kembali ke blog

Cara Menterjemah Kandungan Pangkalan Data Django dengan AI

2026-02-18 8 min baca
Cara Menterjemah Kandungan Pangkalan Data Django dengan AI

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.

django-parler

Mencipta jadual terjemahan berasingan untuk setiap model. Jadual asal kekal bersih, dan terjemahan disimpan dalam jadual berkaitan yang disambung melalui kunci asing.

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.

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"}

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.

  1. Penemuan. TranslateBot mempertanyakan registri django-modeltranslation untuk mencari semua model berdaftar dan medan boleh diterjemah mereka.

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

  3. Pengelompokan. Rekod dikumpulkan ke dalam kelompok dan dihantar ke penyedia AI. Ini memastikan panggilan API kekal cekap dan mengelak daripada mencapai had kadar.

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

  5. 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:

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

Hentikan pengeditan fail .po secara manual

TranslateBot mengautomasikan terjemahan Django dengan AI. Satu arahan, semua bahasa anda, sen sahaja setiap terjemahan.