slogan3

Ontwikkel meertalige contentstructuren in Sanity CMS

description

Met deze prompt kan ik een robuuste en schaalbare meertalige contentstructuur opzetten in Sanity CMS, waardoor ik mijn content effectief kan beheren en vertalen zonder duplicatieproblemen. Het helpt me om internationale doelgroepen beter te bedienen en vermindert complexiteit in vertaalbeheer.

prompt

Help me bij het opzetten van een meertalige contentstructuur binnen mijn Sanity CMS-project. Aantal talen: <aantal_talen> Be ...

try_prompt

generate_helper
disclaimerOnPageApi

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk, ik help je graag bij het opzetten van een meertalige contentstructuur in Sanity CMS met drie talen en automatische synchronisatie van metadata. Hier is een stapsgewijze aanpak: 1. Structuur van meertalige content: Gebruik een veld voor de taalkeuze in elk contenttype, of maak voor elke taal een apart schema. Een gangbare aanpak is om één schema te gebruiken met meertalige velden, bijvoorbeeld: ```javascript // Voorbeeld van een blogpost schema export default { name: 'blogPost', title: 'Blogpost', type: 'document', fields: [ { name: 'title', title: 'Titel', type: 'object', fields: [ { name: 'nl', title: 'Nederlands', type: 'string' }, { name: 'en', title: 'Engels', type: 'string' }, { name: 'de', title: 'Duits', type: 'string' }, ], }, { name: 'slug', title: 'Slug', type: 'slug', options: { source: 'title.nl', // of een andere taal, afhankelijk van standaard maxLength: 96, }, }, { name: 'content', title: 'Content', type: 'object', fields: [ { name: 'nl', title: 'Nederlands', type: 'text' }, { name: 'en', title: 'Engels', type: 'text' }, { name: 'de', title: 'Duits', type: 'text' }, ], }, // andere metadata { name: 'publishedAt', title: 'Publicatiedatum', type: 'datetime', }, ], } ``` 2. Meertalige contenttypes structureren: Je kunt ook voor elke taal een eigen document maken of gebruik maken van een hoofd- en vertaalde documenten. De meest flexibele aanpak is om één documenttype te gebruiken met meertalige velden. 3. Automatische synchronisatie van metadata: Voor het synchroniseren van metadata (zoals publicatiedatum, tags, etc.) tussen talen, kun je een custom script of webhook gebruiken: - **Sanity Webhooks:** Maak een webhook die getriggerd wordt bij het opslaan van een document. - **Custom Scripts:** Schrijf een script (bijvoorbeeld in Node.js) dat de metadata kopieert van de hoofdversie (bijvoorbeeld de Nederlandse versie) naar de vertalingen. Voorbeeld van een eenvoudig synchronisatiescript: ```javascript // pseudocode async function syncMetadata(docId) { const doc = await sanityClient.getDocument(docId); const metadata = { publishedAt: doc.publishedAt, // andere metadata }; // haal vertaalde documenten op const translations = await sanityClient.fetch(`*[_type == 'blogPost' && references($docId)]`, { docId }); // update vertalingen met metadata translations.forEach(async (translation) => { await sanityClient.patch(translation._id) .set(metadata) .commit(); }); } ``` 4. Handige tools en plugins: - Gebruik Sanity's "References" om vertalingen aan elkaar te koppelen. - Overweeg het gebruik van "Locale" oplossingen zoals het 'sanity-plugin-intl-input' voor een betere meertalige interface. 5. Samenvatting: - Gebruik meertalige velden binnen een enkel schema. - Koppel vertalingen via referenties of identieke IDs. - Automatiseer metadata-synchronisatie via webhooks en scripts. - Test de structuur grondig en zorg voor een gebruiksvriendelijke interface voor contentbeheer. Wil je dat ik een specifiek voorbeeld of code voor jouw contenttypes opstel?
provider: deepseek
model: deepseek-chat
Hier is een gestructureerd plan voor je meertalige Sanity CMS-installatie met 3 talen: ## 1. Basisconfiguratie ```javascript // sanity.config.js export default defineConfig({ // ... andere configuratie i18n: { locales: ['nl', 'en', 'fr'], base: 'nl' } }) ``` ## 2. Document Structuren ### Blogposts Schema: ```javascript // schemas/blogpost.js export default { name: 'blogpost', type: 'document', fields: [ { name: 'title', type: 'object', fields: [ {name: 'nl', type: 'string', title: 'Titel (NL)'}, {name: 'en', type: 'string', title: 'Title (EN)'}, {name: 'fr', type: 'string', title: 'Titre (FR)'} ] }, { name: 'slug', type: 'object', fields: [ {name: 'nl', type: 'slug', title: 'Slug (NL)'}, {name: 'en', type: 'slug', title: 'Slug (EN)'}, {name: 'fr', type: 'slug', title: 'Slug (FR)'} ] }, { name: 'content', type: 'object', fields: [ {name: 'nl', type: 'blockContent', title: 'Inhoud (NL)'}, {name: 'en', type: 'blockContent', title: 'Content (EN)'}, {name: 'fr', type: 'blockContent', title: 'Contenu (FR)'} ] } ] } ``` ## 3. Automatische Metadata Synchronisatie ### Custom Input Component: ```javascript // components/SynchronizedField.js import React from 'react' const SynchronizedField = React.forwardRef((props, ref) => { const {value, onChange, languages} = props const handleBaseLanguageChange = (newValue) => { const updatedValue = {...value} languages.forEach(lang => { updatedValue[lang] = newValue }) onChange(updatedValue) } return ( <div> <input value={value?.nl || ''} onChange={(e) => handleBaseLanguageChange(e.target.value)} ref={ref} /> </div> ) }) ``` ### Gebruik in Schema: ```javascript { name: 'metaDescription', type: 'object', fields: [ {name: 'nl', type: 'text', title: 'Meta Omschrijving (NL)'}, {name: 'en', type: 'text', title: 'Meta Description (EN)'}, {name: 'fr', type: 'text', title: 'Meta Description (FR)'} ], inputComponent: SynchronizedField } ``` ## 4. Query Voorbeelden ```groq // Alle blogposts in Nederlands *[_type == "blogpost"]{ "title": title.nl, "slug": slug.nl.current, "content": content.nl } // Specifieke taal content *[_type == "blogpost"]{ "title": title[$language], "slug": slug[$language].current, "content": content[$language] } ``` ## 5. Aanbevolen Packages - `sanity-plugin-internationalized-array` - `sanity-plugin-mux-input` voor video's ## 6. Workflow Tips 1. Baseer je altijd op de basis taal (NL) 2. Gebruik de synchronisatie alleen voor metadata 3. Houd content vertalingen handmatig voor kwaliteitscontrole 4. Implementeer fallbacks voor ontbrekende vertalingen Wil je dat ik specifieke onderdelen verder uitwerk of heb je voorkeur voor een andere aanpak?