Đa ngôn ngữ cho headless CMS.
Polylang đã mang đến cho các trang WordPress một quy trình làm việc đa ngôn ngữ hoàn chỉnh. PolyLingo mang quy trình đó đến Sanity, Contentful, Webflow, Framer và mọi headless CMS khác — thông qua REST API tích hợp chỉ trong một buổi chiều.
Đa ngôn ngữ cho headless CMS là một vấn đề chưa được giải quyết.
Sanity có plugin quốc tế hóa. Contentful có các vùng ngôn ngữ. Nhưng cả hai đều không dịch nội dung của bạn — chúng chỉ lưu trữ nội dung ở nhiều ngôn ngữ. Việc điền các vị trí ngôn ngữ đó vẫn là một quá trình thủ công. Xuất nội dung tiếng Anh, chạy qua công cụ dịch làm hỏng cấu trúc rich text hoặc JSON của bạn, sửa đầu ra, nhập lại, lặp lại cho từng ngôn ngữ. Với một nhóm nội dung hoạt động xuất bản thường xuyên, quy trình này không thể mở rộng. Nó cũng không tồn tại cho hầu hết các thiết lập nhỏ hơn, nghĩa là nội dung sẽ không bao giờ được dịch.
Kiến trúc headless CMS tách quản lý nội dung khỏi phân phối nội dung. Điều này tốt cho sự linh hoạt. Nhưng nó tạo ra một khoảng trống: CMS lưu các biến thể ngôn ngữ, nhưng không có gì điền các biến thể đó bằng nội dung đã dịch. Bạn phải tự xây dựng lớp đó.
Hầu hết các nhóm rơi vào một trong hai tình huống: họ dịch thủ công bằng cách sao chép vào DeepL rồi dán lại (chậm, dễ sai, không mở rộng được), hoặc họ viết tích hợp tùy chỉnh với API dịch mà họ phải duy trì vô thời hạn. Cả hai đều không phải là giải pháp tốt. PolyLingo là lựa chọn thứ ba sạch sẽ.
PolyLingo là lớp dịch thuật mà CMS của bạn đang thiếu.
PolyLingo tích hợp trực tiếp với quy trình xuất bản CMS của bạn. Thiết lập webhook kích hoạt khi nội dung được xuất bản, gửi nội dung đến PolyLingo, nhận các phiên bản dịch cho mọi ngôn ngữ, ghi lại vào CMS của bạn. Với Sanity, chỉ cần vài dòng trong hành động máy chủ. Với Contentful, đó là một trình xử lý webhook. Với các thiết lập tùy chỉnh, đó là một cuộc gọi HTTP. Mô hình dịch hiểu định dạng nội dung của bạn — Markdown, HTML, JSON, rich text — và giữ nguyên cấu trúc xuyên suốt.
Mẫu này nhất quán trên mọi CMS: lấy nội dung bằng ngôn ngữ nguồn, gọi API PolyLingo với tất cả ngôn ngữ mục tiêu, ghi nội dung dịch lại vào CMS qua API quản lý. Điều này chạy như một script thời gian xây dựng, công việc CI hoặc trình xử lý webhook — tùy theo quy trình làm việc của bạn.
PolyLingo xử lý Markdown, HTML và văn bản thuần, nên hoạt động với bất kỳ định dạng nào CMS của bạn dùng cho nội dung phong phú. Các trường có cấu trúc (tiêu đề, thân bài, trích đoạn) có thể dịch riêng biệt để bạn kiểm soát chi tiết các trường được dịch.
Sanity + PolyLingo
Plugin Document Internationalization của Sanity tạo các biến thể tài liệu liên kết theo từng vùng ngôn ngữ. Script dưới đây lấy các tài liệu gốc tiếng Anh và tự động tạo các biến thể dịch cho mỗi ngôn ngữ mục tiêu.
Hoạt động với mẫu i18n cấp tài liệu (một tài liệu cho mỗi vùng ngôn ngữ) cũng như mẫu cấp trường (tất cả vùng ngôn ngữ trong một tài liệu). Với mẫu cấp trường, lặp qua các trường thay vì tài liệu.
// scripts/translate-sanity.mjs
// Fetches published posts and translates each to all target languages
import { createClient } from '@sanity/client'
const sanity = createClient({
projectId: process.env.SANITY_PROJECT_ID,
dataset: 'production',
token: process.env.SANITY_TOKEN,
apiVersion: '2024-01-01',
useCdn: false,
})
const posts = await sanity.fetch(`*[_type == "post" && __i18n_lang == "en"]`)
for (const post of posts) {
const response = await fetch('https://api.usepolylingo.com/v1/translate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.POLYLINGO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: post.body_markdown,
format: 'markdown',
targets: ['es', 'fr', 'de', 'ja', 'zh'],
}),
})
const { translations } = await response.json()
for (const [lang, content] of Object.entries(translations)) {
await sanity.create({
_type: 'post',
__i18n_lang: lang,
__i18n_base: { _type: 'reference', _ref: post._id },
title: translations[lang + '_title'] || post.title,
slug: { current: `${post.slug.current}-${lang}` },
body_markdown: content,
})
}
}Contentful + PolyLingo
Contentful lưu các biến thể vùng ngôn ngữ dưới dạng các trường trên cùng một mục. Script dưới đây sử dụng Contentful Management API để lấy các mục tiếng Anh, dịch chúng và ghi nội dung dịch trực tiếp vào các trường theo vùng ngôn ngữ — không cần sao chép dán thủ công.
Contentful sử dụng mã vùng ngôn ngữ BCP 47 (ví dụ es-ES thay vì es). Ánh xạ mã ISO 639-1 của PolyLingo với cấu hình vùng ngôn ngữ Contentful của bạn cho phù hợp.
// scripts/translate-contentful.mjs
// Translates Contentful entries to all target locales
import contentful from 'contentful-management'
const client = contentful.createClient({
accessToken: process.env.CONTENTFUL_MANAGEMENT_TOKEN,
})
const space = await client.getSpace(process.env.CONTENTFUL_SPACE_ID)
const env = await space.getEnvironment('master')
const entries = await env.getEntries({ content_type: 'blogPost', locale: 'en-US' })
for (const entry of entries.items) {
const enBody = entry.fields.body['en-US']
const response = await fetch('https://api.usepolylingo.com/v1/translate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.POLYLINGO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: enBody,
format: 'markdown',
targets: ['es-ES', 'fr-FR', 'de-DE'],
}),
})
const { translations } = await response.json()
for (const [locale, content] of Object.entries(translations)) {
entry.fields.body[locale] = content
}
await entry.update()
await entry.publish()
}Webflow + PolyLingo
API Localization của Webflow (có trên các gói CMS và Business) hỗ trợ nội dung trường theo vùng ngôn ngữ. Script dưới đây lấy các mục bộ sưu tập CMS, dịch trường thân bài HTML và ghi bản dịch trở lại từng biến thể vùng ngôn ngữ qua Webflow v2 API.
Webflow lưu các trường rich text dưới dạng HTML. Dịch HTML của PolyLingo giữ nguyên tất cả đánh dấu do Webflow tạo — lớp tùy chỉnh, thuộc tính và phần tử nhúng — không thay đổi.
// scripts/translate-webflow.mjs
// Webflow Localization API + PolyLingo
const headers = {
'Authorization': `Bearer ${process.env.WEBFLOW_API_TOKEN}`,
'accept-version': '2.0.0',
'Content-Type': 'application/json',
}
// Fetch English CMS items
const itemsRes = await fetch(
`https://api.webflow.com/v2/collections/${process.env.WEBFLOW_COLLECTION_ID}/items`,
{ headers }
)
const { items } = await itemsRes.json()
for (const item of items) {
const response = await fetch('https://api.usepolylingo.com/v1/translate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.POLYLINGO_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content: item.fieldData['body-html'],
format: 'html',
targets: ['es', 'fr', 'de'],
}),
})
const { translations } = await response.json()
// Write translated content back to Webflow locale fields
for (const [lang, content] of Object.entries(translations)) {
await fetch(
`https://api.webflow.com/v2/collections/${process.env.WEBFLOW_COLLECTION_ID}/items/${item.id}/locales/${lang}`,
{ method: 'PATCH', headers, body: JSON.stringify({ fieldData: { 'body-html': content } }) }
)
}
}PolyLingo mang lại gì cho người dùng headless CMS
- ✓Sanity — dịch khi xuất bản qua webhook, ghi lại vào các vùng ngôn ngữ tài liệu
- ✓Contentful — tự động dịch các mục khi vùng ngôn ngữ tiếng Anh được cập nhật
- ✓Webflow — dịch các mục bộ sưu tập CMS qua API
- ✓Bất kỳ headless CMS nào có API — mẫu tích hợp giống nhau
- ✓Rich text, Markdown và HTML đều được giữ nguyên chính xác
- ✓Tất cả 36 ngôn ngữ trong một yêu cầu — không gọi riêng từng ngôn ngữ
- ✓Hoạt động với bất kỳ CMS nào có API quản lý
- ✓Nội dung có thể được dịch lại mỗi lần xuất bản — không cần đồng bộ thủ công
Quy trình làm việc CMS đa ngôn ngữ tiêu chuẩn
Viết nội dung bằng ngôn ngữ nguồn của bạn
Tạo và xuất bản nội dung bằng tiếng Anh (hoặc ngôn ngữ nguồn của bạn). CMS của bạn lưu trữ phiên bản chính thức này. Bạn không cần thay đổi quy trình biên tập.
Kích hoạt script dịch
Chạy script thủ công, theo lịch hoặc qua webhook kích hoạt bởi sự kiện xuất bản nội dung trong CMS. Script gọi PolyLingo một lần cho mỗi tài liệu với tất cả ngôn ngữ mục tiêu, sau đó ghi tất cả bản dịch trở lại CMS trong một lần.
Triển khai — nội dung dịch được hiển thị
Frontend của bạn đọc nội dung theo vùng ngôn ngữ từ CMS như bình thường. Không cần thay đổi mã frontend. Nội dung dịch xuất hiện đúng ngôn ngữ cho từng đường dẫn vùng ngôn ngữ.
Dành cho ai
Nhóm nội dung trên Sanity hoặc Contentful
Biên tập viên của bạn xuất bản bằng tiếng Anh. Nội dung dịch tự động xuất hiện ở tất cả vùng ngôn ngữ mà không cần nhóm biên tập tương tác với công cụ dịch.
Các agency xây dựng trang đa ngôn ngữ
Mỗi trang khách hàng bạn xây dựng đều cần hỗ trợ đa ngôn ngữ. PolyLingo cung cấp tích hợp có thể tái sử dụng, có thể tính phí, hoạt động với bất kỳ headless CMS nào trong hệ thống của bạn.
Thương mại điện tử với nội dung sản phẩm địa phương hóa
Mô tả sản phẩm, trang danh mục và nội dung blog — tất cả đều được dịch tự động khi xuất bản. Kết hợp với giá theo vùng để mang lại trải nghiệm mua sắm hoàn toàn địa phương hóa.
Các câu hỏi thường gặp về đa ngôn ngữ cho headless CMS
PolyLingo có hoạt động với các CMS không được liệt kê ở đây không?
Có. Bất kỳ CMS nào có API quản lý đều có thể tích hợp theo mẫu giống nhau — lấy nội dung, gọi PolyLingo, ghi lại. Prismic, Storyblok, DatoCMS, Strapi, Ghost và Directus đều có API quản lý và hoạt động với cách tiếp cận này. Ví dụ tích hợp cho Sanity, Contentful và Webflow ở trên minh họa mẫu này.
Tôi có thể dịch rich text có hình ảnh và liên kết nhúng không?
Có. Dịch HTML giữ nguyên tất cả phần tử nhúng bao gồm hình ảnh (thuộc tính src và alt được xử lý đúng), liên kết (href giữ nguyên, văn bản liên kết được dịch), và iframe. Ngoại lệ duy nhất là nội dung được đánh dấu rõ ràng là không dịch — ví dụ các khối mã không bao giờ được dịch.
Làm sao tôi xử lý nội dung không nên dịch?
Với nội dung có cấu trúc có trường không dịch (slug, ngày tháng, định danh kỹ thuật), chỉ gửi các trường bạn muốn dịch. Với rich text có phần dịch và không dịch lẫn lộn, dùng định dạng HTML — PolyLingo sẽ dịch phần văn bản trong khi giữ nguyên các khối mã và phần tử có cấu trúc khác tự động.
Nếu CMS của tôi có các loại nội dung lồng nhau thì sao?
Với nội dung lồng sâu (tài liệu có tham chiếu đến tài liệu khác), dịch từng loại tài liệu riêng biệt. Điều này tránh tham chiếu vòng và cho bạn kiểm soát rõ ràng các nội dung được dịch. Tham chiếu giữa các tài liệu được CMS duy trì — PolyLingo chỉ xử lý nội dung trường, không ảnh hưởng đến quan hệ tài liệu.
Làm sao giữ bản dịch đồng bộ khi nội dung nguồn thay đổi?
Mẫu được khuyến nghị là kích hoạt script dịch mỗi khi có sự kiện xuất bản qua webhook CMS. Điều này đảm bảo nội dung dịch được cập nhật khi nguồn thay đổi. Với cập nhật nội dung ít thường xuyên hơn, chạy script theo lịch đêm hoặc trước mỗi lần triển khai sản xuất cũng hiệu quả.
Có cách nào đánh dấu bản dịch là "cần xem xét" thay vì xuất bản tự động không?
Điều này phụ thuộc vào CMS của bạn. Contentful và Sanity đều hỗ trợ trạng thái bản nháp — bạn có thể ghi nội dung dịch dưới dạng bản nháp thay vì xuất bản, cho phép xem xét thủ công trước khi mỗi vùng ngôn ngữ được phát hành. Ví dụ script ở trên dùng xuất bản/tạo ngay; bạn có thể sửa bước cuối để tạo bản nháp cho quy trình xem xét.
Hướng dẫn liên quan
Dịch HTML mà không làm hỏng đánh dấu
Cách PolyLingo xử lý HTML do CMS tạo với việc giữ nguyên thẻ đầy đủ.
Thêm đa ngôn ngữ cho Next.js
Kết hợp dịch nội dung headless CMS với dịch chuỗi giao diện next-intl.
Thay thế Polylang cho các hệ thống hiện đại
Di chuyển quy trình đa ngôn ngữ từ WordPress sang thiết lập headless.
Thêm đa ngôn ngữ cho headless CMS của bạn ngay hôm nay.
Gói miễn phí. 100.000 token mỗi tháng. Không cần thẻ tín dụng.
Bắt đầu dịch miễn phíGói miễn phí — 100.000 token mỗi tháng. Hoạt động với mọi CMS.