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