javascript - 如何使用 nodejs 构建从 nodejs 脚本输出的 json 文件?
问题描述
我正在使用 nodejs 脚本将 json 文件从英语翻译成法语。翻译被输出到 fr.json 文件中,但不是我需要的格式。
这是我要翻译的输入 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"
}
]
这是我需要的输出 fr.json 格式,(只是 id 和 defaultMessage 的值):
{
"EnterEmailForm.pleaseRegisterHere": "Email n'a pas été trouvé, veuillez vous inscrire ici",
"EnterEmailForm.alreadyHaveAnAccount": "Vous avez déjà un compte?",
}
这是脚本给我的输出 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"
}
}
这是将 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.');
}
如何编辑脚本以将输出的文件 fr.json 正确格式化为我需要的格式?
解决方案
一旦您拥有当前生成的对象,您可以reduce
通过将对象的值转换为另一个对象,其键是id
s,值是defaultMessage
s,从而将其转换为您想要的输出:
const payload = {
"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"
}
};
const output = Object.values(payload).reduce((a, { id, defaultMessage }) => {
a[id] = defaultMessage;
return a;
}, {});
console.log(output);
推荐阅读
- python - UnparsedFlagAccessError:在解析标志之前尝试访问标志 --preserve_unused_tokens。BERT
- java - 如何关闭外部 iframe src
- reactjs - 反应本机文本输入“列表中的每个孩子都应该有一个唯一的“关键”道具。”
- sprite-kit - 精灵套件;如何循环 SKVideoNode?
- kubernetes - Google Kubernetes Engine Federation Prometheus 设置
- java - 此应用程序没有显式映射 /error,因此您将其视为后备。在我新创建的 Spring Boot 应用程序中
- django - 尽管 id 字段存在于 Django Rest Framework 的序列化程序中,但 Orderdict 的结果中没有“Id”
- angular - 在 Angular 项目中使用 lodash 时的优化救助警告
- z3 - z3py中一组变量的最大值和最小值
- python - 线性方程组解的唯一性