@unvuetify/nuxt-i18n-utils
Version:
Nuxt I18n utilities for Vuetify
101 lines (98 loc) • 3.11 kB
JavaScript
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 };