CMS بدون سر + PolyLingo

چندزبانه برای CMS بدون سر.

Polylang به سایت‌های وردپرس یک جریان کاری کامل چندزبانه داد. PolyLingo آن جریان کاری را به Sanity، Contentful، Webflow، Framer و هر CMS بدون سر دیگری می‌آورد — از طریق یک REST API که در یک بعدازظهر ادغام می‌شود.

Sanity
نمونه ادغام کامل
Contentful
نمونه ادغام کامل
Webflow
نمونه ادغام کامل
36
زبان‌های هدف

چندزبانه CMS بدون سر یک مشکل حل‌نشده است.

Sanity افزونه بین‌المللی‌سازی دارد. Contentful محل‌ها را دارد. اما هیچ‌کدام محتوای شما را ترجمه نمی‌کنند — فقط آن را به چند زبان ذخیره می‌کنند. پر کردن آن جایگاه‌های زبانی هنوز یک فرآیند دستی است. محتوای انگلیسی را صادر کنید، آن را از طریق یک ابزار ترجمه که ساختار متن غنی یا JSON شما را خراب می‌کند بگذرانید، خروجی را اصلاح کنید، دوباره وارد کنید، برای هر زبان تکرار کنید. برای یک تیم محتوای فعال که به طور منظم منتشر می‌کند، این جریان کاری مقیاس‌پذیر نیست. همچنین برای اکثر تنظیمات کوچک‌تر وجود ندارد، که یعنی محتوا اصلاً ترجمه نمی‌شود.

معماری CMS بدون سر مدیریت محتوا را از تحویل محتوا جدا می‌کند. این برای انعطاف‌پذیری خوب است. اما یک شکاف ایجاد می‌کند: CMS نسخه‌های زبانی را ذخیره می‌کند، اما هیچ چیزی آن نسخه‌های زبانی را با محتوای ترجمه شده پر نمی‌کند. شما باید آن لایه را خودتان بسازید.

اکثر تیم‌ها در یکی از دو وضعیت قرار می‌گیرند: یا محتوای خود را به صورت دستی با کپی کردن در DeepL و چسباندن دوباره ترجمه می‌کنند (کند، مستعد خطا، مقیاس‌پذیر نیست)، یا یک ادغام سفارشی با یک API ترجمه می‌نویسند که باید به طور نامحدود نگهداری کنند. هیچ‌کدام پاسخ خوبی نیست. PolyLingo گزینه سوم تمیزی است.

PolyLingo لایه ترجمه‌ای است که CMS شما کم دارد.

PolyLingo مستقیماً با جریان کاری انتشار CMS شما ادغام می‌شود. یک وب‌هوک تنظیم کنید که هنگام انتشار محتوا فعال شود، محتوا را به PolyLingo ارسال کنید، نسخه‌های ترجمه شده برای هر زبان دریافت کنید، آنها را دوباره به CMS خود بنویسید. برای Sanity، این چند خط در یک اکشن سرور است. برای Contentful، یک هندلر وب‌هوک است. برای تنظیمات سفارشی، یک تماس HTTP است. مدل ترجمه قالب محتوای شما را می‌فهمد — Markdown، HTML، JSON، متن غنی — و ساختار را در تمام طول حفظ می‌کند.

الگو در همه CMSها یکسان است: محتوا را به زبان منبع خود دریافت کنید، API PolyLingo را با تمام زبان‌های هدف فراخوانی کنید، محتوای ترجمه شده را از طریق API مدیریت CMS به آن بازنویسی کنید. این به صورت اسکریپت زمان ساخت، کار CI یا هندلر وب‌هوک اجرا می‌شود — هر کدام که با جریان کاری شما سازگار است.

PolyLingo از Markdown، HTML و متن ساده پشتیبانی می‌کند، بنابراین با هر قالبی که CMS شما برای محتوای غنی استفاده می‌کند کار می‌کند. فیلدهای ساختاریافته (سرفصل‌ها، بدنه، خلاصه) می‌توانند به صورت جداگانه ترجمه شوند تا کنترل دقیق‌تری روی فیلدهای ترجمه شده داشته باشید.

🟠

Sanity + PolyLingo

افزونه بین‌المللی‌سازی سند Sanity نسخه‌های سند مرتبط به ازای هر محل ایجاد می‌کند. اسکریپت زیر اسناد پایه انگلیسی را واکشی کرده و به طور خودکار نسخه‌های ترجمه شده برای هر زبان هدف ایجاد می‌کند.

