VIEW THIS AS

Auto mode follows the Route Engine until you choose a viewpoint.

YOU ARE HERE

ROUTE CHECK

CONNECTED TO

WHAT NEXT

Use the canonical route for this room, or HELP if you are unsure.

How People Translate Quickly | Next.js next-intl Localization QA: App Router, ICU Messages, Locale Routing and SEO

Three students study around open books and worksheets in a shared classroom.

Next.js localization with next-intl is easiest when the team tests language delivery and text accuracy as one workflow. Define the supported locales and routing behavior, load the correct messages for each request, translate message values without breaking their keys or ICU arguments, and render the final pages under their real localized URLs. Then confirm that dates, numbers, links, accessibility labels and metadata remain understandable for the intended reader. A language file is finished only when the application serves the right words at the right route.

If you want to know how to translate a Next.js app, how to configure next-intl locale routing, or why next-intl translations are missing, start with one message rather than a full catalog. Trace its key from a component’s useTranslations call to the request’s messages JSON and the locale determined by routing. If the expected Spanish wording is present but the page stays in English, the problem may be request configuration, locale prefix handling or message loading. Rewriting the Spanish words cannot fix a route that selects the wrong catalog.

This guide focuses on the next-intl integration with the Next.js App Router while noting where a Pages Router or other setup requires a different path. It covers nested JSON keys, ICU arguments, cardinal and ordinal plurals, select expressions, rich text, server and client components, request configuration, routing files, localized navigation, SEO, date and currency formatting, fallback decisions, accessibility, content updates and production QA. It gives a practical sequence readers can apply immediately.

The shortest reliable test uses one localized route

Create or identify a localized page with a known message, such as an account heading. Follow the application’s next-intl configuration, which may include a routing definition, a request configuration module and the provider used by components. Confirm that the page obtains its message with useTranslations or the corresponding server API and that the intended locale supplies the key.

Open the same page under two locale variants, including a full browser reload rather than client navigation alone. If one route shows the wrong language, record the URL, effective locale, key, loaded catalog and resulting text. Those facts isolate a routing or data-loading failure from an actual translation defect.

A reproducible message fixture should also contain a name variable and a plural count. This prevents the team from declaring success after testing only a static heading. User-facing multilingual quality depends on dynamic content working under each target language.

Understand the roles of locale, messages and routing

A locale identifies language and possible regional preferences, such as en-US or fr-CA. Messages are the translation records used to render text, often in JSON catalogs grouped under namespaces. Routing determines how the app associates an incoming URL or request with a locale. These three roles interact but are not interchangeable.

An English label in the wrong catalog is a translation data problem. A correct French message served to a German route is a routing problem. A date formatted as if it were American despite German page text is a formatting configuration problem. Treating all three as translation can produce a long sequence of unnecessary rewrites.

Create an ownership map: content editors own target meaning; developers own message identity, loading and routing; product owners decide supported locale coverage and fallback. These simple boundaries help resolve problems quickly and prevent changes in one layer from silently altering another.

Keep JSON keys stable and translate their values

next-intl commonly organizes messages in nested JSON. A component might use useTranslations(‘Account’) and request t(‘title’), which corresponds to Account.title in the catalog. The namespace and key are how software finds the value. Translating title into a target-language key name will not make the heading more natural; it will make the existing lookup miss.

Protect key paths and resource types in the translation workflow. Nested structures should be compared before and after import. A flat export that loses Account.title may still be valid JSON, yet the component has no way to retrieve the message it expects.

When a key genuinely needs to change, manage it as a coordinated code migration. Update source calls, target catalogs and tests. Do not use a translation file as an unauthorized route to rename application identifiers.

Treat descriptions and screenshots as part of translation quality

A short message such as Continue can mean go to another page, resume an interrupted task or authorize a purchase. The same English letters may need different target-language expressions. Key names can provide clues, but they cannot replace the context of the action.

Build a translation brief that identifies the screen, user goal, consequence, audience, tone and data inserted into the message. For high-stakes actions, include screenshots and an explanation of what happens after the button is pressed. This prevents mistranslation of payment state, privacy choices and deletion warnings.

Record the clarification with the message for future updates. A translation memory suggestion becomes more trustworthy when its context travels with it, rather than relying only on source-text similarity.

ICU patterns preserve complete sentences

next-intl supports ICU-style message patterns for variables, pluralization and selects. This allows a target language to reorganize a whole sentence instead of translating fixed English fragments. A message such as Hello, {name} can move the name to a different position according to target grammar while preserving the name argument.

The pattern syntax matters. Braces, selector labels, number placeholders and nested variants can carry executable meaning. A generic word-replacement process can produce fluent prose while breaking the format. Use an ICU-aware validator and test the final formatted message with representative values.

A translator’s goal is not to mimic the source’s word order. It is to convey the same action, factual state and relationship among participants. Named parameters give that freedom without losing data identity.

Protect every required interpolation variable

A notification may contain {sender}, {recipient} and {fileName}. They are not decorative English words. Code passes corresponding values into the message. The target can change their order but should not rename or remove them when the product still requires the information.

Compare argument inventories structurally. A target that repeats {sender} twice and omits {recipient} can still have two visible placeholders and look valid to a superficial checker. Test with distinct sample data so an identity error becomes obvious.

Document required and optional arguments. A friendly greeting may omit a repeated name by approved design, but an account security notice should not silently lose a reference needed to identify the affected account. Omission is a product decision, not a translator’s arbitrary preference.

Cardinal plurals vary across locales

A cardinal plural expression chooses grammatical wording for a number. English commonly distinguishes one and other, while other languages may need categories including zero, two, few or many according to the rules used by the formatter. Do not copy an English two-branch pattern into every locale and assume the grammar will work.

For each target, test zero, one, two, three, five, eleven, twenty-one and meaningful larger or fractional numbers. Have a fluent reviewer read the entire result, not just the noun. Agreement may affect adjectives, verbs and surrounding phrases.

A quantity can select the correct branch while failing to appear visibly where the reader needs it. Decide whether the UI should report an exact count or a qualitative status, and test interpolation separately from branch choice.

Ordinal plurals are a separate kind of meaning

Ordinal expressions describe position such as first, second or third, not how many items exist. Some languages have distinct ordinal forms or conventions that do not follow cardinal number rules. next-intl’s ICU support includes ordinal pluralization patterns, so a message about a ranking or anniversary should use the appropriate mechanism.

Do not translate an ordinal expression as though it were a generic quantity. Saying five items and fifth item communicates different things. A product may need to show a person’s place in a queue, not the number of people in the queue.

Test positions one, two, three, four, eleven and twenty-one as relevant. Include the full sentence in context, because the surrounding noun and punctuation may change. Accurate positional language helps readers interpret results without guessing.

Select messages can express an application state

An ICU select expression chooses content based on an application-provided value, such as pending, completed or failed. The selector labels can be technical identifiers that code sends; translating them into visible target-language words can break selection while the sentences remain grammatical.

Define the full set of possible input values and review the output for each. A payment marked pending must not display a completion message through a careless fallback. Where the app receives an unknown state, the product should define a safe default rather than promising success.

The target language can use a different sentence structure within each branch. The programmatic state and the reader-facing wording are distinct responsibilities that need to be checked together.

Nested choices should be tested as a matrix

Complex notifications may combine state and count. A message could select whether an upload succeeded, then describe how many items were processed. Such nested patterns are difficult to verify by inspecting only one branch in a spreadsheet. A generic translation importer can accidentally delete part of the syntax.

Build a small table of expected inputs. Include success with one item, success with five, failure with zero and an unexpected state. Render each combination through next-intl using the intended locale and check both syntax and meaning.

If the message becomes too complex to maintain safely, consider splitting it into distinct product states with clear ownership rather than hiding many unrelated claims inside one oversized pattern. Complexity should serve readable grammar, not make the interface harder to review.

Rich text should remain semantic React components

Some target messages contain an emphasized phrase or hyperlink. next-intl provides a rich-text translation mechanism that maps named tags in messages to React elements supplied by the component. This lets a translator move the linked phrase naturally without inventing arbitrary HTML.

A terms notice should link the words that actually refer to terms in each language. The link URL, focus behavior and click target belong to the React component, not to arbitrary translated markup. The target text can move the tagged segment without losing the interaction.

Test the rendered link, keyboard order and screen-reader name. A correct sentence with the wrong words clickable is an incomplete localization. The goal is preservation of user action, not only preservation of punctuation.

Keep raw markup and unsafe HTML out of language files

A translator may wish to emphasize a warning or add a line break. That does not mean every target string should be treated as trusted HTML. A raw HTML rendering path changes the security and accessibility responsibilities of the application.

Use next-intl’s supported rich-text approach where appropriate and let components own the permitted elements. User-supplied values should remain data and be safely rendered. A person’s name containing angle brackets should never execute code because it was interpolated into a translation.

When a message needs a more flexible layout, adjust the component or the semantic markup contract instead of allowing uncontrolled HTML through a translation platform.

Locale routing is a real URL decision

next-intl supports locale-aware routing configurations, including prefixed paths and domain-based setups. A site may serve English at /en/about and German at /de/about, or use a different strategy for the default locale. The choice determines how visitors, links and search engines reach translated content.

Define the supported locales and default in the routing configuration rather than scattering checks across components. Test direct requests to each localized route. A language switch that changes visible labels but leaves users on an unrelated URL can break bookmarks, refreshes and content discovery.

The routing strategy should match the site’s actual audiences and host infrastructure. A target JSON catalog does not by itself create a valid localized page or a coherent language navigation path.

Prefix settings have consequences

Routing configuration can choose whether prefixes are always present, present only when necessary or hidden from public URLs under certain approaches. These options affect redirects, cookies, alternative links and how locale-specific content is identified. The official next-intl documentation explains the behavior and tradeoffs.

For a public educational site, distinct localized URLs can make it easier for readers to share a precise language version. For an authenticated product, preferences and cookies may play a stronger role. Neither approach is automatically correct for all situations; the team should define the user experience before implementation.

Test a new visitor without a locale cookie, a returning visitor who changed language, a direct deep link and a request with an unsupported locale. Those four cases expose many surprising routing defects.

Locale detection must not override explicit reader intent

An application can consider URL prefixes, domains, a language preference cookie and request headers when determining locale. If those signals conflict, the product needs a predictable precedence policy. A reader who chooses Spanish should not be unexpectedly redirected to English every time they navigate.

Test language selection across a sequence of real actions: choose language, visit another page, sign in, sign out and refresh. Record the route and effective locale at each step. A test that checks only the language switcher’s first click may miss the later failure.

When a mismatch occurs, repair the routing or preference handling. Rewriting the Spanish message cannot change which locale the application selects.

Shared navigation helpers reduce localization bugs

next-intl provides navigation integration for locale-aware links and related operations. Using a consistent routing configuration helps prevent one link from dropping the locale while another preserves it. A hand-built URL can look correct in a component but produce broken paths after prefixes or domain mappings change.

Check the route to an article, the return link, pagination, search-result links and an account settings button. A visitor should not lose the selected language merely by following normal navigation. Also test redirects triggered after form submissions.

Link translation and route localization are separate. The visible link label needs natural target-language wording, while its destination must remain a valid route representing the same content or action.

Understand the request configuration that loads messages

next-intl supports request configuration for selecting locale-specific messages and other formatting context. A correct target file does nothing if the request loader imports the wrong JSON or receives an undefined locale. This issue can look exactly like a missing translation to a reader.

Trace the request from the route to message loading. Log the resolved locale and catalog identity in a controlled development environment. If the file path is derived from a locale string, confirm it maps only to supported catalog names and handles unsupported inputs safely.

Keep the process server-aware. A shared mutable global variable should not allow one request’s language to leak into another user’s request. Request-scoped configuration protects both correctness and predictability.

Server and client components have different needs

A Next.js App Router application can render server components and client components. Localization may happen in either environment, but the integration and data passing can differ. A message that works on the server should not become a missing key when a client component receives a reduced message set.

Document which parts of the app require client-side translations and which can render on the server. Load only what the component needs where appropriate, but ensure that necessary messages are present. A tiny optimization that removes a required client namespace can harm the whole feature.

Test direct server rendering, browser hydration and client navigation. Consistency matters because users do not care whether an English label appeared during one technical stage or another.

Hydration mismatches are not language errors

Suppose a German page is rendered on the server, but the browser hydrates the same component using English because a provider initialized with the wrong messages. The page may flash or change language unexpectedly. The German translation is already correct; the defect is in state transfer or provider setup.

