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.

55 lines (54 loc) 2.32 kB
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" }); });