
Kwa nini maudhui yako ya Contentful bado si ya lugha nyingi kweli
By Robert
Kwa nini maudhui yako ya Contentful bado hayajawa na lugha nyingi kweli
Contentful hushughulikia maeneo vizuri. Unaweza kufafanua idadi unayohitaji, kuweka mnyororo wa kurudisha nyuma, kubadilisha kati yao katika mhariri, na kujenga mbele inayotoa lugha sahihi kwa kila njia. Miundombinu ya maudhui ya lugha nyingi ni nzuri kweli.
Kile Contentful hakifanyi ni kutafsiri maudhui yako.
Hii inaonekana dhahiri inaposemwa moja kwa moja, lakini ni rahisi kushangaza kuchanganya "tuna maeneo ya lugha yaliyowekwa" na "tuna lugha nyingi." Hizi si vitu sawa. Maeneo ya lugha ni chombo. Lugha nyingi inamaanisha chombo kina maudhui ndani yake.
Kama nafasi yako ya Contentful ina maeneo ya Kifaransa na Kijerumani yaliyowekwa lakini maeneo hayo hayana maudhui, au yamejazwa na nakala ya Kiingereza kama nafasi ya kuonyesha, au yamejazwa na toleo la kwanza la makadirio ambalo hakuna aliyelipitia tangu tovuti ilipoanzishwa — bado huna lugha nyingi. Una muundo wa lugha nyingi.
Chapisho hili ni kuhusu kufunga pengo hilo.
Contentful kwa kweli inakupa nini
Mfumo wa lugha wa Contentful umebuniwa vyema. Kila kipengee cha maudhui kinaweza kuwa na thamani za sehemu kwa kila lugha. Unaweka lugha ya msingi, usanidi mbadala, na API yako ya utoaji inarudisha lugha sahihi inapoulizwa. Uundaji wa maudhui ni rahisi vya kutosha kushughulikia mahitaji tata ya lugha nyingi kwa aina tofauti za maudhui.
Lakini mfumo ni huru kabisa kuhusu jinsi maudhui yaliyotafsiriwa yanavyowekwa hapo. Contentful haijui kama sehemu zako za lugha ya Kifaransa zina tafsiri za kitaalamu, nakala iliyotafsiriwa na mashine, maandishi ya Kiingereza yaliyowekwa kwa bahati mbaya, au hakuna kabisa. Inahifadhi na kutoa tu kile unachoweka.
Tatizo la tafsiri ni lako kabisa kulitatua.
Jinsi timu kawaida hushughulikia (na mahali panaposhindwa)
Timu nyingi zinazoshughulikia tafsiri za Contentful huangukia katika mojawapo ya mifumo michache.
Mfumo wa usafirishaji wa mikono. Mtaalamu wa maendeleo husafirisha maudhui kutoka Contentful, huwatumia kwa shirika la tafsiri au mfanyakazi huru, husubiri irudi, huipanga upya, na kuingiza tena. Hii hufanya kazi kwa uzinduzi wa mara moja lakini haidumu wakati maudhui yanabadilika. Kila sasisho la eneo la chanzo linamaanisha kupitia mzunguko mzima tena. Kwa vitendo, maudhui yaliyotafsiriwa huchelewa haraka nyuma ya chanzo na hakuna mtu ana muda wa kuyafuatilia.
Mfumo wa tafsiri ndani ya mhariri. Mhariri hufungua kila kipengee, hubadilisha hadi eneo lengwa, na kutafsiri sehemu kwa sehemu kwa mikono au kwa kubandika maudhui kwenye chombo cha tafsiri. Hii ni sahihi lakini polepole. Pia haifanyi kazi kwa wingi — ikiwa una mamia ya vipengee katika aina kumi na mbili za maudhui, kiasi cha kazi ya mikono ni kikubwa.
Mfumo wa "itatosha". Maudhui yaliyotafsiriwa yapo lakini hayajakaguliwa tangu yalipotengenezwa kwa mara ya kwanza. Eneo la chanzo limebadilishwa mara kadhaa tangu wakati huo. Toleo la Kifaransa la ukurasa wako wa bei bado linarejelea mpango uliouacha miezi minane iliyopita. Ukurasa wa nyumbani wa Kijerumani bado una kauli mbiu ya zamani. Hakuna aliyeyatilia shaka kwa sababu hakuna anayekagua.
Mifumo yote mitatu inashiriki tatizo moja la msingi: tafsiri hutendewa kama kazi ya mara moja badala ya sehemu endelevu ya mtiririko wa kazi wa maudhui.
Kile kinachohitajika kwa kweli kwa lugha nyingi
Yaliyomo halisi ya lugha nyingi katika Contentful yanahitaji vitu vitatu kufanya kazi pamoja.
Tafsiri sahihi ya awali. Kila sehemu katika kila eneo lengwa inahitaji yaliyotafsiriwa ambayo ni sahihi, yamewekwa kwa usahihi wa eneo, na kusomeka kama vile yameandikwa kwa soko hilo badala ya kupita tu kwenye chombo cha tafsiri rahisi na kusiangaliwa tena.
Mchakato wa kuweka tafsiri ziendelee kuwa za sasa. Wakati yaliyomo ya chanzo yanabadilika, yaliyotafsiriwa pia yanahitaji kubadilika. Hii ndilo sehemu ambayo timu nyingi haziipendi. Timu ya yaliyomo inayochapisha masasisho kadhaa kwa wiki katika nafasi ya Contentful yenye maeneo manne na aina hamsini za yaliyomo inakabiliwa na mzigo mkubwa wa kazi ya tafsiri endelevu ikiwa inafanywa kwa mkono.
Njia ya kujua wakati tafsiri zimepitwa na wakati. Mfumo wa maeneo wa Contentful hauoneshi uzee wa yaliyomo. Ikiwa unasasisha nakala ya Kiingereza ya kipengee na kusahau kusasisha nakala ya Kifaransa, toleo la Kifaransa litaendelea kimya kimya kutoa yaliyomo ya zamani. Unahitaji mchakato au zana za kugundua hili.
Wapi PolyLingo inafaa
API ya PolyLingo hutafsiri maudhui yaliyopangwa huku ikihifadhi muundo wake. Kwa Contentful, muundo unaohusika ni JSON — thamani za sehemu za rekodi ya Contentful, zilizochukuliwa na kutumwa kwa API, hurudi zimetafsiriwa na muundo ule ule ukiwa haujabadilika.
Mtiririko wa msingi katika Node.js:
import PolyLingo from 'polylingo'
import { createClient } from 'contentful-management'
const poly = new PolyLingo({ apiKey: process.env.POLYLINGO_API_KEY })
const contentful = createClient({
accessToken: process.env.CONTENTFUL_MANAGEMENT_TOKEN,
})
const space = await contentful.getSpace(process.env.CONTENTFUL_SPACE_ID)
const environment = await space.getEnvironment('master')
// Pata rekodi unayotaka kutafsiri
const entry = await environment.getEntry('your-entry-id')
// PolyLingo hutumia misimbo ya BCP-47 bila eneo (fr, de).
// Waambatanishe na vitambulisho vya lugha vya Contentful ikiwa vinatofautiana (mfano fr-FR, de-DE).
const localeMap = { fr: 'fr', de: 'de' } // rekebisha ili iendane na vitambulisho vya lugha vya nafasi yako
// Chukua tu sehemu za maandishi za Kiingereza — ruka marejeleo, viungo, boolean, na nambari
const sourceFields = Object.fromEntries(
Object.entries(entry.fields)
.filter(([, value]) => typeof value['en-US'] === 'string')
.map(([key, value]) => [key, value['en-US']])
)
// Tafsiri kwa Kifaransa na Kijerumani kwa ombi moja
const result = await poly.translate({
content: JSON.stringify(sourceFields),
format: 'json',
targets: Object.keys(localeMap),
})
// Andika thamani zilizotafsiriwa kurudi kwenye rekodi ukitumia vitambulisho vya lugha vya Contentful
for (const [polyLocale, translated] of Object.entries(result.translations)) {
const contentfulLocale = localeMap[polyLocale]
const parsed = JSON.parse(translated)
for (const [field, value] of Object.entries(parsed)) {
if (!entry.fields[field]) entry.fields[field] = {}
entry.fields[field][contentfulLocale] = value
}
}
await entry.update()
await entry.publish()
console.log('Rekodi imetafsiriwa na kuchapishwa.')
Mwito mmoja wa API hurudisha Kifaransa na Kijerumani. Rekodi inasasishwa na kuchapishwa katika script ile ile.
Kumbuka kuhusu vitambulisho vya lugha: PolyLingo hutumia misimbo ya BCP-47 bila kiambishi cha eneo (fr, de). Nafasi za Contentful mara nyingi hutumia vitambulisho vilivyo na eneo kama fr-FR au de-DE. Kitu kinachoitwa localeMap hapo juu ndicho unachoweka ili kuoanisha — sasisha ili iendane na vitambulisho vya lugha vinavyotumika katika nafasi yako ya Contentful.
Mfano ule ule unafanya kazi pia kwa Python:
import os, json, requests
from contentful_management import Client
poly_key = os.environ['POLYLINGO_API_KEY']
contentful = Client(os.environ['CONTENTFUL_MANAGEMENT_TOKEN'])
space = contentful.spaces().find(os.environ['CONTENTFUL_SPACE_ID'])
environment = space.environments().find('master')
entry = environment.entries().find('your-entry-id')
# Chukua thamani za sehemu za Kiingereza
source_fields = {
key: value.get('en-US')
for key, value in entry.fields().items()
if value.get('en-US')
}
# Tafsiri kwa Kifaransa na Kijerumani
r = requests.post(
'https://api.usepolylingo.com/v1/translate',
headers={'Authorization': f"Bearer {poly_key}"},
json={
'content': json.dumps(source_fields),
'format': 'json',
'targets': ['fr', 'de'],
},
timeout=120,
)
r.raise_for_status()
translations = r.json()['translations']
# Andika tena kwenye rekodi
for locale, translated in translations.items():
parsed = json.loads(translated)
for field, value in parsed.items():
if field in entry.fields():
entry.fields()[field][locale] = value
entry.save()
entry.publish()
print('Rekodi imetafsiriwa na kuchapishwa.')
Kutafsiri kwa kiwango kikubwa
Mifano hapo juu hushughulikia kipengee kimoja. Kwa nafasi ya Contentful yenye vipengee vingi katika aina mbalimbali za maudhui, kiungo cha batch hushughulikia hadi vitu 100 kwa kila ombi:
// Pata vipengee vingi na vitafsiri kwa wito mmoja wa batch
const entries = await environment.getEntries({
content_type: 'blogPost',
limit: 50,
})
// Ramani za msimbo wa eneo la PolyLingo kwa vitambulisho vya eneo la Contentful
const localeMap = { fr: 'fr', de: 'de', es: 'es' } // rekebisha ili iendane na nafasi yako
const items = entries.items.map(entry => ({
id: entry.sys.id,
content: JSON.stringify(
Object.fromEntries(
Object.entries(entry.fields)
.filter(([, value]) => typeof value['en-US'] === 'string')
.map(([k, v]) => [k, v['en-US']])
)
),
format: 'json',
}))
const batch = await poly.batch({
items,
targets: Object.keys(localeMap),
})
for (const result of batch.results) {
const entry = entries.items.find(e => e.sys.id === result.id)
for (const [polyLocale, translated] of Object.entries(result.translations)) {
const contentfulLocale = localeMap[polyLocale]
const parsed = JSON.parse(translated)
for (const [field, value] of Object.entries(parsed)) {
if (!entry.fields[field]) entry.fields[field] = {}
entry.fields[field][contentfulLocale] = value
}
}
await entry.update()
await entry.publish()
}
Vipengee hamsini, lugha tatu, ombi moja la batch.
Kudumisha tafsiri ziwe za sasa
Skripti zilizo hapo juu zinaweza kuendeshwa kwa mahitaji au kuunganishwa katika mtiririko wako wa kazi wa uchapishaji. Mchoro wa kawaida ni kuendesha tafsiri kama sehemu ya kazi ya CI inayochochewa wakati maudhui ya chanzo yanapobadilika, au kwa ratiba inayoshika maingizo yoyote yaliyosasishwa katika saa 24 zilizopita.
Contentful pia inaunga mkono webhooks — unaweza kusanidi webhook inayochomeka wakati kipengee kinachapishwa katika lugha ya msingi, ambayo inaweza kuchochea kazi ya tafsiri moja kwa moja. Kuunganisha PolyLingo kwenye webhook hiyo kunamaanisha kila wakati mhariri anapochapisha maudhui ya Kiingereza yaliyosasishwa, lugha zilizotafsiriwa husasishwa bila hatua yoyote ya mkono. Hii iko kwenye ramani ya njia kwa ushirikiano maalum wa PolyLingo; kwa sasa API inakupa kila kitu unachohitaji kujenga mtiririko huo mwenyewe.
Kumbuka kuhusu aina za sehemu
Njia iliyoelezwa hapo juu inafanya kazi vizuri kwa maandishi mafupi, maandishi marefu, na maandishi tajiri yaliyohifadhiwa kama mistari. Aina chache za sehemu za Contentful zinahitaji kushughulikiwa tofauti:
Sehemu za maandishi tajiri zilizohifadhiwa katika muundo wa hati wa Contentful (si mistari rahisi) zinahitaji kusambazwa kuwa maandishi rahisi au HTML kabla ya kutumwa kwa PolyLingo, kisha kusambazwa tena. Kifurushi cha @contentful/rich-text-html-renderer kinashughulikia hatua ya usambazaji, na format: "html" upande wa PolyLingo huhifadhi alama vizuri.
Sehemu za marejeleo (viungo kwa maingizo au mali nyingine) hazipaswi kutafsiriwa — ni vitambulisho, si maandishi. Ziondoe kutoka sehemu unazotuma kwa API.
Sehemu za nambari, boolean, na tarehe hazitafsiriwi kwa asili. Zichujue kabla ya kujenga kitu chako cha chanzo.
Kuanzia
Ngazi ya bure ya PolyLingo inajumuisha tokeni 50,000 kwa mwezi. Kwa nafasi ya Contentful yenye kiasi cha wastani cha maudhui, hiyo inashughulikia mzunguko wa awali wa tafsiri kwa maingizo kadhaa katika maeneo mengi na nafasi ya ziada kwa masasisho yanayoendelea.
Nyaraka kamili za API ziko kwenye usepolylingo.com/docs. Vifurushi vya SDK vinapatikana kwa Node.js, Python, Ruby, PHP, Java, na Go.
npm install polylingo