Skip to content

Instantly share code, notes, and snippets.

@gregonarash
Last active August 22, 2022 07:32
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gregonarash/fa233fcd59d6284c66147eaec4c225c4 to your computer and use it in GitHub Desktop.
Save gregonarash/fa233fcd59d6284c66147eaec4c225c4 to your computer and use it in GitHub Desktop.
//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