/
cli.test.messages.ts
64 lines (62 loc) · 2.06 KB
/
cli.test.messages.ts
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { date, time, numberFmt } from "@messageformat/runtime/lib/formatters";
import { type CompiledAst, evaluateAst, run } from "icu-to-json";
export const formatters = { date, time, numberFmt };
export type MessageArguments<TArgumentType = number | string, TArgumentTagType = (children: TArgumentType) => TArgumentType> = {
"fn": {
"currentTime": Date | number | string;
},
"integer": {
"amount": number;
},
"interpolatedStrings": {
"0": TArgumentType;
"1": TArgumentType;
},
"money": {
"amount": number;
},
"number": {
"numCats": number;
},
"percentage": {
"value": number;
},
"plural": {
"count": number;
},
"select": {
"friend": TArgumentType;
"gender": number | string;
},
"selectNumeric": {
"children": number;
"city": TArgumentType;
},
"selectordinal": {
"place": number;
},
"tags": {
"b": TArgumentTagType;
"dynamic": TArgumentType;
},
"text"?: never | Record<string, never>,
"time": {
"start": Date | number | string;
},
"variable": {
"name": TArgumentType;
}
};
export type Language = "de-DE" | "en" | "es" | "fr" | "it";
/**
* This function is used to create a translation function that returns a string
*/
export const createTranslationFn = (messages: Record<string, unknown>, lang: Language) =>
<TKey extends keyof MessageArguments>(key: TKey, args: MessageArguments[TKey]): string => run(messages[key] as CompiledAst, lang, args as Record<string, string | number | Date>, formatters);
/**
* This function is used to create a translation function that returns a rich AST
*/
export const createTranslationRitchFn = (messages: Record<string, unknown>, lang: Language, richFormatters?: { tag: (children: unknown) => any, baseTag:(tagName: string, children: unknown) => any }) => {
const customFormatters = {...formatters, ...richFormatters} as any;
return <TKey extends keyof MessageArguments>(key: TKey, args: MessageArguments[TKey]) => evaluateAst(messages[key] as CompiledAst, lang, args as Record<string, string | number | Date>, customFormatters);
};