yumechi-no-kuni/packages/client/src/components/global/i18n.ts

43 lines
910 B
TypeScript
Raw Normal View History

2020-12-25 19:47:36 -06:00
import { h, defineComponent } from 'vue';
2020-12-25 19:01:32 -06:00
export default defineComponent({
props: {
src: {
type: String,
2020-12-25 19:47:36 -06:00
required: true,
},
tag: {
type: String,
required: false,
default: 'span',
2020-12-25 19:01:32 -06:00
},
2020-12-29 22:07:16 -06:00
textTag: {
type: String,
required: false,
default: null,
},
2020-12-25 19:01:32 -06:00
},
render() {
2020-12-25 19:47:36 -06:00
let str = this.src;
const parsed = [] as (string | { arg: string; })[];
while (true) {
const nextBracketOpen = str.indexOf('{');
const nextBracketClose = str.indexOf('}');
if (nextBracketOpen === -1) {
parsed.push(str);
break;
} else {
if (nextBracketOpen > 0) parsed.push(str.substr(0, nextBracketOpen));
parsed.push({
arg: str.substring(nextBracketOpen + 1, nextBracketClose)
});
}
str = str.substr(nextBracketClose + 1);
}
2020-12-29 22:07:16 -06:00
return h(this.tag, parsed.map(x => typeof x === 'string' ? (this.textTag ? h(this.textTag, x) : x) : this.$slots[x.arg]()));
2020-12-25 19:01:32 -06:00
}
});