---
title: "Nuxt I18n · Nuxt Schema.org · Nuxt SEO"
canonical_url: "https://nuxtseo.com/docs/schema-org/guides/i18n"
last_updated: "2026-08-14T16:53:42.764Z"
meta:
  description: "How to use the Nuxt Schema.org module with Nuxt I18n."
  "og:description": "How to use the Nuxt Schema.org module with Nuxt I18n."
  "og:title": "Nuxt I18n · Nuxt Schema.org · Nuxt SEO"
---

Nuxt SEO on GitHub

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

**Core Concepts**

# **Nuxt I18n**

## I18n Defaults

When using the [**~~defaults~~**](https://nuxtseo.com/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~~**](https://nuxtseo.com/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~~**](https://nuxtseo.com/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:

i18n/locales/en.ts

```ts
export default {
  nuxtSiteConfig: {
    name: 'My Site',
    description: 'My site description in English',
  },
}
```

i18n/locales/ja.ts

```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**`:

app.vue

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

i18n/en.json

```json
{
  "organization": {
    "name": "My Company",
    "description": "We build great software solutions"
  }
}
```

i18n/ja.json

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

**Was this page helpful?**

[**Setup Identity** Improve your Schema.org by providing the identity of your site.](https://nuxtseo.com/docs/schema-org/guides/setup-identity) [**Supported Nodes** The nodes available for Nuxt Schema.org.](https://nuxtseo.com/docs/schema-org/guides/nodes)