diff --git a/src/app/(marketing)/guides/[slug]/page.tsx b/src/app/(marketing)/guides/[slug]/page.tsx new file mode 100644 index 0000000..1c1f440 --- /dev/null +++ b/src/app/(marketing)/guides/[slug]/page.tsx @@ -0,0 +1,264 @@ +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; +import { getLocale, getTranslations } from "next-intl/server"; +import { JsonLd } from "@/components/seo/JsonLd"; +import { SiteHeader } from "@/components/SiteHeader"; +import { SiteFooter } from "@/components/SiteFooter"; +import { Button } from "@/components/ui/Button"; +import { Card } from "@/components/ui/Card"; +import { getCountryName, getCountryFlag } from "@/lib/data"; +import { + getSlugEntry, + slugForDestination, + localizedDestinationName, +} from "@/lib/destinations"; +import { getMonthlyBusyness } from "@/lib/services/destination-busyness"; +import { busynessLabelKey, type BusynessLabelKey } from "@/lib/busyness-scale"; +import { getGuide, allGuideSlugs } from "@/lib/guides"; + +const BASE_URL = "https://packedplaces.com"; + +export const dynamicParams = false; + +export function generateStaticParams() { + return allGuideSlugs().map((slug) => ({ slug })); +} + +const guideUrl = (slug: string) => `${BASE_URL}/guides/${slug}`; + +function monthNames(locale: string, style: "long" | "short"): string[] { + const fmt = new Intl.DateTimeFormat(locale, { month: style }); + return Array.from({ length: 12 }, (_, i) => fmt.format(new Date(2024, i, 1))); +} + +function joinList(locale: string, items: string[]): string { + const lf = new Intl.ListFormat(locale, { style: "long", type: "conjunction" }); + return lf.format(items); +} + +/** Single busiest month and the set of clearly-quiet months for a destination. */ +function crowdProfile(scores: number[]) { + const max = Math.max(...scores); + const min = Math.min(...scores); + const range = max - min; + const near = range * 0.15; + const busiestIdx = scores.indexOf(max); + const quietIdx = + range > 0 ? scores.flatMap((s, i) => (s <= min + near ? [i] : [])) : []; + return { + busiestIdx, + busiestLabel: busynessLabelKey(max), + quietIdx, + }; +} + +/** Resolve a curated alternative slug to everything the card needs. */ +function resolveAlternative(slug: string, locale: string) { + const entry = getSlugEntry(slug); + if (!entry) return null; + const d = entry.destination; + const scores = getMonthlyBusyness(d.id); + const { busiestIdx, busiestLabel, quietIdx } = crowdProfile(scores); + return { + slug: slugForDestination(d), + name: localizedDestinationName(d, locale), + flag: getCountryFlag(d.country), + country: getCountryName(d.country, locale), + category: d.category, + lat: d.lat, + lng: d.lng, + busiestIdx, + busiestLabel, + quietIdx, + }; +} + +export async function generateMetadata({ + params, +}: { + params: Promise<{ slug: string }>; +}): Promise { + const { slug } = await params; + const guide = getGuide(slug); + if (!guide) return {}; + const locale = await getLocale(); + const t = await getTranslations({ locale, namespace: "guides" }); + const canonical = guideUrl(slug); + return { + title: t(`${guide.i18nKey}.metaTitle`), + description: t(`${guide.i18nKey}.metaDescription`), + alternates: { canonical }, + openGraph: { + title: t(`${guide.i18nKey}.metaTitle`), + description: t(`${guide.i18nKey}.metaDescription`), + url: canonical, + type: "article", + }, + }; +} + +export default async function GuidePage({ + params, +}: { + params: Promise<{ slug: string }>; +}) { + const { slug } = await params; + const guide = getGuide(slug); + if (!guide) notFound(); + + const locale = await getLocale(); + const t = await getTranslations({ locale, namespace: "guides" }); + const tip = await getTranslations({ locale, namespace: "tooltip" }); + const tCat = await getTranslations({ locale, namespace: "destination" }); + const k = guide.i18nKey; + const long = monthNames(locale, "long"); + + const alternatives = guide.alternativeSlugs + .map((s) => resolveAlternative(s, locale)) + .filter((a): a is NonNullable => a !== null); + + const updated = new Intl.DateTimeFormat(locale, { + year: "numeric", + month: "long", + day: "numeric", + }).format(new Date(guide.publishedISO)); + + // FAQ copy lives in messages; JSON-LD mirrors exactly what is rendered. + const faqKeys = ["q1", "q2", "q3"] as const; + const faqs = faqKeys.map((q, i) => ({ + q: t(`${k}.faq.${q}`), + a: t(`${k}.faq.a${i + 1}`), + })); + + const faqJsonLd = { + "@context": "https://schema.org", + "@type": "FAQPage", + mainEntity: faqs.map((f) => ({ + "@type": "Question", + name: f.q, + acceptedAnswer: { "@type": "Answer", text: f.a }, + })), + }; + + const crowdLabel = (key: BusynessLabelKey) => tip(key); + const mapDeeplink = (lat: number, lng: number) => + `/map?lat=${lat.toFixed(1)}&lng=${lng.toFixed(1)}&zoom=6`; + + return ( + <> + + + +
+
+
+

+ {t("kicker")} · {updated} +

+

+ {t(`${k}.h1`)} +

+

+ {t(`${k}.intro`)} +

+

+ {t(`${k}.methodology`)} +

+
+
+ +
+
+
    + {alternatives.map((alt, i) => ( +
  1. + +
    + + {String(i + 1).padStart(2, "0")} + +
    +

    + {alt.flag} {alt.name} +

    +

    + {alt.country} · {tCat(`categories.${alt.category}`)} +

    +

    + {t(`${k}.picks.${alt.slug}`)} +

    +
    + + {t("busiestLabel")}:{" "} + {long[alt.busiestIdx]} ({crowdLabel(alt.busiestLabel)}) + + {alt.quietIdx.length > 0 && ( + + {t("quietestLabel")}:{" "} + {joinList( + locale, + alt.quietIdx.map((m) => long[m]), + )} + + )} +
    +

    + {t(`${k}.calmerBadge`)} +

    +
    + + +
    +
    +
    +
    +
  2. + ))} +
+ + {/* FAQ */} +
+

{t("faqTitle")}

+
+ {faqs.map((f) => ( +
+
{f.q}
+
{f.a}
+
+ ))} +
+
+ + {/* CTA */} +
+

{t(`${k}.ctaTitle`)}

+

{t(`${k}.ctaText`)}

+
+ + +
+
+ +

+ {t("disclaimer")} +

+
+
+
+ + + + ); +} diff --git a/src/app/(marketing)/guides/page.tsx b/src/app/(marketing)/guides/page.tsx new file mode 100644 index 0000000..baa65ca --- /dev/null +++ b/src/app/(marketing)/guides/page.tsx @@ -0,0 +1,67 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { getTranslations } from "next-intl/server"; +import { SiteHeader } from "@/components/SiteHeader"; +import { SiteFooter } from "@/components/SiteFooter"; +import { SectionHeading } from "@/components/ui/SectionHeading"; +import { Card } from "@/components/ui/Card"; +import { guides } from "@/lib/guides"; + +const BASE_URL = "https://packedplaces.com"; + +export async function generateMetadata(): Promise { + const t = await getTranslations("guides"); + return { + title: t("hubMetaTitle"), + description: t("hubMetaDescription"), + alternates: { canonical: `${BASE_URL}/guides` }, + openGraph: { + title: t("hubMetaTitle"), + description: t("hubMetaDescription"), + url: `${BASE_URL}/guides`, + type: "website", + }, + }; +} + +export default async function GuidesHubPage() { + const t = await getTranslations("guides"); + + return ( + <> + + +
+
+ +
+
+ +
+
+
    + {guides.map((g) => ( +
  • + + +

    + {t(`${g.i18nKey}.cardTitle`)} +

    +

    + {t(`${g.i18nKey}.cardBlurb`)} +

    +

    + {t("readGuide")} → +

    +
    + +
  • + ))} +
+
+
+ + + + ); +} diff --git a/src/lib/guides.ts b/src/lib/guides.ts new file mode 100644 index 0000000..42e8a92 --- /dev/null +++ b/src/lib/guides.ts @@ -0,0 +1,51 @@ +/** + * Editorial guide registry. Each guide is an evergreen article that leans on + * the real crowd dataset: the destinations it references are looked up by slug + * and their crowd numbers are computed at build time (services/destination- + * busyness), so nothing here is a hand-typed figure. The hub, the article + * pages and the sitemap all read from this list to stay in sync. + */ + +export interface Guide { + /** URL slug under /guides/. */ + slug: string; + /** Destination the guide is written about (dataset id). */ + targetId: string; + /** Slug of the target destination, for the "compare the original" link. */ + targetSlug: string; + /** + * Curated, real less-crowded alternatives (destination slugs), in the order + * they should appear. Every slug must resolve via getSlugEntry; the crowd + * figures shown for each are computed from the dataset, not stored here. + */ + alternativeSlugs: string[]; + /** ISO date the guide was published, for the sitemap and the "updated" line. */ + publishedISO: string; + /** Translation key under the "guides" namespace holding this guide's copy. */ + i18nKey: string; +} + +export const guides: Guide[] = [ + { + slug: "less-crowded-alternatives-to-hallstatt", + targetId: "AT-HALLSTATT", + targetSlug: "hallstatt", + alternativeSlugs: [ + "cesky-krumlov", + "colmar", + "karlovy-vary", + "eger", + "mostar", + ], + publishedISO: "2026-07-06", + i18nKey: "hallstatt", + }, +]; + +export function getGuide(slug: string): Guide | undefined { + return guides.find((g) => g.slug === slug); +} + +export function allGuideSlugs(): string[] { + return guides.map((g) => g.slug); +} diff --git a/src/messages/de.json b/src/messages/de.json index 575483b..9af54aa 100644 --- a/src/messages/de.json +++ b/src/messages/de.json @@ -520,5 +520,48 @@ "title": "Ruhigere Alternativen", "lede": "Ähnliche Orte, die in der Hochsaison ruhiger bleiben.", "calmer": "{bands, plural, one {# Stufe ruhiger} other {# Stufen ruhiger}}" + }, + "guides": { + "kicker": "Reise-Ratgeber", + "hubMetaTitle": "Reise-Guides zu Menschenmassen: wohin statt an die überlaufenen Orte", + "hubMetaDescription": "Datenbasierte Guides zu weniger überlaufenen Reisezielen, auf Basis der PackedPlaces-Crowd-Schätzungen für über 700 Orte.", + "hubTitle": "Guides", + "hubLede": "Praktische, datenbasierte Guides, um den Menschenmassen auszuweichen. Jede Empfehlung ist ein echtes Ziel aus unserem Datensatz, bewertet mit demselben Crowd-Modell wie die Karte.", + "readGuide": "Zum Guide", + "busiestLabel": "Am vollsten", + "quietestLabel": "Am ruhigsten", + "viewDestination": "Crowd-Kalender von {name} ansehen", + "openMap": "Auf der Karte öffnen", + "faqTitle": "Häufige Fragen", + "disclaimer": "Die Crowd-Werte sind Schätzungen aus einem saisonalen Reisenachfrage-Modell, keine Live-Besucherzahlen. Sie zeigen, wie voll ein Ort im Verhältnis zu seiner eigenen Kapazität wird, damit Sie das Timing vergleichen können, nicht exakte Kopfzahlen.", + "hallstatt": { + "cardTitle": "5 weniger überlaufene Alternativen zu Hallstatt (2026)", + "cardBlurb": "Historische Orte an See und Bergen, die ruhiger bleiben als Hallstatt, sortiert nach unseren Crowd-Daten.", + "metaTitle": "5 weniger überlaufene Alternativen zu Hallstatt (2026)", + "metaDescription": "Hallstatt zieht bis zu 10.000 Besucher pro Tag an. Hier sind 5 ähnliche europäische Altstädte, die deutlich ruhiger bleiben, ausgewählt mit PackedPlaces-Crowd-Daten.", + "h1": "5 weniger überlaufene Alternativen zu Hallstatt (2026)", + "intro": "Hallstatt ist eines der überlaufensten kleinen Dörfer Europas: An einem Spitzentag strömen bis zu 10.000 Besucher durch die Gassen, bei rund 750 Einwohnern. Unser Crowd-Modell bewertet den Ort in jedem Monat des Jahres als voll ausgelastet. Wenn Sie den Look von See und Bergen lieben, aber nicht das Gedränge, sind diese 5 Ziele in unserem Datensatz echte, ruhigere Alternativen. Jedes bleibt in jedem einzelnen Monat unter dem Crowd-Niveau von Hallstatt.", + "methodology": "Die Auswahl: Wir haben den Crowd-Wert genommen, den unser Modell jedem Ort Monat für Monat zuweist (dasselbe Modell hinter der Karte und den Ziel-Seiten), und ähnliche Kulturstädte behalten, die nie das volle Niveau von Hallstatt erreichen. Die vollsten und ruhigsten Monate unten werden live aus diesen Daten berechnet und aktualisieren sich, sobald sich der Datensatz ändert.", + "calmerBadge": "Jeden Monat unter Hallstatts Crowd-Niveau", + "picks": { + "cesky-krumlov": "Eine Renaissance-Schlossstadt in einer engen Moldau-Schleife, mit einem fotogenen Altstadtkern ganz ähnlich wie Hallstatt. Sie ist die vollste Empfehlung hier im Hochsommer, planen Sie daher Frühling oder Herbst, um die Gassen für sich zu haben.", + "colmar": "Fachwerkhäuser und blumengesäumte Kanäle im Elsass, der Bilderbuch-Look, den man in Hallstatt sucht, bei einem Bruchteil der Dichte. Unsere Daten halten den Ort selbst im vollsten Monat ruhig.", + "karlovy-vary": "Eine pastellfarbene Kurstadt entlang eines Flusstals im böhmischen Hügelland, mit Kolonnaden und bewaldeten Hängen. Im Modell bleibt sie das ganze Jahr über ruhig.", + "eger": "Eine Barockstadt mit Thermalbädern, einer Burg auf dem Hügel und kellergesäumten Weintälern in Nordungarn. Eine der ruhigsten Empfehlungen dieser Liste, Monat für Monat.", + "mostar": "Die wiederaufgebaute osmanische Brücke spannt sich über die türkise Neretva, gerahmt von steinernen Altstadtgassen. In unseren Daten wirkt der Ort selbst im Sommerhoch ruhig." + }, + "faq": { + "q1": "Ist Hallstatt wirklich so überlaufen?", + "a1": "In der Hochsaison zählt Hallstatt bis zu 10.000 Besucher pro Tag bei rund 750 Einwohnern, und unser saisonales Crowd-Modell bewertet den Ort in allen zwölf Monaten als voll. Deshalb fordern Einheimische ein Besucher-Buchungssystem.", + "q2": "Wann besucht man diese Alternativen am besten?", + "a2": "Jede Empfehlung nennt oben ihre vollsten und ruhigsten Monate, berechnet aus unseren Crowd-Daten. Als Faustregel bieten der späte Frühling und der frühe Herbst an allen fünf Orten die geringsten Menschenmengen bei noch gutem Wetter. Nur Český Krumlov wird im Hochsommer wirklich voll.", + "q3": "Wie werden die Crowd-Werte berechnet?", + "a3": "Sie stammen aus einem Reisenachfrage-Modell, das Beliebtheit und Kapazität jedes Orts mit dem Timing der Schulferien in über 100 Ländern kombiniert, dasselbe Modell hinter der PackedPlaces-Karte. Es sind relative Crowd-Schätzungen, keine Live-Besucherzahlen." + }, + "ctaTitle": "Sehen Sie die Crowds selbst", + "ctaText": "Öffnen Sie die Live-Karte, um diese Orte Woche für Woche zu vergleichen, oder prüfen Sie Hallstatts eigenen Crowd-Kalender.", + "ctaButton": "Crowd-Karte erkunden", + "ctaCompare": "Hallstatts Crowd-Kalender ansehen" + } } } diff --git a/src/messages/en.json b/src/messages/en.json index 996dd9a..bd9ce7f 100644 --- a/src/messages/en.json +++ b/src/messages/en.json @@ -520,5 +520,48 @@ "title": "Quieter alternatives", "lede": "Similar places that stay calmer in peak season.", "calmer": "{bands, plural, one {# band calmer} other {# bands calmer}}" + }, + "guides": { + "kicker": "Crowd guide", + "hubMetaTitle": "Travel crowd guides: where to go instead of the packed spots", + "hubMetaDescription": "Data-backed guides to less crowded travel destinations, built on PackedPlaces crowd estimates for 700+ places.", + "hubTitle": "Guides", + "hubLede": "Practical, data-backed guides to travelling around the crowds. Every pick is a real destination in our dataset, rated with the same crowd model as the map.", + "readGuide": "Read the guide", + "busiestLabel": "Busiest", + "quietestLabel": "Quietest", + "viewDestination": "See {name}'s crowd calendar", + "openMap": "Open on the map", + "faqTitle": "Frequently asked questions", + "disclaimer": "Crowd levels are estimates from a seasonal travel-demand model, not live visitor counts. They show how busy a place gets relative to its own capacity, so you can compare timing rather than exact head counts.", + "hallstatt": { + "cardTitle": "5 Less Crowded Alternatives to Hallstatt (2026)", + "cardBlurb": "Lake-and-mountain heritage towns that stay calmer than Hallstatt, ranked with our crowd data.", + "metaTitle": "5 Less Crowded Alternatives to Hallstatt (2026)", + "metaDescription": "Hallstatt draws up to 10,000 visitors a day. Here are 5 similar European heritage towns that stay far calmer, chosen with PackedPlaces crowd data.", + "h1": "5 Less Crowded Alternatives to Hallstatt (2026)", + "intro": "Hallstatt is one of Europe's most crowded small villages: up to 10,000 visitors pass through on a peak day, for around 750 residents. Our crowd model rates it packed in every month of the year. If you love the lake-below-the-mountains look but not the crush, these 5 destinations sit in our dataset as genuinely calmer picks. Each one stays below Hallstatt's crowd level in every single month.", + "methodology": "How we chose: we took the crowdedness score our model assigns each place, month by month (the same model behind the map and the destination pages), and kept similar cultural towns that never reach Hallstatt's packed level. The busiest and quietest months below are computed live from that data, so they update whenever the dataset does.", + "calmerBadge": "Below Hallstatt's crowd level every month", + "picks": { + "cesky-krumlov": "A Renaissance castle town wrapped in a tight bend of the Vltava, with a photogenic old-town core much like Hallstatt's. It is the busiest pick here in midsummer, so aim for spring or autumn to have the lanes to yourself.", + "colmar": "Half-timbered houses and flower-lined canals in Alsace, the storybook look people chase in Hallstatt, at a fraction of the density. Our data keeps it quiet even in its busiest month.", + "karlovy-vary": "A pastel spa town strung along a river valley in the Bohemian hills, all colonnades and wooded slopes. It stays calm across the whole year in our model.", + "eger": "A baroque town of thermal baths, a hilltop castle and cellar-lined wine valleys in northern Hungary. One of the quietest picks on this list, month in, month out.", + "mostar": "The rebuilt Ottoman bridge arcs over the turquoise Neretva, framed by stone old-town streets. It reads as quiet in our data even at its summer peak." + }, + "faq": { + "q1": "Is Hallstatt really that crowded?", + "a1": "In peak season Hallstatt sees up to 10,000 visitors a day against roughly 750 residents, and our seasonal crowd model rates it packed in all twelve months. That is why locals have pushed for a visitor-booking system.", + "q2": "When is the best time to visit these alternatives?", + "a2": "Each pick lists its busiest and quietest months above, computed from our crowd data. As a rule, late spring and early autumn give you the mildest crowds at all five while the weather is still good. Only Cesky Krumlov gets genuinely busy in midsummer.", + "q3": "How are the crowd levels calculated?", + "a3": "They come from a travel-demand model that combines each place's popularity and capacity with school-holiday timing across 100+ countries, the same model that powers the PackedPlaces map. They are relative crowd estimates, not live visitor counts." + }, + "ctaTitle": "See the crowds for yourself", + "ctaText": "Open the live map to compare any of these towns week by week, or check Hallstatt's own crowd calendar.", + "ctaButton": "Explore the crowd map", + "ctaCompare": "See Hallstatt's crowd calendar" + } } } diff --git a/src/messages/es.json b/src/messages/es.json index 5ca7a44..9ec9063 100644 --- a/src/messages/es.json +++ b/src/messages/es.json @@ -520,5 +520,48 @@ "title": "Alternativas más tranquilas", "lede": "Lugares similares que se mantienen más tranquilos en temporada alta.", "calmer": "{bands, plural, one {# nivel más tranquilo} other {# niveles más tranquilo}}" + }, + "guides": { + "kicker": "Guía de multitudes", + "hubMetaTitle": "Guías de multitudes de viaje: adónde ir en vez de a los sitios abarrotados", + "hubMetaDescription": "Guías basadas en datos sobre destinos menos abarrotados, con las estimaciones de multitudes de PackedPlaces para más de 700 lugares.", + "hubTitle": "Guías", + "hubLede": "Guías prácticas y basadas en datos para viajar esquivando las multitudes. Cada elección es un destino real de nuestro conjunto de datos, valorado con el mismo modelo de multitudes que el mapa.", + "readGuide": "Leer la guía", + "busiestLabel": "Más lleno", + "quietestLabel": "Más tranquilo", + "viewDestination": "Ver el calendario de multitudes de {name}", + "openMap": "Abrir en el mapa", + "faqTitle": "Preguntas frecuentes", + "disclaimer": "Los niveles de multitud son estimaciones de un modelo estacional de demanda de viajes, no recuentos de visitantes en tiempo real. Muestran lo lleno que se pone un lugar respecto a su propia capacidad, para que compares el momento de ir, no cifras exactas de personas.", + "hallstatt": { + "cardTitle": "5 alternativas menos abarrotadas a Hallstatt (2026)", + "cardBlurb": "Pueblos con encanto junto a lagos y montañas que se mantienen más tranquilos que Hallstatt, ordenados según nuestros datos de multitudes.", + "metaTitle": "5 alternativas menos abarrotadas a Hallstatt (2026)", + "metaDescription": "Hallstatt atrae hasta 10.000 visitantes al día. Aquí tienes 5 cascos históricos europeos parecidos que se mantienen mucho más tranquilos, elegidos con los datos de PackedPlaces.", + "h1": "5 alternativas menos abarrotadas a Hallstatt (2026)", + "intro": "Hallstatt es uno de los pueblos pequeños más abarrotados de Europa: en un día punta pasan hasta 10.000 visitantes, para unos 750 habitantes. Nuestro modelo de multitudes lo califica como abarrotado en todos los meses del año. Si te encanta la estampa de lago y montaña pero no el gentío, estos 5 destinos figuran en nuestros datos como opciones realmente más tranquilas. Cada uno se mantiene por debajo del nivel de multitud de Hallstatt en todos y cada uno de los meses.", + "methodology": "Cómo elegimos: tomamos la puntuación de masificación que nuestro modelo asigna a cada lugar, mes a mes (el mismo modelo que hay detrás del mapa y de las páginas de destino), y nos quedamos con pueblos culturales parecidos que nunca alcanzan el nivel de lleno de Hallstatt. Los meses más llenos y más tranquilos de abajo se calculan en vivo a partir de esos datos, así que se actualizan cuando lo hace el conjunto de datos.", + "calmerBadge": "Por debajo del nivel de Hallstatt cada mes", + "picks": { + "cesky-krumlov": "Una ciudad-castillo renacentista abrazada por un meandro cerrado del río Moldava, con un casco antiguo tan fotogénico como el de Hallstatt. Es la opción más concurrida de esta lista en pleno verano, así que ve en primavera u otoño para tener las callejuelas para ti.", + "colmar": "Casas de entramado de madera y canales bordeados de flores en Alsacia, la estampa de cuento que se busca en Hallstatt, con una fracción de la densidad. Nuestros datos lo mantienen tranquilo incluso en su mes más concurrido.", + "karlovy-vary": "Una ciudad balneario de tonos pastel a lo largo de un valle fluvial en las colinas de Bohemia, con columnatas y bosque en las laderas. En el modelo se mantiene tranquila todo el año.", + "eger": "Una ciudad barroca de baños termales, un castillo en lo alto y valles vinícolas llenos de bodegas en el norte de Hungría. Una de las opciones más tranquilas de esta lista, mes tras mes.", + "mostar": "El reconstruido puente otomano se arquea sobre el turquesa Neretva, enmarcado por calles de piedra del casco antiguo. En nuestros datos resulta tranquilo incluso en su punta de verano." + }, + "faq": { + "q1": "¿De verdad está Hallstatt tan abarrotado?", + "a1": "En temporada alta Hallstatt recibe hasta 10.000 visitantes al día frente a unos 750 habitantes, y nuestro modelo estacional lo califica como abarrotado en los doce meses. Por eso los vecinos han pedido un sistema de reserva de visitas.", + "q2": "¿Cuál es la mejor época para visitar estas alternativas?", + "a2": "Cada opción indica arriba sus meses más llenos y más tranquilos, calculados con nuestros datos. Como regla, el final de la primavera y el principio del otoño dan las menores multitudes en las cinco con buen tiempo aún. Solo Český Krumlov se llena de verdad en pleno verano.", + "q3": "¿Cómo se calculan los niveles de multitud?", + "a3": "Proceden de un modelo de demanda de viajes que combina la popularidad y la capacidad de cada lugar con el calendario de vacaciones escolares de más de 100 países, el mismo modelo que impulsa el mapa de PackedPlaces. Son estimaciones relativas de multitud, no recuentos de visitantes en tiempo real." + }, + "ctaTitle": "Comprueba las multitudes tú mismo", + "ctaText": "Abre el mapa en vivo para comparar cualquiera de estos pueblos semana a semana, o consulta el propio calendario de multitudes de Hallstatt.", + "ctaButton": "Explorar el mapa de multitudes", + "ctaCompare": "Ver el calendario de Hallstatt" + } } } diff --git a/src/messages/fr.json b/src/messages/fr.json index 66dd0cf..c47e4ec 100644 --- a/src/messages/fr.json +++ b/src/messages/fr.json @@ -520,5 +520,48 @@ "title": "Alternatives plus calmes", "lede": "Des lieux similaires qui restent plus calmes en haute saison.", "calmer": "{bands, plural, one {# niveau plus calme} other {# niveaux plus calmes}}" + }, + "guides": { + "kicker": "Guide affluence", + "hubMetaTitle": "Guides d'affluence voyage : où aller plutôt que dans les lieux bondés", + "hubMetaDescription": "Des guides fondés sur les données vers des destinations moins bondées, à partir des estimations d'affluence PackedPlaces pour plus de 700 lieux.", + "hubTitle": "Guides", + "hubLede": "Des guides pratiques et fondés sur les données pour voyager en évitant la foule. Chaque choix est une destination réelle de notre jeu de données, évaluée avec le même modèle d'affluence que la carte.", + "readGuide": "Lire le guide", + "busiestLabel": "Plus fréquenté", + "quietestLabel": "Plus calme", + "viewDestination": "Voir le calendrier d'affluence de {name}", + "openMap": "Ouvrir sur la carte", + "faqTitle": "Questions fréquentes", + "disclaimer": "Les niveaux d'affluence sont des estimations issues d'un modèle saisonnier de demande touristique, pas des comptages de visiteurs en temps réel. Ils montrent à quel point un lieu se remplit par rapport à sa propre capacité, pour comparer le moment où partir, pas des effectifs exacts.", + "hallstatt": { + "cardTitle": "5 alternatives moins bondées à Hallstatt (2026)", + "cardBlurb": "Des villages de charme entre lac et montagnes qui restent plus calmes que Hallstatt, classés selon nos données d'affluence.", + "metaTitle": "5 alternatives moins bondées à Hallstatt (2026)", + "metaDescription": "Hallstatt attire jusqu'à 10 000 visiteurs par jour. Voici 5 villes historiques européennes similaires qui restent bien plus calmes, choisies avec les données PackedPlaces.", + "h1": "5 alternatives moins bondées à Hallstatt (2026)", + "intro": "Hallstatt est l'un des petits villages les plus bondés d'Europe : jusqu'à 10 000 visiteurs y passent un jour de pointe, pour environ 750 habitants. Notre modèle d'affluence le classe comme bondé chaque mois de l'année. Si vous aimez le décor de lac au pied des montagnes mais pas la cohue, ces 5 destinations figurent dans nos données comme des choix vraiment plus calmes. Chacune reste sous le niveau d'affluence de Hallstatt tous les mois sans exception.", + "methodology": "Comment nous avons choisi : nous avons pris le score d'affluence que notre modèle attribue à chaque lieu, mois par mois (le même modèle que derrière la carte et les pages de destination), et gardé des villes culturelles similaires qui n'atteignent jamais le niveau bondé de Hallstatt. Les mois les plus fréquentés et les plus calmes ci-dessous sont calculés en direct à partir de ces données, donc ils se mettent à jour dès que le jeu de données change.", + "calmerBadge": "Sous le niveau de Hallstatt chaque mois", + "picks": { + "cesky-krumlov": "Une ville-château Renaissance lovée dans un méandre serré de la Vltava, avec un cœur de vieille ville aussi photogénique que celui de Hallstatt. C'est le choix le plus fréquenté de cette liste en plein été, visez donc le printemps ou l'automne pour avoir les ruelles à vous.", + "colmar": "Maisons à colombages et canaux bordés de fleurs en Alsace, le décor de conte que l'on cherche à Hallstatt, avec une fraction de la densité. Nos données le gardent calme même lors de son mois le plus fréquenté.", + "karlovy-vary": "Une ville thermale aux tons pastel le long d'une vallée fluviale dans les collines de Bohême, entre colonnades et coteaux boisés. Dans le modèle, elle reste calme toute l'année.", + "eger": "Une ville baroque de bains thermaux, un château sur la colline et des vallées viticoles bordées de caves dans le nord de la Hongrie. L'un des choix les plus calmes de cette liste, mois après mois.", + "mostar": "Le pont ottoman reconstruit s'arque au-dessus de la Neretva turquoise, encadré par les ruelles de pierre de la vieille ville. Dans nos données, le lieu paraît calme même à son pic estival." + }, + "faq": { + "q1": "Hallstatt est-il vraiment aussi bondé ?", + "a1": "En haute saison, Hallstatt voit jusqu'à 10 000 visiteurs par jour pour environ 750 habitants, et notre modèle saisonnier le classe comme bondé les douze mois. C'est pourquoi les habitants réclament un système de réservation des visites.", + "q2": "Quelle est la meilleure période pour visiter ces alternatives ?", + "a2": "Chaque choix indique plus haut ses mois les plus fréquentés et les plus calmes, calculés à partir de nos données. En règle générale, la fin du printemps et le début de l'automne offrent le moins de foule sur les cinq, avec un temps encore agréable. Seule Český Krumlov devient vraiment fréquentée en plein été.", + "q3": "Comment les niveaux d'affluence sont-ils calculés ?", + "a3": "Ils proviennent d'un modèle de demande touristique qui combine la popularité et la capacité de chaque lieu avec le calendrier des vacances scolaires de plus de 100 pays, le même modèle qui alimente la carte PackedPlaces. Ce sont des estimations relatives d'affluence, pas des comptages de visiteurs en temps réel." + }, + "ctaTitle": "Voyez la foule par vous-même", + "ctaText": "Ouvrez la carte en direct pour comparer ces villes semaine par semaine, ou consultez le calendrier d'affluence de Hallstatt.", + "ctaButton": "Explorer la carte d'affluence", + "ctaCompare": "Voir le calendrier de Hallstatt" + } } }