summaryrefslogtreecommitdiff
path: root/packages/frontend/src/components/global/i18n.ts
blob: 6706d08f2f9fc6ff312d369abba5fc9769fe2bc4 (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
import { h } from 'vue';

export default function(props: { src: string; tag?: string; textTag?: string; }, { slots }) {
	let str = props.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.substring(0, nextBracketOpen));
			parsed.push({
				arg: str.substring(nextBracketOpen + 1, nextBracketClose),
			});
		}

		str = str.substring(nextBracketClose + 1);
	}

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