OG Image components render as Nuxt Islands (server components), which means
useI18n() composables don't have automatic access to locale context or lazy-loaded messages.
This guide covers two patterns for creating localized OG images with @nuxtjs/i18n.
The simplest approach is to resolve translations at the page level and pass them as props to your OG image component.
<script setup lang="ts">
const { t } = useI18n()
// Pass already-translated strings as props
defineOgImageComponent('MyOgImage', {
title: t('og.title'),
description: t('og.description'),
})
</script>
Your OG image component receives the translated strings directly:
<script setup lang="ts">
defineProps<{
title: string
description: string
}>()
</script>
<template>
<div class="w-full h-full flex flex-col justify-center p-12 bg-white">
<h1 class="text-6xl font-bold">
{{ title }}
</h1>
<p class="text-2xl text-gray-600">
{{ description }}
</p>
</div>
</template>
If you need to use useI18n() directly inside your OG image component (for example, to access many translation keys), you can pass the locale as a prop and use loadLocaleMessages() to load the messages.
<script setup lang="ts">
const { locale } = useI18n()
// Pass locale as a prop
defineOgImageComponent('MyOgImage', {
locale: locale.value,
})
</script>
In your OG image component, load the messages for the requested locale:
<script setup lang="ts">
const props = defineProps<{
locale?: string
}>()
const { t, locale, loadLocaleMessages } = useI18n()
// Load messages for the requested locale, then set it as active
if (props.locale) {
await loadLocaleMessages(props.locale)
locale.value = props.locale
}
</script>
<template>
<div class="w-full h-full flex flex-col justify-center p-12 bg-white">
<h1 class="text-6xl font-bold">
{{ t('og.title') }}
</h1>
<p class="text-2xl text-gray-600">
{{ t('og.description') }}
</p>
</div>
</template>
loadLocaleMessages() function is provided by @nuxtjs/i18n. It asynchronously loads the messages for a specific locale, which is necessary because OG image components render in an isolated server context.When you use useI18n() in a regular page component, the i18n module:
/es/about), cookies, or headersOG image components render as Nuxt Islands via an internal request like /__nuxt_island/MyOgImage_abc123.json. This request:
This is why you need to either pass translated strings as props (Pattern 1) or explicitly load the messages (Pattern 2).