i18n for Builders
Internationalisation is more than translation. This course teaches you to set up next-intl in Next.js App Router, handle locale routing, format dates and currencies by locale, manage plural forms, support RTL languages, and build a translation workflow that scales beyond your first two languages.
What you'll learn
Course outline
Free โ start now
Full course โ $39 one-time
Locale Routing and the Switcher
Dynamic locale segments and building a language switcher
Formatting Dates, Numbers, and Currencies
The Intl API and next-intl's format helpers
Pluralisation and Gender Forms
ICU plural rules and gendered translations
RTL Support โ Arabic and Hebrew
dir attribute, CSS logical properties, and layout mirroring
Translation Workflows at Scale
Crowdin, Lokalise, and keeping translations in sync
Get the full course
All 8 lessons. Ship your app in multiple languages โ properly, not just translated strings.
Written by the RadarTrek editorial team ยท Reviewed June 2026
About this course
Internationalisation โ abbreviated i18n because there are 18 letters between the i and the n โ is the process of preparing your application to support multiple languages and regional formats. The most visible layer is translation: replacing English strings with French, Arabic, or Japanese equivalents. But translation is the easy part. The harder parts are locale routing (each language at its own URL for SEO), date and number formatting (July 3 in the US vs 3. Juli in Germany vs ูฃ ููููู in Arabic), plural forms (English has two, Arabic has six, Russian has three), right-to-left layout for Arabic and Hebrew, and managing the operational workflow of keeping translations in sync as your product evolves.
In the Next.js ecosystem, next-intl is the leading internationalisation library. It integrates with the App Router's file-based routing to create locale-prefixed URLs (/en/dashboard, /fr/dashboard, /ar/dashboard), provides typed message access with ICU syntax support, and includes format helpers for dates, numbers, and currencies. This course covers the complete next-intl setup: middleware for locale detection and routing, message organisation and namespaces, ICU plural and select syntax, the Intl API for formatting, RTL CSS layout considerations, and translation workflow tools like Crowdin that help you manage updates across languages as your product grows.
Frequently asked questions
What is next-intl and why is it the recommended choice for Next.js i18n?
next-intl is an internationalisation library built specifically for Next.js App Router. It handles locale-based routing through Next.js middleware, provides a typed useTranslations hook for accessing messages, supports ICU message format for complex pluralisation and interpolation, and includes number/date/currency formatters that respect the active locale. It works with both Server and Client Components and avoids the common pitfall of importing large translation files to the client. As of 2026, next-intl is the most widely used and actively maintained i18n solution for Next.js App Router projects.
How does locale routing work in Next.js with next-intl?
next-intl uses a Next.js middleware to detect the user's preferred locale from the Accept-Language header or a cookie, and then redirects or rewrites the URL to include the locale prefix (/en/dashboard, /fr/dashboard). Your app directory has a [locale] segment at the top level โ pages inside it use the locale parameter to load the correct messages. Each locale URL is treated as a separate page by search engines, enabling proper hreflang tags and locale-specific SEO.
What is ICU message format?
ICU (International Components for Unicode) is a standard syntax for expressing complex translation patterns that vary by variable values. The most common use case is pluralisation: in English, "1 item" vs "2 items" (two forms). In Arabic, there are six plural forms. ICU syntax lets you express all forms in a single message key: `{count, plural, one {# item} other {# items}}`. next-intl supports the full ICU spec including select for gender-aware translations (he/she/they variants) and number formatting within messages.
How do I handle RTL (right-to-left) languages like Arabic and Hebrew?
RTL support requires setting the HTML dir attribute to "rtl" for RTL locales, which flips the reading direction. The modern approach is to use CSS logical properties instead of directional properties: use margin-inline-start instead of margin-left, so the same CSS applies correctly in both LTR and RTL contexts. Some Tailwind v3+ utilities have logical property equivalents (ms- for margin-start). You also need to test your layout with Arabic text which is longer than English equivalents in many cases, and ensure icons with directional meaning (arrows, chevrons) are mirrored for RTL.
How do I manage translation updates as my product changes?
As your product evolves, you add new UI strings that need translating and sometimes change or remove existing ones. The process breaks down without tooling. Translation management platforms like Crowdin, Lokalise, and Phrase integrate with your repository โ you push English source strings, translators work in a web UI, and translations are merged back as pull requests. They also flag missing translations, track translation progress by language, and provide machine translation suggestions for initial drafts. For small teams, starting with JSON files in the repo and using Crowdin once you have more than two languages is a common approach.