Customize the names of the paths for specific locale.
In some cases, you might want to translate URLs in addition to having them prefixed with the locale code. There are 2 ways of configuring custom paths for your Module configuration or your pages Page component.
no-prefix
strategy.Make sure you set the customRoutes
option to config
and add your custom paths in the pages
option:
export default defineNuxtConfig({
i18n: {
customRoutes: 'config', // disable custom route with page components
pages: {
about: {
en: '/about-us', // -> accessible at /about-us (no prefix since it's the default locale)
fr: '/a-propos', // -> accessible at /fr/a-propos
es: '/sobre' // -> accessible at /es/sobre
}
}
}
})
Note that each key within the pages
object should correspond to the relative file-based path (excluding .vue
file extension) of the route within your pages/
directory excluding the leading /
.
Customized route paths must start with a /
and not include the locale prefix.
You can now use the localePath
function or the <NuxtLinkLocale>
component but be sure to use named routes. For example route /services/advanced
should be services–advanced
:
<script setup>
const { t } = useI18n()
</script>
<template>
<NuxtLinkLocale to="about"> {{ $t('about') }} </NuxtLinkLocale>
<NuxtLinkLocale to="services–advanced"> {{ $t('advanced') }} </NuxtLinkLocale>
</template>
Or:
<script setup>
const { t } = useI18n()
const localePath = useLocalePath()
</script>
<template>
<NuxtLink :to="localePath('about')"> {{ t('about') }} </NuxtLink>
<NuxtLink :to="localePath('services-advanced')"> {{ t('advanced') }} </NuxtLink>
</template>
localePath
is not supported, currently.You have some routes with the following pages
directory:
pages/
├── about.vue
├── me.vue
├── services/
├──── index.vue
├──── advanced.vue
You would need to set up your pages
property as follows:
export default defineNuxtConfig({
i18n: {
customRoutes: 'config',
pages: {
about: {
fr: '/a-propos',
},
me: {
fr: '/moi',
},
'services/index': {
fr: '/offres',
}
'services/advanced': {
fr: '/offres/avancee',
}
}
},
})
If you want customize the URL of a static vue file, you should use the file's name. If the view is in a sub-directory you should use folder name and vue files name with trailing slash.
/
You have some routes with the following pages
directory:
pages/
├── about.vue
├── services/
├──── coaching.vue
├──── index.vue
├──── development/
├────── app.vue
├────── website.vue
├────── index.vue
You would need to set up your pages
property as follows:
export default defineNuxtConfig({
i18n: {
customRoutes: 'config',
pages: {
about: {
fr: '/a-propos'
},
'services/index': {
fr: '/offres'
},
'services/development/index': {
fr: '/offres/developement'
},
'services/development/app': {
fr: '/offres/developement/app'
},
'services/development/website': {
fr: '/offres/developement/site-web'
},
'services/coaching': {
fr: '/offres/formation'
}
}
}
})
If a custom path is missing for one of the locales, the defaultLocale
custom path is used, if set.
Say you have some dynamic routes like:
pages/
├── blog/
├──── [date]/
├────── [slug].vue
Here's how you would configure these particular pages in the configuration:
export default defineNuxtConfig({
i18n: {
customRoutes: 'config',
pages: {
'blog/[date]/[slug]': {
// params need to be put back here as you would with Nuxt Dynamic Routes
// https://nuxt.com/docs/guide/directory-structure/pages#dynamic-routes
ja: '/blog/tech/[date]/[slug]'
// ...
}
}
}
})
You can use the defineI18nRoute
compiler macro to set some custom paths for each page component.
<script setup>
defineI18nRoute({
paths: {
en: '/about-us', // -> accessible at /about-us (no prefix since it's the default locale)
fr: '/a-propos', // -> accessible at /fr/a-propos
es: '/sobre' // -> accessible at /es/sobre
}
})
</script>
To configure a custom path for a dynamic route, you need to use it in double square brackets in the paths similarly to how you would do it in Nuxt Dynamic Routes:
<script setup>
defineI18nRoute({
paths: {
en: '/articles/[name]',
es: '/artículo/[name]'
}
})
</script>
defineI18nRoute
compiler macro is tree-shaked out at build time and is not included in the dist files.