Skip to content

Instantly share code, notes, and snippets.

@softlion
Created February 9, 2018 11:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save softlion/02fab2672a135ba2e76fc3b4568fb3b1 to your computer and use it in GitHub Desktop.
Save softlion/02fab2672a135ba2e76fc3b4568fb3b1 to your computer and use it in GitHub Desktop.
poeditor: export all projects/languages to resx files (or any format)
//Install nodejs and the npm dependencies:
//npm install node-poeditor
//npm install async-file
//npm install linq-es2015
//npm install requisition
//
//run:
//node poeditor-export.js
const token = 'you-api-token-here';
const poconnect = require('node-poeditor');
const fs = require('async-file');
const Enumerable = require('linq-es2015');
const req = require('requisition');
const path = require('path');
//Name of projects to export. exportName will be the name of the exported file (without extension)
//All languages of these projects will be exported
const projectSettings = [
{name:'Cosmo texts.resx', exportName:'Texts'},
{name:'Cosmo InfoPlist.resx', exportName:'InfoPlist'},
{name:'Cosmo.SMS.Emails.Links', exportName:'Links'},
];
//Default language reference
const rootLanguage = 'en';
//Output folder
const rootFolder = 'translations';
const exportParameters = {
language: 'en',
type: 'resx',
//tags: '["someTag"]',
//filters: '["someFilter"]'
};
async function extractProject(project, settings)
{
console.log("Extracting " + project.name)
//Loop through languages
var projectLanguages = (await poconnect.languages.list(token, project.id)).languages;
var promises = [];
for(language of projectLanguages) {
var exportParams = Object.assign({}, exportParameters, {language: language.code});
var exportUrl = (await poconnect.projects.export(token, project.id, exportParams)).url;
// download and save file
//path.join();
var filename = language.code != rootLanguage ? settings.exportName + '.' + language.code + '.resx' : settings.exportName + '.resx';
filename = path.join(rootFolder, filename);
await downloadOverwiteFile(exportUrl, filename);
//promises.push(await downloadOverwiteFile(exportUrl, filename)); //PO API dl the wrong language !
};
await Promise.all(promises);
}
async function downloadOverwiteFile(url, filename)
{
console.log('downloading ' + filename);
var response = await req(url);
await response.saveTo(filename);
response.destroy();
}
(async () => {
try {
console.log('starting!');
var projects = (await poconnect.projects.list(token)).projects;
console.log('examining ' + projects.length + ' projects');
var projectNames = Enumerable.from(projectSettings).Select(p => p.name).ToArray();
var promises = [];
for(var project of projects)
{
var settings = Enumerable.from(projectSettings).FirstOrDefault(p => p.name == project.name);
if(settings != null)
await extractProject(project, settings);
//promises.push(extractProject(project, settings)); //Parallel call (no await)
}
await Promise.all(promises);
console.log('finished!');
} catch (err) {
console.log(err);
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment