i18n Integration
Configure your locales in @nuxtjs/i18n or nuxt-i18n-micro.
Nuxt AI Ready detects that configuration and adds locale links.
Runtime HTML-to-Markdown conversion also adds locale frontmatter.
What Auto-Activates
| Surface | Behavior |
|---|---|
llms.txt | Adds an ## Available Languages on Website section listing every locale, page count, and locale-root link. Locale roots use canonical URLs by default, or available Markdown representations when you enable llmsTxt.markdownLinks. Default-locale pages stay inlined; other locales appear as references. |
Markdown Link header | Eligible successful Markdown and HTML responses advertise Link: <url>; rel="alternate"; hreflang="…" per locale variant (RFC 8288). |
| Frontmatter | Runtime HTML-to-Markdown conversion adds locale. Content-source and prerendered output need their own locale metadata. The friendly 404 also lists alternates. |
| Database | Each indexed page persists its locale for filtered queries and reporting. |
| FTS5 search | SQLite defaults to trigram when a configured locale is CJK (zh / ja / ko); otherwise unicode61 remove_diacritics 2. An explicit tokenizer overrides this default. Postgres uses its own search implementation. |
URL Strategies
Locale resolution honors the i18n strategy:
prefix_except_default:/about(default),/fr/about,/de/aboutprefix:/en/about,/fr/aboutprefix_and_default: both prefixed and unprefixed defaultsno_prefix: every route belongs to the default locale
The module resolves locales when it indexes pages and when it builds response links. Configured custom routes and locale domains can affect that resolution.
To point locale roots and page entries at their available Markdown representations, opt in explicitly:
export default defineNuxtConfig({
aiReady: {
llmsTxt: {
markdownLinks: true,
},
},
})The same availability checks used for other page entries apply to locale links.
Translated Routes
When a page's slug differs per locale, alternates come from i18n's custom route paths rather than from prefix arithmetic. With:
export default defineNuxtConfig({
i18n: {
customRoutes: 'config',
pages: {
'about': { en: '/about', fr: '/a-propos' },
'blog-slug': { en: '/blog/[slug]', fr: '/journal/[slug]' },
},
},
})/about advertises hreflang="fr" as /fr/a-propos, and /blog/hello advertises /fr/journal/hello. Dynamic, optional and catch-all segments carry their values across locales, and a page set to false for a locale gets no alternate for it.
When several entries could claim a path, the most specific one wins: a static segment beats a dynamic one, and a dynamic one beats a catch-all. A [slug] page never swallows a page that spells its slug out.
For omitted locales, the module uses the configured default-locale path or the original Nuxt page path. If neither path is available, it cannot advertise that locale safely.
Example llms.txt
These page counts and site details are illustrative.
# Acme Docs
> Documentation for Acme.
Canonical Origin: https://acme.example
## Available Languages on Website
- [English (en)](/): 142 pages; content included below.
- [Français (fr)](/fr): 142 pages; visit this language for content.
- [日本語 (ja)](/ja): 80 pages; visit this language for content.
## LLM Resources
- [Full Content](https://acme.example/llms-full.txt): Complete page content in markdown format.
- [sitemap.xml](/sitemap.xml): XML sitemap for search engines and crawlers.
## Pages
- [Home](/)
- [About](/about)
…Example Response Headers
For a successful request with English and French locales, the relevant headers include:
Content-Type: text/markdown; charset=utf-8
Vary: Accept
Link: <https://acme.example/fr/about>; rel="alternate"; type="text/html",
<https://acme.example/fr/about>; rel="canonical",
<https://acme.example/llms.txt>; rel="describedby",
<https://acme.example/about.md>; rel="alternate"; hreflang="en",
<https://acme.example/fr/about.md>; rel="alternate"; hreflang="fr-FR"This example uses /fr/about, without the custom /fr/a-propos mapping above.
Example Frontmatter
Runtime HTML-to-Markdown conversion produces locale metadata like this:
---
title: "À propos"
description: "À propos d'Acme."
canonical_url: "https://acme.example/fr/about"
last_updated: "2026-04-25T13:48:00.000Z"
locale: "fr"
---
# À propos
…Nuxt Content, custom Markdown sources, and prerendered output do not automatically receive this locale field.
If you need it in those outputs, provide locale metadata in their source or generation hook.
Disabling Auto-Detection
Set autoI18n: false to skip integration even with an i18n module present:
export default defineNuxtConfig({
aiReady: {
autoI18n: false,
},
})Behavior Notes
- Only the default locale's page list stays inlined in
llms.txt. Other locales remain discoverable via the Available Languages header andhreflangalternates. Agents can follow those links when they need translated content. - Eligible successful Markdown and HTML responses include
hreflanglinks. Error responses omit locale links to avoid advertising unavailable pages. - The
localecolumn carries the locale code (e.g.fr), not the BCP-47 hreflang tag (fr-FR). Runtime HTML conversion also puts the code in frontmatter. The language tag appears in theLinkheader.
Compatibility
- Configure
@nuxtjs/i18nornuxt-i18n-microwith the locales your app serves. - Detection uses the shared Nuxt SEO i18n helpers. Configure locales in the i18n module, then inspect the generated links.