UNPKG

@beeapi/nutui

Version:

一套轻量级移动端Vue组件库

72 lines (62 loc) 1.99 kB
import Vue from 'vue'; import znCH from './lang/zn-CH'; let defaultMessages = {}; let merged = false; const vueI18nHandler = function() { const vuei18n = Object.getPrototypeOf(this || Vue).$t; if (typeof vuei18n === 'function' && !!Vue.locale) { if (!merged) { merged = true; Vue.locale(Vue.config.lang, Object.assign(Vue.config.lang === 'zn-CH' ? znCH : {}, Vue.locale(Vue.config.lang) || {}, defaultMessages)); } return vuei18n.apply(this, arguments); } }; function i18n(keysStr, params) { let value = vueI18nHandler.apply(this, arguments); if (value !== null && value !== undefined) return value; let message = Object.assign({}, Vue.config.lang === 'zn-CH' ? znCH : {}, defaultMessages); let keys = (keysStr && keysStr.split('.')) || []; let result = null; if (keys.length) { for (let i = 0; i < keys.length; i++) { let key = keys[i]; if (key && message[key]) { message = message[key]; result = message; } else { result = null; break; } } } return simpleTemplate(result, params); } function locale(lang, messages) { if (typeof lang === 'object') { messages = lang; lang = Vue.config.lang; } Vue.config.lang = lang; Object.assign(defaultMessages, messages); } function getArgType(arg) { return Object.prototype.toString .call(arg) .toLowerCase() .match(/\s(\w+)/)[1]; } function simpleTemplate(templ, conf) { let pars = templ && templ.match(/{.+?}/g); if (pars && conf) { pars = pars.map(p => p.replace(/\{\s*(\w+|\d+).*?\}/, '$1')); pars.forEach((c, i) => { let reg = new RegExp('{\\s*' + c + '\\s*(?:=\\s*(\\S*?))?\\s*?}', 'g'); templ = templ.replace(reg, (a, b) => { return getArgType(conf[c]) == 'function' ? conf[c]() : conf[c] !== undefined ? conf[c] : b ? b : a; }); }); } return templ; } export { i18n, locale };