---
title: "i18n Integration · Nuxt AI Ready · Nuxt SEO"
canonical_url: "https://nuxtseo.com/docs/ai-ready/guides/i18n"
last_updated: "2026-08-14T20:41:01.309Z"
meta:
  description: "Surface locale-aware content to AI agents with hreflang Link headers, locale-tagged frontmatter, and a localized llms.txt."
  "og:description": "Surface locale-aware content to AI agents with hreflang Link headers, locale-tagged frontmatter, and a localized llms.txt."
  "og:title": "i18n Integration · Nuxt AI Ready · Nuxt SEO"
---

Nuxt SEO on GitHub

Switch to AI ReadySwitch to Nuxt SEOSwitch to RobotsSwitch to SitemapSwitch to OG ImageSwitch to Schema.orgSwitch to Link CheckerSwitch to SEO UtilsSwitch to Site ConfigSwitch to Skew Protection

**Core Concepts**

# **i18n Integration**

If you have [`**@nuxtjs/i18n**`](https://i18n.nuxtjs.org/) (or `**nuxt-i18n-micro**`) installed, Nuxt AI Ready auto-detects locale data at build time and threads it through every layer of AI-readable output.

No configuration required: install the i18n module, configure your locales, and the integration activates.

## 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. (Anthropic precedent.) |
| **Markdown `**Link**` header** | Each `**.md**` and HTML response advertises `**Link: <url>; rel="alternate"; hreflang="…"**` per locale variant (RFC 8288). |
| **Frontmatter** | Markdown bodies include a `**locale: …**` field. The friendly 404 also lists `**alternates**`. |
| **Database** | Each indexed page persists its `**locale**` for filtered queries and reporting. |
| **FTS5 search** | Tokenizer auto-switches to `**trigram**` for CJK locales (zh / ja / ko); `**unicode61 remove_diacritics 2**` otherwise. |

## URL Strategies

Locale resolution honors the i18n strategy:

- `**prefix_except_default**`: `**/about**` (default), `**/fr/about**`, `**/de/about**`
- `**prefix**`: `**/en/about**`, `**/fr/about**`
- `**prefix_and_default**`: both prefixed and unprefixed defaults
- `**no_prefix**`: every route belongs to the default locale

The module derives the locale from the route prefix at index time and re-derives it at request time for `**Link**` header generation, so behavior stays correct as you add routes dynamically.

To point locale roots and page entries at their available Markdown representations, opt in explicitly:

nuxt.config.ts

```ts
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~~**](https://i18n.nuxtjs.org/docs/guide/custom-paths) rather than from prefix arithmetic. With:

nuxt.config.ts

```ts
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.

Locales an entry doesn't name keep the default locale's path when one is present, matching what i18n serves for an untranslated route. If the entry has no default-locale path, omitted locales are not advertised because no safe URL can be derived.

## Example llms.txt

llms.txt

```txt
# 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

```http
GET /fr/about.md

content-type: text/markdown; charset=utf-8
vary: Accept, Sec-Fetch-Dest
link: </fr/about>; rel="alternate"; type="text/html",
      </about.md>; rel="alternate"; hreflang="en",
      </fr/about.md>; rel="alternate"; hreflang="fr-FR"
```

## Example Frontmatter

/fr/about.md

```md
---
title: "À propos"
description: "À propos d'Acme."
canonical_url: "https://acme.example/fr/about"
last_updated: "2026-04-25T13:48:00.000Z"
locale: "fr"
---

# À propos
…
```

## Disabling Auto-Detection

Set `**autoI18n: false**` to skip integration even with an i18n module present:

nuxt.config.ts

```ts
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 and `**hreflang**` alternates. This follows the Anthropic pattern, chosen to keep the file small and let agents fetch translated content from the same routing they'd use as a normal client.
- `**Link rel="alternate" hreflang="..."**` ships on every markdown and HTML response, so headless agents discover language variants without parsing HTML.
- The `**locale**` column carries the **locale code** (e.g. `**fr**`), not the BCP-47 hreflang tag ( `**fr-FR**`). Both surface in headers: the code in frontmatter, the hreflang in `**Link**`.

## Compatibility

- Requires [`**@nuxtjs/i18n**`](https://i18n.nuxtjs.org/) v8 or higher (or `**nuxt-i18n-micro**`).
- Detection uses the same helper [`**@nuxtjs/sitemap**`](https://nuxtseo.com/sitemap) uses, so behavior is consistent across Nuxt SEO modules.

**Was this page helpful?**

### **Related **

[**llms.txt Generation**](https://nuxtseo.com/docs/ai-ready/guides/llms-txt)

[**On-Demand Markdown**](https://nuxtseo.com/docs/ai-ready/guides/markdown)

[**Configuration**](https://nuxtseo.com/docs/ai-ready/api/config)

[**CLI** Command-line interface for managing runtime sync and IndexNow.](https://nuxtseo.com/docs/ai-ready/guides/cli) [**WebMCP** Register browser tools for AI agents with document.modelContext.](https://nuxtseo.com/docs/ai-ready/guides/webmcp)