@mediafly/translate
Version:
Translate strings extracted from apps using Google Translate
54 lines (47 loc) • 1.65 kB
JavaScript
const _ = require('lodash')
const path = require('path')
const fs = require('fs')
const config = require(path.join(process.cwd(), 'mediafly-translate.config'))
const format = require('./format')
const xmlJs = require('xml-js')
const { getTranslationsDir, requireOrDefault } = require('./util')
const TRANSLATIONS_DIRECTORY = getTranslationsDir()
function isValid(line) {
const isValid = line.match(/"(.|\u2028)*" = "(.|\u2028)*"/g)
if (!isValid) {
console.log(`Skipping ${line}`)
}
return isValid
}
module.exports = {
read: function(filePath, defaultValue = {}) {
if (config.format === 'strings') {
if (!fs.existsSync(`${TRANSLATIONS_DIRECTORY}/${filePath}.strings`)) {
return defaultValue
}
let contents = fs.readFileSync(`${TRANSLATIONS_DIRECTORY}/${filePath}.strings`, 'ucs2')
let obj = {}
format.separateByNewLines(contents)
.filter(line => isValid(line))
.forEach(s => {
obj[format.parseKey(s)] = format.parseValue(s)
})
return obj
}
else if (config.format === 'xml') {
//read the xml file and return a JavaScript object
if (!fs.existsSync(`${TRANSLATIONS_DIRECTORY}/${filePath}.xml`)) {
return defaultValue
}
let contents = fs.readFileSync(`${TRANSLATIONS_DIRECTORY}/${filePath}.xml`)
const json = xmlJs.xml2js(contents, { compact: true })
let obj = {}
if (_.get(json, 'resources.string')) {
_.each(json.resources.string, s => _.set(obj, s._attributes.name, s._text))
}
return _.mapValues(obj, value => format.removeEscapedCharsForAndroid(value))
} else {
return requireOrDefault(`${TRANSLATIONS_DIRECTORY}/${filePath}`, defaultValue)
}
}
}