summaryrefslogtreecommitdiff
path: root/packages/frontend/src/components/global/i18n.ts
blob: 1fd293ba10755e33ce42c92fd1272f69bebfec04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import { h, defineComponent } from 'vue';

export default defineComponent({
	props: {
		src: {
			type: String,
			required: true,
		},
		tag: {
			type: String,
			required: false,
			default: 'span',
		},
		textTag: {
			type: String,
			required: false,
			default: null,
		},
	},
	render() {
		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);
		}

		return h(this.tag, parsed.map(x => typeof x === 'string' ? (this.textTag ? h(this.textTag, x) : x) : this.$slots[x.arg]()));
	},
});