با الگوی i18n در سطح سند (یک سند برای هر محل) و همچنین الگوی در سطح فیلد (تمام محل‌ها در یک سند) کار می‌کند. برای الگوی در سطح فیلد، روی فیلدها حلقه بزنید نه اسناد.

scripts/translate-sanity.mjs
// 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 نسخه‌های محل را به عنوان فیلدهایی روی همان ورودی ذخیره می‌کند. اسکریپت زیر از API مدیریت Contentful برای واکشی ورودی‌های انگلیسی، ترجمه آنها و نوشتن محتوای ترجمه شده مستقیماً به فیلدهای خاص محل استفاده می‌کند — بدون نیاز به کپی‌پیست دستی.

Contentful از کدهای محل BCP 47 استفاده می‌کند (مثلاً es-ES به جای es). کدهای ISO 639-1 PolyLingo را مطابق با پیکربندی محل Contentful خود نگاشت کنید.

scripts/translate-contentful.mjs
// 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 بومی‌سازی Webflow (در طرح‌های CMS و Business موجود است) از محتوای فیلد خاص محل پشتیبانی می‌کند. اسکریپت زیر آیتم‌های مجموعه CMS را واکشی کرده، فیلد بدنه HTML را ترجمه می‌کند و ترجمه‌ها را از طریق API نسخه ۲ Webflow به هر نسخه محل بازنویسی می‌کند.

Webflow فیلدهای متن غنی را به صورت HTML ذخیره می‌کند. ترجمه HTML PolyLingo تمام نشانه‌گذاری تولید شده توسط Webflow — کلاس‌های سفارشی، ویژگی‌ها و عناصر جاسازی شده — را بدون تغییر حفظ می‌کند.

scripts/translate-webflow.mjs
// 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 چه امکاناتی به کاربران CMS بدون سر می‌دهد

  • Sanity — ترجمه هنگام انتشار از طریق وب‌هوک، نوشتن مجدد به محل‌های سند
  • Contentful — ترجمه خودکار ورودی‌ها هنگام به‌روزرسانی محل انگلیسی
  • Webflow — ترجمه آیتم‌های مجموعه CMS از طریق API
  • هر CMS بدون سر با API — الگوی ادغام یکسان است
  • متن غنی، Markdown و HTML همه به درستی حفظ می‌شوند
  • تمام ۳۶ زبان در یک درخواست — بدون تماس‌های جداگانه برای هر زبان
  • با هر CMS که API مدیریت دارد کار می‌کند
  • محتوا می‌تواند در هر انتشار دوباره ترجمه شود — بدون هماهنگی دستی

جریان کاری استاندارد CMS چندزبانه

1

محتوا را به زبان منبع خود بنویسید

محتوا را به انگلیسی (یا هر زبان منبع شما) ایجاد و منتشر کنید. CMS شما این را به عنوان نسخه معتبر ذخیره می‌کند. نیازی به تغییر جریان کاری ویرایشی خود ندارید.

2

اسکریپت ترجمه را فعال کنید

اسکریپت را به صورت دستی، زمان‌بندی شده یا از طریق وب‌هوکی که هنگام انتشار محتوا در CMS شما فعال می‌شود اجرا کنید. اسکریپت PolyLingo را یک بار برای هر سند با تمام زبان‌های هدف فراخوانی می‌کند، سپس همه ترجمه‌ها را در یک مرحله به CMS شما بازنویسی می‌کند.

3

استقرار — محتوای ترجمه شده زنده است

فرانت‌اند شما محتوای خاص محل را از CMS به طور معمول می‌خواند. نیازی به تغییر کد فرانت‌اند شما نیست. محتوای ترجمه شده به زبان صحیح برای هر مسیر محل ظاهر می‌شود.

برای چه کسانی ساخته شده است

✍️

تیم‌های محتوا در Sanity یا Contentful

ویراستاران شما به انگلیسی منتشر می‌کنند. محتوای ترجمه شده به طور خودکار در همه محل‌ها ظاهر می‌شود، بدون اینکه تیم ویرایش نیاز به تعامل با ابزارهای ترجمه داشته باشد.

🏢

آژانس‌هایی که سایت‌های چندزبانه می‌سازند

هر سایت مشتری که می‌سازید نیاز به پشتیبانی چندزبانه دارد. PolyLingo یک ادغام قابل استفاده مجدد و قابل صورتحساب به شما می‌دهد که در هر CMS بدون سر در پشته شما کار می‌کند.

🌍

تجارت الکترونیک با محتوای محصول محلی‌شده

