Vertalen naar Nederlands

Vorig jaar bouwden we een jachtmakelaarsplatform dat aanbiedingen in zes talen rond de Middellandse Zee moest serveren. Franse kopers in Cannes, Italiaanse klanten in Porto Cervo, Griekse charterzoekers in Athene, Turkse marinaoperators in Bodrum, Spaanse makelaars in Palma de Mallorca, en Engels sprekende expats verspreid overal ertussenin. Wat begon als "voeg gewoon een vertaalknop toe" werd een van de meest interessante i18n-uitdagingen waar ik aan heb gewerkt. Hier is alles wat ik heb geleerd over het bouwen van meertalige jachtwebsites die echt converteren.

Inhoudsopgave

Meertalige jachtwebsites bouwen voor mediterrane makelaars

Waarom mediterrane jachtmakelaars meertalige sites nodig hebben

Naar verwachting zal de mediterrane jachtmarkt tegen 2026 $12,3 miljard bereiken, volgens Allied Market Research. Maar hier is wat de meeste bureaus missen: deze markt is fundamenteel verdeeld naar taal. Een 45-meter Benetti genoteerd in Monaco moet vindbaar zijn voor een Duitse industrialist die in het Duits zoekt, een Saudische koper die in het Arabisch bladert, en een Britse gepensioneerde die in het Engels zoekt.

Ik heb makelaars gezien miljoenenccommissies verliezen omdat hun site alleen Engelstalige inhoud serveerde. Een makelaar in Antibes vertelde me dat zijn grootste concurrent Franstalige klanten aan het winnen was puur omdat hun aanbiedingen in Franse Google-zoekresultaten verschenen. Dit is niet een technisch probleem — het is een bedrijfsprobleem met een technische oplossing.

De cijfers ondersteunen dit:

Marktsegment Talen nodig Kopersdemografie
Franse Rivièra FR, EN, RU, AR Europese HNWIs, Midden-Oosterse kopers
Italiaanse kust IT, EN, DE, FR Noord-Europese chartergasten
Griekse eilanden EL, EN, DE, FR Charter-zwaar, seizoenstoerisme
Turkse Rivièra TR, EN, DE, RU Budget-bewuste chartermarkt
Balearen ES, EN, DE, FR Gemengde makelaardij en charter
Kroatische kust HR, EN, DE, IT Opkomende markt, snel groeiend

Als u alleen een of twee van deze talen aanbiedt, laat u geld op tafel liggen. Punt uit.

De juiste tech stack kiezen

