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
JavaScript
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);
}
});