const fs = require('fs') const path = require('path') const { parseJson } = require('./json') const { getManifestJson } = require('./manifest') const delimiters = ['%', '%'] function initI18nOptions ( platform, inputDir, warning = false, withMessages = true ) { const locales = initLocales(path.resolve(inputDir, 'locale'), withMessages) if (!Object.keys(locales).length) { return } const manifestJson = getManifestJson() const fallbackLocale = manifestJson.fallbackLocale || manifestJson.locale const locale = resolveI18nLocale( platform, Object.keys(locales), fallbackLocale ) if (warning) { if (!fallbackLocale) { console.warn() } else if (locale !== fallbackLocale) { console.warn() } } return { locale, locales, delimiters } } const localeJsonRE = /uni-app.*.json/ function isUniAppLocaleFile (filepath) { if (!filepath) { return false } return localeJsonRE.test(path.basename(filepath)) } function parseLocaleJson (filepath) { let jsonObj = parseJson(fs.readFileSync(filepath, 'utf8')) if (isUniAppLocaleFile(filepath)) { jsonObj = jsonObj.common || {} } return jsonObj } function initLocales (dir, withMessages = true) { if (!fs.existsSync(dir)) { return {} } return fs.readdirSync(dir).reduce((res, filename) => { if (path.extname(filename) === '.json') { const locale = path .basename(filename) .replace(/(uni-app.)?(.*).json/, '$2') if (withMessages) { Object.assign( res[locale] || (res[locale] = {}), parseLocaleJson(path.join(dir, filename)) ) } else { res[locale] = {} } } return res }, {}) } function resolveI18nLocale (platfrom, locales, locale) { if (locale && locales.includes(locale)) { return locale } const defaultLocales = ['zh-Hans', 'zh-Hant'] if (platfrom === 'app-plus' || platfrom === 'h5') { defaultLocales.unshift('en') } else { // 小程序 defaultLocales.push('en') } return defaultLocales.find(locale => locales.includes(locale)) || locales[0] } module.exports = { initLocales, initI18nOptions }