whole_func_string: function(library, locales) {
        const Promisify = qx.tool.compiler.utils.Promisify;
        
        return Promise.all(locales.map(locale => {
          var translation = new qx.tool.compiler.app.Translation(library, locale);
          return translation.read()
          .then(() => {
            let unusedEntries = {};
            for (let msgid in translation.getEntries())
              unusedEntries[msgid] = true;
            
            return Promise.all(this.__classes.map(async classname => {
              if (!classname.startsWith(library.getNamespace())) {
                return;
              }
              
              let dbClassInfo = await Promisify.call(cb => this.getClassInfo(classname, cb));
              if (!dbClassInfo.translations)
                return;
              
              dbClassInfo.translations.forEach(function(src) {
                var entry = translation.getOrCreateEntry(src.msgid);
                delete unusedEntries[src.msgid];
                if (src.msgid_plural) {
                  entry.msgid_plural = src.msgid_plural;
                }
                if (!entry.comments) {
                  entry.comments = {}; 
                }
                entry.comments.extracted = src.comment; 
                entry.comments.reference = {};
                let ref = entry.comments.reference;
                const fileName = classname.replace(/\./g, "/") + ".js";
                const fnAddReference = lineNo => {
                  let arr = ref[fileName];
                  if (!arr)
                    arr = ref[fileName] = [];
                  
                  if (!arr.includes(src.lineNo)) {
                    arr.push(lineNo);
                  }
                };
                if (qx.lang.Type.isArray(src.lineNo)) {
                  src.lineNo.forEach(fnAddReference);
                } else {
                  fnAddReference(src.lineNo);
                }
              });
            }))
            .then(() => {
              Object.keys(unusedEntries).forEach(msgid => {
                var entry = translation.getEntry(msgid);
                if (entry) {
                  if (!entry.comments) {
                    entry.comments = {}; 
                  }
                  entry.comments.extracted = "NO LONGER USED"; 
                  entry.comments.reference = {};
                }
              });
            });
          })
          .then(() => translation.write());
        }));
      }
func_code_string: function(library, locales) {
        const Promisify = qx.tool.compiler.utils.Promisify;
        
        return Promise.all(locales.map(locale => {
          var translation = new qx.tool.compiler.app.Translation(library, locale);
          return translation.read()
          .then(() => {
            let unusedEntries = {};
            for (let msgid in translation.getEntries())
              unusedEntries[msgid] = true;
            
            return Promise.all(this.__classes.map(async classname => {
              if (!classname.startsWith(library.getNamespace())) {
                return;
              }
              
              let dbClassInfo = await Promisify.call(cb => this.getClassInfo(classname, cb));
              if (!dbClassInfo.translations)
                return;
              
              dbClassInfo.translations.forEach(function(src) {
                var entry = translation.getOrCreateEntry(src.msgid);
                delete unusedEntries[src.msgid];
                if (src.msgid_plural) {
                  entry.msgid_plural = src.msgid_plural;
                }
                if (!entry.comments) {
                  entry.comments = {}; 
                }
                entry.comments.extracted = src.comment; 
                entry.comments.reference = {};
                let ref = entry.comments.reference;
                const fileName = classname.replace(/\./g, "/") + ".js";
                const fnAddReference = lineNo => {
                  let arr = ref[fileName];
                  if (!arr)
                    arr = ref[fileName] = [];
                  
                  if (!arr.includes(src.lineNo)) {
                    arr.push(lineNo);
                  }
                };
                if (qx.lang.Type.isArray(src.lineNo)) {
                  src.lineNo.forEach(fnAddReference);
                } else {
                  fnAddReference(src.lineNo);
                }
              });
            }))
            .then(() => {
              Object.keys(unusedEntries).forEach(msgid => {
                var entry = translation.getEntry(msgid);
                if (entry) {
                  if (!entry.comments) {
                    entry.comments = {}; 
                  }
                  entry.comments.extracted = "NO LONGER USED"; 
                  entry.comments.reference = {};
                }
              });
            });
          })
          .then(() => translation.write());
        }));
      }
func_documentation_string: Updates all translations to include all msgids found in code
  @param the library to update
  @param locales
  @param cb