简体   繁体   English

如何使用nodejs构造从nodejs脚本输出的json文件?

[英]How do I use nodejs to structure a json file outputted from a nodejs script?

I am using nodejs script to translate a json file from English to French. 我正在使用nodejs脚本将json文件从英语翻译为法语。 The translations are being outputted into a fr.json file but not in the format I need. 翻译内容将输出到fr.json文件中,但不是我需要的格式。

This is the input en.json file that I want to translate: 这是我要翻译的输入en.json文件:

[
  {
    "id": "EnterEmailForm.pleaseRegisterHere",
    "defaultMessage": "Email was not found, please register here",
    "filepath": "./src/accounts/components/EnterEmailForm/EnterEmailForm.js"
  },
  {
    "id": "EnterEmailForm.alreadyHaveAnAccount",
    "defaultMessage": "Already have an account?",
    "filepath": "./src/accounts/components/EnterEmailForm/EnterEmailForm.js"
  }
]

This is the output fr.json format I need, (just the values of the id and defaultMessage): 这是我需要的输出fr.json格式(只是id和defaultMessage的值):

{
  "EnterEmailForm.pleaseRegisterHere": "Email n'a pas été       trouvé, veuillez vous inscrire ici",
  "EnterEmailForm.alreadyHaveAnAccount": "Vous avez déjà un compte?",
}

This is the output fr.json that the script gives me: 这是脚本给我的输出fr.json:

{
  "0": {
    "id": "EnterEmailForm.pleaseRegisterHere",
    "defaultMessage": "Email n'a pas été trouvé, veuillez vous inscrire ici",
    "filepath": "./src/accounts/components/EnterEmailForm/EnterEmailForm.js"
  },
  "1": {
    "id": "EnterEmailForm.alreadyHaveAnAccount",
    "defaultMessage": "Vous avez déjà un compte?",
    "filepath": "./src/accounts/components/EnterEmailForm/EnterEmailForm.js"
  }
}

This is the script that translates the en.json file to a fr.json file: 这是将en.json文件转换为fr.json文件的脚本:

 #!/usr/bin/env node const fs = require('fs'); const moment = require('moment'); const _ = require('lodash'); const path = require('path'); const agent = require('superagent-promise')(require('superagent'), Promise); //Lang Codes https://ctrlq.org/code/19899-google-translate-languages if (process.argv.length >= 5) { //Args const apiKey = process.argv[2]; const inputFile = process.argv[3]; const destinationCodes = process.argv[4].split(','); const apiUrl = _.template('https://www.googleapis.com/language/translate/v2?key=<%= apiKey %>&q=<%= value %>&source=en&target=<%= languageKey %>'); function transformResponse(res) { return _.get(JSON.parse(res.text), [ 'data', 'translations', 0, 'translatedText' ]); } function iterLeaves(value, keyChain, accumulator, languageKey) { accumulator = accumulator || {}; keyChain = keyChain || []; if (_.isObject(value)) { return _.chain(value).reduce((handlers, v, k) => { return handlers.concat(iterLeaves(v, keyChain.concat(k), accumulator, languageKey)); }, []).flattenDeep().value(); } else { return function () { console.log(_.template('Translating <%= value %> to <%= languageKey %>')({value, languageKey})); //Translates individual string to language code return agent('GET', apiUrl({ value: encodeURI(value), languageKey, apiKey })).then(transformResponse).then((text) => { //Sets the value in the accumulator _.set(accumulator, keyChain, text, ); //This needs to be returned to it's eventually written to json return accumulator; }); }; } } Promise.all(_.reduce(destinationCodes, (sum, languageKey) => { const fileName = _.template('/tmp/<%= languageKey %>.json')({ languageKey, }); //Starts with the top level strings return sum.concat(_.reduce(iterLeaves(JSON.parse(fs.readFileSync(path.resolve(inputFile), 'utf-8')), undefined, undefined, languageKey), (promiseChain, fn) => { return promiseChain.then(fn); }, Promise.resolve()).then((payload) => { fs.writeFileSync(fileName, JSON.stringify(payload, null, 2)); }).then(_.partial(console.log, 'Successfully translated all nodes, file output at ' + fileName))); }, [])).then(() => { process.exit(); }); } else { console.error('You must provide an input json file and a comma-separated list of destination language codes.'); } 

How do I edit the script to correctly format the outputted file fr.json to the one I need? 如何编辑脚本以将输出文件fr.json正确格式化为我需要的文件?

Once you have the object that's produced currently, you can transform it into your desired output by reduce ing the object's values into another object, whose keys are the id s and whose values are the defaultMessage s: 一旦有了当前生成的对象,就可以通过将对象的值reduce为另一个对象(其键为id ,其值为defaultMessage ,将其转换为所需的输出:

 const payload = { "0": { "id": "EnterEmailForm.pleaseRegisterHere", "defaultMessage": "Email n&#39;a pas été trouvé, veuillez vous inscrire ici", "filepath": "./src/accounts/components/EnterEmailForm/EnterEmailForm.js" }, "1": { "id": "EnterEmailForm.alreadyHaveAnAccount", "defaultMessage": "Vous avez déjà un compte?", "filepath": "./src/accounts/components/EnterEmailForm/EnterEmailForm.js" } }; const output = Object.values(payload).reduce((a, { id, defaultMessage }) => { a[id] = defaultMessage; return a; }, {}); console.log(output); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM