@mediafly/translate
Version:
Translate strings extracted from apps using Google Translate
92 lines (77 loc) • 2.73 kB
JavaScript
var fs = require('fs')
var assert = require('assert')
var chalk = require('chalk')
var { JWT } = require('google-auth-library')
var { GoogleSpreadsheet } = require('google-spreadsheet')
var path = require('path')
var highland = require('highland')
var flatten = require('flat')
var { getLanguageName, getTranslationsDir } = require('./util')
const TRANSLATIONS_DIRECTORY = getTranslationsDir()
async function importFunc() {
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 import from Google Sheets.')
var format = config.format || 'json'
var languages = config.languages
var fileFormat = require('./format')
var creds = config.googleSheetsCredentials
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(language => {
if (language === 'ke') {
return
}
var languageName = getLanguageName(language)
var foreignFile = (config.format === 'js')
? flatten(readFile(`locale-${language}`).default)
: flatten(readFile(`locale-${language}`))
let languageSheet = doc.sheetsByIndex.find(s => s.title === languageName)
if (!languageSheet) {
err = new Error(`${languageName} sheet not found`)
console.error(chalk.red(err.message))
throw(err)
}
var rowsStream = highland(languageSheet.getRows())
var writeFileOptions
if (format === 'strings') {
writeFileOptions = { encoding: 'ucs2' }
}
rowsStream
.fork()
.map((arr) => {
return arr.reduce((a, b) => {
if (b.get('Override')) {
return highland.set(b.get('Key'), b.get('Override'), a)
} else {
return highland.set(b.get('Key'), b.get(languageName), a)
}
}, {})
})
.map(obj => Object.assign(foreignFile, obj))
.map(fileFormat.transform)
.doto(() => {
console.log(chalk.green(`Imported ${languageName} from Google Sheets successfully!`))
})
.pipe(fs.createWriteStream(`${TRANSLATIONS_DIRECTORY}/locale-${language}.${format}`), writeFileOptions)
})
}
module.exports = {
handler: importFunc
}