@beeapi/nutui
Version:
一套轻量级移动端Vue组件库
72 lines (62 loc) • 1.99 kB
JavaScript
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 };