因此,基本上我的目标是获取带有字符串值的对象,转换值并创建一个包含已转换字符串的新对象。所以说我是否有
const strings = {
"name": "my name",
"age": "my age"
}
我想翻译一下,所以我有一个新的对象,例如:
const translated = {
"name": "mi nombre",
"age": "mi edad"
}
我尝试使用map函数,但还没有真正使任何东西都能正常工作。另外,我不确定如何只翻译对象的值而不翻译标签。有人有什么建议吗?我不担心执行翻译的逻辑,我正在使用AWS Translation,而该操作必须提供一个字符串。
我当前的文件:
import AWS from 'aws-sdk';
import uuid from 'uuid';
const translate = new AWS.Translate({apiVersion: '2019-01-01'});
import * as dynamoDbLib from "./libs/dynamodb-lib";
import { success, failure } from "./libs/response-lib";
export async function main(event, context) {
try {
const data = JSON.parse(event.body);
const toTranslate = {
SourceLanguageCode: 'auto', /* required */
TargetLanguageCode: data.TargetLanguageCode, /* required */
Text: data.Text, /* required */
};
const translated = await translate.translateText(toTranslate).promise();
console.log(translated);
const params = {
"TableName": "sites",
"Item": {
"userId": "1",
"siteId": uuid.v1(),
"Language": translated.TargetLanguageCode,
"SiteName": translated.TranslatedText,
"CreatedAt": Date.now()
}
}
try {
await dynamoDbLib.call("put", params);
return success(params.Item);
} catch (e) {
console.log(e);
return failure({ status: false });
}
} catch (err) {
console.log(err, err.stack);
}
}
尝试:
const data = JSON.parse(event.body);
function translate(toTranslate) {
const translated = await translate.translateText(toTranslate).promise();
}
const translated = {};
const promises = Object.keys(data.Text).map(key =>
translate(data.Text[key], data.TargetLanguageCode).then(translation =>
translated[key] = translation
)
);
Promise.all(promises).then(() => translationsAreReady(translated));
答案 0 :(得分:0)
假设translate(term: String, lang: String)
是您的翻译功能,则映射方式如下:
const strings = {
"name": "my name",
"age": "my age"
}
let lang = "es";
const translated = {...strings};
for (const key in translated) {
translated[key] = translate(translated[key], lang);
}
答案 1 :(得分:0)
const translated = {};
Object.keys(strings).forEach(key => {
translated[key] = translate_sync(strings[key], lang);
});
但是,同步translate
可能不可用,所以...
const translated = {};
const promises = Object.keys(strings).map(key =>
translate_promise(strings[key], lang).then(translation =>
translated[key] = translation
)
);
Promise.all(promises).then(() => translationsAreReady(translated));
答案 2 :(得分:0)
可以通过Object.entries()
和Array.reduce()
来实现,如下所示。另请注意,使用Promise.all()
来将对异步函数translate.translateText()
的多路调用解析为translatedEntries
的数组,从中构造新的translated
:
/* Input object */
const strings = {
"name": "my name",
"age": "my age"
}
/* A mock of your translation function/library */
const translate = {
translateText: async(value) => {
if (value === 'my name') return "mi nombre";
if (value === 'my age') return "mi edad";
return "?"
}
}
Promise.all(Object.entries(strings).map(async([key, value]) => {
/* Map all entries to a promise that resolves each translation request
asynchronously */
const translation = await translate.translateText(value);
/* Map translation result for this entry */
return [key, translation];
})).then((translatedEntries) => {
/* Construct a new object from key/value pairs in translated entries */
return translatedEntries.reduce((result, [key, value]) => {
return { ...result,
[key]: value
}
}, {})
}).then((translated) => {
console.log(translated);
});