Capture the locale and message version used for server output and for client hydration. Verify they agree for the request, then repeat under a different language and with a full reload.

Do not patch the target catalog to hide the mismatch. Correct the configuration once so every locale benefits. Separating delivery errors from text errors is essential for efficient multilingual debugging.

Static rendering and dynamic locale data require coordination

Some localized routes can be statically rendered; others depend on request-specific data such as authentication, cookies or user-selected regional preferences. next-intl’s routing and rendering guides describe ways to coordinate locale information with the App Router. The exact implementation depends on the Next.js version and application requirements.

The useful editorial rule is that a page should render the correct translated content for the locale represented by its URL or request state. Whether it was prebuilt or generated dynamically is an engineering detail, but inconsistent source and target data is visible immediately to readers.

Test a clean deployment build rather than assuming development mode behaves identically. Confirm each supported locale path resolves and contains the intended text, even when the page is reached directly rather than through in-app navigation.

Missing translations require an explicit policy

A localization library may produce error messages, fallbacks or other behavior when a key is missing. The product must decide what counts as an acceptable fallback. A generic welcome message might be lower priority than an account security instruction, but both should be visible in the completeness report.

Compare the source key inventory against each supported target and record missing, extra and changed paths. Treat intentional omissions separately from accidental gaps. A page that returns some readable string does not prove that the correct target translation has been supplied.

Test a controlled missing key and verify how the application reports and displays it. Then restore the resource. The point is to confirm that monitoring works before a production visitor discovers the omission.

Format currency and numbers under the intended locale

next-intl supports number formatting and uses locale information to produce appropriate separators, signs and currency presentations. A target message can be grammatically correct while showing an amount with misleading punctuation. Keep amounts as data supplied by the application rather than converting them through word substitution.

Test a small price, a large grouped amount, a discount percentage and a negative adjustment. Check the actual currency and rounding policy as well as the words around the value. A technical order reference should remain exact, while a purchase amount may require locale-aware formatting.

Give translators sample values and units so they can write natural sentences. They should not be required to infer whether {total} means a count, currency amount or percentage from the English words alone.

Dates, times and timezones have their own contract

A time-based reminder may say tomorrow at 9:00, but the accuracy of tomorrow depends on the viewer’s timezone and the current event timestamp. next-intl provides date and time formatting helpers, and applications must decide which timezone belongs to the event or the user.

Test at local day boundaries, across daylight-saving transitions where relevant and with region-specific date orders. Verify that the translated sentence identifies the correct event. If one locale displays a different calendar day from another, that may be correct—but it should be due to intentional formatting policy rather than a bug.

Keep date formatting and natural-language wording separate so the target language can move the date within the sentence without changing the underlying fact.

Localized URLs are part of multilingual SEO

For a publicly accessible multilingual website, readers and search engines need stable ways to reach each language version. Distinct URLs, appropriate language metadata, and consistent alternate-language links can help clarify which page belongs to which audience. next-intl includes routing facilities relevant to such setups, but the site’s metadata decisions still require editorial ownership.

Check that a French article is genuinely in French, that its canonical points to the intended version, and that alternate links refer to real corresponding pages. Do not create hundreds of thin pages by simply changing the locale prefix while leaving the content in English.

A good multilingual page answers the reader’s query in the target language and has a clear relationship to the original article. Accurate translation and correct SEO routing reinforce each other when neither is treated as a shortcut.

Localized page titles and descriptions deserve independent review

A browser title or search description may have a different length and communication role from a page heading. It should be translated to describe the target page accurately rather than mechanically duplicating the English title. The same applies to social sharing metadata and link previews.

For a product guide, lead with the searcher’s actual question in that language. Avoid overpromising a complete solution where the article only covers a narrow issue. If the target page contains regional examples, make its description match the content visitors will find.

Test metadata on real localized routes. A page can show Spanish in the body but still expose an English title because the metadata generator used the wrong request configuration.

Keep forms and errors in the same language

A multilingual form may contain translated labels while validation errors from a server response remain in English. The editor might correctly update the target JSON, yet the API produces its own unlocalized error. This is an integration problem requiring a clear responsibility for human-facing messages.

Prefer structured error codes or identifiers mapped to localized messages where appropriate, with the server retaining authority over the actual validation result. Then test required fields, invalid formats, network failures and successful submission under each priority locale.

