হেডলেস CMS-এর জন্য বহুভাষিক।
পলি ল্যাং ওয়ার্ডপ্রেস সাইটগুলিকে একটি সম্পূর্ণ বহুভাষিক ওয়ার্কফ্লো দিয়েছিল। পলি লিঙ্গো সেই ওয়ার্কফ্লোটি স্যানিটি, কনটেন্টফুল, ওয়েবফ্লো, ফ্রেমার এবং প্রতিটি অন্য হেডলেস CMS-এ নিয়ে আসে — একটি REST API এর মাধ্যমে যা এক বিকেলের মধ্যে ইন্টিগ্রেট হয়।
হেডলেস CMS বহুভাষিক একটি অমীমাংসিত সমস্যা।
স্যানিটির কাছে আন্তর্জাতিককরণ প্লাগইন আছে। কনটেন্টফুলের কাছে লোকেলস আছে। কিন্তু এদের কেউই আপনার বিষয়বস্তু অনুবাদ করে না — তারা শুধু একাধিক ভাষায় এটি সংরক্ষণ করে। সেই ভাষার স্লটগুলি পূরণ করা এখনও একটি ম্যানুয়াল প্রক্রিয়া। ইংরেজি বিষয়বস্তু রপ্তানি করুন, একটি অনুবাদ সরঞ্জামের মাধ্যমে চালান যা আপনার রিচ টেক্সট বা JSON কাঠামো ভেঙে দেয়, আউটপুট ঠিক করুন, আবার আমদানি করুন, প্রতিটি ভাষার জন্য পুনরাবৃত্তি করুন। একটি সক্রিয় বিষয়বস্তু দল নিয়মিত প্রকাশ করলে, এই ওয়ার্কফ্লো স্কেল করে না। এটি বেশিরভাগ ছোট সেটআপের জন্যও নেই, যার মানে বিষয়বস্তু কখনোই অনুবাদ হয় না।
হেডলেস CMS আর্কিটেকচার বিষয়বস্তু ব্যবস্থাপনা এবং বিষয়বস্তু সরবরাহ পৃথক করে। এটি নমনীয়তার জন্য ভাল। কিন্তু এটি একটি ফাঁক তৈরি করে: CMS ভাষার ভেরিয়েন্ট সংরক্ষণ করে, কিন্তু সেই ভাষার ভেরিয়েন্টগুলিকে অনুবাদিত বিষয়বস্তু দিয়ে পূরণ করে না। আপনাকে নিজেই সেই স্তর তৈরি করতে হবে।
অধিকাংশ দল দুই পরিস্থিতির মধ্যে পড়ে: তারা ম্যানুয়ালি বিষয়বস্তু অনুবাদ করে DeepL-এ কপি করে এবং আবার পেস্ট করে (ধীর, ত্রুটিপূর্ণ, স্কেল করে না), অথবা তারা একটি কাস্টম ইন্টিগ্রেশন লেখে একটি অনুবাদ API-এর সাথে যা তারা চিরকাল রক্ষণাবেক্ষণ করতে হয়। কোনোটাই ভালো উত্তর নয়। পলি লিঙ্গো একটি পরিষ্কার তৃতীয় বিকল্প।
পলি লিঙ্গো হল আপনার CMS-এর অনুবাদ স্তর যা অনুপস্থিত।
পলি লিঙ্গো সরাসরি আপনার CMS প্রকাশ ওয়ার্কফ্লোর সাথে ইন্টিগ্রেট করে। একটি ওয়েবহুক সেট আপ করুন যা বিষয়বস্তু প্রকাশের সময় চালু হয়, বিষয়বস্তু পাস করুন পলি লিঙ্গো-তে, প্রতিটি ভাষার জন্য অনুবাদিত সংস্করণ গ্রহণ করুন, সেগুলো আবার আপনার CMS-এ লিখুন। স্যানিটির জন্য, এটি একটি সার্ভার অ্যাকশনে কয়েকটি লাইন। কনটেন্টফুলের জন্য, এটি একটি ওয়েবহুক হ্যান্ডলার। কাস্টম সেটআপের জন্য, এটি একটি HTTP কল। অনুবাদ মডেল আপনার বিষয়বস্তু ফরম্যাট বুঝতে পারে — মার্কডাউন, HTML, JSON, রিচ টেক্সট — এবং পুরোপুরি কাঠামো সংরক্ষণ করে।
প্যাটার্নটি প্রতিটি CMS-এ সঙ্গতিপূর্ণ: আপনার উৎস ভাষায় বিষয়বস্তু আনুন, পলি লিঙ্গো API-তে সব লক্ষ্য ভাষা নিয়ে কল করুন, অনুবাদিত বিষয়বস্তু CMS-এ তার ব্যবস্থাপনা API-এর মাধ্যমে লিখুন। এটি একটি বিল্ড-টাইম স্ক্রিপ্ট, CI কাজ, বা ওয়েবহুক হ্যান্ডলার হিসেবে চলে — যা আপনার ওয়ার্কফ্লোর সাথে মানায়।
পলি লিঙ্গো মার্কডাউন, HTML, এবং প্লেইন টেক্সট পরিচালনা করে, তাই এটি যেকোনো ফরম্যাটের সাথে কাজ করে যা আপনার CMS রিচ বিষয়বস্তু জন্য ব্যবহার করে। কাঠামোবদ্ধ ক্ষেত্র (শিরোনাম, বডি, সারাংশ) আলাদাভাবে অনুবাদ করা যেতে পারে যাতে আপনি কোন ক্ষেত্র অনুবাদ হবে তা নিয়ন্ত্রণ করতে পারেন।
স্যানিটি + পলি লিঙ্গো
স্যানিটির ডকুমেন্ট আন্তর্জাতিককরণ প্লাগইন প্রতিটি লোকেলের জন্য লিঙ্ক করা ডকুমেন্ট ভেরিয়েন্ট তৈরি করে। নিচের স্ক্রিপ্টটি ইংরেজি বেস ডকুমেন্টগুলি আনয়ন করে এবং প্রতিটি লক্ষ্য ভাষার জন্য স্বয়ংক্রিয়ভাবে অনুবাদিত ভেরিয়েন্ট তৈরি করে।
ডকুমেন্ট-স্তরের i18n প্যাটার্ন (প্রতিটি লোকেলের জন্য একটি ডকুমেন্ট) এবং ক্ষেত্র-স্তরের প্যাটার্ন (একই ডকুমেন্টে সব লোকেল) উভয়ের সাথেই কাজ করে। ক্ষেত্র-স্তরের প্যাটার্নের জন্য, ডকুমেন্টের পরিবর্তে ক্ষেত্রগুলির উপর লুপ করুন।
// 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,
})
}
}কনটেন্টফুল + পলি লিঙ্গো
কনটেন্টফুল একই এন্ট্রির ক্ষেত্র হিসাবে লোকেল ভেরিয়েন্ট সংরক্ষণ করে। নিচের স্ক্রিপ্টটি কনটেন্টফুল ম্যানেজমেন্ট API ব্যবহার করে ইংরেজি এন্ট্রি আনয়ন করে, সেগুলো অনুবাদ করে, এবং অনুবাদিত বিষয়বস্তু সরাসরি লোকেল-নির্দিষ্ট ক্ষেত্রগুলিতে লিখে — কোনো ম্যানুয়াল কপি-পেস্টের প্রয়োজন নেই।
কনটেন্টফুল BCP 47 লোকেল কোড ব্যবহার করে (যেমন es-ES এর পরিবর্তে es)। পলি লিঙ্গোর ISO 639-1 কোডগুলি আপনার কনটেন্টফুল লোকেল কনফিগারেশনের সাথে মানানসই করুন।
// 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()
}ওয়েবফ্লো + পলি লিঙ্গো
ওয়েবফ্লোর লোকালাইজেশন API (CMS এবং বিজনেস প্ল্যানে উপলব্ধ) লোকেল-নির্দিষ্ট ক্ষেত্র বিষয়বস্তু সমর্থন করে। নিচের স্ক্রিপ্টটি CMS কালেকশন আইটেম আনয়ন করে, HTML বডি ক্ষেত্র অনুবাদ করে, এবং প্রতিটি লোকেল ভেরিয়েন্টে ওয়েবফ্লো v2 API এর মাধ্যমে অনুবাদগুলি লিখে।
ওয়েবফ্লো রিচ টেক্সট ক্ষেত্রগুলি HTML হিসেবে সংরক্ষণ করে। পলি লিঙ্গোর HTML অনুবাদ সব ওয়েবফ্লো-উত্পাদিত মার্কআপ — কাস্টম ক্লাস, অ্যাট্রিবিউট, এবং এমবেডেড উপাদান — অপরিবর্তিত রাখে।
// 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 } }) }
)
}
}পলি লিঙ্গো হেডলেস CMS ব্যবহারকারীদের জন্য যা দেয়
- ✓স্যানিটি — প্রকাশের সময় ওয়েবহুকের মাধ্যমে অনুবাদ করুন, ডকুমেন্ট লোকেলসে লিখুন
- ✓কনটেন্টফুল — ইংরেজি লোকেল আপডেট হলে স্বয়ংক্রিয়ভাবে এন্ট্রিগুলি অনুবাদ করুন
- ✓ওয়েবফ্লো — API এর মাধ্যমে CMS কালেকশন আইটেম অনুবাদ করুন
- ✓যেকোনো হেডলেস CMS যার API আছে — ইন্টিগ্রেশন প্যাটার্ন একই
- ✓রিচ টেক্সট, মার্কডাউন, এবং HTML সঠিকভাবে সংরক্ষিত
- ✓একই অনুরোধে সব ৩৬টি ভাষা — ভাষা অনুযায়ী আলাদা কল নয়
- ✓যেকোনো CMS যার ম্যানেজমেন্ট API আছে তার সাথে কাজ করে
- ✓প্রতিটি প্রকাশে বিষয়বস্তু পুনরায় অনুবাদ করা যায় — কোনো ম্যানুয়াল সিঙ্ক নয়
স্ট্যান্ডার্ড বহুভাষিক CMS ওয়ার্কফ্লো
আপনার উৎস ভাষায় বিষয়বস্তু লিখুন
ইংরেজি (অথবা যেকোনো উৎস ভাষা) তে বিষয়বস্তু তৈরি ও প্রকাশ করুন। আপনার CMS এটিকে কর্তৃত্বপূর্ণ সংস্করণ হিসেবে সংরক্ষণ করে। আপনার সম্পাদকীয় ওয়ার্কফ্লো পরিবর্তন করার প্রয়োজন নেই।
অনুবাদ স্ক্রিপ্ট ট্রিগার করুন
স্ক্রিপ্টটি ম্যানুয়ালি, নির্ধারিত সময়ে, অথবা CMS-এ বিষয়বস্তু প্রকাশ ইভেন্ট দ্বারা ট্রিগার হওয়া ওয়েবহুকের মাধ্যমে চালান। স্ক্রিপ্টটি প্রতিটি ডকুমেন্টের জন্য একবার পলি লিঙ্গো কল করে সব লক্ষ্য ভাষা নিয়ে, তারপর সব অনুবাদ একবারে CMS-এ লিখে।
ডিপ্লয় করুন — অনুবাদিত বিষয়বস্তু লাইভ
আপনার ফ্রন্টএন্ড স্বাভাবিকভাবেই CMS থেকে লোকেল-নির্দিষ্ট বিষয়বস্তু পড়ে। আপনার ফ্রন্টএন্ড কোডে কোনো পরিবর্তনের প্রয়োজন নেই। অনুবাদিত বিষয়বস্তু প্রতিটি লোকেল রুটের জন্য সঠিক ভাষায় প্রদর্শিত হয়।
কার জন্য এটি তৈরি
স্যানিটি বা কনটেন্টফুলের বিষয়বস্তু দল
আপনার সম্পাদকরা ইংরেজিতে প্রকাশ করেন। অনুবাদিত বিষয়বস্তু সব লোকেলে স্বয়ংক্রিয়ভাবে প্রদর্শিত হয়, সম্পাদকীয় দলকে অনুবাদ সরঞ্জামের সাথে যোগাযোগ করতে হয় না।
বহুভাষিক সাইট নির্মাণকারী এজেন্সি
আপনি যে প্রতিটি ক্লায়েন্ট সাইট তৈরি করেন তার বহুভাষিক সমর্থন প্রয়োজন। পলি লিঙ্গো আপনাকে একটি পুনঃব্যবহারযোগ্য, বিলযোগ্য ইন্টিগ্রেশন দেয় যা আপনার স্ট্যাকের যেকোনো হেডলেস CMS-এ কাজ করে।
স্থানীয়কৃত পণ্য বিষয়বস্তু সহ ই-কমার্স
পণ্য বর্ণনা, বিভাগ পৃষ্ঠা, এবং ব্লগ বিষয়বস্তু — সবই প্রকাশের সময় স্বয়ংক্রিয়ভাবে অনুবাদিত হয়। লোকেল-নির্দিষ্ট মূল্য নির্ধারণের সাথে মিলিয়ে সম্পূর্ণ স্থানীয়কৃত শপিং অভিজ্ঞতা প্রদান করুন।
হেডলেস CMS বহুভাষিক সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্ন
পলি লিঙ্গো কি এখানে তালিকাভুক্ত নয় এমন CMS-এর সাথেও কাজ করে?
হ্যাঁ। যেকোনো CMS যার ম্যানেজমেন্ট API আছে একই প্যাটার্ন ব্যবহার করে ইন্টিগ্রেট করা যায় — বিষয়বস্তু আনুন, পলি লিঙ্গো কল করুন, আবার লিখুন। প্রিসমিক, স্টোরিব্লক, ডাটো CMS, স্ট্রাপি, ঘোস্ট, এবং ডাইরেক্টাসের ম্যানেজমেন্ট API আছে এবং এই পদ্ধতিতে কাজ করে। উপরের স্যানিটি, কনটেন্টফুল, এবং ওয়েবফ্লো ইন্টিগ্রেশন উদাহরণগুলি প্যাটার্নটি দেখায়।
আমি কি এমবেডেড ছবি এবং লিঙ্ক সহ রিচ টেক্সট অনুবাদ করতে পারি?
হ্যাঁ। HTML অনুবাদ সব এমবেডেড উপাদান সংরক্ষণ করে, যার মধ্যে ছবি (src এবং alt অ্যাট্রিবিউট সঠিকভাবে পরিচালিত), লিঙ্ক (href সংরক্ষিত, লিঙ্ক টেক্সট অনুবাদিত), এবং আইফ্রেম অন্তর্ভুক্ত। একমাত্র ব্যতিক্রম হল স্পষ্টভাবে অ-অনুবাদযোগ্য চিহ্নিত বিষয়বস্তু — যেমন কোড ব্লক, যা কখনো অনুবাদ হয় না।
আমি কিভাবে এমন বিষয়বস্তু পরিচালনা করব যা অনুবাদ করা উচিত নয়?
অ-অনুবাদযোগ্য ক্ষেত্র (স্লাগ, তারিখ, প্রযুক্তিগত শনাক্তকারী) সহ কাঠামোবদ্ধ বিষয়বস্তু জন্য, শুধুমাত্র আপনি যেগুলো অনুবাদ করতে চান সেই ক্ষেত্রগুলি পাঠান। মিশ্র অনুবাদযোগ্য এবং অ-অনুবাদযোগ্য অংশ সহ রিচ টেক্সটের জন্য, HTML ফরম্যাট ব্যবহার করুন — পলি লিঙ্গো টেক্সট বিষয়বস্তু অনুবাদ করবে এবং কোড ব্লক ও অন্যান্য কাঠামোবদ্ধ উপাদান স্বয়ংক্রিয়ভাবে সংরক্ষণ করবে।
আমার CMS-এ যদি নেস্টেড বিষয়বস্তু টাইপ থাকে তাহলে?
গভীর নেস্টেড বিষয়বস্তু (ডকুমেন্ট যা অন্য ডকুমেন্টের রেফারেন্স রাখে) জন্য, প্রতিটি ডকুমেন্ট টাইপ আলাদাভাবে অনুবাদ করুন। এটি সার্কুলার রেফারেন্স এড়ায় এবং আপনাকে কোন বিষয়বস্তু অনুবাদ হবে তা পরিষ্কার নিয়ন্ত্রণ দেয়। ডকুমেন্টগুলির মধ্যে রেফারেন্স CMS দ্বারা বজায় রাখা হয় — পলি লিঙ্গো শুধুমাত্র ক্ষেত্র বিষয়বস্তু স্পর্শ করে, ডকুমেন্ট সম্পর্ক নয়।
যখন উৎস বিষয়বস্তু পরিবর্তিত হয় তখন আমি কিভাবে অনুবাদগুলি সিঙ্ক রাখব?
প্রস্তাবিত প্যাটার্ন হল প্রতিটি প্রকাশ ইভেন্টে CMS ওয়েবহুকের মাধ্যমে অনুবাদ স্ক্রিপ্ট ট্রিগার করা। এটি নিশ্চিত করে অনুবাদিত বিষয়বস্তু উৎস পরিবর্তিত হলে আপডেট হয়। কম ঘন ঘন বিষয়বস্তু আপডেটের জন্য, রাতের সময় নির্ধারিত সময়ে বা প্রতিটি প্রোডাকশন ডিপ্লয়ের আগে স্ক্রিপ্ট চালানো সমান কার্যকর।
স্বয়ংক্রিয় প্রকাশের পরিবর্তে অনুবাদকে "পর্যালোচনা প্রয়োজন" হিসেবে চিহ্নিত করার কোনো উপায় আছে?
এটি আপনার CMS-এর উপর নির্ভর করে। কনটেন্টফুল এবং স্যানিটি উভয়ই ড্রাফট স্টেট সমর্থন করে — আপনি অনুবাদিত বিষয়বস্তু প্রকাশের পরিবর্তে ড্রাফট হিসেবে লিখতে পারেন, যাতে প্রতিটি লোকেল লাইভ হওয়ার আগে মানব পর্যালোচনা সম্ভব হয়। উপরের স্ক্রিপ্ট উদাহরণগুলি অবিলম্বে প্রকাশ/তৈরি করে; একটি পর্যালোচনা ওয়ার্কফ্লোর জন্য চূড়ান্ত ধাপ পরিবর্তন করে ড্রাফট তৈরি করুন।
সম্পর্কিত গাইড
মার্কআপ ভাঙা ছাড়াই HTML অনুবাদ করুন
কিভাবে পলি লিঙ্গো CMS-উত্পাদিত HTML সম্পূর্ণ ট্যাগ সংরক্ষণ করে পরিচালনা করে।
Next.js-এ বহুভাষিক যোগ করুন
হেডলেস CMS বিষয়বস্তু অনুবাদকে next-intl UI স্ট্রিং অনুবাদের সাথে মিলিয়ে।
আধুনিক স্ট্যাকের জন্য পলি ল্যাং বিকল্প
ওয়ার্ডপ্রেস থেকে হেডলেস সেটআপে বহুভাষিক ওয়ার্কফ্লো স্থানান্তর।
আজই আপনার হেডলেস CMS-এ বহুভাষিক যোগ করুন।
ফ্রি টিয়ার। প্রতি মাসে ১০০,০০০ টোকেন। কোনো ক্রেডিট কার্ডের প্রয়োজন নেই।
ফ্রি অনুবাদ শুরু করুনফ্রি টিয়ার — প্রতি মাসে ১০০,০০০ টোকেন। যেকোনো CMS-এর সাথে কাজ করে।