UNPKG

i18n-auto-react

Version:

基于百度翻译API服务的自动翻译插件

89 lines (87 loc) 2.25 kB
let defaultLocale = 'zh'; let localStorageKey = '$w-i18n-locale'; let cacheFns = {}; let locales = {}; function format(str, data) { return str.replace(/(\\)?\{\{([\s\S]+?)\}\}/g, (_, escape, key) => { if (escape) return _.substring(1); return (data || {})[key]; }); } const makeTranslator = (locale) => { if (locale && cacheFns[locale]) return cacheFns[locale]; const fn = (str, ...args) => { if (!str || typeof str !== 'string') return str; const value = locales[locale]?.[str] || locales[defaultLocale]?.[str] || locales['zh']?.[str] || str; return format(value, ...args); }; locale && (cacheFns[locale] = fn); return fn; }; /** * 扩展语言包数据 * @param {LngType} name 语种名称 * @param {object} config 语言包数据 * @param {boolean} cover 是否覆盖 */ function extendLocale(name, config, cover = true) { if (cover) { // 覆盖式扩展语料 locales[name] = { ...(locales[name] || {}), ...config }; } else { locales[name] = { ...config, ...(locales[name] || {}) }; } } /** * 删除语言包数据 * @param name 语种名称 * @param {string[] | string} key 键值 */ function removeLocaleData(name, key) { if (Array.isArray(key)) { key.forEach((item) => { removeLocaleData(name, item); }); return; } if (locales?.[name]?.[key]) { delete locales[name][key]; } } let _defaultLocale = defaultLocale; if (typeof localStorage !== 'undefined') { _defaultLocale = localStorage.getItem(localStorageKey) || defaultLocale; } /** * 翻译函数 */ const i18n = makeTranslator(_defaultLocale); /** * 切换语言 * @param {LngType} locale 语言类型 */ function changeLanguage(locale) { localStorage.setItem(localStorageKey, locale); location.reload(); } /** * 返回当前语言 * @returns {LngType} */ function currentLanguage() { return (localStorage.getItem(localStorageKey) || defaultLocale); } export { changeLanguage, currentLanguage, extendLocale, i18n, localStorageKey, removeLocaleData };