i18n.js 2.6 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
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
const fs = require('fs')
const path = require('path')
const locales = ['en', 'es', 'fr', 'zh-Hans', 'zh-Hant']

function buildI18n(namespace, dir) {
  const modules = {}
  locales.forEach((locale) => {
    const messages = buildI18nLocale(locale, namespace, dir)
    Object.keys(messages).forEach((moduleName) => {
      ;(modules[moduleName] || (modules[moduleName] = {}))[locale] =
        messages[moduleName]
    })
  })
  // modules
  // {app: {en: { quit: '' },es: { quit: '' },fr: { quit: "" },'zh-Hans': { quit: '' },'zh-Hant': { quit: '' }}}
  const messagesFile = path.resolve(dir, 'messages.ts')
  fs.writeFileSync(messagesFile, generateI18nCode(namespace, modules))
  console.log('write:' + messagesFile)
}

function buildI18nLocale(locale, namespace, dir) {
  return buildI18nModuleMessages(
    require(path.resolve(dir, locale + '.json')),
    namespace
  )
}

function buildI18nModuleMessages(messages, namespace) {
  const modules = {}
  Object.keys(messages).forEach((name) => {
    const [module, ...part] = name.replace(namespace + '.', '').split('.')
    ;(modules[module] || (modules[module] = {}))[part.join('.')] =
      messages[name]
  })
  return modules
}
function capitalize(str) {
  return str.charAt(0).toUpperCase() + str.slice(1)
}
function generateI18nCode(namespace, modules) {
  return (
    `
// This file is created by scripts/i18n.js
// Do not modify this file!!!!!!!!!
import {
    LOCALE_EN,
    LOCALE_ES,
    LOCALE_FR,
    LOCALE_ZH_HANS,
    LOCALE_ZH_HANT,
  } from '@dcloudio/uni-i18n'
  import { useI18n } from './useI18n'
  const i18n = useI18n()
  function normalizeMessages(
    namespace: string,
    messages: Record<string, string>
  ) {
    return Object.keys(messages).reduce<Record<string, string>>((res, name) => {
      res[namespace + name] = messages[name]
      return res
    }, {})
  }
` +
    Object.keys(modules)
      .map((name) => generateI18nModuleCode(namespace, name, modules[name]))
      .join('')
  )
}

function generateI18nModuleCode(namespace, name, localeMessages) {
  return `export function initI18n${capitalize(name)}Msgs() {
  const name = '${namespace}.${name}.'      
${Object.keys(localeMessages)
  .map((locale) => generateI18nModuleLocaleCode(locale, localeMessages[locale]))
  .join('')}
}
`
}

function generateI18nModuleLocaleCode(locale, messages) {
  locale = locale.toUpperCase().replace('-', '_')
  return `  if (__UNI_FEATURE_I18N_${locale}__) {
    i18n.add(LOCALE_${locale}, normalizeMessages(name, ${JSON.stringify(
    messages
  )}))
  }
`
}

buildI18n('uni', path.resolve(__dirname, '../packages/uni-core/src/i18n'))