'f'
mh-two-thousand-and-two
2024-04-12 26f2711ef9461961fb953e2b497bd314ef95e345
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
98
99
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
}