125 lines
2.6 KiB
JavaScript
125 lines
2.6 KiB
JavaScript
export default (context, inject) => {
|
|
const RE_TOKEN_LIST_VALUE = new RegExp(/^(?:\d)+/);
|
|
const RE_TOKEN_NAMED_VALUE = new RegExp(/^(?:\w)+/);
|
|
|
|
const isObject = obj => {
|
|
return obj !== null && typeof obj === 'object';
|
|
};
|
|
|
|
const parse = msg => {
|
|
let tokens = [];
|
|
let position = 0;
|
|
|
|
let text = '';
|
|
while (position < msg.length) {
|
|
let char = msg[position++];
|
|
if (char === '{') {
|
|
if (text) {
|
|
tokens.push({ type: 'text', value: text });
|
|
}
|
|
|
|
text = '';
|
|
let sub = '';
|
|
char = msg[position++];
|
|
while (char !== undefined && char !== '}') {
|
|
sub += char;
|
|
char = msg[position++];
|
|
}
|
|
const isClosed = char === '}';
|
|
|
|
const type = RE_TOKEN_LIST_VALUE.test(sub)
|
|
? 'list'
|
|
: isClosed && RE_TOKEN_NAMED_VALUE.test(sub)
|
|
? 'named'
|
|
: 'unknown';
|
|
|
|
tokens.push({ value: sub, type });
|
|
} else if (char === '%') {
|
|
// when found rails i18n syntax, skip text capture
|
|
if (msg[position] !== '{') {
|
|
text += char;
|
|
}
|
|
} else {
|
|
text += char;
|
|
}
|
|
}
|
|
text && tokens.push({ type: 'text', value: text });
|
|
|
|
return tokens;
|
|
};
|
|
|
|
const compile = (tokens, values) => {
|
|
const compiled = [];
|
|
let index = 0;
|
|
const mode = Array.isArray(values)
|
|
? 'list'
|
|
: isObject(values)
|
|
? 'named'
|
|
: 'unknown';
|
|
|
|
if (mode === 'unknown') {
|
|
return compiled;
|
|
}
|
|
|
|
while (index < tokens.length) {
|
|
const token = tokens[index];
|
|
switch (token.type) {
|
|
case 'text':
|
|
compiled.push(token.value);
|
|
break;
|
|
case 'list':
|
|
compiled.push(values[parseInt(token.value, 10)]);
|
|
break;
|
|
case 'named':
|
|
if (mode === 'named') {
|
|
compiled.push(values[token.value]);
|
|
} else {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log(
|
|
`Type of token '${token.type}' and format of value '${mode}' don't match!`,
|
|
);
|
|
}
|
|
}
|
|
break;
|
|
case 'unknown':
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log("Detect 'unknown' type of token!");
|
|
}
|
|
break;
|
|
}
|
|
index++;
|
|
}
|
|
|
|
return compiled;
|
|
};
|
|
|
|
const m = (codeId, def, params) => {
|
|
let tokens = [];
|
|
let compiled = [];
|
|
let returnMsg = '';
|
|
let dicList = null,
|
|
userLocale;
|
|
|
|
if (context.$auth && context.$auth.user) {
|
|
dicList = context.$auth.user.dicList;
|
|
userLocale = context.$auth.user.user.userLocale;
|
|
returnMsg = dicList[userLocale][codeId];
|
|
if (params) {
|
|
tokens = parse(returnMsg);
|
|
// console.log("tokens: ", tokens);
|
|
compiled = compile(tokens, params);
|
|
// console.log("compiled: ", compiled);
|
|
returnMsg = compiled.join('');
|
|
}
|
|
}
|
|
|
|
if (!returnMsg) {
|
|
returnMsg = def;
|
|
}
|
|
|
|
return returnMsg;
|
|
};
|
|
|
|
inject('m', m);
|
|
};
|