rudeshark.net/packages/client/src/components/global/i18n.ts

52 lines
953 B
TypeScript
Raw Normal View History

2023-01-13 05:40:33 +01:00
import { h, defineComponent } from "vue";
2020-12-26 02:01:32 +01:00
export default defineComponent({
props: {
src: {
type: String,
2020-12-26 02:47:36 +01:00
required: true,
},
tag: {
type: String,
required: false,
2023-01-13 05:40:33 +01:00
default: "span",
2020-12-26 02:01:32 +01:00
},
2020-12-30 05:07:16 +01:00
textTag: {
type: String,
required: false,
default: null,
},
2020-12-26 02:01:32 +01:00
},
render() {
2020-12-26 02:47:36 +01:00
let str = this.src;
2023-01-13 05:40:33 +01:00
const parsed = [] as (string | { arg: string })[];
2020-12-26 02:47:36 +01:00
while (true) {
2023-01-13 05:40:33 +01:00
const nextBracketOpen = str.indexOf("{");
const nextBracketClose = str.indexOf("}");
2020-12-26 02:47:36 +01:00
if (nextBracketOpen === -1) {
parsed.push(str);
break;
} else {
if (nextBracketOpen > 0) parsed.push(str.substr(0, nextBracketOpen));
parsed.push({
2022-09-05 11:51:23 +02:00
arg: str.substring(nextBracketOpen + 1, nextBracketClose),
2020-12-26 02:47:36 +01:00
});
}
str = str.substr(nextBracketClose + 1);
}
2023-01-13 05:40:33 +01:00
return h(
this.tag,
parsed.map((x) =>
typeof x === "string"
? this.textTag
? h(this.textTag, x)
: x
: this.$slots[x.arg](),
),
);
2022-09-05 11:51:23 +02:00
},
2020-12-26 02:01:32 +01:00
});