The reader needs to understand how to recover, not just see a grammatical sentence. A form error that hides which field failed is a content-quality problem even if it is technically translated.

Accessibility content should be treated as primary content

A page’s visible words are only part of its language experience. Accessible labels, image descriptions, tooltips, status announcements and keyboard navigation instructions are also reader-facing content. A translated icon with an English aria-label can leave a screen-reader user confused about what the control does.

Include accessible messages in the same source-to-target inventory. Provide descriptions that identify the object and action, not only the icon’s appearance. Test variable interpolation by listening to the final message rather than reviewing JSON in isolation.

At larger text sizes, check whether labels and warnings remain complete. Accessibility failures often reveal where the UI was designed around English length and layout assumptions.

Right-to-left messages need safe mixed-direction rendering

Arabic and Hebrew pages may include left-to-right names, URLs, order IDs and numbers. A correctly translated sentence can still be hard to use if the interface renders those values in the wrong visual order. next-intl handles messages; the component and document directionality need to support the target language too.

Test a real example containing an Arabic notice and a Latin transaction reference. Check copying the code, link interaction, punctuation and assistive reading order. Avoid blanket insertion of invisible directional characters into every target catalog entry.

Where the rendering component is responsible, fix it once and test across target locales. The translator’s job is to approve the natural language, not to compensate for broken bidirectional layout behavior through fragile textual workarounds.

Responsive layouts should accommodate expansion

A German button can be substantially longer than its English source, while another script may require different line breaks or vertical spacing. A localized route is not successful if its most important action disappears behind a clipped label.

Test mobile layouts, long user names, increased font size and narrow columns. Decide whether the component can wrap or grow before demanding unnatural abbreviations. Where a shorter target is acceptable, confirm that it still communicates the correct action and consequence.

Do not trim safety, consent or refund warnings simply to fit an inherited English design. Preserving user understanding is more important than keeping identical character counts.

Compare target catalogs against a changing source

A source message can change even when its key remains constant. An old target may still say the application is processing a payment after the product changes the state to completed. Keeping that translation automatically would preserve the wrong meaning.

For each extraction or editorial update, record new, removed, meaning-changed and argument-changed messages. Review the affected targets before deployment and document the source version to which each approval applies.

Do not assume a translation memory match score proves semantic equivalence. A single negative word, threshold number or changed actor can change the user’s decision. Contextual review is a necessary part of fast, responsible localization.

A worked error: one page drops its locale prefix

A visitor opens a German guide at a /de/ route, clicks a related article and lands on the English version. The translations are present in both catalogs. The link was built without locale-aware navigation or a routing configuration that preserved the visitor’s selection.

Reproduce the click, inspect the generated destination and fix the navigation layer. Then test both client navigation and a direct reload at the destination. An application can look fine on its first page and fail immediately at the second stop.

A regression test should follow at least two practical links within each target locale. The correct language must remain stable through a real reading journey.

A worked error: the plural expression has a missing argument

A localized notification expects {count, plural, one {…} other {…}}, but a component calls the translation without supplying count. The target language may be correct in the file yet fail formatting or display a fallback. Editing a target noun does not repair the missing argument.

Trace the call site, confirm the argument contract and supply the intended count. Then render the message with several values, including zero. Review the target language’s complete wording under each branch.

Prevent recurrence by keeping arguments documented and adding a format-aware test. Where the installed tools support type checking, make the argument contract visible to developers before runtime.

A worked error: the client and server choose different locales

A localized article is correct when loaded directly but changes to English after the browser hydrates. Investigate request locale, server message loading and the client provider’s initial state. Compare the catalogs rather than blaming the translator.

Correct the state transfer and test two locales in clean browser sessions. Repeat a full reload and normal in-app navigation to confirm the server and browser render the same message identity.

This class of defect should become a shared regression test because one engineering fix protects every current and future translated page.

A worked error: rich-text markup is removed by export

A privacy notice includes a linked terms phrase. An export tool returns plain translated text but drops the rich-text marker, making the phrase no longer clickable. The target sentence is perfectly readable in the catalog yet incomplete as a user interaction.

Protect the named rich-text marker, allow it to move within the target sentence and test the actual link. Check keyboard focus and the accessible link name. A generic diff of words cannot detect this functional loss.

