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.
54 lines (53 loc) • 2.37 kB
JavaScript
import { getEnabledLocaleCodes } from "@i18n-micro/utils/active-locales";
import { withoutAppBaseURL } from "@i18n-micro/utils/app-path";
import { getLocaleCookieName } from "@i18n-micro/utils/cookie";
import { resolveServerLocale } from "@i18n-micro/utils/resolve-locale";
import { resolveI18nConfigWithRuntimeOverrides } from "@i18n-micro/utils/runtime-config";
import { defineEventHandler, getCookie, getHeader, getQuery, getRequestURL } from "h3";
import { getI18nPrivateConfig } from "#i18n-internal/config";
import { getI18nConfig } from "#i18n-internal/strategy";
import { useRuntimeConfig } from "#imports";
import { loadTranslationsFromServer } from "../utils/server-loader.js";
export default defineEventHandler(async (event) => {
const appBaseURL = useRuntimeConfig(event).app.baseURL;
const rawPath = event.path || getRequestURL(event).pathname;
const path = withoutAppBaseURL(rawPath, appBaseURL);
if (path.startsWith("/api") || path.startsWith("/_nuxt") || path.startsWith("/_locales") || path.startsWith("/__")) return;
if (path.includes(".") && !path.endsWith(".html")) return;
const config = resolveI18nConfigWithRuntimeOverrides(
getI18nConfig(),
useRuntimeConfig(event).public
);
const privateConfig = getI18nPrivateConfig();
const validLocales = getEnabledLocaleCodes(config.locales);
const defaultLocale = config.defaultLocale || "en";
const pathSegments = path.split("/").filter(Boolean);
const firstSegment = pathSegments[0];
const hasLocaleInUrl = Boolean(firstSegment && validLocales.includes(firstSegment));
const cookieName = getLocaleCookieName(config);
const queryLocale = getQuery(event).locale ? String(getQuery(event).locale) : null;
const cookieLocale = cookieName ? getCookie(event, cookieName) : null;
const locale = resolveServerLocale({
defaultLocale,
validLocales,
autoDetectLanguage: config.autoDetectLanguage,
hasLocaleInUrl,
urlLocale: firstSegment ?? null,
queryLocale,
cookieLocale,
acceptLanguageHeader: getHeader(event, "accept-language")
});
let translations = {};
if (privateConfig.serverTranslationPreload) {
try {
const loaded = await loadTranslationsFromServer(locale, "index");
translations = loaded.data;
} catch {
translations = {};
}
}
event.context.i18n = {
locale,
translations
};
});