---
title: "Nuxt I18n"
description: "How to use the Nuxt Schema.org module with Nuxt I18n."
canonical_url: "https://nuxtseo.com/docs/schema-org/guides/i18n"
last_updated: "2026-05-25T06:23:11.258Z"
---

## I18n Defaults

When using the [defaults](/docs/schema-org/api/config#defaults) configuration, the module will automatically integrate with Nuxt I18n.

It will read your configuration, adding unique `WebSite` entities for each locale and connecting them with `translationOfWork`
and `workTranslation` properties.

The `WebSite` node's `name` and `description` are read from your [Site Config](/docs/site-config/getting-started/how-it-works) and resolved per request during SSR based on the current locale.

As an example, the following would be generated when visiting the default `en` route when your site supports both `ja` and `zh`.

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://nuxtseo.com/en#website",
      "@type": "WebSite",
      "description": "The quickest and easiest way to build Schema.org graphs for Nuxt.",
      "inLanguage": "en-US",
      "name": "nuxt-schema-org",
      "publisher": {
        "@id": "https://nuxtseo.com/#identity"
      },
      "url": "https://nuxtseo.com/en",
      "workTranslation": [
        {
          "@id": "https://nuxtseo.com/en#website"
        },
        {
          "@id": "https://nuxtseo.com/ja#website"
        },
        {
          "@id": "https://nuxtseo.com/zh#website"
        }
      ]
    },
    {
      "@id": "https://nuxtseo.com/en#webpage",
      "@type": "WebPage",
      "about": {
        "@id": "https://nuxtseo.com/#identity"
      },
      "description": "The quickest and easiest way to build Schema.org graphs for Nuxt.",
      "isPartOf": {
        "@id": "https://nuxtseo.com/en#website"
      },
      "name": "Welcome",
      "potentialAction": [
        {
          "@type": "ReadAction",
          "target": [
            "https://nuxtseo.com/en"
          ]
        }
      ],
      "url": "https://nuxtseo.com/en"
    },
    {
      "@id": "https://nuxtseo.com/#identity",
      "@type": "Organization",
      "name": "nuxt-schema-org",
      "url": "https://nuxtseo.com"
    }
  ]
}
```

## Per-Locale Site Name and Description

The `WebSite` node's `name` and `description` are sourced from [Site Config](/docs/site-config/getting-started/how-it-works). The Nuxt Site Config i18n plugin integrates with `@nuxtjs/i18n` by reading translation keys under `nuxtSiteConfig`. It calls `i18n.t("nuxtSiteConfig.name")` and `i18n.t("nuxtSiteConfig.description")` reactively, pushing the translated values into the site config stack.

To provide per-locale values, add the `nuxtSiteConfig` keys to your locale files:

```ts [i18n/locales/en.ts]
export default {
  nuxtSiteConfig: {
    name: 'My Site',
    description: 'My site description in English',
  },
}
```

```ts [i18n/locales/ja.ts]
export default {
  nuxtSiteConfig: {
    name: '私のサイト',
    description: '日本語のサイト説明',
  },
}
```

During SSR, the `WebSite` node's `name` and `description` will reflect the current locale for each request. For client-side locale switching to update the JSON-LD, enable `schemaOrg.reactive: true` in your `nuxt.config.ts`.

## Per-Locale Identity with useSchemaOrg

The identity configured in `nuxt.config.ts` is static and shared across all locales. If you need locale-specific identity data (e.g., a translated organization description), use `useSchemaOrg` with `defineOrganization` in your `app.vue`:

```vue [app.vue]
<script lang="ts" setup>
import { useI18n } from '#i18n'
import { defineOrganization, useSchemaOrg } from '#imports'

const { t } = useI18n()

useSchemaOrg([
  defineOrganization({
    name: () => t('organization.name'),
    description: () => t('organization.description'),
    logo: '/logo.png',
  }),
])
</script>
```

```json [i18n/en.json]
{
  "organization": {
    "name": "My Company",
    "description": "We build great software solutions"
  }
}
```

```json [i18n/ja.json]
{
  "organization": {
    "name": "私の会社",
    "description": "優れたソフトウェアソリューションを構築しています"
  }
}
```

Since `useSchemaOrg` merges with existing nodes, the `defineOrganization` call will update the identity node that was set up through your config. The getter functions (e.g., `() => t('...')`) are recomputed on each server render and on subsequent client-side navigations. By default, `useSchemaOrg()` only runs during SSR. To enable client-side reactivity (e.g., updating JSON-LD when the locale changes without a navigation), set `schemaOrg.reactive: true` in your `nuxt.config.ts`.