توضیحات محصول، صفحات دسته‌بندی و محتوای بلاگ — همه به طور خودکار هنگام انتشار ترجمه می‌شوند. با قیمت‌گذاری خاص محل ترکیب کنید تا تجربه خرید کاملاً محلی‌شده ارائه دهید.

سؤالات متداول درباره چندزبانه CMS بدون سر

آیا PolyLingo با CMSهایی که اینجا فهرست نشده‌اند کار می‌کند؟

بله. هر CMS که API مدیریت دارد می‌تواند با همان الگو ادغام شود — محتوا را واکشی کنید، PolyLingo را فراخوانی کنید، بازنویسی کنید. Prismic، Storyblok، DatoCMS، Strapi، Ghost و Directus همه API مدیریت دارند و با این روش کار می‌کنند. نمونه‌های ادغام برای Sanity، Contentful و Webflow در بالا الگو را نشان می‌دهند.

آیا می‌توانم متن غنی با تصاویر و لینک‌های جاسازی شده را ترجمه کنم؟

بله. ترجمه HTML تمام عناصر جاسازی شده از جمله تصاویر (ویژگی‌های src و alt به درستی مدیریت می‌شوند)، لینک‌ها (href حفظ شده، متن لینک ترجمه می‌شود) و iframeها را حفظ می‌کند. تنها استثنا محتوایی است که به صراحت به عنوان غیرقابل ترجمه علامت‌گذاری شده است — مثلاً بلوک‌های کد هرگز ترجمه نمی‌شوند.

چگونه با محتوایی که نباید ترجمه شود برخورد کنم؟

برای محتوای ساختاریافته با فیلدهای غیرقابل ترجمه (slugها، تاریخ‌ها، شناسه‌های فنی)، فقط فیلدهایی که می‌خواهید ترجمه شوند را ارسال کنید. برای متن غنی با بخش‌های قابل ترجمه و غیرقابل ترجمه مخلوط، از قالب HTML استفاده کنید — PolyLingo محتوای متنی را ترجمه می‌کند در حالی که بلوک‌های کد و سایر عناصر ساختاریافته را به طور خودکار حفظ می‌کند.

اگر CMS من نوع محتوای تو در تو داشته باشد چه؟

برای محتوای عمیقاً تو در تو (اسناد با ارجاع به اسناد دیگر)، هر نوع سند را به طور مستقل ترجمه کنید. این از ارجاعات دایره‌ای جلوگیری می‌کند و کنترل تمیزی روی اینکه کدام محتوا ترجمه می‌شود به شما می‌دهد. ارجاعات بین اسناد توسط CMS حفظ می‌شود — PolyLingo فقط به محتوای فیلد دست می‌زند، نه روابط سند.

چگونه ترجمه‌ها را هنگام تغییر محتوای منبع همگام نگه دارم؟

الگوی پیشنهادی این است که اسکریپت ترجمه را در هر رویداد انتشار از طریق وب‌هوک CMS فعال کنید. این اطمینان می‌دهد که محتوای ترجمه شده هر زمان که منبع تغییر کند به‌روزرسانی می‌شود. برای به‌روزرسانی‌های کمتر مکرر محتوا، اجرای اسکریپت به صورت زمان‌بندی شده شبانه یا قبل از هر استقرار تولید نیز به خوبی کار می‌کند.

آیا راهی هست که ترجمه‌ها به جای انتشار خودکار به عنوان «نیاز به بازبینی» علامت‌گذاری شوند؟

این بستگی به CMS شما دارد. Contentful و Sanity هر دو از حالت پیش‌نویس پشتیبانی می‌کنند — می‌توانید محتوای ترجمه شده را به صورت پیش‌نویس بنویسید نه منتشر شده، که اجازه بازبینی انسانی قبل از زنده شدن هر محل را می‌دهد. نمونه‌های اسکریپت بالا بلافاصله منتشر/ایجاد می‌کنند؛ مرحله نهایی را برای جریان کاری بازبینی به ایجاد پیش‌نویس تغییر دهید.

امروز چندزبانه را به CMS بدون سر خود اضافه کنید.

سطح رایگان. ۱۰۰٬۰۰۰ توکن در ماه. نیاز به کارت اعتباری نیست.

شروع ترجمه رایگان

سطح رایگان — ۱۰۰٬۰۰۰ توکن در ماه. با هر CMS کار می‌کند.

چندزبانه برای CMS بدون سر — Sanity، Contentful و فراتر — PolyLingo | PolyLingo