     try
       code = Zotero.File.getContentsFromURL("resource://zotero-better-bibtex/#{header.label}.js")
     catch err
-      debug('Translator.install: ', header, 'could not be loaded:', err)
+      debug('Translators.install: ', header, 'could not be loaded:', err)
       throw err
 
-    debug('Translator.load header:', header)
+    debug('Translators.install header:', header)
     try
       fileName = Zotero.Translators.getFileNameFromLabel(header.label, header.translatorID)
       destFile = Zotero.getTranslatorsDirectory()
       destFile.append(fileName)
 
-      existing = Zotero.Translators.get(header.translatorID)
-      if existing
-        if fileName != Zotero.Translators.getFileNameFromLabel(existing.label, existing.translatorID)
-          msg = "Translator with ID #{header.translatorID} and label '#{header.label}' overwrites translator with label '#{existing.label}'"
-          debug(msg)
-          Components.utils.reportError("#{msg} in Translators.install()")
+      if existing = Zotero.Translators.get(header.translatorID)
+        newHeader = code.substring(0, code.indexOf("\n}") + 2)
+        debug('Translators.install: existing:', existing, 'new', newHeader)
+        try
+          newHeader = JSON.parse(newHeader)
+          return false if newHeader.lastUpdated == existing.lastUpdated
+        catch err
+          debug('Translators.install: failed to parse new header:', err, newHeader)
 
-      debug("Saving translator", header.label)
+      else
+        debug('Translators.install: no existing:', header.translatorID)
+
+      debug("Translators.install: saving translator", header.label)
 
       Zotero.File.putContents(destFile, code)
 

      debug('Translator.load', header, 'failed:', err)
      @uninstall(header.label, header.translatorID)

    return

  translate: Zotero.Promise.coroutine((translatorID, displayOptions, items, path) ->
    items ||= { library: Zotero.Libraries.userLibraryID }

    start = new Date()
    Object.assign(@, require('../gen/translators.json'))

    if Prefs.get('removeStock')
      @uninstall('BibLaTeX', 'b6e39b57-8942-4d11-8259-342c46ce395f')
      @uninstall('BibTeX', '9cb70025-a888-4a29-a210-93ec52da40d4')

    reinit = false
    for id, header of @byId
      if @install(header)
        reinit = true
        debug('Translators.init: installed', header.label, '@', (new Date() - start))
      else
        debug('Translators.init: retained', header.label, '@', (new Date() - start))

    return unless reinit

    debug('Translators.init: reinit translators...')
    try
      yield Zotero.Translators.reinit()
      debug('Translators.init: reinit ready @', (new Date() - start))
    catch err
      debug('Translator.inits: reinit failed @', (new Date() - start), err)
    return
  )

