Last active
August 22, 2022 07:32
-
-
Save gregonarash/fa233fcd59d6284c66147eaec4c225c4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//select source langauge using ISO 2 letter code | |
let source = "en"; | |
// Translate API key | |
let key="YourAPIcodeHere"; // <= change your API here | |
// Select table | |
let table = await input.tableAsync('Select table'); | |
// Get language list from columns | |
let fields = []; | |
for (let field of table.fields) { | |
if (field.name !== "plugin_name" && field.name !== "text_name" && field.name !== "text_code" ){ | |
fields.push(field.name); | |
} | |
} | |
//console.log(fields); | |
//set counter for total | |
let counter = 0; | |
//iterate over all columns/fields with all languages | |
for (let field of fields){ | |
//get records data for Name and selected Language only | |
let records = await table.selectRecordsAsync({fields:["text_code", field]}); | |
//output.inspect(records); | |
//select records for selected language where language field is empty and | |
//text _code(translation text) exists | |
let nonEmptyRecords = records.records.filter(record => { | |
let target = record.getCellValue(field); | |
let source = record.getCellValue('text_code'); | |
return !target && source; | |
}); | |
//console.log(nonEmptyRecords.length); | |
//convert to simple array with records to translate | |
let recordsToTranslate = []; | |
for (let record of nonEmptyRecords) | |
{ | |
recordsToTranslate.push({ | |
"id" : record.id, | |
"name" : record.getCellValue("text_code") | |
}); | |
} | |
let totalNumberToTranslate = recordsToTranslate.length; | |
if (totalNumberToTranslate === 0) { | |
output.markdown(`Skipping ${field} no missing translations.`); | |
continue; | |
} | |
output.markdown(`Translating ${totalNumberToTranslate} records to ${field}`); | |
//output.inspect(recordsToTranslate) | |
//prepare variables for http fetch request to API | |
let q = []; | |
let target = field.split("_")[0]; // changing locale ( BCP 47 ) to ISO 639-1 | |
let url=`https://translation.googleapis.com/language/translate/v2?format=text&${source}=en&key=${key}&target=${target}`; | |
// batch translate and update records in increments of 50 | |
while (recordsToTranslate.length > 0) { | |
//prepare batch of 50 | |
let batch = recordsToTranslate.slice(0, 50); | |
q = batch.map(recordsToTranslate => recordsToTranslate.name); | |
//output.inspect(batch); | |
// json for fetch request | |
let data = { | |
"q": q | |
}; | |
//fetch POST request with all params | |
let apiResponse = await fetch(url,{ | |
method: 'POST', // *GET, POST, PUT, DELETE, etc. | |
mode: 'cors', // no-cors, *cors, same-origin | |
//cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached | |
//credentials: 'same-origin', // include, *same-origin, omit | |
//headers: { | |
// 'Content-Type': 'application/json' | |
// 'Content-Type': 'application/x-www-form-urlencoded', | |
//}, | |
redirect: 'follow', // manual, *follow, error | |
referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url | |
body: JSON.stringify(data) // body data type must match "Content-Type" header | |
}); | |
//extract translation array from the response | |
let response = await apiResponse.json(); | |
response = response.data.translations ; | |
//output.inspect(response); | |
//create batch of records to update | |
let updateRecords =[]; | |
for (let i = 0; i < batch.length; i++) { | |
updateRecords.push({ | |
id: batch[i].id, | |
fields: { | |
[field]: response[i].translatedText | |
} | |
}); | |
} | |
//update airtable for empty records | |
await table.updateRecordsAsync(updateRecords); | |
recordsToTranslate = recordsToTranslate.slice(50); | |
output.text(`Updated ${totalNumberToTranslate-recordsToTranslate.length}/${totalNumberToTranslate} records`); | |
} | |
counter++; | |
} | |
output.markdown(`**Updated total ${counter} languages.**`); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment