Quay lại blog

Cách Dịch Nội dung Cơ sở Dữ liệu Django bằng AI

2026-02-18 Đọc 10 phút
Cách Dịch Nội dung Cơ sở Dữ liệu Django bằng AI

Nếu bạn đã làm việc với framework quốc tế hóa (i18n) tích hợp của Django, bạn biết nó xử lý các chuỗi tĩnh rất tốt. Bọc văn bản trong gettext() hoặc sử dụng thẻ template {% trans %} sẽ trích xuất các chuỗi vào file .po, để các dịch giả điền vào. Hệ thống này đã được thử nghiệm thực chiến và hoạt động tuyệt vời cho mã nguồn và template.

Nhưng còn nội dung được lưu trữ trong cơ sở dữ liệu của bạn thì sao?

Tên sản phẩm, tiêu đề bài viết, mô tả danh mục, câu trả lời FAQ, nội dung do người dùng tạo. Không có gì trong số này nằm trong mã nguồn của bạn. Lệnh makemessages của Django sẽ không bao giờ tìm thấy chúng, và file .po không thể giúp bạn ở đây. Nếu ứng dụng của bạn phục vụ nội dung động cho người dùng bằng nhiều ngôn ngữ, bạn cần một chiến lược khác.

Đây là cách thực hiện: sử dụng django-modeltranslation để thêm các trường có thể dịch vào model của bạn, sau đó tự động hóa việc dịch bằng AI sử dụng TranslateBot.

Các Package Dịch Cơ Sở Dữ Liệu Django

Một số package bên thứ ba giải quyết vấn đề dịch cơ sở dữ liệu, mỗi package có kiến trúc khác nhau.

django-modeltranslation

Thêm các cột theo ngôn ngữ trực tiếp vào bảng hiện có của bạn. Trường title trở thành title_en, title_de, title_fr, v.v. Truy vấn vẫn nhanh vì mọi thứ đều ở cùng một bảng. Giao diện admin hiển thị tất cả các ngôn ngữ cạnh nhau.

django-parler

Tạo bảng dịch riêng cho mỗi model. Bảng gốc giữ nguyên sạch sẽ, và các bản dịch được lưu trong bảng liên quan qua khóa ngoại.

django-translations

Sử dụng một bảng dịch duy nhất với khóa ngoại tổng quát trỏ đến bất kỳ model nào. Tất cả bản dịch của tất cả model đều vào một bảng.

Trường JSON Thủ Công

Bạn có thể lưu trữ bản dịch trong JSONField:

class Product(models.Model):
    name_translations = models.JSONField(default=dict)
    # {"en": "Running Shoes", "de": "Laufschuhe", "fr": "Chaussures de course"}

Bạn Nên Sử Dụng Cái Nào?

Với hầu hết các dự án, django-modeltranslation là lựa chọn tốt nhất. Đây là package trưởng thành nhất, có tích hợp Django admin tốt nhất, và giữ tất cả dữ liệu trong cùng một bảng cho truy vấn nhanh. Sự đánh đổi (bảng rộng hơn và một migration cho mỗi ngôn ngữ mới) có thể quản lý được cho đại đa số ứng dụng. Phần còn lại của hướng dẫn này sử dụng django-modeltranslation.

Thiết Lập django-modeltranslation Từng Bước

Bước 1: Cài Đặt Package

TranslateBot đóng gói django-modeltranslation như một dependency tùy chọn. Cài đặt cả hai cùng lúc:

pip install translatebot-django[modeltranslation]

Hoặc nếu bạn dùng uv:

uv add --dev translatebot-django[modeltranslation]

Bước 2: Cấu Hình Cài Đặt Django

Hai điều quan trọng trong settings.py: thứ tự app và danh sách ngôn ngữ.

# 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'),
]

App modeltranslation phải đứng trước django.contrib.admin để có thể patch các class admin nhằm hiển thị các trường dịch.

Bước 3: Đăng Ký Model Để Dịch

Tạo file translation.py trong mỗi app có model cần dịch. Cho app cửa hàng thương mại điện tử:

# 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')

Chỉ bao gồm các trường chứa văn bản mà con người đọc được. Không đăng ký các trường như slug, price, hoặc sku.

Bước 4: Tạo và Chạy Migration

python manage.py makemigrations
python manage.py migrate

Sau đó, bảng shop_product của bạn có các cột mới:

Cột Kiểu
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

Mỗi ngôn ngữ bạn định nghĩa trong LANGUAGES sẽ có cột riêng cho mỗi trường đã đăng ký.

Vấn Đề: Các Trường Dịch Trống

Bây giờ bạn đã có schema, nhưng mọi cột _de, _fr, và _nl đều trống. Nếu bạn có 500 sản phẩm với 3 trường có thể dịch và 3 ngôn ngữ đích, đó là 4.500 trường trống đang chờ được điền.

Dịch thủ công nội dung đó không thực tế. Ngay cả với dịch vụ dịch thuật chuyên nghiệp, bạn cần xuất dữ liệu, gửi đi, chờ giao hàng, và nhập kết quả trở lại. Với một nhóm nhỏ hoặc lập trình viên đơn lẻ, điều này thường có nghĩa là tính năng không bao giờ được phát hành.

Đây là lúc TranslateBot phát huy tác dụng.

Tự Động Hóa Dịch Thuật Với TranslateBot

Lệnh quản lý translate của TranslateBot có thể điền tất cả các trường trống đó bằng AI. Cấu hình API key của bạn trước:

# settings.py

TRANSLATEBOT_API_KEY = os.getenv("OPENAI_API_KEY")
TRANSLATEBOT_MODEL = "gpt-4o-mini"  # Fast and cost-effective

Sau đó dịch tất cả model đã đăng ký sang ngôn ngữ đích:

python manage.py translate --target-lang de --models

Lệnh duy nhất đó tìm mọi model đã đăng ký với django-modeltranslation, xác định các trường trống cho ngôn ngữ đích, và điền chúng bằng bản dịch do AI tạo.

Dịch Model Cụ Thể

Nếu bạn chỉ muốn dịch sản phẩm chứ không phải danh mục:

python manage.py translate --target-lang de --models Product

Hoặc nhiều model cụ thể:

python manage.py translate --target-lang de --models Product Category

Xem Trước Với Dry Run

Luôn xem trước trước khi ghi vào cơ sở dữ liệu:

python manage.py translate --target-lang de --models --dry-run

Điều này cho bạn thấy chính xác những gì sẽ được dịch mà không sửa đổi bất kỳ bản ghi nào.

Dịch Lại Nội Dung Hiện Có

Theo mặc định, TranslateBot bỏ qua các trường đã có bản dịch. Để ghi đè bản dịch hiện có (ví dụ, sau khi cải thiện model AI hoặc thêm ngữ cảnh):

python manage.py translate --target-lang de --models --overwrite

Dịch Tất Cả Ngôn Ngữ Cùng Lúc

Nếu bạn bỏ qua --target-lang và có LANGUAGES được định nghĩa trong cài đặt, TranslateBot sẽ dịch sang tất cả ngôn ngữ đã cấu hình:

python manage.py translate --models

Cách Pipeline Dịch Hoạt Động

Đây là những gì xảy ra khi bạn chạy lệnh dịch.

  1. Khám phá. TranslateBot truy vấn registry của django-modeltranslation để tìm tất cả model đã đăng ký và các trường có thể dịch của chúng.

  2. Phát hiện nguồn. Với mỗi bản ghi, nó đọc nội dung nguồn. Kiểm tra trường cơ sở trước (ví dụ, name), sau đó quay lại trường theo ngôn ngữ đầu tiên có dữ liệu (ví dụ, name_en). Các bản ghi không có nội dung nguồn sẽ bị bỏ qua.

  3. Chia lô. Các bản ghi được nhóm thành các lô và gửi đến nhà cung cấp AI. Điều này giữ cho các cuộc gọi API hiệu quả và tránh vượt giới hạn tốc độ.

  4. Dịch. Mỗi lô được dịch bằng model AI đã cấu hình. Bạn có thể sử dụng bất kỳ nhà cung cấp LLM nào được LiteLLM hỗ trợ (OpenAI, Anthropic, Google, Azure, và nhiều hơn nữa) hoặc DeepL.

  5. Ghi nguyên tử. Tất cả cập nhật cơ sở dữ liệu cho một lần chạy dịch được bọc trong một giao dịch duy nhất. Nếu có gì sai, như lỗi API hoặc vi phạm ràng buộc cơ sở dữ liệu, không có dữ liệu một phần nào được lưu. Tất cả hoặc không gì cả.

Ví Dụ Quy Trình Làm Việc Hoàn Chỉnh

Đây là ví dụ đầy đủ từ định nghĩa model đến nội dung đã dịch, sử dụng model Product thương mại điện tử.

Định Nghĩa 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

Đăng Ký Để Dịch

# shop/translation.py

from modeltranslation.translator import register, TranslationOptions
from .models import Product


@register(Product)
class ProductTranslationOptions(TranslationOptions):
    fields = ('name', 'description', 'short_description')

Chạy Migration

python manage.py makemigrations shop
python manage.py migrate

Thêm Ngữ Cảnh Dịch (Tùy Chọn)

Tạo file TRANSLATING.md trong thư mục gốc dự án để cung cấp ngữ cảnh cho AI về lĩnh vực sản phẩm của bạn:

# 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

Dịch

# Preview first
python manage.py translate --target-lang de --models Product --dry-run

# Apply translations
python manage.py translate --target-lang de --models Product

Kết quả:

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

Xác Minh Trong Admin

Mở Django admin và đi đến bất kỳ sản phẩm nào. Bạn sẽ thấy các trường dịch đã được điền:

Lặp lại cho mỗi ngôn ngữ đích:

python manage.py translate --target-lang fr --models Product
python manage.py translate --target-lang nl --models Product

Hoặc dịch tất cả ngôn ngữ cùng lúc:

python manage.py translate --models Product

Các Thực Hành Tốt Nhất

Sao lưu cơ sở dữ liệu trước khi chạy dịch hàng loạt trên production. TranslateBot sử dụng giao dịch nguyên tử, nên một lần chạy thất bại sẽ không để lại dữ liệu một phần. Nhưng có bản sao lưu cho bạn cách quay lại nếu chất lượng dịch không như mong đợi.

# PostgreSQL example
pg_dump mydb > backup_before_translation.sql

Sử dụng dry run trước. Luôn chạy với --dry-run trước khi áp dụng dịch cho model hoặc ngôn ngữ mới. Xem xét kết quả để đảm bảo nội dung nguồn được phát hiện chính xác và bản dịch trông hợp lý.

Dịch từng model một cho cơ sở dữ liệu lớn. Điều này giúp dễ dàng xem xét kết quả và chạy lại các model cụ thể nếu cần.

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

Thêm ngữ cảnh dịch. File TRANSLATING.md với thuật ngữ chuyên ngành và hướng dẫn giọng điệu cải thiện đáng kể chất lượng dịch. Điều này đặc biệt quan trọng cho các lĩnh vực chuyên biệt như y học, luật pháp, hoặc sản phẩm kỹ thuật.

Giữ ngôn ngữ nguồn luôn được điền. TranslateBot đọc từ trường cơ sở hoặc trường ngôn ngữ nguồn. Đảm bảo quy trình nhập liệu của bạn luôn điền ngôn ngữ nguồn. Trường nguồn trống nghĩa là bản dịch trống.

Kết hợp với dịch file PO để bao phủ đầy đủ. Dịch cả chuỗi trong mã và nội dung cơ sở dữ liệu:

# 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

Bằng cách này, mọi chuỗi mà người dùng của bạn nhìn thấy, dù đến từ template hay cơ sở dữ liệu, đều được dịch.

Các Bước Tiếp Theo

Ngừng chỉnh sửa file .po thủ công

TranslateBot tự động hóa bản dịch Django bằng AI. Một lệnh, tất cả ngôn ngữ, chi phí cực thấp mỗi bản dịch.