@mediafly/translate
Version:
Translate strings extracted from apps using Google Translate
90 lines (73 loc) • 2.54 kB
JavaScript
var fs = require('fs')
var assert = require('assert')
var crypto = require('crypto')
var chalk = require('chalk')
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 creds = config.googleSheetsCredentials
var sheetId = config.googleSheetId
var languages = config.languages
var doc = new GoogleSpreadsheet.GoogleSpreadsheet(sheetId)
var fileFormat = require('./format')
try {
await doc.useServiceAccountAuth(creds)
} catch (error) {
console.error(`${chalk.red('Cannot authenticate with Google Sheets')}`)
console.error(`${chalk.red(err)}`)
}
try {
await doc.getInfo()
} catch (error) {
console.error(`${chalk.red('Cannot access sheet')}`)
console.error(`Verify that it is accessible to the service account being used by mediafly-translate`)
}
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.Override) {
return highland.set(b.Key, b.Override, a)
} else {
return highland.set(b.Key, b[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
}