forked from element-plus/element-plus
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
70 lines (57 loc) · 1.58 KB
/
index.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
65
66
67
68
69
70
import dayjs from 'dayjs'
import { debugWarn } from '@element-plus/utils/error'
import defaultLang from './lang/en'
export type TranslatePair = {
[key: string]: string | string[] | TranslatePair
}
export type Language = {
name: string
el: TranslatePair
}
let lang: Language = defaultLang as Language
let i18nHandler: null | ((...args: any[]) => string) = null
export const i18n = (fn: (...args: any[]) => string) => {
i18nHandler = fn
}
export const restoreHandler = () => (i18nHandler = defaultTranslator)
function template(str: string, option) {
if (!str || !option) return str
return str.replace(/\{(\w+)\}/g, (_, key) => {
return option[key]
})
}
const defaultTranslator = (...args: any[]) => {
const [path, option] = args
let value
const array = path.split('.')
let current = lang
for (let i = 0, j = array.length; i < j; i++) {
const property = array[i]
value = current[property]
if (i === j - 1) return template(value, option)
if (!value) return ''
current = value
}
}
export const t = (...args: any[]): string => {
if (i18nHandler) {
const translation = i18nHandler(...args)
return translation || defaultTranslator(...args)
}
return defaultTranslator(...args)
}
export const use = (l: Language): void => {
debugWarn(
'deprecation',
`:
The previous i18n usage is deprecated please update to
the new one to get reactive i18n translations, refer to:
https://element-plus.org/#/en-US/component/i18n
`
)
lang = l || lang
if (lang.name) {
dayjs.locale(lang.name)
}
}
export const setLocale = use