Translate the demo to any of EN, ES, FR, PT — or add your own locale.
Loop ships translated into English, Spanish, French, and Portuguese — and adding a locale is straightforward.
Loop splits localization into two concerns:
next-intl with message catalogs.siteConfig as localized field siblings.This split keeps marketing copy editable in one config file while letting the framework handle the plumbing.
Routes are prefixed with the active locale, e.g. /en/docs, /es/precios. The middleware.ts at the project root negotiates the locale and the [locale] segment carries it through every page.
src/app/[locale]/docs/page.tsx
src/app/[locale]/pricing/page.tsx
Localized content uses suffix conventions throughout siteConfig:
{
title: "Pricing",
titleEs: "Precios",
titleFr: "Tarifs",
titlePt: "Preços",
}
A small helper reads the right field for the active language and falls back to English when a translation is missing, so partial translations are safe.
locales array in src/i18n/routing.ts.src/messages/<locale>.json for the UI chrome.*<Locale> fields to the content you care about in siteConfig.If you only need one language, set a single locale, delete the unused catalogs, and the [locale] prefix collapses to a constant. The localized *Es/*Fr/*Pt config fields can simply be ignored — they're optional.