| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | const _ = require('lodash')const dotize = require('dotize')const i18nMW = require('i18next-express-middleware')const i18next = require('i18next')const Promise = require('bluebird')/* global WIKI */module.exports = {  engine: null,  namespaces: [],  init() {    this.namespaces = WIKI.data.localeNamespaces    this.engine = i18next    this.engine.init({      load: 'languageOnly',      ns: this.namespaces,      defaultNS: 'common',      saveMissing: false,      lng: WIKI.config.lang.code,      fallbackLng: 'en'    })    // Load current language + namespaces    this.refreshNamespaces(true)    // Listen for localization events    WIKI.events.on('localization', (action) => {      switch (action) {        case 'reload':          this.refreshNamespaces()          break      }    })    return this  },  attachMiddleware (app) {    app.use(i18nMW.handle(this.engine))  },  async getByNamespace(locale, namespace) {    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')    }  },  async loadLocale(locale, opts = { silent: false }) {    const res = await WIKI.models.locales.query().findOne('code', locale)    if (res) {      if (_.isPlainObject(res.strings)) {        _.forOwn(res.strings, (data, ns) => {          this.namespaces.push(ns)          this.engine.addResourceBundle(locale, ns, data, true, true)        })      }    } else if (!opts.silent) {      throw new Error('No such locale in local store.')    }  },  async refreshNamespaces (silent = false) {    await this.loadLocale(WIKI.config.lang.code, { silent })    if (WIKI.config.lang.namespacing) {      for (let ns of WIKI.config.lang.namespaces) {        await this.loadLocale(ns, { silent })      }    }  },  async setCurrentLocale(locale) {    await Promise.fromCallback(cb => {      return this.engine.changeLanguage(locale, cb)    })  }}
 |