UNPKG

@unvuetify/nuxt-i18n-utils

Version:
101 lines (98 loc) 3.11 kB
import { useNuxtApp, ref, watch, useI18n } from '#imports'; function configureVuetifyI18nDateLocale(dateOptions) { const locales = useNuxtApp().$i18n.locales.value; if (locales) { dateOptions.locale = locales.reduce((acc, locale) => { if (typeof locale === "string") { acc[locale] = locale; } else { acc[locale.code] = locale.code; } return acc; }, {}); } } function configureVuetifyI18nAdapter(vuetifyOptions, options = {}) { const { rtlLocales = ["ar", "he", "fa", "ur"], override } = options; vuetifyOptions.locale ??= {}; const nuxtApp = useNuxtApp(); const i18n = nuxtApp.$i18n; const current = i18n.locale; const fallback = i18n.fallbackLocale; const messages = i18n.messages; const currentLocale = ref(current.value); const locales = i18n.locales.value; if (!vuetifyOptions.locale.locale || override) { vuetifyOptions.locale.locale = current.value; } if (!vuetifyOptions.locale.fallback || override) { vuetifyOptions.locale.fallback = fallback.value; } if (!vuetifyOptions.locale.messages || override) { vuetifyOptions.locale.messages = messages.value; } vuetifyOptions.locale.rtl = locales.reduce((acc, locale) => { if (typeof locale === "string") acc[locale] = rtlLocales.includes(locale); else acc[locale.code] = locale.dir === "rtl"; return acc; }, {}); watch(currentLocale, (val, oldVal) => { if (oldVal) i18n.setLocale(val); }, { immediate: true, flush: "post" }); nuxtApp.hook("i18n:localeSwitched", ({ newLocale }) => { currentLocale.value = newLocale; }); vuetifyOptions.locale.adapter = { name: "@unvuetify:nuxt-i18n-utils:adapter", current: currentLocale, fallback, messages, t: (key, ...params) => i18n.t(key, params), n: i18n.n, provide: createProvideFunction({ current: currentLocale, fallback, messages }) }; } function createProvideFunction(data) { return (props) => { const currentLocale = ref(props.locale ?? data.current.value); const i18n = useI18n({ locale: currentLocale.value, fallbackLocale: data.fallback.value, messages: data.messages.value, useScope: "local", legacy: false, inheritLocale: false }); watch(currentLocale, (val, oldVal) => { if (oldVal) i18n.setLocale(val); }, { immediate: true, flush: "post" }); const t = wrapI18n(i18n.t); const n = wrapI18n(i18n.n); function inferDecimalSeparator() { return i18n.n(0.1).includes(",") ? "," : "."; } return { name: "@unvuetify:nuxt-i18n-utils:adapter", current: currentLocale, fallback: data.fallback, messages: data.messages, decimalSeparator: toRef(() => props.decimalSeparator ?? inferDecimalSeparator()), t, n, provide: createProvideFunction({ current: currentLocale, fallback: data.fallback, messages: data.messages }) }; }; } function wrapI18n(t) { return (...args) => { return t(...args); }; } export { configureVuetifyI18nAdapter, configureVuetifyI18nDateLocale };