@mediafly/translate
Version:
Translate strings extracted from apps using Google Translate
119 lines (98 loc) • 3.46 kB
JavaScript
var assert = require('assert')
var { JWT } = require('google-auth-library')
var { GoogleSpreadsheet } = require('google-spreadsheet')
var crypto = require('crypto')
var chalk = require('chalk')
var flatten = require('flat')
var path = require('path')
var { getLanguageName, getTranslationsDir, requireOrDefault } = require('./util')
const TRANSLATIONS_DIRECTORY = getTranslationsDir()
async function exportFunc() {
var readFile = require('./read-file').read
var config = require(path.join(process.cwd(), 'mediafly-translate.config'))
assert(config.googleSheetId !== '[YOUR GOOGLE SHEET ID]', 'Configure googleSheetId in mediafly-translate.config.json to export to Google Sheets.')
var creds = config.googleSheetsCredentials
var languages = config.languages
var starUnicodeChar = '\u2605'
languages.push('en')
const jwt = new JWT({
email: creds.client_email,
key: creds.private_key,
scopes: [
'https://www.googleapis.com/auth/spreadsheets',
'https://www.googleapis.com/auth/drive.file',
],
})
var doc = new GoogleSpreadsheet(config.googleSheetId, jwt)
try {
await doc.loadInfo()
} catch (error) {
err = new Error('Cannot load spreadsheet')
console.error(chalk.red(err.message))
console.error(`Verify the service account authentication creds and that the sheet is shared with the service account email being used by mediafly-translate.`)
console.log('Error response data:', error.response.data)
throw err
}
languages.map(async language => {
if (language === 'ke') {
return
}
const englishFile = flatten(readFile('locale-en'))
const languageName = getLanguageName(language)
let languageSheet = doc.sheetsByIndex.find(s => s.title === languageName)
if (!languageSheet) {
try {
languageSheet = await doc.addSheet({
title: languageName
})
} catch (error) {
err = new Error(`Could not add sheet ${languageName}`)
console.error(chalk.red(err.message))
throw err
}
}
if (language === 'en') {
await languageSheet.setHeaderRow(['Key', 'English'])
await languageSheet.resize({rowCount: 1, columnCount: 2})
} else {
await languageSheet.setHeaderRow(['New', 'Key', 'English', languageName, 'Override'])
await languageSheet.resize({rowCount: 1, columnCount: 5})
}
if (language !== 'en') {
var foreignFile = (config.format === 'js')
? flatten(readFile(`locale-${language}`).default)
: flatten(readFile(`locale-${language}`))
var foreignOverridesFile = flatten(requireOrDefault(`${TRANSLATIONS_DIRECTORY}/locale-${language}.overrides`))
}
var keys = Object.keys(englishFile)
var data = keys
.map(key => {
var row = {
Key: key,
English: englishFile[key]
}
if (language !== 'en') {
var hashFromEnglishFile = crypto.createHash('md5')
.update(englishFile[key])
.digest('hex')
var overrideHash = foreignOverridesFile[key]
row[languageName] = foreignFile[key]
row.Override = ''
row.New = hashFromEnglishFile !== overrideHash ? starUnicodeChar : ''
}
return row
})
try {
await languageSheet.addRows(data)
} catch (error) {
err = new Error(`Could not add rows to ${languageName} sheet`)
console.error(chalk.red(err.message))
console.log('Error response data:', error.response.data)
throw err
}
console.log(chalk.green(`Exported ${languageName} [${language}] to Google Sheets successfully!`))
})
}
module.exports = {
handler: exportFunc
}