           return key.citekey + (if key.citekeyFormat then ' *' else '')
 
       return original.apply(this, arguments)
-    )(Zotero.ItemTreeView.prototype.getCellText)
+    )(Zotero.ItemTreeView::getCellText)
 
   # monkey-patch translate to capture export path and auto-export
-  Zotero.Translate.Export.prototype.translate = ((original) ->
+  Zotero.Translate.Export::translate = ((original) ->
     return ->
       # requested translator
       translatorID = @translator?[0]
       translatorID = translatorID.translatorID if translatorID.translatorID
       return original.apply(this, arguments) unless translatorID
 
-      # detect BBT
-      for own name, bbt of Zotero.BetterBibTeX.translators
-        break if bbt.translatorID == translatorID
-        bbt = null
-
       # convert group into its library items
       if @_collection?.objectType == 'group'
         @_group = @_collection

      return original.apply(this, arguments)
    )(Zotero.Debug.setStore)

  # monkey-patch Zotero.ItemTreeView.prototype.getCellText to replace the 'extra' column with the citekey
  # I wish I didn't have to hijack the extra field, but Zotero has checks in numerous places to make sure it only
  # displays 'genuine' Zotero fields, and monkey-patching around all of those got to be way too invasive (and thus
  # fragile)
  Zotero.ItemTreeView.prototype.getCellText = ((original) ->
    return (row, column) ->
      if column.id == 'zotero-items-column-extra' && Zotero.BetterBibTeX.pref.get('showCitekeys')
        item = this._getItemAtRow(row)

      Zotero.File.getContentsFromURL("resource://zotero-better-bibtex/translators/#{translator}")
    ].join("\n")

    @translators[header.translatorID] = @translators[header.label.replace(/\s/, '')] = header
    Zotero.Translators.save(header, code)
  catch err
    @log("Loading #{translator} failed", err)
  return

Zotero.BetterBibTeX.getTranslator = (name) ->
  return @translators[name.replace(/\s/, '')].translatorID if @translators[name.replace(/\s/, '')]

  name = name.toLowerCase().replace(/[^a-z]/, '')
  translators = {}
  for id, header of @translators
    label = header.label.toLowerCase().replace(/[^a-z]/, '')
    translators[label] = header.translatorID
    translators[label.replace(/^zotero/, '')] = header.translatorID
    translators[label.replace(/^better/, '')] = header.translatorID
  return translators[name] if translators[name]
  throw "No translator #{name}; available: #{JSON.stringify(translators)} from #{JSON.stringify(@translators)}"

Zotero.BetterBibTeX.translatorName = (id) ->
  for own translatorID, tr of @translators
    return tr.label if translatorID == id
  return "#{id}"

Zotero.BetterBibTeX.safeGetAll = ->
