@nolebase/ui
Version:
A collection of Vue components Nolebase uses.
74 lines (73 loc) • 2.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createI18n = createI18n;
var _vitepress = require("vitepress");
var _vue = require("vue");
function getValueByPropertyPaths(path, obj) {
if (!obj) return void 0;
const properties = String(path).split(".");
let value = obj;
for (const property of properties) {
value = value?.[property];
if (!value) return void 0;
}
if (typeof value === "string") return value;
return String(value);
}
function getTranslationValueByI18nPropertyKey(lang, key, options) {
const {
locales,
defaultLocales
} = options;
if (!locales && !defaultLocales) return key;
if (!lang) return key;
let languageLocale = locales[lang];
if (!languageLocale) {
languageLocale = defaultLocales[lang];
if (!languageLocale) languageLocale = options.defaultEnLocale;
}
const value = getValueByPropertyPaths(key, languageLocale);
if (value) return value;
const defaultLanguageLocale = defaultLocales[lang];
if (defaultLanguageLocale) {
const defaultValue = getValueByPropertyPaths(key, defaultLanguageLocale);
if (defaultValue) return defaultValue;
}
const defaultEnLocaleValue = getValueByPropertyPaths(key, options.defaultEnLocale);
if (defaultEnLocaleValue) return defaultEnLocaleValue;
return key;
}
function createI18n(injectionKey, defaultLocales, defaultEnLocale) {
return () => {
const options = (0, _vue.inject)(injectionKey, {
locales: {}
});
const {
lang
} = (0, _vitepress.useData)();
const language = (0, _vue.computed)(() => lang.value || "en");
return {
t(key, translateOptions) {
const translatedValue = (0, _vue.computed)(() => {
return getTranslationValueByI18nPropertyKey(language.value, key, {
locales: options.locales || {},
defaultLocales,
defaultEnLocale
});
});
if (!translatedValue.value) return translateOptions?.omitEmpty ? "" : key;
if (translateOptions?.omitEmpty && translatedValue.value === key) return "";
if (!translateOptions || !translateOptions.props) return translatedValue.value;
return (0, _vue.computed)(() => {
let result = translatedValue.value;
Object.entries(translateOptions.props || {}).forEach(([property, value]) => {
result = result.replace(new RegExp(`{{${property}}}`, "g"), String(value));
});
return result;
}).value;
}
};
};
}