【问题标题】:babel-plugin-react-intl: Extract strings to a single filebabel-plugin-react-intl:将字符串提取到单个文件中
【发布时间】:2016-09-13 14:49:18
【问题描述】:

目前在使用babel-plugin-react-intl 时,会使用“id”、“description”和“defaultMessage”为每个组件创建单独的 json。我需要的是只创建一个包含单个对象的 json,其中所有“id”作为“键”,“defaultMessage”作为“值”

现状:

ComponentA.json

[
  {
    "id": "addEmoticonA",
    "description": "Add emoticon",
    "defaultMessage": "Insert Emoticon"
  },
  {
    "id": "addPhotoA",
    "description": "Add photo",
    "defaultMessage": "Insert photo"
  }
]

ComponentB.json

[
  {
    "id": "addEmoticonB",
    "description": "Add emoji",
    "defaultMessage": "Insert Emoji"
  },
  {
    "id": "addPhotoB",
    "description": "Add picture",
    "defaultMessage": "Insert picture"
  }
]

我需要翻译什么。

final.json

{
  "addEmoticonA": "Insert Emoticon",
  "addPhotoA": "Insert photo",
  "addEmoticonB": "Insert Emoji",
  "addPhotoB": "Insert picture"
}

有什么方法可以完成这个任务吗?可能是通过使用python脚本或任何东西。即从不同的 json 文件制作单个 json 文件。或者直接使用 babel-plugin-react-intl 制作单个 json 文件

【问题讨论】:

    标签: react-intl


    【解决方案1】:

    有一个translations manager 可以做到这一点。

    或自定义选项见下文


    下面基于script 的脚本会检查由 babel-plugin-react-intl 并创建 js 文件,其中包含来自 json 格式的所有组件的所有消息。

    import fs from 'fs'
    import {
      sync as globSync
    }
    from 'glob'
    import {
      sync as mkdirpSync
    }
    from 'mkdirp'
    import * as i18n from '../lib/i18n'
    
    const MESSAGES_PATTERN = './_translations/**/*.json'
    const LANG_DIR         = './_translations/lang/'
      // Ensure output folder exists
    mkdirpSync(LANG_DIR)
    
    // Aggregates the default messages that were extracted from the example app's
    // React components via the React Intl Babel plugin. An error will be thrown if
    // there are messages in different components that use the same `id`. The result
    // is a flat collection of `id: message` pairs for the app's default locale.
    let defaultMessages = globSync(MESSAGES_PATTERN)
      .map(filename => fs.readFileSync(filename, 'utf8'))
      .map(file => JSON.parse(file))
      .reduce((collection, descriptors) => {
        descriptors.forEach(({
          id, defaultMessage, description
        }) => {
          if (collection.hasOwnProperty(id))
            throw new Error(`Duplicate message id: ${id}`)
    
          collection[id] = {
            defaultMessage, description
          }
        })
        return collection
      }, {})
    
    // Sort keys by name
    const messageKeys = Object.keys(defaultMessages)
    messageKeys.sort()
    defaultMessages = messageKeys.reduce((acc, key) => {
      acc[key] = defaultMessages[key]
      return acc
    }, {})
    
    // Build the JSON document for the available languages
    i18n.en = messageKeys.reduce((acc, key) => {
      acc[key] = defaultMessages[key].defaultMessage
      return acc
    }, {})
    Object.keys(i18n).forEach(lang => {
      const langDoc = i18n[lang]
      const units = Object.keys(defaultMessages).map((id) => [id, defaultMessages[id]]).reduce((collection, [id]) => {
        collection[id] = langDoc[id] || '';
        return collection;
      }, {});
      fs.writeFileSync(`${LANG_DIR}${lang}.json`, JSON.stringify(units, null, 2))
    })

    【讨论】:

      【解决方案2】:

      您可以使用babel-plugin-react-intl-extractor 将您的翻译汇总到一个文件中。它还为您的消息的每次更改提供自动重新编译翻译文件。

      【讨论】:

        猜你喜欢
        • 2016-04-22
        • 1970-01-01
        • 1970-01-01
        • 2019-01-19
        • 2018-07-05
        • 1970-01-01
        • 1970-01-01
        • 2021-04-03
        • 2016-05-27
        相关资源
        最近更新 更多