Use an import-export fixture containing a tagged link so a future localization-platform upgrade does not silently repeat the defect.

Build an import-export fixture before scaling

Create a small set of messages containing a plain heading, a variable, a plural, a select, a rich-text marker, a date or number value, and a target-specific punctuation example. Import and export them through the intended translation tool without edits. Compare parsed structure and required arguments.

Then translate the set into one target locale and render it under a real route. Test server output, browser hydration, language navigation and accessibility. A correct file is only the first stage; a correct reading experience is the release goal.

Retain the fixture as a regression after upgrades to Next.js, next-intl, the message catalog generator or a translation vendor’s filter. Small, controlled tests are much cheaper than investigating a broken multilingual deployment.

A practical release checklist

Confirm that every intended locale maps to a valid route and request configuration. Check required catalog keys, message syntax, arguments and rich-text markers. Test plurals and selects with representative inputs, and validate number and date formatting separately. Ensure language navigation, metadata, error pages, and accessible labels are coherent.

Ask a qualified target-language reviewer whether the content conveys the same actual decision and consequence. Pay special attention to permissions, payments, privacy, deletions and eligibility. A successful build is a technical milestone, not a semantic guarantee.

Record the source revision, target catalog revision, deployed build and known exceptions. Those details let the team reproduce future issues without translating stable material again. The fastest sustainable workflow is one where each failure is diagnosed once and prevented afterward.

Frequently asked questions about next-intl

How do I translate a Next.js page with next-intl? Provide the target message under the correct key, ensure the request loads that locale’s catalog and render it through next-intl in the component. Check the actual localized URL.

Why does useTranslations return unexpected text? Confirm namespace, key, loaded messages and effective locale. A missing catalog or route mismatch can resemble a wording error.

Can next-intl format ICU plurals? Its documented translation usage supports ICU-style cardinal and ordinal plural expressions and select messages. Test the target locale with actual values.

Does next-intl automatically make multilingual SEO perfect? No. The team still needs correct localized content, URLs, metadata, canonical and alternate-language decisions appropriate to the site.

Why does a locale switch change after refresh? Examine routing strategy, prefix handling, cookies, locale detection and request configuration rather than editing the translated sentence.

Can a target move rich-text links? The supported rich-text approach allows a semantic tag to move with the words in another language. Preserve tag identity and test the rendered interaction.

Official next-intl references and a practical next step

Read the current next-intl guides for message rendering at https://next-intl.dev/docs/usage/translations , routing setup at https://next-intl.dev/docs/routing/setup and routing configuration at https://next-intl.dev/docs/routing/configuration . Choose the guides matching your installed Next.js version and router.

Related reading includes https://edukatesg.com/how-people-translate-quickly-series-index/ , https://edukatesg.com/2026/10/23/how-people-translate-quickly-formatjs-react-intl-localization-qa/ and https://edukatesg.com/2026/09/19/how-people-translate-quickly-icu-messageformat-plurals-selects/ . The wider translation system is linked from https://edukatesg.com/2026/09/18/master-art-of-translation-complete-system-moving-meaning-between-languages/ .

Start with a route containing a heading, plural status, dynamic name, rich-text link and accessible error. Translate it for two locales, open each route directly, switch languages, test a refresh and inspect the final messages. When that small route is correct from server to browser, scale it across the application. The result is a multilingual website that people can navigate, understand and trust—not merely a collection of translated JSON files.

Treat search intent as a reader experience

For informational pages, a localization project should also consider why a reader arrived from search. The English title and introduction may answer a question that target-language readers phrase differently. A translation should preserve the factual answer and specificity, but may need to use the target audience’s natural terminology in headings and short descriptions.

Review the target page as an independent document. Does the first paragraph answer the local reader’s actual question? Do examples make sense in the target region? Are outbound references and internal links still relevant? A mechanically equivalent phrase may be less useful than a clear natural expression that identifies the same task and outcome.

Keep the canonical content owner and the target-language adaptations explicit. A localized page should not invent a business claim or claim different eligibility simply because a keyword seems popular. Useful international SEO begins with truthful, well-structured language and continues through correct URL delivery.

Documented references: Rendering translations; Routing configuration; Translation series index.

Discover more from eduKate Singapore

Subscribe now to keep reading and get access to the full archive.

Continue reading