Multibahasa untuk headless CMS.
Polylang memberikan situs WordPress alur kerja multibahasa lengkap. PolyLingo membawa alur kerja itu ke Sanity, Contentful, Webflow, Framer, dan setiap headless CMS lainnya — melalui REST API yang dapat diintegrasikan dalam satu sore.
Multibahasa pada headless CMS adalah masalah yang belum terpecahkan.
Sanity memiliki plugin internasionalisasi. Contentful memiliki lokal. Namun keduanya tidak menerjemahkan konten Anda — mereka hanya menyimpannya dalam berbagai bahasa. Mengisi slot bahasa tersebut masih merupakan proses manual. Ekspor konten bahasa Inggris, jalankan melalui alat terjemahan yang merusak teks kaya atau struktur JSON Anda, perbaiki hasilnya, impor kembali, ulangi untuk setiap bahasa. Untuk tim konten aktif yang menerbitkan secara rutin, alur kerja ini tidak dapat diskalakan. Ini juga tidak ada untuk sebagian besar pengaturan kecil, yang berarti konten tersebut tidak pernah diterjemahkan sama sekali.
Arsitektur headless CMS memisahkan manajemen konten dari penyampaian konten. Ini baik untuk fleksibilitas. Namun ini menciptakan celah: CMS menyimpan varian bahasa, tetapi tidak ada yang mengisi varian bahasa tersebut dengan konten terjemahan. Anda harus membangun lapisan itu sendiri.
Sebagian besar tim berakhir dalam dua situasi: mereka menerjemahkan konten secara manual dengan menyalinnya ke DeepL dan menempelkannya kembali (lambat, rawan kesalahan, tidak dapat diskalakan), atau mereka menulis integrasi khusus dengan API terjemahan yang harus mereka pelihara selamanya. Keduanya bukan jawaban yang baik. PolyLingo adalah opsi ketiga yang bersih.
PolyLingo adalah lapisan terjemahan yang hilang dari CMS Anda.
PolyLingo terintegrasi langsung dengan alur kerja publikasi CMS Anda. Atur webhook yang aktif saat konten diterbitkan, kirim konten ke PolyLingo, terima versi terjemahan untuk setiap bahasa, tulis kembali ke CMS Anda. Untuk Sanity, ini hanya beberapa baris dalam aksi server. Untuk Contentful, ini handler webhook. Untuk pengaturan khusus, ini panggilan HTTP. Model terjemahan memahami format konten Anda — Markdown, HTML, JSON, teks kaya — dan mempertahankan struktur sepanjang proses.
Polanya konsisten di setiap CMS: ambil konten dalam bahasa sumber Anda, panggil API PolyLingo dengan semua bahasa target, tulis konten terjemahan kembali ke CMS melalui API manajemen. Ini dijalankan sebagai skrip waktu build, pekerjaan CI, atau handler webhook — mana pun yang sesuai dengan alur kerja Anda.
PolyLingo menangani Markdown, HTML, dan teks biasa, jadi bekerja dengan format apa pun yang digunakan CMS Anda untuk konten kaya. Field terstruktur (judul, isi, kutipan) dapat diterjemahkan secara individual untuk memberi Anda kontrol granular atas field mana yang diterjemahkan.
Sanity + PolyLingo
Plugin Document Internationalization Sanity membuat varian dokumen yang terhubung per lokal. Skrip di bawah mengambil dokumen dasar bahasa Inggris dan membuat varian terjemahan untuk setiap bahasa target secara otomatis.
Bekerja dengan pola i18n tingkat dokumen (satu dokumen per lokal) serta pola tingkat field (semua lokal dalam satu dokumen). Untuk pola tingkat field, lakukan loop pada field daripada dokumen.
// 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 menyimpan varian lokal sebagai field pada entri yang sama. Skrip di bawah menggunakan Contentful Management API untuk mengambil entri bahasa Inggris, menerjemahkannya, dan menulis konten terjemahan langsung ke field spesifik lokal — tanpa perlu salin-tempel manual.
Contentful menggunakan kode lokal BCP 47 (misalnya es-ES bukan es). Peta kode ISO 639-1 PolyLingo ke konfigurasi lokal Contentful Anda sesuai.
// 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 Lokalisasi Webflow (tersedia pada paket CMS dan Business) mendukung konten field spesifik lokal. Skrip di bawah mengambil item koleksi CMS, menerjemahkan field isi HTML, dan menulis terjemahan kembali ke setiap varian lokal melalui API Webflow v2.
Webflow menyimpan field teks kaya sebagai HTML. Terjemahan HTML PolyLingo mempertahankan semua markup yang dihasilkan Webflow — kelas khusus, atribut, dan elemen tertanam — tanpa perubahan.
// 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 } }) }
)
}
}Apa yang PolyLingo berikan kepada pengguna headless CMS
- ✓Sanity — terjemahkan saat publikasi melalui webhook, tulis kembali ke lokal dokumen
- ✓Contentful — terjemahkan entri secara otomatis saat lokal bahasa Inggris diperbarui
- ✓Webflow — terjemahkan item koleksi CMS melalui API
- ✓Headless CMS apa pun dengan API — pola integrasi sama
- ✓Teks kaya, Markdown, dan HTML semua dipertahankan dengan benar
- ✓Semua 36 bahasa dalam satu permintaan — tanpa panggilan per bahasa
- ✓Bekerja dengan CMS apa pun yang memiliki API manajemen
- ✓Konten dapat diterjemahkan ulang setiap kali publikasi — tanpa sinkronisasi manual
Alur kerja CMS multibahasa standar
Tulis konten dalam bahasa sumber Anda
Buat dan terbitkan konten dalam bahasa Inggris (atau bahasa sumber Anda). CMS Anda menyimpan ini sebagai versi otoritatif. Anda tidak perlu mengubah alur kerja editorial sama sekali.
Jalankan skrip terjemahan
Jalankan skrip secara manual, terjadwal, atau melalui webhook yang dipicu oleh event publikasi konten di CMS Anda. Skrip memanggil PolyLingo sekali per dokumen dengan semua bahasa target, lalu menulis semua terjemahan kembali ke CMS Anda sekaligus.
Deploy — konten terjemahan sudah aktif
Frontend Anda membaca konten spesifik lokal dari CMS seperti biasa. Tidak perlu perubahan kode frontend. Konten terjemahan muncul dalam bahasa yang benar untuk setiap rute lokal.
Untuk siapa ini dibuat
Tim konten di Sanity atau Contentful
Editor Anda menerbitkan dalam bahasa Inggris. Konten terjemahan muncul di semua lokal secara otomatis, tanpa tim editor perlu berinteraksi dengan alat terjemahan.
Agen yang membangun situs multibahasa
Setiap situs klien yang Anda buat membutuhkan dukungan multibahasa. PolyLingo memberi Anda integrasi yang dapat digunakan ulang dan dapat ditagih yang bekerja di semua headless CMS dalam tumpukan Anda.
E-commerce dengan konten produk yang dilokalkan
Deskripsi produk, halaman kategori, dan konten blog — semua diterjemahkan otomatis saat diterbitkan. Gabungkan dengan harga spesifik lokal untuk memberikan pengalaman belanja yang sepenuhnya dilokalkan.
Pertanyaan yang sering diajukan tentang headless CMS multibahasa
Apakah PolyLingo bekerja dengan CMS yang tidak tercantum di sini?
Ya. CMS apa pun dengan API manajemen dapat diintegrasikan menggunakan pola yang sama — ambil konten, panggil PolyLingo, tulis kembali. Prismic, Storyblok, DatoCMS, Strapi, Ghost, dan Directus semuanya memiliki API manajemen dan bekerja dengan pendekatan ini. Contoh integrasi untuk Sanity, Contentful, dan Webflow di atas menggambarkan pola tersebut.
Bisakah saya menerjemahkan teks kaya dengan gambar dan tautan tertanam?
Ya. Terjemahan HTML mempertahankan semua elemen tertanam termasuk gambar (atribut src dan alt ditangani dengan benar), tautan (href dipertahankan, teks tautan diterjemahkan), dan iframe. Satu-satunya pengecualian adalah konten yang secara eksplisit ditandai sebagai tidak dapat diterjemahkan — blok kode, misalnya, tidak pernah diterjemahkan.
Bagaimana saya menangani konten yang tidak boleh diterjemahkan?
Untuk konten terstruktur dengan field yang tidak dapat diterjemahkan (slug, tanggal, pengenal teknis), kirim hanya field yang ingin Anda terjemahkan. Untuk teks kaya dengan bagian yang dapat dan tidak dapat diterjemahkan campur aduk, gunakan format HTML — PolyLingo akan menerjemahkan konten teks sambil mempertahankan blok kode dan elemen terstruktur lainnya secara otomatis.
Bagaimana jika CMS saya memiliki tipe konten bersarang?
Untuk konten yang sangat bersarang (dokumen dengan referensi ke dokumen lain), terjemahkan setiap tipe dokumen secara independen. Ini menghindari referensi melingkar dan memberi Anda kontrol bersih atas konten mana yang diterjemahkan. Referensi antar dokumen dipertahankan oleh CMS — PolyLingo hanya menyentuh konten field, bukan hubungan dokumen.
Bagaimana saya menjaga terjemahan tetap sinkron saat konten sumber berubah?
Polanya adalah memicu skrip terjemahan pada setiap event publikasi melalui webhook CMS. Ini memastikan konten terjemahan diperbarui setiap kali sumber berubah. Untuk pembaruan konten yang lebih jarang, menjalankan skrip secara terjadwal malam hari atau sebelum setiap deployment produksi juga efektif.
Apakah ada cara menandai terjemahan sebagai "perlu ditinjau" daripada langsung dipublikasikan?
Ini tergantung CMS Anda. Contentful dan Sanity keduanya mendukung status draft — Anda dapat menulis konten terjemahan sebagai draft daripada langsung dipublikasikan, memungkinkan tinjauan manusia sebelum setiap lokal aktif. Contoh skrip di atas menggunakan publish/create langsung; ubah langkah akhir untuk membuat draft sebagai gantinya untuk alur kerja tinjauan.
Panduan terkait
Terjemahkan HTML tanpa merusak markup
Bagaimana PolyLingo menangani HTML yang dihasilkan CMS dengan pelestarian tag penuh.
Tambahkan multibahasa ke Next.js
Gabungkan terjemahan konten headless CMS dengan terjemahan string UI next-intl.
Alternatif Polylang untuk tumpukan modern
Migrasi alur kerja multibahasa dari WordPress ke pengaturan headless.
Tambahkan multibahasa ke headless CMS Anda hari ini.
Tingkat gratis. 100.000 token per bulan. Tidak perlu kartu kredit.
Mulai terjemahkan gratisTingkat gratis — 100.000 token per bulan. Bekerja dengan CMS apa pun.