Skip to main content
Vuetify0 is now in beta!
Vuetify0 Logo
Theme
Mode
Palettes
Accessibility
Vuetify One
Sign in to Vuetify One

Access premium tools across the Vuetify ecosystem — Bin, Play, Studio, and more.

Not a subscriber? See what's included

Locale

Scopes a locale to a component subtree for localized sections of your app.

Installation

Install the Locale plugin in your app’s entry point:

main.ts
import { createApp } from 'vue'
import { createLocalePlugin } from '@vuetify/v0'
import App from './App.vue'

const app = createApp(App)

app.use(
  createLocalePlugin({
    default: 'en',
    messages: {
      en: {
        hello: 'Hello',
        welcome: 'Welcome, {name}!',
      },
      es: {
        hello: 'Hola',
        welcome: '¡Bienvenido, {name}!',
      },
    },
  })
)

app.mount('#app')

Usage

Wrap any section of your template in <Locale> to override the active locale for that subtree. Children calling useLocale() will see the scoped locale as the current selection, and t() / n() calls will resolve against the scoped locale — not the parent’s.

vue
<script setup lang="ts">
  import { Locale } from '@vuetify/v0'
</script>

<template>
  <Locale locale="fr">
    <!-- Everything here sees "fr" as the active locale -->
    <slot />
  </Locale>
</template>

Anatomy

vue
<script setup lang="ts">
  import { Locale } from '@vuetify/v0'
</script>

<template>
  <Locale />
</template>

Examples

Scoped Override

Nest <Locale> components to create layered locale contexts. Each card reads its scoped locale independently via useLocale().

FileRole
LocaleCard.vueConsumer — reads useLocale() to display translated content
LocaleSection.vueWrapper — uses <Locale> to scope a locale to a section
scoped-override.vueEntry — sets up locales and nests scoped overrides

Root context (en)

Englishen

Hello — Welcome to our app

3 items selected

Goodbye, World!

Scoped to French
Françaisfr

Bonjour — Bienvenue dans notre application

3 éléments sélectionnés

Au revoir, World !

Nested Spanish
Españoles

Hola — Bienvenido a nuestra aplicación

3 elementos seleccionados

¡Adiós, World!

Independent Spanish scope
Españoles

Hola — Bienvenido a nuestra aplicación

3 elementos seleccionados

¡Adiós, World!

Tip

Scoped translations t() and n() are fully scoped. A <Locale locale="fr"> subtree resolves all translations against the French messages, even when nested inside another <Locale> override. Each scope is independent.

Renderless Mode

When renderless is set, the component does not render a wrapper element. Instead, it passes attrs (including data-locale and lang) via the slot scope for you to bind to your own element:

vue
<script setup lang="ts">
  import { Locale } from '@vuetify/v0'
</script>

<template>
  <Locale locale="fr" renderless v-slot="{ attrs }">
    <section v-bind="attrs">
      No extra wrapper div
    </section>
  </Locale>
</template>

API Reference

The following API details are for all variations of the Locale component.
Was this page helpful?

Ctrl+/