2017-09-25 03:22:33 +00:00
|
|
|
const _ = require('lodash')
|
|
|
|
const dotize = require('dotize')
|
|
|
|
const i18nBackend = require('i18next-node-fs-backend')
|
2018-02-04 05:53:13 +00:00
|
|
|
const i18nMW = require('i18next-express-middleware')
|
2017-09-25 03:22:33 +00:00
|
|
|
const i18next = require('i18next')
|
|
|
|
const path = require('path')
|
|
|
|
const Promise = require('bluebird')
|
|
|
|
|
2018-03-05 20:49:36 +00:00
|
|
|
/* global WIKI */
|
2017-09-25 03:22:33 +00:00
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
engine: null,
|
2018-01-10 01:41:53 +00:00
|
|
|
namespaces: [],
|
2017-09-25 03:22:33 +00:00
|
|
|
init() {
|
2018-03-05 20:49:36 +00:00
|
|
|
this.namespaces = WIKI.data.localeNamespaces
|
2017-09-25 03:22:33 +00:00
|
|
|
this.engine = i18next
|
|
|
|
this.engine.use(i18nBackend).init({
|
|
|
|
load: 'languageOnly',
|
|
|
|
ns: this.namespaces,
|
|
|
|
defaultNS: 'common',
|
|
|
|
saveMissing: false,
|
2018-03-05 20:49:36 +00:00
|
|
|
preload: [WIKI.config.site.lang],
|
|
|
|
lng: WIKI.config.site.lang,
|
2017-09-25 03:22:33 +00:00
|
|
|
fallbackLng: 'en',
|
|
|
|
backend: {
|
2018-03-05 20:49:36 +00:00
|
|
|
loadPath: path.join(WIKI.SERVERPATH, 'locales/{{lng}}/{{ns}}.yml')
|
2017-09-25 03:22:33 +00:00
|
|
|
}
|
|
|
|
})
|
|
|
|
return this
|
|
|
|
},
|
2018-02-04 05:53:13 +00:00
|
|
|
attachMiddleware (app) {
|
|
|
|
app.use(i18nMW.handle(this.engine))
|
|
|
|
},
|
2018-01-10 01:41:53 +00:00
|
|
|
async getByNamespace(locale, namespace) {
|
2017-09-25 03:22:33 +00:00
|
|
|
if (this.engine.hasResourceBundle(locale, namespace)) {
|
|
|
|
let data = this.engine.getResourceBundle(locale, namespace)
|
|
|
|
return _.map(dotize.convert(data), (value, key) => {
|
|
|
|
return {
|
|
|
|
key,
|
|
|
|
value
|
|
|
|
}
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
throw new Error('Invalid locale or namespace')
|
|
|
|
}
|
|
|
|
},
|
2018-01-10 01:41:53 +00:00
|
|
|
async loadLocale(locale) {
|
2017-09-25 03:22:33 +00:00
|
|
|
return Promise.fromCallback(cb => {
|
|
|
|
return this.engine.loadLanguages(locale, cb)
|
|
|
|
})
|
|
|
|
},
|
2018-01-10 01:41:53 +00:00
|
|
|
async setCurrentLocale(locale) {
|
2017-09-25 03:22:33 +00:00
|
|
|
return Promise.fromCallback(cb => {
|
|
|
|
return this.engine.changeLanguage(locale, cb)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|