UNPKG

@mediafly/translate

Version:

Translate strings extracted from apps using Google Translate

119 lines (98 loc) 3.46 kB
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 }