Voor jachtmakelaarswebsites hebt u een stack nodig die twee zeer verschillende inhoudstypen afhandelt: statische marketinginhoud (over-pagina's, servicebeschrijvingen, teambio's) en dynamische aanbiedingsgegevens (jachtspecificaties, prijzen, beschikbaarheid, foto's).

Ik heb deze zowel op Next.js als op Astro gebouwd, en beide werken goed afhankelijk van uw vereisten. Als u zware interactiviteit nodig hebt — opgeslagen zoekopdrachten, vergelijkingstools, inquiryformulieren met realtime beschikbaarheid — Next.js is de betere keuze. Als de site vooral een showcase is met minder dynamisch gedrag, Astro's island-architectuur geeft u ongelooflijke prestaties uit de doos.

Hier is hoe de stacks voor dit specifieke gebruiksscenario vergelijken:

Functie Next.js (App Router) Astro Remix
i18n-routing Ingebouwde middleware Handmatig of plugin Handmatig
Statische generatie Uitstekend Uitstekend Beperkt
Dynamische aanbiedingen Native SSR/ISR On-demand met endpoints Native SSR
CMS-integratie Uitstekend Uitstekend Goed
Edge rendering Vercel Edge, Cloudflare Cloudflare, Netlify Cloudflare
Vertalingbibliotheken next-intl, next-i18next astro-i18n, paraglide remix-i18next
Buildtijd (500 aanbiedingen × 6 talen) ~4 min met ISR ~8 min volledige static N.v.t. (SSR)

Voor de headless CMS-laag, raad ik ten sterkste aan uw aanbiedingsgegevens van uw marketinginhoud te scheiden. Gebruik een doel-specifiek jachtbeheersysteem (zoals Yatco API, NauticEd, of een aangepaste Supabase-backend) voor aanbiedingsgegevens, en een headless CMS zoals Sanity of Contentful voor alles anders.

Waarom Headless hier van belang is

Jachtgegevens zijn vreemd. U hebt specificaties in meters of voet (afhankelijk van het publiek), prijzen in euro's of dollars, motoruren die constant bijgewerkt worden, en beschikbaarheidskalenders die dagelijks veranderen. Alles daarvan proberen te beheren in een traditionele CMS is een nachtmerrie. Een headless-aanpak laat u aanbiedingsgegevens uit een gespecialiseerde API en marketinginhoud uit een CMS trekken, en ze vervolgens bij buildtijd of aanvraagtijd combineren.

URL-strategie voor meertalige jachtaanbiedingen

Dit is waar de meeste projecten vroeg fout gaan. Uw URL-structuur voor een meertalige site is een van de moeilijkste beslissingen om later om te draaien. Er zijn drie benaderingen:

Subdirectorypatroon (aanbevolen)

https://yachtbroker.com/en/yachts/benetti-45m-2022
https://yachtbroker.com/fr/yachts/benetti-45m-2022
https://yachtbroker.com/de/yachten/benetti-45m-2022

Dit is wat ik voor 90% van de jachtmakelaars aanbeveel. Enkel domein, gedeelde domeinautoriteit, makkelijk te implementeren met Next.js-middleware of Astro's ingebouwde i18n-routing.

Subdomeinpatroon

https://en.yachtbroker.com/yachts/benetti-45m-2022
https://fr.yachtbroker.com/yachts/benetti-45m-2022

Enkele grotere makelaars geven de voorkeur aan dit voor organisatorische redenen. Elk subdomein kan onafhankelijk worden ingezet. Maar u verliest geconsolideerde domeinautoriteit, en het is meer infrastructuur om te beheren.

ccTLD-patroon

https://yachtbroker.fr/yachts/benetti-45m-2022
https://yachtbroker.de/yachten/benetti-45m-2022

Heeft alleen zin als u aparte juridische entiteiten in elk land hebt. Duur, ingewikkeld, en zelden de moeite waard tenzij u een Burgess of Fraser-niveau operatie bent.

Slug-vertaling

Hier is een detail dat mensen verwarst: moet u de URL-slugs vertalen? Voor jachtnamen, nee — houd ze consistent. Een "Benetti Oasis 40M" wordt zo genoemd in elke taal. Maar categoriepadden? Ja, vertaal die.

// next.config.js - Next.js i18n-routing
const nextConfig = {
  i18n: {
    locales: ['en', 'fr', 'de', 'it', 'es', 'el'],
    defaultLocale: 'en',
    localeDetection: true,
  },
};

Voor vertaalde paden in Next.js App Router met next-intl:

// src/navigation.ts
import { createLocalizedPathnameNavigation } from 'next-intl/navigation';

export const localePrefix = 'always';

export const pathnames = {
  '/yachts': {
    en: '/yachts',
    fr: '/yachts',
    de: '/yachten',
    it: '/yacht',
    es: '/yates',
    el: '/skafi',
  },
  '/yachts/[slug]': {
    en: '/yachts/[slug]',
    fr: '/yachts/[slug]',
    de: '/yachten/[slug]',
    it: '/yacht/[slug]',
    es: '/yates/[slug]',
    el: '/skafi/[slug]',
  },
};

export const { Link, redirect, usePathname, useRouter } =
  createLocalizedPathnameNavigation({ locales, localePrefix, pathnames });

Meertalige jachtwebsites bouwen voor mediterrane makelaars - architectuur

Jachtaanbiedingsgegevens vertalen

Dit is de kernuitdaging. Jachtaanbiedingen hebben drie soorten inhoud die elk een ander vertaalplan nodig hebben:

1. Gestructureerde gegevens (niet vertalen, lokaliseren)

Specificaties zoals lengte, breedte, diepgang, motorvermogen — deze hoeven niet te worden vertaald. Ze moeten gelokaliseerd worden. Toon meters aan Europeanen, voet aan Amerikanen. Toon kilowatt aan sommige markten, paardenkracht aan anderen.

// utils/localize-specs.ts
const UNIT_PREFERENCES: Record<string, UnitSystem> = {
  en: 'imperial',
  'en-GB': 'metric', // Britse markt gebruikt meters voor jachten
  fr: 'metric',
  de: 'metric',
  it: 'metric',
  es: 'metric',
  el: 'metric',
};

export function localizeLength(meters: number, locale: string): string {
  const system = UNIT_PREFERENCES[locale] || 'metric';
  if (system === 'imperial') {
    const feet = meters * 3.28084;
    return `${feet.toFixed(0)} ft`;
  }
  return `${meters.toFixed(1)} m`;
}

2. Opsommingsvelden (gebruik vertaalsleutels)

Romptype, brandstoftype, jachtcategorie — dit zijn vaste opties die vertaalsleutels moeten gebruiken, geen vrije-tekst-vertaling.

// messages/en.json
{
  "yacht": {
    "hullType": {
      "monohull": "Monohull",
      "catamaran": "Catamaran",
      "trimaran": "Trimaran"
    },
    "fuelType": {
      "diesel": "Diesel",
      "electric": "Electric",
      "hybrid": "Hybrid"
    }
  }
}
// messages/fr.json
{
  "yacht": {
    "hullType": {
      "monohull": "Monocoque",
      "catamaran": "Catamaran",
      "trimaran": "Trimaran"
    },
    "fuelType": {
      "diesel": "Diesel",
      "electric": "Électrique",
      "hybrid": "Hybride"
    }
  }
}

3. Vrije-tekst beschrijvingen (het moeilijke deel)

Jachtbeschrijvingen zijn marketingtekst. Ze worden geschreven door makelaars — meestal in het Engels of Frans — en ze zijn vol met branchejargon, emotionele taal, en specifieke beweringen. Alleen automatische vertaling is niet voldoende voor een €5 miljoen listing.

Hier is de aanpak die ik aanbeveel:

  1. Sla de originele taalbeschrijving op in uw CMS/database
  2. Gebruik AI-vertaling als eerste passage — GPT-4o of Claude handelen jachtterminologie in 2025 verrassend goed
  3. Vlag aanbiedingen boven een prijsdrempel (zeg, €1M+) voor menselijke beoordeling
  4. Cache vertaalde beschrijvingen zodat u niet voor hervertaling betaalt bij elke aanvraag
// services/translate-listing.ts
import { openai } from '@ai-sdk/openai';
import { generateText } from 'ai';

export async function translateDescription(
  text: string,
  sourceLang: string,
  targetLang: string
): Promise<string> {
  const cached = await getFromCache(text, targetLang);
  if (cached) return cached;

  const { text: translated } = await generateText({
    model: openai('gpt-4o'),
    system: `You are a professional yacht broker translator. 
      Translate yacht listing descriptions from ${sourceLang} to ${targetLang}. 
      Preserve technical terminology. Maintain the luxury marketing tone. 
      Keep brand names, model names, and proper nouns unchanged.`,
    prompt: text,
  });

  await saveToCache(text, targetLang, translated);
  return translated;
}

De kosten van deze aanpak zijn minimaal. Het vertalen van een jachtbeschrijving van 500 woorden met GPT-4o kost ongeveer $0,01-0,02. Zelfs bij 500 aanbiedingen × 6 talen, kijkt u naar ongeveer $30-60 voor de eerste vertaalpassage. Menselijke beoordeling van premiumaanbiedingen voegt kosten toe, maar het is absoluut het waard wanneer een enkele jachtverkoop $50K-200K commissie genereert.

i18n-implementatiepatronen

Laat me u door het werkelijke implementatiepatroon lopen dat ik gebruik met Next.js App Router en next-intl, aangezien dat de stack is die de meeste van onze headless CMS-projecten gebruiken.

Projectstructuur

src/
├── app/
│   └── [locale]/
│       ├── layout.tsx
│       ├── page.tsx
│       └── yachts/
│           ├── page.tsx
│           └── [slug]/
│               └── page.tsx
├── messages/
│   ├── en.json
│   ├── fr.json
│   ├── de.json
│   ├── it.json
│   ├── es.json
│   └── el.json
├── middleware.ts
└── i18n.ts

Middleware voor taaldetectie

// middleware.ts
import createMiddleware from 'next-intl/middleware';
import { locales, localePrefix, pathnames } from './navigation';

export default createMiddleware({
  locales,
  localePrefix,
  pathnames,
  defaultLocale: 'en',
  localeDetection: true,
});

export const config = {
  matcher: ['/((?!api|_next|_vercel|.*\\..*).*)'],
};

Jachtaanbiedingspagina met vertalingen

// app/[locale]/yachts/[slug]/page.tsx
import { useTranslations } from 'next-intl';
import { getYachtBySlug } from '@/lib/yachts';
import { localizeLength, localizePrice } from '@/utils/localize';

export async function generateMetadata({ params: { locale, slug } }) {
  const yacht = await getYachtBySlug(slug);
  const t = await getTranslations({ locale, namespace: 'yacht' });
  
  return {
    title: `${yacht.name} — ${localizeLength(yacht.lengthMeters, locale)} ${t('forSale')}`,
    alternates: {
      languages: {
        'en': `/en/yachts/${slug}`,
        'fr': `/fr/yachts/${slug}`,
        'de': `/de/yachten/${slug}`,
        'it': `/it/yacht/${slug}`,
        'es': `/es/yates/${slug}`,
        'el': `/el/skafi/${slug}`,
      },
    },
  };
}

export default async function YachtPage({ params: { locale, slug } }) {
  const yacht = await getYachtBySlug(slug);
  const t = useTranslations('yacht');
  const description = await getTranslatedDescription(yacht.id, locale);

  return (
    <article>
      <h1>{yacht.name}</h1>
      <dl>
        <dt>{t('specs.length')}</dt>
        <dd>{localizeLength(yacht.lengthMeters, locale)}</dd>
        <dt>{t('specs.year')}</dt>
        <dd>{yacht.year}</dd>
        <dt>{t('specs.price')}</dt>
        <dd>{localizePrice(yacht.priceEur, locale)}</dd>
        <dt>{t('specs.hullType')}</dt>
        <dd>{t(`hullType.${yacht.hullType}`)}</dd>
      </dl>
      <div dangerouslySetInnerHTML={{ __html: description }} />
    </article>
  );
}

Omgang met valuta- en eenheidslocalisatie

Jachtprijzen in de Middellandse Zee worden bijna altijd in euro's genoteerd, maar kopers uit verschillende markten verwachten referentieprijzen in hun lokale valuta te zien. Hier is hoe ik het afhandelL

// utils/localize-price.ts
const CURRENCY_BY_LOCALE: Record<string, string> = {
  en: 'EUR',      // Internationaal Engels staat in standaard voor EUR op Med-markt
  'en-US': 'USD',
  fr: 'EUR',
  de: 'EUR',
  it: 'EUR',
  es: 'EUR',
  el: 'EUR',
  tr: 'EUR',      // Turkse markt prijst nog altijd in EUR
  ar: 'USD',      // Midden-Oosterse kopers geven de voorkeur aan USD
  ru: 'EUR',
};

export function localizePrice(
  priceEur: number,
  locale: string,
  exchangeRates?: Record<string, number>
): string {
  const currency = CURRENCY_BY_LOCALE[locale] || 'EUR';
  let amount = priceEur;

  if (currency !== 'EUR' && exchangeRates) {
    amount = priceEur * (exchangeRates[currency] || 1);
  }

  return new Intl.NumberFormat(locale, {
    style: 'currency',
    currency,
    maximumFractionDigits: 0,
  }).format(amount);
}

Belangrijke voorbehoud: toon altijd "Prijs in EUR" of gelijkwaardig disclaimer bij weergave van geconverteerde prijzen. Jachtverkoopcontracten worden in een specifieke valuta gedenomineerd, en het tonen van een geconverteerde prijs zonder context kan juridische problemen creëren.

SEO voor meertalige jachtwebsites

Dit is waar de echte uitbetaling plaatsvindt. Correct meertalige SEO betekent dat uw Azimut 68-listing verschijnt wanneer iemand in München "Azimut 68 kaufen" zoekt ÉN wanneer iemand in Parijs "Azimut 68 à vendre" zoekt.

hreflang-tags

Deze zijn absoluut noodzakelijk. Elke pagina heeft hreflang-tags nodig die naar alle taalversies wijzen:

<link rel="alternate" hreflang="en" href="https://broker.com/en/yachts/azimut-68-2023" />
<link rel="alternate" hreflang="fr" href="https://broker.com/fr/yachts/azimut-68-2023" />
<link rel="alternate" hreflang="de" href="https://broker.com/de/yachten/azimut-68-2023" />
<link rel="alternate" hreflang="x-default" href="https://broker.com/en/yachts/azimut-68-2023" />

Gestructureerde gegevens per taal

Gebruik Product-schema met gelokaliseerde beschrijvingen voor elke taalversie. Google ondersteunt expliciet taalspecifieke gestructureerde gegevens, en het helpt uw aanbiedingen in rijke resultaten te verschijnen over verschillende Google-domeinen.

Sitemap-strategie

Genereer aparte sitemaps per taal en refereer ernaar vanuit een sitemap-index:

<!-- sitemap-index.xml -->
<sitemapindex>
  <sitemap><loc>https://broker.com/sitemap-en.xml</loc></sitemap>
  <sitemap><loc>https://broker.com/sitemap-fr.xml</loc></sitemap>
  <sitemap><loc>https://broker.com/sitemap-de.xml</loc></sitemap>
</sitemapindex>

Prestatieoverwegingen

Een jachtaanbiedingspagina met 30+ foto's in hoge resolutie, vertaalde inhoud, en gelokaliseerde specificaties kan snel zwaar worden. Dit is wat van belang is:

  • ISR (Incremental Static Regeneration): Genereer aanbiedingspagina's elke 60 minuten opnieuw. Jachtaanbiedingen veranderen niet per seconde, maar prijzen en beschikbaarheid kunnen dagelijks verschuiven.
  • Vertalingcaching: Vertaal nooit dezelfde beschrijving twee keer. Gebruik Redis of zelfs een eenvoudig databasetabel om vertalingen te cachen.
  • Afbeeldingsoptimalisatie: Dit is vaak de grootste winst. Een enkele jachtgalerie kan 2GB bronafbeeldingen bevatten. Gebruik Next.js Image of een CDN met automatische formaatonderhandeling (WebP/AVIF).
  • Bundle-splitsing per taal: Laad niet de Franse vertalingen voor Engelse gebruikers. Zowel next-intl als paraglide handelen dit automatisch.

Bij een recent project brachten deze optimalisaties onze Largest Contentful Paint van 4,2s naar 1,1s over alle talen. Dat is van belang wanneer uw uitvalpercentage direct correleert met verloren commissies.

Voorbeeld van werkelijke architectuur

Hier is de architectuur die we voor mediterrane makelaarwebsites hebben gebruikt:

┌─────────────┐     ┌──────────────┐     ┌─────────────┐
│   Sanity     │     │  Yacht API   │     │  Redis      │
│  (Marketing  │     │  (Listings,  │     │  (Translation│
│   content)   │     │   specs)     │     │   cache)    │
└──────┬───────┘     └──────┬───────┘     └──────┬──────┘
       │                    │                    │
       └────────────┬───────┘────────────────────┘
                    │
            ┌───────▼───────┐
            │   Next.js     │
            │   App Router  │
            │   + next-intl │
            └───────┬───────┘
                    │
            ┌───────▼───────┐
            │   Vercel      │
            │   Edge Network│
            └───────────────┘

Sanity handelt de marketingpagina's, teambio's, blogberichten af — allemaal met native meertalige ondersteuning. De jacht-API (hetzij een service van derden of aangepaste Supabase-backend) voorziet aanbiedingsgegevens. Redis cacht AI-gegenereerde vertalingen. Next.js bindt alles samen met taalvriendelijke routing.

Als dit soort architectuur klinkt als wat u nodig hebt, graag praten we over uw project. We hebben er verschillende voor mediterrane makelaars gebouwd en hebben de patronen geslepen.

Veelgestelde vragen

Hoeveel talen moet een mediterrane jachtwebsite ondersteunen? Minimaal hebt u Engels nodig plus de lokale taal van uw primaire markt. Voor serieuze makelaars, raad ik Engels, Frans, Duits en Italiaans aan als basislijn — dat dekt ongeveer 80% van de mediterrane jachtkopers. Voeg Russisch en Arabisch toe als u zich richt op het ultraluxesegment boven €5M.

Moet ik automatische vertaling of professionele vertalers voor jachtaanbiedingen gebruiken? Beide. Gebruik AI-vertaling (GPT-4o of Claude) als eerste passage voor alle aanbiedingen, laat vervolgens menselijke vertalers aanbiedingen boven uw prijsdrempel beoordelen. Voor een 500-woords beschrijving kost AI-vertaling minder dan $0,02 en brengt u 90% van de manier ergens. Menselijke beoordeling voor premiumaanbiedingen kost $20-50 per beschrijving maar zorgt voor nauwkeurigheid voor verkopen met hoge waarde.

Wat is de beste CMS voor meertalige jachtwebsites? Sanity en Contentful handelen meertalige inhoud allebei goed uit het vak. Sanity's document-level lokalisatie geeft u meer flexibiliteit, terwijl Contentful's field-level lokalisatie gemakkelijker op te zetten is. Voor de jachtaanbiedingsgegevens zelf, raad ik een afzonderlijk gespecialiseerd systeem aan in plaats van alles in een algemene-doeleinde CMS te proberen forceren. Controleer onze headless CMS-ontwikkelingspagina voor meer details.

Hoe handel ik jachtmetingen in verschillende eenheidssystemen af? Sla alle metingen in metrisch (meters, kilowatt) in uw database op. Converteer naar imperiaal alleen bij de weergavelaag op basis van de landinstelling van de gebruiker. De jachtindustrie in Europa gebruikt universeel metrisch, maar Amerikaanse kopers verwachten voet en paardenkracht. Gebruik de Intl.NumberFormat API voor consistente opmaak.

Hebben hreflang-tags echt veel effect op jacht-SEO? Absoluut. Zonder hreflang-tags zou Google uw Franse aanbieding aan Duitse zoekers kunnen tonen, of erger, uw vertaalde pagina's als gedupliceerde inhoud behandelen. We hebben gezien dat het organische verkeer met 40-60% toeneemt na correct implementeren van hreflang in een makelaarwebsite die het eerder verkeerd had.

Hoeveel kost het bouwen van een meertalige jachtmakelaarswebsite? Een correct gebouwde meertalige jachtsite met 4-6 talen, CMS-integratie, en jachtaanbiedingsbeheer kost doorgaans $30.000-80.000 afhankelijk van complexiteit. De grootste kostenrijders zijn het aantal talen, aangepaste zoek-/filterfunctionaliteit, en integratie met bestaande jachtbeheersystemen. Bezoek onze prijzenpagina voor meer specifieke schattingen.

Kan ik talen later aan mijn jachtwebsite toevoegen? Ja, als het van het begin af aan correct is gebouwd. Met een correct i18n-architectuur, betekent het toevoegen van een nieuwe taal het maken van een nieuw vertaalbestand, het vertalen van uw statische UI-strings, en het uitvoeren van uw aanbiedingsbeschrijvingen door de vertaalpipeline. De routing en infrastructuur zouden het al moeten afhandelen. Als uw huidige site niet met i18n in gedachten werd gebouwd, is een retrofit moeilijker — maar nog steeds haalbaar.

Wat dacht u van rechts-naar-links talen zoals Arabisch voor jachtwebsites? Arabisch wordt steeds belangrijker voor mediterrane jachtverkopen, vooral in het €10M+-segment. Uw CSS moet RTL-lay-outs ondersteunen — gebruik logische eigenschappen (margin-inline-start in plaats van margin-left) en test grondig. Next.js ondersteunt RTL met het dir-attribuut op uw HTML-element, geschakeld per taal. Het voegt ontwikkelingstijd toe, maar Midden-Oosterse kopers vertegenwoordigen een significant en groeiend marktsegment.