i18n: support legacy keys
Massimo Melina committed
Mar 18, 2023 at 18:33 UTC
507ea263e464cd8f5021f6f93f9965da1d362805
1 file changed
+15
-7
frontend/src/i18n.ts
+15
-7
@@ -27,9 +27,10 @@ export function I18Nprovider({ embedded='en', ...props }) {
27
return h(Fragment, props)
28
}
29
30
-export function t(keyOrTpl: string | TemplateStringsArray, params?: any, def?: string) {
30
+export function t(keyOrTpl: string | string[] | TemplateStringsArray, params?: any, def?: string) {
31
// memoize?
32
- const key = typeof keyOrTpl === 'string' ? keyOrTpl : (def ??= keyOrTpl[0])
32
+ const keys = isTemplateStringsArray(keyOrTpl) ? [(def ??= keyOrTpl[0] as string)]
33
+ : Array.isArray(keyOrTpl) ? keyOrTpl : [keyOrTpl]
34
if (typeof params === 'string' && !def) {
35
def = params
36
params = null
@@ -38,14 +39,17 @@ export function t(keyOrTpl: string | TemplateStringsArray, params?: any, def?: s
39
let selectedLang = '' // keep track of where we find the translation
40
const { langs, embedded } = state
41
if (loaded) {
41
- found = findFirst(langs, lang => loaded[selectedLang=lang]?.translate?.[key])
42
- if (!found && selectedLang && langs[0] !== embedded && !warns.has(key)) {
43
- warns.add(key)
44
- console.debug("miss i18n:", key)
42
+ for (const key of keys) {
43
+ found = findFirst(langs, lang => loaded[selectedLang=lang]?.translate?.[key])
44
+ if (found) break
45
+ if (selectedLang && langs[0] !== embedded && !warns.has(key)) {
46
+ warns.add(key)
47
+ console.debug("miss i18n:", key)
48
+ }
49
}
50
}
51
if (!found) {
48
- found = def || key
52
+ found = def || keys[0]
53
selectedLang = embedded
54
}
55
return Array.from(tokenizer(found)).map(([s,inside]) => {
@@ -104,4 +108,8 @@ function* tokenizer(s:string): Generator<[string,boolean]> {
108
yield [s.slice(open + 1, ofs-1), true]
109
}
110
yield [s.slice(ofs), false]
111
+}
112
+
113
+function isTemplateStringsArray(x: any): x is TemplateStringsArray {
114
+ return x?.raw && Array.isArray(x)
115
}
\ No newline at end of file