-
-
Notifications
You must be signed in to change notification settings - Fork 6.3k
/
Copy pathi18n.js
97 lines (84 loc) · 2.34 KB
/
i18n.js
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import deepmerge from 'deepmerge'
import VueTimeago, { createTimeago } from 'vue-timeago'
Vue.use(VueI18n)
Vue.use(VueTimeago, {
name: 'VueTimeago',
locale: 'en'
})
function detectLanguage () {
try {
const lang = (window.navigator.languages && window.navigator.languages[0]) ||
window.navigator.language ||
window.navigator.userLanguage
return [lang, lang.toLowerCase(), lang.substr(0, 2)].map(lang => lang.replace('-', '_'))
} catch (e) {
return undefined
}
}
async function autoInstallLocale (lang) {
try {
const response = await fetch(`https://unpkg.com/vue-cli-locales/locales/${lang}.json`)
if (response.ok) {
const data = await response.json()
mergeLocale(lang, data)
return true
}
} catch (e) {}
return false
}
async function autoDetect () {
const codes = detectLanguage()
if (codes && codes[0].indexOf('en') === -1) {
let ok = false
let previousCode
for (const code of codes) {
if (code === previousCode) continue
previousCode = code
ok = await tryAutoLang(code)
if (ok) break
}
if (!ok) {
console.log(`[UI] No locale data was found for your locale ${codes[0]}.`)
}
let dateFnsLocale = i18n.locale
if (dateFnsLocale === 'en') {
dateFnsLocale = 'en-US'
} else if (dateFnsLocale === 'zh') {
// we use `zh` as language code in transifex, but date-fns only has zh-CN
dateFnsLocale = 'zh-CN'
}
Vue.component('VueTimeago', createTimeago({
name: 'VueTimeago',
locale: i18n.locale,
locales: {
[i18n.locale]: require(`date-fns/locale/${dateFnsLocale}/index.js`)
}
}))
}
}
async function tryAutoLang (lang) {
console.log(`[UI] Trying to load ${lang} locale...`)
const result = await autoInstallLocale(lang)
if (result) {
i18n.locale = lang
// eslint-disable-next-line no-console
console.log(`[UI] Automatically loaded ${lang} locale `)
}
return result
}
const i18n = new VueI18n({
locale: 'en',
fallbackLocale: 'en',
messages: {
en: {}
},
silentTranslationWarn: process.env.NODE_ENV !== 'production'
})
autoDetect()
export function mergeLocale (lang, messages) {
const newData = deepmerge(i18n.getLocaleMessage(lang), messages)
i18n.setLocaleMessage(lang, newData)
}
export default i18n