text: #!/usr/bin/env node
  
  
  if (process.argv[2]) {
    var no_key = (process.argv[2].toLowerCase() == '--nokey');
    if (no_key == false) {
      console.log('Incorrect arg. Please use --nokey if you would like to download without api key.');
      process.exit(1);
    }
  } else {
    var no_key = false;
    console.log('\n' +
                'Please note: If you do not have the crowdin API key and would like to download the ' +
                'translations without building anyways, please make sure your English files are the same ' +
                'version as crowdin, and then run this script with --nokey\n\n' +
                'eg. "node crowdin_download.js --nokey"\n\n');
  }
  
  const fs = require('fs');
  const path = require('path');
  const https = require('https');
  const AdmZip = require('adm-zip');
  
  const crowdin_identifier = 'byteball';
  
  const local_file_name2 = path.join(__dirname, 'docs/appstore_en.txt');
  const local_file_name3 = path.join(__dirname, 'docs/updateinfo_en.txt');
  
  try {
    fs.statSync(local_file_name2);
    fs.statSync(local_file_name3);
  } catch (e) {
    console.log(`\n### ABORTING ### One of the following files does not exist:\n${local_file_name2}\n${local_file_name3}`);
    process.exit(1);
  }
  
  if (no_key == false) { // Reminder: Any changes to the script below must also be made to the else clause and vice versa.
    try {
      // obtain the crowdin api key
      var crowdin_api_key = fs.readFileSync(path.join(__dirname, 'crowdin_api_key.txt'), 'utf8');
    } catch (e) {
      console.log('### ERROR ### You do not have the crowdin api key in ./crowdin_api_key.txt so the translation build has failed.\nFor download only use --nokey.');
      process.exit(1);
    }
  
    // This call will tell the server to generate a new zip file for you based on most recent translations.
    https.get(`https://api.crowdin.com/api/project/${crowdin_identifier}/export?key=${crowdin_api_key}`, (res) => {
      console.log(`Export Got response: ${res.statusCode}`);
  
      res.on('data', (chunk) => {
        const resxml = chunk.toString('utf8');
        console.log(resxml);
  
        if (resxml.indexOf('status="skipped"') >= 0) {
          console.log('Translation build was skipped due to either:\n' +
                      '1. No changes since last translation build, or\n' +
                      '2. API limit of once per 30 minutes has not been waited.\n\n' +
                      'Since we can not guarantee that translations have been built properly, this script will end here.\n' +
                      'Log in to Byteball\'s Crowdin Settings and click the "Build Project" button to assure it is built recently, and then run this ' +
                      'script again with the --nokey arg to download translations without checking if built.');
          process.exit(1);
        }
  
        // Download most recent translations for all languages.
        https.get(`https://crowdin.com/download/project/${crowdin_identifier}.zip`, (res) => {
          let data = [],
            dataLen = 0;
  
          res.on('data', (chunk) => {
            data.push(chunk);
            dataLen += chunk.length;
          }).on('end', () => {
            const buf = new Buffer(dataLen);
            for (var i = 0, len = data.length, pos = 0; i < len; i++) {
              data[i].copy(buf, pos);
              pos += data[i].length;
            }
            const zip = new AdmZip(buf);
            zip.extractAllTo('./', true);
            console.log('Done extracting ZIP file.');
  
            var files = fs.readdirSync('./docs');
  
            for (var i in files) {
              debugger;
              if (files[i].slice(0, 9) == 'appstore_' && files[i].slice(-4) == '.txt' && files[i] != 'appstore_en.txt') {
                var english_file = fs.readFileSync(local_file_name2, 'utf8');
                var compare_file = fs.readFileSync(path.join(__dirname, `docs/${files[i]}`), 'utf8');
                english_file = english_file.replace(/\r\n/g, '\n');
                compare_file = compare_file.replace(/\r\n/g, '\n');
                if (compare_file == english_file) {
                  fs.unlinkSync(path.join(__dirname, `docs/${files[i]}`));
                }
              }
              if (files[i].slice(0, 11) == 'updateinfo_' && files[i].slice(-4) == '.txt' && files[i] != 'updateinfo_en.txt') {
                var english_file = fs.readFileSync(local_file_name3, 'utf8');
                var compare_file = fs.readFileSync(path.join(__dirname, `docs/${files[i]}`), 'utf8');
                english_file = english_file.replace(/\r\n/g, '\n');
                compare_file = compare_file.replace(/\r\n/g, '\n');
                if (compare_file == english_file) {
                  fs.unlinkSync(path.join(__dirname, `docs/${files[i]}`));
                }
              }
            }
  
            console.log('Cleaned out completely untranslated appstore docs.');
  
            var files = fs.readdirSync('./po');
  
            for (var i in files) {
              if (files[i] != 'template.pot') {
                let po_file = fs.readFileSync(path.join(__dirname, `po/${files[i]}`), 'utf8');
                const po_array = po_file.split('\n');
                for (const j in po_array) {
                  if (po_array[j].slice(0, 5) == 'msgid') {
                    var source_text = po_array[j].slice(5);
                  } else if (po_array[j].slice(0, 6) == 'msgstr') {
                    const translate_text = po_array[j].slice(6);
                      // if a line is not == English, it means there is translation. Keep this file.
                    if (source_text != translate_text) {
                        // erase email addresses of last translator for privacy
                      po_file = po_file.replace(/ <.+@.+\..+>/, '');
                      fs.writeFileSync(path.join(__dirname, `po/${files[i]}`), po_file);
  
                        // split the file into 3 parts, before locale, locale, and after locale.
                      const lang_pos = po_file.search('"Language: ') + 11;
                      let po_start = po_file.slice(0, lang_pos);
                      let po_locale = po_file.slice(lang_pos, lang_pos + 5);
                      let po_end = po_file.slice(lang_pos + 5);
  
                        // check for underscore, if it's there, only take the first 2 letters and reconstruct the po file.
                      if (po_locale.search('_') > 0) {
                        fs.writeFileSync(path.join(__dirname, `po/${files[i]}`), po_start + po_locale.slice(0, 2) + po_end);
                        po_start = '';
                        po_locale = '';
                        po_end = '';
                      }
                      break;
                    }
                  }
                  if (j == po_array.length - 1) { // All strings are exactly identical to English. Delete po file.
                    fs.unlinkSync(path.join(__dirname, `po/${files[i]}`));
                  }
                }
              }
            }
  
            console.log('Cleaned out completely untranslated po files.');
          });
        });
      });
    }).on('error', (e) => {
      console.log(`Export Got error: ${e.message}`);
    });
  } else { // Reminder: Any changes to the script below must also be made to the above and vice versa.
    // Download most recent translations for all languages.
    https.get(`https://crowdin.com/download/project/${crowdin_identifier}.zip`, (res) => {
      let data = [],
        dataLen = 0;
  
      res.on('data', (chunk) => {
        data.push(chunk);
        dataLen += chunk.length;
      }).on('end', () => {
        const buf = new Buffer(dataLen);
        for (var i = 0, len = data.length, pos = 0; i < len; i++) {
          data[i].copy(buf, pos);
          pos += data[i].length;
        }
        const zip = new AdmZip(buf);
        zip.extractAllTo('./', true);
        console.log('Done extracting ZIP file.');
  
        var files = fs.readdirSync('./docs');
  
        for (var i in files) {
          if (files[i].slice(0, 9) == 'appstore_' && files[i].slice(-4) == '.txt' && files[i] != 'appstore_en.txt') {
            var english_file = fs.readFileSync(local_file_name2, 'utf8');
            var compare_file = fs.readFileSync(path.join(__dirname, `docs/${files[i]}`), 'utf8');
            english_file = english_file.replace(/\r\n/g, '\n');
            compare_file = compare_file.replace(/\r\n/g, '\n');
            if (compare_file == english_file) {
              fs.unlinkSync(path.join(__dirname, `docs/${files[i]}`));
            }
          }
          if (files[i].slice(0, 11) == 'updateinfo_' && files[i].slice(-4) == '.txt' && files[i] != 'updateinfo_en.txt') {
            var english_file = fs.readFileSync(local_file_name3, 'utf8');
            var compare_file = fs.readFileSync(path.join(__dirname, `docs/${files[i]}`), 'utf8');
            english_file = english_file.replace(/\r\n/g, '\n');
            compare_file = compare_file.replace(/\r\n/g, '\n');
            if (compare_file == english_file) {
              fs.unlinkSync(path.join(__dirname, `docs/${files[i]}`));
            }
          }
        }
  
        console.log('Cleaned out completely untranslated appstore docs.');
  
        var files = fs.readdirSync('./po');
  
        for (var i in files) {
          if (files[i] != 'template.pot') {
            let po_file = fs.readFileSync(path.join(__dirname, `po/${files[i]}`), 'utf8');
            const po_array = po_file.split('\n');
            for (const j in po_array) {
              if (po_array[j].slice(0, 5) == 'msgid') {
                var source_text = po_array[j].slice(5);
              } else if (po_array[j].slice(0, 6) == 'msgstr') {
                const translate_text = po_array[j].slice(6);
                  // if a line is not == English, it means there is translation. Keep this file.
                if (source_text != translate_text) {
                    // erase email addresses of last translator for privacy
                  po_file = po_file.replace(/ <.+@.+\..+>/, '');
                  fs.writeFileSync(path.join(__dirname, `po/${files[i]}`), po_file);
  
                    // split the file into 3 parts, before locale, locale, and after locale.
                  const lang_pos = po_file.search('"Language: ') + 11;
                  let po_start = po_file.slice(0, lang_pos);
                  let po_locale = po_file.slice(lang_pos, lang_pos + 5);
                  let po_end = po_file.slice(lang_pos + 5);
  
                    // check for underscore, if it's there, only take the first 2 letters and reconstruct the po file.
                  if (po_locale.search('_') > 0) {
                    fs.writeFileSync(path.join(__dirname, `po/${files[i]}`), po_start + po_locale.slice(0, 2) + po_end);
                    po_start = '';
                    po_locale = '';
                    po_end = '';
                  }
                  break;
                }
              }
              if (j == po_array.length - 1) { // All strings are exactly identical to English. Delete po file.
                fs.unlinkSync(path.join(__dirname, `po/${files[i]}`));
              }
            }
          }
        }
  
        console.log('Cleaned out completely untranslated po files.');
      });
    });
  }
  