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.
55 lines (54 loc) • 2.32 kB
JavaScript
import { mergeI18nHead } from "@i18n-micro/utils/merge-i18n-head";
import { isMetaDisabledForRoute } from "@i18n-micro/utils/route";
import { resolveI18nConfigWithRuntimeOverrides } from "@i18n-micro/utils/runtime-config";
import { computed, watch } from "vue";
import { getI18nConfig } from "#build/i18n.strategy.mjs";
import { defineNuxtPlugin, useHead, useRequestURL, useRoute, useState } from "#imports";
import { useI18nHead } from "../composables/useI18nHead.js";
import { useLocaleHead } from "../composables/useLocaleHead.js";
export default defineNuxtPlugin((nuxtApp) => {
const route = useRoute();
const i18nRouteParams = useState("i18n-route-params", () => ({}));
const { pageHead } = useI18nHead();
const getRuntimeConfig = nuxtApp.$getI18nConfig;
const i18nConfig = resolveI18nConfigWithRuntimeOverrides(
typeof getRuntimeConfig === "function" ? getRuntimeConfig() : getI18nConfig()
);
const currentLocale = nuxtApp.$getLocale?.();
if (isMetaDisabledForRoute(route, i18nConfig.routeDisableMeta, currentLocale)) {
return;
}
const url = useRequestURL({
xForwardedHost: i18nConfig.metaTrustForwardedHost !== false,
xForwardedProto: i18nConfig.metaTrustForwardedProto !== false
});
const baseUrl = i18nConfig.metaBaseUrl || url.origin;
const { metaObject, updateMeta } = useLocaleHead({
addDirAttribute: true,
identifierAttribute: "id",
addSeoAttributes: true,
baseUrl,
autoUpdate: false
});
const mergedHead = computed(() => {
const { $getLocales, $getLocale } = nuxtApp;
const allLocales = $getLocales?.() ?? i18nConfig.locales ?? [];
const locale = $getLocale?.() || i18nConfig.defaultLocale || "en";
return mergeI18nHead(metaObject.value, pageHead.value, {
identifierAttribute: "id",
locales: allLocales,
currentLocale: locale
});
});
useHead(mergedHead);
const refreshMeta = () => updateMeta();
if (import.meta.server) {
nuxtApp.hook("app:rendered", refreshMeta);
} else {
refreshMeta();
nuxtApp.hook("page:finish", refreshMeta);
}
watch(() => i18nRouteParams.value, refreshMeta, { deep: true, flush: "post" });
watch(() => [route.fullPath, route.name, route.matched.length], refreshMeta, { flush: "post" });
watch(pageHead, refreshMeta, { deep: true, flush: "post" });
});