UNPKG

nuxt-i18n-micro

Version:

Nuxt I18n Micro is a lightweight, high-performance internationalization module for Nuxt, designed to handle multi-language support with minimal overhead, fast build times, and efficient runtime performance.

44 lines (43 loc) 2.07 kB
import { getEnabledLocaleCodes } from "@i18n-micro/utils/active-locales"; import { defineNuxtRouteMiddleware, navigateTo, useNuxtApp } from "#imports"; import { useI18nLocale } from "../composables/useI18nLocale.js"; function redirectTo(path, to) { return navigateTo({ path, query: to.query, hash: to.hash }, { replace: true, redirectCode: 302 }); } export default defineNuxtRouteMiddleware((to, from) => { if (import.meta.server) return; const nuxtApp = useNuxtApp(); const getRuntimeConfig = nuxtApp.$getI18nConfig; const i18nStrategy = nuxtApp.$i18nStrategy; if (typeof getRuntimeConfig !== "function" || !i18nStrategy) return; const i18nConfig = getRuntimeConfig(); if (i18nConfig.redirects === false) return; if (to.path === from.path) return; const validLocales = getEnabledLocaleCodes(i18nConfig.locales); const defaultLocale = i18nConfig.defaultLocale || "en"; const autoDetectPath = i18nConfig.autoDetectPath || "/"; const { getPreferredLocale } = useI18nLocale(); const routeLocale = i18nStrategy.getCurrentLocale(to, getPreferredLocale()); let preferredLocale = routeLocale || getPreferredLocale() || defaultLocale; const path = to.path || "/"; const pathSegments = path.replace(/^\//, "").split("/").filter(Boolean); const firstSegment = pathSegments[0]; const hasLocalePrefix = Boolean(firstSegment && validLocales.includes(firstSegment)); if (autoDetectPath === "*" && !hasLocalePrefix) { preferredLocale = defaultLocale; } if (autoDetectPath === "*" && hasLocalePrefix && firstSegment !== preferredLocale) { const rest = pathSegments.slice(1).join("/"); let targetPath; if (preferredLocale === defaultLocale && i18nConfig.strategy === "prefix_except_default") { targetPath = rest ? `/${rest}` : "/"; } else { targetPath = rest ? `/${preferredLocale}/${rest}` : `/${preferredLocale}`; } return redirectTo(targetPath, to); } const redirectPath = i18nStrategy.getClientRedirect(path, preferredLocale); if (redirectPath) { return redirectTo(redirectPath, to); } });