---
title: "i18n Integration"
description: "Publish locale links and language metadata from your Nuxt i18n configuration."
canonical_url: "https://nuxtseo.com/docs/ai-ready/guides/i18n"
last_updated: "2026-09-24T09:20:16.379Z"
---

Configure your locales in [`@nuxtjs/i18n`](https://i18n.nuxtjs.org/) 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](https://sqlite.org) 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/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 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:

```ts [nuxt.config.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:

```ts [nuxt.config.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.

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.

```txt [llms.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

For a successful request with English and French locales, the relevant headers include:

```http
Content-Type: text/markdown; charset=utf-8
Vary: Accept, Sec-Fetch-Dest, User-Agent
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:

```md [/fr/about.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
…
```

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:

```ts [nuxt.config.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. Agents can follow those links when they need translated content.
- Eligible successful Markdown and HTML responses include `hreflang` links. Error responses omit locale links to avoid advertising unavailable pages.
- The `locale` column 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 the `Link` header.

## Compatibility

- Configure [`@nuxtjs/i18n`](https://i18n.nuxtjs.org/) or `nuxt-i18n-micro` with the locales your app serves.
- Detection uses the shared Nuxt SEO i18n helpers. Configure locales in the i18n module, then inspect the generated links.

## Sitemap

See the full [sitemap](/sitemap.md) for all pages.
