From 12b7d12488312857ccc1083bd461d7cf22516fdf Mon Sep 17 00:00:00 2001
From: HonkinGamer <66095733+HonkGamer@users.noreply.github.com>
Date: Mon, 1 Jun 2020 22:22:49 -0400
Subject: [PATCH] Add files via upload
---
AtlasLoot/Libs/AceAddon-3.0/AceAddon-3.0.lua | 642 ++
AtlasLoot/Libs/AceAddon-3.0/AceAddon-3.0.xml | 4 +
AtlasLoot/Libs/AceComm-3.0/AceComm-3.0.lua | 309 +
AtlasLoot/Libs/AceComm-3.0/AceComm-3.0.xml | 5 +
.../Libs/AceComm-3.0/ChatThrottleLib.lua | 503 ++
AtlasLoot/Libs/AceDB-3.0/AceDB-3.0.lua | 728 ++
AtlasLoot/Libs/AceDB-3.0/AceDB-3.0.xml | 4 +
AtlasLoot/Libs/AceLibrary/AceLibrary.lua | 799 ++
AtlasLoot/Libs/AceLibrary/AceLibrary.toc | 15 +
.../Libs/AceLocale-3.0/AceLocale-3.0.lua | 136 +
.../Libs/AceLocale-3.0/AceLocale-3.0.xml | 4 +
.../AceSerializer-3.0/AceSerializer-3.0.lua | 281 +
.../AceSerializer-3.0/AceSerializer-3.0.xml | 4 +
.../CallbackHandler-1.0.lua | 239 +
.../CallbackHandler-1.0.xml | 4 +
.../Libs/DewdropLib/AceLibrary/AceLibrary.lua | 799 ++
.../Libs/DewdropLib/AceLibrary/AceLibrary.toc | 15 +
.../DewdropLib/Dewdrop-2.0/Dewdrop-2.0.lua | 3498 +++++++++
AtlasLoot/Libs/DewdropLib/DewdropLib.toc | 18 +
AtlasLoot/Libs/DewdropLib/LICENSE.txt | 15 +
AtlasLoot/Libs/DewdropLib/embeds.xml | 6 +
.../Libs/LibAboutPanel/LibAboutPanel.lua | 201 +
.../Libs/LibAboutPanel/LibAboutPanel.toc | 36 +
AtlasLoot/Libs/LibAboutPanel/lib.xml | 4 +
.../CallbackHandler-1.0.lua | 240 +
.../CallbackHandler-1.0.xml | 4 +
.../LibAboutPanel/libs/LibStub/LibStub.lua | 30 +
.../LibAboutPanel/libs/LibStub/LibStub.toc | 13 +
.../Libs/LibBabble-Boss-3.0/LibBabble-3.0.lua | 292 +
.../LibBabble-Boss-3.0/LibBabble-Boss-3.0.lua | 6649 +++++++++++++++++
.../LibBabble-Boss-3.0/LibBabble-Boss-3.0.toc | 21 +
.../LibBabble-Boss-3.0/LibStub/LibStub.lua | 30 +
AtlasLoot/Libs/LibBabble-Boss-3.0/lib.xml | 5 +
.../LibBabble-Faction-3.0/LibBabble-3.0.lua | 292 +
.../LibBabble-Faction-3.0.lua | 799 ++
.../LibBabble-Faction-3.0.toc | 22 +
.../LibBabble-Faction-3.0/LibStub/LibStub.lua | 30 +
AtlasLoot/Libs/LibBabble-Faction-3.0/lib.xml | 5 +
.../LibBabble-Inventory-3.0/LibBabble-3.0.lua | 292 +
.../LibBabble-Inventory-3.0.lua | 1330 ++++
.../LibBabble-Inventory-3.0.toc | 16 +
.../LibStub/LibStub.lua | 30 +
.../Libs/LibBabble-Inventory-3.0/lib.xml | 5 +
.../Libs/LibBabble-Zone-3.0/LibBabble-3.0.lua | 292 +
.../LibBabble-Zone-3.0/LibBabble-Zone-3.0.lua | 2464 ++++++
.../LibBabble-Zone-3.0/LibBabble-Zone-3.0.toc | 18 +
.../LibBabble-Zone-3.0/LibStub/LibStub.lua | 30 +
AtlasLoot/Libs/LibBabble-Zone-3.0/lib.xml | 5 +
.../LibDataBroker-1.1/LibDataBroker-1.1.lua | 66 +
AtlasLoot/Libs/LibStub/LibStub.lua | 30 +
AtlasLoot/Libs/LibStub/LibStub.toc | 13 +
51 files changed, 21292 insertions(+)
create mode 100644 AtlasLoot/Libs/AceAddon-3.0/AceAddon-3.0.lua
create mode 100644 AtlasLoot/Libs/AceAddon-3.0/AceAddon-3.0.xml
create mode 100644 AtlasLoot/Libs/AceComm-3.0/AceComm-3.0.lua
create mode 100644 AtlasLoot/Libs/AceComm-3.0/AceComm-3.0.xml
create mode 100644 AtlasLoot/Libs/AceComm-3.0/ChatThrottleLib.lua
create mode 100644 AtlasLoot/Libs/AceDB-3.0/AceDB-3.0.lua
create mode 100644 AtlasLoot/Libs/AceDB-3.0/AceDB-3.0.xml
create mode 100644 AtlasLoot/Libs/AceLibrary/AceLibrary.lua
create mode 100644 AtlasLoot/Libs/AceLibrary/AceLibrary.toc
create mode 100644 AtlasLoot/Libs/AceLocale-3.0/AceLocale-3.0.lua
create mode 100644 AtlasLoot/Libs/AceLocale-3.0/AceLocale-3.0.xml
create mode 100644 AtlasLoot/Libs/AceSerializer-3.0/AceSerializer-3.0.lua
create mode 100644 AtlasLoot/Libs/AceSerializer-3.0/AceSerializer-3.0.xml
create mode 100644 AtlasLoot/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
create mode 100644 AtlasLoot/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
create mode 100644 AtlasLoot/Libs/DewdropLib/AceLibrary/AceLibrary.lua
create mode 100644 AtlasLoot/Libs/DewdropLib/AceLibrary/AceLibrary.toc
create mode 100644 AtlasLoot/Libs/DewdropLib/Dewdrop-2.0/Dewdrop-2.0.lua
create mode 100644 AtlasLoot/Libs/DewdropLib/DewdropLib.toc
create mode 100644 AtlasLoot/Libs/DewdropLib/LICENSE.txt
create mode 100644 AtlasLoot/Libs/DewdropLib/embeds.xml
create mode 100644 AtlasLoot/Libs/LibAboutPanel/LibAboutPanel.lua
create mode 100644 AtlasLoot/Libs/LibAboutPanel/LibAboutPanel.toc
create mode 100644 AtlasLoot/Libs/LibAboutPanel/lib.xml
create mode 100644 AtlasLoot/Libs/LibAboutPanel/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
create mode 100644 AtlasLoot/Libs/LibAboutPanel/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
create mode 100644 AtlasLoot/Libs/LibAboutPanel/libs/LibStub/LibStub.lua
create mode 100644 AtlasLoot/Libs/LibAboutPanel/libs/LibStub/LibStub.toc
create mode 100644 AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-3.0.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-Boss-3.0.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-Boss-3.0.toc
create mode 100644 AtlasLoot/Libs/LibBabble-Boss-3.0/LibStub/LibStub.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Boss-3.0/lib.xml
create mode 100644 AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-3.0.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-Faction-3.0.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-Faction-3.0.toc
create mode 100644 AtlasLoot/Libs/LibBabble-Faction-3.0/LibStub/LibStub.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Faction-3.0/lib.xml
create mode 100644 AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-3.0.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-Inventory-3.0.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-Inventory-3.0.toc
create mode 100644 AtlasLoot/Libs/LibBabble-Inventory-3.0/LibStub/LibStub.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Inventory-3.0/lib.xml
create mode 100644 AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-3.0.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-Zone-3.0.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-Zone-3.0.toc
create mode 100644 AtlasLoot/Libs/LibBabble-Zone-3.0/LibStub/LibStub.lua
create mode 100644 AtlasLoot/Libs/LibBabble-Zone-3.0/lib.xml
create mode 100644 AtlasLoot/Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua
create mode 100644 AtlasLoot/Libs/LibStub/LibStub.lua
create mode 100644 AtlasLoot/Libs/LibStub/LibStub.toc
diff --git a/AtlasLoot/Libs/AceAddon-3.0/AceAddon-3.0.lua b/AtlasLoot/Libs/AceAddon-3.0/AceAddon-3.0.lua
new file mode 100644
index 0000000..3ac4eff
--- /dev/null
+++ b/AtlasLoot/Libs/AceAddon-3.0/AceAddon-3.0.lua
@@ -0,0 +1,642 @@
+--- **AceAddon-3.0** provides a template for creating addon objects.
+-- It'll provide you with a set of callback functions that allow you to simplify the loading
+-- process of your addon.\\
+-- Callbacks provided are:\\
+-- * **OnInitialize**, which is called directly after the addon is fully loaded.
+-- * **OnEnable** which gets called during the PLAYER_LOGIN event, when most of the data provided by the game is already present.
+-- * **OnDisable**, which is only called when your addon is manually being disabled.
+-- @usage
+-- -- A small (but complete) addon, that doesn't do anything,
+-- -- but shows usage of the callbacks.
+-- local MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
+--
+-- function MyAddon:OnInitialize()
+-- -- do init tasks here, like loading the Saved Variables,
+-- -- or setting up slash commands.
+-- end
+--
+-- function MyAddon:OnEnable()
+-- -- Do more initialization here, that really enables the use of your addon.
+-- -- Register Events, Hook functions, Create Frames, Get information from
+-- -- the game that wasn't available in OnInitialize
+-- end
+--
+-- function MyAddon:OnDisable()
+-- -- Unhook, Unregister Events, Hide frames that you created.
+-- -- You would probably only use an OnDisable if you want to
+-- -- build a "standby" mode, or be able to toggle modules on/off.
+-- end
+-- @class file
+-- @name AceAddon-3.0.lua
+-- @release $Id: AceAddon-3.0.lua 895 2009-12-06 16:28:55Z nevcairiel $
+
+local MAJOR, MINOR = "AceAddon-3.0", 5
+local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not AceAddon then return end -- No Upgrade needed.
+
+AceAddon.frame = AceAddon.frame or CreateFrame("Frame", "AceAddon30Frame") -- Our very own frame
+AceAddon.addons = AceAddon.addons or {} -- addons in general
+AceAddon.statuses = AceAddon.statuses or {} -- statuses of addon.
+AceAddon.initializequeue = AceAddon.initializequeue or {} -- addons that are new and not initialized
+AceAddon.enablequeue = AceAddon.enablequeue or {} -- addons that are initialized and waiting to be enabled
+AceAddon.embeds = AceAddon.embeds or setmetatable({}, {__index = function(tbl, key) tbl[key] = {} return tbl[key] end }) -- contains a list of libraries embedded in an addon
+
+-- Lua APIs
+local tinsert, tconcat, tremove = table.insert, table.concat, table.remove
+local fmt, tostring = string.format, tostring
+local select, pairs, next, type, unpack = select, pairs, next, type, unpack
+local loadstring, assert, error = loadstring, assert, error
+local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: LibStub, IsLoggedIn, geterrorhandler
+
+--[[
+ xpcall safecall implementation
+]]
+local xpcall = xpcall
+
+local function errorhandler(err)
+ return geterrorhandler()(err)
+end
+
+local function CreateDispatcher(argCount)
+ local code = [[
+ local xpcall, eh = ...
+ local method, ARGS
+ local function call() return method(ARGS) end
+
+ local function dispatch(func, ...)
+ method = func
+ if not method then return end
+ ARGS = ...
+ return xpcall(call, eh)
+ end
+
+ return dispatch
+ ]]
+
+ local ARGS = {}
+ for i = 1, argCount do ARGS[i] = "arg"..i end
+ code = code:gsub("ARGS", tconcat(ARGS, ", "))
+ return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
+end
+
+local Dispatchers = setmetatable({}, {__index=function(self, argCount)
+ local dispatcher = CreateDispatcher(argCount)
+ rawset(self, argCount, dispatcher)
+ return dispatcher
+end})
+Dispatchers[0] = function(func)
+ return xpcall(func, errorhandler)
+end
+
+local function safecall(func, ...)
+ -- we check to see if the func is passed is actually a function here and don't error when it isn't
+ -- this safecall is used for optional functions like OnInitialize OnEnable etc. When they are not
+ -- present execution should continue without hinderance
+ if type(func) == "function" then
+ return Dispatchers[select('#', ...)](func, ...)
+ end
+end
+
+-- local functions that will be implemented further down
+local Enable, Disable, EnableModule, DisableModule, Embed, NewModule, GetModule, GetName, SetDefaultModuleState, SetDefaultModuleLibraries, SetEnabledState, SetDefaultModulePrototype
+
+-- used in the addon metatable
+local function addontostring( self ) return self.name end
+
+--- Create a new AceAddon-3.0 addon.
+-- Any libraries you specified will be embeded, and the addon will be scheduled for
+-- its OnInitialize and OnEnable callbacks.
+-- The final addon object, with all libraries embeded, will be returned.
+-- @paramsig [object ,]name[, lib, ...]
+-- @param object Table to use as a base for the addon (optional)
+-- @param name Name of the addon object to create
+-- @param lib List of libraries to embed into the addon
+-- @usage
+-- -- Create a simple addon object
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceEvent-3.0")
+--
+-- -- Create a Addon object based on the table of a frame
+-- local MyFrame = CreateFrame("Frame")
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon(MyFrame, "MyAddon", "AceEvent-3.0")
+function AceAddon:NewAddon(objectorname, ...)
+ local object,name
+ local i=1
+ if type(objectorname)=="table" then
+ object=objectorname
+ name=...
+ i=2
+ else
+ name=objectorname
+ end
+ if type(name)~="string" then
+ error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2)
+ end
+ if self.addons[name] then
+ error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - Addon '%s' already exists."):format(name), 2)
+ end
+
+ object = object or {}
+ object.name = name
+
+ local addonmeta = {}
+ local oldmeta = getmetatable(object)
+ if oldmeta then
+ for k, v in pairs(oldmeta) do addonmeta[k] = v end
+ end
+ addonmeta.__tostring = addontostring
+
+ setmetatable( object, addonmeta )
+ self.addons[name] = object
+ object.modules = {}
+ object.defaultModuleLibraries = {}
+ Embed( object ) -- embed NewModule, GetModule methods
+ self:EmbedLibraries(object, select(i,...))
+
+ -- add to queue of addons to be initialized upon ADDON_LOADED
+ tinsert(self.initializequeue, object)
+ return object
+end
+
+
+--- Get the addon object by its name from the internal AceAddon registry.
+-- Throws an error if the addon object cannot be found (except if silent is set).
+-- @param name unique name of the addon object
+-- @param silent if true, the addon is optional, silently return nil if its not found
+-- @usage
+-- -- Get the Addon
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+function AceAddon:GetAddon(name, silent)
+ if not silent and not self.addons[name] then
+ error(("Usage: GetAddon(name): 'name' - Cannot find an AceAddon '%s'."):format(tostring(name)), 2)
+ end
+ return self.addons[name]
+end
+
+-- - Embed a list of libraries into the specified addon.
+-- This function will try to embed all of the listed libraries into the addon
+-- and error if a single one fails.
+--
+-- **Note:** This function is for internal use by :NewAddon/:NewModule
+-- @paramsig addon, [lib, ...]
+-- @param addon addon object to embed the libs in
+-- @param lib List of libraries to embed into the addon
+function AceAddon:EmbedLibraries(addon, ...)
+ for i=1,select("#", ... ) do
+ local libname = select(i, ...)
+ self:EmbedLibrary(addon, libname, false, 4)
+ end
+end
+
+-- - Embed a library into the addon object.
+-- This function will check if the specified library is registered with LibStub
+-- and if it has a :Embed function to call. It'll error if any of those conditions
+-- fails.
+--
+-- **Note:** This function is for internal use by :EmbedLibraries
+-- @paramsig addon, libname[, silent[, offset]]
+-- @param addon addon object to embed the library in
+-- @param libname name of the library to embed
+-- @param silent marks an embed to fail silently if the library doesn't exist (optional)
+-- @param offset will push the error messages back to said offset, defaults to 2 (optional)
+function AceAddon:EmbedLibrary(addon, libname, silent, offset)
+ local lib = LibStub:GetLibrary(libname, true)
+ if not lib and not silent then
+ error(("Usage: EmbedLibrary(addon, libname, silent, offset): 'libname' - Cannot find a library instance of %q."):format(tostring(libname)), offset or 2)
+ elseif lib and type(lib.Embed) == "function" then
+ lib:Embed(addon)
+ tinsert(self.embeds[addon], libname)
+ return true
+ elseif lib then
+ error(("Usage: EmbedLibrary(addon, libname, silent, offset): 'libname' - Library '%s' is not Embed capable"):format(libname), offset or 2)
+ end
+end
+
+--- Return the specified module from an addon object.
+-- Throws an error if the addon object cannot be found (except if silent is set)
+-- @name //addon//:GetModule
+-- @paramsig name[, silent]
+-- @param name unique name of the module
+-- @param silent if true, the module is optional, silently return nil if its not found (optional)
+-- @usage
+-- -- Get the Addon
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- -- Get the Module
+-- MyModule = MyAddon:GetModule("MyModule")
+function GetModule(self, name, silent)
+ if not self.modules[name] and not silent then
+ error(("Usage: GetModule(name, silent): 'name' - Cannot find module '%s'."):format(tostring(name)), 2)
+ end
+ return self.modules[name]
+end
+
+local function IsModuleTrue(self) return true end
+
+--- Create a new module for the addon.
+-- The new module can have its own embeded libraries and/or use a module prototype to be mixed into the module.\\
+-- A module has the same functionality as a real addon, it can have modules of its own, and has the same API as
+-- an addon object.
+-- @name //addon//:NewModule
+-- @paramsig name[, prototype|lib[, lib, ...]]
+-- @param name unique name of the module
+-- @param prototype object to derive this module from, methods and values from this table will be mixed into the module (optional)
+-- @param lib List of libraries to embed into the addon
+-- @usage
+-- -- Create a module with some embeded libraries
+-- MyModule = MyAddon:NewModule("MyModule", "AceEvent-3.0", "AceHook-3.0")
+--
+-- -- Create a module with a prototype
+-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
+-- MyModule = MyAddon:NewModule("MyModule", prototype, "AceEvent-3.0", "AceHook-3.0")
+function NewModule(self, name, prototype, ...)
+ if type(name) ~= "string" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2) end
+ if type(prototype) ~= "string" and type(prototype) ~= "table" and type(prototype) ~= "nil" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'prototype' - table (prototype), string (lib) or nil expected got '%s'."):format(type(prototype)), 2) end
+
+ if self.modules[name] then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - Module '%s' already exists."):format(name), 2) end
+
+ -- modules are basically addons. We treat them as such. They will be added to the initializequeue properly as well.
+ -- NewModule can only be called after the parent addon is present thus the modules will be initialized after their parent is.
+ local module = AceAddon:NewAddon(fmt("%s_%s", self.name or tostring(self), name))
+
+ module.IsModule = IsModuleTrue
+ module:SetEnabledState(self.defaultModuleState)
+ module.moduleName = name
+
+ if type(prototype) == "string" then
+ AceAddon:EmbedLibraries(module, prototype, ...)
+ else
+ AceAddon:EmbedLibraries(module, ...)
+ end
+ AceAddon:EmbedLibraries(module, unpack(self.defaultModuleLibraries))
+
+ if not prototype or type(prototype) == "string" then
+ prototype = self.defaultModulePrototype or nil
+ end
+
+ if type(prototype) == "table" then
+ local mt = getmetatable(module)
+ mt.__index = prototype
+ setmetatable(module, mt) -- More of a Base class type feel.
+ end
+
+ safecall(self.OnModuleCreated, self, module) -- Was in Ace2 and I think it could be a cool thing to have handy.
+ self.modules[name] = module
+
+ return module
+end
+
+--- Returns the real name of the addon or module, without any prefix.
+-- @name //addon//:GetName
+-- @paramsig
+-- @usage
+-- print(MyAddon:GetName())
+-- -- prints "MyAddon"
+function GetName(self)
+ return self.moduleName or self.name
+end
+
+--- Enables the Addon, if possible, return true or false depending on success.
+-- This internally calls AceAddon:EnableAddon(), thus dispatching a OnEnable callback
+-- and enabling all modules of the addon (unless explicitly disabled).\\
+-- :Enable() also sets the internal `enableState` variable to true
+-- @name //addon//:Enable
+-- @paramsig
+-- @usage
+-- -- Enable MyModule
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyModule = MyAddon:GetModule("MyModule")
+-- MyModule:Enable()
+function Enable(self)
+ self:SetEnabledState(true)
+ return AceAddon:EnableAddon(self)
+end
+
+--- Disables the Addon, if possible, return true or false depending on success.
+-- This internally calls AceAddon:DisableAddon(), thus dispatching a OnDisable callback
+-- and disabling all modules of the addon.\\
+-- :Disable() also sets the internal `enableState` variable to false
+-- @name //addon//:Disable
+-- @paramsig
+-- @usage
+-- -- Disable MyAddon
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyAddon:Disable()
+function Disable(self)
+ self:SetEnabledState(false)
+ return AceAddon:DisableAddon(self)
+end
+
+--- Enables the Module, if possible, return true or false depending on success.
+-- Short-hand function that retrieves the module via `:GetModule` and calls `:Enable` on the module object.
+-- @name //addon//:EnableModule
+-- @paramsig name
+-- @usage
+-- -- Enable MyModule using :GetModule
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyModule = MyAddon:GetModule("MyModule")
+-- MyModule:Enable()
+--
+-- -- Enable MyModule using the short-hand
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyAddon:EnableModule("MyModule")
+function EnableModule(self, name)
+ local module = self:GetModule( name )
+ return module:Enable()
+end
+
+--- Disables the Module, if possible, return true or false depending on success.
+-- Short-hand function that retrieves the module via `:GetModule` and calls `:Disable` on the module object.
+-- @name //addon//:DisableModule
+-- @paramsig name
+-- @usage
+-- -- Disable MyModule using :GetModule
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyModule = MyAddon:GetModule("MyModule")
+-- MyModule:Disable()
+--
+-- -- Disable MyModule using the short-hand
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyAddon:DisableModule("MyModule")
+function DisableModule(self, name)
+ local module = self:GetModule( name )
+ return module:Disable()
+end
+
+--- Set the default libraries to be mixed into all modules created by this object.
+-- Note that you can only change the default module libraries before any module is created.
+-- @name //addon//:SetDefaultModuleLibraries
+-- @paramsig lib[, lib, ...]
+-- @param lib List of libraries to embed into the addon
+-- @usage
+-- -- Create the addon object
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
+-- -- Configure default libraries for modules (all modules need AceEvent-3.0)
+-- MyAddon:SetDefaultModuleLibraries("AceEvent-3.0")
+-- -- Create a module
+-- MyModule = MyAddon:NewModule("MyModule")
+function SetDefaultModuleLibraries(self, ...)
+ if next(self.modules) then
+ error("Usage: SetDefaultModuleLibraries(...): cannot change the module defaults after a module has been registered.", 2)
+ end
+ self.defaultModuleLibraries = {...}
+end
+
+--- Set the default state in which new modules are being created.
+-- Note that you can only change the default state before any module is created.
+-- @name //addon//:SetDefaultModuleState
+-- @paramsig state
+-- @param state Default state for new modules, true for enabled, false for disabled
+-- @usage
+-- -- Create the addon object
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
+-- -- Set the default state to "disabled"
+-- MyAddon:SetDefaultModuleState(false)
+-- -- Create a module and explicilty enable it
+-- MyModule = MyAddon:NewModule("MyModule")
+-- MyModule:Enable()
+function SetDefaultModuleState(self, state)
+ if next(self.modules) then
+ error("Usage: SetDefaultModuleState(state): cannot change the module defaults after a module has been registered.", 2)
+ end
+ self.defaultModuleState = state
+end
+
+--- Set the default prototype to use for new modules on creation.
+-- Note that you can only change the default prototype before any module is created.
+-- @name //addon//:SetDefaultModulePrototype
+-- @paramsig prototype
+-- @param prototype Default prototype for the new modules (table)
+-- @usage
+-- -- Define a prototype
+-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
+-- -- Set the default prototype
+-- MyAddon:SetDefaultModulePrototype(prototype)
+-- -- Create a module and explicitly Enable it
+-- MyModule = MyAddon:NewModule("MyModule")
+-- MyModule:Enable()
+-- -- should print "OnEnable called!" now
+-- @see NewModule
+function SetDefaultModulePrototype(self, prototype)
+ if next(self.modules) then
+ error("Usage: SetDefaultModulePrototype(prototype): cannot change the module defaults after a module has been registered.", 2)
+ end
+ if type(prototype) ~= "table" then
+ error(("Usage: SetDefaultModulePrototype(prototype): 'prototype' - table expected got '%s'."):format(type(prototype)), 2)
+ end
+ self.defaultModulePrototype = prototype
+end
+
+--- Set the state of an addon or module
+-- This should only be called before any enabling actually happend, e.g. in/before OnInitialize.
+-- @name //addon//:SetEnabledState
+-- @paramsig state
+-- @param state the state of an addon or module (enabled=true, disabled=false)
+function SetEnabledState(self, state)
+ self.enabledState = state
+end
+
+
+--- Return an iterator of all modules associated to the addon.
+-- @name //addon//:IterateModules
+-- @paramsig
+-- @usage
+-- -- Enable all modules
+-- for name, module in MyAddon:IterateModules() do
+-- module:Enable()
+-- end
+local function IterateModules(self) return pairs(self.modules) end
+
+-- Returns an iterator of all embeds in the addon
+-- @name //addon//:IterateEmbeds
+-- @paramsig
+local function IterateEmbeds(self) return pairs(AceAddon.embeds[self]) end
+
+--- Query the enabledState of an addon.
+-- @name //addon//:IsEnabled
+-- @paramsig
+-- @usage
+-- if MyAddon:IsEnabled() then
+-- MyAddon:Disable()
+-- end
+local function IsEnabled(self) return self.enabledState end
+local mixins = {
+ NewModule = NewModule,
+ GetModule = GetModule,
+ Enable = Enable,
+ Disable = Disable,
+ EnableModule = EnableModule,
+ DisableModule = DisableModule,
+ IsEnabled = IsEnabled,
+ SetDefaultModuleLibraries = SetDefaultModuleLibraries,
+ SetDefaultModuleState = SetDefaultModuleState,
+ SetDefaultModulePrototype = SetDefaultModulePrototype,
+ SetEnabledState = SetEnabledState,
+ IterateModules = IterateModules,
+ IterateEmbeds = IterateEmbeds,
+ GetName = GetName,
+}
+local function IsModule(self) return false end
+local pmixins = {
+ defaultModuleState = true,
+ enabledState = true,
+ IsModule = IsModule,
+}
+-- Embed( target )
+-- target (object) - target object to embed aceaddon in
+--
+-- this is a local function specifically since it's meant to be only called internally
+function Embed(target)
+ for k, v in pairs(mixins) do
+ target[k] = v
+ end
+ for k, v in pairs(pmixins) do
+ target[k] = target[k] or v
+ end
+end
+
+
+-- - Initialize the addon after creation.
+-- This function is only used internally during the ADDON_LOADED event
+-- It will call the **OnInitialize** function on the addon object (if present),
+-- and the **OnEmbedInitialize** function on all embeded libraries.
+--
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
+-- @param addon addon object to intialize
+function AceAddon:InitializeAddon(addon)
+ safecall(addon.OnInitialize, addon)
+
+ local embeds = self.embeds[addon]
+ for i = 1, #embeds do
+ local lib = LibStub:GetLibrary(embeds[i], true)
+ if lib then safecall(lib.OnEmbedInitialize, lib, addon) end
+ end
+
+ -- we don't call InitializeAddon on modules specifically, this is handled
+ -- from the event handler and only done _once_
+end
+
+-- - Enable the addon after creation.
+-- Note: This function is only used internally during the PLAYER_LOGIN event, or during ADDON_LOADED,
+-- if IsLoggedIn() already returns true at that point, e.g. for LoD Addons.
+-- It will call the **OnEnable** function on the addon object (if present),
+-- and the **OnEmbedEnable** function on all embeded libraries.\\
+-- This function does not toggle the enable state of the addon itself, and will return early if the addon is disabled.
+--
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
+-- Use :Enable on the addon itself instead.
+-- @param addon addon object to enable
+function AceAddon:EnableAddon(addon)
+ if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
+ if self.statuses[addon.name] or not addon.enabledState then return false end
+
+ -- set the statuses first, before calling the OnEnable. this allows for Disabling of the addon in OnEnable.
+ self.statuses[addon.name] = true
+
+ safecall(addon.OnEnable, addon)
+
+ -- make sure we're still enabled before continueing
+ if self.statuses[addon.name] then
+ local embeds = self.embeds[addon]
+ for i = 1, #embeds do
+ local lib = LibStub:GetLibrary(embeds[i], true)
+ if lib then safecall(lib.OnEmbedEnable, lib, addon) end
+ end
+
+ -- enable possible modules.
+ for name, module in pairs(addon.modules) do
+ self:EnableAddon(module)
+ end
+ end
+ return self.statuses[addon.name] -- return true if we're disabled
+end
+
+-- - Disable the addon
+-- Note: This function is only used internally.
+-- It will call the **OnDisable** function on the addon object (if present),
+-- and the **OnEmbedDisable** function on all embeded libraries.\\
+-- This function does not toggle the enable state of the addon itself, and will return early if the addon is still enabled.
+--
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
+-- Use :Disable on the addon itself instead.
+-- @param addon addon object to enable
+function AceAddon:DisableAddon(addon)
+ if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
+ if not self.statuses[addon.name] then return false end
+
+ -- set statuses first before calling OnDisable, this allows for aborting the disable in OnDisable.
+ self.statuses[addon.name] = false
+
+ safecall( addon.OnDisable, addon )
+
+ -- make sure we're still disabling...
+ if not self.statuses[addon.name] then
+ local embeds = self.embeds[addon]
+ for i = 1, #embeds do
+ local lib = LibStub:GetLibrary(embeds[i], true)
+ if lib then safecall(lib.OnEmbedDisable, lib, addon) end
+ end
+ -- disable possible modules.
+ for name, module in pairs(addon.modules) do
+ self:DisableAddon(module)
+ end
+ end
+
+ return not self.statuses[addon.name] -- return true if we're disabled
+end
+
+--- Get an iterator over all registered addons.
+-- @usage
+-- -- Print a list of all installed AceAddon's
+-- for name, addon in AceAddon:IterateAddons() do
+-- print("Addon: " .. name)
+-- end
+function AceAddon:IterateAddons() return pairs(self.addons) end
+
+--- Get an iterator over the internal status registry.
+-- @usage
+-- -- Print a list of all enabled addons
+-- for name, status in AceAddon:IterateAddonStatus() do
+-- if status then
+-- print("EnabledAddon: " .. name)
+-- end
+-- end
+function AceAddon:IterateAddonStatus() return pairs(self.statuses) end
+
+-- Following Iterators are deprecated, and their addon specific versions should be used
+-- e.g. addon:IterateEmbeds() instead of :IterateEmbedsOnAddon(addon)
+function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end
+function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end
+
+-- Event Handling
+local function onEvent(this, event, arg1)
+ if event == "ADDON_LOADED" or event == "PLAYER_LOGIN" then
+ -- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration
+ while(#AceAddon.initializequeue > 0) do
+ local addon = tremove(AceAddon.initializequeue, 1)
+ -- this might be an issue with recursion - TODO: validate
+ if event == "ADDON_LOADED" then addon.baseName = arg1 end
+ AceAddon:InitializeAddon(addon)
+ tinsert(AceAddon.enablequeue, addon)
+ end
+
+ if IsLoggedIn() then
+ while(#AceAddon.enablequeue > 0) do
+ local addon = tremove(AceAddon.enablequeue, 1)
+ AceAddon:EnableAddon(addon)
+ end
+ end
+ end
+end
+
+AceAddon.frame:RegisterEvent("ADDON_LOADED")
+AceAddon.frame:RegisterEvent("PLAYER_LOGIN")
+AceAddon.frame:SetScript("OnEvent", onEvent)
+
+-- upgrade embeded
+for name, addon in pairs(AceAddon.addons) do
+ Embed(addon)
+end
diff --git a/AtlasLoot/Libs/AceAddon-3.0/AceAddon-3.0.xml b/AtlasLoot/Libs/AceAddon-3.0/AceAddon-3.0.xml
new file mode 100644
index 0000000..17c568c
--- /dev/null
+++ b/AtlasLoot/Libs/AceAddon-3.0/AceAddon-3.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/AtlasLoot/Libs/AceComm-3.0/AceComm-3.0.lua b/AtlasLoot/Libs/AceComm-3.0/AceComm-3.0.lua
new file mode 100644
index 0000000..74f7f63
--- /dev/null
+++ b/AtlasLoot/Libs/AceComm-3.0/AceComm-3.0.lua
@@ -0,0 +1,309 @@
+--- **AceComm-3.0** allows you to send messages of unlimited length over the addon comm channels.
+-- It'll automatically split the messages into multiple parts and rebuild them on the receiving end.\\
+-- **ChatThrottleLib** is of course being used to avoid being disconnected by the server.
+--
+-- **AceComm-3.0** can be embeded into your addon, either explicitly by calling AceComm:Embed(MyAddon) or by
+-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
+-- and can be accessed directly, without having to explicitly call AceComm itself.\\
+-- It is recommended to embed AceComm, otherwise you'll have to specify a custom `self` on all calls you
+-- make into AceComm.
+-- @class file
+-- @name AceComm-3.0
+-- @release $Id: AceComm-3.0.lua 895 2009-12-06 16:28:55Z nevcairiel $
+
+--[[ AceComm-3.0
+
+TODO: Time out old data rotting around from dead senders? Not a HUGE deal since the number of possible sender names is somewhat limited.
+
+]]
+
+local MAJOR, MINOR = "AceComm-3.0", 6
+
+local AceComm,oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not AceComm then return end
+
+local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
+local CTL = assert(ChatThrottleLib, "AceComm-3.0 requires ChatThrottleLib")
+
+-- Lua APIs
+local type, next, pairs, tostring = type, next, pairs, tostring
+local strsub, strfind = string.sub, string.find
+local tinsert, tconcat = table.insert, table.concat
+local error, assert = error, assert
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: LibStub, DEFAULT_CHAT_FRAME, geterrorhandler
+
+AceComm.embeds = AceComm.embeds or {}
+
+-- for my sanity and yours, let's give the message type bytes some names
+local MSG_MULTI_FIRST = "\001"
+local MSG_MULTI_NEXT = "\002"
+local MSG_MULTI_LAST = "\003"
+
+AceComm.multipart_origprefixes = AceComm.multipart_origprefixes or {} -- e.g. "Prefix\001"="Prefix", "Prefix\002"="Prefix"
+AceComm.multipart_reassemblers = AceComm.multipart_reassemblers or {} -- e.g. "Prefix\001"="OnReceiveMultipartFirst"
+
+-- the multipart message spool: indexed by a combination of sender+distribution+
+AceComm.multipart_spool = AceComm.multipart_spool or {}
+
+--- Register for Addon Traffic on a specified prefix
+-- @param prefix A printable character (\032-\255) classification of the message (typically AddonName or AddonNameEvent)
+-- @param method Callback to call on message reception: Function reference, or method name (string) to call on self. Defaults to "OnCommReceived"
+function AceComm:RegisterComm(prefix, method)
+ if method == nil then
+ method = "OnCommReceived"
+ end
+
+ return AceComm._RegisterComm(self, prefix, method) -- created by CallbackHandler
+end
+
+local warnedPrefix=false
+
+--- Send a message over the Addon Channel
+-- @param prefix A printable character (\032-\255) classification of the message (typically AddonName or AddonNameEvent)
+-- @param text Data to send, nils (\000) not allowed. Any length.
+-- @param distribution Addon channel, e.g. "RAID", "GUILD", etc; see SendAddonMessage API
+-- @param target Destination for some distributions; see SendAddonMessage API
+-- @param prio OPTIONAL: ChatThrottleLib priority, "BULK", "NORMAL" or "ALERT". Defaults to "NORMAL".
+-- @param callbackFn OPTIONAL: callback function to be called as each chunk is sent. receives 3 args: the user supplied arg (see next), the number of bytes sent so far, and the number of bytes total to send.
+-- @param callbackArg: OPTIONAL: first arg to the callback function. nil will be passed if not specified.
+function AceComm:SendCommMessage(prefix, text, distribution, target, prio, callbackFn, callbackArg)
+ prio = prio or "NORMAL" -- pasta's reference implementation had different prio for singlepart and multipart, but that's a very bad idea since that can easily lead to out-of-sequence delivery!
+ if not( type(prefix)=="string" and
+ type(text)=="string" and
+ type(distribution)=="string" and
+ (target==nil or type(target)=="string") and
+ (prio=="BULK" or prio=="NORMAL" or prio=="ALERT")
+ ) then
+ error('Usage: SendCommMessage(addon, "prefix", "text", "distribution"[, "target"[, "prio"[, callbackFn, callbackarg]]])', 2)
+ end
+
+ if strfind(prefix, "[\001-\009]") then
+ if strfind(prefix, "[\001-\003]") then
+ error("SendCommMessage: Characters \\001--\\003 in prefix are reserved for AceComm metadata", 2)
+ elseif not warnedPrefix then
+ -- I have some ideas about future extensions that require more control characters /mikk, 20090808
+ geterrorhandler()("SendCommMessage: Heads-up developers: Characters \\004--\\009 in prefix are reserved for AceComm future extension")
+ warnedPrefix = true
+ end
+ end
+
+
+ local textlen = #text
+ local maxtextlen = 254 - #prefix -- 254 is the max length of prefix + text that can be sent in one message
+ local queueName = prefix..distribution..(target or "")
+
+ local ctlCallback = nil
+ if callbackFn then
+ ctlCallback = function(sent)
+ return callbackFn(callbackArg, sent, textlen)
+ end
+ end
+
+ if textlen <= maxtextlen then
+ -- fits all in one message
+ CTL:SendAddonMessage(prio, prefix, text, distribution, target, queueName, ctlCallback, textlen)
+ else
+ maxtextlen = maxtextlen - 1 -- 1 extra byte for part indicator in prefix
+
+ -- first part
+ local chunk = strsub(text, 1, maxtextlen)
+ CTL:SendAddonMessage(prio, prefix..MSG_MULTI_FIRST, chunk, distribution, target, queueName, ctlCallback, maxtextlen)
+
+ -- continuation
+ local pos = 1+maxtextlen
+ local prefix2 = prefix..MSG_MULTI_NEXT
+
+ while pos+maxtextlen <= textlen do
+ chunk = strsub(text, pos, pos+maxtextlen-1)
+ CTL:SendAddonMessage(prio, prefix2, chunk, distribution, target, queueName, ctlCallback, pos+maxtextlen-1)
+ pos = pos + maxtextlen
+ end
+
+ -- final part
+ chunk = strsub(text, pos)
+ CTL:SendAddonMessage(prio, prefix..MSG_MULTI_LAST, chunk, distribution, target, queueName, ctlCallback, textlen)
+ end
+end
+
+
+----------------------------------------
+-- Message receiving
+----------------------------------------
+
+do
+ local compost = setmetatable({}, {__mode = "k"})
+ local function new()
+ local t = next(compost)
+ if t then
+ compost[t]=nil
+ for i=#t,3,-1 do -- faster than pairs loop. don't even nil out 1/2 since they'll be overwritten
+ t[i]=nil
+ end
+ return t
+ end
+
+ return {}
+ end
+
+ local function lostdatawarning(prefix,sender,where)
+ DEFAULT_CHAT_FRAME:AddMessage(MAJOR..": Warning: lost network data regarding '"..tostring(prefix).."' from '"..tostring(sender).."' (in "..where..")")
+ end
+
+ function AceComm:OnReceiveMultipartFirst(prefix, message, distribution, sender)
+ local key = prefix.."\t"..distribution.."\t"..sender -- a unique stream is defined by the prefix + distribution + sender
+ local spool = AceComm.multipart_spool
+
+ --[[
+ if spool[key] then
+ lostdatawarning(prefix,sender,"First")
+ -- continue and overwrite
+ end
+ --]]
+
+ spool[key] = message -- plain string for now
+ end
+
+ function AceComm:OnReceiveMultipartNext(prefix, message, distribution, sender)
+ local key = prefix.."\t"..distribution.."\t"..sender -- a unique stream is defined by the prefix + distribution + sender
+ local spool = AceComm.multipart_spool
+ local olddata = spool[key]
+
+ if not olddata then
+ --lostdatawarning(prefix,sender,"Next")
+ return
+ end
+
+ if type(olddata)~="table" then
+ -- ... but what we have is not a table. So make it one. (Pull a composted one if available)
+ local t = new()
+ t[1] = olddata -- add old data as first string
+ t[2] = message -- and new message as second string
+ spool[key] = t -- and put the table in the spool instead of the old string
+ else
+ tinsert(olddata, message)
+ end
+ end
+
+ function AceComm:OnReceiveMultipartLast(prefix, message, distribution, sender)
+ local key = prefix.."\t"..distribution.."\t"..sender -- a unique stream is defined by the prefix + distribution + sender
+ local spool = AceComm.multipart_spool
+ local olddata = spool[key]
+
+ if not olddata then
+ --lostdatawarning(prefix,sender,"End")
+ return
+ end
+
+ spool[key] = nil
+
+ if type(olddata) == "table" then
+ -- if we've received a "next", the spooled data will be a table for rapid & garbage-free tconcat
+ tinsert(olddata, message)
+ AceComm.callbacks:Fire(prefix, tconcat(olddata, ""), distribution, sender)
+ compost[olddata] = true
+ else
+ -- if we've only received a "first", the spooled data will still only be a string
+ AceComm.callbacks:Fire(prefix, olddata..message, distribution, sender)
+ end
+ end
+end
+
+
+
+
+
+
+----------------------------------------
+-- Embed CallbackHandler
+----------------------------------------
+
+if not AceComm.callbacks then
+ -- ensure that 'prefix to watch' table is consistent with registered
+ -- callbacks
+ AceComm.__prefixes = {}
+
+ AceComm.callbacks = CallbackHandler:New(AceComm,
+ "_RegisterComm",
+ "UnregisterComm",
+ "UnregisterAllComm")
+end
+
+function AceComm.callbacks:OnUsed(target, prefix)
+ AceComm.multipart_origprefixes[prefix..MSG_MULTI_FIRST] = prefix
+ AceComm.multipart_reassemblers[prefix..MSG_MULTI_FIRST] = "OnReceiveMultipartFirst"
+
+ AceComm.multipart_origprefixes[prefix..MSG_MULTI_NEXT] = prefix
+ AceComm.multipart_reassemblers[prefix..MSG_MULTI_NEXT] = "OnReceiveMultipartNext"
+
+ AceComm.multipart_origprefixes[prefix..MSG_MULTI_LAST] = prefix
+ AceComm.multipart_reassemblers[prefix..MSG_MULTI_LAST] = "OnReceiveMultipartLast"
+end
+
+function AceComm.callbacks:OnUnused(target, prefix)
+ AceComm.multipart_origprefixes[prefix..MSG_MULTI_FIRST] = nil
+ AceComm.multipart_reassemblers[prefix..MSG_MULTI_FIRST] = nil
+
+ AceComm.multipart_origprefixes[prefix..MSG_MULTI_NEXT] = nil
+ AceComm.multipart_reassemblers[prefix..MSG_MULTI_NEXT] = nil
+
+ AceComm.multipart_origprefixes[prefix..MSG_MULTI_LAST] = nil
+ AceComm.multipart_reassemblers[prefix..MSG_MULTI_LAST] = nil
+end
+
+local function OnEvent(this, event, ...)
+ if event == "CHAT_MSG_ADDON" then
+ local prefix,message,distribution,sender = ...
+ local reassemblername = AceComm.multipart_reassemblers[prefix]
+ if reassemblername then
+ -- multipart: reassemble
+ local aceCommReassemblerFunc = AceComm[reassemblername]
+ local origprefix = AceComm.multipart_origprefixes[prefix]
+ aceCommReassemblerFunc(AceComm, origprefix, message, distribution, sender)
+ else
+ -- single part: fire it off immediately and let CallbackHandler decide if it's registered or not
+ AceComm.callbacks:Fire(prefix, message, distribution, sender)
+ end
+ else
+ assert(false, "Received "..tostring(event).." event?!")
+ end
+end
+
+AceComm.frame = AceComm.frame or CreateFrame("Frame", "AceComm30Frame")
+AceComm.frame:SetScript("OnEvent", OnEvent)
+AceComm.frame:UnregisterAllEvents()
+AceComm.frame:RegisterEvent("CHAT_MSG_ADDON")
+
+
+----------------------------------------
+-- Base library stuff
+----------------------------------------
+
+local mixins = {
+ "RegisterComm",
+ "UnregisterComm",
+ "UnregisterAllComm",
+ "SendCommMessage",
+}
+
+-- Embeds AceComm-3.0 into the target object making the functions from the mixins list available on target:..
+-- @param target target object to embed AceComm-3.0 in
+function AceComm:Embed(target)
+ for k, v in pairs(mixins) do
+ target[v] = self[v]
+ end
+ self.embeds[target] = true
+ return target
+end
+
+function AceComm:OnEmbedDisable(target)
+ target:UnregisterAllComm()
+end
+
+-- Update embeds
+for target, v in pairs(AceComm.embeds) do
+ AceComm:Embed(target)
+end
diff --git a/AtlasLoot/Libs/AceComm-3.0/AceComm-3.0.xml b/AtlasLoot/Libs/AceComm-3.0/AceComm-3.0.xml
new file mode 100644
index 0000000..c2e1bdf
--- /dev/null
+++ b/AtlasLoot/Libs/AceComm-3.0/AceComm-3.0.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/AtlasLoot/Libs/AceComm-3.0/ChatThrottleLib.lua b/AtlasLoot/Libs/AceComm-3.0/ChatThrottleLib.lua
new file mode 100644
index 0000000..ab1b0c1
--- /dev/null
+++ b/AtlasLoot/Libs/AceComm-3.0/ChatThrottleLib.lua
@@ -0,0 +1,503 @@
+--
+-- ChatThrottleLib by Mikk
+--
+-- Manages AddOn chat output to keep player from getting kicked off.
+--
+-- ChatThrottleLib:SendChatMessage/:SendAddonMessage functions that accept
+-- a Priority ("BULK", "NORMAL", "ALERT") as well as prefix for SendChatMessage.
+--
+-- Priorities get an equal share of available bandwidth when fully loaded.
+-- Communication channels are separated on extension+chattype+destination and
+-- get round-robinned. (Destination only matters for whispers and channels,
+-- obviously)
+--
+-- Will install hooks for SendChatMessage and SendAddonMessage to measure
+-- bandwidth bypassing the library and use less bandwidth itself.
+--
+--
+-- Fully embeddable library. Just copy this file into your addon directory,
+-- add it to the .toc, and it's done.
+--
+-- Can run as a standalone addon also, but, really, just embed it! :-)
+--
+
+local CTL_VERSION = 21
+
+local _G = _G
+
+if _G.ChatThrottleLib then
+ if _G.ChatThrottleLib.version >= CTL_VERSION then
+ -- There's already a newer (or same) version loaded. Buh-bye.
+ return
+ elseif not _G.ChatThrottleLib.securelyHooked then
+ print("ChatThrottleLib: Warning: There's an ANCIENT ChatThrottleLib.lua (pre-wow 2.0, =v16) in it!")
+ -- ATTEMPT to unhook; this'll behave badly if someone else has hooked...
+ -- ... and if someone has securehooked, they can kiss that goodbye too... >.<
+ _G.SendChatMessage = _G.ChatThrottleLib.ORIG_SendChatMessage
+ if _G.ChatThrottleLib.ORIG_SendAddonMessage then
+ _G.SendAddonMessage = _G.ChatThrottleLib.ORIG_SendAddonMessage
+ end
+ end
+ _G.ChatThrottleLib.ORIG_SendChatMessage = nil
+ _G.ChatThrottleLib.ORIG_SendAddonMessage = nil
+end
+
+if not _G.ChatThrottleLib then
+ _G.ChatThrottleLib = {}
+end
+
+ChatThrottleLib = _G.ChatThrottleLib -- in case some addon does "local ChatThrottleLib" above us and we're copypasted (AceComm-2, sigh)
+local ChatThrottleLib = _G.ChatThrottleLib
+
+ChatThrottleLib.version = CTL_VERSION
+
+
+
+------------------ TWEAKABLES -----------------
+
+ChatThrottleLib.MAX_CPS = 800 -- 2000 seems to be safe if NOTHING ELSE is happening. let's call it 800.
+ChatThrottleLib.MSG_OVERHEAD = 40 -- Guesstimate overhead for sending a message; source+dest+chattype+protocolstuff
+
+ChatThrottleLib.BURST = 4000 -- WoW's server buffer seems to be about 32KB. 8KB should be safe, but seen disconnects on _some_ servers. Using 4KB now.
+
+ChatThrottleLib.MIN_FPS = 20 -- Reduce output CPS to half (and don't burst) if FPS drops below this value
+
+
+local setmetatable = setmetatable
+local table_remove = table.remove
+local tostring = tostring
+local GetTime = GetTime
+local math_min = math.min
+local math_max = math.max
+local next = next
+local strlen = string.len
+local GetFrameRate = GetFrameRate
+
+
+
+-----------------------------------------------------------------------
+-- Double-linked ring implementation
+
+local Ring = {}
+local RingMeta = { __index = Ring }
+
+function Ring:New()
+ local ret = {}
+ setmetatable(ret, RingMeta)
+ return ret
+end
+
+function Ring:Add(obj) -- Append at the "far end" of the ring (aka just before the current position)
+ if self.pos then
+ obj.prev = self.pos.prev
+ obj.prev.next = obj
+ obj.next = self.pos
+ obj.next.prev = obj
+ else
+ obj.next = obj
+ obj.prev = obj
+ self.pos = obj
+ end
+end
+
+function Ring:Remove(obj)
+ obj.next.prev = obj.prev
+ obj.prev.next = obj.next
+ if self.pos == obj then
+ self.pos = obj.next
+ if self.pos == obj then
+ self.pos = nil
+ end
+ end
+end
+
+
+
+-----------------------------------------------------------------------
+-- Recycling bin for pipes
+-- A pipe is a plain integer-indexed queue, which also happens to be a ring member
+
+ChatThrottleLib.PipeBin = nil -- pre-v19, drastically different
+local PipeBin = setmetatable({}, {__mode="k"})
+
+local function DelPipe(pipe)
+ for i = #pipe, 1, -1 do
+ pipe[i] = nil
+ end
+ pipe.prev = nil
+ pipe.next = nil
+
+ PipeBin[pipe] = true
+end
+
+local function NewPipe()
+ local pipe = next(PipeBin)
+ if pipe then
+ PipeBin[pipe] = nil
+ return pipe
+ end
+ return {}
+end
+
+
+
+
+-----------------------------------------------------------------------
+-- Recycling bin for messages
+
+ChatThrottleLib.MsgBin = nil -- pre-v19, drastically different
+local MsgBin = setmetatable({}, {__mode="k"})
+
+local function DelMsg(msg)
+ msg[1] = nil
+ -- there's more parameters, but they're very repetetive so the string pool doesn't suffer really, and it's faster to just not delete them.
+ MsgBin[msg] = true
+end
+
+local function NewMsg()
+ local msg = next(MsgBin)
+ if msg then
+ MsgBin[msg] = nil
+ return msg
+ end
+ return {}
+end
+
+
+-----------------------------------------------------------------------
+-- ChatThrottleLib:Init
+-- Initialize queues, set up frame for OnUpdate, etc
+
+
+function ChatThrottleLib:Init()
+
+ -- Set up queues
+ if not self.Prio then
+ self.Prio = {}
+ self.Prio["ALERT"] = { ByName = {}, Ring = Ring:New(), avail = 0 }
+ self.Prio["NORMAL"] = { ByName = {}, Ring = Ring:New(), avail = 0 }
+ self.Prio["BULK"] = { ByName = {}, Ring = Ring:New(), avail = 0 }
+ end
+
+ -- v4: total send counters per priority
+ for _, Prio in pairs(self.Prio) do
+ Prio.nTotalSent = Prio.nTotalSent or 0
+ end
+
+ if not self.avail then
+ self.avail = 0 -- v5
+ end
+ if not self.nTotalSent then
+ self.nTotalSent = 0 -- v5
+ end
+
+
+ -- Set up a frame to get OnUpdate events
+ if not self.Frame then
+ self.Frame = CreateFrame("Frame")
+ self.Frame:Hide()
+ end
+ self.Frame:SetScript("OnUpdate", self.OnUpdate)
+ self.Frame:SetScript("OnEvent", self.OnEvent) -- v11: Monitor P_E_W so we can throttle hard for a few seconds
+ self.Frame:RegisterEvent("PLAYER_ENTERING_WORLD")
+ self.OnUpdateDelay = 0
+ self.LastAvailUpdate = GetTime()
+ self.HardThrottlingBeginTime = GetTime() -- v11: Throttle hard for a few seconds after startup
+
+ -- Hook SendChatMessage and SendAddonMessage so we can measure unpiped traffic and avoid overloads (v7)
+ if not self.securelyHooked then
+ -- Use secure hooks as of v16. Old regular hook support yanked out in v21.
+ self.securelyHooked = true
+ --SendChatMessage
+ hooksecurefunc("SendChatMessage", function(...)
+ return ChatThrottleLib.Hook_SendChatMessage(...)
+ end)
+ --SendAddonMessage
+ hooksecurefunc("SendAddonMessage", function(...)
+ return ChatThrottleLib.Hook_SendAddonMessage(...)
+ end)
+ end
+ self.nBypass = 0
+end
+
+
+-----------------------------------------------------------------------
+-- ChatThrottleLib.Hook_SendChatMessage / .Hook_SendAddonMessage
+
+local bMyTraffic = false
+
+function ChatThrottleLib.Hook_SendChatMessage(text, chattype, language, destination, ...)
+ if bMyTraffic then
+ return
+ end
+ local self = ChatThrottleLib
+ local size = strlen(tostring(text or "")) + strlen(tostring(destination or "")) + self.MSG_OVERHEAD
+ self.avail = self.avail - size
+ self.nBypass = self.nBypass + size -- just a statistic
+end
+function ChatThrottleLib.Hook_SendAddonMessage(prefix, text, chattype, destination, ...)
+ if bMyTraffic then
+ return
+ end
+ local self = ChatThrottleLib
+ local size = tostring(text or ""):len() + tostring(prefix or ""):len();
+ size = size + tostring(destination or ""):len() + self.MSG_OVERHEAD
+ self.avail = self.avail - size
+ self.nBypass = self.nBypass + size -- just a statistic
+end
+
+
+
+-----------------------------------------------------------------------
+-- ChatThrottleLib:UpdateAvail
+-- Update self.avail with how much bandwidth is currently available
+
+function ChatThrottleLib:UpdateAvail()
+ local now = GetTime()
+ local MAX_CPS = self.MAX_CPS;
+ local newavail = MAX_CPS * (now - self.LastAvailUpdate)
+ local avail = self.avail
+
+ if now - self.HardThrottlingBeginTime < 5 then
+ -- First 5 seconds after startup/zoning: VERY hard clamping to avoid irritating the server rate limiter, it seems very cranky then
+ avail = math_min(avail + (newavail*0.1), MAX_CPS*0.5)
+ self.bChoking = true
+ elseif GetFramerate() < self.MIN_FPS then -- GetFrameRate call takes ~0.002 secs
+ avail = math_min(MAX_CPS, avail + newavail*0.5)
+ self.bChoking = true -- just a statistic
+ else
+ avail = math_min(self.BURST, avail + newavail)
+ self.bChoking = false
+ end
+
+ avail = math_max(avail, 0-(MAX_CPS*2)) -- Can go negative when someone is eating bandwidth past the lib. but we refuse to stay silent for more than 2 seconds; if they can do it, we can.
+
+ self.avail = avail
+ self.LastAvailUpdate = now
+
+ return avail
+end
+
+
+-----------------------------------------------------------------------
+-- Despooling logic
+
+function ChatThrottleLib:Despool(Prio)
+ local ring = Prio.Ring
+ while ring.pos and Prio.avail > ring.pos[1].nSize do
+ local msg = table_remove(Prio.Ring.pos, 1)
+ if not Prio.Ring.pos[1] then
+ local pipe = Prio.Ring.pos
+ Prio.Ring:Remove(pipe)
+ Prio.ByName[pipe.name] = nil
+ DelPipe(pipe)
+ else
+ Prio.Ring.pos = Prio.Ring.pos.next
+ end
+ Prio.avail = Prio.avail - msg.nSize
+ bMyTraffic = true
+ msg.f(unpack(msg, 1, msg.n))
+ bMyTraffic = false
+ Prio.nTotalSent = Prio.nTotalSent + msg.nSize
+ DelMsg(msg)
+ if msg.callbackFn then
+ msg.callbackFn (msg.callbackArg)
+ end
+ end
+end
+
+
+function ChatThrottleLib.OnEvent(this,event)
+ -- v11: We know that the rate limiter is touchy after login. Assume that it's touchy after zoning, too.
+ local self = ChatThrottleLib
+ if event == "PLAYER_ENTERING_WORLD" then
+ self.HardThrottlingBeginTime = GetTime() -- Throttle hard for a few seconds after zoning
+ self.avail = 0
+ end
+end
+
+
+function ChatThrottleLib.OnUpdate(this,delay)
+ local self = ChatThrottleLib
+
+ self.OnUpdateDelay = self.OnUpdateDelay + delay
+ if self.OnUpdateDelay < 0.08 then
+ return
+ end
+ self.OnUpdateDelay = 0
+
+ self:UpdateAvail()
+
+ if self.avail < 0 then
+ return -- argh. some bastard is spewing stuff past the lib. just bail early to save cpu.
+ end
+
+ -- See how many of our priorities have queued messages (we only have 3, don't worry about the loop)
+ local n = 0
+ for prioname,Prio in pairs(self.Prio) do
+ if Prio.Ring.pos or Prio.avail < 0 then
+ n = n + 1
+ end
+ end
+
+ -- Anything queued still?
+ if n<1 then
+ -- Nope. Move spillover bandwidth to global availability gauge and clear self.bQueueing
+ for prioname, Prio in pairs(self.Prio) do
+ self.avail = self.avail + Prio.avail
+ Prio.avail = 0
+ end
+ self.bQueueing = false
+ self.Frame:Hide()
+ return
+ end
+
+ -- There's stuff queued. Hand out available bandwidth to priorities as needed and despool their queues
+ local avail = self.avail/n
+ self.avail = 0
+
+ for prioname, Prio in pairs(self.Prio) do
+ if Prio.Ring.pos or Prio.avail < 0 then
+ Prio.avail = Prio.avail + avail
+ if Prio.Ring.pos and Prio.avail > Prio.Ring.pos[1].nSize then
+ self:Despool(Prio)
+ -- Note: We might not get here if the user-supplied callback function errors out! Take care!
+ end
+ end
+ end
+
+end
+
+
+
+
+-----------------------------------------------------------------------
+-- Spooling logic
+
+
+function ChatThrottleLib:Enqueue(prioname, pipename, msg)
+ local Prio = self.Prio[prioname]
+ local pipe = Prio.ByName[pipename]
+ if not pipe then
+ self.Frame:Show()
+ pipe = NewPipe()
+ pipe.name = pipename
+ Prio.ByName[pipename] = pipe
+ Prio.Ring:Add(pipe)
+ end
+
+ pipe[#pipe + 1] = msg
+
+ self.bQueueing = true
+end
+
+
+
+function ChatThrottleLib:SendChatMessage(prio, prefix, text, chattype, language, destination, queueName, callbackFn, callbackArg)
+ if not self or not prio or not prefix or not text or not self.Prio[prio] then
+ error('Usage: ChatThrottleLib:SendChatMessage("{BULK||NORMAL||ALERT}", "prefix", "text"[, "chattype"[, "language"[, "destination"]]]', 2)
+ end
+ if callbackFn and type(callbackFn)~="function" then
+ error('ChatThrottleLib:ChatMessage(): callbackFn: expected function, got '..type(callbackFn), 2)
+ end
+
+ local nSize = text:len()
+
+ if nSize>255 then
+ error("ChatThrottleLib:SendChatMessage(): message length cannot exceed 255 bytes", 2)
+ end
+
+ nSize = nSize + self.MSG_OVERHEAD
+
+ -- Check if there's room in the global available bandwidth gauge to send directly
+ if not self.bQueueing and nSize < self:UpdateAvail() then
+ self.avail = self.avail - nSize
+ bMyTraffic = true
+ _G.SendChatMessage(text, chattype, language, destination)
+ bMyTraffic = false
+ self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize
+ if callbackFn then
+ callbackFn (callbackArg)
+ end
+ return
+ end
+
+ -- Message needs to be queued
+ local msg = NewMsg()
+ msg.f = _G.SendChatMessage
+ msg[1] = text
+ msg[2] = chattype or "SAY"
+ msg[3] = language
+ msg[4] = destination
+ msg.n = 4
+ msg.nSize = nSize
+ msg.callbackFn = callbackFn
+ msg.callbackArg = callbackArg
+
+ self:Enqueue(prio, queueName or (prefix..(chattype or "SAY")..(destination or "")), msg)
+end
+
+
+function ChatThrottleLib:SendAddonMessage(prio, prefix, text, chattype, target, queueName, callbackFn, callbackArg)
+ if not self or not prio or not prefix or not text or not chattype or not self.Prio[prio] then
+ error('Usage: ChatThrottleLib:SendAddonMessage("{BULK||NORMAL||ALERT}", "prefix", "text", "chattype"[, "target"])', 2)
+ end
+ if callbackFn and type(callbackFn)~="function" then
+ error('ChatThrottleLib:SendAddonMessage(): callbackFn: expected function, got '..type(callbackFn), 2)
+ end
+
+ local nSize = prefix:len() + 1 + text:len();
+
+ if nSize>255 then
+ error("ChatThrottleLib:SendAddonMessage(): prefix + message length cannot exceed 254 bytes", 2)
+ end
+
+ nSize = nSize + self.MSG_OVERHEAD;
+
+ -- Check if there's room in the global available bandwidth gauge to send directly
+ if not self.bQueueing and nSize < self:UpdateAvail() then
+ self.avail = self.avail - nSize
+ bMyTraffic = true
+ _G.SendAddonMessage(prefix, text, chattype, target)
+ bMyTraffic = false
+ self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize
+ if callbackFn then
+ callbackFn (callbackArg)
+ end
+ return
+ end
+
+ -- Message needs to be queued
+ local msg = NewMsg()
+ msg.f = _G.SendAddonMessage
+ msg[1] = prefix
+ msg[2] = text
+ msg[3] = chattype
+ msg[4] = target
+ msg.n = (target~=nil) and 4 or 3;
+ msg.nSize = nSize
+ msg.callbackFn = callbackFn
+ msg.callbackArg = callbackArg
+
+ self:Enqueue(prio, queueName or (prefix..chattype..(target or "")), msg)
+end
+
+
+
+
+-----------------------------------------------------------------------
+-- Get the ball rolling!
+
+ChatThrottleLib:Init()
+
+--[[ WoWBench debugging snippet
+if(WOWB_VER) then
+ local function SayTimer()
+ print("SAY: "..GetTime().." "..arg1)
+ end
+ ChatThrottleLib.Frame:SetScript("OnEvent", SayTimer)
+ ChatThrottleLib.Frame:RegisterEvent("CHAT_MSG_SAY")
+end
+]]
+
+
diff --git a/AtlasLoot/Libs/AceDB-3.0/AceDB-3.0.lua b/AtlasLoot/Libs/AceDB-3.0/AceDB-3.0.lua
new file mode 100644
index 0000000..7125643
--- /dev/null
+++ b/AtlasLoot/Libs/AceDB-3.0/AceDB-3.0.lua
@@ -0,0 +1,728 @@
+--- **AceDB-3.0** manages the SavedVariables of your addon.
+-- It offers profile management, smart defaults and namespaces for modules.\\
+-- Data can be saved in different data-types, depending on its intended usage.
+-- The most common data-type is the `profile` type, which allows the user to choose
+-- the active profile, and manage the profiles of all of his characters.\\
+-- The following data types are available:
+-- * **char** Character-specific data. Every character has its own database.
+-- * **realm** Realm-specific data. All of the players characters on the same realm share this database.
+-- * **class** Class-specific data. All of the players characters of the same class share this database.
+-- * **race** Race-specific data. All of the players characters of the same race share this database.
+-- * **faction** Faction-specific data. All of the players characters of the same faction share this database.
+-- * **factionrealm** Faction and realm specific data. All of the players characters on the same realm and of the same faction share this database.
+-- * **global** Global Data. All characters on the same account share this database.
+-- * **profile** Profile-specific data. All characters using the same profile share this database. The user can control which profile should be used.
+--
+-- Creating a new Database using the `:New` function will return a new DBObject. A database will inherit all functions
+-- of the DBObjectLib listed here. \\
+-- If you create a new namespaced child-database (`:RegisterNamespace`), you'll get a DBObject as well, but note
+-- that the child-databases cannot individually change their profile, and are linked to their parents profile - and because of that,
+-- the profile related APIs are not available. Only `:RegisterDefaults` and `:ResetProfile` are available on child-databases.
+--
+-- For more details on how to use AceDB-3.0, see the [[AceDB-3.0 Tutorial]].
+--
+-- You may also be interested in [[libdualspec-1-0|LibDualSpec-1.0]] to do profile switching automatically when switching specs.
+--
+-- @usage
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("DBExample")
+--
+-- -- declare defaults to be used in the DB
+-- local defaults = {
+-- profile = {
+-- setting = true,
+-- }
+-- }
+--
+-- function MyAddon:OnInitialize()
+-- -- Assuming the .toc says ## SavedVariables: MyAddonDB
+-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
+-- end
+-- @class file
+-- @name AceDB-3.0.lua
+-- @release $Id: AceDB-3.0.lua 940 2010-06-19 08:01:47Z nevcairiel $
+local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 21
+local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
+
+if not AceDB then return end -- No upgrade needed
+
+-- Lua APIs
+local type, pairs, next, error = type, pairs, next, error
+local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
+
+-- WoW APIs
+local _G = _G
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: LibStub
+
+AceDB.db_registry = AceDB.db_registry or {}
+AceDB.frame = AceDB.frame or CreateFrame("Frame")
+
+local CallbackHandler
+local CallbackDummy = { Fire = function() end }
+
+local DBObjectLib = {}
+
+--[[-------------------------------------------------------------------------
+ AceDB Utility Functions
+---------------------------------------------------------------------------]]
+
+-- Simple shallow copy for copying defaults
+local function copyTable(src, dest)
+ if type(dest) ~= "table" then dest = {} end
+ if type(src) == "table" then
+ for k,v in pairs(src) do
+ if type(v) == "table" then
+ -- try to index the key first so that the metatable creates the defaults, if set, and use that table
+ v = copyTable(v, dest[k])
+ end
+ dest[k] = v
+ end
+ end
+ return dest
+end
+
+-- Called to add defaults to a section of the database
+--
+-- When a ["*"] default section is indexed with a new key, a table is returned
+-- and set in the host table. These tables must be cleaned up by removeDefaults
+-- in order to ensure we don't write empty default tables.
+local function copyDefaults(dest, src)
+ -- this happens if some value in the SV overwrites our default value with a non-table
+ --if type(dest) ~= "table" then return end
+ for k, v in pairs(src) do
+ if k == "*" or k == "**" then
+ if type(v) == "table" then
+ -- This is a metatable used for table defaults
+ local mt = {
+ -- This handles the lookup and creation of new subtables
+ __index = function(t,k)
+ if k == nil then return nil end
+ local tbl = {}
+ copyDefaults(tbl, v)
+ rawset(t, k, tbl)
+ return tbl
+ end,
+ }
+ setmetatable(dest, mt)
+ -- handle already existing tables in the SV
+ for dk, dv in pairs(dest) do
+ if not rawget(src, dk) and type(dv) == "table" then
+ copyDefaults(dv, v)
+ end
+ end
+ else
+ -- Values are not tables, so this is just a simple return
+ local mt = {__index = function(t,k) return k~=nil and v or nil end}
+ setmetatable(dest, mt)
+ end
+ elseif type(v) == "table" then
+ if not rawget(dest, k) then rawset(dest, k, {}) end
+ if type(dest[k]) == "table" then
+ copyDefaults(dest[k], v)
+ if src['**'] then
+ copyDefaults(dest[k], src['**'])
+ end
+ end
+ else
+ if rawget(dest, k) == nil then
+ rawset(dest, k, v)
+ end
+ end
+ end
+end
+
+-- Called to remove all defaults in the default table from the database
+local function removeDefaults(db, defaults, blocker)
+ -- remove all metatables from the db, so we don't accidentally create new sub-tables through them
+ setmetatable(db, nil)
+ -- loop through the defaults and remove their content
+ for k,v in pairs(defaults) do
+ if k == "*" or k == "**" then
+ if type(v) == "table" then
+ -- Loop through all the actual k,v pairs and remove
+ for key, value in pairs(db) do
+ if type(value) == "table" then
+ -- if the key was not explicitly specified in the defaults table, just strip everything from * and ** tables
+ if defaults[key] == nil and (not blocker or blocker[key] == nil) then
+ removeDefaults(value, v)
+ -- if the table is empty afterwards, remove it
+ if next(value) == nil then
+ db[key] = nil
+ end
+ -- if it was specified, only strip ** content, but block values which were set in the key table
+ elseif k == "**" then
+ removeDefaults(value, v, defaults[key])
+ end
+ end
+ end
+ elseif k == "*" then
+ -- check for non-table default
+ for key, value in pairs(db) do
+ if defaults[key] == nil and v == value then
+ db[key] = nil
+ end
+ end
+ end
+ elseif type(v) == "table" and type(db[k]) == "table" then
+ -- if a blocker was set, dive into it, to allow multi-level defaults
+ removeDefaults(db[k], v, blocker and blocker[k])
+ if next(db[k]) == nil then
+ db[k] = nil
+ end
+ else
+ -- check if the current value matches the default, and that its not blocked by another defaults table
+ if db[k] == defaults[k] and (not blocker or blocker[k] == nil) then
+ db[k] = nil
+ end
+ end
+ end
+end
+
+-- This is called when a table section is first accessed, to set up the defaults
+local function initSection(db, section, svstore, key, defaults)
+ local sv = rawget(db, "sv")
+
+ local tableCreated
+ if not sv[svstore] then sv[svstore] = {} end
+ if not sv[svstore][key] then
+ sv[svstore][key] = {}
+ tableCreated = true
+ end
+
+ local tbl = sv[svstore][key]
+
+ if defaults then
+ copyDefaults(tbl, defaults)
+ end
+ rawset(db, section, tbl)
+
+ return tableCreated, tbl
+end
+
+-- Metatable to handle the dynamic creation of sections and copying of sections.
+local dbmt = {
+ __index = function(t, section)
+ local keys = rawget(t, "keys")
+ local key = keys[section]
+ if key then
+ local defaultTbl = rawget(t, "defaults")
+ local defaults = defaultTbl and defaultTbl[section]
+
+ if section == "profile" then
+ local new = initSection(t, section, "profiles", key, defaults)
+ if new then
+ -- Callback: OnNewProfile, database, newProfileKey
+ t.callbacks:Fire("OnNewProfile", t, key)
+ end
+ elseif section == "profiles" then
+ local sv = rawget(t, "sv")
+ if not sv.profiles then sv.profiles = {} end
+ rawset(t, "profiles", sv.profiles)
+ elseif section == "global" then
+ local sv = rawget(t, "sv")
+ if not sv.global then sv.global = {} end
+ if defaults then
+ copyDefaults(sv.global, defaults)
+ end
+ rawset(t, section, sv.global)
+ else
+ initSection(t, section, section, key, defaults)
+ end
+ end
+
+ return rawget(t, section)
+ end
+}
+
+local function validateDefaults(defaults, keyTbl, offset)
+ if not defaults then return end
+ offset = offset or 0
+ for k in pairs(defaults) do
+ if not keyTbl[k] or k == "profiles" then
+ error(("Usage: AceDBObject:RegisterDefaults(defaults): '%s' is not a valid datatype."):format(k), 3 + offset)
+ end
+ end
+end
+
+local preserve_keys = {
+ ["callbacks"] = true,
+ ["RegisterCallback"] = true,
+ ["UnregisterCallback"] = true,
+ ["UnregisterAllCallbacks"] = true,
+ ["children"] = true,
+}
+
+local realmKey = GetRealmName()
+local charKey = UnitName("player") .. " - " .. realmKey
+local _, classKey = UnitClass("player")
+local _, raceKey = UnitRace("player")
+local factionKey = UnitFactionGroup("player")
+local factionrealmKey = factionKey .. " - " .. realmKey
+-- Actual database initialization function
+local function initdb(sv, defaults, defaultProfile, olddb, parent)
+ -- Generate the database keys for each section
+
+ -- map "true" to our "Default" profile
+ if defaultProfile == true then defaultProfile = "Default" end
+
+ local profileKey
+ if not parent then
+ -- Make a container for profile keys
+ if not sv.profileKeys then sv.profileKeys = {} end
+
+ -- Try to get the profile selected from the char db
+ profileKey = sv.profileKeys[charKey] or defaultProfile or charKey
+
+ -- save the selected profile for later
+ sv.profileKeys[charKey] = profileKey
+ else
+ -- Use the profile of the parents DB
+ profileKey = parent.keys.profile or defaultProfile or charKey
+
+ -- clear the profileKeys in the DB, namespaces don't need to store them
+ sv.profileKeys = nil
+ end
+
+ -- This table contains keys that enable the dynamic creation
+ -- of each section of the table. The 'global' and 'profiles'
+ -- have a key of true, since they are handled in a special case
+ local keyTbl= {
+ ["char"] = charKey,
+ ["realm"] = realmKey,
+ ["class"] = classKey,
+ ["race"] = raceKey,
+ ["faction"] = factionKey,
+ ["factionrealm"] = factionrealmKey,
+ ["profile"] = profileKey,
+ ["global"] = true,
+ ["profiles"] = true,
+ }
+
+ validateDefaults(defaults, keyTbl, 1)
+
+ -- This allows us to use this function to reset an entire database
+ -- Clear out the old database
+ if olddb then
+ for k,v in pairs(olddb) do if not preserve_keys[k] then olddb[k] = nil end end
+ end
+
+ -- Give this database the metatable so it initializes dynamically
+ local db = setmetatable(olddb or {}, dbmt)
+
+ if not rawget(db, "callbacks") then
+ -- try to load CallbackHandler-1.0 if it loaded after our library
+ if not CallbackHandler then CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0", true) end
+ db.callbacks = CallbackHandler and CallbackHandler:New(db) or CallbackDummy
+ end
+
+ -- Copy methods locally into the database object, to avoid hitting
+ -- the metatable when calling methods
+
+ if not parent then
+ for name, func in pairs(DBObjectLib) do
+ db[name] = func
+ end
+ else
+ -- hack this one in
+ db.RegisterDefaults = DBObjectLib.RegisterDefaults
+ db.ResetProfile = DBObjectLib.ResetProfile
+ end
+
+ -- Set some properties in the database object
+ db.profiles = sv.profiles
+ db.keys = keyTbl
+ db.sv = sv
+ --db.sv_name = name
+ db.defaults = defaults
+ db.parent = parent
+
+ -- store the DB in the registry
+ AceDB.db_registry[db] = true
+
+ return db
+end
+
+-- handle PLAYER_LOGOUT
+-- strip all defaults from all databases
+-- and cleans up empty sections
+local function logoutHandler(frame, event)
+ if event == "PLAYER_LOGOUT" then
+ for db in pairs(AceDB.db_registry) do
+ db.callbacks:Fire("OnDatabaseShutdown", db)
+ db:RegisterDefaults(nil)
+
+ -- cleanup sections that are empty without defaults
+ local sv = rawget(db, "sv")
+ for section in pairs(db.keys) do
+ if rawget(sv, section) then
+ -- global is special, all other sections have sub-entrys
+ -- also don't delete empty profiles on main dbs, only on namespaces
+ if section ~= "global" and (section ~= "profiles" or rawget(db, "parent")) then
+ for key in pairs(sv[section]) do
+ if not next(sv[section][key]) then
+ sv[section][key] = nil
+ end
+ end
+ end
+ if not next(sv[section]) then
+ sv[section] = nil
+ end
+ end
+ end
+ end
+ end
+end
+
+AceDB.frame:RegisterEvent("PLAYER_LOGOUT")
+AceDB.frame:SetScript("OnEvent", logoutHandler)
+
+
+--[[-------------------------------------------------------------------------
+ AceDB Object Method Definitions
+---------------------------------------------------------------------------]]
+
+--- Sets the defaults table for the given database object by clearing any
+-- that are currently set, and then setting the new defaults.
+-- @param defaults A table of defaults for this database
+function DBObjectLib:RegisterDefaults(defaults)
+ if defaults and type(defaults) ~= "table" then
+ error("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected.", 2)
+ end
+
+ validateDefaults(defaults, self.keys)
+
+ -- Remove any currently set defaults
+ if self.defaults then
+ for section,key in pairs(self.keys) do
+ if self.defaults[section] and rawget(self, section) then
+ removeDefaults(self[section], self.defaults[section])
+ end
+ end
+ end
+
+ -- Set the DBObject.defaults table
+ self.defaults = defaults
+
+ -- Copy in any defaults, only touching those sections already created
+ if defaults then
+ for section,key in pairs(self.keys) do
+ if defaults[section] and rawget(self, section) then
+ copyDefaults(self[section], defaults[section])
+ end
+ end
+ end
+end
+
+--- Changes the profile of the database and all of it's namespaces to the
+-- supplied named profile
+-- @param name The name of the profile to set as the current profile
+function DBObjectLib:SetProfile(name)
+ if type(name) ~= "string" then
+ error("Usage: AceDBObject:SetProfile(name): 'name' - string expected.", 2)
+ end
+
+ -- changing to the same profile, dont do anything
+ if name == self.keys.profile then return end
+
+ local oldProfile = self.profile
+ local defaults = self.defaults and self.defaults.profile
+
+ -- Callback: OnProfileShutdown, database
+ self.callbacks:Fire("OnProfileShutdown", self)
+
+ if oldProfile and defaults then
+ -- Remove the defaults from the old profile
+ removeDefaults(oldProfile, defaults)
+ end
+
+ self.profile = nil
+ self.keys["profile"] = name
+
+ -- if the storage exists, save the new profile
+ -- this won't exist on namespaces.
+ if self.sv.profileKeys then
+ self.sv.profileKeys[charKey] = name
+ end
+
+ -- populate to child namespaces
+ if self.children then
+ for _, db in pairs(self.children) do
+ DBObjectLib.SetProfile(db, name)
+ end
+ end
+
+ -- Callback: OnProfileChanged, database, newProfileKey
+ self.callbacks:Fire("OnProfileChanged", self, name)
+end
+
+--- Returns a table with the names of the existing profiles in the database.
+-- You can optionally supply a table to re-use for this purpose.
+-- @param tbl A table to store the profile names in (optional)
+function DBObjectLib:GetProfiles(tbl)
+ if tbl and type(tbl) ~= "table" then
+ error("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected.", 2)
+ end
+
+ -- Clear the container table
+ if tbl then
+ for k,v in pairs(tbl) do tbl[k] = nil end
+ else
+ tbl = {}
+ end
+
+ local curProfile = self.keys.profile
+
+ local i = 0
+ for profileKey in pairs(self.profiles) do
+ i = i + 1
+ tbl[i] = profileKey
+ if curProfile and profileKey == curProfile then curProfile = nil end
+ end
+
+ -- Add the current profile, if it hasn't been created yet
+ if curProfile then
+ i = i + 1
+ tbl[i] = curProfile
+ end
+
+ return tbl, i
+end
+
+--- Returns the current profile name used by the database
+function DBObjectLib:GetCurrentProfile()
+ return self.keys.profile
+end
+
+--- Deletes a named profile. This profile must not be the active profile.
+-- @param name The name of the profile to be deleted
+-- @param silent If true, do not raise an error when the profile does not exist
+function DBObjectLib:DeleteProfile(name, silent)
+ if type(name) ~= "string" then
+ error("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected.", 2)
+ end
+
+ if self.keys.profile == name then
+ error("Cannot delete the active profile in an AceDBObject.", 2)
+ end
+
+ if not rawget(self.profiles, name) and not silent then
+ error("Cannot delete profile '" .. name .. "'. It does not exist.", 2)
+ end
+
+ self.profiles[name] = nil
+
+ -- populate to child namespaces
+ if self.children then
+ for _, db in pairs(self.children) do
+ DBObjectLib.DeleteProfile(db, name, true)
+ end
+ end
+
+ -- Callback: OnProfileDeleted, database, profileKey
+ self.callbacks:Fire("OnProfileDeleted", self, name)
+end
+
+--- Copies a named profile into the current profile, overwriting any conflicting
+-- settings.
+-- @param name The name of the profile to be copied into the current profile
+-- @param silent If true, do not raise an error when the profile does not exist
+function DBObjectLib:CopyProfile(name, silent)
+ if type(name) ~= "string" then
+ error("Usage: AceDBObject:CopyProfile(name): 'name' - string expected.", 2)
+ end
+
+ if name == self.keys.profile then
+ error("Cannot have the same source and destination profiles.", 2)
+ end
+
+ if not rawget(self.profiles, name) and not silent then
+ error("Cannot copy profile '" .. name .. "'. It does not exist.", 2)
+ end
+
+ -- Reset the profile before copying
+ DBObjectLib.ResetProfile(self, nil, true)
+
+ local profile = self.profile
+ local source = self.profiles[name]
+
+ copyTable(source, profile)
+
+ -- populate to child namespaces
+ if self.children then
+ for _, db in pairs(self.children) do
+ DBObjectLib.CopyProfile(db, name, true)
+ end
+ end
+
+ -- Callback: OnProfileCopied, database, sourceProfileKey
+ self.callbacks:Fire("OnProfileCopied", self, name)
+end
+
+--- Resets the current profile to the default values (if specified).
+-- @param noChildren if set to true, the reset will not be populated to the child namespaces of this DB object
+-- @param noCallbacks if set to true, won't fire the OnProfileReset callback
+function DBObjectLib:ResetProfile(noChildren, noCallbacks)
+ local profile = self.profile
+
+ for k,v in pairs(profile) do
+ profile[k] = nil
+ end
+
+ local defaults = self.defaults and self.defaults.profile
+ if defaults then
+ copyDefaults(profile, defaults)
+ end
+
+ -- populate to child namespaces
+ if self.children and not noChildren then
+ for _, db in pairs(self.children) do
+ DBObjectLib.ResetProfile(db, nil, noCallbacks)
+ end
+ end
+
+ -- Callback: OnProfileReset, database
+ if not noCallbacks then
+ self.callbacks:Fire("OnProfileReset", self)
+ end
+end
+
+--- Resets the entire database, using the string defaultProfile as the new default
+-- profile.
+-- @param defaultProfile The profile name to use as the default
+function DBObjectLib:ResetDB(defaultProfile)
+ if defaultProfile and type(defaultProfile) ~= "string" then
+ error("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected.", 2)
+ end
+
+ local sv = self.sv
+ for k,v in pairs(sv) do
+ sv[k] = nil
+ end
+
+ local parent = self.parent
+
+ initdb(sv, self.defaults, defaultProfile, self)
+
+ -- fix the child namespaces
+ if self.children then
+ if not sv.namespaces then sv.namespaces = {} end
+ for name, db in pairs(self.children) do
+ if not sv.namespaces[name] then sv.namespaces[name] = {} end
+ initdb(sv.namespaces[name], db.defaults, self.keys.profile, db, self)
+ end
+ end
+
+ -- Callback: OnDatabaseReset, database
+ self.callbacks:Fire("OnDatabaseReset", self)
+ -- Callback: OnProfileChanged, database, profileKey
+ self.callbacks:Fire("OnProfileChanged", self, self.keys["profile"])
+
+ return self
+end
+
+--- Creates a new database namespace, directly tied to the database. This
+-- is a full scale database in it's own rights other than the fact that
+-- it cannot control its profile individually
+-- @param name The name of the new namespace
+-- @param defaults A table of values to use as defaults
+function DBObjectLib:RegisterNamespace(name, defaults)
+ if type(name) ~= "string" then
+ error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected.", 2)
+ end
+ if defaults and type(defaults) ~= "table" then
+ error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected.", 2)
+ end
+ if self.children and self.children[name] then
+ error ("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace with that name already exists.", 2)
+ end
+
+ local sv = self.sv
+ if not sv.namespaces then sv.namespaces = {} end
+ if not sv.namespaces[name] then
+ sv.namespaces[name] = {}
+ end
+
+ local newDB = initdb(sv.namespaces[name], defaults, self.keys.profile, nil, self)
+
+ if not self.children then self.children = {} end
+ self.children[name] = newDB
+ return newDB
+end
+
+--- Returns an already existing namespace from the database object.
+-- @param name The name of the new namespace
+-- @param silent if true, the addon is optional, silently return nil if its not found
+-- @usage
+-- local namespace = self.db:GetNamespace('namespace')
+-- @return the namespace object if found
+function DBObjectLib:GetNamespace(name, silent)
+ if type(name) ~= "string" then
+ error("Usage: AceDBObject:GetNamespace(name): 'name' - string expected.", 2)
+ end
+ if not silent and not (self.children and self.children[name]) then
+ error ("Usage: AceDBObject:GetNamespace(name): 'name' - namespace does not exist.", 2)
+ end
+ if not self.children then self.children = {} end
+ return self.children[name]
+end
+
+--[[-------------------------------------------------------------------------
+ AceDB Exposed Methods
+---------------------------------------------------------------------------]]
+
+--- Creates a new database object that can be used to handle database settings and profiles.
+-- By default, an empty DB is created, using a character specific profile.
+--
+-- You can override the default profile used by passing any profile name as the third argument,
+-- or by passing //true// as the third argument to use a globally shared profile called "Default".
+--
+-- Note that there is no token replacement in the default profile name, passing a defaultProfile as "char"
+-- will use a profile named "char", and not a character-specific profile.
+-- @param tbl The name of variable, or table to use for the database
+-- @param defaults A table of database defaults
+-- @param defaultProfile The name of the default profile. If not set, a character specific profile will be used as the default.
+-- You can also pass //true// to use a shared global profile called "Default".
+-- @usage
+-- -- Create an empty DB using a character-specific default profile.
+-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB")
+-- @usage
+-- -- Create a DB using defaults and using a shared default profile
+-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
+function AceDB:New(tbl, defaults, defaultProfile)
+ if type(tbl) == "string" then
+ local name = tbl
+ tbl = _G[name]
+ if not tbl then
+ tbl = {}
+ _G[name] = tbl
+ end
+ end
+
+ if type(tbl) ~= "table" then
+ error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected.", 2)
+ end
+
+ if defaults and type(defaults) ~= "table" then
+ error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected.", 2)
+ end
+
+ if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then
+ error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected.", 2)
+ end
+
+ return initdb(tbl, defaults, defaultProfile)
+end
+
+-- upgrade existing databases
+for db in pairs(AceDB.db_registry) do
+ if not db.parent then
+ for name,func in pairs(DBObjectLib) do
+ db[name] = func
+ end
+ else
+ db.RegisterDefaults = DBObjectLib.RegisterDefaults
+ db.ResetProfile = DBObjectLib.ResetProfile
+ end
+end
diff --git a/AtlasLoot/Libs/AceDB-3.0/AceDB-3.0.xml b/AtlasLoot/Libs/AceDB-3.0/AceDB-3.0.xml
new file mode 100644
index 0000000..e825f7b
--- /dev/null
+++ b/AtlasLoot/Libs/AceDB-3.0/AceDB-3.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/AtlasLoot/Libs/AceLibrary/AceLibrary.lua b/AtlasLoot/Libs/AceLibrary/AceLibrary.lua
new file mode 100644
index 0000000..8ff1742
--- /dev/null
+++ b/AtlasLoot/Libs/AceLibrary/AceLibrary.lua
@@ -0,0 +1,799 @@
+--[[
+Name: AceLibrary
+Revision: $Rev: 1091 $
+Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team)
+Inspired By: Iriel (iriel@vigilance-committee.org)
+ Tekkub (tekkub@gmail.com)
+ Revision: $Rev: 1091 $
+Website: http://www.wowace.com/
+Documentation: http://www.wowace.com/index.php/AceLibrary
+SVN: http://svn.wowace.com/wowace/trunk/Ace2/AceLibrary
+Description: Versioning library to handle other library instances, upgrading,
+ and proper access.
+ It also provides a base for libraries to work off of, providing
+ proper error tools. It is handy because all the errors occur in the
+ file that called it, not in the library file itself.
+Dependencies: None
+License: LGPL v2.1
+]]
+
+local ACELIBRARY_MAJOR = "AceLibrary"
+local ACELIBRARY_MINOR = 90000 + tonumber(("$Revision: 1091 $"):match("(%d+)"))
+
+local _G = getfenv(0)
+local previous = _G[ACELIBRARY_MAJOR]
+if previous and not previous:IsNewVersion(ACELIBRARY_MAJOR, ACELIBRARY_MINOR) then return end
+
+do
+ -- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
+ -- LibStub is hereby placed in the Public Domain -- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+ local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
+ local LibStub = _G[LIBSTUB_MAJOR]
+
+ if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+ LibStub = LibStub or {libs = {}, minors = {} }
+ _G[LIBSTUB_MAJOR] = LibStub
+ LibStub.minor = LIBSTUB_MINOR
+
+ function LibStub:NewLibrary(major, minor)
+ assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+ minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
+ local oldminor = self.minors[major]
+ if oldminor and oldminor >= minor then return nil end
+ self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+ return self.libs[major], oldminor
+ end
+
+ function LibStub:GetLibrary(major, silent)
+ if not self.libs[major] and not silent then
+ error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
+ end
+ return self.libs[major], self.minors[major]
+ end
+
+ function LibStub:IterateLibraries() return pairs(self.libs) end
+ setmetatable(LibStub, { __call = LibStub.GetLibrary })
+ end
+end
+local LibStub = _G.LibStub
+
+-- If you don't want AceLibrary to enable libraries that are LoadOnDemand but
+-- disabled in the addon screen, set this to true.
+local DONT_ENABLE_LIBRARIES = nil
+
+local function safecall(func,...)
+ local success, err = pcall(func,...)
+ if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("\n(.-: )in.-\n") or "") .. err) end
+end
+
+-- @table AceLibrary
+-- @brief System to handle all versioning of libraries.
+local AceLibrary = {}
+local AceLibrary_mt = {}
+setmetatable(AceLibrary, AceLibrary_mt)
+
+local function error(self, message, ...)
+ if type(self) ~= "table" then
+ return _G.error(("Bad argument #1 to `error' (table expected, got %s)"):format(type(self)), 2)
+ end
+
+ local stack = debugstack()
+ if not message then
+ local second = stack:match("\n(.-)\n")
+ message = "error raised! " .. second
+ else
+ local arg = { ... } -- not worried about table creation, as errors don't happen often
+
+ for i = 1, #arg do
+ arg[i] = tostring(arg[i])
+ end
+ for i = 1, 10 do
+ table.insert(arg, "nil")
+ end
+ message = message:format(unpack(arg))
+ end
+
+ if getmetatable(self) and getmetatable(self).__tostring then
+ message = ("%s: %s"):format(tostring(self), message)
+ elseif type(rawget(self, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self:GetLibraryVersion()) then
+ message = ("%s: %s"):format(self:GetLibraryVersion(), message)
+ elseif type(rawget(self, 'class')) == "table" and type(rawget(self.class, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self.class:GetLibraryVersion()) then
+ message = ("%s: %s"):format(self.class:GetLibraryVersion(), message)
+ end
+
+ local first = stack:gsub("\n.*", "")
+ local file = first:gsub(".*\\(.*).lua:%d+: .*", "%1")
+ file = file:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
+
+
+ local i = 0
+ for s in stack:gmatch("\n([^\n]*)") do
+ i = i + 1
+ if not s:find(file .. "%.lua:%d+:") and not s:find("%(tail call%)") then
+ file = s:gsub("^.*\\(.*).lua:%d+: .*", "%1")
+ file = file:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
+ break
+ end
+ end
+ local j = 0
+ for s in stack:gmatch("\n([^\n]*)") do
+ j = j + 1
+ if j > i and not s:find(file .. "%.lua:%d+:") and not s:find("%(tail call%)") then
+ return _G.error(message, j+1)
+ end
+ end
+ return _G.error(message, 2)
+end
+
+local type = type
+local function argCheck(self, arg, num, kind, kind2, kind3, kind4, kind5)
+ if type(num) ~= "number" then
+ return error(self, "Bad argument #3 to `argCheck' (number expected, got %s)", type(num))
+ elseif type(kind) ~= "string" then
+ return error(self, "Bad argument #4 to `argCheck' (string expected, got %s)", type(kind))
+ end
+ arg = type(arg)
+ if arg ~= kind and arg ~= kind2 and arg ~= kind3 and arg ~= kind4 and arg ~= kind5 then
+ local stack = debugstack()
+ local func = stack:match("`argCheck'.-([`<].-['>])")
+ if not func then
+ func = stack:match("([`<].-['>])")
+ end
+ if kind5 then
+ return error(self, "Bad argument #%s to %s (%s, %s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, kind5, arg)
+ elseif kind4 then
+ return error(self, "Bad argument #%s to %s (%s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, arg)
+ elseif kind3 then
+ return error(self, "Bad argument #%s to %s (%s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, arg)
+ elseif kind2 then
+ return error(self, "Bad argument #%s to %s (%s or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, arg)
+ else
+ return error(self, "Bad argument #%s to %s (%s expected, got %s)", tonumber(num) or 0/0, func, kind, arg)
+ end
+ end
+end
+
+local pcall
+do
+ local function check(self, ret, ...)
+ if not ret then
+ local s = ...
+ return error(self, (s:gsub(".-%.lua:%d-: ", "")))
+ else
+ return ...
+ end
+ end
+
+ function pcall(self, func, ...)
+ return check(self, _G.pcall(func, ...))
+ end
+end
+
+local recurse = {}
+local function addToPositions(t, major)
+ if not AceLibrary.positions[t] or AceLibrary.positions[t] == major then
+ rawset(t, recurse, true)
+ AceLibrary.positions[t] = major
+ for k,v in pairs(t) do
+ if type(v) == "table" and not rawget(v, recurse) then
+ addToPositions(v, major)
+ end
+ if type(k) == "table" and not rawget(k, recurse) then
+ addToPositions(k, major)
+ end
+ end
+ local mt = getmetatable(t)
+ if mt and not rawget(mt, recurse) then
+ addToPositions(mt, major)
+ end
+ rawset(t, recurse, nil)
+ end
+end
+
+local function svnRevisionToNumber(text)
+ local kind = type(text)
+ if kind == "number" or tonumber(text) then
+ return tonumber(text)
+ elseif kind == "string" then
+ if text:find("^%$Revision: (%d+) %$$") then
+ return tonumber((text:match("^%$Revision: (%d+) %$$")))
+ elseif text:find("^%$Rev: (%d+) %$$") then
+ return tonumber((text:match("^%$Rev: (%d+) %$$")))
+ elseif text:find("^%$LastChangedRevision: (%d+) %$$") then
+ return tonumber((text:match("^%$LastChangedRevision: (%d+) %$$")))
+ end
+ end
+ return nil
+end
+
+local crawlReplace
+do
+ local recurse = {}
+ local function func(t, to, from)
+ if recurse[t] then
+ return
+ end
+ recurse[t] = true
+ local mt = getmetatable(t)
+ setmetatable(t, nil)
+ rawset(t, to, rawget(t, from))
+ rawset(t, from, nil)
+ for k,v in pairs(t) do
+ if v == from then
+ t[k] = to
+ elseif type(v) == "table" then
+ if not recurse[v] then
+ func(v, to, from)
+ end
+ end
+
+ if type(k) == "table" then
+ if not recurse[k] then
+ func(k, to, from)
+ end
+ end
+ end
+ setmetatable(t, mt)
+ if mt then
+ if mt == from then
+ setmetatable(t, to)
+ elseif not recurse[mt] then
+ func(mt, to, from)
+ end
+ end
+ end
+ function crawlReplace(t, to, from)
+ func(t, to, from)
+ for k in pairs(recurse) do
+ recurse[k] = nil
+ end
+ end
+end
+
+-- @function destroyTable
+-- @brief remove all the contents of a table
+-- @param t table to destroy
+local function destroyTable(t)
+ setmetatable(t, nil)
+ for k,v in pairs(t) do
+ t[k] = nil
+ end
+end
+
+local function isFrame(frame)
+ return type(frame) == "table" and type(rawget(frame, 0)) == "userdata" and type(rawget(frame, 'IsFrameType')) == "function" and getmetatable(frame) and type(rawget(getmetatable(frame), '__index')) == "function"
+end
+
+-- @function copyTable
+-- @brief Create a shallow copy of a table and return it.
+-- @param from The table to copy from
+-- @return A shallow copy of the table
+local function copyTable(from, to)
+ if not to then
+ to = {}
+ end
+ for k,v in pairs(from) do
+ to[k] = v
+ end
+ setmetatable(to, getmetatable(from))
+ return to
+end
+
+-- @function deepTransfer
+-- @brief Fully transfer all data, keeping proper previous table
+-- backreferences stable.
+-- @param to The table with which data is to be injected into
+-- @param from The table whose data will be injected into the first
+-- @param saveFields If available, a shallow copy of the basic data is saved
+-- in here.
+-- @param list The account of table references
+-- @param list2 The current status on which tables have been traversed.
+local deepTransfer
+do
+ -- @function examine
+ -- @brief Take account of all the table references to be shared
+ -- between the to and from tables.
+ -- @param to The table with which data is to be injected into
+ -- @param from The table whose data will be injected into the first
+ -- @param list An account of the table references
+ local function examine(to, from, list, major)
+ list[from] = to
+ for k,v in pairs(from) do
+ if rawget(to, k) and type(from[k]) == "table" and type(to[k]) == "table" and not list[from[k]] then
+ if from[k] == to[k] then
+ list[from[k]] = to[k]
+ elseif AceLibrary.positions[from[v]] ~= major and AceLibrary.positions[from[v]] then
+ list[from[k]] = from[k]
+ elseif not list[from[k]] then
+ examine(to[k], from[k], list, major)
+ end
+ end
+ end
+ return list
+ end
+
+ function deepTransfer(to, from, saveFields, major, list, list2)
+ setmetatable(to, nil)
+ if not list then
+ list = {}
+ list2 = {}
+ examine(to, from, list, major)
+ end
+ list2[to] = to
+ for k,v in pairs(to) do
+ if type(rawget(from, k)) ~= "table" or type(v) ~= "table" or isFrame(v) then
+ if saveFields then
+ saveFields[k] = v
+ end
+ to[k] = nil
+ elseif v ~= _G then
+ if saveFields then
+ saveFields[k] = copyTable(v)
+ end
+ end
+ end
+ for k in pairs(from) do
+ if rawget(to, k) and to[k] ~= from[k] and AceLibrary.positions[to[k]] == major and from[k] ~= _G then
+ if not list2[to[k]] then
+ deepTransfer(to[k], from[k], nil, major, list, list2)
+ end
+ to[k] = list[to[k]] or list2[to[k]]
+ else
+ rawset(to, k, from[k])
+ end
+ end
+ setmetatable(to, getmetatable(from))
+ local mt = getmetatable(to)
+ if mt then
+ if list[mt] then
+ setmetatable(to, list[mt])
+ elseif mt.__index and list[mt.__index] then
+ mt.__index = list[mt.__index]
+ end
+ end
+ destroyTable(from)
+ end
+end
+
+local function TryToEnable(addon)
+ if DONT_ENABLE_LIBRARIES then return end
+ local isondemand = IsAddOnLoadOnDemand(addon)
+ if isondemand then
+ local _, _, _, enabled = GetAddOnInfo(addon)
+ EnableAddOn(addon)
+ local _, _, _, _, loadable = GetAddOnInfo(addon)
+ if not loadable and not enabled then
+ DisableAddOn(addon)
+ end
+
+ return loadable
+ end
+end
+
+-- @method TryToLoadStandalone
+-- @brief Attempt to find and load a standalone version of the requested library
+-- @param major A string representing the major version
+-- @return If library is found and loaded, true is return. If not loadable, false is returned.
+-- If the library has been requested previously, nil is returned.
+local function TryToLoadStandalone(major)
+ if not AceLibrary.scannedlibs then AceLibrary.scannedlibs = {} end
+ if AceLibrary.scannedlibs[major] then return end
+
+ AceLibrary.scannedlibs[major] = true
+
+ local name, _, _, enabled, loadable = GetAddOnInfo(major)
+
+ loadable = (enabled and loadable) or TryToEnable(name)
+
+ local loaded = false
+ if loadable then
+ loaded = true
+ LoadAddOn(name)
+ end
+
+ local field = "X-AceLibrary-" .. major
+ for i = 1, GetNumAddOns() do
+ if GetAddOnMetadata(i, field) then
+ name, _, _, enabled, loadable = GetAddOnInfo(i)
+
+ loadable = (enabled and loadable) or TryToEnable(name)
+ if loadable then
+ loaded = true
+ LoadAddOn(name)
+ end
+ end
+ end
+ return loaded
+end
+
+-- @method IsNewVersion
+-- @brief Obtain whether the supplied version would be an upgrade to the
+-- current version. This allows for bypass code in library
+-- declaration.
+-- @param major A string representing the major version
+-- @param minor An integer or an svn revision string representing the minor version
+-- @return whether the supplied version would be newer than what is
+-- currently available.
+function AceLibrary:IsNewVersion(major, minor)
+ argCheck(self, major, 2, "string")
+ TryToLoadStandalone(major)
+
+ if type(minor) == "string" then
+ local m = svnRevisionToNumber(minor)
+ if m then
+ minor = m
+ else
+ _G.error(("Bad argument #3 to `IsNewVersion'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
+ end
+ end
+ argCheck(self, minor, 3, "number")
+ local lib, oldMinor = LibStub:GetLibrary(major, true)
+ if lib then
+ return oldMinor < minor
+ end
+ local data = self.libs[major]
+ if not data then
+ return true
+ end
+ return data.minor < minor
+end
+
+-- @method HasInstance
+-- @brief Returns whether an instance exists. This allows for optional support of a library.
+-- @param major A string representing the major version.
+-- @param minor (optional) An integer or an svn revision string representing the minor version.
+-- @return Whether an instance exists.
+function AceLibrary:HasInstance(major, minor)
+ argCheck(self, major, 2, "string")
+ if minor ~= false then
+ TryToLoadStandalone(major)
+ end
+
+ local lib, ver = LibStub:GetLibrary(major, true)
+ if not lib and self.libs[major] then
+ lib, ver = self.libs[major].instance, self.libs[major].minor
+ end
+ if minor then
+ if type(minor) == "string" then
+ local m = svnRevisionToNumber(minor)
+ if m then
+ minor = m
+ else
+ _G.error(("Bad argument #3 to `HasInstance'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
+ end
+ end
+ argCheck(self, minor, 3, "number")
+ if not lib then
+ return false
+ end
+ return ver == minor
+ end
+ return not not lib
+end
+
+-- @method GetInstance
+-- @brief Returns the library with the given major/minor version.
+-- @param major A string representing the major version.
+-- @param minor (optional) An integer or an svn revision string representing the minor version.
+-- @return The library with the given major/minor version.
+function AceLibrary:GetInstance(major, minor)
+ argCheck(self, major, 2, "string")
+ if minor ~= false then
+ TryToLoadStandalone(major)
+ end
+
+ local data, ver = LibStub:GetLibrary(major, true)
+ if not data then
+ if self.libs[major] then
+ data, ver = self.libs[major].instance, self.libs[major].minor
+ else
+ _G.error(("Cannot find a library instance of %s."):format(major), 2)
+ return
+ end
+ end
+ if minor then
+ if type(minor) == "string" then
+ local m = svnRevisionToNumber(minor)
+ if m then
+ minor = m
+ else
+ _G.error(("Bad argument #3 to `GetInstance'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
+ end
+ end
+ argCheck(self, minor, 2, "number")
+ if ver ~= minor then
+ _G.error(("Cannot find a library instance of %s, minor version %d."):format(major, minor), 2)
+ end
+ end
+ return data
+end
+
+-- Syntax sugar. AceLibrary("FooBar-1.0")
+AceLibrary_mt.__call = AceLibrary.GetInstance
+
+local donothing = function() end
+
+local AceEvent
+
+local tmp = {}
+
+-- @method Register
+-- @brief Registers a new version of a given library.
+-- @param newInstance the library to register
+-- @param major the major version of the library
+-- @param minor the minor version of the library
+-- @param activateFunc (optional) A function to be called when the library is
+-- fully activated. Takes the arguments
+-- (newInstance [, oldInstance, oldDeactivateFunc]). If
+-- oldInstance is given, you should probably call
+-- oldDeactivateFunc(oldInstance).
+-- @param deactivateFunc (optional) A function to be called by a newer library's
+-- activateFunc.
+-- @param externalFunc (optional) A function to be called whenever a new
+-- library is registered.
+function AceLibrary:Register(newInstance, major, minor, activateFunc, deactivateFunc, externalFunc)
+ argCheck(self, newInstance, 2, "table")
+ argCheck(self, major, 3, "string")
+ if major ~= ACELIBRARY_MAJOR then
+ for k,v in pairs(_G) do
+ if v == newInstance then
+ geterrorhandler()((debugstack():match("(.-: )in.-\n") or "") .. ("Cannot register library %q. It is part of the global table in _G[%q]."):format(major, k))
+ end
+ end
+ end
+ if major ~= ACELIBRARY_MAJOR and not major:find("^[%a%-][%a%d%-]*%-%d+%.%d+$") then
+ _G.error(string.format("Bad argument #3 to `Register'. Must be in the form of \"Name-1.0\". %q is not appropriate", major), 2)
+ end
+ if type(minor) == "string" then
+ local m = svnRevisionToNumber(minor)
+ if m then
+ minor = m
+ else
+ _G.error(("Bad argument #4 to `Register'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
+ end
+ end
+ argCheck(self, minor, 4, "number")
+ if math.floor(minor) ~= minor or minor < 0 then
+ error(self, "Bad argument #4 to `Register' (integer >= 0 expected, got %s)", minor)
+ end
+ argCheck(self, activateFunc, 5, "function", "nil")
+ argCheck(self, deactivateFunc, 6, "function", "nil")
+ argCheck(self, externalFunc, 7, "function", "nil")
+ if not deactivateFunc then
+ deactivateFunc = donothing
+ end
+ local data = self.libs[major]
+ if not data then
+ -- This is new
+ if LibStub:GetLibrary(major, true) then
+ error(self, "Cannot register library %q. It is already registered with LibStub.", major)
+ end
+ local instance = LibStub:NewLibrary(major, minor)
+ copyTable(newInstance, instance)
+ crawlReplace(instance, instance, newInstance)
+ destroyTable(newInstance)
+ if AceLibrary == newInstance then
+ self = instance
+ AceLibrary = instance
+ end
+ self.libs[major] = {
+ instance = instance,
+ minor = minor,
+ deactivateFunc = deactivateFunc,
+ externalFunc = externalFunc,
+ }
+ rawset(instance, 'GetLibraryVersion', function(self)
+ return major, minor
+ end)
+ if not rawget(instance, 'error') then
+ rawset(instance, 'error', error)
+ end
+ if not rawget(instance, 'argCheck') then
+ rawset(instance, 'argCheck', argCheck)
+ end
+ if not rawget(instance, 'pcall') then
+ rawset(instance, 'pcall', pcall)
+ end
+ addToPositions(instance, major)
+ if activateFunc then
+ safecall(activateFunc, instance, nil, nil) -- no old version, so explicit nil
+ end
+
+ if externalFunc then
+ for k, data_instance in LibStub:IterateLibraries() do -- all libraries
+ tmp[k] = data_instance
+ end
+ for k, data in pairs(self.libs) do -- Ace libraries which may not have been registered with LibStub
+ tmp[k] = data.instance
+ end
+ for k, data_instance in pairs(tmp) do
+ if k ~= major then
+ safecall(externalFunc, instance, k, data_instance)
+ end
+ tmp[k] = nil
+ end
+ end
+
+ for k,data in pairs(self.libs) do -- only Ace libraries
+ if k ~= major and data.externalFunc then
+ safecall(data.externalFunc, data.instance, major, instance)
+ end
+ end
+ if major == "AceEvent-2.0" then
+ AceEvent = instance
+ end
+ if AceEvent then
+ AceEvent.TriggerEvent(self, "AceLibrary_Register", major, instance)
+ end
+
+ return instance
+ end
+ if minor <= data.minor then
+ -- This one is already obsolete, raise an error.
+ _G.error(("Obsolete library registered. %s is already registered at version %d. You are trying to register version %d. Hint: if not AceLibrary:IsNewVersion(%q, %d) then return end"):format(major, data.minor, minor, major, minor), 2)
+ return
+ end
+ local instance = data.instance
+ -- This is an update
+ local oldInstance = {}
+
+ local libStubInstance = LibStub:GetLibrary(major, true)
+ if not libStubInstance then -- non-LibStub AceLibrary registered the library
+ -- pass
+ elseif libStubInstance ~= instance then
+ error(self, "Cannot register library %q. It is already registered with LibStub.", major)
+ else
+ LibStub:NewLibrary(major, minor) -- upgrade the minor version
+ end
+
+ addToPositions(newInstance, major)
+ local isAceLibrary = (AceLibrary == newInstance)
+ local old_error, old_argCheck, old_pcall
+ if isAceLibrary then
+ self = instance
+ AceLibrary = instance
+
+ old_error = instance.error
+ old_argCheck = instance.argCheck
+ old_pcall = instance.pcall
+
+ self.error = error
+ self.argCheck = argCheck
+ self.pcall = pcall
+ end
+ deepTransfer(instance, newInstance, oldInstance, major)
+ crawlReplace(instance, instance, newInstance)
+ local oldDeactivateFunc = data.deactivateFunc
+ data.minor = minor
+ data.deactivateFunc = deactivateFunc
+ data.externalFunc = externalFunc
+ rawset(instance, 'GetLibraryVersion', function()
+ return major, minor
+ end)
+ if not rawget(instance, 'error') then
+ rawset(instance, 'error', error)
+ end
+ if not rawget(instance, 'argCheck') then
+ rawset(instance, 'argCheck', argCheck)
+ end
+ if not rawget(instance, 'pcall') then
+ rawset(instance, 'pcall', pcall)
+ end
+ if isAceLibrary then
+ for _,v in pairs(self.libs) do
+ local i = type(v) == "table" and v.instance
+ if type(i) == "table" then
+ if not rawget(i, 'error') or i.error == old_error then
+ rawset(i, 'error', error)
+ end
+ if not rawget(i, 'argCheck') or i.argCheck == old_argCheck then
+ rawset(i, 'argCheck', argCheck)
+ end
+ if not rawget(i, 'pcall') or i.pcall == old_pcall then
+ rawset(i, 'pcall', pcall)
+ end
+ end
+ end
+ end
+ if activateFunc then
+ safecall(activateFunc, instance, oldInstance, oldDeactivateFunc)
+ else
+ safecall(oldDeactivateFunc, oldInstance)
+ end
+ oldInstance = nil
+
+ if externalFunc then
+ for k, data_instance in LibStub:IterateLibraries() do -- all libraries
+ tmp[k] = data_instance
+ end
+ for k, data in pairs(self.libs) do -- Ace libraries which may not have been registered with LibStub
+ tmp[k] = data.instance
+ end
+ for k, data_instance in pairs(tmp) do
+ if k ~= major then
+ safecall(externalFunc, instance, k, data_instance)
+ end
+ tmp[k] = nil
+ end
+ end
+
+ return instance
+end
+
+function AceLibrary:IterateLibraries()
+ local t = {}
+ for major, instance in LibStub:IterateLibraries() do
+ t[major] = instance
+ end
+ for major, data in pairs(self.libs) do
+ t[major] = data.instance
+ end
+ return pairs(t)
+end
+
+local function manuallyFinalize(major, instance)
+ if AceLibrary.libs[major] then
+ -- don't work on Ace libraries
+ return
+ end
+ local finalizedExternalLibs = AceLibrary.finalizedExternalLibs
+ if finalizedExternalLibs[major] then
+ return
+ end
+ finalizedExternalLibs[major] = true
+
+ for k,data in pairs(AceLibrary.libs) do -- only Ace libraries
+ if k ~= major and data.externalFunc then
+ safecall(data.externalFunc, data.instance, major, instance)
+ end
+ end
+end
+
+-- @function Activate
+-- @brief The activateFunc for AceLibrary itself. Called when
+-- AceLibrary properly registers.
+-- @param self Reference to AceLibrary
+-- @param oldLib (optional) Reference to an old version of AceLibrary
+-- @param oldDeactivate (optional) Function to deactivate the old lib
+local function activate(self, oldLib, oldDeactivate)
+ AceLibrary = self
+ if not self.libs then
+ self.libs = oldLib and oldLib.libs or {}
+ self.scannedlibs = oldLib and oldLib.scannedlibs or {}
+ end
+ if not self.positions then
+ self.positions = oldLib and oldLib.positions or setmetatable({}, { __mode = "k" })
+ end
+ self.finalizedExternalLibs = oldLib and oldLib.finalizedExternalLibs or {}
+ self.frame = oldLib and oldLib.frame or CreateFrame("Frame")
+ self.frame:UnregisterAllEvents()
+ self.frame:RegisterEvent("ADDON_LOADED")
+ self.frame:SetScript("OnEvent", function()
+ for major, instance in LibStub:IterateLibraries() do
+ manuallyFinalize(major, instance)
+ end
+ end)
+ for major, instance in LibStub:IterateLibraries() do
+ manuallyFinalize(major, instance)
+ end
+
+ -- Expose the library in the global environment
+ _G[ACELIBRARY_MAJOR] = self
+
+ if oldDeactivate then
+ oldDeactivate(oldLib)
+ end
+end
+
+if not previous then
+ previous = AceLibrary
+end
+if not previous.libs then
+ previous.libs = {}
+end
+AceLibrary.libs = previous.libs
+if not previous.positions then
+ previous.positions = setmetatable({}, { __mode = "k" })
+end
+AceLibrary.positions = previous.positions
+AceLibrary:Register(AceLibrary, ACELIBRARY_MAJOR, ACELIBRARY_MINOR, activate, nil)
diff --git a/AtlasLoot/Libs/AceLibrary/AceLibrary.toc b/AtlasLoot/Libs/AceLibrary/AceLibrary.toc
new file mode 100644
index 0000000..77f0cf3
--- /dev/null
+++ b/AtlasLoot/Libs/AceLibrary/AceLibrary.toc
@@ -0,0 +1,15 @@
+## Interface: 30300
+## X-Curse-Packaged-Version: r1101
+## X-Curse-Project-Name: Ace2
+## X-Curse-Project-ID: ace2
+## X-Curse-Repository-ID: wow/ace2/mainline
+
+## Title: Lib: AceLibrary
+## Notes: AddOn development framework
+## Author: Ace Development Team
+## X-Website: http://www.wowace.com
+## X-Category: Library
+## X-License: LGPL v2.1 + MIT for AceOO-2.0
+
+AceLibrary.lua
+
diff --git a/AtlasLoot/Libs/AceLocale-3.0/AceLocale-3.0.lua b/AtlasLoot/Libs/AceLocale-3.0/AceLocale-3.0.lua
new file mode 100644
index 0000000..9fc3c15
--- /dev/null
+++ b/AtlasLoot/Libs/AceLocale-3.0/AceLocale-3.0.lua
@@ -0,0 +1,136 @@
+--- **AceLocale-3.0** manages localization in addons, allowing for multiple locale to be registered with fallback to the base locale for untranslated strings.
+-- @class file
+-- @name AceLocale-3.0
+-- @release $Id: AceLocale-3.0.lua 895 2009-12-06 16:28:55Z nevcairiel $
+local MAJOR,MINOR = "AceLocale-3.0", 2
+
+local AceLocale, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not AceLocale then return end -- no upgrade needed
+
+-- Lua APIs
+local assert, tostring, error = assert, tostring, error
+local setmetatable, rawset, rawget = setmetatable, rawset, rawget
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: GAME_LOCALE, geterrorhandler
+
+local gameLocale = GetLocale()
+if gameLocale == "enGB" then
+ gameLocale = "enUS"
+end
+
+AceLocale.apps = AceLocale.apps or {} -- array of ["AppName"]=localetableref
+AceLocale.appnames = AceLocale.appnames or {} -- array of [localetableref]="AppName"
+
+-- This metatable is used on all tables returned from GetLocale
+local readmeta = {
+ __index = function(self, key) -- requesting totally unknown entries: fire off a nonbreaking error and return key
+ rawset(self, key, key) -- only need to see the warning once, really
+ geterrorhandler()(MAJOR..": "..tostring(AceLocale.appnames[self])..": Missing entry for '"..tostring(key).."'")
+ return key
+ end
+}
+
+-- This metatable is used on all tables returned from GetLocale if the silent flag is true, it does not issue a warning on unknown keys
+local readmetasilent = {
+ __index = function(self, key) -- requesting totally unknown entries: return key
+ rawset(self, key, key) -- only need to invoke this function once
+ return key
+ end
+}
+
+-- Remember the locale table being registered right now (it gets set by :NewLocale())
+-- NOTE: Do never try to register 2 locale tables at once and mix their definition.
+local registering
+
+-- local assert false function
+local assertfalse = function() assert(false) end
+
+-- This metatable proxy is used when registering nondefault locales
+local writeproxy = setmetatable({}, {
+ __newindex = function(self, key, value)
+ rawset(registering, key, value == true and key or value) -- assigning values: replace 'true' with key string
+ end,
+ __index = assertfalse
+})
+
+-- This metatable proxy is used when registering the default locale.
+-- It refuses to overwrite existing values
+-- Reason 1: Allows loading locales in any order
+-- Reason 2: If 2 modules have the same string, but only the first one to be
+-- loaded has a translation for the current locale, the translation
+-- doesn't get overwritten.
+--
+local writedefaultproxy = setmetatable({}, {
+ __newindex = function(self, key, value)
+ if not rawget(registering, key) then
+ rawset(registering, key, value == true and key or value)
+ end
+ end,
+ __index = assertfalse
+})
+
+--- Register a new locale (or extend an existing one) for the specified application.
+-- :NewLocale will return a table you can fill your locale into, or nil if the locale isn't needed for the players
+-- game locale.
+-- @paramsig application, locale[, isDefault[, silent]]
+-- @param application Unique name of addon / module
+-- @param locale Name of the locale to register, e.g. "enUS", "deDE", etc.
+-- @param isDefault If this is the default locale being registered (your addon is written in this language, generally enUS)
+-- @param silent If true, the locale will not issue warnings for missing keys. Can only be set on the default locale.
+-- @usage
+-- -- enUS.lua
+-- local L = LibStub("AceLocale-3.0"):NewLocale("TestLocale", "enUS", true)
+-- L["string1"] = true
+--
+-- -- deDE.lua
+-- local L = LibStub("AceLocale-3.0"):NewLocale("TestLocale", "deDE")
+-- if not L then return end
+-- L["string1"] = "Zeichenkette1"
+-- @return Locale Table to add localizations to, or nil if the current locale is not required.
+function AceLocale:NewLocale(application, locale, isDefault, silent)
+
+ if silent and not isDefault then
+ error("Usage: NewLocale(application, locale[, isDefault[, silent]]): 'silent' can only be specified for the default locale", 2)
+ end
+
+ -- GAME_LOCALE allows translators to test translations of addons without having that wow client installed
+ -- Ammo: I still think this is a bad idea, for instance an addon that checks for some ingame string will fail, just because some other addon
+ -- gives the user the illusion that they can run in a different locale? Ditch this whole thing or allow a setting per 'application'. I'm of the
+ -- opinion to remove this.
+ local gameLocale = GAME_LOCALE or gameLocale
+
+ if locale ~= gameLocale and not isDefault then
+ return -- nop, we don't need these translations
+ end
+
+ local app = AceLocale.apps[application]
+
+ if not app then
+ app = setmetatable({}, silent and readmetasilent or readmeta)
+ AceLocale.apps[application] = app
+ AceLocale.appnames[app] = application
+ end
+
+ registering = app -- remember globally for writeproxy and writedefaultproxy
+
+ if isDefault then
+ return writedefaultproxy
+ end
+
+ return writeproxy
+end
+
+--- Returns localizations for the current locale (or default locale if translations are missing).
+-- Errors if nothing is registered (spank developer, not just a missing translation)
+-- @param application Unique name of addon / module
+-- @param silent If true, the locale is optional, silently return nil if it's not found (defaults to false, optional)
+-- @return The locale table for the current language.
+function AceLocale:GetLocale(application, silent)
+ if not silent and not AceLocale.apps[application] then
+ error("Usage: GetLocale(application[, silent]): 'application' - No locales registered for '"..tostring(application).."'", 2)
+ end
+ return AceLocale.apps[application]
+end
diff --git a/AtlasLoot/Libs/AceLocale-3.0/AceLocale-3.0.xml b/AtlasLoot/Libs/AceLocale-3.0/AceLocale-3.0.xml
new file mode 100644
index 0000000..d69dbb1
--- /dev/null
+++ b/AtlasLoot/Libs/AceLocale-3.0/AceLocale-3.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/AtlasLoot/Libs/AceSerializer-3.0/AceSerializer-3.0.lua b/AtlasLoot/Libs/AceSerializer-3.0/AceSerializer-3.0.lua
new file mode 100644
index 0000000..f64e2ed
--- /dev/null
+++ b/AtlasLoot/Libs/AceSerializer-3.0/AceSerializer-3.0.lua
@@ -0,0 +1,281 @@
+--- **AceSerializer-3.0** can serialize any variable (except functions or userdata) into a string format,
+-- that can be send over the addon comm channel. AceSerializer was designed to keep all data intact, especially
+-- very large numbers or floating point numbers, and table structures. The only caveat currently is, that multiple
+-- references to the same table will be send individually.
+--
+-- **AceSerializer-3.0** can be embeded into your addon, either explicitly by calling AceSerializer:Embed(MyAddon) or by
+-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
+-- and can be accessed directly, without having to explicitly call AceSerializer itself.\\
+-- It is recommended to embed AceSerializer, otherwise you'll have to specify a custom `self` on all calls you
+-- make into AceSerializer.
+-- @class file
+-- @name AceSerializer-3.0
+-- @release $Id: AceSerializer-3.0.lua 910 2010-02-11 21:54:24Z mikk $
+local MAJOR,MINOR = "AceSerializer-3.0", 3
+local AceSerializer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not AceSerializer then return end
+
+-- Lua APIs
+local strbyte, strchar, gsub, gmatch, format = string.byte, string.char, string.gsub, string.gmatch, string.format
+local assert, error, pcall = assert, error, pcall
+local type, tostring, tonumber = type, tostring, tonumber
+local pairs, select, frexp = pairs, select, math.frexp
+local tconcat = table.concat
+
+-- quick copies of string representations of wonky numbers
+local serNaN = tostring(0/0)
+local serInf = tostring(1/0)
+local serNegInf = tostring(-1/0)
+
+
+-- Serialization functions
+
+local function SerializeStringHelper(ch) -- Used by SerializeValue for strings
+ -- We use \126 ("~") as an escape character for all nonprints plus a few more
+ local n = strbyte(ch)
+ if n==30 then -- v3 / ticket 115: catch a nonprint that ends up being "~^" when encoded... DOH
+ return "\126\122"
+ elseif n<=32 then -- nonprint + space
+ return "\126"..strchar(n+64)
+ elseif n==94 then -- value separator
+ return "\126\125"
+ elseif n==126 then -- our own escape character
+ return "\126\124"
+ elseif n==127 then -- nonprint (DEL)
+ return "\126\123"
+ else
+ assert(false) -- can't be reached if caller uses a sane regex
+ end
+end
+
+local function SerializeValue(v, res, nres)
+ -- We use "^" as a value separator, followed by one byte for type indicator
+ local t=type(v)
+
+ if t=="string" then -- ^S = string (escaped to remove nonprints, "^"s, etc)
+ res[nres+1] = "^S"
+ res[nres+2] = gsub(v,"[%c \94\126\127]", SerializeStringHelper)
+ nres=nres+2
+
+ elseif t=="number" then -- ^N = number (just tostring()ed) or ^F (float components)
+ local str = tostring(v)
+ if tonumber(str)==v or str==serNaN or str==serInf or str==serNegInf then
+ -- translates just fine, transmit as-is
+ res[nres+1] = "^N"
+ res[nres+2] = str
+ nres=nres+2
+ else
+ local m,e = frexp(v)
+ res[nres+1] = "^F"
+ res[nres+2] = format("%.0f",m*2^53) -- force mantissa to become integer (it's originally 0.5--0.9999)
+ res[nres+3] = "^f"
+ res[nres+4] = tostring(e-53) -- adjust exponent to counteract mantissa manipulation
+ nres=nres+4
+ end
+
+ elseif t=="table" then -- ^T...^t = table (list of key,value pairs)
+ nres=nres+1
+ res[nres] = "^T"
+ for k,v in pairs(v) do
+ nres = SerializeValue(k, res, nres)
+ nres = SerializeValue(v, res, nres)
+ end
+ nres=nres+1
+ res[nres] = "^t"
+
+ elseif t=="boolean" then -- ^B = true, ^b = false
+ nres=nres+1
+ if v then
+ res[nres] = "^B" -- true
+ else
+ res[nres] = "^b" -- false
+ end
+
+ elseif t=="nil" then -- ^Z = nil (zero, "N" was taken :P)
+ nres=nres+1
+ res[nres] = "^Z"
+
+ else
+ error(MAJOR..": Cannot serialize a value of type '"..t.."'") -- can't produce error on right level, this is wildly recursive
+ end
+
+ return nres
+end
+
+
+
+local serializeTbl = { "^1" } -- "^1" = Hi, I'm data serialized by AceSerializer protocol rev 1
+
+--- Serialize the data passed into the function.
+-- Takes a list of values (strings, numbers, booleans, nils, tables)
+-- and returns it in serialized form (a string).\\
+-- May throw errors on invalid data types.
+-- @param ... List of values to serialize
+-- @return The data in its serialized form (string)
+function AceSerializer:Serialize(...)
+ local nres = 1
+
+ for i=1,select("#", ...) do
+ local v = select(i, ...)
+ nres = SerializeValue(v, serializeTbl, nres)
+ end
+
+ serializeTbl[nres+1] = "^^" -- "^^" = End of serialized data
+
+ return tconcat(serializeTbl, "", 1, nres+1)
+end
+
+-- Deserialization functions
+local function DeserializeStringHelper(escape)
+ if escape<"~\122" then
+ return strchar(strbyte(escape,2,2)-64)
+ elseif escape=="~\122" then -- v3 / ticket 115: special case encode since 30+64=94 ("^") - OOPS.
+ return "\030"
+ elseif escape=="~\123" then
+ return "\127"
+ elseif escape=="~\124" then
+ return "\126"
+ elseif escape=="~\125" then
+ return "\94"
+ end
+ error("DeserializeStringHelper got called for '"..escape.."'?!?") -- can't be reached unless regex is screwed up
+end
+
+local function DeserializeNumberHelper(number)
+ if number == serNaN then
+ return 0/0
+ elseif number == serNegInf then
+ return -1/0
+ elseif number == serInf then
+ return 1/0
+ else
+ return tonumber(number)
+ end
+end
+
+-- DeserializeValue: worker function for :Deserialize()
+-- It works in two modes:
+-- Main (top-level) mode: Deserialize a list of values and return them all
+-- Recursive (table) mode: Deserialize only a single value (_may_ of course be another table with lots of subvalues in it)
+--
+-- The function _always_ works recursively due to having to build a list of values to return
+--
+-- Callers are expected to pcall(DeserializeValue) to trap errors
+
+local function DeserializeValue(iter,single,ctl,data)
+
+ if not single then
+ ctl,data = iter()
+ end
+
+ if not ctl then
+ error("Supplied data misses AceSerializer terminator ('^^')")
+ end
+
+ if ctl=="^^" then
+ -- ignore extraneous data
+ return
+ end
+
+ local res
+
+ if ctl=="^S" then
+ res = gsub(data, "~.", DeserializeStringHelper)
+ elseif ctl=="^N" then
+ res = DeserializeNumberHelper(data)
+ if not res then
+ error("Invalid serialized number: '"..tostring(data).."'")
+ end
+ elseif ctl=="^F" then -- ^F^f
+ local ctl2,e = iter()
+ if ctl2~="^f" then
+ error("Invalid serialized floating-point number, expected '^f', not '"..tostring(ctl2).."'")
+ end
+ local m=tonumber(data)
+ e=tonumber(e)
+ if not (m and e) then
+ error("Invalid serialized floating-point number, expected mantissa and exponent, got '"..tostring(m).."' and '"..tostring(e).."'")
+ end
+ res = m*(2^e)
+ elseif ctl=="^B" then -- yeah yeah ignore data portion
+ res = true
+ elseif ctl=="^b" then -- yeah yeah ignore data portion
+ res = false
+ elseif ctl=="^Z" then -- yeah yeah ignore data portion
+ res = nil
+ elseif ctl=="^T" then
+ -- ignore ^T's data, future extensibility?
+ res = {}
+ local k,v
+ while true do
+ ctl,data = iter()
+ if ctl=="^t" then break end -- ignore ^t's data
+ k = DeserializeValue(iter,true,ctl,data)
+ if k==nil then
+ error("Invalid AceSerializer table format (no table end marker)")
+ end
+ ctl,data = iter()
+ v = DeserializeValue(iter,true,ctl,data)
+ if v==nil then
+ error("Invalid AceSerializer table format (no table end marker)")
+ end
+ res[k]=v
+ end
+ else
+ error("Invalid AceSerializer control code '"..ctl.."'")
+ end
+
+ if not single then
+ return res,DeserializeValue(iter)
+ else
+ return res
+ end
+end
+
+--- Deserializes the data into its original values.
+-- Accepts serialized data, ignoring all control characters and whitespace.
+-- @param str The serialized data (from :Serialize)
+-- @return true followed by a list of values, OR false followed by an error message
+function AceSerializer:Deserialize(str)
+ str = gsub(str, "[%c ]", "") -- ignore all control characters; nice for embedding in email and stuff
+
+ local iter = gmatch(str, "(^.)([^^]*)") -- Any ^x followed by string of non-^
+ local ctl,data = iter()
+ if not ctl or ctl~="^1" then
+ -- we purposefully ignore the data portion of the start code, it can be used as an extension mechanism
+ return false, "Supplied data is not AceSerializer data (rev 1)"
+ end
+
+ return pcall(DeserializeValue, iter)
+end
+
+
+----------------------------------------
+-- Base library stuff
+----------------------------------------
+
+AceSerializer.internals = { -- for test scripts
+ SerializeValue = SerializeValue,
+ SerializeStringHelper = SerializeStringHelper,
+}
+
+local mixins = {
+ "Serialize",
+ "Deserialize",
+}
+
+AceSerializer.embeds = AceSerializer.embeds or {}
+
+function AceSerializer:Embed(target)
+ for k, v in pairs(mixins) do
+ target[v] = self[v]
+ end
+ self.embeds[target] = true
+ return target
+end
+
+-- Update embeds
+for target, v in pairs(AceSerializer.embeds) do
+ AceSerializer:Embed(target)
+end
\ No newline at end of file
diff --git a/AtlasLoot/Libs/AceSerializer-3.0/AceSerializer-3.0.xml b/AtlasLoot/Libs/AceSerializer-3.0/AceSerializer-3.0.xml
new file mode 100644
index 0000000..477ac0b
--- /dev/null
+++ b/AtlasLoot/Libs/AceSerializer-3.0/AceSerializer-3.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/AtlasLoot/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/AtlasLoot/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
new file mode 100644
index 0000000..5a495f6
--- /dev/null
+++ b/AtlasLoot/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
@@ -0,0 +1,239 @@
+--[[ $Id: CallbackHandler-1.0.lua 3 2008-09-29 16:54:20Z nevcairiel $ ]]
+local MAJOR, MINOR = "CallbackHandler-1.0", 3
+local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not CallbackHandler then return end -- No upgrade needed
+
+local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
+
+local type = type
+local pcall = pcall
+local pairs = pairs
+local assert = assert
+local concat = table.concat
+local loadstring = loadstring
+local next = next
+local select = select
+local type = type
+local xpcall = xpcall
+
+local function errorhandler(err)
+ return geterrorhandler()(err)
+end
+
+local function CreateDispatcher(argCount)
+ local code = [[
+ local next, xpcall, eh = ...
+
+ local method, ARGS
+ local function call() method(ARGS) end
+
+ local function dispatch(handlers, ...)
+ local index
+ index, method = next(handlers)
+ if not method then return end
+ local OLD_ARGS = ARGS
+ ARGS = ...
+ repeat
+ xpcall(call, eh)
+ index, method = next(handlers, index)
+ until not method
+ ARGS = OLD_ARGS
+ end
+
+ return dispatch
+ ]]
+
+ local ARGS, OLD_ARGS = {}, {}
+ for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
+ code = code:gsub("OLD_ARGS", concat(OLD_ARGS, ", ")):gsub("ARGS", concat(ARGS, ", "))
+ return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
+end
+
+local Dispatchers = setmetatable({}, {__index=function(self, argCount)
+ local dispatcher = CreateDispatcher(argCount)
+ rawset(self, argCount, dispatcher)
+ return dispatcher
+end})
+
+--------------------------------------------------------------------------
+-- CallbackHandler:New
+--
+-- target - target object to embed public APIs in
+-- RegisterName - name of the callback registration API, default "RegisterCallback"
+-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
+-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
+
+function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused)
+ -- TODO: Remove this after beta has gone out
+ assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
+
+ RegisterName = RegisterName or "RegisterCallback"
+ UnregisterName = UnregisterName or "UnregisterCallback"
+ if UnregisterAllName==nil then -- false is used to indicate "don't want this method"
+ UnregisterAllName = "UnregisterAllCallbacks"
+ end
+
+ -- we declare all objects and exported APIs inside this closure to quickly gain access
+ -- to e.g. function names, the "target" parameter, etc
+
+
+ -- Create the registry object
+ local events = setmetatable({}, meta)
+ local registry = { recurse=0, events=events }
+
+ -- registry:Fire() - fires the given event/message into the registry
+ function registry:Fire(eventname, ...)
+ if not rawget(events, eventname) or not next(events[eventname]) then return end
+ local oldrecurse = registry.recurse
+ registry.recurse = oldrecurse + 1
+
+ Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
+
+ registry.recurse = oldrecurse
+
+ if registry.insertQueue and oldrecurse==0 then
+ -- Something in one of our callbacks wanted to register more callbacks; they got queued
+ for eventname,callbacks in pairs(registry.insertQueue) do
+ local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
+ for self,func in pairs(callbacks) do
+ events[eventname][self] = func
+ -- fire OnUsed callback?
+ if first and registry.OnUsed then
+ registry.OnUsed(registry, target, eventname)
+ first = nil
+ end
+ end
+ end
+ registry.insertQueue = nil
+ end
+ end
+
+ -- Registration of a callback, handles:
+ -- self["method"], leads to self["method"](self, ...)
+ -- self with function ref, leads to functionref(...)
+ -- "addonId" (instead of self) with function ref, leads to functionref(...)
+ -- all with an optional arg, which, if present, gets passed as first argument (after self if present)
+ target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
+ if type(eventname) ~= "string" then
+ error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
+ end
+
+ method = method or eventname
+
+ local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
+
+ if type(method) ~= "string" and type(method) ~= "function" then
+ error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
+ end
+
+ local regfunc
+
+ if type(method) == "string" then
+ -- self["method"] calling style
+ if type(self) ~= "table" then
+ error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
+ elseif self==target then
+ error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
+ elseif type(self[method]) ~= "function" then
+ error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
+ end
+
+ if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
+ local arg=select(1,...)
+ regfunc = function(...) self[method](self,arg,...) end
+ else
+ regfunc = function(...) self[method](self,...) end
+ end
+ else
+ -- function ref with self=object or self="addonId"
+ if type(self)~="table" and type(self)~="string" then
+ error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string expected.", 2)
+ end
+
+ if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
+ local arg=select(1,...)
+ regfunc = function(...) method(arg,...) end
+ else
+ regfunc = method
+ end
+ end
+
+
+ if events[eventname][self] or registry.recurse<1 then
+ -- if registry.recurse<1 then
+ -- we're overwriting an existing entry, or not currently recursing. just set it.
+ events[eventname][self] = regfunc
+ -- fire OnUsed callback?
+ if registry.OnUsed and first then
+ registry.OnUsed(registry, target, eventname)
+ end
+ else
+ -- we're currently processing a callback in this registry, so delay the registration of this new entry!
+ -- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
+ registry.insertQueue = registry.insertQueue or setmetatable({},meta)
+ registry.insertQueue[eventname][self] = regfunc
+ end
+ end
+
+ -- Unregister a callback
+ target[UnregisterName] = function(self, eventname)
+ if not self or self==target then
+ error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
+ end
+ if type(eventname) ~= "string" then
+ error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
+ end
+ if rawget(events, eventname) and events[eventname][self] then
+ events[eventname][self] = nil
+ -- Fire OnUnused callback?
+ if registry.OnUnused and not next(events[eventname]) then
+ registry.OnUnused(registry, target, eventname)
+ end
+ end
+ if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
+ registry.insertQueue[eventname][self] = nil
+ end
+ end
+
+ -- OPTIONAL: Unregister all callbacks for given selfs/addonIds
+ if UnregisterAllName then
+ target[UnregisterAllName] = function(...)
+ if select("#",...)<1 then
+ error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
+ end
+ if select("#",...)==1 and ...==target then
+ error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
+ end
+
+
+ for i=1,select("#",...) do
+ local self = select(i,...)
+ if registry.insertQueue then
+ for eventname, callbacks in pairs(registry.insertQueue) do
+ if callbacks[self] then
+ callbacks[self] = nil
+ end
+ end
+ end
+ for eventname, callbacks in pairs(events) do
+ if callbacks[self] then
+ callbacks[self] = nil
+ -- Fire OnUnused callback?
+ if registry.OnUnused and not next(callbacks) then
+ registry.OnUnused(registry, target, eventname)
+ end
+ end
+ end
+ end
+ end
+ end
+
+ return registry
+end
+
+
+-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
+-- try to upgrade old implicit embeds since the system is selfcontained and
+-- relies on closures to work.
+
diff --git a/AtlasLoot/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml b/AtlasLoot/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
new file mode 100644
index 0000000..1aad3a2
--- /dev/null
+++ b/AtlasLoot/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/AtlasLoot/Libs/DewdropLib/AceLibrary/AceLibrary.lua b/AtlasLoot/Libs/DewdropLib/AceLibrary/AceLibrary.lua
new file mode 100644
index 0000000..8ff1742
--- /dev/null
+++ b/AtlasLoot/Libs/DewdropLib/AceLibrary/AceLibrary.lua
@@ -0,0 +1,799 @@
+--[[
+Name: AceLibrary
+Revision: $Rev: 1091 $
+Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team)
+Inspired By: Iriel (iriel@vigilance-committee.org)
+ Tekkub (tekkub@gmail.com)
+ Revision: $Rev: 1091 $
+Website: http://www.wowace.com/
+Documentation: http://www.wowace.com/index.php/AceLibrary
+SVN: http://svn.wowace.com/wowace/trunk/Ace2/AceLibrary
+Description: Versioning library to handle other library instances, upgrading,
+ and proper access.
+ It also provides a base for libraries to work off of, providing
+ proper error tools. It is handy because all the errors occur in the
+ file that called it, not in the library file itself.
+Dependencies: None
+License: LGPL v2.1
+]]
+
+local ACELIBRARY_MAJOR = "AceLibrary"
+local ACELIBRARY_MINOR = 90000 + tonumber(("$Revision: 1091 $"):match("(%d+)"))
+
+local _G = getfenv(0)
+local previous = _G[ACELIBRARY_MAJOR]
+if previous and not previous:IsNewVersion(ACELIBRARY_MAJOR, ACELIBRARY_MINOR) then return end
+
+do
+ -- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
+ -- LibStub is hereby placed in the Public Domain -- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+ local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
+ local LibStub = _G[LIBSTUB_MAJOR]
+
+ if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+ LibStub = LibStub or {libs = {}, minors = {} }
+ _G[LIBSTUB_MAJOR] = LibStub
+ LibStub.minor = LIBSTUB_MINOR
+
+ function LibStub:NewLibrary(major, minor)
+ assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+ minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
+ local oldminor = self.minors[major]
+ if oldminor and oldminor >= minor then return nil end
+ self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+ return self.libs[major], oldminor
+ end
+
+ function LibStub:GetLibrary(major, silent)
+ if not self.libs[major] and not silent then
+ error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
+ end
+ return self.libs[major], self.minors[major]
+ end
+
+ function LibStub:IterateLibraries() return pairs(self.libs) end
+ setmetatable(LibStub, { __call = LibStub.GetLibrary })
+ end
+end
+local LibStub = _G.LibStub
+
+-- If you don't want AceLibrary to enable libraries that are LoadOnDemand but
+-- disabled in the addon screen, set this to true.
+local DONT_ENABLE_LIBRARIES = nil
+
+local function safecall(func,...)
+ local success, err = pcall(func,...)
+ if not success then geterrorhandler()(err:find("%.lua:%d+:") and err or (debugstack():match("\n(.-: )in.-\n") or "") .. err) end
+end
+
+-- @table AceLibrary
+-- @brief System to handle all versioning of libraries.
+local AceLibrary = {}
+local AceLibrary_mt = {}
+setmetatable(AceLibrary, AceLibrary_mt)
+
+local function error(self, message, ...)
+ if type(self) ~= "table" then
+ return _G.error(("Bad argument #1 to `error' (table expected, got %s)"):format(type(self)), 2)
+ end
+
+ local stack = debugstack()
+ if not message then
+ local second = stack:match("\n(.-)\n")
+ message = "error raised! " .. second
+ else
+ local arg = { ... } -- not worried about table creation, as errors don't happen often
+
+ for i = 1, #arg do
+ arg[i] = tostring(arg[i])
+ end
+ for i = 1, 10 do
+ table.insert(arg, "nil")
+ end
+ message = message:format(unpack(arg))
+ end
+
+ if getmetatable(self) and getmetatable(self).__tostring then
+ message = ("%s: %s"):format(tostring(self), message)
+ elseif type(rawget(self, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self:GetLibraryVersion()) then
+ message = ("%s: %s"):format(self:GetLibraryVersion(), message)
+ elseif type(rawget(self, 'class')) == "table" and type(rawget(self.class, 'GetLibraryVersion')) == "function" and AceLibrary:HasInstance(self.class:GetLibraryVersion()) then
+ message = ("%s: %s"):format(self.class:GetLibraryVersion(), message)
+ end
+
+ local first = stack:gsub("\n.*", "")
+ local file = first:gsub(".*\\(.*).lua:%d+: .*", "%1")
+ file = file:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
+
+
+ local i = 0
+ for s in stack:gmatch("\n([^\n]*)") do
+ i = i + 1
+ if not s:find(file .. "%.lua:%d+:") and not s:find("%(tail call%)") then
+ file = s:gsub("^.*\\(.*).lua:%d+: .*", "%1")
+ file = file:gsub("([%(%)%.%*%+%-%[%]%?%^%$%%])", "%%%1")
+ break
+ end
+ end
+ local j = 0
+ for s in stack:gmatch("\n([^\n]*)") do
+ j = j + 1
+ if j > i and not s:find(file .. "%.lua:%d+:") and not s:find("%(tail call%)") then
+ return _G.error(message, j+1)
+ end
+ end
+ return _G.error(message, 2)
+end
+
+local type = type
+local function argCheck(self, arg, num, kind, kind2, kind3, kind4, kind5)
+ if type(num) ~= "number" then
+ return error(self, "Bad argument #3 to `argCheck' (number expected, got %s)", type(num))
+ elseif type(kind) ~= "string" then
+ return error(self, "Bad argument #4 to `argCheck' (string expected, got %s)", type(kind))
+ end
+ arg = type(arg)
+ if arg ~= kind and arg ~= kind2 and arg ~= kind3 and arg ~= kind4 and arg ~= kind5 then
+ local stack = debugstack()
+ local func = stack:match("`argCheck'.-([`<].-['>])")
+ if not func then
+ func = stack:match("([`<].-['>])")
+ end
+ if kind5 then
+ return error(self, "Bad argument #%s to %s (%s, %s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, kind5, arg)
+ elseif kind4 then
+ return error(self, "Bad argument #%s to %s (%s, %s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, kind4, arg)
+ elseif kind3 then
+ return error(self, "Bad argument #%s to %s (%s, %s, or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, kind3, arg)
+ elseif kind2 then
+ return error(self, "Bad argument #%s to %s (%s or %s expected, got %s)", tonumber(num) or 0/0, func, kind, kind2, arg)
+ else
+ return error(self, "Bad argument #%s to %s (%s expected, got %s)", tonumber(num) or 0/0, func, kind, arg)
+ end
+ end
+end
+
+local pcall
+do
+ local function check(self, ret, ...)
+ if not ret then
+ local s = ...
+ return error(self, (s:gsub(".-%.lua:%d-: ", "")))
+ else
+ return ...
+ end
+ end
+
+ function pcall(self, func, ...)
+ return check(self, _G.pcall(func, ...))
+ end
+end
+
+local recurse = {}
+local function addToPositions(t, major)
+ if not AceLibrary.positions[t] or AceLibrary.positions[t] == major then
+ rawset(t, recurse, true)
+ AceLibrary.positions[t] = major
+ for k,v in pairs(t) do
+ if type(v) == "table" and not rawget(v, recurse) then
+ addToPositions(v, major)
+ end
+ if type(k) == "table" and not rawget(k, recurse) then
+ addToPositions(k, major)
+ end
+ end
+ local mt = getmetatable(t)
+ if mt and not rawget(mt, recurse) then
+ addToPositions(mt, major)
+ end
+ rawset(t, recurse, nil)
+ end
+end
+
+local function svnRevisionToNumber(text)
+ local kind = type(text)
+ if kind == "number" or tonumber(text) then
+ return tonumber(text)
+ elseif kind == "string" then
+ if text:find("^%$Revision: (%d+) %$$") then
+ return tonumber((text:match("^%$Revision: (%d+) %$$")))
+ elseif text:find("^%$Rev: (%d+) %$$") then
+ return tonumber((text:match("^%$Rev: (%d+) %$$")))
+ elseif text:find("^%$LastChangedRevision: (%d+) %$$") then
+ return tonumber((text:match("^%$LastChangedRevision: (%d+) %$$")))
+ end
+ end
+ return nil
+end
+
+local crawlReplace
+do
+ local recurse = {}
+ local function func(t, to, from)
+ if recurse[t] then
+ return
+ end
+ recurse[t] = true
+ local mt = getmetatable(t)
+ setmetatable(t, nil)
+ rawset(t, to, rawget(t, from))
+ rawset(t, from, nil)
+ for k,v in pairs(t) do
+ if v == from then
+ t[k] = to
+ elseif type(v) == "table" then
+ if not recurse[v] then
+ func(v, to, from)
+ end
+ end
+
+ if type(k) == "table" then
+ if not recurse[k] then
+ func(k, to, from)
+ end
+ end
+ end
+ setmetatable(t, mt)
+ if mt then
+ if mt == from then
+ setmetatable(t, to)
+ elseif not recurse[mt] then
+ func(mt, to, from)
+ end
+ end
+ end
+ function crawlReplace(t, to, from)
+ func(t, to, from)
+ for k in pairs(recurse) do
+ recurse[k] = nil
+ end
+ end
+end
+
+-- @function destroyTable
+-- @brief remove all the contents of a table
+-- @param t table to destroy
+local function destroyTable(t)
+ setmetatable(t, nil)
+ for k,v in pairs(t) do
+ t[k] = nil
+ end
+end
+
+local function isFrame(frame)
+ return type(frame) == "table" and type(rawget(frame, 0)) == "userdata" and type(rawget(frame, 'IsFrameType')) == "function" and getmetatable(frame) and type(rawget(getmetatable(frame), '__index')) == "function"
+end
+
+-- @function copyTable
+-- @brief Create a shallow copy of a table and return it.
+-- @param from The table to copy from
+-- @return A shallow copy of the table
+local function copyTable(from, to)
+ if not to then
+ to = {}
+ end
+ for k,v in pairs(from) do
+ to[k] = v
+ end
+ setmetatable(to, getmetatable(from))
+ return to
+end
+
+-- @function deepTransfer
+-- @brief Fully transfer all data, keeping proper previous table
+-- backreferences stable.
+-- @param to The table with which data is to be injected into
+-- @param from The table whose data will be injected into the first
+-- @param saveFields If available, a shallow copy of the basic data is saved
+-- in here.
+-- @param list The account of table references
+-- @param list2 The current status on which tables have been traversed.
+local deepTransfer
+do
+ -- @function examine
+ -- @brief Take account of all the table references to be shared
+ -- between the to and from tables.
+ -- @param to The table with which data is to be injected into
+ -- @param from The table whose data will be injected into the first
+ -- @param list An account of the table references
+ local function examine(to, from, list, major)
+ list[from] = to
+ for k,v in pairs(from) do
+ if rawget(to, k) and type(from[k]) == "table" and type(to[k]) == "table" and not list[from[k]] then
+ if from[k] == to[k] then
+ list[from[k]] = to[k]
+ elseif AceLibrary.positions[from[v]] ~= major and AceLibrary.positions[from[v]] then
+ list[from[k]] = from[k]
+ elseif not list[from[k]] then
+ examine(to[k], from[k], list, major)
+ end
+ end
+ end
+ return list
+ end
+
+ function deepTransfer(to, from, saveFields, major, list, list2)
+ setmetatable(to, nil)
+ if not list then
+ list = {}
+ list2 = {}
+ examine(to, from, list, major)
+ end
+ list2[to] = to
+ for k,v in pairs(to) do
+ if type(rawget(from, k)) ~= "table" or type(v) ~= "table" or isFrame(v) then
+ if saveFields then
+ saveFields[k] = v
+ end
+ to[k] = nil
+ elseif v ~= _G then
+ if saveFields then
+ saveFields[k] = copyTable(v)
+ end
+ end
+ end
+ for k in pairs(from) do
+ if rawget(to, k) and to[k] ~= from[k] and AceLibrary.positions[to[k]] == major and from[k] ~= _G then
+ if not list2[to[k]] then
+ deepTransfer(to[k], from[k], nil, major, list, list2)
+ end
+ to[k] = list[to[k]] or list2[to[k]]
+ else
+ rawset(to, k, from[k])
+ end
+ end
+ setmetatable(to, getmetatable(from))
+ local mt = getmetatable(to)
+ if mt then
+ if list[mt] then
+ setmetatable(to, list[mt])
+ elseif mt.__index and list[mt.__index] then
+ mt.__index = list[mt.__index]
+ end
+ end
+ destroyTable(from)
+ end
+end
+
+local function TryToEnable(addon)
+ if DONT_ENABLE_LIBRARIES then return end
+ local isondemand = IsAddOnLoadOnDemand(addon)
+ if isondemand then
+ local _, _, _, enabled = GetAddOnInfo(addon)
+ EnableAddOn(addon)
+ local _, _, _, _, loadable = GetAddOnInfo(addon)
+ if not loadable and not enabled then
+ DisableAddOn(addon)
+ end
+
+ return loadable
+ end
+end
+
+-- @method TryToLoadStandalone
+-- @brief Attempt to find and load a standalone version of the requested library
+-- @param major A string representing the major version
+-- @return If library is found and loaded, true is return. If not loadable, false is returned.
+-- If the library has been requested previously, nil is returned.
+local function TryToLoadStandalone(major)
+ if not AceLibrary.scannedlibs then AceLibrary.scannedlibs = {} end
+ if AceLibrary.scannedlibs[major] then return end
+
+ AceLibrary.scannedlibs[major] = true
+
+ local name, _, _, enabled, loadable = GetAddOnInfo(major)
+
+ loadable = (enabled and loadable) or TryToEnable(name)
+
+ local loaded = false
+ if loadable then
+ loaded = true
+ LoadAddOn(name)
+ end
+
+ local field = "X-AceLibrary-" .. major
+ for i = 1, GetNumAddOns() do
+ if GetAddOnMetadata(i, field) then
+ name, _, _, enabled, loadable = GetAddOnInfo(i)
+
+ loadable = (enabled and loadable) or TryToEnable(name)
+ if loadable then
+ loaded = true
+ LoadAddOn(name)
+ end
+ end
+ end
+ return loaded
+end
+
+-- @method IsNewVersion
+-- @brief Obtain whether the supplied version would be an upgrade to the
+-- current version. This allows for bypass code in library
+-- declaration.
+-- @param major A string representing the major version
+-- @param minor An integer or an svn revision string representing the minor version
+-- @return whether the supplied version would be newer than what is
+-- currently available.
+function AceLibrary:IsNewVersion(major, minor)
+ argCheck(self, major, 2, "string")
+ TryToLoadStandalone(major)
+
+ if type(minor) == "string" then
+ local m = svnRevisionToNumber(minor)
+ if m then
+ minor = m
+ else
+ _G.error(("Bad argument #3 to `IsNewVersion'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
+ end
+ end
+ argCheck(self, minor, 3, "number")
+ local lib, oldMinor = LibStub:GetLibrary(major, true)
+ if lib then
+ return oldMinor < minor
+ end
+ local data = self.libs[major]
+ if not data then
+ return true
+ end
+ return data.minor < minor
+end
+
+-- @method HasInstance
+-- @brief Returns whether an instance exists. This allows for optional support of a library.
+-- @param major A string representing the major version.
+-- @param minor (optional) An integer or an svn revision string representing the minor version.
+-- @return Whether an instance exists.
+function AceLibrary:HasInstance(major, minor)
+ argCheck(self, major, 2, "string")
+ if minor ~= false then
+ TryToLoadStandalone(major)
+ end
+
+ local lib, ver = LibStub:GetLibrary(major, true)
+ if not lib and self.libs[major] then
+ lib, ver = self.libs[major].instance, self.libs[major].minor
+ end
+ if minor then
+ if type(minor) == "string" then
+ local m = svnRevisionToNumber(minor)
+ if m then
+ minor = m
+ else
+ _G.error(("Bad argument #3 to `HasInstance'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
+ end
+ end
+ argCheck(self, minor, 3, "number")
+ if not lib then
+ return false
+ end
+ return ver == minor
+ end
+ return not not lib
+end
+
+-- @method GetInstance
+-- @brief Returns the library with the given major/minor version.
+-- @param major A string representing the major version.
+-- @param minor (optional) An integer or an svn revision string representing the minor version.
+-- @return The library with the given major/minor version.
+function AceLibrary:GetInstance(major, minor)
+ argCheck(self, major, 2, "string")
+ if minor ~= false then
+ TryToLoadStandalone(major)
+ end
+
+ local data, ver = LibStub:GetLibrary(major, true)
+ if not data then
+ if self.libs[major] then
+ data, ver = self.libs[major].instance, self.libs[major].minor
+ else
+ _G.error(("Cannot find a library instance of %s."):format(major), 2)
+ return
+ end
+ end
+ if minor then
+ if type(minor) == "string" then
+ local m = svnRevisionToNumber(minor)
+ if m then
+ minor = m
+ else
+ _G.error(("Bad argument #3 to `GetInstance'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
+ end
+ end
+ argCheck(self, minor, 2, "number")
+ if ver ~= minor then
+ _G.error(("Cannot find a library instance of %s, minor version %d."):format(major, minor), 2)
+ end
+ end
+ return data
+end
+
+-- Syntax sugar. AceLibrary("FooBar-1.0")
+AceLibrary_mt.__call = AceLibrary.GetInstance
+
+local donothing = function() end
+
+local AceEvent
+
+local tmp = {}
+
+-- @method Register
+-- @brief Registers a new version of a given library.
+-- @param newInstance the library to register
+-- @param major the major version of the library
+-- @param minor the minor version of the library
+-- @param activateFunc (optional) A function to be called when the library is
+-- fully activated. Takes the arguments
+-- (newInstance [, oldInstance, oldDeactivateFunc]). If
+-- oldInstance is given, you should probably call
+-- oldDeactivateFunc(oldInstance).
+-- @param deactivateFunc (optional) A function to be called by a newer library's
+-- activateFunc.
+-- @param externalFunc (optional) A function to be called whenever a new
+-- library is registered.
+function AceLibrary:Register(newInstance, major, minor, activateFunc, deactivateFunc, externalFunc)
+ argCheck(self, newInstance, 2, "table")
+ argCheck(self, major, 3, "string")
+ if major ~= ACELIBRARY_MAJOR then
+ for k,v in pairs(_G) do
+ if v == newInstance then
+ geterrorhandler()((debugstack():match("(.-: )in.-\n") or "") .. ("Cannot register library %q. It is part of the global table in _G[%q]."):format(major, k))
+ end
+ end
+ end
+ if major ~= ACELIBRARY_MAJOR and not major:find("^[%a%-][%a%d%-]*%-%d+%.%d+$") then
+ _G.error(string.format("Bad argument #3 to `Register'. Must be in the form of \"Name-1.0\". %q is not appropriate", major), 2)
+ end
+ if type(minor) == "string" then
+ local m = svnRevisionToNumber(minor)
+ if m then
+ minor = m
+ else
+ _G.error(("Bad argument #4 to `Register'. Must be a number or SVN revision string. %q is not appropriate"):format(minor), 2)
+ end
+ end
+ argCheck(self, minor, 4, "number")
+ if math.floor(minor) ~= minor or minor < 0 then
+ error(self, "Bad argument #4 to `Register' (integer >= 0 expected, got %s)", minor)
+ end
+ argCheck(self, activateFunc, 5, "function", "nil")
+ argCheck(self, deactivateFunc, 6, "function", "nil")
+ argCheck(self, externalFunc, 7, "function", "nil")
+ if not deactivateFunc then
+ deactivateFunc = donothing
+ end
+ local data = self.libs[major]
+ if not data then
+ -- This is new
+ if LibStub:GetLibrary(major, true) then
+ error(self, "Cannot register library %q. It is already registered with LibStub.", major)
+ end
+ local instance = LibStub:NewLibrary(major, minor)
+ copyTable(newInstance, instance)
+ crawlReplace(instance, instance, newInstance)
+ destroyTable(newInstance)
+ if AceLibrary == newInstance then
+ self = instance
+ AceLibrary = instance
+ end
+ self.libs[major] = {
+ instance = instance,
+ minor = minor,
+ deactivateFunc = deactivateFunc,
+ externalFunc = externalFunc,
+ }
+ rawset(instance, 'GetLibraryVersion', function(self)
+ return major, minor
+ end)
+ if not rawget(instance, 'error') then
+ rawset(instance, 'error', error)
+ end
+ if not rawget(instance, 'argCheck') then
+ rawset(instance, 'argCheck', argCheck)
+ end
+ if not rawget(instance, 'pcall') then
+ rawset(instance, 'pcall', pcall)
+ end
+ addToPositions(instance, major)
+ if activateFunc then
+ safecall(activateFunc, instance, nil, nil) -- no old version, so explicit nil
+ end
+
+ if externalFunc then
+ for k, data_instance in LibStub:IterateLibraries() do -- all libraries
+ tmp[k] = data_instance
+ end
+ for k, data in pairs(self.libs) do -- Ace libraries which may not have been registered with LibStub
+ tmp[k] = data.instance
+ end
+ for k, data_instance in pairs(tmp) do
+ if k ~= major then
+ safecall(externalFunc, instance, k, data_instance)
+ end
+ tmp[k] = nil
+ end
+ end
+
+ for k,data in pairs(self.libs) do -- only Ace libraries
+ if k ~= major and data.externalFunc then
+ safecall(data.externalFunc, data.instance, major, instance)
+ end
+ end
+ if major == "AceEvent-2.0" then
+ AceEvent = instance
+ end
+ if AceEvent then
+ AceEvent.TriggerEvent(self, "AceLibrary_Register", major, instance)
+ end
+
+ return instance
+ end
+ if minor <= data.minor then
+ -- This one is already obsolete, raise an error.
+ _G.error(("Obsolete library registered. %s is already registered at version %d. You are trying to register version %d. Hint: if not AceLibrary:IsNewVersion(%q, %d) then return end"):format(major, data.minor, minor, major, minor), 2)
+ return
+ end
+ local instance = data.instance
+ -- This is an update
+ local oldInstance = {}
+
+ local libStubInstance = LibStub:GetLibrary(major, true)
+ if not libStubInstance then -- non-LibStub AceLibrary registered the library
+ -- pass
+ elseif libStubInstance ~= instance then
+ error(self, "Cannot register library %q. It is already registered with LibStub.", major)
+ else
+ LibStub:NewLibrary(major, minor) -- upgrade the minor version
+ end
+
+ addToPositions(newInstance, major)
+ local isAceLibrary = (AceLibrary == newInstance)
+ local old_error, old_argCheck, old_pcall
+ if isAceLibrary then
+ self = instance
+ AceLibrary = instance
+
+ old_error = instance.error
+ old_argCheck = instance.argCheck
+ old_pcall = instance.pcall
+
+ self.error = error
+ self.argCheck = argCheck
+ self.pcall = pcall
+ end
+ deepTransfer(instance, newInstance, oldInstance, major)
+ crawlReplace(instance, instance, newInstance)
+ local oldDeactivateFunc = data.deactivateFunc
+ data.minor = minor
+ data.deactivateFunc = deactivateFunc
+ data.externalFunc = externalFunc
+ rawset(instance, 'GetLibraryVersion', function()
+ return major, minor
+ end)
+ if not rawget(instance, 'error') then
+ rawset(instance, 'error', error)
+ end
+ if not rawget(instance, 'argCheck') then
+ rawset(instance, 'argCheck', argCheck)
+ end
+ if not rawget(instance, 'pcall') then
+ rawset(instance, 'pcall', pcall)
+ end
+ if isAceLibrary then
+ for _,v in pairs(self.libs) do
+ local i = type(v) == "table" and v.instance
+ if type(i) == "table" then
+ if not rawget(i, 'error') or i.error == old_error then
+ rawset(i, 'error', error)
+ end
+ if not rawget(i, 'argCheck') or i.argCheck == old_argCheck then
+ rawset(i, 'argCheck', argCheck)
+ end
+ if not rawget(i, 'pcall') or i.pcall == old_pcall then
+ rawset(i, 'pcall', pcall)
+ end
+ end
+ end
+ end
+ if activateFunc then
+ safecall(activateFunc, instance, oldInstance, oldDeactivateFunc)
+ else
+ safecall(oldDeactivateFunc, oldInstance)
+ end
+ oldInstance = nil
+
+ if externalFunc then
+ for k, data_instance in LibStub:IterateLibraries() do -- all libraries
+ tmp[k] = data_instance
+ end
+ for k, data in pairs(self.libs) do -- Ace libraries which may not have been registered with LibStub
+ tmp[k] = data.instance
+ end
+ for k, data_instance in pairs(tmp) do
+ if k ~= major then
+ safecall(externalFunc, instance, k, data_instance)
+ end
+ tmp[k] = nil
+ end
+ end
+
+ return instance
+end
+
+function AceLibrary:IterateLibraries()
+ local t = {}
+ for major, instance in LibStub:IterateLibraries() do
+ t[major] = instance
+ end
+ for major, data in pairs(self.libs) do
+ t[major] = data.instance
+ end
+ return pairs(t)
+end
+
+local function manuallyFinalize(major, instance)
+ if AceLibrary.libs[major] then
+ -- don't work on Ace libraries
+ return
+ end
+ local finalizedExternalLibs = AceLibrary.finalizedExternalLibs
+ if finalizedExternalLibs[major] then
+ return
+ end
+ finalizedExternalLibs[major] = true
+
+ for k,data in pairs(AceLibrary.libs) do -- only Ace libraries
+ if k ~= major and data.externalFunc then
+ safecall(data.externalFunc, data.instance, major, instance)
+ end
+ end
+end
+
+-- @function Activate
+-- @brief The activateFunc for AceLibrary itself. Called when
+-- AceLibrary properly registers.
+-- @param self Reference to AceLibrary
+-- @param oldLib (optional) Reference to an old version of AceLibrary
+-- @param oldDeactivate (optional) Function to deactivate the old lib
+local function activate(self, oldLib, oldDeactivate)
+ AceLibrary = self
+ if not self.libs then
+ self.libs = oldLib and oldLib.libs or {}
+ self.scannedlibs = oldLib and oldLib.scannedlibs or {}
+ end
+ if not self.positions then
+ self.positions = oldLib and oldLib.positions or setmetatable({}, { __mode = "k" })
+ end
+ self.finalizedExternalLibs = oldLib and oldLib.finalizedExternalLibs or {}
+ self.frame = oldLib and oldLib.frame or CreateFrame("Frame")
+ self.frame:UnregisterAllEvents()
+ self.frame:RegisterEvent("ADDON_LOADED")
+ self.frame:SetScript("OnEvent", function()
+ for major, instance in LibStub:IterateLibraries() do
+ manuallyFinalize(major, instance)
+ end
+ end)
+ for major, instance in LibStub:IterateLibraries() do
+ manuallyFinalize(major, instance)
+ end
+
+ -- Expose the library in the global environment
+ _G[ACELIBRARY_MAJOR] = self
+
+ if oldDeactivate then
+ oldDeactivate(oldLib)
+ end
+end
+
+if not previous then
+ previous = AceLibrary
+end
+if not previous.libs then
+ previous.libs = {}
+end
+AceLibrary.libs = previous.libs
+if not previous.positions then
+ previous.positions = setmetatable({}, { __mode = "k" })
+end
+AceLibrary.positions = previous.positions
+AceLibrary:Register(AceLibrary, ACELIBRARY_MAJOR, ACELIBRARY_MINOR, activate, nil)
diff --git a/AtlasLoot/Libs/DewdropLib/AceLibrary/AceLibrary.toc b/AtlasLoot/Libs/DewdropLib/AceLibrary/AceLibrary.toc
new file mode 100644
index 0000000..77f0cf3
--- /dev/null
+++ b/AtlasLoot/Libs/DewdropLib/AceLibrary/AceLibrary.toc
@@ -0,0 +1,15 @@
+## Interface: 30300
+## X-Curse-Packaged-Version: r1101
+## X-Curse-Project-Name: Ace2
+## X-Curse-Project-ID: ace2
+## X-Curse-Repository-ID: wow/ace2/mainline
+
+## Title: Lib: AceLibrary
+## Notes: AddOn development framework
+## Author: Ace Development Team
+## X-Website: http://www.wowace.com
+## X-Category: Library
+## X-License: LGPL v2.1 + MIT for AceOO-2.0
+
+AceLibrary.lua
+
diff --git a/AtlasLoot/Libs/DewdropLib/Dewdrop-2.0/Dewdrop-2.0.lua b/AtlasLoot/Libs/DewdropLib/Dewdrop-2.0/Dewdrop-2.0.lua
new file mode 100644
index 0000000..76da9e7
--- /dev/null
+++ b/AtlasLoot/Libs/DewdropLib/Dewdrop-2.0/Dewdrop-2.0.lua
@@ -0,0 +1,3498 @@
+--[[
+Name: Dewdrop-2.0
+Revision: $Rev: 321 $
+Author(s): ckknight (ckknight@gmail.com)
+Website: http://ckknight.wowinterface.com/
+Documentation: http://wiki.wowace.com/index.php/Dewdrop-2.0
+SVN: http://svn.wowace.com/root/trunk/DewdropLib/Dewdrop-2.0
+Description: A library to provide a clean dropdown menu interface.
+Dependencies: AceLibrary
+License: LGPL v2.1
+]]
+
+local MAJOR_VERSION = "Dewdrop-2.0"
+local MINOR_VERSION = tonumber(strmatch("$Revision: 321 $", "%d+")) + 90000
+
+if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end
+if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end
+
+local Dewdrop = {}
+
+local SharedMedia
+
+local CLOSE = "Close"
+local CLOSE_DESC = "Close the menu."
+local VALIDATION_ERROR = "Validation error."
+local USAGE_TOOLTIP = "Usage: %s."
+local RANGE_TOOLTIP = "Note that you can scroll your mouse wheel while over the slider to step by one."
+local RESET_KEYBINDING_DESC = "Hit escape to clear the keybinding."
+local KEY_BUTTON1 = "Left Mouse"
+local KEY_BUTTON2 = "Right Mouse"
+local DISABLED = "Disabled"
+local DEFAULT_CONFIRM_MESSAGE = "Are you sure you want to perform `%s'?"
+
+if GetLocale() == "deDE" then
+ CLOSE = "Schlie\195\159en"
+ CLOSE_DESC = "Men\195\188 schlie\195\159en."
+ VALIDATION_ERROR = "Validierungsfehler."
+ USAGE_TOOLTIP = "Benutzung: %s."
+ RANGE_TOOLTIP = "Beachte das du mit dem Mausrad scrollen kannst solange du mit dem Mauszeiger \195\188ber dem Schieberegler bist, um feinere Spr\195\188nge zu machen."
+ RESET_KEYBINDING_DESC = "Escape dr\195\188cken, um die Tastenbelegung zu l\195\182schen."
+ KEY_BUTTON1 = "Linke Maustaste"
+ KEY_BUTTON2 = "Rechte Maustaste"
+ DISABLED = "Deaktiviert"
+ DEFAULT_CONFIRM_MESSAGE = "Bist du sicher das du `%s' machen willst?"
+elseif GetLocale() == "koKR" then
+ CLOSE = "닫기"
+ CLOSE_DESC = "메뉴를 닫습니다."
+ VALIDATION_ERROR = "오류 확인."
+ USAGE_TOOLTIP = "사용법: %s."
+ RANGE_TOOLTIP = "알림 : 슬라이더 위에서 마우스 휠을 사용하면 한단계씩 조절할 수 있습니다."
+ RESET_KEYBINDING_DESC = "단축키를 해제하려면 ESC키를 누르세요."
+ KEY_BUTTON1 = "왼쪽 마우스"
+ KEY_BUTTON2 = "오른쪽 마우스"
+ DISABLED = "비활성화됨"
+ DEFAULT_CONFIRM_MESSAGE = "정말로 `%s' 실행을 하시겠습니까 ?"
+elseif GetLocale() == "frFR" then
+ CLOSE = "Fermer"
+ CLOSE_DESC = "Ferme le menu."
+ VALIDATION_ERROR = "Erreur de validation."
+ USAGE_TOOLTIP = "Utilisation : %s."
+ RANGE_TOOLTIP = "Vous pouvez aussi utiliser la molette de la souris pour pour modifier progressivement."
+ RESET_KEYBINDING_DESC = "Appuyez sur la touche Echappement pour effacer le raccourci."
+ KEY_BUTTON1 = "Clic gauche"
+ KEY_BUTTON2 = "Clic droit"
+ DISABLED = "D\195\169sactiv\195\169"
+ DEFAULT_CONFIRM_MESSAGE = "\195\138tes-vous s\195\187r de vouloir effectuer '%s' ?"
+elseif GetLocale() == "esES" then
+ CLOSE = "Cerrar"
+ CLOSE_DESC = "Cierra el menú."
+ VALIDATION_ERROR = "Error de validación."
+ USAGE_TOOLTIP = "Uso: %s."
+ RANGE_TOOLTIP = "Puedes desplazarte verticalmente con la rueda del ratón sobre el desplazador."
+ RESET_KEYBINDING_DESC = "Pulsa Escape para borrar la asignación de tecla."
+ KEY_BUTTON1 = "Clic Izquierdo"
+ KEY_BUTTON2 = "Clic Derecho"
+ DISABLED = "Desactivado"
+ DEFAULT_CONFIRM_MESSAGE = "¿Estás seguro de querer realizar `%s'?"
+elseif GetLocale() == "zhTW" then
+ CLOSE = "關閉"
+ CLOSE_DESC = "關閉選單。"
+ VALIDATION_ERROR = "驗證錯誤。"
+ USAGE_TOOLTIP = "用法: %s。"
+ RANGE_TOOLTIP = "你可以在捲動條上使用滑鼠滾輪來捲動。"
+ RESET_KEYBINDING_DESC = "按Esc鍵清除快捷鍵。"
+ KEY_BUTTON1 = "滑鼠左鍵"
+ KEY_BUTTON2 = "滑鼠右鍵"
+ DISABLED = "停用"
+ DEFAULT_CONFIRM_MESSAGE = "是否執行「%s」?"
+elseif GetLocale() == "zhCN" then
+ CLOSE = "关闭"
+ CLOSE_DESC = "关闭菜单"
+ VALIDATION_ERROR = "验证错误."
+ USAGE_TOOLTIP = "用法: %s."
+ RANGE_TOOLTIP = "你可以在滚动条上使用鼠标滚轮来翻页."
+ RESET_KEYBINDING_DESC = "按ESC键清除按键绑定"
+ KEY_BUTTON1 = "鼠标左键"
+ KEY_BUTTON2 = "鼠标右键"
+ DISABLED = "禁用"
+ DEFAULT_CONFIRM_MESSAGE = "是否执行'%s'?"
+elseif GetLocale() == "ruRU" then
+ CLOSE = "Закрыть"
+ CLOSE_DESC = "Закрыть меню."
+ VALIDATION_ERROR = "Ошибка проверки данных."
+ USAGE_TOOLTIP = "Используйте: %s."
+ RANGE_TOOLTIP = "Используйте колесо мыши для прокрутки ползунка."
+ RESET_KEYBINDING_DESC = "Нажмите клавишу Escape для очистки клавиши."
+ KEY_BUTTON1 = "ЛКМ"
+ KEY_BUTTON2 = "ПКМ"
+ DISABLED = "Отключено"
+ DEFAULT_CONFIRM_MESSAGE = "Вы уверены что вы хотите выполнять `%s'?"
+end
+
+Dewdrop.KEY_BUTTON1 = KEY_BUTTON1
+Dewdrop.KEY_BUTTON2 = KEY_BUTTON2
+
+local function new(...)
+ local t = {}
+ for i = 1, select('#', ...), 2 do
+ local k = select(i, ...)
+ if k then
+ t[k] = select(i+1, ...)
+ else
+ break
+ end
+ end
+ return t
+end
+
+local tmp
+do
+ local t = {}
+ function tmp(...)
+ for k in pairs(t) do
+ t[k] = nil
+ end
+ for i = 1, select('#', ...), 2 do
+ local k = select(i, ...)
+ if k then
+ t[k] = select(i+1, ...)
+ else
+ break
+ end
+ end
+ return t
+ end
+end
+local tmp2
+do
+ local t = {}
+ function tmp2(...)
+ for k in pairs(t) do
+ t[k] = nil
+ end
+ for i = 1, select('#', ...), 2 do
+ local k = select(i, ...)
+ if k then
+ t[k] = select(i+1, ...)
+ else
+ break
+ end
+ end
+ return t
+ end
+end
+local levels
+local buttons
+
+
+-- Secure frame handling:
+-- Rather than using secure buttons in the menu (has problems), we have one
+-- master secureframe that we pop onto menu items on mouseover. This requires
+-- some dark magic with OnLeave etc, but it's not too bad.
+
+local secureFrame = CreateFrame("Button", nil, nil, "SecureActionButtonTemplate")
+secureFrame:Hide()
+
+local function secureFrame_Show(self)
+ local owner = self.owner
+
+ if self.secure then -- Leftovers from previos owner, clean up! ("Shouldn't" happen but does..)
+ for k,v in pairs(self.secure) do
+ self:SetAttribute(k, nil)
+ end
+ end
+ self.secure = owner.secure; -- Grab hold of new secure data
+
+ local scale = owner:GetEffectiveScale()
+
+ self:SetPoint("TOPLEFT", nil, "BOTTOMLEFT", owner:GetLeft() * scale, owner:GetTop() * scale)
+ self:SetPoint("BOTTOMRIGHT", nil, "BOTTOMLEFT", owner:GetRight() * scale, owner:GetBottom() * scale)
+ self:EnableMouse(true)
+ for k,v in pairs(self.secure) do
+ self:SetAttribute(k, v)
+ end
+
+ secureFrame:SetFrameStrata(owner:GetFrameStrata())
+ secureFrame:SetFrameLevel(owner:GetFrameLevel()+1)
+
+ self:Show()
+end
+
+local function secureFrame_Hide(self)
+ self:Hide()
+ if self.secure then
+ for k,v in pairs(self.secure) do
+ self:SetAttribute(k, nil)
+ end
+ end
+ self.secure = nil
+end
+
+secureFrame:SetScript("OnEvent",
+ function()
+ if event=="PLAYER_REGEN_ENABLED" then
+ this.combat = false
+ if not this:IsShown() and this.owner then
+ secureFrame_Show(this)
+ end
+ elseif event=="PLAYER_REGEN_DISABLED" then
+ this.combat = true
+ if this:IsShown() then
+ secureFrame_Hide(this)
+ end
+ end
+ end
+)
+secureFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
+secureFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
+
+secureFrame:SetScript("OnLeave",
+ function()
+ local owner=this.owner
+ this:Deactivate()
+ owner:GetScript("OnLeave")()
+ end
+)
+
+secureFrame:HookScript("OnClick",
+ function()
+ local realthis = this
+ this = this.owner
+ this:GetScript("OnClick")()
+ end
+)
+
+function secureFrame:IsOwnedBy(frame)
+ return self.owner == frame
+end
+
+function secureFrame:Activate(owner)
+ if self.owner then -- "Shouldn't" happen but apparently it does and I cba to troubleshoot...
+ if not self.combat then
+ secureFrame_Hide(self)
+ end
+ end
+ self.owner = owner
+ if not self.combat then
+ secureFrame_Show(self)
+ end
+end
+
+function secureFrame:Deactivate()
+ if not self.combat then
+ secureFrame_Hide(self)
+ end
+ self.owner = nil
+end
+
+-- END secure frame utilities
+
+
+-- Underline on mouseover - use a single global underline that we move around, no point in creating lots of copies
+local underlineFrame = CreateFrame("Frame", nil)
+underlineFrame.tx = underlineFrame:CreateTexture()
+underlineFrame.tx:SetTexture(1,1,0.5,0.75)
+underlineFrame:SetScript("OnHide", function(this) this:Hide(); end)
+underlineFrame:SetScript("OnShow", function(this) -- change sizing on the fly to catch runtime uiscale changes
+ underlineFrame.tx:SetPoint("TOPLEFT", -1, -2/this:GetEffectiveScale())
+ underlineFrame.tx:SetPoint("RIGHT", 1,0)
+ underlineFrame.tx:SetHeight(0.6 / this:GetEffectiveScale());
+end)
+underlineFrame:SetHeight(1)
+
+-- END underline on mouseover
+
+
+local function GetScaledCursorPosition()
+ local x, y = GetCursorPosition()
+ local scale = UIParent:GetEffectiveScale()
+ return x / scale, y / scale
+end
+
+local function StartCounting(self, level)
+ for i = level, 1, -1 do
+ if levels[i] then
+ levels[i].count = 3
+ end
+ end
+end
+
+local function StopCounting(self, level)
+ for i = level, 1, -1 do
+ if levels[i] then
+ levels[i].count = nil
+ end
+ end
+end
+
+local function OnUpdate(self, elapsed)
+ for _,level in ipairs(levels) do
+ local count = level.count
+ if count then
+ count = count - elapsed
+ if count < 0 then
+ level.count = nil
+ self:Close(level.num)
+ else
+ level.count = count
+ end
+ end
+ end
+end
+
+local function CheckDualMonitor(self, frame)
+ local ratio = GetScreenWidth() / GetScreenHeight()
+ if ratio >= 2.4 and frame:GetRight() > GetScreenWidth() / 2 and frame:GetLeft() < GetScreenWidth() / 2 then
+ local offsetx
+ if GetCursorPosition() / GetScreenHeight() * 768 < GetScreenWidth() / 2 then
+ offsetx = GetScreenWidth() / 2 - frame:GetRight()
+ else
+ offsetx = GetScreenWidth() / 2 - frame:GetLeft()
+ end
+ local point, parent, relativePoint, x, y = frame:GetPoint(1)
+ frame:SetPoint(point, parent, relativePoint, (x or 0) + offsetx, y or 0)
+ end
+end
+
+local function CheckSize(self, level)
+ if not level.buttons then
+ return
+ end
+ local height = 20
+ for _, button in ipairs(level.buttons) do
+ height = height + button:GetHeight()
+ end
+ level:SetHeight(height)
+ local width = 160
+ for _, button in ipairs(level.buttons) do
+ local extra = 1
+ if button.hasArrow or button.hasColorSwatch then
+ extra = extra + 16
+ end
+ if not button.notCheckable then
+ extra = extra + 24
+ end
+ button.text:SetFont(STANDARD_TEXT_FONT, button.textHeight)
+ if button.text:GetWidth() + extra > width then
+ width = button.text:GetWidth() + extra
+ end
+ end
+ level:SetWidth(width + 20)
+ if level:GetLeft() and level:GetRight() and level:GetTop() and level:GetBottom() and (level:GetLeft() < 0 or level:GetRight() > GetScreenWidth() or level:GetTop() > GetScreenHeight() or level:GetBottom() < 0) then
+ level:ClearAllPoints()
+ local parent = level.parent or level:GetParent()
+ if type(parent) ~= "table" then
+ parent = UIParent
+ end
+ if level.lastDirection == "RIGHT" then
+ if level.lastVDirection == "DOWN" then
+ level:SetPoint("TOPLEFT", parent, "TOPRIGHT", 5, 10)
+ else
+ level:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", 5, -10)
+ end
+ else
+ if level.lastVDirection == "DOWN" then
+ level:SetPoint("TOPRIGHT", parent, "TOPLEFT", -5, 10)
+ else
+ level:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, -10)
+ end
+ end
+ end
+ local dirty = false
+ if not level:GetRight() then
+ self:Close()
+ return
+ end
+ if level:GetRight() > GetScreenWidth() and level.lastDirection == "RIGHT" then
+ level.lastDirection = "LEFT"
+ dirty = true
+ elseif level:GetLeft() < 0 and level.lastDirection == "LEFT" then
+ level.lastDirection = "RIGHT"
+ dirty = true
+ end
+ if level:GetTop() > GetScreenHeight() and level.lastVDirection == "UP" then
+ level.lastVDirection = "DOWN"
+ dirty = true
+ elseif level:GetBottom() < 0 and level.lastVDirection == "DOWN" then
+ level.lastVDirection = "UP"
+ dirty = true
+ end
+ if dirty then
+ level:ClearAllPoints()
+ local parent = level.parent or level:GetParent()
+ if type(parent) ~= "table" then
+ parent = UIParent
+ end
+ if level.lastDirection == "RIGHT" then
+ if level.lastVDirection == "DOWN" then
+ level:SetPoint("TOPLEFT", parent, "TOPRIGHT", 5, 10)
+ else
+ level:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", 5, -10)
+ end
+ else
+ if level.lastVDirection == "DOWN" then
+ level:SetPoint("TOPRIGHT", parent, "TOPLEFT", -5, 10)
+ else
+ level:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, -10)
+ end
+ end
+ end
+ if level:GetTop() > GetScreenHeight() then
+ local top = level:GetTop()
+ local point, parent, relativePoint, x, y = level:GetPoint(1)
+ level:ClearAllPoints()
+ level:SetPoint(point, parent, relativePoint, x or 0, (y or 0) + GetScreenHeight() - top)
+ elseif level:GetBottom() < 0 then
+ local bottom = level:GetBottom()
+ local point, parent, relativePoint, x, y = level:GetPoint(1)
+ level:ClearAllPoints()
+ level:SetPoint(point, parent, relativePoint, x or 0, (y or 0) - bottom)
+ end
+ CheckDualMonitor(self, level)
+ if mod(level.num, 5) == 0 then
+ local left, bottom = level:GetLeft(), level:GetBottom()
+ level:ClearAllPoints()
+ level:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", left, bottom)
+ end
+end
+
+local Open
+local OpenSlider
+local OpenEditBox
+local Refresh
+local Clear
+local function ReleaseButton(self, level, index)
+ if not level.buttons then
+ return
+ end
+ if not level.buttons[index] then
+ return
+ end
+ local button = level.buttons[index]
+ button:Hide()
+ if button.highlight then
+ button.highlight:Hide()
+ end
+-- button.arrow:SetVertexColor(1, 1, 1)
+-- button.arrow:SetHeight(16)
+-- button.arrow:SetWidth(16)
+ table.remove(level.buttons, index)
+ table.insert(buttons, button)
+ for k in pairs(button) do
+ if k ~= 0 and k ~= "text" and k ~= "check" and k ~= "arrow" and k ~= "colorSwatch" and k ~= "highlight" and k ~= "radioHighlight" then
+ button[k] = nil
+ end
+ end
+ return true
+end
+
+local function Scroll(self, level, down)
+ if down then
+ if level:GetBottom() < 0 then
+ local point, parent, relativePoint, x, y = level:GetPoint(1)
+ level:SetPoint(point, parent, relativePoint, x, y + 50)
+ if level:GetBottom() > 0 then
+ level:SetPoint(point, parent, relativePoint, x, y + 50 - level:GetBottom())
+ end
+ end
+ else
+ if level:GetTop() > GetScreenHeight() then
+ local point, parent, relativePoint, x, y = level:GetPoint(1)
+ level:SetPoint(point, parent, relativePoint, x, y - 50)
+ if level:GetTop() < GetScreenHeight() then
+ level:SetPoint(point, parent, relativePoint, x, y - 50 + GetScreenHeight() - level:GetTop())
+ end
+ end
+ end
+end
+
+local function getArgs(t, str, num, ...)
+ local x = t[str .. num]
+ if x == nil then
+ return ...
+ else
+ return x, getArgs(t, str, num + 1, ...)
+ end
+end
+
+local sliderFrame
+local editBoxFrame
+
+local normalFont
+local lastSetFont
+local justSetFont = false
+local regionTmp = {}
+local function fillRegionTmp(...)
+ for i = 1, select('#', ...) do
+ regionTmp[i] = select(i, ...)
+ end
+end
+
+local function showGameTooltip(this)
+ if this.tooltipTitle or this.tooltipText then
+ GameTooltip_SetDefaultAnchor(GameTooltip, this)
+ local disabled = not this.isTitle and this.disabled
+ local font
+ if this.tooltipTitle then
+ if SharedMedia and SharedMedia:IsValid("font", this.tooltipTitle) then
+ font = SharedMedia:Fetch("font", this.tooltipTitle)
+ end
+ if disabled then
+ GameTooltip:SetText(this.tooltipTitle, 0.5, 0.5, 0.5, 1)
+ else
+ GameTooltip:SetText(this.tooltipTitle, 1, 1, 1, 1)
+ end
+ if this.tooltipText then
+ if not font and SharedMedia and SharedMedia:IsValid("font", this.tooltipText) then
+ font = SharedMedia:Fetch("font", this.tooltipText)
+ end
+ if disabled then
+ GameTooltip:AddLine(this.tooltipText, (NORMAL_FONT_COLOR.r + 0.5) / 2, (NORMAL_FONT_COLOR.g + 0.5) / 2, (NORMAL_FONT_COLOR.b + 0.5) / 2, 1)
+ else
+ GameTooltip:AddLine(this.tooltipText, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1)
+ end
+ end
+ else
+ if SharedMedia and SharedMedia:IsValid("font", this.tooltipText) then
+ font = SharedMedia:Fetch("font", this.tooltipText)
+ end
+ if disabled then
+ GameTooltip:SetText(this.tooltipText, 0.5, 0.5, 0.5, 1)
+ else
+ GameTooltip:SetText(this.tooltipText, 1, 1, 1, 1)
+ end
+ end
+ if font then
+ fillRegionTmp(GameTooltip:GetRegions())
+ lastSetFont = font
+ justSetFont = true
+ for i,v in ipairs(regionTmp) do
+ if v.SetFont then
+ local norm,size,outline = v:GetFont()
+ v:SetFont(font, size, outline)
+ if not normalFont then
+ normalFont = norm
+ end
+ end
+ regionTmp[i] = nil
+ end
+ elseif not normalFont then
+ fillRegionTmp(GameTooltip:GetRegions())
+ for i,v in ipairs(regionTmp) do
+ if v.GetFont and not normalFont then
+ normalFont = v:GetFont()
+ end
+ regionTmp[i] = nil
+ end
+ end
+ GameTooltip:Show()
+ end
+ if this.tooltipFunc then
+ GameTooltip:SetOwner(this, "ANCHOR_NONE")
+ GameTooltip:SetPoint("TOPLEFT", this, "TOPRIGHT", 5, 0)
+ this.tooltipFunc(getArgs(this, 'tooltipArg', 1))
+ GameTooltip:Show()
+ end
+end
+
+local tmpt = setmetatable({}, {mode='v'})
+local numButtons = 0
+local function AcquireButton(self, level)
+ if not levels[level] then
+ return
+ end
+ level = levels[level]
+ if not level.buttons then
+ level.buttons = {}
+ end
+ local button
+ if #buttons == 0 then
+ numButtons = numButtons + 1
+ button = CreateFrame("Button", "Dewdrop20Button" .. numButtons, nil)
+ button:SetFrameStrata("FULLSCREEN_DIALOG")
+ button:SetHeight(16)
+ local highlight = button:CreateTexture(nil, "BACKGROUND")
+ highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
+ button.highlight = highlight
+ highlight:SetBlendMode("ADD")
+ highlight:SetAllPoints(button)
+ highlight:Hide()
+ local check = button:CreateTexture(nil, "ARTWORK")
+ button.check = check
+ check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
+ check:SetPoint("CENTER", button, "LEFT", 12, 0)
+ check:SetWidth(24)
+ check:SetHeight(24)
+ local radioHighlight = button:CreateTexture(nil, "ARTWORK")
+ button.radioHighlight = radioHighlight
+ radioHighlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
+ radioHighlight:SetAllPoints(check)
+ radioHighlight:SetBlendMode("ADD")
+ radioHighlight:SetTexCoord(0.5, 0.75, 0, 1)
+ radioHighlight:Hide()
+ button:SetScript("OnEnter", function()
+ if (sliderFrame and sliderFrame:IsShown() and sliderFrame.mouseDown and sliderFrame.level == this.level.num + 1) or (editBoxFrame and editBoxFrame:IsShown() and editBoxFrame.mouseDown and editBoxFrame.level == this.level.num + 1) then
+ for i = 1, this.level.num do
+ Refresh(self, levels[i])
+ end
+ return
+ end
+ self:Close(this.level.num + 1)
+ if not this.disabled then
+ if this.secure then
+ secureFrame:Activate(this)
+ elseif this.hasSlider then
+ OpenSlider(self, this)
+ elseif this.hasEditBox then
+ OpenEditBox(self, this)
+ elseif this.hasArrow then
+ Open(self, this, nil, this.level.num + 1, this.value)
+ end
+ end
+ if not this.level then -- button reclaimed
+ return
+ end
+ StopCounting(self, this.level.num + 1)
+ if not this.disabled then
+ highlight:Show()
+ if this.isRadio then
+ button.radioHighlight:Show()
+ end
+ if this.mouseoverUnderline then
+ underlineFrame:SetParent(this)
+ underlineFrame:SetPoint("BOTTOMLEFT",this.text,0,0)
+ underlineFrame:SetWidth(this.text:GetWidth())
+ underlineFrame:Show()
+ end
+ end
+ showGameTooltip(this)
+ end)
+ button:SetScript("OnHide", function()
+ if this.secure and secureFrame:IsOwnedBy(this) then
+ secureFrame:Deactivate()
+ end
+ end)
+ button:SetScript("OnLeave", function()
+ if this.secure and secureFrame:IsShown() then
+ return; -- it's ok, we didn't actually mouse out of the button, only onto the secure frame on top of it
+ end
+ underlineFrame:Hide()
+ if not this.selected then
+ highlight:Hide()
+ end
+ button.radioHighlight:Hide()
+ if this.level then
+ StartCounting(self, this.level.num)
+ end
+ GameTooltip:Hide()
+ end)
+ local first = true
+ button:SetScript("OnClick", function()
+ if not this.disabled then
+ if this.hasColorSwatch then
+ local func = button.colorFunc
+ local hasOpacity = this.hasOpacity
+ local this = this
+ for k in pairs(tmpt) do
+ tmpt[k] = nil
+ end
+ for i = 1, 1000 do
+ local x = this['colorArg'..i]
+ if x == nil then
+ break
+ else
+ tmpt[i] = x
+ end
+ end
+ ColorPickerFrame.func = function()
+ if func then
+ local r,g,b = ColorPickerFrame:GetColorRGB()
+ local a = hasOpacity and 1 - OpacitySliderFrame:GetValue() or nil
+ local n = #tmpt
+ tmpt[n+1] = r
+ tmpt[n+2] = g
+ tmpt[n+3] = b
+ tmpt[n+4] = a
+ func(unpack(tmpt))
+ tmpt[n+1] = nil
+ tmpt[n+2] = nil
+ tmpt[n+3] = nil
+ tmpt[n+4] = nil
+ end
+ end
+ ColorPickerFrame.hasOpacity = this.hasOpacity
+ ColorPickerFrame.opacityFunc = ColorPickerFrame.func
+ ColorPickerFrame.opacity = 1 - this.opacity
+ ColorPickerFrame:SetColorRGB(this.r, this.g, this.b)
+ local r, g, b, a = this.r, this.g, this.b, this.opacity
+ ColorPickerFrame.cancelFunc = function()
+ if func then
+ local n = #tmpt
+ tmpt[n+1] = r
+ tmpt[n+2] = g
+ tmpt[n+3] = b
+ tmpt[n+4] = a
+ func(unpack(tmpt))
+ for i = 1, n+4 do
+ tmpt[i] = nil
+ end
+ end
+ end
+ self:Close(1)
+ ShowUIPanel(ColorPickerFrame)
+ elseif this.func then
+ local level = this.level
+ if type(this.func) == "string" then
+ if type(this.arg1[this.func]) ~= "function" then
+ self:error("Cannot call method %q", this.func)
+ end
+ this.arg1[this.func](this.arg1, getArgs(this, 'arg', 2))
+ else
+ this.func(getArgs(this, 'arg', 1))
+ end
+ if this.closeWhenClicked then
+ self:Close()
+ elseif level:IsShown() then
+ for i = 1, level.num do
+ Refresh(self, levels[i])
+ end
+ local value = levels[level.num].value
+ for i = level.num-1, 1, -1 do
+ local level = levels[i]
+ local good = false
+ for _,button in ipairs(level.buttons) do
+ if button.value == value then
+ good = true
+ break
+ end
+ end
+ if not good then
+ Dewdrop:Close(i+1)
+ end
+ value = levels[i].value
+ end
+ end
+ elseif this.closeWhenClicked then
+ self:Close()
+ end
+ end
+ end)
+ local text = button:CreateFontString(nil, "ARTWORK")
+ button.text = text
+ text:SetFontObject(GameFontHighlightSmall)
+ button.text:SetFont(STANDARD_TEXT_FONT, UIDROPDOWNMENU_DEFAULT_TEXT_HEIGHT)
+ button:SetScript("OnMouseDown", function()
+ if not this.disabled and (this.func or this.colorFunc or this.closeWhenClicked) then
+ text:SetPoint("LEFT", button, "LEFT", this.notCheckable and 1 or 25, -1)
+ end
+ end)
+ button:SetScript("OnMouseUp", function()
+ if not this.disabled and (this.func or this.colorFunc or this.closeWhenClicked) then
+ text:SetPoint("LEFT", button, "LEFT", this.notCheckable and 0 or 24, 0)
+ end
+ end)
+ local arrow = button:CreateTexture(nil, "ARTWORK")
+ button.arrow = arrow
+ arrow:SetPoint("LEFT", button, "RIGHT", -16, 0)
+ arrow:SetWidth(16)
+ arrow:SetHeight(16)
+ arrow:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
+ local colorSwatch = button:CreateTexture(nil, "ARTWORK")
+ button.colorSwatch = colorSwatch
+ colorSwatch:SetWidth(20)
+ colorSwatch:SetHeight(20)
+ colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch")
+ local texture = button:CreateTexture(nil, "OVERLAY")
+ colorSwatch.texture = texture
+ texture:SetTexture("Interface\\Buttons\\WHITE8X8")
+ texture:SetWidth(11.5)
+ texture:SetHeight(11.5)
+ texture:Show()
+ texture:SetPoint("CENTER", colorSwatch, "CENTER")
+ colorSwatch:SetPoint("RIGHT", button, "RIGHT", 0, 0)
+ else
+ button = table.remove(buttons)
+ end
+ button:ClearAllPoints()
+ button:SetParent(level)
+ button:SetFrameStrata(level:GetFrameStrata())
+ button:SetFrameLevel(level:GetFrameLevel() + 1)
+ button:SetPoint("LEFT", level, "LEFT", 10, 0)
+ button:SetPoint("RIGHT", level, "RIGHT", -10, 0)
+ if #level.buttons == 0 then
+ button:SetPoint("TOP", level, "TOP", 0, -10)
+ else
+ button:SetPoint("TOP", level.buttons[#level.buttons], "BOTTOM", 0, 0)
+ end
+ button.text:SetPoint("LEFT", button, "LEFT", 24, 0)
+ button:Show()
+ button.level = level
+ table.insert(level.buttons, button)
+ if not level.parented then
+ level.parented = true
+ level:ClearAllPoints()
+ if level.num == 1 then
+ if level.parent ~= UIParent and type(level.parent) == "table" then
+ level:SetPoint("TOPRIGHT", level.parent, "TOPLEFT")
+ else
+ level:SetPoint("CENTER", UIParent, "CENTER")
+ end
+ else
+ if level.lastDirection == "RIGHT" then
+ if level.lastVDirection == "DOWN" then
+ level:SetPoint("TOPLEFT", level.parent, "TOPRIGHT", 5, 10)
+ else
+ level:SetPoint("BOTTOMLEFT", level.parent, "BOTTOMRIGHT", 5, -10)
+ end
+ else
+ if level.lastVDirection == "DOWN" then
+ level:SetPoint("TOPRIGHT", level.parent, "TOPLEFT", -5, 10)
+ else
+ level:SetPoint("BOTTOMRIGHT", level.parent, "BOTTOMLEFT", -5, -10)
+ end
+ end
+ end
+ level:SetFrameStrata("FULLSCREEN_DIALOG")
+ end
+ button:SetAlpha(1)
+ return button
+end
+
+local numLevels = 0
+local function AcquireLevel(self, level)
+ if not levels[level] then
+ for i = #levels + 1, level, -1 do
+ local i = i
+ numLevels = numLevels + 1
+ local frame = CreateFrame("Button", "Dewdrop20Level" .. numLevels, nil)
+ if i == 1 then
+ local old_CloseSpecialWindows = CloseSpecialWindows
+ function CloseSpecialWindows()
+ local found = old_CloseSpecialWindows()
+ if levels[1]:IsShown() then
+ self:Close()
+ return 1
+ end
+ return found
+ end
+ end
+ levels[i] = frame
+ frame.num = i
+ frame:SetParent(UIParent)
+ frame:SetFrameStrata("FULLSCREEN_DIALOG")
+ frame:Hide()
+ frame:SetWidth(180)
+ frame:SetHeight(10)
+ frame:SetFrameLevel(i * 3)
+ frame:SetScript("OnHide", function()
+ self:Close(level + 1)
+ end)
+ if frame.SetTopLevel then
+ frame:SetTopLevel(true)
+ end
+ frame:EnableMouse(true)
+ frame:EnableMouseWheel(true)
+ local backdrop = CreateFrame("Frame", nil, frame)
+ backdrop:SetAllPoints(frame)
+ backdrop:SetBackdrop(tmp(
+ 'bgFile', "Interface\\Tooltips\\UI-Tooltip-Background",
+ 'edgeFile', "Interface\\Tooltips\\UI-Tooltip-Border",
+ 'tile', true,
+ 'insets', tmp2(
+ 'left', 5,
+ 'right', 5,
+ 'top', 5,
+ 'bottom', 5
+ ),
+ 'tileSize', 16,
+ 'edgeSize', 16
+ ))
+ backdrop:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b)
+ backdrop:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b)
+ frame:SetScript("OnClick", function()
+ self:Close(i)
+ end)
+ frame:SetScript("OnEnter", function()
+ StopCounting(self, i)
+ end)
+ frame:SetScript("OnLeave", function()
+ StartCounting(self, i)
+ end)
+ frame:SetScript("OnMouseWheel", function()
+ Scroll(self, frame, arg1 < 0)
+ end)
+ if i == 1 then
+ frame:SetScript("OnUpdate", function(this, arg1)
+ OnUpdate(self, arg1)
+ end)
+ levels[1].lastDirection = "RIGHT"
+ levels[1].lastVDirection = "DOWN"
+ else
+ levels[i].lastDirection = levels[i - 1].lastDirection
+ levels[i].lastVDirection = levels[i - 1].lastVDirection
+ end
+ end
+ end
+ local fullscreenFrame = GetUIPanel("fullscreen")
+ local l = levels[level]
+ local strata, framelevel = l:GetFrameStrata(), l:GetFrameLevel()
+ if fullscreenFrame then
+ l:SetParent(fullscreenFrame)
+ else
+ l:SetParent(UIParent)
+ end
+ l:SetFrameStrata(strata)
+ l:SetFrameLevel(framelevel)
+ l:SetAlpha(1)
+ return l
+end
+
+local function validateOptions(options, position, baseOptions, fromPass)
+ if not baseOptions then
+ baseOptions = options
+ end
+ if type(options) ~= "table" then
+ return "Options must be a table.", position
+ end
+ local kind = options.type
+ if type(kind) ~= "string" then
+ return '"type" must be a string.', position
+ elseif kind ~= "group" and kind ~= "range" and kind ~= "text" and kind ~= "execute" and kind ~= "toggle" and kind ~= "color" and kind ~= "dragLink" and kind ~= "header" then
+ return '"type" must either be "range", "text", "group", "toggle", "execute", "color", "dragLink", or "header".', position
+ end
+ if options.aliases then
+ if type(options.aliases) ~= "table" and type(options.aliases) ~= "string" then
+ return '"alias" must be a table or string', position
+ end
+ end
+ if not fromPass then
+ if kind == "execute" then
+ if type(options.func) ~= "string" and type(options.func) ~= "function" then
+ return '"func" must be a string or function', position
+ end
+ elseif kind == "range" or kind == "text" or kind == "toggle" then
+ if type(options.set) ~= "string" and type(options.set) ~= "function" then
+ return '"set" must be a string or function', position
+ end
+ if kind == "text" and options.get == false then
+ elseif type(options.get) ~= "string" and type(options.get) ~= "function" then
+ return '"get" must be a string or function', position
+ end
+ elseif kind == "group" and options.pass then
+ if options.pass ~= true then
+ return '"pass" must be either nil, true, or false', position
+ end
+ if not options.func then
+ if type(options.set) ~= "string" and type(options.set) ~= "function" then
+ return '"set" must be a string or function', position
+ end
+ if type(options.get) ~= "string" and type(options.get) ~= "function" then
+ return '"get" must be a string or function', position
+ end
+ elseif type(options.func) ~= "string" and type(options.func) ~= "function" then
+ return '"func" must be a string or function', position
+ end
+ end
+ end
+ if options ~= baseOptions then
+ if kind == "header" then
+ elseif type(options.desc) ~= "string" then
+ return '"desc" must be a string', position
+ elseif options.desc:len() == 0 then
+ return '"desc" cannot be a 0-length string', position
+ end
+ end
+ if options ~= baseOptions or kind == "range" or kind == "text" or kind == "toggle" or kind == "color" then
+ if options.type == "header" and not options.cmdName and not options.name then
+ elseif options.cmdName then
+ if type(options.cmdName) ~= "string" then
+ return '"cmdName" must be a string or nil', position
+ elseif options.cmdName:len() == 0 then
+ return '"cmdName" cannot be a 0-length string', position
+ end
+ if type(options.guiName) ~= "string" then
+ if not options.guiNameIsMap then
+ return '"guiName" must be a string or nil', position
+ end
+ elseif options.guiName:len() == 0 then
+ return '"guiName" cannot be a 0-length string', position
+ end
+ else
+ if type(options.name) ~= "string" then
+ return '"name" must be a string', position
+ elseif options.name:len() == 0 then
+ return '"name" cannot be a 0-length string', position
+ end
+ end
+ end
+ if options.guiNameIsMap then
+ if type(options.guiNameIsMap) ~= "boolean" then
+ return '"guiNameIsMap" must be a boolean or nil', position
+ elseif options.type ~= "toggle" then
+ return 'if "guiNameIsMap" is true, then "type" must be set to \'toggle\'', position
+ elseif type(options.map) ~= "table" then
+ return '"map" must be a table', position
+ end
+ end
+ if options.message and type(options.message) ~= "string" then
+ return '"message" must be a string or nil', position
+ end
+ if options.error and type(options.error) ~= "string" then
+ return '"error" must be a string or nil', position
+ end
+ if options.current and type(options.current) ~= "string" then
+ return '"current" must be a string or nil', position
+ end
+ if options.order then
+ if type(options.order) ~= "number" or (-1 < options.order and options.order < 0.999) then
+ return '"order" must be a non-zero number or nil', position
+ end
+ end
+ if options.disabled then
+ if type(options.disabled) ~= "function" and type(options.disabled) ~= "string" and options.disabled ~= true then
+ return '"disabled" must be a function, string, or boolean', position
+ end
+ end
+ if options.cmdHidden then
+ if type(options.cmdHidden) ~= "function" and type(options.cmdHidden) ~= "string" and options.cmdHidden ~= true then
+ return '"cmdHidden" must be a function, string, or boolean', position
+ end
+ end
+ if options.guiHidden then
+ if type(options.guiHidden) ~= "function" and type(options.guiHidden) ~= "string" and options.guiHidden ~= true then
+ return '"guiHidden" must be a function, string, or boolean', position
+ end
+ end
+ if options.hidden then
+ if type(options.hidden) ~= "function" and type(options.hidden) ~= "string" and options.hidden ~= true then
+ return '"hidden" must be a function, string, or boolean', position
+ end
+ end
+ if kind == "text" then
+ if type(options.validate) == "table" then
+ local t = options.validate
+ local iTable = nil
+ for k,v in pairs(t) do
+ if type(k) == "number" then
+ if iTable == nil then
+ iTable = true
+ elseif not iTable then
+ return '"validate" must either have all keys be indexed numbers or strings', position
+ elseif k < 1 or k > #t then
+ return '"validate" numeric keys must be indexed properly. >= 1 and <= #t', position
+ end
+ else
+ if iTable == nil then
+ iTable = false
+ elseif iTable then
+ return '"validate" must either have all keys be indexed numbers or strings', position
+ end
+ end
+ if type(v) ~= "string" then
+ return '"validate" values must all be strings', position
+ end
+ end
+ if options.multiToggle and options.multiToggle ~= true then
+ return '"multiToggle" must be a boolean or nil if "validate" is a table', position
+ end
+ elseif options.validate == "keybinding" then
+ -- no other checks
+ else
+ if type(options.usage) ~= "string" then
+ return '"usage" must be a string', position
+ elseif options.validate and type(options.validate) ~= "string" and type(options.validate) ~= "function" then
+ return '"validate" must be a string, function, or table', position
+ end
+ end
+ if options.multiToggle and type(options.validate) ~= "table" then
+ return '"validate" must be a table if "multiToggle" is true', position
+ end
+ elseif kind == "range" then
+ if options.min or options.max then
+ if type(options.min) ~= "number" then
+ return '"min" must be a number', position
+ elseif type(options.max) ~= "number" then
+ return '"max" must be a number', position
+ elseif options.min >= options.max then
+ return '"min" must be less than "max"', position
+ end
+ end
+ if options.step then
+ if type(options.step) ~= "number" then
+ return '"step" must be a number', position
+ elseif options.step < 0 then
+ return '"step" must be nonnegative', position
+ end
+ end
+ if options.bigStep then
+ if type(options.bigStep) ~= "number" then
+ return '"bigStep" must be a number', position
+ elseif options.bigStep < 0 then
+ return '"bigStep" must be nonnegative', position
+ end
+ end
+ if options.isPercent and options.isPercent ~= true then
+ return '"isPercent" must either be nil, true, or false', position
+ end
+ elseif kind == "toggle" then
+ if options.map then
+ if type(options.map) ~= "table" then
+ return '"map" must be a table', position
+ elseif type(options.map[true]) ~= "string" then
+ return '"map[true]" must be a string', position
+ elseif type(options.map[false]) ~= "string" then
+ return '"map[false]" must be a string', position
+ end
+ end
+ elseif kind == "color" then
+ if options.hasAlpha and options.hasAlpha ~= true then
+ return '"hasAlpha" must be nil, true, or false', position
+ end
+ elseif kind == "group" then
+ if options.pass and options.pass ~= true then
+ return '"pass" must be nil, true, or false', position
+ end
+ if type(options.args) ~= "table" then
+ return '"args" must be a table', position
+ end
+ for k,v in pairs(options.args) do
+ if type(k) ~= "number" then
+ if type(k) ~= "string" then
+ return '"args" keys must be strings or numbers', position
+ elseif k:len() == 0 then
+ return '"args" keys must not be 0-length strings.', position
+ end
+ end
+ if type(v) ~= "table" then
+ return '"args" values must be tables', position and position .. "." .. k or k
+ end
+ local newposition
+ if position then
+ newposition = position .. ".args." .. k
+ else
+ newposition = "args." .. k
+ end
+ local err, pos = validateOptions(v, newposition, baseOptions, options.pass)
+ if err then
+ return err, pos
+ end
+ end
+ elseif kind == "execute" then
+ if type(options.confirm) ~= "string" and type(options.confirm) ~= "boolean" and type(options.confirm) ~= "nil" then
+ return '"confirm" must be a string, boolean, or nil', position
+ end
+ end
+ if options.icon and type(options.icon) ~= "string" then
+ return'"icon" must be a string', position
+ end
+ if options.iconWidth or options.iconHeight then
+ if type(options.iconWidth) ~= "number" or type(options.iconHeight) ~= "number" then
+ return '"iconHeight" and "iconWidth" must be numbers', position
+ end
+ end
+ if options.iconCoordLeft or options.iconCoordRight or options.iconCoordTop or options.iconCoordBottom then
+ if type(options.iconCoordLeft) ~= "number" or type(options.iconCoordRight) ~= "number" or type(options.iconCoordTop) ~= "number" or type(options.iconCoordBottom) ~= "number" then
+ return '"iconCoordLeft", "iconCoordRight", "iconCoordTop", and "iconCoordBottom" must be numbers', position
+ end
+ end
+end
+
+local validatedOptions
+
+local values
+local mysort_args
+local mysort
+local othersort
+local othersort_validate
+
+local baseFunc, currentLevel
+
+local function confirmPopup(message, func, ...)
+ if not StaticPopupDialogs["DEWDROP20_CONFIRM_DIALOG"] then
+ StaticPopupDialogs["DEWDROP20_CONFIRM_DIALOG"] = {}
+ end
+ local t = StaticPopupDialogs["DEWDROP20_CONFIRM_DIALOG"]
+ for k in pairs(t) do
+ t[k] = nil
+ end
+ t.text = message
+ t.button1 = ACCEPT or "Accept"
+ t.button2 = CANCEL or "Cancel"
+ t.OnAccept = function()
+ func(unpack(t))
+ end
+ for i = 1, select('#', ...) do
+ t[i] = select(i, ...)
+ end
+ t.timeout = 0
+ t.whileDead = 1
+ t.hideOnEscape = 1
+
+ Dewdrop:Close()
+ StaticPopup_Show("DEWDROP20_CONFIRM_DIALOG")
+end
+
+
+local function getMethod(settingname, handler, v, methodName, ...) -- "..." is simply returned straight out cause you can't do "a,b,c = 111,f(),222"
+ assert(v and type(v)=="table")
+ assert(methodName and type(methodName)=="string")
+
+ local method = v[methodName]
+ if type(method)=="function" then
+ return method, ...
+ elseif type(method)=="string" then
+ if not handler then
+ Dewdrop:error("[%s] 'handler' is required if providing a method name: %q", tostring(settingname), method)
+ elseif not handler[method] then
+ Dewdrop:error("[%s] 'handler' method %q not defined", tostring(settingname), method)
+ end
+ return handler[method], handler, ...
+ end
+
+ Dewdrop:error("[%s] Missing %q directive", tostring(settingname), methodName)
+end
+
+local function callMethod(settingname, handler, v, methodName, ...)
+ assert(v and type(v)=="table")
+ assert(methodName and type(methodName)=="string")
+
+ local method = v[methodName]
+ if type(method)=="function" then
+ local success, ret,ret2,ret3,ret4 = pcall(v[methodName], ...)
+ if not success then
+ geterrorhandler()(ret)
+ return nil
+ end
+ return ret,ret2,ret3,ret4
+
+ elseif type(method)=="string" then
+
+ local neg = method:match("^~(.-)$")
+ if neg then
+ method = neg
+ end
+ if not handler then
+ Dewdrop:error("[%s] 'handler' is required if providing a method name: %q", tostring(settingname), method)
+ elseif not handler[method] then
+ Dewdrop:error("[%s] 'handler' (%q) method %q not defined", tostring(settingname), handler.name or "(unnamed)", method)
+ end
+ local success, ret,ret2,ret3,ret4 = pcall(handler[method], handler, ...)
+ if not success then
+ geterrorhandler()(ret)
+ return nil
+ end
+ if neg then
+ return not ret
+ end
+ return ret,ret2,ret3,ret4
+ elseif method == false then
+ return nil
+ end
+
+ Dewdrop:error("[%s] Missing %q directive in %q", tostring(settingname), methodName, v.name or "(unnamed)")
+end
+
+local function skip1Nil(...)
+ if select(1,...)==nil then
+ return select(2,...)
+ end
+ return ...
+end
+
+function Dewdrop:FeedAceOptionsTable(options, difference)
+ self:argCheck(options, 2, "table")
+ self:argCheck(difference, 3, "nil", "number")
+ if not currentLevel then
+ self:error("Cannot call `FeedAceOptionsTable' outside of a Dewdrop declaration")
+ end
+ if not difference then
+ difference = 0
+ end
+ if not validatedOptions then
+ validatedOptions = {}
+ end
+ if not validatedOptions[options] then
+ local err, position = validateOptions(options)
+
+ if err then
+ if position then
+ Dewdrop:error(position .. ": " .. err)
+ else
+ Dewdrop:error(err)
+ end
+ end
+
+ validatedOptions[options] = true
+ end
+ local level = levels[currentLevel]
+ if not level then
+ self:error("Improper level given")
+ end
+ if not values then
+ values = {}
+ else
+ for k,v in pairs(values) do
+ values[k] = nil
+ end
+ end
+
+ local current = level
+ while current do -- this traverses from higher level numbers to lower, building "values" with leaf nodes first and trunk nodes later
+ if current.num == difference + 1 then
+ break
+ end
+ table.insert(values, current.value)
+ current = levels[current.num - 1]
+ end
+
+ local realOptions = options
+ local handler = options.handler
+ local passTable
+ local passValue
+ while #values > 0 do -- This loop traverses values from the END (trunk nodes first, then onto leaf nodes)
+ if options.pass then
+ if options.get and options.set then
+ passTable = options
+ elseif not passTable then
+ passTable = options
+ end
+ else
+ passTable = nil
+ end
+ local value = table.remove(values)
+ options = options.args and options.args[value]
+ if not options then
+ return
+ end
+ handler = options.handler or handler
+ passValue = passTable and value or nil
+ end
+
+ if options.type == "group" then
+ local hidden = options.hidden
+ if type(hidden) == "function" or type(hidden) == "string" then
+ hidden = callMethod(options.name or "(options root)", handler, options, "hidden", options.passValue) or false
+ end
+ if hidden then
+ return
+ end
+ local disabled = options.disabled
+ if type(disabled) == "function" or type(disabled) == "string" then
+ disabled = callMethod(options.name or "(options root)", handler, options, "disabled", options.passValue) or false
+ end
+ if disabled then
+ self:AddLine(
+ 'text', DISABLED,
+ 'disabled', true
+ )
+ return
+ end
+ for k in pairs(options.args) do
+ table.insert(values, k)
+ end
+ if options.pass then
+ if options.get and options.set then
+ passTable = options
+ elseif not passTable then
+ passTable = options
+ end
+ else
+ passTable = nil
+ end
+ if not mysort then
+ mysort = function(a, b)
+ local alpha, bravo = mysort_args[a], mysort_args[b]
+ local alpha_order = alpha.order or 100
+ local bravo_order = bravo.order or 100
+ local alpha_name = alpha.guiName or alpha.name
+ local bravo_name = bravo.guiName or bravo.name
+ if alpha_order == bravo_order then
+ if not alpha_name then
+ return bravo_name
+ elseif not bravo_name then
+ return false
+ else
+ return alpha_name:gsub("|c%x%x%x%x%x%x%x%x", ""):gsub("|r", ""):upper() < bravo_name:gsub("|c%x%x%x%x%x%x%x%x", ""):gsub("|r", ""):upper()
+ end
+ else
+ if alpha_order < 0 then
+ if bravo_order > 0 then
+ return false
+ end
+ else
+ if bravo_order < 0 then
+ return true
+ end
+ end
+ return alpha_order < bravo_order
+ end
+ end
+ end
+ mysort_args = options.args
+ table.sort(values, mysort)
+ mysort_args = nil
+ local hasBoth = #values >= 1 and (options.args[values[1]].order or 100) > 0 and (options.args[values[#values]].order or 100) < 0
+ local last_order = 1
+ for _,k in ipairs(values) do
+ local v = options.args[k]
+ local handler = v.handler or handler
+ if hasBoth and last_order > 0 and (v.order or 100) < 0 then
+ hasBoth = false
+ self:AddLine()
+ end
+ local hidden, disabled = v.guiHidden or v.hidden, v.disabled
+
+ if type(hidden) == "function" or type(hidden) == "string" then
+ hidden = callMethod(k, handler, v, "hidden", v.passValue) or false
+ end
+ if not hidden then
+ if type(disabled) == "function" or type(disabled) == "string" then
+ disabled = callMethod(k, handler, v, "disabled", v.passValue) or false
+ end
+ local name = (v.guiIconOnly and v.icon) and "" or (v.guiName or v.name)
+ local desc = v.guiDesc or v.desc
+ local iconHeight = v.iconHeight or 16
+ local iconWidth = v.iconWidth or 16
+ local iconCoordLeft = v.iconCoordLeft
+ local iconCoordRight = v.iconCoordRight
+ local iconCoordBottom = v.iconCoordBottom
+ local iconCoordTop = v.iconCoordTop
+ local tooltipTitle, tooltipText
+ tooltipTitle = name
+ if name ~= desc then
+ tooltipText = desc
+ end
+ if type(v.usage) == "string" and v.usage:trim():len() > 0 then
+ if tooltipText then
+ tooltipText = tooltipText .. "\n\n" .. USAGE_TOOLTIP:format(v.usage)
+ else
+ tooltipText = USAGE_TOOLTIP:format(v.usage)
+ end
+ end
+ local v_p = passTable
+ if not v_p or (v.type ~= "execute" and v.get and v.set) or (v.type == "execute" and v.func) then
+ v_p = v
+ end
+ local passValue = v.passValue or (v_p~=v and k) or nil
+ if v.type == "toggle" then
+ local checked = callMethod(name, handler, v_p, "get", passValue) or false
+ local checked_arg = checked
+ if type(v_p.get)=="string" and v_p.get:match("^~") then
+ checked_arg = not checked
+ end
+ local func, arg1, arg2, arg3 = getMethod(name, handler, v_p, "set", skip1Nil(passValue, not checked_arg))
+ if v.guiNameIsMap then
+ checked = checked and true or false
+ name = tostring(v.map and v.map[checked]):gsub("|c%x%x%x%x%x%x%x%x(.-)|r", "%1")
+ tooltipTitle = name
+ checked = true--nil
+ end
+ self:AddLine(
+ 'text', name,
+ 'checked', checked,
+ 'isRadio', v.isRadio,
+ 'func', func,
+ 'arg1', arg1,
+ 'arg2', arg2,
+ 'arg3', arg3,
+ 'disabled', disabled,
+ 'tooltipTitle', tooltipTitle,
+ 'tooltipText', tooltipText
+ )
+ elseif v.type == "execute" then
+ local func, arg1, arg2, arg3, arg4
+ local confirm = v.confirm
+ if confirm == true then
+ confirm = DEFAULT_CONFIRM_MESSAGE:format(tooltipText or tooltipTitle)
+ func,arg1,arg2,arg3,arg4 = confirmPopup, confirm, getMethod(name, handler, v_p, "func", passValue)
+ elseif type(confirm) == "string" then
+ func,arg1,arg2,arg3,arg4 = confirmPopup, confirm, getMethod(name, handler, v_p, "func", passValue)
+ else
+ func,arg1,arg2 = getMethod(name, handler, v_p, "func", passValue)
+ end
+ self:AddLine(
+ 'text', name,
+ 'checked', checked,
+ 'func', func,
+ 'arg1', arg1,
+ 'arg2', arg2,
+ 'arg3', arg3,
+ 'arg4', arg4,
+ 'disabled', disabled,
+ 'tooltipTitle', tooltipTitle,
+ 'tooltipText', tooltipText,
+ 'icon', v.icon,
+ 'iconHeight', iconHeight,
+ 'iconWidth', iconWidth,
+ 'iconCoordLeft', iconCoordLeft,
+ 'iconCoordRight', iconCoordRight,
+ 'iconCoordTop', iconCoordTop,
+ 'iconCoordBottom', iconCoordBottom
+ )
+ elseif v.type == "range" then
+ local sliderValue
+ sliderValue = callMethod(name, handler, v_p, "get", passValue) or 0
+ local sliderFunc, sliderArg1, sliderArg2 = getMethod(name, handler, v_p, "set", passValue)
+ if tooltipText then
+ tooltipText = format("%s\n\n%s", tooltipText, RANGE_TOOLTIP)
+ else
+ tooltipText = RANGE_TOOLTIP
+ end
+ self:AddLine(
+ 'text', name,
+ 'hasArrow', true,
+ 'hasSlider', true,
+ 'sliderMin', v.min or 0,
+ 'sliderMax', v.max or 1,
+ 'sliderStep', v.step or 0,
+ 'sliderBigStep', v.bigStep or nil,
+ 'sliderIsPercent', v.isPercent or false,
+ 'sliderValue', sliderValue,
+ 'sliderFunc', sliderFunc,
+ 'sliderArg1', sliderArg1,
+ 'sliderArg2', sliderArg2,
+ 'fromAceOptions', true,
+ 'disabled', disabled,
+ 'tooltipTitle', tooltipTitle,
+ 'tooltipText', tooltipText,
+ 'icon', v.icon,
+ 'iconHeight', iconHeight,
+ 'iconWidth', iconWidth,
+ 'iconCoordLeft', iconCoordLeft,
+ 'iconCoordRight', iconCoordRight,
+ 'iconCoordTop', iconCoordTop,
+ 'iconCoordBottom', iconCoordBottom
+ )
+ elseif v.type == "color" then
+ local r,g,b,a = callMethod(name, handler, v_p, "get", passValue)
+ if not r then
+ r,g,b,a = 0,0,0,0
+ end
+ local colorFunc, colorArg1, colorArg2 = getMethod(name, handler, v_p, "set", passValue)
+ self:AddLine(
+ 'text', name,
+ 'hasArrow', true,
+ 'hasColorSwatch', true,
+ 'r', r,
+ 'g', g,
+ 'b', b,
+ 'opacity', v.hasAlpha and a or nil,
+ 'hasOpacity', v.hasAlpha,
+ 'colorFunc', colorFunc,
+ 'colorArg1', colorArg1,
+ 'colorArg2', colorArg2,
+ 'disabled', disabled,
+ 'tooltipTitle', tooltipTitle,
+ 'tooltipText', tooltipText
+ )
+ elseif v.type == "text" then
+ if type(v.validate) == "table" then
+ local func,arg1,arg2
+ if v.onClick then
+ func,arg1,arg2 = getMethod(name, handler, v, "onClick", passValue)
+ end
+ local checked
+ if v.isChecked then
+ checked = callMethod(name, handler, v, "isChecked", passValue) or false
+ end
+ self:AddLine(
+ 'text', name,
+ 'hasArrow', true,
+ 'value', k,
+ 'func', func,
+ 'arg1', arg1,
+ 'arg2', arg2,
+ 'mouseoverUnderline', func and true or nil,
+ 'disabled', disabled,
+ 'checked', checked,
+ 'tooltipTitle', tooltipTitle,
+ 'tooltipText', tooltipText,
+ 'icon', v.icon,
+ 'iconHeight', iconHeight,
+ 'iconWidth', iconWidth,
+ 'iconCoordLeft', iconCoordLeft,
+ 'iconCoordRight', iconCoordRight,
+ 'iconCoordTop', iconCoordTop,
+ 'iconCoordBottom', iconCoordBottom
+ )
+ else
+ local editBoxText
+ editBoxText = callMethod(name, handler, v_p, "get", passValue) or ""
+ local editBoxFunc, editBoxArg1, editBoxArg2 = getMethod(name, handler, v_p, "set", passValue)
+
+ local editBoxValidateFunc, editBoxValidateArg1
+
+ if v.validate and v.validate ~= "keybinding" then
+ if v.validate == "keybinding" then
+ if tooltipText then
+ tooltipText = format("%s\n\n%s", tooltipText, RESET_KEYBINDING_DESC)
+ else
+ tooltipText = RESET_KEYBINDING_DESC
+ end
+ else
+ editBoxValidateFunc, editBoxValidateArg1 = getMethod(name, handler, v, "validate") -- no passvalue!
+ end
+ end
+
+ self:AddLine(
+ 'text', name,
+ 'hasArrow', true,
+ 'icon', v.icon,
+ 'iconHeight', iconHeight,
+ 'iconWidth', iconWidth,
+ 'iconCoordLeft', iconCoordLeft,
+ 'iconCoordRight', iconCoordRight,
+ 'iconCoordTop', iconCoordTop,
+ 'iconCoordBottom', iconCoordBottom,
+ 'hasEditBox', true,
+ 'editBoxText', editBoxText,
+ 'editBoxFunc', editBoxFunc,
+ 'editBoxArg1', editBoxArg1,
+ 'editBoxArg2', editBoxArg2,
+ 'editBoxValidateFunc', editBoxValidateFunc,
+ 'editBoxValidateArg1', editBoxValidateArg1,
+ 'editBoxIsKeybinding', v.validate == "keybinding",
+ 'editBoxKeybindingOnly', v.keybindingOnly,
+ 'editBoxKeybindingExcept', v.keybindingExcept,
+ 'disabled', disabled,
+ 'tooltipTitle', tooltipTitle,
+ 'tooltipText', tooltipText
+ )
+ end
+ elseif v.type == "group" then
+ local func,arg1,arg2
+ if v.onClick then
+ func,arg1,arg2 = getMethod(name, handler, v, "onClick", passValue)
+ end
+ local checked
+ if v.isChecked then
+ checked = callMethod(name, handler, v, "isChecked", passValue) or false
+ end
+ self:AddLine(
+ 'text', name,
+ 'hasArrow', true,
+ 'value', k,
+ 'func', func,
+ 'arg1', arg1,
+ 'arg2', arg2,
+ 'mouseoverUnderline', func and true or nil,
+ 'disabled', disabled,
+ 'checked', checked,
+ 'tooltipTitle', tooltipTitle,
+ 'tooltipText', tooltipText,
+ 'icon', v.icon,
+ 'iconHeight', iconHeight,
+ 'iconWidth', iconWidth,
+ 'iconCoordLeft', iconCoordLeft,
+ 'iconCoordRight', iconCoordRight,
+ 'iconCoordTop', iconCoordTop,
+ 'iconCoordBottom', iconCoordBottom
+ )
+ elseif v.type == "header" then
+ if name == "" or not name then
+ self:AddLine(
+ 'isTitle', true,
+ 'icon', v.icon,
+ 'iconHeight', iconHeight,
+ 'iconWidth', iconWidth,
+ 'iconCoordLeft', iconCoordLeft,
+ 'iconCoordRight', iconCoordRight,
+ 'iconCoordTop', iconCoordTop,
+ 'iconCoordBottom', iconCoordBottom
+ )
+ else
+ self:AddLine(
+ 'text', name,
+ 'isTitle', true,
+ 'icon', v.icon,
+ 'iconHeight', iconHeight,
+ 'iconWidth', iconWidth,
+ 'iconCoordLeft', iconCoordLeft,
+ 'iconCoordRight', iconCoordRight,
+ 'iconCoordTop', iconCoordTop,
+ 'iconCoordBottom', iconCoordBottom
+ )
+ end
+ end
+ end
+ last_order = v.order or 100
+ end
+ elseif options.type == "text" and type(options.validate) == "table" then
+ local current
+ local options_p = passTable
+ if not options_p or (options.get and options.set) then
+ options_p = options
+ passTable = nil
+ passValue = nil
+ end
+ local multiToggle = options.multiToggle
+ local passValue = options.passValue or passValue
+ if not multiToggle then
+ current = callMethod(k, handler, options_p, "get", passValue)
+ end
+ local indexed = true
+ for k,v in pairs(options.validate) do
+ if type(k) ~= "number" then
+ indexed = false
+ end
+ table.insert(values, k)
+ end
+ if not indexed then
+ if not othersort then
+ othersort = function(alpha, bravo)
+ return othersort_validate[alpha]:gsub("|c%x%x%x%x%x%x%x%x", ""):gsub("|r", ""):upper() < othersort_validate[bravo]:gsub("|c%x%x%x%x%x%x%x%x", ""):gsub("|r", ""):upper()
+ end
+ end
+ othersort_validate = options.validate
+ table.sort(values, othersort)
+ othersort_validate = nil
+ end
+ for _,k in ipairs(values) do
+ local v = options.validate[k]
+ if type(k) == "number" then
+ k = v
+ end
+ local func, arg1, arg2, arg3, arg4 = getMethod(k, handler, options_p, "set", skip1Nil(passValue, k))
+ local checked
+ if multiToggle then
+ checked = callMethod(k, handler, options_p, "get", skip1Nil(passValue, k)) or false
+ if arg2 == nil then
+ arg2 = not checked
+ elseif arg3 == nil then
+ arg3 = not checked
+ else
+ arg4 = not checked
+ end
+ else
+ checked = (k == current or (type(k) == "string" and type(current) == "string" and k:lower() == current:lower()))
+ if checked then
+ func, arg1, arg2, arg3, arg4 = nil, nil, nil, nil, nil
+ end
+ end
+ local tooltipTitle
+ local tooltipText
+ if options.validateDesc then
+ tooltipTitle = v
+ tooltipText = options.validateDesc[k]
+ else
+ tooltipTitle = options.guiName or options.name
+ tooltipText = v
+ end
+ self:AddLine(
+ 'text', v,
+ 'func', func,
+ 'arg1', arg1,
+ 'arg2', arg2,
+ 'arg3', arg3,
+ 'arg4', arg4,
+ 'isRadio', not multiToggle,
+ 'checked', checked,
+ 'tooltipTitle', tooltipTitle,
+ 'tooltipText', tooltipText
+ )
+ end
+ for k in pairs(values) do
+ values[k] = nil
+ end
+ else
+ return false
+ end
+ return true
+end
+
+function Dewdrop:FeedTable(s, difference)
+ self:argCheck(s, 2, "table")
+ self:argCheck(difference, 3, "nil", "number")
+ if not currentLevel then
+ self:error("Cannot call `FeedTable' outside of a Dewdrop declaration")
+ end
+ if not difference then
+ difference = 0
+ end
+ local level = levels[currentLevel]
+ if not level then
+ self:error("Improper level given")
+ end
+ if not values then
+ values = {}
+ else
+ for k,v in pairs(values) do
+ values[k] = nil
+ end
+ end
+ local t = s.subMenu and s or {subMenu = s}
+ local current = level
+ while current do
+ if current.num == difference + 1 then
+ break
+ end
+ table.insert(values, current.value)
+ current = levels[current.num - 1]
+ end
+
+ while #values > 0 do
+ local value = table.remove(values)
+ t = t.subMenu and t.subMenu[value]
+ if not t then
+ return
+ end
+ end
+
+ if t.subMenu or current.num == 1 then
+ for k in pairs(t.subMenu) do
+ table.insert(values, k)
+ end
+ table.sort(values)
+ for _,k in ipairs(values) do
+ local argTable = {"value", k}
+ for key, val in pairs(t.subMenu[k]) do
+ table.insert(argTable, key)
+ table.insert(argTable, val)
+ end
+ self:AddLine(unpack(argTable))
+ end
+ for k in pairs(values) do
+ values[k] = nil
+ end
+ return false
+ end
+ return true
+end
+
+function Refresh(self, level)
+ if type(level) == "number" then
+ level = levels[level]
+ end
+ if not level then
+ return
+ end
+ if baseFunc then
+ Clear(self, level)
+ currentLevel = level.num
+ if type(baseFunc) == "table" then
+ if currentLevel == 1 then
+ local handler = baseFunc.handler
+ if handler then
+ local name = tostring(handler)
+ if not name:find('^table:') and not handler.hideMenuTitle then
+ name = name:gsub("|c%x%x%x%x%x%x%x%x(.-)|r", "%1")
+ self:AddLine(
+ 'text', name,
+ 'isTitle', true
+ )
+ end
+ end
+-- elseif level.parentText then
+-- self:AddLine(
+-- 'text', level.parentText,
+-- 'tooltipTitle', level.parentTooltipTitle,
+-- 'tooltipText', level.parentTooltipText,
+-- 'tooltipFunc', level.parentTooltipFunc,
+-- 'isTitle', true
+-- )
+ end
+ self:FeedAceOptionsTable(baseFunc)
+ if currentLevel == 1 then
+ self:AddLine(
+ 'text', CLOSE,
+ 'tooltipTitle', CLOSE,
+ 'tooltipText', CLOSE_DESC,
+ 'closeWhenClicked', true
+ )
+ end
+ else
+-- if level.parentText then
+-- self:AddLine(
+-- 'text', level.parentText,
+-- 'tooltipTitle', level.parentTooltipTitle,
+-- 'tooltipText', level.parentTooltipText,
+-- 'tooltipFunc', level.parentTooltipFunc,
+-- 'isTitle', true
+-- )
+-- end
+ baseFunc(currentLevel, level.value, levels[level.num - 1] and levels[level.num - 1].value, levels[level.num - 2] and levels[level.num - 2].value, levels[level.num - 3] and levels[level.num - 3].value, levels[level.num - 4] and levels[level.num - 4].value)
+ end
+ currentLevel = nil
+ CheckSize(self, level)
+ end
+end
+
+function Dewdrop:Refresh(level)
+ self:argCheck(level, 2, "number", "nil")
+ if not level then
+ for k,v in pairs(levels) do
+ Refresh(self, v)
+ end
+ else
+ Refresh(self, levels[level])
+ end
+end
+
+function OpenSlider(self, parent)
+ if not sliderFrame then
+ sliderFrame = CreateFrame("Frame", nil, nil)
+ sliderFrame:SetWidth(100)
+ sliderFrame:SetHeight(170)
+ sliderFrame:SetScale(UIParent:GetScale())
+ sliderFrame:SetBackdrop(tmp(
+ 'bgFile', "Interface\\Tooltips\\UI-Tooltip-Background",
+ 'edgeFile', "Interface\\Tooltips\\UI-Tooltip-Border",
+ 'tile', true,
+ 'insets', tmp2(
+ 'left', 5,
+ 'right', 5,
+ 'top', 5,
+ 'bottom', 5
+ ),
+ 'tileSize', 16,
+ 'edgeSize', 16
+ ))
+ sliderFrame:SetFrameStrata("FULLSCREEN_DIALOG")
+ if sliderFrame.SetTopLevel then
+ sliderFrame:SetTopLevel(true)
+ end
+ sliderFrame:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b)
+ sliderFrame:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b)
+ sliderFrame:EnableMouse(true)
+ sliderFrame:EnableMouseWheel(true)
+ sliderFrame:Hide()
+ sliderFrame:SetPoint("CENTER", UIParent, "CENTER")
+ local slider = CreateFrame("Slider", nil, sliderFrame)
+ sliderFrame.slider = slider
+ slider:SetOrientation("VERTICAL")
+ slider:SetMinMaxValues(0, 1)
+ slider:SetValueStep(0.000000001)
+ slider:SetValue(0.5)
+ slider:SetWidth(16)
+ slider:SetHeight(128)
+ slider:SetPoint("LEFT", sliderFrame, "LEFT", 15, 0)
+ slider:SetBackdrop(tmp(
+ 'bgFile', "Interface\\Buttons\\UI-SliderBar-Background",
+ 'edgeFile', "Interface\\Buttons\\UI-SliderBar-Border",
+ 'tile', true,
+ 'edgeSize', 8,
+ 'tileSize', 8,
+ 'insets', tmp2(
+ 'left', 3,
+ 'right', 3,
+ 'top', 3,
+ 'bottom', 3
+ )
+ ))
+ local texture = slider:CreateTexture()
+ slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Vertical")
+ local text = slider:CreateFontString(nil, "ARTWORK")
+ sliderFrame.topText = text
+ text:SetFontObject(GameFontGreenSmall)
+ text:SetText("100%")
+ text:SetPoint("BOTTOM", slider, "TOP")
+ local text = slider:CreateFontString(nil, "ARTWORK")
+ sliderFrame.bottomText = text
+ text:SetFontObject(GameFontGreenSmall)
+ text:SetText("0%")
+ text:SetPoint("TOP", slider, "BOTTOM")
+ local editBox = CreateFrame("EditBox", nil, sliderFrame)
+ sliderFrame.currentText = editBox
+ editBox:SetFontObject(ChatFontNormal)
+ editBox:SetHeight(13)
+ editBox:SetPoint("RIGHT", sliderFrame, "RIGHT", -16, 0)
+ editBox:SetPoint("LEFT", slider, "RIGHT", 12, 0)
+ editBox:SetText("50%")
+ editBox:SetJustifyH("CENTER")
+
+ local width = editBox:GetWidth()/2 + 10
+ local left = editBox:CreateTexture(nil, "BACKGROUND")
+ left:SetTexture("Interface\\ChatFrame\\UI-ChatInputBorder-Left")
+ left:SetTexCoord(0, width / 256, 0, 1)
+ left:SetWidth(width)
+ left:SetHeight(32)
+ left:SetPoint("LEFT", editBox, "LEFT", -10, 0)
+ local right = editBox:CreateTexture(nil, "BACKGROUND")
+ right:SetTexture("Interface\\ChatFrame\\UI-ChatInputBorder-Right")
+ right:SetTexCoord(1 - width / 256, 1, 0, 1)
+ right:SetWidth(width)
+ right:SetHeight(32)
+ right:SetPoint("RIGHT", editBox, "RIGHT", 10, 0)
+
+ local changed = false
+ local inside = false
+ slider:SetScript("OnValueChanged", function()
+ if sliderFrame.changing then
+ return
+ end
+ changed = true
+ local done = false
+ if sliderFrame.parent and sliderFrame.parent.sliderFunc then
+ local min = sliderFrame.parent.sliderMin or 0
+ local max = sliderFrame.parent.sliderMax or 1
+ local step
+ if sliderFrame.fineStep then
+ step = sliderFrame.parent.sliderStep or (max - min) / 100
+ else
+ step = sliderFrame.parent.sliderBigStep or sliderFrame.parent.sliderStep or (max - min) / 100
+ end
+ local value = (1 - slider:GetValue()) * (max - min) + min
+ if step > 0 then
+ value = math.floor((value - min) / step + 0.5) * step + min
+ if value > max then
+ value = max
+ elseif value < min then
+ value = min
+ end
+ end
+ if value == sliderFrame.lastValue then
+ return
+ end
+ sliderFrame.lastValue = value
+ local text = sliderFrame.parent.sliderFunc(getArgs(sliderFrame.parent, 'sliderArg', 1, value))
+ if sliderFrame.parent.fromAceOptions then
+ text = nil
+ elseif type(text) == "string" or type(text) == "number" then
+ sliderFrame.currentText:SetText(text)
+ done = true
+ end
+ end
+ if not done then
+ local min = sliderFrame.parent.sliderMin or 0
+ local max = sliderFrame.parent.sliderMax or 1
+ local step
+ if sliderFrame.fineStep then
+ step = sliderFrame.parent.sliderStep or (max - min) / 100
+ else
+ step = sliderFrame.parent.sliderBigStep or sliderFrame.parent.sliderStep or (max - min) / 100
+ end
+ local value = (1 - slider:GetValue()) * (max - min) + min
+ if step > 0 then
+ value = math.floor((value - min) / step + 0.5) * step + min
+ if value > max then
+ value = max
+ elseif value < min then
+ value = min
+ end
+ end
+ if sliderFrame.parent.sliderIsPercent then
+ sliderFrame.currentText:SetText(string.format("%.0f%%", value * 100))
+ else
+ if step < 0.1 then
+ sliderFrame.currentText:SetText(string.format("%.2f", value))
+ elseif step < 1 then
+ sliderFrame.currentText:SetText(string.format("%.1f", value))
+ else
+ sliderFrame.currentText:SetText(string.format("%.0f", value))
+ end
+ end
+ end
+ end)
+ local function onEnter()
+ StopCounting(self, sliderFrame.level)
+ showGameTooltip(sliderFrame.parent)
+ end
+ local function onLeave()
+ GameTooltip:Hide()
+ end
+ sliderFrame:SetScript("OnEnter", onEnter)
+ sliderFrame:SetScript("OnLeave", function()
+ GameTooltip:Hide()
+ if changed then
+ local parent = sliderFrame.parent
+ local sliderFunc = parent.sliderFunc
+ for i = 1, sliderFrame.level - 1 do
+ Refresh(self, levels[i])
+ end
+ local newParent
+ for _,button in ipairs(levels[sliderFrame.level-1].buttons) do
+ if button.sliderFunc == sliderFunc then
+ newParent = button
+ break
+ end
+ end
+ if newParent then
+ OpenSlider(self, newParent)
+ else
+ sliderFrame:Hide()
+ end
+ end
+ end)
+ editBox:SetScript("OnEnter", onEnter)
+ editBox:SetScript("OnLeave", onLeave)
+ slider:SetScript("OnMouseDown", function()
+ sliderFrame.mouseDown = true
+ GameTooltip:Hide()
+ end)
+ slider:SetScript("OnMouseUp", function()
+ sliderFrame.mouseDown = false
+ if changed--[[ and not inside]] then
+ local parent = sliderFrame.parent
+ local sliderFunc = parent.sliderFunc
+ for i = 1, sliderFrame.level - 1 do
+ Refresh(self, levels[i])
+ end
+ local newParent
+ for _,button in ipairs(levels[sliderFrame.level-1].buttons) do
+ if button.sliderFunc == sliderFunc then
+ newParent = button
+ break
+ end
+ end
+ if newParent then
+ OpenSlider(self, newParent)
+ else
+ sliderFrame:Hide()
+ end
+ end
+ if inside then
+ showGameTooltip(sliderFrame.parent)
+ end
+ end)
+ slider:SetScript("OnEnter", function()
+ inside = true
+ StopCounting(self, sliderFrame.level)
+ showGameTooltip(sliderFrame.parent)
+ end)
+ slider:SetScript("OnLeave", function()
+ inside = false
+ GameTooltip:Hide()
+ if changed and not sliderFrame.mouseDown then
+ local parent = sliderFrame.parent
+ local sliderFunc = parent.sliderFunc
+ for i = 1, sliderFrame.level - 1 do
+ Refresh(self, levels[i])
+ end
+ local newParent
+ for _,button in ipairs(levels[sliderFrame.level-1].buttons) do
+ if button.sliderFunc == sliderFunc then
+ newParent = button
+ break
+ end
+ end
+ if newParent then
+ OpenSlider(self, newParent)
+ else
+ sliderFrame:Hide()
+ end
+
+ changed = false
+ end
+ end)
+ sliderFrame:SetScript("OnMouseWheel", function(t, a1)
+ local arg1 = a1 or arg1
+ local up = arg1 > 0
+
+ local min = sliderFrame.parent.sliderMin or 0
+ local max = sliderFrame.parent.sliderMax or 1
+ local step = sliderFrame.parent.sliderStep or (max - min) / 100
+ if step <= 0 then
+ step = (max - min) / 100
+ end
+
+ local value = (1 - slider:GetValue()) * (max - min) + min
+ if up then
+ value = value + step
+ else
+ value = value - step
+ end
+ if value > max then
+ value = max
+ elseif value < min then
+ value = min
+ end
+ sliderFrame.fineStep = true
+ if max<=min then
+ slider:SetValue(0)
+ else
+ slider:SetValue(1 - (value - min) / (max - min))
+ end
+ sliderFrame.fineStep = nil
+ end)
+ slider:SetScript("OnMouseWheel", sliderFrame:GetScript("OnMouseWheel"))
+ editBox:SetScript("OnEnterPressed", function(t, a1)
+ local value = editBox:GetNumber()
+
+ if sliderFrame.parent.sliderIsPercent then
+ value = value / 100
+ end
+
+ local min = sliderFrame.parent.sliderMin or 0
+ local max = sliderFrame.parent.sliderMax or 1
+
+ if value > max then
+ value = max
+ elseif value < min then
+ value = min
+ end
+ sliderFrame.fineStep = true
+ if max <= min then
+ slider:SetValue(0)
+ else
+ slider:SetValue(1 - (value - min) / (max - min))
+ end
+ sliderFrame.fineStep = nil
+
+ StartCounting(self, sliderFrame.level)
+ end)
+ editBox:SetScript("OnEscapePressed", function()
+ self:Close(sliderFrame.level)
+ StartCounting(self, sliderFrame.level)
+ end)
+ editBox:SetAutoFocus(false)
+ end
+ sliderFrame.parent = parent
+ sliderFrame.level = parent.level.num + 1
+ sliderFrame.parentValue = parent.level.value
+ sliderFrame:SetFrameLevel(parent.level:GetFrameLevel() + 3)
+ sliderFrame.slider:SetFrameLevel(sliderFrame:GetFrameLevel() + 1)
+ sliderFrame.currentText:SetFrameLevel(sliderFrame:GetFrameLevel() + 1)
+ sliderFrame.currentText:ClearFocus()
+ sliderFrame.changing = true
+ if not parent.sliderMin or not parent.sliderMax then
+ return
+ end
+
+ if parent.arrow then
+-- parent.arrow:SetVertexColor(0.2, 0.6, 0)
+-- parent.arrow:SetHeight(24)
+-- parent.arrow:SetWidth(24)
+ parent.selected = true
+ parent.highlight:Show()
+ end
+
+ sliderFrame:SetClampedToScreen(false)
+ if not parent.sliderValue then
+ parent.sliderValue = (parent.sliderMin + parent.sliderMax) / 2
+ end
+ if parent.sliderMax <= parent.sliderMin then
+ sliderFrame.slider:SetValue(0)
+ else
+ sliderFrame.slider:SetValue(1 - (parent.sliderValue - parent.sliderMin) / (parent.sliderMax - parent.sliderMin))
+ end
+ sliderFrame.changing = false
+ sliderFrame.bottomText:SetText(parent.sliderMinText or "0")
+ sliderFrame.topText:SetText(parent.sliderMaxText or "1")
+ local text
+ if parent.sliderFunc and not parent.fromAceOptions then
+ text = parent.sliderFunc(getArgs(parent, 'sliderArg', 1, parent.sliderValue))
+ end
+ if type(text) == "number" or type(text) == "string" then
+ sliderFrame.currentText:SetText(text)
+ elseif parent.sliderIsPercent then
+ sliderFrame.currentText:SetText(string.format("%.0f%%", parent.sliderValue * 100))
+ else
+ if parent.sliderStep < 0.1 then
+ sliderFrame.currentText:SetText(string.format("%.2f", parent.sliderValue))
+ elseif parent.sliderStep < 1 then
+ sliderFrame.currentText:SetText(string.format("%.1f", parent.sliderValue))
+ else
+ sliderFrame.currentText:SetText(string.format("%.0f", parent.sliderValue))
+ end
+ end
+
+
+ sliderFrame.lastValue = parent.sliderValue
+
+ local level = parent.level
+ sliderFrame:Show()
+ sliderFrame:ClearAllPoints()
+ if level.lastDirection == "RIGHT" then
+ if level.lastVDirection == "DOWN" then
+ sliderFrame:SetPoint("TOPLEFT", parent, "TOPRIGHT", 5, 10)
+ else
+ sliderFrame:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", 5, -10)
+ end
+ else
+ if level.lastVDirection == "DOWN" then
+ sliderFrame:SetPoint("TOPRIGHT", parent, "TOPLEFT", -5, 10)
+ else
+ sliderFrame:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, -10)
+ end
+ end
+ local dirty
+ if level.lastDirection == "RIGHT" then
+ if sliderFrame:GetRight() > GetScreenWidth() then
+ level.lastDirection = "LEFT"
+ dirty = true
+ end
+ elseif sliderFrame:GetLeft() < 0 then
+ level.lastDirection = "RIGHT"
+ dirty = true
+ end
+ if level.lastVDirection == "DOWN" then
+ if sliderFrame:GetBottom() < 0 then
+ level.lastVDirection = "UP"
+ dirty = true
+ end
+ elseif sliderFrame:GetTop() > GetScreenWidth() then
+ level.lastVDirection = "DOWN"
+ dirty = true
+ end
+ if dirty then
+ sliderFrame:ClearAllPoints()
+ if level.lastDirection == "RIGHT" then
+ if level.lastVDirection == "DOWN" then
+ sliderFrame:SetPoint("TOPLEFT", parent, "TOPRIGHT", 5, 10)
+ else
+ sliderFrame:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", 5, -10)
+ end
+ else
+ if level.lastVDirection == "DOWN" then
+ sliderFrame:SetPoint("TOPRIGHT", parent, "TOPLEFT", -5, 10)
+ else
+ sliderFrame:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, -10)
+ end
+ end
+ end
+ local left, bottom = sliderFrame:GetLeft(), sliderFrame:GetBottom()
+ sliderFrame:ClearAllPoints()
+ sliderFrame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", left, bottom)
+ if mod(level.num, 5) == 0 then
+ local left, bottom = level:GetLeft(), level:GetBottom()
+ level:ClearAllPoints()
+ level:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", left, bottom)
+ end
+ sliderFrame:SetClampedToScreen(true)
+end
+
+function OpenEditBox(self, parent)
+ if not editBoxFrame then
+ editBoxFrame = CreateFrame("Frame", nil, nil)
+ editBoxFrame:SetWidth(200)
+ editBoxFrame:SetHeight(40)
+ editBoxFrame:SetScale(UIParent:GetScale())
+ editBoxFrame:SetBackdrop(tmp(
+ 'bgFile', "Interface\\Tooltips\\UI-Tooltip-Background",
+ 'edgeFile', "Interface\\Tooltips\\UI-Tooltip-Border",
+ 'tile', true,
+ 'insets', tmp2(
+ 'left', 5,
+ 'right', 5,
+ 'top', 5,
+ 'bottom', 5
+ ),
+ 'tileSize', 16,
+ 'edgeSize', 16
+ ))
+ editBoxFrame:SetFrameStrata("FULLSCREEN_DIALOG")
+ if editBoxFrame.SetTopLevel then
+ editBoxFrame:SetTopLevel(true)
+ end
+ editBoxFrame:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b)
+ editBoxFrame:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b)
+ editBoxFrame:EnableMouse(true)
+ editBoxFrame:EnableMouseWheel(true)
+ editBoxFrame:Hide()
+ editBoxFrame:SetPoint("CENTER", UIParent, "CENTER")
+
+ local editBox = CreateFrame("EditBox", nil, editBoxFrame)
+ editBoxFrame.editBox = editBox
+ editBox:SetFontObject(ChatFontNormal)
+ editBox:SetWidth(160)
+ editBox:SetHeight(13)
+ editBox:SetPoint("CENTER", editBoxFrame, "CENTER", 0, 0)
+
+ local left = editBox:CreateTexture(nil, "BACKGROUND")
+ left:SetTexture("Interface\\ChatFrame\\UI-ChatInputBorder-Left")
+ left:SetTexCoord(0, 100 / 256, 0, 1)
+ left:SetWidth(100)
+ left:SetHeight(32)
+ left:SetPoint("LEFT", editBox, "LEFT", -10, 0)
+ local right = editBox:CreateTexture(nil, "BACKGROUND")
+ right:SetTexture("Interface\\ChatFrame\\UI-ChatInputBorder-Right")
+ right:SetTexCoord(156/256, 1, 0, 1)
+ right:SetWidth(100)
+ right:SetHeight(32)
+ right:SetPoint("RIGHT", editBox, "RIGHT", 10, 0)
+
+ editBox:SetScript("OnEnterPressed", function()
+ if editBoxFrame.parent and editBoxFrame.parent.editBoxValidateFunc then
+ local t = editBox.realText or editBox:GetText() or ""
+ local result = editBoxFrame.parent.editBoxValidateFunc(getArgs(editBoxFrame.parent, 'editBoxValidateArg', 1, t))
+ if not result then
+ UIErrorsFrame:AddMessage(VALIDATION_ERROR, 1, 0, 0)
+ return
+ end
+ end
+ if editBoxFrame.parent and editBoxFrame.parent.editBoxFunc then
+ local t
+ if editBox.realText ~= "NONE" then
+ t = editBox.realText or editBox:GetText() or ""
+ end
+ editBoxFrame.parent.editBoxFunc(getArgs(editBoxFrame.parent, 'editBoxArg', 1, t))
+ end
+ self:Close(editBoxFrame.level)
+ for i = 1, editBoxFrame.level - 1 do
+ Refresh(self, levels[i])
+ end
+ StartCounting(self, editBoxFrame.level-1)
+ end)
+ editBox:SetScript("OnEscapePressed", function()
+ self:Close(editBoxFrame.level)
+ StartCounting(self, editBoxFrame.level-1)
+ end)
+ editBox:SetScript("OnReceiveDrag", function(this)
+ if GetCursorInfo then
+ local type, alpha, bravo = GetCursorInfo()
+ local text
+ if type == "spell" then
+ text = GetSpellName(alpha, bravo)
+ elseif type == "item" then
+ text = bravo
+ end
+ if not text then
+ return
+ end
+ ClearCursor()
+ editBox:SetText(text)
+ end
+ end)
+ local changing = false
+ local skipNext = false
+
+ function editBox:SpecialSetText(text)
+ local oldText = editBox:GetText() or ""
+ if not text then
+ text = ""
+ end
+ if text ~= oldText then
+ changing = true
+ self:SetText(tostring(text))
+ changing = false
+ skipNext = true
+ end
+ end
+
+ editBox:SetScript("OnTextChanged", function()
+ if skipNext then
+ skipNext = false
+ elseif not changing and editBoxFrame.parent and editBoxFrame.parent.editBoxChangeFunc then
+ local t
+ if editBox.realText ~= "NONE" then
+ t = editBox.realText or editBox:GetText() or ""
+ end
+ local text = editBoxFrame.parent.editBoxChangeFunc(getArgs(editBoxFrame.parent, 'editBoxChangeArg', 1, t))
+ if text then
+ editBox:SpecialSetText(text)
+ end
+ end
+ end)
+ editBoxFrame:SetScript("OnEnter", function()
+ StopCounting(self, editBoxFrame.level)
+ showGameTooltip(editBoxFrame.parent)
+ end)
+ editBoxFrame:SetScript("OnLeave", function()
+ GameTooltip:Hide()
+ end)
+ editBox:SetScript("OnEnter", function()
+ StopCounting(self, editBoxFrame.level)
+ showGameTooltip(editBoxFrame.parent)
+ end)
+ editBox:SetScript("OnLeave", function()
+ GameTooltip:Hide()
+ end)
+ editBoxFrame:SetScript("OnKeyDown", function(this, a1)
+ if not editBox.keybinding then
+ return
+ end
+ local arg1 = a1 or arg1
+ local screenshotKey = GetBindingKey("SCREENSHOT")
+ if screenshotKey and arg1 == screenshotKey then
+ Screenshot()
+ return
+ end
+
+ if arg1 == "LeftButton" then
+ arg1 = "BUTTON1"
+ elseif arg1 == "RightButton" then
+ arg1 = "BUTTON2"
+ elseif arg1 == "MiddleButton" then
+ arg1 = "BUTTON3"
+ elseif arg1 == "Button4" then
+ arg1 = "BUTTON4"
+ elseif arg1 == "Button5" then
+ arg1 = "BUTTON5"
+ end
+ if arg1 == "UNKNOWN" then
+ return
+ elseif arg1 == "SHIFT" or arg1 == "CTRL" or arg1 == "ALT" then
+ return
+ elseif arg1 == "ENTER" then
+ if editBox.keybindingOnly and not editBox.keybindingOnly[editBox.realText] then
+ return editBox:GetScript("OnEscapePressed")()
+ elseif editBox.keybindingExcept and editBox.keybindingExcept[editBox.realText] then
+ return editBox:GetScript("OnEscapePressed")()
+ else
+ return editBox:GetScript("OnEnterPressed")()
+ end
+ elseif arg1 == "ESCAPE" then
+ if editBox.realText == "NONE" then
+ return editBox:GetScript("OnEscapePressed")()
+ else
+ editBox:SpecialSetText(NONE or "NONE")
+ editBox.realText = "NONE"
+ return
+ end
+ elseif editBox.keybindingOnly and not editBox.keybindingOnly[arg1] then
+ return
+ elseif editBox.keybindingExcept and editBox.keybindingExcept[arg1] then
+ return
+ end
+ local s = GetBindingText(arg1, "KEY_")
+ if s == "BUTTON1" then
+ s = KEY_BUTTON1
+ elseif s == "BUTTON2" then
+ s = KEY_BUTTON2
+ end
+ local real = arg1
+ if IsShiftKeyDown() then
+ s = "Shift-" .. s
+ real = "SHIFT-" .. real
+ end
+ if IsControlKeyDown() then
+ s = "Ctrl-" .. s
+ real = "CTRL-" .. real
+ end
+ if IsAltKeyDown() then
+ s = "Alt-" .. s
+ real = "ALT-" .. real
+ end
+ if editBox:GetText() ~= s then
+ editBox:SpecialSetText("-")
+ editBox:SpecialSetText(s)
+ editBox.realText = real
+ return editBox:GetScript("OnTextChanged")()
+ end
+ end)
+ editBoxFrame:SetScript("OnMouseDown", editBoxFrame:GetScript("OnKeyDown"))
+ editBox:SetScript("OnMouseDown", function(this, ...)
+ if GetCursorInfo and (CursorHasItem() or CursorHasSpell()) then
+ return editBox:GetScript("OnReceiveDrag")(this, ...)
+ end
+ return editBoxFrame:GetScript("OnKeyDown")(this, ...)
+ end)
+ editBoxFrame:SetScript("OnMouseWheel", function(t, a1)
+ local arg1 = a1 or arg1
+ local up = arg1 > 0
+ arg1 = up and "MOUSEWHEELUP" or "MOUSEWHEELDOWN"
+ return editBoxFrame:GetScript("OnKeyDown")(t or this, arg1)
+ end)
+ editBox:SetScript("OnMouseWheel", editBoxFrame:GetScript("OnMouseWheel"))
+ end
+ editBoxFrame.parent = parent
+ editBoxFrame.level = parent.level.num + 1
+ editBoxFrame.parentValue = parent.level.value
+ editBoxFrame:SetFrameLevel(parent.level:GetFrameLevel() + 3)
+ editBoxFrame.editBox:SetFrameLevel(editBoxFrame:GetFrameLevel() + 1)
+ editBoxFrame.editBox.realText = nil
+ editBoxFrame:SetClampedToScreen(false)
+
+ editBoxFrame.editBox:SpecialSetText("")
+ if parent.editBoxIsKeybinding then
+ local s = parent.editBoxText
+ if s == "" then
+ s = "NONE"
+ end
+ editBoxFrame.editBox.realText = s
+ if s and s ~= "NONE" then
+ local alpha,bravo = s:match("^(.+)%-(.+)$")
+ if not bravo then
+ alpha = nil
+ bravo = s
+ end
+ bravo = GetBindingText(bravo, "KEY_")
+ if alpha then
+ editBoxFrame.editBox:SpecialSetText(alpha:upper() .. "-" .. bravo)
+ else
+ editBoxFrame.editBox:SpecialSetText(bravo)
+ end
+ else
+ editBoxFrame.editBox:SpecialSetText(NONE or "NONE")
+ end
+ else
+ editBoxFrame.editBox:SpecialSetText(parent.editBoxText)
+ end
+
+ editBoxFrame.editBox.keybinding = parent.editBoxIsKeybinding
+ editBoxFrame.editBox.keybindingOnly = parent.editBoxKeybindingOnly
+ editBoxFrame.editBox.keybindingExcept = parent.editBoxKeybindingExcept
+ editBoxFrame.editBox:EnableKeyboard(not parent.editBoxIsKeybinding)
+ editBoxFrame:EnableKeyboard(parent.editBoxIsKeybinding)
+
+ if parent.arrow then
+-- parent.arrow:SetVertexColor(0.2, 0.6, 0)
+-- parent.arrow:SetHeight(24)
+-- parent.arrow:SetWidth(24)
+ parent.selected = true
+ parent.highlight:Show()
+ end
+
+ local level = parent.level
+ editBoxFrame:Show()
+ editBoxFrame:ClearAllPoints()
+ if level.lastDirection == "RIGHT" then
+ if level.lastVDirection == "DOWN" then
+ editBoxFrame:SetPoint("TOPLEFT", parent, "TOPRIGHT", 5, 10)
+ else
+ editBoxFrame:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", 5, -10)
+ end
+ else
+ if level.lastVDirection == "DOWN" then
+ editBoxFrame:SetPoint("TOPRIGHT", parent, "TOPLEFT", -5, 10)
+ else
+ editBoxFrame:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, -10)
+ end
+ end
+ local dirty
+ if level.lastDirection == "RIGHT" then
+ if editBoxFrame:GetRight() > GetScreenWidth() then
+ level.lastDirection = "LEFT"
+ dirty = true
+ end
+ elseif editBoxFrame:GetLeft() < 0 then
+ level.lastDirection = "RIGHT"
+ dirty = true
+ end
+ if level.lastVDirection == "DOWN" then
+ if editBoxFrame:GetBottom() < 0 then
+ level.lastVDirection = "UP"
+ dirty = true
+ end
+ elseif editBoxFrame:GetTop() > GetScreenWidth() then
+ level.lastVDirection = "DOWN"
+ dirty = true
+ end
+ if dirty then
+ editBoxFrame:ClearAllPoints()
+ if level.lastDirection == "RIGHT" then
+ if level.lastVDirection == "DOWN" then
+ editBoxFrame:SetPoint("TOPLEFT", parent, "TOPRIGHT", 5, 10)
+ else
+ editBoxFrame:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", 5, -10)
+ end
+ else
+ if level.lastVDirection == "DOWN" then
+ editBoxFrame:SetPoint("TOPRIGHT", parent, "TOPLEFT", -5, 10)
+ else
+ editBoxFrame:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", -5, -10)
+ end
+ end
+ end
+ local left, bottom = editBoxFrame:GetLeft(), editBoxFrame:GetBottom()
+ editBoxFrame:ClearAllPoints()
+ editBoxFrame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", left, bottom)
+ if mod(level.num, 5) == 0 then
+ local left, bottom = level:GetLeft(), level:GetBottom()
+ level:ClearAllPoints()
+ level:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", left, bottom)
+ end
+ editBoxFrame:SetClampedToScreen(true)
+end
+
+function Dewdrop:EncodeKeybinding(text)
+ if text == nil or text == "NONE" then
+ return nil
+ end
+ text = tostring(text):upper()
+ local shift, ctrl, alt
+ local modifier
+ while true do
+ if text == "-" then
+ break
+ end
+ modifier, text = strsplit('-', text, 2)
+ if text then
+ if modifier ~= "SHIFT" and modifier ~= "CTRL" and modifier ~= "ALT" then
+ return false
+ end
+ if modifier == "SHIFT" then
+ if shift then
+ return false
+ end
+ shift = true
+ end
+ if modifier == "CTRL" then
+ if ctrl then
+ return false
+ end
+ ctrl = true
+ end
+ if modifier == "ALT" then
+ if alt then
+ return false
+ end
+ alt = true
+ end
+ else
+ text = modifier
+ break
+ end
+ end
+ if not text:find("^F%d+$") and text ~= "CAPSLOCK" and text:len() ~= 1 and (text:len() == 0 or text:byte() < 128 or text:len() > 4) and not _G["KEY_" .. text] and text ~= "BUTTON1" and text ~= "BUTTON2" then
+ return false
+ end
+ local s = GetBindingText(text, "KEY_")
+ if s == "BUTTON1" then
+ s = KEY_BUTTON1
+ elseif s == "BUTTON2" then
+ s = KEY_BUTTON2
+ end
+ if shift then
+ s = "Shift-" .. s
+ end
+ if ctrl then
+ s = "Ctrl-" .. s
+ end
+ if alt then
+ s = "Alt-" .. s
+ end
+ return s
+end
+
+function Dewdrop:IsOpen(parent)
+ self:argCheck(parent, 2, "table", "string", "nil")
+ return levels[1] and levels[1]:IsShown() and (not parent or parent == levels[1].parent or parent == levels[1]:GetParent())
+end
+
+function Dewdrop:GetOpenedParent()
+ return (levels[1] and levels[1]:IsShown()) and (levels[1].parent or levels[1]:GetParent())
+end
+
+function Open(self, parent, func, level, value, point, relativePoint, cursorX, cursorY)
+ self:Close(level)
+ if DewdropLib then
+ local d = DewdropLib:GetInstance('1.0')
+ local ret, val = pcall(d, IsOpen, d)
+ if ret and val then
+ DewdropLib:GetInstance('1.0'):Close()
+ end
+ end
+ if type(parent) == "table" then
+ parent:GetCenter()
+ end
+ local frame = AcquireLevel(self, level)
+ if level == 1 then
+ frame.lastDirection = "RIGHT"
+ frame.lastVDirection = "DOWN"
+ else
+ frame.lastDirection = levels[level - 1].lastDirection
+ frame.lastVDirection = levels[level - 1].lastVDirection
+ end
+ frame:SetFrameStrata("FULLSCREEN_DIALOG")
+ frame:ClearAllPoints()
+ frame.parent = parent
+ frame:SetPoint("LEFT", UIParent, "RIGHT", 10000, 0)
+ frame:Show()
+ if level == 1 then
+ baseFunc = func
+ end
+ levels[level].value = value
+-- levels[level].parentText = parent.text and parent.text:GetText() or nil
+-- levels[level].parentTooltipTitle = parent.tooltipTitle
+-- levels[level].parentTooltipText = parent.tooltipText
+-- levels[level].parentTooltipFunc = parent.tooltipFunc
+ if type(parent) == "table" and parent.arrow then
+-- parent.arrow:SetVertexColor(0.2, 0.6, 0)
+-- parent.arrow:SetHeight(24)
+-- parent.arrow:SetWidth(24)
+ parent.selected = true
+ parent.highlight:Show()
+ end
+ relativePoint = relativePoint or point
+ Refresh(self, levels[level])
+ if point or (cursorX and cursorY) then
+ frame:ClearAllPoints()
+ if cursorX and cursorY then
+ local curX, curY = GetScaledCursorPosition()
+ if curY < GetScreenHeight() / 2 then
+ point, relativePoint = "BOTTOM", "BOTTOM"
+ else
+ point, relativePoint = "TOP", "TOP"
+ end
+ if curX < GetScreenWidth() / 2 then
+ point, relativePoint = point .. "LEFT", relativePoint .. "RIGHT"
+ else
+ point, relativePoint = point .. "RIGHT", relativePoint .. "LEFT"
+ end
+ end
+ frame:SetPoint(point, type(parent) == "table" and parent or UIParent, relativePoint)
+ if cursorX and cursorY then
+ local left = frame:GetLeft()
+ local width = frame:GetWidth()
+ local bottom = frame:GetBottom()
+ local height = frame:GetHeight()
+ local curX, curY = GetScaledCursorPosition()
+ frame:ClearAllPoints()
+ relativePoint = relativePoint or point
+ if point == "BOTTOM" or point == "TOP" then
+ if curX < GetScreenWidth() / 2 then
+ point = point .. "LEFT"
+ else
+ point = point .. "RIGHT"
+ end
+ elseif point == "CENTER" then
+ if curX < GetScreenWidth() / 2 then
+ point = "LEFT"
+ else
+ point = "RIGHT"
+ end
+ end
+ local xOffset, yOffset = 0, 0
+ if curY > GetScreenHeight() / 2 then
+ yOffset = -height
+ end
+ if curX > GetScreenWidth() / 2 then
+ xOffset = -width
+ end
+ frame:SetPoint(point, type(parent) == "table" and parent or UIParent, relativePoint, curX - left + xOffset, curY - bottom + yOffset)
+ if level == 1 then
+ frame.lastDirection = "RIGHT"
+ end
+ elseif cursorX then
+ local left = frame:GetLeft()
+ local width = frame:GetWidth()
+ local curX, curY = GetScaledCursorPosition()
+ frame:ClearAllPoints()
+ relativePoint = relativePoint or point
+ if point == "BOTTOM" or point == "TOP" then
+ if curX < GetScreenWidth() / 2 then
+ point = point .. "LEFT"
+ else
+ point = point .. "RIGHT"
+ end
+ elseif point == "CENTER" then
+ if curX < GetScreenWidth() / 2 then
+ point = "LEFT"
+ else
+ point = "RIGHT"
+ end
+ end
+ frame:SetPoint(point, type(parent) == "table" and parent or UIParent, relativePoint, curX - left - width / 2, 0)
+ if level == 1 then
+ frame.lastDirection = "RIGHT"
+ end
+ elseif cursorY then
+ local bottom = frame:GetBottom()
+ local height = frame:GetHeight()
+ local curX, curY = GetScaledCursorPosition()
+ frame:ClearAllPoints()
+ relativePoint = relativePoint or point
+ if point == "LEFT" or point == "RIGHT" then
+ if curX < GetScreenHeight() / 2 then
+ point = point .. "BOTTOM"
+ else
+ point = point .. "TOP"
+ end
+ elseif point == "CENTER" then
+ if curX < GetScreenHeight() / 2 then
+ point = "BOTTOM"
+ else
+ point = "TOP"
+ end
+ end
+ frame:SetPoint(point, type(parent) == "table" and parent or UIParent, relativePoint, 0, curY - bottom - height / 2)
+ if level == 1 then
+ frame.lastDirection = "DOWN"
+ end
+ end
+ if (strsub(point, 1, 3) ~= strsub(relativePoint, 1, 3)) then
+ if frame:GetBottom() < 0 then
+ local point, parent, relativePoint, x, y = frame:GetPoint(1)
+ local change = GetScreenHeight() - frame:GetTop()
+ local otherChange = -frame:GetBottom()
+ if otherChange < change then
+ change = otherChange
+ end
+ frame:SetPoint(point, parent, relativePoint, x, y + change)
+ elseif frame:GetTop() > GetScreenHeight() then
+ local point, parent, relativePoint, x, y = frame:GetPoint(1)
+ local change = GetScreenHeight() - frame:GetTop()
+ local otherChange = -frame:GetBottom()
+ if otherChange < change then
+ change = otherChange
+ end
+ frame:SetPoint(point, parent, relativePoint, x, y + change)
+ end
+ end
+ end
+ CheckDualMonitor(self, frame)
+ frame:SetClampedToScreen(true)
+ frame:SetClampedToScreen(false)
+ StartCounting(self, level)
+end
+
+function Dewdrop:IsRegistered(parent)
+ self:argCheck(parent, 2, "table", "string")
+ return not not self.registry[parent]
+end
+
+function Dewdrop:Register(parent, ...)
+ self:argCheck(parent, 2, "table", "string")
+ if self.registry[parent] then
+ self:Unregister(parent)
+ end
+ local info = new(...)
+ if type(info.children) == "table" then
+ local err, position = validateOptions(info.children)
+
+ if err then
+ if position then
+ Dewdrop:error(position .. ": " .. err)
+ else
+ Dewdrop:error(err)
+ end
+ end
+ end
+ self.registry[parent] = info
+ if not info.dontHook and not self.onceRegistered[parent] and type(parent) == "table" then
+ if parent:HasScript("OnMouseUp") then
+ local script = parent:GetScript("OnMouseUp")
+ parent:SetScript("OnMouseUp", function(this, ...)
+ if script then
+ script(this, ...)
+ end
+ if arg1 == "RightButton" and self.registry[parent] then
+ if self:IsOpen(parent) then
+ self:Close()
+ else
+ self:Open(parent)
+ end
+ end
+ end)
+ end
+ if parent:HasScript("OnMouseDown") then
+ local script = parent:GetScript("OnMouseDown")
+ parent:SetScript("OnMouseDown", function(this, ...)
+ if script then
+ script(this, ...)
+ end
+ if self.registry[parent] then
+ self:Close()
+ end
+ end)
+ end
+ end
+ self.onceRegistered[parent] = true
+end
+
+function Dewdrop:Unregister(parent)
+ self:argCheck(parent, 2, "table", "string")
+ self.registry[parent] = nil
+end
+
+function Dewdrop:Open(parent, ...)
+ self:argCheck(parent, 2, "table", "string")
+ local info
+ local k1 = ...
+ if type(k1) == "table" and k1[0] and k1.IsObjectType and self.registry[k1] then
+ info = tmp(select(2, ...))
+ for k,v in pairs(self.registry[k1]) do
+ if info[k] == nil then
+ info[k] = v
+ end
+ end
+ else
+ info = tmp(...)
+ if self.registry[parent] then
+ for k,v in pairs(self.registry[parent]) do
+ if info[k] == nil then
+ info[k] = v
+ end
+ end
+ end
+ end
+ local point = info.point
+ local relativePoint = info.relativePoint
+ local cursorX = info.cursorX
+ local cursorY = info.cursorY
+ if type(point) == "function" then
+ local b
+ point, b = point(parent)
+ if b then
+ relativePoint = b
+ end
+ end
+ if type(relativePoint) == "function" then
+ relativePoint = relativePoint(parent)
+ end
+ Open(self, parent, info.children, 1, nil, point, relativePoint, cursorX, cursorY)
+end
+
+function Clear(self, level)
+ if level then
+ if level.buttons then
+ for i = #level.buttons, 1, -1 do
+ ReleaseButton(self, level, i)
+ end
+ end
+ end
+end
+
+function Dewdrop:Close(level)
+ if DropDownList1:IsShown() then
+ DropDownList1:Hide()
+ end
+ if DewdropLib then
+ local d = DewdropLib:GetInstance('1.0')
+ local ret, val = pcall(d, IsOpen, d)
+ if ret and val then
+ DewdropLib:GetInstance('1.0'):Close()
+ end
+ end
+ self:argCheck(level, 2, "number", "nil")
+ if not level then
+ level = 1
+ end
+ if level == 1 and levels[level] then
+ levels[level].parented = false
+ end
+ if level > 1 and levels[level-1].buttons then
+ local buttons = levels[level-1].buttons
+ for _,button in ipairs(buttons) do
+-- button.arrow:SetWidth(16)
+-- button.arrow:SetHeight(16)
+ button.selected = nil
+ button.highlight:Hide()
+-- button.arrow:SetVertexColor(1, 1, 1)
+ end
+ end
+ if sliderFrame and sliderFrame.level >= level then
+ sliderFrame:Hide()
+ end
+ if editBoxFrame and editBoxFrame.level >= level then
+ editBoxFrame:Hide()
+ end
+ for i = level, #levels do
+ Clear(self, levels[level])
+ levels[i]:Hide()
+ levels[i]:ClearAllPoints()
+ levels[i]:SetPoint("CENTER", UIParent, "CENTER")
+ levels[i].value = nil
+ end
+end
+
+function Dewdrop:AddSeparator(level)
+ level = levels[level or currentLevel]
+ if not level or not level.buttons then return; end
+
+ local prevbutton = level.buttons[#level.buttons]
+ if not prevbutton then return; end
+
+ if prevbutton.disabled and prevbutton.text:GetText() == "" then
+ return
+ end
+ self:AddLine("text", "", "disabled", true)
+end
+
+function Dewdrop:AddLine(...)
+ local info = tmp(...)
+ local level = info.level or currentLevel
+ info.level = nil
+ local button = AcquireButton(self, level)
+ if not next(info) then
+ info.disabled = true
+ end
+ button.disabled = info.isTitle or info.notClickable or info.disabled or (self.combat and info.secure)
+ button.isTitle = info.isTitle
+ button.notClickable = info.notClickable
+ if button.isTitle then
+ button.text:SetFontObject(GameFontNormalSmall)
+ elseif button.notClickable then
+ button.text:SetFontObject(GameFontHighlightSmall)
+ elseif button.disabled then
+ button.text:SetFontObject(GameFontDisableSmall)
+ else
+ button.text:SetFontObject(GameFontHighlightSmall)
+ end
+ if info.disabled then
+ button.arrow:SetDesaturated(true)
+ button.check:SetDesaturated(true)
+ else
+ button.arrow:SetDesaturated(false)
+ button.check:SetDesaturated(false)
+ end
+ if info.textR and info.textG and info.textB then
+ button.textR = info.textR
+ button.textG = info.textG
+ button.textB = info.textB
+ button.text:SetTextColor(button.textR, button.textG, button.textB)
+ else
+ button.text:SetTextColor(button.text:GetFontObject():GetTextColor())
+ end
+ button.notCheckable = info.notCheckable
+ button.text:SetPoint("LEFT", button, "LEFT", button.notCheckable and 0 or 24, 0)
+ button.checked = not info.notCheckable and info.checked
+ button.mouseoverUnderline = info.mouseoverUnderline
+ button.isRadio = not info.notCheckable and info.isRadio
+ if info.isRadio then
+ button.check:Show()
+ button.check:SetTexture(info.checkIcon or "Interface\\Buttons\\UI-RadioButton")
+ if button.checked then
+ button.check:SetTexCoord(0.25, 0.5, 0, 1)
+ button.check:SetVertexColor(1, 1, 1, 1)
+ else
+ button.check:SetTexCoord(0, 0.25, 0, 1)
+ button.check:SetVertexColor(1, 1, 1, 0.5)
+ end
+ button.radioHighlight:SetTexture(info.checkIcon or "Interface\\Buttons\\UI-RadioButton")
+ button.check:SetWidth(16)
+ button.check:SetHeight(16)
+ elseif info.icon then
+ button.check:Show()
+ button.check:SetTexture(info.icon)
+ if info.iconWidth and info.iconHeight then
+ button.check:SetWidth(info.iconWidth)
+ button.check:SetHeight(info.iconHeight)
+ else
+ button.check:SetWidth(16)
+ button.check:SetHeight(16)
+ end
+ if info.iconCoordLeft and info.iconCoordRight and info.iconCoordTop and info.iconCoordBottom then
+ button.check:SetTexCoord(info.iconCoordLeft, info.iconCoordRight, info.iconCoordTop, info.iconCoordBottom)
+ elseif info.icon:find("^Interface\\Icons\\") then
+ button.check:SetTexCoord(0.05, 0.95, 0.05, 0.95)
+ else
+ button.check:SetTexCoord(0, 1, 0, 1)
+ end
+ button.check:SetVertexColor(1, 1, 1, 1)
+ else
+ if button.checked then
+ if info.checkIcon then
+ button.check:SetWidth(16)
+ button.check:SetHeight(16)
+ button.check:SetTexture(info.checkIcon)
+ if info.checkIcon:find("^Interface\\Icons\\") then
+ button.check:SetTexCoord(0.05, 0.95, 0.05, 0.95)
+ else
+ button.check:SetTexCoord(0, 1, 0, 1)
+ end
+ else
+ button.check:SetWidth(24)
+ button.check:SetHeight(24)
+ button.check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
+ button.check:SetTexCoord(0, 1, 0, 1)
+ end
+ button.check:SetVertexColor(1, 1, 1, 1)
+ else
+ button.check:SetVertexColor(1, 1, 1, 0)
+ end
+ end
+ if not button.disabled then
+ button.func = info.func
+ button.secure = info.secure
+ end
+ button.hasColorSwatch = info.hasColorSwatch
+ if button.hasColorSwatch then
+ button.colorSwatch:Show()
+ button.colorSwatch.texture:Show()
+ button.r = info.r or 1
+ button.g = info.g or 1
+ button.b = info.b or 1
+ button.colorSwatch.texture:SetVertexColor(button.r, button.g, button.b)
+ button.checked = false
+ button.func = nil
+ button.colorFunc = info.colorFunc
+ local i = 1
+ while true do
+ local k = "colorArg" .. i
+ local x = info[k]
+ if x == nil then
+ break
+ end
+ button[k] = x
+ i = i + 1
+ end
+ button.hasOpacity = info.hasOpacity
+ button.opacity = info.opacity or 1
+ else
+ button.colorSwatch:Hide()
+ button.colorSwatch.texture:Hide()
+ end
+ button.hasArrow = not button.hasColorSwatch and (info.value or info.hasSlider or info.hasEditBox) and info.hasArrow
+ if button.hasArrow then
+ button.arrow:SetAlpha(1)
+ if info.hasSlider then
+ button.hasSlider = true
+ button.sliderMin = info.sliderMin or 0
+ button.sliderMax = info.sliderMax or 1
+ button.sliderStep = info.sliderStep or 0
+ button.sliderBigStep = info.sliderBigStep or button.sliderStep
+ if button.sliderBigStep < button.sliderStep then
+ button.sliderBigStep = button.sliderStep
+ end
+ button.sliderIsPercent = info.sliderIsPercent and true or false
+ button.sliderMinText = info.sliderMinText or button.sliderIsPercent and string.format("%.0f%%", button.sliderMin * 100) or button.sliderMin
+ button.sliderMaxText = info.sliderMaxText or button.sliderIsPercent and string.format("%.0f%%", button.sliderMax * 100) or button.sliderMax
+ button.sliderFunc = info.sliderFunc
+ button.sliderValue = info.sliderValue
+ button.fromAceOptions = info.fromAceOptions
+ local i = 1
+ while true do
+ local k = "sliderArg" .. i
+ local x = info[k]
+ if x == nil then
+ break
+ end
+ button[k] = x
+ i = i + 1
+ end
+ elseif info.hasEditBox then
+ button.hasEditBox = true
+ button.editBoxText = info.editBoxText or ""
+ button.editBoxFunc = info.editBoxFunc
+ local i = 1
+ while true do
+ local k = "editBoxArg" .. i
+ local x = info[k]
+ if x == nil then
+ break
+ end
+ button[k] = x
+ i = i + 1
+ end
+ button.editBoxChangeFunc = info.editBoxChangeFunc
+ local i = 1
+ while true do
+ local k = "editBoxChangeArg" .. i
+ local x = info[k]
+ if x == nil then
+ break
+ end
+ button[k] = x
+ i = i + 1
+ end
+ button.editBoxValidateFunc = info.editBoxValidateFunc
+ local i = 1
+ while true do
+ local k = "editBoxValidateArg" .. i
+ local x = info[k]
+ if x == nil then
+ break
+ end
+ button[k] = x
+ i = i + 1
+ end
+ button.editBoxIsKeybinding = info.editBoxIsKeybinding
+ button.editBoxKeybindingOnly = info.editBoxKeybindingOnly
+ button.editBoxKeybindingExcept = info.editBoxKeybindingExcept
+ else
+ button.value = info.value
+ local l = levels[level+1]
+ if l and info.value == l.value then
+-- button.arrow:SetWidth(24)
+-- button.arrow:SetHeight(24)
+ button.selected = true
+ button.highlight:Show()
+ end
+ end
+ else
+ button.arrow:SetAlpha(0)
+ end
+ local i = 1
+ while true do
+ local k = "arg" .. i
+ local x = info[k]
+ if x == nil then
+ break
+ end
+ button[k] = x
+ i = i + 1
+ end
+ button.closeWhenClicked = info.closeWhenClicked
+ button.textHeight = info.textHeight or UIDROPDOWNMENU_DEFAULT_TEXT_HEIGHT or 10
+ local font,_ = button.text:GetFont()
+ button.text:SetFont(STANDARD_TEXT_FONT or "Fonts\\FRIZQT__.TTF", button.textHeight)
+ button:SetHeight(button.textHeight + 6)
+ button.text:SetPoint("RIGHT", button.arrow, (button.hasColorSwatch or button.hasArrow) and "LEFT" or "RIGHT")
+ button.text:SetJustifyH(info.justifyH or "LEFT")
+ button.text:SetText(info.text)
+ button.tooltipTitle = info.tooltipTitle
+ button.tooltipText = info.tooltipText
+ button.tooltipFunc = info.tooltipFunc
+ local i = 1
+ while true do
+ local k = "tooltipArg" .. i
+ local x = info[k]
+ if x == nil then
+ break
+ end
+ button[k] = x
+ i = i + 1
+ end
+ if not button.tooltipTitle and not button.tooltipText and not button.tooltipFunc and not info.isTitle then
+ button.tooltipTitle = info.text
+ end
+ if type(button.func) == "string" then
+ if type(button.arg1) ~= "table" then
+ self:error("Cannot call method %q on a non-table", button.func)
+ end
+ if type(button.arg1[button.func]) ~= "function" then
+ self:error("Method %q nonexistant.", button.func)
+ end
+ end
+end
+
+function Dewdrop:InjectAceOptionsTable(handler, options)
+ self:argCheck(handler, 2, "table")
+ self:argCheck(options, 3, "table")
+ if tostring(options.type):lower() ~= "group" then
+ self:error('Cannot inject into options table argument #3 if its type is not "group"')
+ end
+ if options.handler ~= nil and options.handler ~= handler then
+ self:error("Cannot inject into options table argument #3 if it has a different handler than argument #2")
+ end
+ options.handler = handler
+ local class = handler.class
+ if not AceLibrary:HasInstance("AceOO-2.0") or not class then
+ if Rock then
+ -- possible Rock object
+ for mixin in Rock:IterateObjectMixins(handler) do
+ if type(mixin.GetAceOptionsDataTable) == "function" then
+ local t = mixin:GetAceOptionsDataTable(handler)
+ for k,v in pairs(t) do
+ if type(options.args) ~= "table" then
+ options.args = {}
+ end
+ if options.args[k] == nil then
+ options.args[k] = v
+ end
+ end
+ end
+ end
+ end
+ else
+ -- Ace2 object
+ while class and class ~= AceLibrary("AceOO-2.0").Class do
+ if type(class.GetAceOptionsDataTable) == "function" then
+ local t = class:GetAceOptionsDataTable(handler)
+ for k,v in pairs(t) do
+ if type(options.args) ~= "table" then
+ options.args = {}
+ end
+ if options.args[k] == nil then
+ options.args[k] = v
+ end
+ end
+ end
+ local mixins = class.mixins
+ if mixins then
+ for mixin in pairs(mixins) do
+ if type(mixin.GetAceOptionsDataTable) == "function" then
+ local t = mixin:GetAceOptionsDataTable(handler)
+ for k,v in pairs(t) do
+ if type(options.args) ~= "table" then
+ options.args = {}
+ end
+ if options.args[k] == nil then
+ options.args[k] = v
+ end
+ end
+ end
+ end
+ end
+ class = class.super
+ end
+ end
+ return options
+end
+
+function Dewdrop:OnTooltipHide()
+ if lastSetFont then
+ if lastSetFont == normalFont then
+ lastSetFont = nil
+ return
+ end
+ fillRegionTmp(GameTooltip:GetRegions())
+ for i,v in ipairs(regionTmp) do
+ if v.GetFont then
+ local font,size,outline = v:GetFont()
+ if font == lastSetFont then
+ v:SetFont(normalFont, size, outline)
+ end
+ end
+ regionTmp[i] = nil
+ end
+ lastSetFont = nil
+ end
+end
+
+local function activate(self, oldLib, oldDeactivate)
+ Dewdrop = self
+ if oldLib and oldLib.registry then
+ self.registry = oldLib.registry
+ self.onceRegistered = oldLib.onceRegistered
+ else
+ self.registry = {}
+ self.onceRegistered = {}
+
+ local WorldFrame_OnMouseDown = WorldFrame:GetScript("OnMouseDown")
+ local WorldFrame_OnMouseUp = WorldFrame:GetScript("OnMouseUp")
+ local oldX, oldY, clickTime
+ WorldFrame:SetScript("OnMouseDown", function(this, ...)
+ oldX,oldY = GetCursorPosition()
+ clickTime = GetTime()
+ if WorldFrame_OnMouseDown then
+ WorldFrame_OnMouseDown(this, ...)
+ end
+ end)
+
+ WorldFrame:SetScript("OnMouseUp", function(this, ...)
+ local x,y = GetCursorPosition()
+ if not oldX or not oldY or not x or not y or not clickTime then
+ self:Close()
+ if WorldFrame_OnMouseUp then
+ WorldFrame_OnMouseUp(this, ...)
+ end
+ return
+ end
+ local d = math.abs(x - oldX) + math.abs(y - oldY)
+ if d <= 5 and GetTime() - clickTime < 0.5 then
+ self:Close()
+ end
+ if WorldFrame_OnMouseUp then
+ WorldFrame_OnMouseUp(this, ...)
+ end
+ end)
+
+ hooksecurefunc(DropDownList1, "Show", function()
+ if levels[1] and levels[1]:IsVisible() then
+ self:Close()
+ end
+ end)
+
+ hooksecurefunc("HideDropDownMenu", function()
+ if levels[1] and levels[1]:IsVisible() then
+ self:Close()
+ end
+ end)
+
+ hooksecurefunc("CloseDropDownMenus", function()
+ if levels[1] and levels[1]:IsVisible() then
+ local stack = debugstack()
+ if not stack:find("`TargetFrame_OnHide'") then
+ self:Close()
+ end
+ end
+ end)
+ end
+ self.frame = oldLib and oldLib.frame or CreateFrame("Frame")
+ self.frame:UnregisterAllEvents()
+ self.frame:RegisterEvent("PLAYER_REGEN_ENABLED")
+ self.frame:RegisterEvent("PLAYER_REGEN_DISABLED")
+ self.frame:Hide()
+ self.frame:SetScript("OnEvent", function(this, event)
+ this:Show()
+ if event=="PLAYER_REGEN_ENABLED" then -- track combat state for secure frame operations
+ self.combat = false
+ elseif event=="PLAYER_REGEN_DISABLED" then
+ self.combat = true
+ end
+ end)
+ self.frame:SetScript("OnUpdate", function(this)
+ this:Hide()
+ self:Refresh(1)
+ end)
+ self.hookedTooltip = true
+ if not oldLib or not oldLib.hookedTooltip then
+ local OnTooltipHide = GameTooltip:GetScript("OnHide")
+ GameTooltip:SetScript("OnHide", function(this, ...)
+ if OnTooltipHide then
+ OnTooltipHide(this, ...)
+ end
+ if type(self.OnTooltipHide) == "function" then
+ self:OnTooltipHide()
+ end
+ end)
+ end
+ levels = {}
+ buttons = {}
+
+ if oldDeactivate then
+ oldDeactivate(oldLib)
+ end
+end
+
+local function external(lib, major, instance)
+ if major == "LibSharedMedia-3.0" then
+ SharedMedia = instance
+ end
+end
+
+AceLibrary:Register(Dewdrop, MAJOR_VERSION, MINOR_VERSION, activate, nil, external)
diff --git a/AtlasLoot/Libs/DewdropLib/DewdropLib.toc b/AtlasLoot/Libs/DewdropLib/DewdropLib.toc
new file mode 100644
index 0000000..68d6b61
--- /dev/null
+++ b/AtlasLoot/Libs/DewdropLib/DewdropLib.toc
@@ -0,0 +1,18 @@
+## Interface: 20400
+## LoadOnDemand: 1
+## Title: Lib: Dewdrop-2.0
+## Notes: A library to provide a clean dropdown menu interface.
+## Author: ckknight
+## eMail: ckknight@gmail.com
+## X-Category: Library
+## OptionalDeps: Ace2
+## X-AceLibrary-Dewdrop-2.0: true
+## X-License: LGPL v2.1
+## X-Curse-Packaged-Version: r321
+## X-Curse-Project-Name: DewdropLib
+## X-Curse-Project-ID: dewdroplib
+## X-Curse-Repository-ID: wow/dewdroplib/mainline
+
+embeds.xml
+
+Dewdrop-2.0\Dewdrop-2.0.lua
diff --git a/AtlasLoot/Libs/DewdropLib/LICENSE.txt b/AtlasLoot/Libs/DewdropLib/LICENSE.txt
new file mode 100644
index 0000000..9da08ab
--- /dev/null
+++ b/AtlasLoot/Libs/DewdropLib/LICENSE.txt
@@ -0,0 +1,15 @@
+Copyright (C) 2006-2007 ckknight
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
\ No newline at end of file
diff --git a/AtlasLoot/Libs/DewdropLib/embeds.xml b/AtlasLoot/Libs/DewdropLib/embeds.xml
new file mode 100644
index 0000000..f2670fa
--- /dev/null
+++ b/AtlasLoot/Libs/DewdropLib/embeds.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/AtlasLoot/Libs/LibAboutPanel/LibAboutPanel.lua b/AtlasLoot/Libs/LibAboutPanel/LibAboutPanel.lua
new file mode 100644
index 0000000..0377916
--- /dev/null
+++ b/AtlasLoot/Libs/LibAboutPanel/LibAboutPanel.lua
@@ -0,0 +1,201 @@
+--[[
+
+****************************************************************************************
+LibAboutPanel
+
+File date: 2009-06-23T02:04:30Z
+Project version: v1.43
+
+Author: Tekkub, Ackis
+
+****************************************************************************************
+
+]]--
+
+local lib, oldminor = LibStub:NewLibrary("LibAboutPanel", 2)
+if not lib then return end
+
+function lib.new(parent, addonname)
+ local frame = CreateFrame("Frame", nil, UIParent)
+ frame.name, frame.parent, frame.addonname = not parent and gsub(addonname," ","") or "About", parent, gsub(addonname," ","") -- Remove spaces from addonname because GetMetadata doesn't like that
+ frame:Hide()
+ frame:SetScript("OnShow", lib.OnShow)
+ InterfaceOptions_AddCategory(frame)
+ return frame
+end
+
+local GAME_LOCALE = GetLocale()
+
+local L = {}
+
+-- frFR
+if GAME_LOCALE == "frFR" then
+ L["About"] = "à propos de"
+ L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
+-- deDE
+elseif GAME_LOCALE == "deDE" then
+ L["About"] = "Über"
+ L["Click and press Ctrl-C to copy"] = "Klicken und Strg-C drücken zum kopieren"
+-- esES
+elseif GAME_LOCALE == "esES" then
+ L["About"] = "Acerca de"
+ L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
+-- esMX
+elseif GAME_LOCALE == "esMX" then
+ L["About"] = "Sobre"
+ L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
+-- koKR
+elseif GAME_LOCALE == "koKR" then
+ L["About"] = "대하여"
+ L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
+-- ruRU
+elseif GAME_LOCALE == "ruRU" then
+ L["About"] = "Об аддоне"
+ L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
+-- zhCN
+elseif GAME_LOCALE == "zhCN" then
+ L["About"] = "关于"
+ L["Click and press Ctrl-C to copy"] = "点击并 Ctrl-C 复制"
+-- zhTW
+elseif GAME_LOCALE == "zhTW" then
+ L["About"] = "關於"
+ L["Click and press Ctrl-C to copy"] = "點擊並 Ctrl-C 復制"
+-- enUS and non-localized
+else
+ L["About"] ="About"
+ L["Click and press Ctrl-C to copy"] = "Click and press Ctrl-C to copy"
+end
+
+local editbox = CreateFrame('EditBox', nil, UIParent)
+editbox:Hide()
+editbox:SetAutoFocus(true)
+editbox:SetHeight(32)
+editbox:SetFontObject('GameFontHighlightSmall')
+lib.editbox = editbox
+
+local left = editbox:CreateTexture(nil, "BACKGROUND")
+left:SetWidth(8) left:SetHeight(20)
+left:SetPoint("LEFT", -5, 0)
+left:SetTexture("Interface\\Common\\Common-Input-Border")
+left:SetTexCoord(0, 0.0625, 0, 0.625)
+
+local right = editbox:CreateTexture(nil, "BACKGROUND")
+right:SetWidth(8) right:SetHeight(20)
+right:SetPoint("RIGHT", 0, 0)
+right:SetTexture("Interface\\Common\\Common-Input-Border")
+right:SetTexCoord(0.9375, 1, 0, 0.625)
+
+local center = editbox:CreateTexture(nil, "BACKGROUND")
+center:SetHeight(20)
+center:SetPoint("RIGHT", right, "LEFT", 0, 0)
+center:SetPoint("LEFT", left, "RIGHT", 0, 0)
+center:SetTexture("Interface\\Common\\Common-Input-Border")
+center:SetTexCoord(0.0625, 0.9375, 0, 0.625)
+
+editbox:SetScript("OnEscapePressed", editbox.ClearFocus)
+editbox:SetScript("OnEnterPressed", editbox.ClearFocus)
+editbox:SetScript("OnEditFocusLost", editbox.Hide)
+editbox:SetScript("OnEditFocusGained", editbox.HighlightText)
+editbox:SetScript("OnTextChanged", function(self)
+ self:SetText(self:GetParent().val)
+ self:HighlightText()
+end)
+
+
+function lib.OpenEditbox(self)
+ editbox:SetText(self.val)
+ editbox:SetParent(self)
+ editbox:SetPoint("LEFT", self)
+ editbox:SetPoint("RIGHT", self)
+ editbox:Show()
+end
+
+
+local fields = {"Version", "Author", "X-Category", "X-License", "X-Email", "Email", "eMail", "X-Website", "X-Credits", "X-Localizations", "X-Donate"}
+local haseditbox = {["X-Website"] = true, ["X-Email"] = true, ["X-Donate"] = true, ["Email"] = true, ["eMail"] = true}
+
+local function HideTooltip() GameTooltip:Hide() end
+
+local function ShowTooltip(self)
+ GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT")
+ GameTooltip:SetText(L["Click and press Ctrl-C to copy"])
+ --GameTooltip:SetText("Click and press Ctrl-C to copy")
+end
+
+function lib.OnShow(frame)
+
+ local notefield = "Notes"
+
+ if (GAME_LOCALE ~= "enUS") then
+ notefield = notefield .. "-" .. GAME_LOCALE
+ end
+
+ -- Get the localized version of notes if it exists or fall back to the english one.
+ local notes = GetAddOnMetadata(frame.addonname, notefield) or GetAddOnMetadata(frame.addonname, "Notes")
+
+ local title = frame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
+ title:SetPoint("TOPLEFT", 16, -16)
+ title:SetText(frame.parent and (frame.parent.." - " .. L["About"]) or frame.name)
+
+ local subtitle = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
+ subtitle:SetHeight(32)
+ subtitle:SetPoint("TOPLEFT", title, "BOTTOMLEFT", 0, -8)
+ subtitle:SetPoint("RIGHT", frame, -32, 0)
+ subtitle:SetNonSpaceWrap(true)
+ subtitle:SetJustifyH("LEFT")
+ subtitle:SetJustifyV("TOP")
+ subtitle:SetText(notes)
+
+ local anchor
+ for _,field in pairs(fields) do
+ local val = GetAddOnMetadata(frame.addonname, field)
+ if val then
+ local title = frame:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
+ title:SetWidth(75)
+ if not anchor then title:SetPoint("TOPLEFT", subtitle, "BOTTOMLEFT", -2, -12)
+ else title:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, -10) end
+ title:SetJustifyH("RIGHT")
+ title:SetText(field:gsub("X%-", ""))
+
+ local detail = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
+ detail:SetHeight(32)
+ detail:SetPoint("LEFT", title, "RIGHT", 4, 0)
+ detail:SetPoint("RIGHT", frame, -16, 0)
+ detail:SetJustifyH("LEFT")
+
+ if (field == "Author") then
+ local authorservername = GetAddOnMetadata(frame.addonname, "X-Author-Server")
+ local authorfaction = GetAddOnMetadata(frame.addonname, "X-Author-Faction")
+
+ if authorservername and authorfaction then
+ detail:SetText((haseditbox[field] and "|cff9999ff" or "").. val .. " on " .. authorservername .. " (" .. authorfaction .. ")")
+ elseif authorservername and not authorfaction then
+ detail:SetText((haseditbox[field] and "|cff9999ff" or "").. val .. " on " .. authorservername)
+ elseif not authorservername and authorfaction then
+ detail:SetText((haseditbox[field] and "|cff9999ff" or "").. val .. " (" .. authorfaction .. ")")
+ else
+ detail:SetText((haseditbox[field] and "|cff9999ff" or "").. val)
+ end
+ elseif (field == "Version") then
+ local addonversion = GetAddOnMetadata(frame.addonname, field)
+ -- Remove @project-revision@ and replace it with Repository
+ addonversion = string.gsub(addonversion,"@project.revision@","Repository")
+ detail:SetText((haseditbox[field] and "|cff9999ff" or "").. addonversion)
+ else
+ detail:SetText((haseditbox[field] and "|cff9999ff" or "").. val)
+ end
+
+ if haseditbox[field] then
+ local button = CreateFrame("Button", nil, frame)
+ button:SetAllPoints(detail)
+ button.val = val
+ button:SetScript("OnClick", lib.OpenEditbox)
+ button:SetScript("OnEnter", ShowTooltip)
+ button:SetScript("OnLeave", HideTooltip)
+ end
+
+ anchor = title
+ end
+ end
+
+end
diff --git a/AtlasLoot/Libs/LibAboutPanel/LibAboutPanel.toc b/AtlasLoot/Libs/LibAboutPanel/LibAboutPanel.toc
new file mode 100644
index 0000000..dabd930
--- /dev/null
+++ b/AtlasLoot/Libs/LibAboutPanel/LibAboutPanel.toc
@@ -0,0 +1,36 @@
+## Title: Lib: AboutPanel
+## X-Curse-Packaged-Version: v1.43
+## X-Curse-Project-Name: LibAboutPanel
+## X-Curse-Project-ID: libaboutpanel
+## X-Curse-Repository-ID: wow/libaboutpanel/mainline
+
+## Notes: Adds an about panel to interface options.
+
+## Author: Ackis
+## eMail: ackis AT shaw DOT ca
+##X-Author-Faction = Alliance
+##X-Author-Server = Thunderlord US
+## X-Donate: http://www.curseforge.com/projects/libaboutpanel/#w_donations
+
+## Interface: 30300
+## Version: 1.43
+## X-Revision: @project-revision@
+## X-Date: 2009-12-18T22:27:31Z
+
+## X-Category: Libraries
+## X-Localizations: enUS
+## X-Website: http://www.wowwiki.com/LibAboutPanel
+## X-Feedback: http://wow.curse.com/downloads/wow-addons/details/libaboutpanel.aspx
+
+## Dependencies:
+## X-Embeds: LibStub, CallbackHandler-1.0
+## OptionalDeps: LibStub, CallbackHandler-1.0
+## DefaultState: Enabled
+## LoadOnDemand: 0
+
+#@no-lib-strip@
+libs\LibStub\LibStub.lua
+libs\CallbackHandler-1.0\CallbackHandler-1.0.xml
+#@end-no-lib-strip@
+
+LibAboutPanel.lua
diff --git a/AtlasLoot/Libs/LibAboutPanel/lib.xml b/AtlasLoot/Libs/LibAboutPanel/lib.xml
new file mode 100644
index 0000000..069b803
--- /dev/null
+++ b/AtlasLoot/Libs/LibAboutPanel/lib.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/AtlasLoot/Libs/LibAboutPanel/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/AtlasLoot/Libs/LibAboutPanel/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
new file mode 100644
index 0000000..e0fe1af
--- /dev/null
+++ b/AtlasLoot/Libs/LibAboutPanel/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
@@ -0,0 +1,240 @@
+--[[ $Id: CallbackHandler-1.0.lua 14 2010-08-09 00:43:38Z mikk $ ]]
+local MAJOR, MINOR = "CallbackHandler-1.0", 6
+local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not CallbackHandler then return end -- No upgrade needed
+
+local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
+
+-- Lua APIs
+local tconcat = table.concat
+local assert, error, loadstring = assert, error, loadstring
+local setmetatable, rawset, rawget = setmetatable, rawset, rawget
+local next, select, pairs, type, tostring = next, select, pairs, type, tostring
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: geterrorhandler
+
+local xpcall = xpcall
+
+local function errorhandler(err)
+ return geterrorhandler()(err)
+end
+
+local function CreateDispatcher(argCount)
+ local code = [[
+ local next, xpcall, eh = ...
+
+ local method, ARGS
+ local function call() method(ARGS) end
+
+ local function dispatch(handlers, ...)
+ local index
+ index, method = next(handlers)
+ if not method then return end
+ local OLD_ARGS = ARGS
+ ARGS = ...
+ repeat
+ xpcall(call, eh)
+ index, method = next(handlers, index)
+ until not method
+ ARGS = OLD_ARGS
+ end
+
+ return dispatch
+ ]]
+
+ local ARGS, OLD_ARGS = {}, {}
+ for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
+ code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", "))
+ return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
+end
+
+local Dispatchers = setmetatable({}, {__index=function(self, argCount)
+ local dispatcher = CreateDispatcher(argCount)
+ rawset(self, argCount, dispatcher)
+ return dispatcher
+end})
+
+--------------------------------------------------------------------------
+-- CallbackHandler:New
+--
+-- target - target object to embed public APIs in
+-- RegisterName - name of the callback registration API, default "RegisterCallback"
+-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
+-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
+
+function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused)
+ -- TODO: Remove this after beta has gone out
+ assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
+
+ RegisterName = RegisterName or "RegisterCallback"
+ UnregisterName = UnregisterName or "UnregisterCallback"
+ if UnregisterAllName==nil then -- false is used to indicate "don't want this method"
+ UnregisterAllName = "UnregisterAllCallbacks"
+ end
+
+ -- we declare all objects and exported APIs inside this closure to quickly gain access
+ -- to e.g. function names, the "target" parameter, etc
+
+
+ -- Create the registry object
+ local events = setmetatable({}, meta)
+ local registry = { recurse=0, events=events }
+
+ -- registry:Fire() - fires the given event/message into the registry
+ function registry:Fire(eventname, ...)
+ if not rawget(events, eventname) or not next(events[eventname]) then return end
+ local oldrecurse = registry.recurse
+ registry.recurse = oldrecurse + 1
+
+ Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
+
+ registry.recurse = oldrecurse
+
+ if registry.insertQueue and oldrecurse==0 then
+ -- Something in one of our callbacks wanted to register more callbacks; they got queued
+ for eventname,callbacks in pairs(registry.insertQueue) do
+ local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
+ for self,func in pairs(callbacks) do
+ events[eventname][self] = func
+ -- fire OnUsed callback?
+ if first and registry.OnUsed then
+ registry.OnUsed(registry, target, eventname)
+ first = nil
+ end
+ end
+ end
+ registry.insertQueue = nil
+ end
+ end
+
+ -- Registration of a callback, handles:
+ -- self["method"], leads to self["method"](self, ...)
+ -- self with function ref, leads to functionref(...)
+ -- "addonId" (instead of self) with function ref, leads to functionref(...)
+ -- all with an optional arg, which, if present, gets passed as first argument (after self if present)
+ target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
+ if type(eventname) ~= "string" then
+ error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
+ end
+
+ method = method or eventname
+
+ local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
+
+ if type(method) ~= "string" and type(method) ~= "function" then
+ error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
+ end
+
+ local regfunc
+
+ if type(method) == "string" then
+ -- self["method"] calling style
+ if type(self) ~= "table" then
+ error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
+ elseif self==target then
+ error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
+ elseif type(self[method]) ~= "function" then
+ error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
+ end
+
+ if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
+ local arg=select(1,...)
+ regfunc = function(...) self[method](self,arg,...) end
+ else
+ regfunc = function(...) self[method](self,...) end
+ end
+ else
+ -- function ref with self=object or self="addonId" or self=thread
+ if type(self)~="table" and type(self)~="string" and type(self)~="thread" then
+ error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2)
+ end
+
+ if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
+ local arg=select(1,...)
+ regfunc = function(...) method(arg,...) end
+ else
+ regfunc = method
+ end
+ end
+
+
+ if events[eventname][self] or registry.recurse<1 then
+ -- if registry.recurse<1 then
+ -- we're overwriting an existing entry, or not currently recursing. just set it.
+ events[eventname][self] = regfunc
+ -- fire OnUsed callback?
+ if registry.OnUsed and first then
+ registry.OnUsed(registry, target, eventname)
+ end
+ else
+ -- we're currently processing a callback in this registry, so delay the registration of this new entry!
+ -- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
+ registry.insertQueue = registry.insertQueue or setmetatable({},meta)
+ registry.insertQueue[eventname][self] = regfunc
+ end
+ end
+
+ -- Unregister a callback
+ target[UnregisterName] = function(self, eventname)
+ if not self or self==target then
+ error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
+ end
+ if type(eventname) ~= "string" then
+ error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
+ end
+ if rawget(events, eventname) and events[eventname][self] then
+ events[eventname][self] = nil
+ -- Fire OnUnused callback?
+ if registry.OnUnused and not next(events[eventname]) then
+ registry.OnUnused(registry, target, eventname)
+ end
+ end
+ if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
+ registry.insertQueue[eventname][self] = nil
+ end
+ end
+
+ -- OPTIONAL: Unregister all callbacks for given selfs/addonIds
+ if UnregisterAllName then
+ target[UnregisterAllName] = function(...)
+ if select("#",...)<1 then
+ error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
+ end
+ if select("#",...)==1 and ...==target then
+ error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
+ end
+
+
+ for i=1,select("#",...) do
+ local self = select(i,...)
+ if registry.insertQueue then
+ for eventname, callbacks in pairs(registry.insertQueue) do
+ if callbacks[self] then
+ callbacks[self] = nil
+ end
+ end
+ end
+ for eventname, callbacks in pairs(events) do
+ if callbacks[self] then
+ callbacks[self] = nil
+ -- Fire OnUnused callback?
+ if registry.OnUnused and not next(callbacks) then
+ registry.OnUnused(registry, target, eventname)
+ end
+ end
+ end
+ end
+ end
+ end
+
+ return registry
+end
+
+
+-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
+-- try to upgrade old implicit embeds since the system is selfcontained and
+-- relies on closures to work.
+
diff --git a/AtlasLoot/Libs/LibAboutPanel/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml b/AtlasLoot/Libs/LibAboutPanel/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
new file mode 100644
index 0000000..1aad3a2
--- /dev/null
+++ b/AtlasLoot/Libs/LibAboutPanel/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/AtlasLoot/Libs/LibAboutPanel/libs/LibStub/LibStub.lua b/AtlasLoot/Libs/LibAboutPanel/libs/LibStub/LibStub.lua
new file mode 100644
index 0000000..cfc97de
--- /dev/null
+++ b/AtlasLoot/Libs/LibAboutPanel/libs/LibStub/LibStub.lua
@@ -0,0 +1,30 @@
+-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
+-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
+local LibStub = _G[LIBSTUB_MAJOR]
+
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+ LibStub = LibStub or {libs = {}, minors = {} }
+ _G[LIBSTUB_MAJOR] = LibStub
+ LibStub.minor = LIBSTUB_MINOR
+
+ function LibStub:NewLibrary(major, minor)
+ assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+ minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
+
+ local oldminor = self.minors[major]
+ if oldminor and oldminor >= minor then return nil end
+ self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+ return self.libs[major], oldminor
+ end
+
+ function LibStub:GetLibrary(major, silent)
+ if not self.libs[major] and not silent then
+ error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
+ end
+ return self.libs[major], self.minors[major]
+ end
+
+ function LibStub:IterateLibraries() return pairs(self.libs) end
+ setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
diff --git a/AtlasLoot/Libs/LibAboutPanel/libs/LibStub/LibStub.toc b/AtlasLoot/Libs/LibAboutPanel/libs/LibStub/LibStub.toc
new file mode 100644
index 0000000..b43e20c
--- /dev/null
+++ b/AtlasLoot/Libs/LibAboutPanel/libs/LibStub/LibStub.toc
@@ -0,0 +1,13 @@
+## Interface: 20400
+## Title: Lib: LibStub
+## Notes: Universal Library Stub
+## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
+## X-Website: http://jira.wowace.com/browse/LS
+## X-Category: Library
+## X-License: Public Domain
+## X-Curse-Packaged-Version: 1.0
+## X-Curse-Project-Name: LibStub
+## X-Curse-Project-ID: libstub
+## X-Curse-Repository-ID: wow/libstub/mainline
+
+LibStub.lua
diff --git a/AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-3.0.lua b/AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-3.0.lua
new file mode 100644
index 0000000..9b032f3
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-3.0.lua
@@ -0,0 +1,292 @@
+-- LibBabble-3.0 is hereby placed in the Public Domain
+-- Credits: ckknight
+local LIBBABBLE_MAJOR, LIBBABBLE_MINOR = "LibBabble-3.0", 2
+
+local LibBabble = LibStub:NewLibrary(LIBBABBLE_MAJOR, LIBBABBLE_MINOR)
+if not LibBabble then
+ return
+end
+
+local data = LibBabble.data or {}
+for k,v in pairs(LibBabble) do
+ LibBabble[k] = nil
+end
+LibBabble.data = data
+
+local tablesToDB = {}
+for namespace, db in pairs(data) do
+ for k,v in pairs(db) do
+ tablesToDB[v] = db
+ end
+end
+
+local function warn(message)
+ local _, ret = pcall(error, message, 3)
+ geterrorhandler()(ret)
+end
+
+local lookup_mt = { __index = function(self, key)
+ local db = tablesToDB[self]
+ local current_key = db.current[key]
+ if current_key then
+ self[key] = current_key
+ return current_key
+ end
+ local base_key = db.base[key]
+ local real_MAJOR_VERSION
+ for k,v in pairs(data) do
+ if v == db then
+ real_MAJOR_VERSION = k
+ break
+ end
+ end
+ if not real_MAJOR_VERSION then
+ real_MAJOR_VERSION = LIBBABBLE_MAJOR
+ end
+ if base_key then
+ warn(("%s: Translation %q not found for locale %q"):format(real_MAJOR_VERSION, key, GetLocale()))
+ rawset(self, key, base_key)
+ return base_key
+ end
+ warn(("%s: Translation %q not found."):format(real_MAJOR_VERSION, key))
+ rawset(self, key, key)
+ return key
+end }
+
+local function initLookup(module, lookup)
+ local db = tablesToDB[module]
+ for k in pairs(lookup) do
+ lookup[k] = nil
+ end
+ setmetatable(lookup, lookup_mt)
+ tablesToDB[lookup] = db
+ db.lookup = lookup
+ return lookup
+end
+
+local function initReverse(module, reverse)
+ local db = tablesToDB[module]
+ for k in pairs(reverse) do
+ reverse[k] = nil
+ end
+ for k,v in pairs(db.current) do
+ reverse[v] = k
+ end
+ tablesToDB[reverse] = db
+ db.reverse = reverse
+ db.reverseIterators = nil
+ return reverse
+end
+
+local prototype = {}
+local prototype_mt = {__index = prototype}
+
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will warn but allow the code to pass through.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local BL = B:GetLookupTable()
+ assert(BL["Some english word"] == "Some localized word")
+ DoSomething(BL["Some english word that doesn't exist"]) -- warning!
+-----------------------------------------------------------------------------]]
+function prototype:GetLookupTable()
+ local db = tablesToDB[self]
+
+ local lookup = db.lookup
+ if lookup then
+ return lookup
+ end
+ return initLookup(self, {})
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local B_has = B:GetUnstrictLookupTable()
+ assert(B_has["Some english word"] == "Some localized word")
+ assert(B_has["Some english word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetUnstrictLookupTable()
+ local db = tablesToDB[self]
+
+ return db.current
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+ * This is useful for checking if the base (English) table has a key, even if the localized one does not have it registered.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local B_hasBase = B:GetBaseLookupTable()
+ assert(B_hasBase["Some english word"] == "Some english word")
+ assert(B_hasBase["Some english word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetBaseLookupTable()
+ local db = tablesToDB[self]
+
+ return db.base
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+ * This will return only one English word that it maps to, if there are more than one to check, see :GetReverseIterator("word")
+Returns:
+ A lookup table for localized to english words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local BR = B:GetReverseLookupTable()
+ assert(BR["Some localized word"] == "Some english word")
+ assert(BR["Some localized word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetReverseLookupTable()
+ local db = tablesToDB[self]
+
+ local reverse = db.reverse
+ if reverse then
+ return reverse
+ end
+ return initReverse(self, {})
+end
+local blank = {}
+local weakVal = {__mode='v'}
+--[[---------------------------------------------------------------------------
+Arguments:
+ string - the localized word to chek for.
+Returns:
+ An iterator to traverse all English words that map to the given key
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ for word in B:GetReverseIterator("Some localized word") do
+ DoSomething(word)
+ end
+-----------------------------------------------------------------------------]]
+function prototype:GetReverseIterator(key)
+ local db = tablesToDB[self]
+ local reverseIterators = db.reverseIterators
+ if not reverseIterators then
+ reverseIterators = setmetatable({}, weakVal)
+ db.reverseIterators = reverseIterators
+ elseif reverseIterators[key] then
+ return pairs(reverseIterators[key])
+ end
+ local t
+ for k,v in pairs(db.current) do
+ if v == key then
+ if not t then
+ t = {}
+ end
+ t[k] = true
+ end
+ end
+ reverseIterators[key] = t or blank
+ return pairs(reverseIterators[key])
+end
+--[[---------------------------------------------------------------------------
+Returns:
+ An iterator to traverse all translations English to localized.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ for english, localized in B:Iterate() do
+ DoSomething(english, localized)
+ end
+-----------------------------------------------------------------------------]]
+function prototype:Iterate()
+ local db = tablesToDB[self]
+
+ return pairs(db.current)
+end
+
+-- #NODOC
+-- modules need to call this to set the base table
+function prototype:SetBaseTranslations(base)
+ local db = tablesToDB[self]
+ local oldBase = db.base
+ if oldBase then
+ for k in pairs(oldBase) do
+ oldBase[k] = nil
+ end
+ for k, v in pairs(base) do
+ oldBase[k] = v
+ end
+ base = oldBase
+ else
+ db.base = base
+ end
+ for k,v in pairs(base) do
+ if v == true then
+ base[k] = k
+ end
+ end
+end
+
+local function init(module)
+ local db = tablesToDB[module]
+ if db.lookup then
+ initLookup(module, db.lookup)
+ end
+ if db.reverse then
+ initReverse(module, db.reverse)
+ end
+ db.reverseIterators = nil
+end
+
+-- #NODOC
+-- modules need to call this to set the current table. if current is true, use the base table.
+function prototype:SetCurrentTranslations(current)
+ local db = tablesToDB[self]
+ if current == true then
+ db.current = db.base
+ else
+ local oldCurrent = db.current
+ if oldCurrent then
+ for k in pairs(oldCurrent) do
+ oldCurrent[k] = nil
+ end
+ for k, v in pairs(current) do
+ oldCurrent[k] = v
+ end
+ current = oldCurrent
+ else
+ db.current = current
+ end
+ end
+ init(self)
+end
+
+for namespace, db in pairs(data) do
+ setmetatable(db.module, prototype_mt)
+ init(db.module)
+end
+
+-- #NODOC
+-- modules need to call this to create a new namespace.
+function LibBabble:New(namespace, minor)
+ local module, oldminor = LibStub:NewLibrary(namespace, minor)
+ if not module then
+ return
+ end
+
+ if not oldminor then
+ local db = {
+ module = module,
+ }
+ data[namespace] = db
+ tablesToDB[module] = db
+ else
+ for k,v in pairs(module) do
+ module[k] = nil
+ end
+ end
+
+ setmetatable(module, prototype_mt)
+
+ return module
+end
diff --git a/AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-Boss-3.0.lua b/AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-Boss-3.0.lua
new file mode 100644
index 0000000..71ec278
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-Boss-3.0.lua
@@ -0,0 +1,6649 @@
+--[[
+Name: LibBabble-Boss-3.0
+Revision: $Rev: 296 $
+Maintainers: ckknight, nevcairiel, Ackis
+Website: http://www.wowace.com/projects/libbabble-boss-3-0/
+Dependencies: None
+License: MIT
+]]
+
+local MAJOR_VERSION = "LibBabble-Boss-3.0"
+local MINOR_VERSION = 90000 + tonumber(("$Rev: 296 $"):match("%d+"))
+
+if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
+local lib = LibStub("LibBabble-3.0"):New(MAJOR_VERSION, MINOR_VERSION)
+if not lib then return end
+
+local GAME_LOCALE = GetLocale()
+
+lib:SetBaseTranslations {
+ Acidmaw = "Acidmaw",
+ Aeonus = "Aeonus",
+ ["Aerial Command Unit"] = "Aerial Command Unit",
+ ["Agathelos the Raging"] = "Agathelos the Raging",
+ ["Aggem Thorncurse"] = "Aggem Thorncurse",
+ Ahune = "Ahune",
+ ["Akil'zon"] = "Akil'zon",
+ ["Aku'mai"] = "Aku'mai",
+ ["Al'ar"] = "Al'ar",
+ ["Algalon the Observer"] = "Algalon the Observer",
+ ["Alzzin the Wildshaper"] = "Alzzin the Wildshaper",
+ Amanitar = "Amanitar",
+ ["Ambassador Flamelash"] = "Ambassador Flamelash",
+ ["Ambassador Hellmaw"] = "Ambassador Hellmaw",
+ ["Amnennar the Coldbringer"] = "Amnennar the Coldbringer",
+ ["Ancient Stone Keeper"] = "Ancient Stone Keeper",
+ Anetheron = "Anetheron",
+ ["Anger'rel"] = "Anger'rel",
+ Anomalus = "Anomalus",
+ ["Antu'sul"] = "Antu'sul",
+ ["Anub'arak"] = "Anub'arak",
+ ["Anubisath Defender"] = "Anubisath Defender",
+ ["Anubisath Guardian"] = "Anubisath Guardian",
+ ["Anub'Rekhan"] = "Anub'Rekhan",
+ ["Anub'shiah"] = "Anub'shiah",
+ Anzu = "Anzu",
+ ["Arcane Watchman"] = "Arcane Watchman",
+ ["Arcanist Doan"] = "Arcanist Doan",
+ Archaedas = "Archaedas",
+ ["Archavon the Stone Watcher"] = "Archavon the Stone Watcher",
+ Archimonde = "Archimonde",
+ ["Archivist Galford"] = "Archivist Galford",
+ ["Archmage Arugal"] = "Archmage Arugal",
+ ["Argent Confessor Paletress"] = "Argent Confessor Paletress",
+ ["Arugal's Voidwalker"] = "Arugal's Voidwalker",
+ ["Ascendant Lord Obsidius"] = "Ascendant Lord Obsidius",
+ ["Assault Bot"] = "Assault Bot",
+ ["Assembly of Iron"] = "Assembly of Iron",
+ ["Atal'alarion"] = "Atal'alarion",
+ ["Attumen the Huntsman"] = "Attumen the Huntsman",
+ Auriaya = "Auriaya",
+ Avalanchion = "Avalanchion",
+ ["Avatar of Hakkar"] = "Avatar of Hakkar",
+ ["Ayamiss the Hunter"] = "Ayamiss the Hunter",
+ Azgalor = "Azgalor",
+ ["Azshir the Sleepless"] = "Azshir the Sleepless",
+ Azuregos = "Azuregos",
+ ["Bael'Gar"] = "Bael'Gar",
+ Baelog = "Baelog",
+ Balnazzar = "Balnazzar",
+ ["Baltharus the Warborn"] = "Baltharus the Warborn",
+ ["Bannok Grimaxe"] = "Bannok Grimaxe",
+ ["Baron Aquanis"] = "Baron Aquanis",
+ ["Baron Charr"] = "Baron Charr",
+ ["Baroness Anastari"] = "Baroness Anastari",
+ ["Baron Geddon"] = "Baron Geddon",
+ ["Baron Kazum"] = "Baron Kazum",
+ ["Baron Rivendare"] = "Baron Rivendare",
+ ["Baron Silverlaine"] = "Baron Silverlaine",
+ ["Battleguard Sartura"] = "Battleguard Sartura",
+ ["Bazil Thredd"] = "Bazil Thredd",
+ Bazzalan = "Bazzalan",
+ Beauty = "Beauty",
+ ["Black Guard Swordsmith"] = "Black Guard Swordsmith",
+ ["Blackheart the Inciter"] = "Blackheart the Inciter",
+ ["Blindeye the Seer"] = "Blindeye the Seer",
+ ["Blind Hunter"] = "Blind Hunter",
+ ["Blood Guard Porung"] = "Blood Guard Porung",
+ ["Bloodlord Mandokir"] = "Bloodlord Mandokir",
+ ["Bloodmage Thalnos"] = "Bloodmage Thalnos",
+ ["Blood Prince Council"] = "Blood Prince Council",
+ ["Blood Princes"] = "Blood Princes",
+ ["Blood-Queen Lana'thel"] = "Blood-Queen Lana'thel",
+ ["Blood Steward of Kirtonos"] = "Blood Steward of Kirtonos",
+ Boahn = "Boahn",
+ ["Bomb Bot"] = "Bomb Bot",
+ ["Brain of Yogg-Saron"] = "Brain of Yogg-Saron",
+ ["Brainwashed Noble"] = "Brainwashed Noble",
+ Broggok = "Broggok",
+ Brokentoe = "Brokentoe",
+ Bronjahm = "Bronjahm",
+ ["Broodlord Lashlayer"] = "Broodlord Lashlayer",
+ ["Bruegal Ironknuckle"] = "Bruegal Ironknuckle",
+ Brutallus = "Brutallus",
+ ["Burning Felguard"] = "Burning Felguard",
+ ["Buru the Gorger"] = "Buru the Gorger",
+ ["Cache of the Firelord"] = "Cache of the Firelord",
+ ["Cache of the Legion"] = "Cache of the Legion",
+ ["Cannon Master Willey"] = "Cannon Master Willey",
+ ["Captain Greenskin"] = "Captain Greenskin",
+ ["Captain Kromcrush"] = "Captain Kromcrush",
+ ["Captain Skarloc"] = "Captain Skarloc",
+ ["Celebras the Cursed"] = "Celebras the Cursed",
+ ["Charlga Razorflank"] = "Charlga Razorflank",
+ ["Chess Event"] = "Chess Event",
+ ["Chest of The Seven"] = "Chest of The Seven",
+ ["Chief Ukorz Sandscalp"] = "Chief Ukorz Sandscalp",
+ ["Cho'Rush the Observer"] = "Cho'Rush the Observer",
+ Chromaggus = "Chromaggus",
+ ["Chrono Lord Deja"] = "Chrono Lord Deja",
+ ["Chrono-Lord Epoch"] = "Chrono-Lord Epoch",
+ Claw = "Claw",
+ ["Coilfang Elite"] = "Coilfang Elite",
+ ["Coilfang Strider"] = "Coilfang Strider",
+ ["Commander Kolurg"] = "Commander Kolurg",
+ ["Commander Sarannis"] = "Commander Sarannis",
+ ["Commander Springvale"] = "Commander Springvale",
+ ["Commander Stoutbeard"] = "Commander Stoutbeard",
+ ["Commander Ulthok"] = "Commander Ulthok",
+ ["Constructor & Controller"] = "Constructor & Controller",
+ Cookie = "Cookie",
+ ["Coren Direbrew"] = "Coren Direbrew",
+ ["Corla, Herald of Twilight"] = "Corla, Herald of Twilight",
+ ["Cosmic Infuser"] = "Cosmic Infuser",
+ ["Crimson Hammersmith"] = "Crimson Hammersmith",
+ ["Crowd Pummeler 9-60"] = "Crowd Pummeler 9-60",
+ ["Crystal Fang"] = "Crystal Fang",
+ ["C'Thun"] = "C'Thun",
+ Cyanigosa = "Cyanigosa",
+ ["Dalliah the Doomsayer"] = "Dalliah the Doomsayer",
+ ["Dalronn the Controller"] = "Dalronn the Controller",
+ ["Dark Coffer"] = "Dark Coffer",
+ ["Dark Iron Ambassador"] = "Dark Iron Ambassador",
+ ["Darkmaster Gandling"] = "Darkmaster Gandling",
+ ["Darkweaver Syth"] = "Darkweaver Syth",
+ ["Deathbound Ward"] = "Deathbound Ward",
+ ["Deathbringer Saurfang"] = "Deathbringer Saurfang",
+ ["Death Knight Darkreaver"] = "Death Knight Darkreaver",
+ ["Death Knight Understudy"] = "Death Knight Understudy",
+ ["Deathspeaker High Priest"] = "Deathspeaker High Priest",
+ ["Death Speaker Jargba"] = "Death Speaker Jargba",
+ ["Deathstalker Visceri"] = "Deathstalker Visceri",
+ ["Deathsworn Captain"] = "Deathsworn Captain",
+ Devastation = "Devastation",
+ ["Deviate Faerie Dragon"] = "Deviate Faerie Dragon",
+ ["Devourer of Souls"] = "Devourer of Souls",
+ ["Dextren Ward"] = "Dextren Ward",
+ ["Digmaster Shovelphlange"] = "Digmaster Shovelphlange",
+ ["Doctor Theolen Krastinov"] = "Doctor Theolen Krastinov",
+ ["Doom Lord Kazzak"] = "Doom Lord Kazzak",
+ ["Doom'rel"] = "Doom'rel",
+ Doomwalker = "Doomwalker",
+ ["Dope'rel"] = "Dope'rel",
+ Dorothee = "Dorothee",
+ ["Drahga Shodowburner"] = "Drahga Shodowburner",
+ ["Drakkari Colossus"] = "Drakkari Colossus",
+ ["Drakos the Interrogator"] = "Drakos the Interrogator",
+ Dreadscale = "Dreadscale",
+ Dreamscythe = "Dreamscythe",
+ ["Dust Covered Chest"] = "Dust Covered Chest",
+ Dustwraith = "Dustwraith",
+ ["Eadric the Pure"] = "Eadric the Pure",
+ ["Earthcaller Halmgar"] = "Earthcaller Halmgar",
+ Ebonroc = "Ebonroc",
+ ["Eck the Ferocious"] = "Eck the Ferocious",
+ ["Edwin VanCleef"] = "Edwin VanCleef",
+ ["Elder Brightleaf"] = "Elder Brightleaf",
+ ["Elder Ironbranch"] = "Elder Ironbranch",
+ ["Elder Nadox"] = "Elder Nadox",
+ ["Elder Stonebark"] = "Elder Stonebark",
+ ["Electrocutioner 6000"] = "Electrocutioner 6000",
+ ["Emalon the Storm Watcher"] = "Emalon the Storm Watcher",
+ Emeriss = "Emeriss",
+ ["Emperor Dagran Thaurissan"] = "Emperor Dagran Thaurissan",
+ ["Emperor Vek'lor"] = "Emperor Vek'lor",
+ ["Emperor Vek'nilash"] = "Emperor Vek'nilash",
+ Entropius = "Entropius",
+ ["Eonar's Gift"] = "Eonar's Gift",
+ ["Epoch Hunter"] = "Epoch Hunter",
+ Erekem = "Erekem",
+ ["Eressea Dawnsinger"] = "Eressea Dawnsinger",
+ ["Eric \"The Swift\""] = "Eric \"The Swift\"",
+ Erudax = "Erudax",
+ ["Erunak Stonespeaker"] = "Erunak Stonespeaker",
+ ["Essence of Anger"] = "Essence of Anger",
+ ["Essence of Desire"] = "Essence of Desire",
+ ["Essence of Suffering"] = "Essence of Suffering",
+ Eviscerator = "Eviscerator",
+ ["Exarch Maladaar"] = "Exarch Maladaar",
+ ["Expedition Commander"] = "Expedition Commander",
+ ["Eydis Darkbane"] = "Eydis Darkbane",
+ ["Eye of C'Thun"] = "Eye of C'Thun",
+ ["Faction Champions"] = "Faction Champions",
+ ["Fallen Champion"] = "Fallen Champion",
+ Falric = "Falric",
+ ["Falric and Marwyn"] = "Falric and Marwyn",
+ ["Fankriss the Unyielding"] = "Fankriss the Unyielding",
+ ["Fathom-Lord Karathress"] = "Fathom-Lord Karathress",
+ Felmyst = "Felmyst",
+ ["Fenrus the Devourer"] = "Fenrus the Devourer",
+ ["Feral Defender"] = "Feral Defender",
+ Festergut = "Festergut",
+ Feugen = "Feugen",
+ ["Fineous Darkvire"] = "Fineous Darkvire",
+ Firemaw = "Firemaw",
+ ["Fjola Lightbane"] = "Fjola Lightbane",
+ Flamegor = "Flamegor",
+ ["Flame Leviathan"] = "Flame Leviathan",
+ ["Foreman Thistlenettle"] = "Foreman Thistlenettle",
+ ["Forgemaster Garfrost"] = "Forgemaster Garfrost",
+ ["Forgremaster Throngus"] = "Forgremaster Throngus",
+ ["Four Horsemen Chest"] = "Four Horsemen Chest",
+ ["Fras Siabi"] = "Fras Siabi",
+ Freya = "Freya",
+ ["Gahz'ranka"] = "Gahz'ranka",
+ ["Gahz'rilla"] = "Gahz'rilla",
+ ["Gal'darah"] = "Gal'darah",
+ ["Galgann Firehammer"] = "Galgann Firehammer",
+ Garr = "Garr",
+ ["Garrosh Hellscream"] = "Garrosh Hellscream",
+ Gasher = "Gasher",
+ ["Gatewatcher Gyro-Kill"] = "Gatewatcher Gyro-Kill",
+ ["Gatewatcher Iron-Hand"] = "Gatewatcher Iron-Hand",
+ ["Gathios the Shatterer"] = "Gathios the Shatterer",
+ Gehennas = "Gehennas",
+ Gelihast = "Gelihast",
+ Gelk = "Gelk",
+ ["General Angerforge"] = "General Angerforge",
+ ["General Bjarngrim"] = "General Bjarngrim",
+ ["General Drakkisath"] = "General Drakkisath",
+ ["General Rajaxx"] = "General Rajaxx",
+ ["General Umbriss"] = "General Umbriss",
+ ["General Vezax"] = "General Vezax",
+ ["General Zarithrian"] = "General Zarithrian",
+ ["Ghamoo-ra"] = "Ghamoo-ra",
+ ["Ghaz'an"] = "Ghaz'an",
+ ["Ghok Bashguud"] = "Ghok Bashguud",
+ Gilnid = "Gilnid",
+ ["Gizrul the Slavener"] = "Gizrul the Slavener",
+ ["Gloom'rel"] = "Gloom'rel",
+ Gluth = "Gluth",
+ Glutton = "Glutton",
+ ["Golemagg the Incinerator"] = "Golemagg the Incinerator",
+ ["Golem Lord Argelmach"] = "Golem Lord Argelmach",
+ ["Goraluk Anvilcrack"] = "Goraluk Anvilcrack",
+ ["Gormok the Impaler"] = "Gormok the Impaler",
+ ["Gorosh the Dervish"] = "Gorosh the Dervish",
+ ["Gortok Palehoof"] = "Gortok Palehoof",
+ ["Gothik the Harvester"] = "Gothik the Harvester",
+ ["Grand Astromancer Capernian"] = "Grand Astromancer Capernian",
+ ["Grand Champions"] = "Grand Champions",
+ ["Grand Crusader Dathrohan"] = "Grand Crusader Dathrohan",
+ ["Grand Magus Telestra"] = "Grand Magus Telestra",
+ ["Grandmaster Vorpil"] = "Grandmaster Vorpil",
+ Grandmother = "Grandmother",
+ ["Grand Warlock Alythess"] = "Grand Warlock Alythess",
+ ["Grand Warlock Nethekurse"] = "Grand Warlock Nethekurse",
+ ["Grand Widow Faerlina"] = "Grand Widow Faerlina",
+ ["Grethok the Controller"] = "Grethok the Controller",
+ ["Gri'lek"] = "Gri'lek",
+ Grimlok = "Grimlok",
+ Grizzle = "Grizzle",
+ Grobbulus = "Grobbulus",
+ Grubbis = "Grubbis",
+ ["Gruul the Dragonkiller"] = "Gruul the Dragonkiller",
+ ["Guard Fengus"] = "Guard Fengus",
+ ["Guardian of Yogg-Saron"] = "Guardian of Yogg-Saron",
+ ["Guard Mol'dar"] = "Guard Mol'dar",
+ ["Guard Slip'kik"] = "Guard Slip'kik",
+ ["Gurtogg Bloodboil"] = "Gurtogg Bloodboil",
+ Gyth = "Gyth",
+ Hadronox = "Hadronox",
+ Hakkar = "Hakkar",
+ Halazzi = "Halazzi",
+ Halion = "Halion",
+ Halycon = "Halycon",
+ Hamhock = "Hamhock",
+ ["Harbinger Skyriss"] = "Harbinger Skyriss",
+ ["Hate'rel"] = "Hate'rel",
+ ["Hazza'rah"] = "Hazza'rah",
+ Hazzas = "Hazzas",
+ ["Headless Horseman"] = "Headless Horseman",
+ ["Hearthsinger Forresten"] = "Hearthsinger Forresten",
+ ["Hedrum the Creeper"] = "Hedrum the Creeper",
+ ["Heigan the Unclean"] = "Heigan the Unclean",
+ ["Hellfire Channeler"] = "Hellfire Channeler",
+ ["Henry Stern"] = "Henry Stern",
+ ["Herald Volazj"] = "Herald Volazj",
+ Herod = "Herod",
+ ["Hex Lord Malacrass"] = "Hex Lord Malacrass",
+ ["High Astromancer Solarian"] = "High Astromancer Solarian",
+ ["High Botanist Freywinn"] = "High Botanist Freywinn",
+ ["High Inquisitor Fairbanks"] = "High Inquisitor Fairbanks",
+ ["High Inquisitor Whitemane"] = "High Inquisitor Whitemane",
+ ["High Interrogator Gerstahn"] = "High Interrogator Gerstahn",
+ ["High King Maulgar"] = "High King Maulgar",
+ ["Highlord Mograine"] = "Highlord Mograine",
+ ["Highlord Omokk"] = "Highlord Omokk",
+ ["High Marshal Whirlaxis"] = "High Marshal Whirlaxis",
+ ["High Nethermancer Zerevor"] = "High Nethermancer Zerevor",
+ ["High Overlord Saurfang"] = "High Overlord Saurfang",
+ ["High Priestess Arlokk"] = "High Priestess Arlokk",
+ ["High Priestess Jeklik"] = "High Priestess Jeklik",
+ ["High Priestess Mar'li"] = "High Priestess Mar'li",
+ ["High Priestess of Thaurissan"] = "High Priestess of Thaurissan",
+ ["High Priest Thekal"] = "High Priest Thekal",
+ ["High Priest Venoxis"] = "High Priest Venoxis",
+ ["High Warlord Naj'entus"] = "High Warlord Naj'entus",
+ Hodir = "Hodir",
+ ["Houndmaster Grebmar"] = "Houndmaster Grebmar",
+ ["Houndmaster Loksey"] = "Houndmaster Loksey",
+ Hukku = "Hukku",
+ Hungarfen = "Hungarfen",
+ ["Hurley Blackbreath"] = "Hurley Blackbreath",
+ ["Hyakiss the Lurker"] = "Hyakiss the Lurker",
+ ["Hydromancer Thespia"] = "Hydromancer Thespia",
+ ["Hydromancer Velratha"] = "Hydromancer Velratha",
+ Hydrospawn = "Hydrospawn",
+ ["Hydross the Unstable"] = "Hydross the Unstable",
+ ["Icecrown Gunship Battle"] = "Icecrown Gunship Battle",
+ Icehowl = "Icehowl",
+ ["Ice Sphere"] = "Ice Sphere",
+ Ichoron = "Ichoron",
+ Ick = "Ick",
+ ["Ignis the Furnace Master"] = "Ignis the Furnace Master",
+ ["Illidan Stormrage"] = "Illidan Stormrage",
+ ["Illidari Council"] = "Illidari Council",
+ ["Illyanna Ravenoak"] = "Illyanna Ravenoak",
+ ["Immol'thar"] = "Immol'thar",
+ ["Infinite Corruptor"] = "Infinite Corruptor",
+ ["Infinity Blades"] = "Infinity Blades",
+ ["Ingvar the Plunderer"] = "Ingvar the Plunderer",
+ ["Instructor Malicia"] = "Instructor Malicia",
+ ["Instructor Razuvious"] = "Instructor Razuvious",
+ ["Interrogator Vishas"] = "Interrogator Vishas",
+ Ionar = "Ionar",
+ Ironaya = "Ironaya",
+ Ironspine = "Ironspine",
+ Isalien = "Isalien",
+ Jade = "Jade",
+ ["Jammal'an the Prophet"] = "Jammal'an the Prophet",
+ ["Jan'alai"] = "Jan'alai",
+ ["Jandice Barov"] = "Jandice Barov",
+ ["Jedoga Shadowseeker"] = "Jedoga Shadowseeker",
+ ["Jed Runewatcher"] = "Jed Runewatcher",
+ ["Jergosh the Invoker"] = "Jergosh the Invoker",
+ ["Jin'do the Hexxer"] = "Jin'do the Hexxer",
+ ["Jormungar Behemoth"] = "Jormungar Behemoth",
+ Jormungars = "Jormungars",
+ Julianne = "Julianne",
+ ["Junk Bot"] = "Junk Bot",
+ ["Kael'thas Sunstrider"] = "Kael'thas Sunstrider",
+ Kalecgos = "Kalecgos",
+ ["Kam Deepfury"] = "Kam Deepfury",
+ ["Karsh Steelbender"] = "Karsh Steelbender",
+ ["Kazkaz the Unholy"] = "Kazkaz the Unholy",
+ ["Kaz'rogal"] = "Kaz'rogal",
+ ["Keli'dan the Breaker"] = "Keli'dan the Breaker",
+ ["Kel'Thuzad"] = "Kel'Thuzad",
+ Keristrasza = "Keristrasza",
+ ["Kiggler the Crazed"] = "Kiggler the Crazed",
+ ["Kil'jaeden"] = "Kil'jaeden",
+ ["Kil'rek"] = "Kil'rek",
+ ["King Dred"] = "King Dred",
+ ["King Gordok"] = "King Gordok",
+ ["King Llane Piece"] = "King Llane Piece",
+ ["King Ymiron"] = "King Ymiron",
+ ["Kirtonos the Herald"] = "Kirtonos the Herald",
+ ["Knot Thimblejack's Cache"] = "Knot Thimblejack's Cache",
+ Kolk = "Kolk",
+ Kologarn = "Kologarn",
+ ["Koralon the Flame Watcher"] = "Koralon the Flame Watcher",
+ Kormok = "Kormok",
+ Kresh = "Kresh",
+ Krick = "Krick",
+ ["Krick and Ick"] = "Krick and Ick",
+ ["Krik'thir the Gatewatcher"] = "Krik'thir the Gatewatcher",
+ ["Krosh Firehand"] = "Krosh Firehand",
+ Krystallus = "Krystallus",
+ Kurinnaxx = "Kurinnaxx",
+ ["Lady Anacondra"] = "Lady Anacondra",
+ ["Lady Blaumeux"] = "Lady Blaumeux",
+ ["Lady Deathwhisper"] = "Lady Deathwhisper",
+ ["Lady Illucia Barov"] = "Lady Illucia Barov",
+ ["Lady Malande"] = "Lady Malande",
+ ["Lady Naz'jar"] = "Lady Naz'jar",
+ ["Lady Sacrolash"] = "Lady Sacrolash",
+ ["Lady Sarevess"] = "Lady Sarevess",
+ ["Lady Vashj"] = "Lady Vashj",
+ Laj = "Laj",
+ Landslide = "Landslide",
+ Lavanthor = "Lavanthor",
+ ["Left Arm"] = "Left Arm",
+ ["Leotheras the Blind"] = "Leotheras the Blind",
+ Lethon = "Lethon",
+ Lethtendris = "Lethtendris",
+ ["Leviathan Mk II"] = "Leviathan Mk II",
+ ["Ley-Guardian Eregos"] = "Ley-Guardian Eregos",
+ ["Lieutenant Drake"] = "Lieutenant Drake",
+ ["Lieutenant General Andorov"] = "Lieutenant General Andorov",
+ Loatheb = "Loatheb",
+ Loken = "Loken",
+ ["Lord Alexei Barov"] = "Lord Alexei Barov",
+ ["Lord Cobrahn"] = "Lord Cobrahn",
+ ["Lord Hel'nurath"] = "Lord Hel'nurath",
+ ["Lord Incendius"] = "Lord Incendius",
+ ["Lord Jaraxxus"] = "Lord Jaraxxus",
+ ["Lord Kazzak"] = "Lord Kazzak",
+ ["Lord Kri"] = "Lord Kri",
+ ["Lord Marrowgar"] = "Lord Marrowgar",
+ ["Lord Pythas"] = "Lord Pythas",
+ ["Lord Roccor"] = "Lord Roccor",
+ ["Lord Sanguinar"] = "Lord Sanguinar",
+ ["Lord Serpentis"] = "Lord Serpentis",
+ ["Lord Skwol"] = "Lord Skwol",
+ ["Lord Valthalak"] = "Lord Valthalak",
+ ["Lord Victor Nefarius"] = "Lord Victor Nefarius",
+ ["Lord Vyletongue"] = "Lord Vyletongue",
+ ["Lorekeeper Polkelt"] = "Lorekeeper Polkelt",
+ ["Lorgus Jett"] = "Lorgus Jett",
+ Loro = "Loro",
+ Lucifron = "Lucifron",
+ ["Mad Magglish"] = "Mad Magglish",
+ Maexxna = "Maexxna",
+ ["Mage-Lord Urom"] = "Mage-Lord Urom",
+ ["Magister Kalendris"] = "Magister Kalendris",
+ ["Magistrate Barthilas"] = "Magistrate Barthilas",
+ Magmadar = "Magmadar",
+ Magmus = "Magmus",
+ Magra = "Magra",
+ Magtheridon = "Magtheridon",
+ ["Maiden of Grief"] = "Maiden of Grief",
+ ["Maiden of Virtue"] = "Maiden of Virtue",
+ ["Majordomo Executus"] = "Majordomo Executus",
+ Malacrass = "Malacrass",
+ ["Maleki the Pallid"] = "Maleki the Pallid",
+ ["Mal'Ganis"] = "Mal'Ganis",
+ Malygos = "Malygos",
+ Maraudos = "Maraudos",
+ ["Marduk Blackpool"] = "Marduk Blackpool",
+ ["Marisa du'Paige"] = "Marisa du'Paige",
+ Marwyn = "Marwyn",
+ ["Master Engineer Telonicus"] = "Master Engineer Telonicus",
+ ["Maur Grimtotem"] = "Maur Grimtotem",
+ Meathook = "Meathook",
+ ["Mechano-Lord Capacitus"] = "Mechano-Lord Capacitus",
+ Medivh = "Medivh",
+ ["Mekgineer Steamrigger"] = "Mekgineer Steamrigger",
+ ["Mekgineer Thermaplugg"] = "Mekgineer Thermaplugg",
+ ["Mennu the Betrayer"] = "Mennu the Betrayer",
+ ["Meshlok the Harvester"] = "Meshlok the Harvester",
+ Midnight = "Midnight",
+ Mijan = "Mijan",
+ Mimiron = "Mimiron",
+ ["Miner Johnson"] = "Miner Johnson",
+ ["Mistress of Pain"] = "Mistress of Pain",
+ Moam = "Moam",
+ Mogor = "Mogor",
+ ["Mokra the Skullcrusher"] = "Mokra the Skullcrusher",
+ Moorabi = "Moorabi",
+ Moragg = "Moragg",
+ ["Mordresh Fire Eye"] = "Mordresh Fire Eye",
+ ["Mor Grayhoof"] = "Mor Grayhoof",
+ Moroes = "Moroes",
+ ["Morogrim Tidewalker"] = "Morogrim Tidewalker",
+ Morphaz = "Morphaz",
+ ["Mother Shahraz"] = "Mother Shahraz",
+ ["Mother Smolderweb"] = "Mother Smolderweb",
+ ["Mr. Smite"] = "Mr. Smite",
+ ["Muradin Bronzebeard"] = "Muradin Bronzebeard",
+ ["Murkblood Twin"] = "Murkblood Twin",
+ ["Murkblood Twins"] = "Murkblood Twins",
+ Murmur = "Murmur",
+ ["Murta Grimgut"] = "Murta Grimgut",
+ ["M'uru"] = "M'uru",
+ Mushgog = "Mushgog",
+ ["Mutanus the Devourer"] = "Mutanus the Devourer",
+ Nalorakk = "Nalorakk",
+ Nazan = "Nazan",
+ Nefarian = "Nefarian",
+ ["Nekrum Gutchewer"] = "Nekrum Gutchewer",
+ ["Nerub'enkan"] = "Nerub'enkan",
+ ["Nethermancer Sepethrea"] = "Nethermancer Sepethrea",
+ Netherspite = "Netherspite",
+ ["Netherstrand Longbow"] = "Netherstrand Longbow",
+ ["Nexus-Prince Shaffar"] = "Nexus-Prince Shaffar",
+ Nightbane = "Nightbane",
+ ["Noth the Plaguebringer"] = "Noth the Plaguebringer",
+ ["Novos the Summoner"] = "Novos the Summoner",
+ Noxxion = "Noxxion",
+ ["Obsidian Sentinel"] = "Obsidian Sentinel",
+ ["Odo the Blindwatcher"] = "Odo the Blindwatcher",
+ Oggleflint = "Oggleflint",
+ ["Ogom the Wretched"] = "Ogom the Wretched",
+ Ohgan = "Ohgan",
+ ["Ok'thor the Breaker"] = "Ok'thor the Breaker",
+ Olaf = "Olaf",
+ ["Old Serra'kis"] = "Old Serra'kis",
+ ["Olm the Summoner"] = "Olm the Summoner",
+ ["Omor the Unscarred"] = "Omor the Unscarred",
+ Onyxia = "Onyxia",
+ ["Opera Event"] = "Opera Event",
+ ["Orgrim's Hammer"] = "Orgrim's Hammer",
+ ["Ormorok the Tree-Shaper"] = "Ormorok the Tree-Shaper",
+ ["Oro Eyegouge"] = "Oro Eyegouge",
+ ["Ossirian the Unscarred"] = "Ossirian the Unscarred",
+ Ouro = "Ouro",
+ ["Overlord Ramtusk"] = "Overlord Ramtusk",
+ ["Overlord Wyrmthalak"] = "Overlord Wyrmthalak",
+ ["Overmaster Pyron"] = "Overmaster Pyron",
+ ["Overseer Tidewrath"] = "Overseer Tidewrath",
+ Ozumat = "Ozumat",
+ Pandemonius = "Pandemonius",
+ ["Panzor the Invincible"] = "Panzor the Invincible",
+ Patchwerk = "Patchwerk",
+ ["Pathaleon the Calculator"] = "Pathaleon the Calculator",
+ Phalanx = "Phalanx",
+ ["Phaseshift Bulwark"] = "Phaseshift Bulwark",
+ Pimgib = "Pimgib",
+ ["Plaguemaw the Rotting"] = "Plaguemaw the Rotting",
+ ["Plugger Spazzring"] = "Plugger Spazzring",
+ ["Postmaster Malown"] = "Postmaster Malown",
+ ["Priestess Delrissa"] = "Priestess Delrissa",
+ ["Prince Keleseth"] = "Prince Keleseth",
+ ["Prince Malchezaar"] = "Prince Malchezaar",
+ ["Prince Skaldrenox"] = "Prince Skaldrenox",
+ ["Princess Huhuran"] = "Princess Huhuran",
+ ["Princess Moira Bronzebeard"] = "Princess Moira Bronzebeard",
+ ["Princess Tempestria"] = "Princess Tempestria",
+ ["Princess Theradras"] = "Princess Theradras",
+ ["Princess Yauj"] = "Princess Yauj",
+ ["Prince Taldaram"] = "Prince Taldaram",
+ ["Prince Tenris Mirkblood"] = "Prince Tenris Mirkblood",
+ ["Prince Tortheldrin"] = "Prince Tortheldrin",
+ ["Prince Valanar"] = "Prince Valanar",
+ ["Professor Putricide"] = "Professor Putricide",
+ ["Pure Spawn of Hydross"] = "Pure Spawn of Hydross",
+ Pusillin = "Pusillin",
+ ["Pyroguard Emberseer"] = "Pyroguard Emberseer",
+ ["Pyromancer Loregrain"] = "Pyromancer Loregrain",
+ Quagmirran = "Quagmirran",
+ ["Quartermaster Zigris"] = "Quartermaster Zigris",
+ ["Rage Winterchill"] = "Rage Winterchill",
+ Ragglesnout = "Ragglesnout",
+ ["Raging Spirit"] = "Raging Spirit",
+ Ragnaros = "Ragnaros",
+ ["Ramstein the Gorger"] = "Ramstein the Gorger",
+ ["Ras Frostwhisper"] = "Ras Frostwhisper",
+ Rattlegore = "Rattlegore",
+ ["Razorclaw the Butcher"] = "Razorclaw the Butcher",
+ ["Razorgore the Untamed"] = "Razorgore the Untamed",
+ Razorlash = "Razorlash",
+ Razorscale = "Razorscale",
+ ["Reliquary of Souls"] = "Reliquary of Souls",
+ Renataki = "Renataki",
+ ["Restless Skeleton"] = "Restless Skeleton",
+ Rethilgore = "Rethilgore",
+ Revelosh = "Revelosh",
+ ["Rhahk'Zor"] = "Rhahk'Zor",
+ ["Ribbly Screwspigot"] = "Ribbly Screwspigot",
+ ["Right Arm"] = "Right Arm",
+ ["Ring of Law"] = "Ring of Law",
+ Roar = "Roar",
+ ["Rokad the Ravager"] = "Rokad the Ravager",
+ ["Rokdar the Sundered Lord"] = "Rokdar the Sundered Lord",
+ ["Rokmar the Crackler"] = "Rokmar the Crackler",
+ ["Rom'ogg Bonecrusher"] = "Rom'ogg Bonecrusher",
+ Romulo = "Romulo",
+ ["Romulo & Julianne"] = "Romulo & Julianne",
+ Roogug = "Roogug",
+ Rotface = "Rotface",
+ Rotgrip = "Rotgrip",
+ ["Runemaster Molgeim"] = "Runemaster Molgeim",
+ ["Runok Wildmane"] = "Runok Wildmane",
+ Ruuzlu = "Ruuzlu",
+ ["Salramm the Fleshcrafter"] = "Salramm the Fleshcrafter",
+ ["Sanctum Sentry"] = "Sanctum Sentry",
+ ["Sandarr Dunereaver"] = "Sandarr Dunereaver",
+ ["Sandfury Executioner"] = "Sandfury Executioner",
+ Sapphiron = "Sapphiron",
+ Sara = "Sara",
+ ["Saronite Animus"] = "Saronite Animus",
+ Sartharion = "Sartharion",
+ ["Sathrovarr the Corruptor"] = "Sathrovarr the Corruptor",
+ ["Saviana Ragefire"] = "Saviana Ragefire",
+ ["Scarlet Commander Mograine"] = "Scarlet Commander Mograine",
+ ["Scourgelord Tyrannus"] = "Scourgelord Tyrannus",
+ ["Seeth'rel"] = "Seeth'rel",
+ ["Selin Fireheart"] = "Selin Fireheart",
+ ["Sergeant Bly"] = "Sergeant Bly",
+ ["Shade of Akama"] = "Shade of Akama",
+ ["Shade of Aran"] = "Shade of Aran",
+ ["Shade of Eranikus"] = "Shade of Eranikus",
+ ["Shadikith the Glider"] = "Shadikith the Glider",
+ ["Shadow Hunter Vosh'gajin"] = "Shadow Hunter Vosh'gajin",
+ ["Shadow of Leotheras"] = "Shadow of Leotheras",
+ ["Shadowpriest Sezz'ziz"] = "Shadowpriest Sezz'ziz",
+ Shadron = "Shadron",
+ Shazzrah = "Shazzrah",
+ ["Shirrak the Dead Watcher"] = "Shirrak the Dead Watcher",
+ Sindragosa = "Sindragosa",
+ ["Sir Zeliek"] = "Sir Zeliek",
+ ["Sjonnir The Ironshaper"] = "Sjonnir The Ironshaper",
+ ["Skadi the Ruthless"] = "Skadi the Ruthless",
+ ["Skarr the Unbreakable"] = "Skarr the Unbreakable",
+ ["Skarvald the Constructor"] = "Skarvald the Constructor",
+ ["Skra'gath"] = "Skra'gath",
+ Skul = "Skul",
+ Skum = "Skum",
+ ["Slad'ran"] = "Slad'ran",
+ Sneed = "Sneed",
+ ["Sneed's Shredder"] = "Sneed's Shredder",
+ ["Solakar Flamewreath"] = "Solakar Flamewreath",
+ ["Solarium Agent"] = "Solarium Agent",
+ ["Solarium Priest"] = "Solarium Priest",
+ ["Spirestone Battle Lord"] = "Spirestone Battle Lord",
+ ["Spirestone Butcher"] = "Spirestone Butcher",
+ ["Spirestone Lord Magus"] = "Spirestone Lord Magus",
+ ["Staff of Disintegration"] = "Staff of Disintegration",
+ Stalagg = "Stalagg",
+ Steelbreaker = "Steelbreaker",
+ ["Stomper Kreeg"] = "Stomper Kreeg",
+ Stonespine = "Stonespine",
+ ["Stormcaller Brundir"] = "Stormcaller Brundir",
+ Strawman = "Strawman",
+ ["Sulfuron Harbinger"] = "Sulfuron Harbinger",
+ Supremus = "Supremus",
+ ["Svala Sorrowgrave"] = "Svala Sorrowgrave",
+ ["Swamplord Musel'ek"] = "Swamplord Musel'ek",
+ Taerar = "Taerar",
+ ["Tainted Spawn of Hydross"] = "Tainted Spawn of Hydross",
+ ["Talon King Ikiss"] = "Talon King Ikiss",
+ ["Taragaman the Hungerer"] = "Taragaman the Hungerer",
+ ["Targorr the Dread"] = "Targorr the Dread",
+ Tavarok = "Tavarok",
+ Techbot = "Techbot",
+ Temporus = "Temporus",
+ ["Tendris Warpwood"] = "Tendris Warpwood",
+ Tenebron = "Tenebron",
+ ["Terestian Illhoof"] = "Terestian Illhoof",
+ ["Teron Gorefiend"] = "Teron Gorefiend",
+ Thaddius = "Thaddius",
+ ["Thaladred the Darkener"] = "Thaladred the Darkener",
+ ["Thane Korth'azz"] = "Thane Korth'azz",
+ ["The Beast"] = "The Beast",
+ ["The Beasts of Northrend"] = "The Beasts of Northrend",
+ ["The Big Bad Wolf"] = "The Big Bad Wolf",
+ ["The Black Knight"] = "The Black Knight",
+ ["The Black Stalker"] = "The Black Stalker",
+ ["The Blue Brothers"] = "The Blue Brothers",
+ ["The Bug Family"] = "The Bug Family",
+ ["The Crone"] = "The Crone",
+ ["The Curator"] = "The Curator",
+ ["The Eredar Twins"] = "The Eredar Twins",
+ ["The Four Horsemen"] = "The Four Horsemen",
+ ["The Illidari Council"] = "The Illidari Council",
+ ["The Iron Council"] = "The Iron Council",
+ ["Theka the Martyr"] = "Theka the Martyr",
+ ["The Lich King"] = "The Lich King",
+ ["The Lost Dwarves"] = "The Lost Dwarves",
+ ["The Lurker Below"] = "The Lurker Below",
+ ["The Maker"] = "The Maker",
+ ["The Prophet Skeram"] = "The Prophet Skeram",
+ ["The Prophet Tharon'ja"] = "The Prophet Tharon'ja",
+ ["The Ravenian"] = "The Ravenian",
+ ["The Razza"] = "The Razza",
+ ["The Seven Dwarves"] = "The Seven Dwarves",
+ ["The Skybreaker"] = "The Skybreaker",
+ ["The Tribunal of Ages"] = "The Tribunal of Ages",
+ ["The Twin Emperors"] = "The Twin Emperors",
+ ["The Twin Val'kyr"] = "The Twin Val'kyr",
+ ["The Unforgiven"] = "The Unforgiven",
+ ["The Windreaver"] = "The Windreaver",
+ Thorim = "Thorim",
+ ["Thorngrin the Tender"] = "Thorngrin the Tender",
+ ["Tidewalker Lurker"] = "Tidewalker Lurker",
+ ["Timmy the Cruel"] = "Timmy the Cruel",
+ Tinhead = "Tinhead",
+ ["Tinkerer Gizlock"] = "Tinkerer Gizlock",
+ ["Tirion Fordring"] = "Tirion Fordring",
+ Tito = "Tito",
+ ["Toravon the Ice Watcher"] = "Toravon the Ice Watcher",
+ ["Trigore the Lasher"] = "Trigore the Lasher",
+ Trollgore = "Trollgore",
+ ["Tsu'zee"] = "Tsu'zee",
+ ["Tuten'kash"] = "Tuten'kash",
+ ["Twilight Lord Kelris"] = "Twilight Lord Kelris",
+ ["Urok Doomhowl"] = "Urok Doomhowl",
+ ["Vaelastrasz the Corrupt"] = "Vaelastrasz the Corrupt",
+ ["Valithria Dreamwalker"] = "Valithria Dreamwalker",
+ ["Val'kyr Shadowguard"] = "Val'kyr Shadowguard",
+ ["Varian Wrynn"] = "Varian Wrynn",
+ ["Varos Cloudstrider"] = "Varos Cloudstrider",
+ Vazruden = "Vazruden",
+ ["Vazruden the Herald"] = "Vazruden the Herald",
+ Vectus = "Vectus",
+ Vem = "Vem",
+ Veng = "Veng",
+ ["Veras Darkshadow"] = "Veras Darkshadow",
+ ["Verdan the Everliving"] = "Verdan the Everliving",
+ Verek = "Verek",
+ Vesperon = "Vesperon",
+ Vexallus = "Vexallus",
+ ["Veyzhak the Cannibal"] = "Veyzhak the Cannibal",
+ ["Vile'rel"] = "Vile'rel",
+ Viscidus = "Viscidus",
+ ["Viscous Fallout"] = "Viscous Fallout",
+ ["Void Reaver"] = "Void Reaver",
+ Volkhan = "Volkhan",
+ ["VX-001"] = "VX-001",
+ ["Warbringer O'mrogg"] = "Warbringer O'mrogg",
+ ["Warchief Blackhand Piece"] = "Warchief Blackhand Piece",
+ ["Warchief Kargath Bladefist"] = "Warchief Kargath Bladefist",
+ ["Warchief Rend Blackhand"] = "Warchief Rend Blackhand",
+ ["Warden Mellichar"] = "Warden Mellichar",
+ ["Warder Stilgiss"] = "Warder Stilgiss",
+ ["Warlord Kalithresh"] = "Warlord Kalithresh",
+ ["War Master Voone"] = "War Master Voone",
+ ["Warmaul Champion"] = "Warmaul Champion",
+ ["Warp Slicer"] = "Warp Slicer",
+ ["Warp Splinter"] = "Warp Splinter",
+ ["Watchkeeper Gargolmar"] = "Watchkeeper Gargolmar",
+ Weaver = "Weaver",
+ ["Witch Doctor Zum'rah"] = "Witch Doctor Zum'rah",
+ ["Wolf Master Nandos"] = "Wolf Master Nandos",
+ ["Wrath-Scryer Soccothrates"] = "Wrath-Scryer Soccothrates",
+ Wushoolay = "Wushoolay",
+ Xevozz = "Xevozz",
+ ["XT-002 Deconstructor"] = "XT-002 Deconstructor",
+ ["Yogg-Saron"] = "Yogg-Saron",
+ Yor = "Yor",
+ Ysondre = "Ysondre",
+ Zekkis = "Zekkis",
+ ["Zelemar the Wrathful"] = "Zelemar the Wrathful",
+ ["Zereketh the Unbound"] = "Zereketh the Unbound",
+ Zerillis = "Zerillis",
+ ["Zevrim Thornhoof"] = "Zevrim Thornhoof",
+ Zolo = "Zolo",
+ ["Zul'Farrak Dead Hero"] = "Zul'Farrak Dead Hero",
+ ["Zul'jin"] = "Zul'jin",
+ ["Zul'Lor"] = "Zul'Lor",
+ ["Zul'tore"] = "Zul'tore",
+ ["Zuramat the Obliterator"] = "Zuramat the Obliterator",
+}
+
+
+if GAME_LOCALE == "enUS" then
+ lib:SetCurrentTranslations(true)
+elseif GAME_LOCALE == "deDE" then
+ lib:SetCurrentTranslations {
+ Acidmaw = "Ätzschlund",
+ Aeonus = "Aeonus",
+ ["Aerial Command Unit"] = "Luftkommandoeinheit",
+ ["Agathelos the Raging"] = "Agathelos der Tobende",
+ ["Aggem Thorncurse"] = "Aggem Dornfluch",
+ Ahune = "Ahune",
+ ["Akil'zon"] = "Akil'zon",
+ ["Aku'mai"] = "Aku'mai",
+ ["Al'ar"] = "Al'ar",
+ ["Algalon the Observer"] = "Algalon der Beobachter",
+ ["Alzzin the Wildshaper"] = "Alzzin der Wildformer",
+ Amanitar = "Amanitar",
+ ["Ambassador Flamelash"] = "Botschafter Flammenschlag",
+ ["Ambassador Hellmaw"] = "Botschafter Höllenschlund",
+ ["Amnennar the Coldbringer"] = "Amnennar der Kältebringer",
+ ["Ancient Stone Keeper"] = "Uralter Steinbewahrer",
+ Anetheron = "Anetheron",
+ ["Anger'rel"] = "Anger'rel",
+ Anomalus = "Anomalus",
+ ["Antu'sul"] = "Antu'sul",
+ ["Anub'arak"] = "Anub'arak",
+ ["Anubisath Defender"] = "Verteidiger des Anubisath",
+ ["Anubisath Guardian"] = "Beschützer des Anubisath",
+ ["Anub'Rekhan"] = "Anub'Rekhan",
+ ["Anub'shiah"] = "Anub'shiah",
+ Anzu = "Anzu",
+ ["Arcane Watchman"] = "Arkanwachmann",
+ ["Arcanist Doan"] = "Arkanist Doan",
+ Archaedas = "Archaedas",
+ ["Archavon the Stone Watcher"] = "Archavon der Steinwächter",
+ Archimonde = "Archimonde",
+ ["Archivist Galford"] = "Archivar Galford",
+ ["Archmage Arugal"] = "Erzmagier Arugal",
+ ["Argent Confessor Paletress"] = "Argentumbeichtpatin Blondlocke",
+ ["Arugal's Voidwalker"] = "Arugals Leerwandler",
+ ["Ascendant Lord Obsidius"] = "Ascendant Lord Obsidius", -- Needs review
+ ["Assault Bot"] = "Angriffsbot",
+ ["Assembly of Iron"] = "Versammlung des Eisens",
+ ["Atal'alarion"] = "Atal'alarion",
+ ["Attumen the Huntsman"] = "Attumen der Jäger",
+ Auriaya = "Auriaya",
+ Avalanchion = "Avalanchion",
+ ["Avatar of Hakkar"] = "Avatar von Hakkar",
+ ["Ayamiss the Hunter"] = "Ayamiss der Jäger",
+ Azgalor = "Azgalor",
+ ["Azshir the Sleepless"] = "Azshir der Schlaflose",
+ Azuregos = "Azuregos",
+ ["Bael'Gar"] = "Bael'Gar",
+ Baelog = "Baelog",
+ Balnazzar = "Balnazzar",
+ ["Baltharus the Warborn"] = "Baltharus der Kriegsjünger",
+ ["Bannok Grimaxe"] = "Bannok Grimmaxt",
+ ["Baron Aquanis"] = "Baron Aquanis",
+ ["Baron Charr"] = "Baron Glutarr",
+ ["Baroness Anastari"] = "Baroness Anastari",
+ ["Baron Geddon"] = "Baron Geddon",
+ ["Baron Kazum"] = "Baron Kazum",
+ ["Baron Rivendare"] = "Baron Totenschwur",
+ ["Baron Silverlaine"] = "Baron Silberlein",
+ ["Battleguard Sartura"] = "Schlachtwache Sartura",
+ ["Bazil Thredd"] = "Bazil Thredd",
+ Bazzalan = "Bazzalan",
+ Beauty = "Beauty", -- Needs review
+ ["Black Guard Swordsmith"] = "Schwertschmied der schwarzen Wache",
+ ["Blackheart the Inciter"] = "Schwarzherz der Hetzer",
+ ["Blindeye the Seer"] = "Blindauge der Seher",
+ ["Blind Hunter"] = "Blinder Jäger",
+ ["Blood Guard Porung"] = "Blutwache Porung",
+ ["Bloodlord Mandokir"] = "Blutfürst Mandokir",
+ ["Bloodmage Thalnos"] = "Blutmagier Thalnos",
+ ["Blood Prince Council"] = "Rat der Blutprinzen",
+ ["Blood Princes"] = "Rat der Blutprinzen",
+ ["Blood-Queen Lana'thel"] = "Blutkönigin Lana'thel",
+ ["Blood Steward of Kirtonos"] = "Blutdiener von Kirtonos",
+ Boahn = "Boahn",
+ ["Bomb Bot"] = "Bombenbot",
+ ["Brain of Yogg-Saron"] = "Yogg-Sarons Gehirn",
+ ["Brainwashed Noble"] = "Manipulierter Adliger",
+ Broggok = "Broggok",
+ Brokentoe = "Schmetterzehe",
+ Bronjahm = "Bronjahm",
+ ["Broodlord Lashlayer"] = "Brutwächter Dreschbringer",
+ ["Bruegal Ironknuckle"] = "Bruegal Eisenfaust",
+ Brutallus = "Brutallus",
+ ["Burning Felguard"] = "Brennende Teufelswache",
+ ["Buru the Gorger"] = "Buru der Verschlinger",
+ ["Cache of the Firelord"] = "Truhe des Feuerlords",
+ ["Cache of the Legion"] = "Behälter der Legion",
+ ["Cannon Master Willey"] = "Kanonenmeister Willey",
+ ["Captain Greenskin"] = "Kapitän Grünhaut",
+ ["Captain Kromcrush"] = "Hauptmann Krombruch",
+ ["Captain Skarloc"] = "Kapitän Skarloc",
+ ["Celebras the Cursed"] = "Celebras der Verfluchte",
+ ["Charlga Razorflank"] = "Charlga Klingenflanke",
+ ["Chess Event"] = "Chess Event",
+ ["Chest of The Seven"] = "Truhe der Sieben",
+ ["Chief Ukorz Sandscalp"] = "Häuptling Ukorz Sandwüter",
+ ["Cho'Rush the Observer"] = "Cho'Rush der Beobachter",
+ Chromaggus = "Chromaggus",
+ ["Chrono Lord Deja"] = "Chronolord Deja",
+ ["Chrono-Lord Epoch"] = "Chronolord Epoch",
+ Claw = "Klaue",
+ ["Coilfang Elite"] = "Elitesoldat des Echsenkessels",
+ ["Coilfang Strider"] = "Schreiter des Echsenkessels",
+ ["Commander Kolurg"] = "Kommandant Kolurg",
+ ["Commander Sarannis"] = "Kommandant Sarannis",
+ ["Commander Springvale"] = "Kommandant Springvale",
+ ["Commander Stoutbeard"] = "Kommandant Starkbart",
+ ["Commander Ulthok"] = "Commander Ulthok", -- Needs review
+ ["Constructor & Controller"] = "Konstrukteur & Kontrolleur",
+ Cookie = "Krümel",
+ ["Coren Direbrew"] = "Coren Düsterbräu",
+ ["Corla, Herald of Twilight"] = "Corla, Herald of Twilight", -- Needs review
+ ["Cosmic Infuser"] = "Kosmische Macht",
+ ["Crimson Hammersmith"] = "Purpurroter Hammerschmied",
+ ["Crowd Pummeler 9-60"] = "Meuteverprügler 9-60",
+ ["Crystal Fang"] = "Kristallfangzahn",
+ ["C'Thun"] = "C'Thun",
+ Cyanigosa = "Cyanigosa",
+ ["Dalliah the Doomsayer"] = "Dalliah die Verdammnisverkünderin",
+ ["Dalronn the Controller"] = "Dalronn der Kontrolleur",
+ ["Dark Coffer"] = "Dunkler Kasten",
+ ["Dark Iron Ambassador"] = "Botschafter der Dunkeleisenzwerge",
+ ["Darkmaster Gandling"] = "Dunkelmeister Gandling",
+ ["Darkweaver Syth"] = "Dunkelwirker Syth",
+ ["Deathbound Ward"] = "Todesgeweihter Wächter",
+ ["Deathbringer Saurfang"] = "Todesbringer Saurfang",
+ ["Death Knight Darkreaver"] = "Todesritter Schattensichel",
+ ["Death Knight Understudy"] = "Reservist der Todesritter",
+ ["Deathspeaker High Priest"] = "Hohepriester der Todessprecher",
+ ["Death Speaker Jargba"] = "Todessprecher Jargba",
+ ["Deathstalker Visceri"] = "Todespirscher Visceri",
+ ["Deathsworn Captain"] = "Todeshöriger Captain",
+ Devastation = "Verwüstung",
+ ["Deviate Faerie Dragon"] = "Deviatfeendrache",
+ ["Devourer of Souls"] = "Verschlinger der Seelen",
+ ["Dextren Ward"] = "Dextren Ward",
+ ["Digmaster Shovelphlange"] = "Grubenmeister Schaufelphlansch",
+ ["Doctor Theolen Krastinov"] = "Doktor Theolen Krastinov",
+ ["Doom Lord Kazzak"] = "Verdammnislord Kazzak",
+ ["Doom'rel"] = "Un'rel",
+ Doomwalker = "Verdammniswandler",
+ ["Dope'rel"] = "Trott'rel",
+ Dorothee = "Dorothee",
+ ["Drahga Shodowburner"] = "Drahga Shodowburner", -- Needs review
+ ["Drakkari Colossus"] = "Koloss der Drakkari",
+ ["Drakos the Interrogator"] = "Drakos der Befrager",
+ Dreadscale = "Schreckensmaul",
+ Dreamscythe = "Traumsense",
+ ["Dust Covered Chest"] = "Staub Bedeckter Kasten",
+ Dustwraith = "Karaburan",
+ ["Eadric the Pure"] = "Eadric der Reine",
+ ["Earthcaller Halmgar"] = "Erdenrufer Halmgar",
+ Ebonroc = "Schattenschwinge",
+ ["Eck the Ferocious"] = "Der wilde Eck",
+ ["Edwin VanCleef"] = "Edwin van Cleef",
+ ["Elder Brightleaf"] = "Ältester Hellblatt",
+ ["Elder Ironbranch"] = "Ältester Eisenast",
+ ["Elder Nadox"] = "Urahne Nadox",
+ ["Elder Stonebark"] = "Ältester Steinrinde",
+ ["Electrocutioner 6000"] = "Elektrokutor 6000",
+ ["Emalon the Storm Watcher"] = "Emalon der Sturmwächter",
+ Emeriss = "Smariss",
+ ["Emperor Dagran Thaurissan"] = "Imperator Dagran Thaurissan",
+ ["Emperor Vek'lor"] = "Imperator Vek'lor",
+ ["Emperor Vek'nilash"] = "Imperator Vek'nilash",
+ Entropius = "Entropius",
+ ["Eonar's Gift"] = "Eonars Geschenk",
+ ["Epoch Hunter"] = "Epochenjäger",
+ Erekem = "Erekem",
+ ["Eressea Dawnsinger"] = "Eressea Morgensänger",
+ ["Eric \"The Swift\""] = "Eric \"Der Flinke\"",
+ Erudax = "Erudax", -- Needs review
+ ["Erunak Stonespeaker"] = "Erunak Stonespeaker", -- Needs review
+ ["Essence of Anger"] = "Essenz des Zorns",
+ ["Essence of Desire"] = "Essenz der Begierde",
+ ["Essence of Suffering"] = "Essenz des Leidens",
+ Eviscerator = "Ausweider",
+ ["Exarch Maladaar"] = "Exarch Maladaar",
+ ["Expedition Commander"] = "Kommandant der Expedition",
+ ["Eydis Darkbane"] = "Eydis Nachtbann",
+ ["Eye of C'Thun"] = "Auge von C'Thun",
+ ["Faction Champions"] = "Fraktionschampions",
+ ["Fallen Champion"] = "Gestürzter Held",
+ Falric = "Falric",
+ ["Falric and Marwyn"] = "Falric und Marwyn",
+ ["Fankriss the Unyielding"] = "Fankriss der Unnachgiebige",
+ ["Fathom-Lord Karathress"] = "Tiefenlord Karathress",
+ Felmyst = "Teufelsruch",
+ ["Fenrus the Devourer"] = "Fenrus der Verschlinger",
+ ["Feral Defender"] = "Wilder Verteidiger",
+ Festergut = "Fauldarm",
+ Feugen = "Feugen",
+ ["Fineous Darkvire"] = "Fineous Dunkelader",
+ Firemaw = "Feuerschwinge",
+ ["Fjola Lightbane"] = "Fjola Lichtbann",
+ Flamegor = "Flammenmaul",
+ ["Flame Leviathan"] = "Flammenleviathan",
+ ["Foreman Thistlenettle"] = "Großknecht Distelklette",
+ ["Forgemaster Garfrost"] = "Schmiedenmeister Garfrost",
+ ["Forgremaster Throngus"] = "Forgremaster Throngus", -- Needs review
+ ["Four Horsemen Chest"] = "Die Vier Reiter Kiste",
+ ["Fras Siabi"] = "Fras Siabi",
+ Freya = "Freya",
+ ["Gahz'ranka"] = "Gahz'ranka",
+ ["Gahz'rilla"] = "Gahz'rilla",
+ ["Gal'darah"] = "Gal'darah",
+ ["Galgann Firehammer"] = "Galgann Feuerhammer",
+ Garr = "Garr",
+ ["Garrosh Hellscream"] = "Garrosh Höllschrei",
+ Gasher = "Schlitzer",
+ ["Gatewatcher Gyro-Kill"] = "Torwächter Gyrotot",
+ ["Gatewatcher Iron-Hand"] = "Torwächter Eisenhand",
+ ["Gathios the Shatterer"] = "Gathios der Zerschmetterer",
+ Gehennas = "Gehennas",
+ Gelihast = "Gelihast",
+ Gelk = "Gelk",
+ ["General Angerforge"] = "General Zornesschmied",
+ ["General Bjarngrim"] = "General Bjarngrim",
+ ["General Drakkisath"] = "General Drakkisath",
+ ["General Rajaxx"] = "General Rajaxx",
+ ["General Umbriss"] = "General Umbriss", -- Needs review
+ ["General Vezax"] = "General Vezax",
+ ["General Zarithrian"] = "General Zarithrian",
+ ["Ghamoo-ra"] = "Ghamoo-ra",
+ ["Ghaz'an"] = "Ghaz'an",
+ ["Ghok Bashguud"] = "Ghok Haudrauf",
+ Gilnid = "Gilnid",
+ ["Gizrul the Slavener"] = "Gizrul der Geifernde",
+ ["Gloom'rel"] = "Dunk'rel",
+ Gluth = "Gluth",
+ Glutton = "Nimmersatt",
+ ["Golemagg the Incinerator"] = "Golemagg der Verbrenner",
+ ["Golem Lord Argelmach"] = "Golemlord Argelmach",
+ ["Goraluk Anvilcrack"] = "Goraluk Hammerbruch",
+ ["Gormok the Impaler"] = "Gormok der Pfähler",
+ ["Gorosh the Dervish"] = "Gorosh der Derwisch",
+ ["Gortok Palehoof"] = "Gortok Bleichhuf",
+ ["Gothik the Harvester"] = "Gothik der Ernter",
+ ["Grand Astromancer Capernian"] = "Großastronom Capernian",
+ ["Grand Champions"] = "Großchampions",
+ ["Grand Crusader Dathrohan"] = "Oberster Kreuzfahrer Dathrohan",
+ ["Grand Magus Telestra"] = "Großmagistrix Telestra",
+ ["Grandmaster Vorpil"] = "Großmeister Vorpil",
+ Grandmother = "Großmutter",
+ ["Grand Warlock Alythess"] = "Großhexenmeisterin Alythess",
+ ["Grand Warlock Nethekurse"] = "Großhexenmeister Nethekurse",
+ ["Grand Widow Faerlina"] = "Großwitwe Faerlina",
+ ["Grethok the Controller"] = "Grethok der Aufseher",
+ ["Gri'lek"] = "Gri'lek",
+ Grimlok = "Grimlok",
+ Grizzle = "Grizzle",
+ Grobbulus = "Grobbulus",
+ Grubbis = "Grubbis",
+ ["Gruul the Dragonkiller"] = "Gruul der Drachenschlächter",
+ ["Guard Fengus"] = "Wache Fengus",
+ ["Guardian of Yogg-Saron"] = "Wächter des Yogg-Saron",
+ ["Guard Mol'dar"] = "Wache Mol'dar",
+ ["Guard Slip'kik"] = "Wache Slip'kik",
+ ["Gurtogg Bloodboil"] = "Gurtogg Siedeblut",
+ Gyth = "Gyth",
+ Hadronox = "Hadronox",
+ Hakkar = "Hakkar",
+ Halazzi = "Halazzi",
+ Halion = "Halion",
+ Halycon = "Halycon",
+ Hamhock = "Hamhock",
+ ["Harbinger Skyriss"] = "Herold Horizontiss",
+ ["Hate'rel"] = "Hass'rel",
+ ["Hazza'rah"] = "Hazza'rah",
+ Hazzas = "Hazzas",
+ ["Headless Horseman"] = "Der kopflose Reiter",
+ ["Hearthsinger Forresten"] = "Herdsinger Forresten",
+ ["Hedrum the Creeper"] = "Hedrum der Krabbler",
+ ["Heigan the Unclean"] = "Heigan der Unreine",
+ ["Hellfire Channeler"] = "Kanalisierer des Höllenfeuers",
+ ["Henry Stern"] = "Henry Stern",
+ ["Herald Volazj"] = "Verkünder Volazj",
+ Herod = "Herod",
+ ["Hex Lord Malacrass"] = "Hexlord Malacrass",
+ ["High Astromancer Solarian"] = "Hochastromantin Solarian",
+ ["High Botanist Freywinn"] = "Hochbotaniker Freywinn",
+ ["High Inquisitor Fairbanks"] = "Hochinquisitor Fairbanks",
+ ["High Inquisitor Whitemane"] = "Hochinquisitor Weißsträhne",
+ ["High Interrogator Gerstahn"] = "Verhörmeisterin Gerstahn",
+ ["High King Maulgar"] = "Hochkönig Maulgar",
+ ["Highlord Mograine"] = "Hochlord Mograine",
+ ["Highlord Omokk"] = "Hochlord Omokk",
+ ["High Marshal Whirlaxis"] = "Hochmarschall Whirlaxis",
+ ["High Nethermancer Zerevor"] = "Hochnethermant Zerevor",
+ ["High Overlord Saurfang"] = "Hochfürst Saurfang",
+ ["High Priestess Arlokk"] = "Hohepriesterin Arlokk",
+ ["High Priestess Jeklik"] = "Hohepriesterin Jeklik",
+ ["High Priestess Mar'li"] = "Hohepriesterin Mar'li",
+ ["High Priestess of Thaurissan"] = "\009Hohepriesterin von Thaurissan",
+ ["High Priest Thekal"] = "Hohepriester Thekal",
+ ["High Priest Venoxis"] = "Hohepriester Venoxis",
+ ["High Warlord Naj'entus"] = "Oberster Kriegsfürst Naj'entus",
+ Hodir = "Hodir",
+ ["Houndmaster Grebmar"] = "Hundemeister Grebmar",
+ ["Houndmaster Loksey"] = "Hundemeister Loksey",
+ Hukku = "Hukku",
+ Hungarfen = "Hungarfenn",
+ ["Hurley Blackbreath"] = "Hurley Pestatem",
+ ["Hyakiss the Lurker"] = "Hyakiss der Lauerer",
+ ["Hydromancer Thespia"] = "Wasserbeschwörerin Thespia",
+ ["Hydromancer Velratha"] = "Wasserbeschwörerin Velratha",
+ Hydrospawn = "Hydrobrut",
+ ["Hydross the Unstable"] = "Hydross der Unstete",
+ ["Icecrown Gunship Battle"] = "Luftschlacht um die Eiskronenzitadelle",
+ Icehowl = "Eisheuler",
+ ["Ice Sphere"] = "Eissphäre",
+ Ichoron = "Ichoron",
+ Ick = "Ick",
+ ["Ignis the Furnace Master"] = "Ignis, Meister des Eisenwerks",
+ ["Illidan Stormrage"] = "Illidan Sturmgrimm",
+ ["Illidari Council"] = "Rat der Illidari",
+ ["Illyanna Ravenoak"] = "Illyanna Rabeneiche",
+ ["Immol'thar"] = "Immol'thar",
+ ["Infinite Corruptor"] = "Ewiger Verderber",
+ ["Infinity Blades"] = "Klinge der Unendlichkeit",
+ ["Ingvar the Plunderer"] = "Ingvar der Brandschatzer",
+ ["Instructor Malicia"] = "Instrukteurin Malicia",
+ ["Instructor Razuvious"] = "Instrukteur Razuvious",
+ ["Interrogator Vishas"] = "Befrager Vishas",
+ Ionar = "Ionar",
+ Ironaya = "Ironaya",
+ Ironspine = "Eisenrücken",
+ Isalien = "Isalien",
+ Jade = "Jade",
+ ["Jammal'an the Prophet"] = "Jammal'an der Prophet",
+ ["Jan'alai"] = "Jan'alai",
+ ["Jandice Barov"] = "Jandice Barov",
+ ["Jedoga Shadowseeker"] = "Jedoga Schattensucher",
+ ["Jed Runewatcher"] = "Jed Runenblick",
+ ["Jergosh the Invoker"] = "Jergosh der Herbeirufer",
+ ["Jin'do the Hexxer"] = "Jin'do der Verhexer",
+ ["Jormungar Behemoth"] = "Jormungarungetüm",
+ Jormungars = "Jormungars",
+ Julianne = "Julianne",
+ ["Junk Bot"] = "Schrottbot",
+ ["Kael'thas Sunstrider"] = "Kael'thas Sonnenwanderer",
+ Kalecgos = "Kalecgos",
+ ["Kam Deepfury"] = "Kam Tiefenzorn",
+ ["Karsh Steelbender"] = "Karsh Steelbender", -- Needs review
+ ["Kazkaz the Unholy"] = "Kazkaz der Unheilige",
+ ["Kaz'rogal"] = "Kaz'rogal",
+ ["Keli'dan the Breaker"] = "Keli'dan der Zerstörer",
+ ["Kel'Thuzad"] = "Kel'Thuzad",
+ Keristrasza = "Keristrasza",
+ ["Kiggler the Crazed"] = "Kiggler the Crazed",
+ ["Kil'jaeden"] = "Kil'jaeden",
+ ["Kil'rek"] = "Kil'rek",
+ ["King Dred"] = "König Dred",
+ ["King Gordok"] = "König Gordok",
+ ["King Llane Piece"] = "König Llane",
+ ["King Ymiron"] = "König Ymiron",
+ ["Kirtonos the Herald"] = "Kirtonos der Herold",
+ ["Knot Thimblejack's Cache"] = "Knot Thimblejacks Truhe",
+ Kolk = "Kolk",
+ Kologarn = "Kologarn",
+ ["Koralon the Flame Watcher"] = "Koralon der Flammenwächter",
+ Kormok = "Kormok",
+ Kresh = "Kresh",
+ Krick = "Krick",
+ ["Krick and Ick"] = "Krick und Ick",
+ ["Krik'thir the Gatewatcher"] = "Krik'thir der Torwächter",
+ ["Krosh Firehand"] = "Krosh Feuerhand",
+ Krystallus = "Krystallus",
+ Kurinnaxx = "Kurinnaxx",
+ ["Lady Anacondra"] = "Lady Anacondra",
+ ["Lady Blaumeux"] = "Lady Blaumeux",
+ ["Lady Deathwhisper"] = "Lady Todeswisper",
+ ["Lady Illucia Barov"] = "Lady Illucia Barov",
+ ["Lady Malande"] = "Lady Malande",
+ ["Lady Naz'jar"] = "Lady Naz'jar", -- Needs review
+ ["Lady Sacrolash"] = "Lady Sacrolash",
+ ["Lady Sarevess"] = "Lady Sarevess",
+ ["Lady Vashj"] = "Lady Vashj",
+ Laj = "Laj",
+ Landslide = "Erdrutsch",
+ Lavanthor = "Lavanthor",
+ ["Left Arm"] = "Linker Arm",
+ ["Leotheras the Blind"] = "Leotheras der Blinde",
+ Lethon = "Lethon",
+ Lethtendris = "Lethtendris",
+ ["Leviathan Mk II"] = "Leviathan Mk II",
+ ["Ley-Guardian Eregos"] = "Leywächter Eregos",
+ ["Lieutenant Drake"] = "Leutnant Drach",
+ ["Lieutenant General Andorov"] = "Generallieutenant Andorov",
+ Loatheb = "Loatheb",
+ Loken = "Loken",
+ ["Lord Alexei Barov"] = "Lord Alexei Barov",
+ ["Lord Cobrahn"] = "Lord Kobrahn",
+ ["Lord Hel'nurath"] = "Lord Hel'nurath",
+ ["Lord Incendius"] = "Lord Incendius",
+ ["Lord Jaraxxus"] = "Lord Jaraxxus",
+ ["Lord Kazzak"] = "Lord Kazzak",
+ ["Lord Kri"] = "Lord Kri",
+ ["Lord Marrowgar"] = "Lord Mark'gar",
+ ["Lord Pythas"] = "Lord Pythas",
+ ["Lord Roccor"] = "Lord Roccor",
+ ["Lord Sanguinar"] = "Fürst Blutdurst",
+ ["Lord Serpentis"] = "Lord Serpentis",
+ ["Lord Skwol"] = "Lord Skwol",
+ ["Lord Valthalak"] = "Lord Valthalak",
+ ["Lord Victor Nefarius"] = "Lord Victor Nefarius",
+ ["Lord Vyletongue"] = "Lord Schlangenzunge",
+ ["Lorekeeper Polkelt"] = "Hüter des Wissens Polkelt",
+ ["Lorgus Jett"] = "Lorgus Jett",
+ Loro = "Loro",
+ Lucifron = "Lucifron",
+ ["Mad Magglish"] = "Zausel der Verrückte",
+ Maexxna = "Maexxna",
+ ["Mage-Lord Urom"] = "Magierlord Urom",
+ ["Magister Kalendris"] = "Magister Kalendris",
+ ["Magistrate Barthilas"] = "Magistrat Barthilas",
+ Magmadar = "Magmadar",
+ Magmus = "Magmus",
+ Magra = "Magra",
+ Magtheridon = "Magtheridon",
+ ["Maiden of Grief"] = "Maid der Trauer",
+ ["Maiden of Virtue"] = "Tugendhafte Maid",
+ ["Majordomo Executus"] = "Majordomus Exekutus",
+ Malacrass = "Malacrass",
+ ["Maleki the Pallid"] = "Maleki der Leichenblasse",
+ ["Mal'Ganis"] = "Mal'Ganis",
+ Malygos = "Malygos",
+ Maraudos = "Maraudos",
+ ["Marduk Blackpool"] = "Marduk Blackpool",
+ ["Marisa du'Paige"] = "Marisa du'Paige",
+ Marwyn = "Marwyn",
+ ["Master Engineer Telonicus"] = "Meisteringenieur Telonicus",
+ ["Maur Grimtotem"] = "Maur Grimmtotem",
+ Meathook = "Fleischhaken",
+ ["Mechano-Lord Capacitus"] = "Mechanolord Kapazitus",
+ Medivh = "Medivh",
+ ["Mekgineer Steamrigger"] = "Robogenieur Dampfhammer",
+ ["Mekgineer Thermaplugg"] = "Robogenieur Thermadraht",
+ ["Mennu the Betrayer"] = "Mennu der Verräter",
+ ["Meshlok the Harvester"] = "Meshlok der Ernter",
+ Midnight = "Mittnacht",
+ Mijan = "Mijan",
+ Mimiron = "Mimiron",
+ ["Miner Johnson"] = "Minenarbeiter Johnson",
+ ["Mistress of Pain"] = "Herrin der Schmerzen",
+ Moam = "Moam",
+ Mogor = "Mogor",
+ ["Mokra the Skullcrusher"] = "Mokra der Schädelberster",
+ Moorabi = "Moorabi",
+ Moragg = "Moragg",
+ ["Mordresh Fire Eye"] = "Mordresh Feuerauge",
+ ["Mor Grayhoof"] = "Mor Grauhuf",
+ Moroes = "Moroes",
+ ["Morogrim Tidewalker"] = "Morogrim Gezeitenwandler",
+ Morphaz = "Morphaz",
+ ["Mother Shahraz"] = "Mutter Shahraz",
+ ["Mother Smolderweb"] = "Mutter Glimmernetz",
+ ["Mr. Smite"] = "Handlanger Pein",
+ ["Muradin Bronzebeard"] = "Muradin Bronzebart",
+ ["Murkblood Twin"] = "Zwilling der Finsterblut",
+ ["Murkblood Twins"] = "Zwillinge der Finsterblut",
+ Murmur = "Murmur",
+ ["Murta Grimgut"] = "Murta Bauchgrimm",
+ ["M'uru"] = "M'uru",
+ Mushgog = "Mushgog",
+ ["Mutanus the Devourer"] = "Mutanus der Verschlinger",
+ Nalorakk = "Nalorakk",
+ Nazan = "Nazan",
+ Nefarian = "Nefarian",
+ ["Nekrum Gutchewer"] = "Nekrum der Ausweider",
+ ["Nerub'enkan"] = "Nerub'enkan",
+ ["Nethermancer Sepethrea"] = "Nethermant Sepethrea",
+ Netherspite = "Nethergroll",
+ ["Netherstrand Longbow"] = "Netherbespannter Langbogen",
+ ["Nexus-Prince Shaffar"] = "Nexusprinz Shaffar",
+ Nightbane = "Schrecken der Nacht",
+ ["Noth the Plaguebringer"] = "Noth der Seuchenfürst",
+ ["Novos the Summoner"] = "Novos der Beschwörer",
+ Noxxion = "Noxxion",
+ ["Obsidian Sentinel"] = "Obsidianschildwache",
+ ["Odo the Blindwatcher"] = "Odo der Blindseher",
+ Oggleflint = "Flintauge",
+ ["Ogom the Wretched"] = "Ogom der Elende",
+ Ohgan = "Ohgan",
+ ["Ok'thor the Breaker"] = "Ok'thor der Zerstörer",
+ Olaf = "Olaf",
+ ["Old Serra'kis"] = "Old Serra'kis",
+ ["Olm the Summoner"] = "Olm der Beschwörer",
+ ["Omor the Unscarred"] = "Omor der Narbenlose",
+ Onyxia = "Onyxia",
+ ["Opera Event"] = "Opera Event", -- Needs review
+ ["Orgrim's Hammer"] = "Orgrims Hammer",
+ ["Ormorok the Tree-Shaper"] = "Ormorok der Baumformer",
+ ["Oro Eyegouge"] = "Oro Hohlauge",
+ ["Ossirian the Unscarred"] = "Ossirian der Narbenlose",
+ Ouro = "Ouro",
+ ["Overlord Ramtusk"] = "Oberanführer Rammhauer",
+ ["Overlord Wyrmthalak"] = "Oberanführer Wyrmthalak",
+ ["Overmaster Pyron"] = "Übermeister Pyron",
+ ["Overseer Tidewrath"] = "Overseer Tidewrath",
+ Ozumat = "Ozumat", -- Needs review
+ Pandemonius = "Pandemonius",
+ ["Panzor the Invincible"] = "Panzor der Unbesiegbare",
+ Patchwerk = "Flickwerk",
+ ["Pathaleon the Calculator"] = "Pathaleon der Kalkulator",
+ Phalanx = "Phalanx",
+ ["Phaseshift Bulwark"] = "Phasenverschobenes Bollwerk",
+ Pimgib = "Pimgib",
+ ["Plaguemaw the Rotting"] = "Seuchenschlund der Faulende",
+ ["Plugger Spazzring"] = "Stöpsel Zapfring",
+ ["Postmaster Malown"] = "Postmeister Malown",
+ ["Priestess Delrissa"] = "Priesterin Delrissa",
+ ["Prince Keleseth"] = "Prinz Keleseth",
+ ["Prince Malchezaar"] = "Prinz Malchezaar",
+ ["Prince Skaldrenox"] = "Prince Skaldrenox",
+ ["Princess Huhuran"] = "Prinzessin Huhuran",
+ ["Princess Moira Bronzebeard"] = "Prinzessin Moira Bronzebeard",
+ ["Princess Tempestria"] = "Prinzessin Tempestria",
+ ["Princess Theradras"] = "Prinzessin Theradras",
+ ["Princess Yauj"] = "Prinzessin Yauj",
+ ["Prince Taldaram"] = "Prinz Taldaram",
+ ["Prince Tenris Mirkblood"] = "Prinz Tenris Mirkblut",
+ ["Prince Tortheldrin"] = "Prinz Tortheldrin",
+ ["Prince Valanar"] = "Prinz Valanar",
+ ["Professor Putricide"] = "Professor Seuchenmord",
+ ["Pure Spawn of Hydross"] = "Gereinigter Nachkomme Hydross'",
+ Pusillin = "Pusillin",
+ ["Pyroguard Emberseer"] = "Feuerwache Glutseher",
+ ["Pyromancer Loregrain"] = "Pyromant Weisenkorn",
+ Quagmirran = "Quagmirran",
+ ["Quartermaster Zigris"] = "Rüstmeister Zigris",
+ ["Rage Winterchill"] = "Furor Winterfrost",
+ Ragglesnout = "Struppmähne",
+ ["Raging Spirit"] = "Tobender Geist",
+ Ragnaros = "Ragnaros",
+ ["Ramstein the Gorger"] = "Ramstein der Verschlinger",
+ ["Ras Frostwhisper"] = "Ras Frostraunen",
+ Rattlegore = "Blutrippe",
+ ["Razorclaw the Butcher"] = "Klingenklaue der Metzger",
+ ["Razorgore the Untamed"] = "Razorgore der Ungezähmte",
+ Razorlash = "Schlingwurzler",
+ Razorscale = "Klingenschuppe",
+ ["Reliquary of Souls"] = "Reliquium der Seelen",
+ Renataki = "Renataki",
+ ["Restless Skeleton"] = "Ruheloses Skelett",
+ Rethilgore = "Rotkralle",
+ Revelosh = "Revelosh",
+ ["Rhahk'Zor"] = "Rhahk'Zor",
+ ["Ribbly Screwspigot"] = "Ribbly Schraubstutz",
+ ["Right Arm"] = "Rechter Arm",
+ ["Ring of Law"] = "Ring des Gesetzes",
+ Roar = "Brüller",
+ ["Rokad the Ravager"] = "Rokad der Verheerer",
+ ["Rokdar the Sundered Lord"] = "Rokdar der Zerklüftete",
+ ["Rokmar the Crackler"] = "Rokmar der Zerquetscher",
+ ["Rom'ogg Bonecrusher"] = "Rom'ogg Bonecrusher", -- Needs review
+ Romulo = "Romulo",
+ ["Romulo & Julianne"] = "Romulo & Julianne",
+ Roogug = "Roogug",
+ Rotface = "Modermiene",
+ Rotgrip = "Faulschnapper",
+ ["Runemaster Molgeim"] = "Runenmeister Molgeim",
+ ["Runok Wildmane"] = "Runok Wildmähne",
+ Ruuzlu = "Ruuzlu",
+ ["Salramm the Fleshcrafter"] = "Salramm der Fleischformer",
+ ["Sanctum Sentry"] = "Späher des Sanktums",
+ ["Sandarr Dunereaver"] = "Sandarr der Wüstenräuber",
+ ["Sandfury Executioner"] = "Henker der Sandwüter",
+ Sapphiron = "Saphiron",
+ Sara = "Sara",
+ ["Saronite Animus"] = "Saronitanimus",
+ Sartharion = "Sartharion",
+ ["Sathrovarr the Corruptor"] = "Sathrovarr der Verderber",
+ ["Saviana Ragefire"] = "Saviana Flammenschlund",
+ ["Scarlet Commander Mograine"] = "Scharlachroter Kommandant Mograine",
+ ["Scourgelord Tyrannus"] = "Geißelfürst Tyrannus",
+ ["Seeth'rel"] = "Wut'rel",
+ ["Selin Fireheart"] = "Selin Feuerherz",
+ ["Sergeant Bly"] = "Unteroffizier Bly",
+ ["Shade of Akama"] = "Akamas Schemen",
+ ["Shade of Aran"] = "Arans Schemen",
+ ["Shade of Eranikus"] = "Eranikus' Schemen",
+ ["Shadikith the Glider"] = "Shadikith der Segler",
+ ["Shadow Hunter Vosh'gajin"] = "Schattenjägerin Vosh'gajin",
+ ["Shadow of Leotheras"] = "Schatten von Leotheras",
+ ["Shadowpriest Sezz'ziz"] = "Schattenpriester Sezz'ziz",
+ Shadron = "Shadron",
+ Shazzrah = "Shazzrah",
+ ["Shirrak the Dead Watcher"] = "Shirrak der Totenwächter",
+ Sindragosa = "Sindragosa",
+ ["Sir Zeliek"] = "Sir Zeliek",
+ ["Sjonnir The Ironshaper"] = "Sjonnir der Eisenformer",
+ ["Skadi the Ruthless"] = "Skadi der Skrupellose",
+ ["Skarr the Unbreakable"] = "Skarr der Unbezwingbare",
+ ["Skarvald the Constructor"] = "Skarvald der Konstrukteur",
+ ["Skra'gath"] = "Skra'gath",
+ Skul = "Skul",
+ Skum = "Skum",
+ ["Slad'ran"] = "Slad'ran",
+ Sneed = "Sneed",
+ ["Sneed's Shredder"] = "Sneeds Schredder",
+ ["Solakar Flamewreath"] = "Solakar Feuerkrone",
+ ["Solarium Agent"] = "Solarian Agent",
+ ["Solarium Priest"] = "Solarian Priester",
+ ["Spirestone Battle Lord"] = "Kampflord der Felsspitzoger",
+ ["Spirestone Butcher"] = "Metzger der Felsspitzoger",
+ ["Spirestone Lord Magus"] = "Maguslord der Felsspitzoger",
+ ["Staff of Disintegration"] = "Stab der Auflösung",
+ Stalagg = "Stalagg",
+ Steelbreaker = "Stahlbrecher",
+ ["Stomper Kreeg"] = "Stampfer Kreeg",
+ Stonespine = "Steinbuckel",
+ ["Stormcaller Brundir"] = "Sturmrufer Brundir",
+ Strawman = "Strohmann",
+ ["Sulfuron Harbinger"] = "Sulfuronherold",
+ Supremus = "Supremus",
+ ["Svala Sorrowgrave"] = "Svala Grabesleid",
+ ["Swamplord Musel'ek"] = "Sumpffürst Musel'ek",
+ Taerar = "Taerar",
+ ["Tainted Spawn of Hydross"] = "Besudelter Nachkomme Hydross'",
+ ["Talon King Ikiss"] = "Klauenkönig Ikiss",
+ ["Taragaman the Hungerer"] = "Taragaman der Hungerleider",
+ ["Targorr the Dread"] = "Targorr der Schreckliche",
+ Tavarok = "Tavarok",
+ Techbot = "Techbot",
+ Temporus = "Temporus",
+ ["Tendris Warpwood"] = "Tendris Wucherborke",
+ Tenebron = "Tenebron",
+ ["Terestian Illhoof"] = "Terestian Siechhuf",
+ ["Teron Gorefiend"] = "Teron Blutschatten",
+ Thaddius = "Thaddius",
+ ["Thaladred the Darkener"] = "Thaladred der Verfinsterer",
+ ["Thane Korth'azz"] = "Than Korth'azz",
+ ["The Beast"] = "Die Bestie",
+ ["The Beasts of Northrend"] = "Bestien von Nordend",
+ ["The Big Bad Wolf"] = "Der große böse Wolf",
+ ["The Black Knight"] = "Der Schwarze Ritter",
+ ["The Black Stalker"] = "Die Schattenmutter",
+ ["The Blue Brothers"] = "Die Blaumänner",
+ ["The Bug Family"] = "Die Käferfamilie",
+ ["The Crone"] = "Die böse Hexe",
+ ["The Curator"] = "Der Kurator",
+ ["The Eredar Twins"] = "Die Eredar Zwillinge",
+ ["The Four Horsemen"] = "Die Vier Reiter",
+ ["The Illidari Council"] = "Rat der Illidari",
+ ["The Iron Council"] = "Rat der Eisernen",
+ ["Theka the Martyr"] = "Theka der Märtyrer",
+ ["The Lich King"] = "Der Lichkönig",
+ ["The Lost Dwarves"] = "Die verschollenen Zwerge",
+ ["The Lurker Below"] = "Das Grauen aus der Tiefe",
+ ["The Maker"] = "Der Schöpfer",
+ ["The Prophet Skeram"] = "Der Prophet Skeram",
+ ["The Prophet Tharon'ja"] = "Der Prophet Tharon'ja",
+ ["The Ravenian"] = "Der Ravenier",
+ ["The Razza"] = "Der Razza",
+ ["The Seven Dwarves"] = "Die Sieben Zwerge",
+ ["The Skybreaker"] = "Die Himmelsbrecher",
+ ["The Tribunal of Ages"] = "Das Tribunal der Zeitalter",
+ ["The Twin Emperors"] = "Die Zwillings-Imperatoren",
+ ["The Twin Val'kyr"] = "Zwillingsval'kyr",
+ ["The Unforgiven"] = "Der Unverziehene",
+ ["The Windreaver"] = "Der Windhäscher",
+ Thorim = "Thorim",
+ ["Thorngrin the Tender"] = "Dorngrin der Hüter",
+ ["Tidewalker Lurker"] = "Lauerer der Gezeitenwandler",
+ ["Timmy the Cruel"] = "Timmy der Grausame",
+ Tinhead = "Blechkopf",
+ ["Tinkerer Gizlock"] = "Tüftler Gizlock",
+ ["Tirion Fordring"] = "Tirion Fordring",
+ Tito = "Tito",
+ ["Toravon the Ice Watcher"] = "Toravon der Eiswächter",
+ ["Trigore the Lasher"] = "Trigore der Peitscher",
+ Trollgore = "Trollgrind",
+ ["Tsu'zee"] = "Tsu'zee",
+ ["Tuten'kash"] = "Tuten'kash",
+ ["Twilight Lord Kelris"] = "Lord des Schattenhammers Kelris",
+ ["Urok Doomhowl"] = "Urok Schreckensbote",
+ ["Vaelastrasz the Corrupt"] = "Vaelastrasz der Verdorbene",
+ ["Valithria Dreamwalker"] = "Valithria Traumwandler",
+ ["Val'kyr Shadowguard"] = "Schattenwächterin der Val'kyr",
+ ["Varian Wrynn"] = "Varian Wrynn",
+ ["Varos Cloudstrider"] = "Varos Wolkenschreiter",
+ Vazruden = "Vazruden",
+ ["Vazruden the Herald"] = "Vazruden der Herold",
+ Vectus = "Vectus",
+ Vem = "Vem",
+ Veng = "Veng",
+ ["Veras Darkshadow"] = "Veras Schwarzschatten",
+ ["Verdan the Everliving"] = "Verdan der Ewiglebende",
+ Verek = "Verek",
+ Vesperon = "Vesperon",
+ Vexallus = "Vexallus",
+ ["Veyzhak the Cannibal"] = "Veyzhack der Kannibale",
+ ["Vile'rel"] = "Bös'rel",
+ Viscidus = "Viscidus",
+ ["Viscous Fallout"] = "Verflüssigte Ablagerung",
+ ["Void Reaver"] = "Leerhäscher",
+ Volkhan = "Volkhan",
+ ["VX-001"] = "VX-001",
+ ["Warbringer O'mrogg"] = "Kriegshetzer O'mrogg",
+ ["Warchief Blackhand Piece"] = "Kriegshäuptling Schwarzfaust",
+ ["Warchief Kargath Bladefist"] = "Kriegshäuptling Kargath Messerfaust",
+ ["Warchief Rend Blackhand"] = "Kriegshäuptling Rend Schwarzfaust",
+ ["Warden Mellichar"] = "Aufseher Mellichar",
+ ["Warder Stilgiss"] = "Wärter Stilgiss",
+ ["Warlord Kalithresh"] = "Kriegsherr Kalithresh",
+ ["War Master Voone"] = "Kriegsmeister Voone",
+ ["Warmaul Champion"] = "Champion der Totschläger",
+ ["Warp Slicer"] = "Warpschnitter",
+ ["Warp Splinter"] = "Warpzweig",
+ ["Watchkeeper Gargolmar"] = "Wachhabender Gargolmar",
+ Weaver = "Wirker",
+ ["Witch Doctor Zum'rah"] = "Hexendoktor Zum'rah",
+ ["Wolf Master Nandos"] = "Wolfmeister Nados",
+ ["Wrath-Scryer Soccothrates"] = "Zornseher Soccothrates",
+ Wushoolay = "Wushoolay",
+ Xevozz = "Xevozz",
+ ["XT-002 Deconstructor"] = "XT-002 Dekonstruktor",
+ ["Yogg-Saron"] = "Yogg-Saron",
+ Yor = "Yor",
+ Ysondre = "Ysondre",
+ Zekkis = "Zekkis",
+ ["Zelemar the Wrathful"] = "Zelemar der Hasserfüllte",
+ ["Zereketh the Unbound"] = "Zereketh der Unabhängige",
+ Zerillis = "Zerillis",
+ ["Zevrim Thornhoof"] = "Zevrim Dornhuf",
+ Zolo = "Zolo",
+ ["Zul'Farrak Dead Hero"] = "Untoter Held aus Zul'Farrak",
+ ["Zul'jin"] = "Zul'jin",
+ ["Zul'Lor"] = "Zul'Lor",
+ ["Zul'tore"] = "Zul'tore",
+ ["Zuramat the Obliterator"] = "Zuramat der Auslöscher",
+}
+elseif GAME_LOCALE == "frFR" then
+ lib:SetCurrentTranslations {
+ Acidmaw = "Gueule-d'acide",
+ Aeonus = "Aeonus",
+ ["Aerial Command Unit"] = "Unité de commandement aérien",
+ ["Agathelos the Raging"] = "Agathelos le Déchaîné",
+ ["Aggem Thorncurse"] = "Aggem Malépine",
+ Ahune = "Ahune",
+ ["Akil'zon"] = "Akil'zon",
+ ["Aku'mai"] = "Aku'mai",
+ ["Al'ar"] = "Al'ar",
+ ["Algalon the Observer"] = "Algalon l'Observateur",
+ ["Alzzin the Wildshaper"] = "Alzzin le Modeleur",
+ Amanitar = "Amanitar",
+ ["Ambassador Flamelash"] = "Ambassadeur Cinglefouet",
+ ["Ambassador Hellmaw"] = "Ambassadeur Gueule-d'enfer",
+ ["Amnennar the Coldbringer"] = "Amnennar le Porte-froid",
+ ["Ancient Stone Keeper"] = "Ancien Gardien des pierres",
+ Anetheron = "Anetheron",
+ ["Anger'rel"] = "Colé'rel",
+ Anomalus = "Anomalus",
+ ["Antu'sul"] = "Antu'sul",
+ ["Anub'arak"] = "Anub'arak",
+ ["Anubisath Defender"] = "Défenseur Anubisath",
+ ["Anubisath Guardian"] = "Gardien Anubisath",
+ ["Anub'Rekhan"] = "Anub'Rekhan",
+ ["Anub'shiah"] = "Anub'shiah",
+ Anzu = "Anzu",
+ ["Arcane Watchman"] = "Veilleur arcanique",
+ ["Arcanist Doan"] = "Arcaniste Doan",
+ Archaedas = "Archaedas",
+ ["Archavon the Stone Watcher"] = "Archavon le Gardien des pierres",
+ Archimonde = "Archimonde",
+ ["Archivist Galford"] = "Archiviste Galford",
+ ["Archmage Arugal"] = "Archimage Arugal",
+ ["Argent Confessor Paletress"] = "Confesseur d'argent Paletress",
+ ["Arugal's Voidwalker"] = "Marcheur du Vide d'Arugal",
+ ["Ascendant Lord Obsidius"] = "Seigneur ascendant Obsidius",
+ ["Assault Bot"] = "Robot d'assaut",
+ ["Assembly of Iron"] = "Assemblée du Fer",
+ ["Atal'alarion"] = "Atal'alarion",
+ ["Attumen the Huntsman"] = "Attumen le Veneur",
+ Auriaya = "Auriaya",
+ Avalanchion = "Avalanchion",
+ ["Avatar of Hakkar"] = "Avatar d'Hakkar",
+ ["Ayamiss the Hunter"] = "Ayamiss le Chasseur",
+ Azgalor = "Azgalor",
+ ["Azshir the Sleepless"] = "Azshir le Sans-sommeil",
+ Azuregos = "Azuregos",
+ ["Bael'Gar"] = "Bael'Gar",
+ Baelog = "Baelog",
+ Balnazzar = "Balnazzar",
+ ["Baltharus the Warborn"] = "Baltharus l'Enfant de la guerre",
+ ["Bannok Grimaxe"] = "Bannok Hache-sinistre",
+ ["Baron Aquanis"] = "Baron Aquanis",
+ ["Baron Charr"] = "Baron Charr",
+ ["Baroness Anastari"] = "Baronne Anastari",
+ ["Baron Geddon"] = "Baron Geddon",
+ ["Baron Kazum"] = "Baron Kazum",
+ ["Baron Rivendare"] = "Baron Vaillefendre",
+ ["Baron Silverlaine"] = "Baron d'Argelaine",
+ ["Battleguard Sartura"] = "Garde de guerre Sartura",
+ ["Bazil Thredd"] = "Bazil Thredd",
+ Bazzalan = "Bazzalan",
+ Beauty = "La Belle",
+ ["Black Guard Swordsmith"] = "Fabricant d'épées de la Garde noire",
+ ["Blackheart the Inciter"] = "Coeur-noir le Séditieux",
+ ["Blindeye the Seer"] = "Oeillaveugle le Voyant",
+ ["Blind Hunter"] = "Chasseur aveugle",
+ ["Blood Guard Porung"] = "Garde de sang Porung",
+ ["Bloodlord Mandokir"] = "Seigneur sanglant Mandokir",
+ ["Bloodmage Thalnos"] = "Mage de sang Thalnos",
+ ["Blood Prince Council"] = "Conseil des princes de sang",
+ ["Blood Princes"] = "Princes de sang",
+ ["Blood-Queen Lana'thel"] = "Reine de sang Lana'thel",
+ ["Blood Steward of Kirtonos"] = "Régisseuse sanglante de Kirtonos",
+ Boahn = "Boahn",
+ ["Bomb Bot"] = "Robo-bombe",
+ ["Brain of Yogg-Saron"] = "Cerveau de Yogg-Saron",
+ ["Brainwashed Noble"] = "Noble manipulé",
+ Broggok = "Broggok",
+ Brokentoe = "Brisorteil",
+ Bronjahm = "Bronjahm",
+ ["Broodlord Lashlayer"] = "Seigneur des couvées Lanistaire",
+ ["Bruegal Ironknuckle"] = "Bruegal Poing-de-fer",
+ Brutallus = "Brutallus",
+ ["Burning Felguard"] = "Gangregarde ardent",
+ ["Buru the Gorger"] = "Buru Grandgosier",
+ ["Cache of the Firelord"] = "Cachette du Seigneur du feu",
+ ["Cache of the Legion"] = "Cache de la Légion",
+ ["Cannon Master Willey"] = "Maître canonnier Willey",
+ ["Captain Greenskin"] = "Capitaine Vertepeau",
+ ["Captain Kromcrush"] = "Capitaine Kromcrush",
+ ["Captain Skarloc"] = "Capitaine Skarloc",
+ ["Celebras the Cursed"] = "Celebras le Maudit",
+ ["Charlga Razorflank"] = "Charlga Trancheflanc",
+ ["Chess Event"] = "Partie d'échec",
+ ["Chest of The Seven"] = "Coffre des sept",
+ ["Chief Ukorz Sandscalp"] = "Chef Ukorz Scalpessable",
+ ["Cho'Rush the Observer"] = "Cho'Rush l'Observateur",
+ Chromaggus = "Chromaggus",
+ ["Chrono Lord Deja"] = "Chronoseigneur Déjà",
+ ["Chrono-Lord Epoch"] = "Chronoseigneur Epoch",
+ Claw = "Griffe",
+ ["Coilfang Elite"] = "Elite de Glissecroc",
+ ["Coilfang Strider"] = "Trotteur de Glissecroc",
+ ["Commander Kolurg"] = "Commandant Kolurg",
+ ["Commander Sarannis"] = "Commandant Sarannis",
+ ["Commander Springvale"] = "Commandant Springvale",
+ ["Commander Stoutbeard"] = "Commandant Rudebarbe",
+ ["Commander Ulthok"] = "Commandant Ulthok",
+ ["Constructor & Controller"] = "Constructeur & Contrôleur",
+ Cookie = "Macaron",
+ ["Coren Direbrew"] = "Coren Navrebière",
+ ["Corla, Herald of Twilight"] = "Corla, héraut du Crépuscule",
+ ["Cosmic Infuser"] = "Masse d'infusion cosmique",
+ ["Crimson Hammersmith"] = "Forgeur de marteaux cramoisi",
+ ["Crowd Pummeler 9-60"] = "Faucheur de foule 9-60",
+ ["Crystal Fang"] = "Croc cristallin",
+ ["C'Thun"] = "C'Thun",
+ Cyanigosa = "Cyanigosa",
+ ["Dalliah the Doomsayer"] = "Dalliah l'Auspice-funeste",
+ ["Dalronn the Controller"] = "Dalronn le Contrôleur",
+ ["Dark Coffer"] = "Coffre sombre",
+ ["Dark Iron Ambassador"] = "Ambassadeur Sombrefer",
+ ["Darkmaster Gandling"] = "Sombre Maître Gandling",
+ ["Darkweaver Syth"] = "Tisseur d'ombre Syth",
+ ["Deathbound Ward"] = "Gardien lié par la mort",
+ ["Deathbringer Saurfang"] = "Porte-mort Saurcroc",
+ ["Death Knight Darkreaver"] = "Chevalier de la mort Ravassombre",
+ ["Death Knight Understudy"] = "Doublure de chevalier de la mort",
+ ["Deathspeaker High Priest"] = "Grand prêtre nécrorateur",
+ ["Death Speaker Jargba"] = "Nécrorateur Jargba",
+ ["Deathstalker Visceri"] = "Nécrotraqueur Viscéri",
+ ["Deathsworn Captain"] = "Capitaine Ligemort",
+ Devastation = "Dévastation",
+ ["Deviate Faerie Dragon"] = "Dragon féérique déviant",
+ ["Devourer of Souls"] = "Dévoreur d’âmes",
+ ["Dextren Ward"] = "Dextren Ward",
+ ["Digmaster Shovelphlange"] = "Maître des fouilles Pellaphlange",
+ ["Doctor Theolen Krastinov"] = "Docteur Theolen Krastinov",
+ ["Doom Lord Kazzak"] = "Seigneur funeste Kazzak",
+ ["Doom'rel"] = "Tragi'rel",
+ Doomwalker = "Marche-funeste",
+ ["Dope'rel"] = "Demeu'rel",
+ Dorothee = "Dorothée",
+ ["Drahga Shodowburner"] = "Drahga Brûle-Ombre",
+ ["Drakkari Colossus"] = "Colosse drakkari",
+ ["Drakos the Interrogator"] = "Drakos l'Interrogateur",
+ Dreadscale = "Écaille-d'effroi",
+ Dreamscythe = "Fauche-rêve",
+ ["Dust Covered Chest"] = "Coffre couvert de poussière",
+ Dustwraith = "Ame en peine poudreuse",
+ ["Eadric the Pure"] = "Eadric le Pur",
+ ["Earthcaller Halmgar"] = "Implorateur de la terre Halmgar",
+ Ebonroc = "Rochébène",
+ ["Eck the Ferocious"] = "Eck le Féroce",
+ ["Edwin VanCleef"] = "Edwin VanCleef",
+ ["Elder Brightleaf"] = "Ancien Brillefeuille",
+ ["Elder Ironbranch"] = "Ancien Branchefer",
+ ["Elder Nadox"] = "Ancien Nadox",
+ ["Elder Stonebark"] = "Ancien Ecorcepierre",
+ ["Electrocutioner 6000"] = "Electrocuteur 6000",
+ ["Emalon the Storm Watcher"] = "Emalon le Guetteur d'orage",
+ Emeriss = "Emeriss",
+ ["Emperor Dagran Thaurissan"] = "Empereur Dagran Thaurissan",
+ ["Emperor Vek'lor"] = "Empereur Vek'lor",
+ ["Emperor Vek'nilash"] = "Empereur Vek'nilash",
+ Entropius = "Entropius",
+ ["Eonar's Gift"] = "Cadeau d'Eonar",
+ ["Epoch Hunter"] = "Chasseur d'époques",
+ Erekem = "Erekem",
+ ["Eressea Dawnsinger"] = "Eressa Chantelaube",
+ ["Eric \"The Swift\""] = "Eric « l'Agile »",
+ Erudax = " Erudax",
+ ["Erunak Stonespeaker"] = "Erunak Parlepierre",
+ ["Essence of Anger"] = "Essence de la colère",
+ ["Essence of Desire"] = "Essence du désir",
+ ["Essence of Suffering"] = "Essence de la souffrance",
+ Eviscerator = "Eviscérateur",
+ ["Exarch Maladaar"] = "Exarque Maladaar",
+ ["Expedition Commander"] = "Commandant de l'expédition",
+ ["Eydis Darkbane"] = "Eydis Plaie-sombre",
+ ["Eye of C'Thun"] = "Œil de C'Thun",
+ ["Faction Champions"] = "Champions de faction",
+ ["Fallen Champion"] = "Champion mort",
+ Falric = "Falric",
+ ["Falric and Marwyn"] = "Falric et Marwyn",
+ ["Fankriss the Unyielding"] = "Fankriss l'Inflexible",
+ ["Fathom-Lord Karathress"] = "Seigneur des fonds Karathress",
+ Felmyst = "Gangrebrume",
+ ["Fenrus the Devourer"] = "Fenrus le Dévoreur",
+ ["Feral Defender"] = "Défenseur farouche",
+ Festergut = "Pulentraille",
+ Feugen = "Feugen",
+ ["Fineous Darkvire"] = "Fineous Sombrevire",
+ Firemaw = "Gueule-de-feu",
+ ["Fjola Lightbane"] = "Fjola Plaie-lumineuse",
+ Flamegor = "Flamegor",
+ ["Flame Leviathan"] = "Léviathan des flammes",
+ ["Foreman Thistlenettle"] = "Contremaître Crispechardon",
+ ["Forgemaster Garfrost"] = "Maître-forge Gargivre",
+ ["Forgremaster Throngus"] = "Maître-forge Throngus",
+ ["Four Horsemen Chest"] = "Coffre des quatre cavaliers",
+ ["Fras Siabi"] = "Fras Siabi",
+ Freya = "Freya",
+ ["Gahz'ranka"] = "Gahz'ranka",
+ ["Gahz'rilla"] = "Gahz'rilla",
+ ["Gal'darah"] = "Gal'darah",
+ ["Galgann Firehammer"] = "Galgann Martel-de-feu",
+ Garr = "Garr",
+ ["Garrosh Hellscream"] = "Garrosh Hurlenfer",
+ Gasher = "Gasher",
+ ["Gatewatcher Gyro-Kill"] = "Gardien de porte Gyro-Meurtre",
+ ["Gatewatcher Iron-Hand"] = "Gardien de porte Main-en-fer",
+ ["Gathios the Shatterer"] = "Gathios le Briseur",
+ Gehennas = "Gehennas",
+ Gelihast = "Gelihast",
+ Gelk = "Gelk",
+ ["General Angerforge"] = "Général Forgehargne",
+ ["General Bjarngrim"] = "Général Bjarngrim",
+ ["General Drakkisath"] = "Général Drakkisath",
+ ["General Rajaxx"] = "Général Rajaxx",
+ ["General Umbriss"] = "Général Umbriss",
+ ["General Vezax"] = "Général Vezax",
+ ["General Zarithrian"] = "Général Zarithrian",
+ ["Ghamoo-ra"] = "Ghamoo-ra",
+ ["Ghaz'an"] = "Ghaz'an",
+ ["Ghok Bashguud"] = "Ghok Bounnebaffe",
+ Gilnid = "Gilnid",
+ ["Gizrul the Slavener"] = "Gizrul l'esclavagiste",
+ ["Gloom'rel"] = "Funéb'rel",
+ Gluth = "Gluth",
+ Glutton = "Glouton",
+ ["Golemagg the Incinerator"] = "Golemagg l'Incinérateur",
+ ["Golem Lord Argelmach"] = "Seigneur golem Argelmach",
+ ["Goraluk Anvilcrack"] = "Goraluk Brisenclume",
+ ["Gormok the Impaler"] = "Gormok l'Empaleur",
+ ["Gorosh the Dervish"] = "Gorosh le Derviche",
+ ["Gortok Palehoof"] = "Gortok Pâle-sabot",
+ ["Gothik the Harvester"] = "Gothik le Moissonneur",
+ ["Grand Astromancer Capernian"] = "Grande astromancienne Capernian",
+ ["Grand Champions"] = "Grand champions",
+ ["Grand Crusader Dathrohan"] = "Grand croisé Dathrohan",
+ ["Grand Magus Telestra"] = "Grand magus Telestra",
+ ["Grandmaster Vorpil"] = "Grand Maître Vorpil",
+ Grandmother = "Mère-grand",
+ ["Grand Warlock Alythess"] = "Grande démoniste Alythess",
+ ["Grand Warlock Nethekurse"] = "Grand démoniste Néanathème",
+ ["Grand Widow Faerlina"] = "Grande veuve Faerlina",
+ ["Grethok the Controller"] = "Grethok le Contrôleur",
+ ["Gri'lek"] = "Gri'lek",
+ Grimlok = "Grimlok",
+ Grizzle = "Grison",
+ Grobbulus = "Grobbulus",
+ Grubbis = "Grubbis",
+ ["Gruul the Dragonkiller"] = "Gruul le Tue-dragon",
+ ["Guard Fengus"] = "Garde Fengus",
+ ["Guardian of Yogg-Saron"] = "Gardien de Yogg-Saron",
+ ["Guard Mol'dar"] = "Garde Mol'dar",
+ ["Guard Slip'kik"] = "Garde Slip'kik",
+ ["Gurtogg Bloodboil"] = "Gurtogg Fièvresang",
+ Gyth = "Gyth",
+ Hadronox = "Hadronox",
+ Hakkar = "Hakkar",
+ Halazzi = "Halazzi",
+ Halion = "Halion",
+ Halycon = "Halycon",
+ Hamhock = "Hamhock",
+ ["Harbinger Skyriss"] = "Messager Cieuriss",
+ ["Hate'rel"] = "Haine'rel",
+ ["Hazza'rah"] = "Hazza'rah",
+ Hazzas = "Hazzas",
+ ["Headless Horseman"] = "Cavalier sans tête",
+ ["Hearthsinger Forresten"] = "Chanteloge Forrestin",
+ ["Hedrum the Creeper"] = "Hedrum le Rampant",
+ ["Heigan the Unclean"] = "Heigan l'Impur",
+ ["Hellfire Channeler"] = "Canaliste des Flammes infernales",
+ ["Henry Stern"] = "Henry Stern",
+ ["Herald Volazj"] = "Héraut Volazj",
+ Herod = "Hérode",
+ ["Hex Lord Malacrass"] = "Seigneur des maléfices Malacrass",
+ ["High Astromancer Solarian"] = "Grande astromancienne Solarian",
+ ["High Botanist Freywinn"] = "Grand botaniste Freywinn",
+ ["High Inquisitor Fairbanks"] = "Grand Inquisiteur Fairbanks",
+ ["High Inquisitor Whitemane"] = "Grand Inquisiteur Blanchetête",
+ ["High Interrogator Gerstahn"] = "Grand Interrogateur Gerstahn",
+ ["High King Maulgar"] = "Haut Roi Maulgar",
+ ["Highlord Mograine"] = "Généralissime Mograine",
+ ["Highlord Omokk"] = "Généralissime Omokk",
+ ["High Marshal Whirlaxis"] = "Haut maréchal Trombe",
+ ["High Nethermancer Zerevor"] = "Grand néantomancien Zerevor",
+ ["High Overlord Saurfang"] = "Haut seigneur Saurcroc",
+ ["High Priestess Arlokk"] = "Grande prêtresse Arlokk",
+ ["High Priestess Jeklik"] = "Grande prêtresse Jeklik",
+ ["High Priestess Mar'li"] = "Grande prêtresse Mar'li",
+ ["High Priestess of Thaurissan"] = "Grande prêtresse de Thaurissan",
+ ["High Priest Thekal"] = "Grand prêtre Thekal",
+ ["High Priest Venoxis"] = "Grand prêtre Venoxis",
+ ["High Warlord Naj'entus"] = "Grand seigneur de guerre Naj'entus",
+ Hodir = "Hodir",
+ ["Houndmaster Grebmar"] = "Maître-chien Grebmar",
+ ["Houndmaster Loksey"] = "Maître-chien Loksey",
+ Hukku = "Hukku",
+ Hungarfen = "Hungarfen",
+ ["Hurley Blackbreath"] = "Hurley Soufflenoir",
+ ["Hyakiss the Lurker"] = "Hyakiss le rôdeur",
+ ["Hydromancer Thespia"] = "Hydromancienne Thespia",
+ ["Hydromancer Velratha"] = "Hydromancienne Velratha",
+ Hydrospawn = "Hydrogénos",
+ ["Hydross the Unstable"] = "Hydross l'Instable",
+ ["Icecrown Gunship Battle"] = "Bataille des canonnières",
+ Icehowl = "Glace-hurlante",
+ ["Ice Sphere"] = "Sphère de glace",
+ Ichoron = "Ichoron",
+ Ick = "Ick",
+ ["Ignis the Furnace Master"] = "Ignis le maître de la Fournaise",
+ ["Illidan Stormrage"] = "Illidan Hurlorage",
+ ["Illidari Council"] = "Conseil illidari",
+ ["Illyanna Ravenoak"] = "Illyanna Corvichêne",
+ ["Immol'thar"] = "Immol'thar",
+ ["Infinite Corruptor"] = "Corrupteur infini",
+ ["Infinity Blades"] = "Lames d'infinité",
+ ["Ingvar the Plunderer"] = "Ingvar le Pilleur",
+ ["Instructor Malicia"] = "Instructeur Malicia",
+ ["Instructor Razuvious"] = "Instructeur Razuvious",
+ ["Interrogator Vishas"] = "Interrogateur Vishas",
+ Ionar = "Ionar",
+ Ironaya = "Ironaya",
+ Ironspine = "Echine-de-fer",
+ Isalien = "Isalien",
+ Jade = "Jade",
+ ["Jammal'an the Prophet"] = "Jammal'an le prophète",
+ ["Jan'alai"] = "Jan'alai",
+ ["Jandice Barov"] = "Jandice Barov",
+ ["Jedoga Shadowseeker"] = "Jedoga Cherchelombre",
+ ["Jed Runewatcher"] = "Jed Guette-runes",
+ ["Jergosh the Invoker"] = "Jergosh l'Invocateur",
+ ["Jin'do the Hexxer"] = "Jin'do le Maléficieur",
+ ["Jormungar Behemoth"] = "Béhémoth jormungar",
+ Jormungars = "Jormungars",
+ Julianne = "Julianne",
+ ["Junk Bot"] = "Robot camelote",
+ ["Kael'thas Sunstrider"] = "Kael'thas Haut-soleil",
+ Kalecgos = "Kalecgos",
+ ["Kam Deepfury"] = "Kam Furie-du-fond",
+ ["Karsh Steelbender"] = "Karsh Plielacier",
+ ["Kazkaz the Unholy"] = "Kazkaz l'Impie",
+ ["Kaz'rogal"] = "Kaz'rogal",
+ ["Keli'dan the Breaker"] = "Keli'dan le Briseur",
+ ["Kel'Thuzad"] = "Kel'Thuzad",
+ Keristrasza = "Keristrasza",
+ ["Kiggler the Crazed"] = "Kiggler le Cinglé",
+ ["Kil'jaeden"] = "Kil'jaeden",
+ ["Kil'rek"] = "Kil'rek",
+ ["King Dred"] = "Roi Dred",
+ ["King Gordok"] = "Roi Gordok",
+ ["King Llane Piece"] = "Pion du Roi Llane",
+ ["King Ymiron"] = "Roi Ymiron",
+ ["Kirtonos the Herald"] = "Kirtonos le Héraut",
+ ["Knot Thimblejack's Cache"] = "Réserve de Noué Dédodevie",
+ Kolk = "Kolk",
+ Kologarn = "Kologarn",
+ ["Koralon the Flame Watcher"] = "Koralon le Veilleur des flammes",
+ Kormok = "Kormok",
+ Kresh = "Kresh",
+ Krick = "Krick",
+ ["Krick and Ick"] = "Krick et Ick",
+ ["Krik'thir the Gatewatcher"] = "Krik'thir le Gardien de porte",
+ ["Krosh Firehand"] = "Krosh Brasemain",
+ Krystallus = "Krystallus",
+ Kurinnaxx = "Kurinnaxx",
+ ["Lady Anacondra"] = "Dame Anacondra",
+ ["Lady Blaumeux"] = "Dame Blaumeux",
+ ["Lady Deathwhisper"] = "Dame Murmemort",
+ ["Lady Illucia Barov"] = "Dame Illucia Barov",
+ ["Lady Malande"] = "Dame Malande",
+ ["Lady Naz'jar"] = "Dame Naz'jar",
+ ["Lady Sacrolash"] = "Dame Sacrocingle",
+ ["Lady Sarevess"] = "Dame Sarevess",
+ ["Lady Vashj"] = "Dame Vashj",
+ Laj = "Laj",
+ Landslide = "Glissement de terrain",
+ Lavanthor = "Lavanthor",
+ ["Left Arm"] = "Bras gauche",
+ ["Leotheras the Blind"] = "Leotheras l'Aveugle",
+ Lethon = "Léthon",
+ Lethtendris = "Lethtendris",
+ ["Leviathan Mk II"] = "Léviathan Mod. II",
+ ["Ley-Guardian Eregos"] = "Gardien-tellurique Eregos",
+ ["Lieutenant Drake"] = "Lieutenant Drake",
+ ["Lieutenant General Andorov"] = "Général de division Andorov",
+ Loatheb = "Horreb",
+ Loken = "Loken",
+ ["Lord Alexei Barov"] = "Seigneur Alexei Barov",
+ ["Lord Cobrahn"] = "Seigneur Cobrahn",
+ ["Lord Hel'nurath"] = "Seigneur Hel'nurath",
+ ["Lord Incendius"] = "Seigneur Incendius",
+ ["Lord Jaraxxus"] = "Seigneur Jaraxxus",
+ ["Lord Kazzak"] = "Seigneur Kazzak",
+ ["Lord Kri"] = "Seigneur Kri",
+ ["Lord Marrowgar"] = "Seigneur Gargamoelle",
+ ["Lord Pythas"] = "Seigneur Pythas",
+ ["Lord Roccor"] = "Seigneur Roccor",
+ ["Lord Sanguinar"] = "Seigneur Sanguinar",
+ ["Lord Serpentis"] = "Seigneur Serpentis",
+ ["Lord Skwol"] = "Seigneur Skwol",
+ ["Lord Valthalak"] = "Seigneur Valthalak",
+ ["Lord Victor Nefarius"] = "Seigneur Victor Nefarius",
+ ["Lord Vyletongue"] = "Seigneur Vylelangue",
+ ["Lorekeeper Polkelt"] = "Gardien du savoir Polkelt",
+ ["Lorgus Jett"] = "Lorgus Jett",
+ Loro = "Loro",
+ Lucifron = "Lucifron",
+ ["Mad Magglish"] = "Magglish le Dingue",
+ Maexxna = "Maexxna",
+ ["Mage-Lord Urom"] = "Seigneur-mage Urom",
+ ["Magister Kalendris"] = "Magistère Kalendris",
+ ["Magistrate Barthilas"] = "Magistrat Barthilas",
+ Magmadar = "Magmadar",
+ Magmus = "Magmus",
+ Magra = "Magra",
+ Magtheridon = "Magtheridon",
+ ["Maiden of Grief"] = "Damoiselle de peine",
+ ["Maiden of Virtue"] = "Damoiselle de vertu",
+ ["Majordomo Executus"] = "Chambellan Executus",
+ Malacrass = "Malacrass",
+ ["Maleki the Pallid"] = "Maleki le Blafard",
+ ["Mal'Ganis"] = "Mal'Ganis",
+ Malygos = "Malygos",
+ Maraudos = "Maraudos",
+ ["Marduk Blackpool"] = "Marduk Noirétang",
+ ["Marisa du'Paige"] = "Marisa du'Paige",
+ Marwyn = "Marwyn",
+ ["Master Engineer Telonicus"] = "Maître ingénieur Telonicus",
+ ["Maur Grimtotem"] = "Maur Totem-sinistre",
+ Meathook = "Grancrochet",
+ ["Mechano-Lord Capacitus"] = "Mécano-seigneur Capacitus",
+ Medivh = "Medivh",
+ ["Mekgineer Steamrigger"] = "Mékgénieur Montevapeur",
+ ["Mekgineer Thermaplugg"] = "Mekgénieur Thermojoncteur",
+ ["Mennu the Betrayer"] = "Mennu le Traître",
+ ["Meshlok the Harvester"] = "Meshlok le Moissonneur",
+ Midnight = "Minuit",
+ Mijan = "Mijan",
+ Mimiron = "Mimiron",
+ ["Miner Johnson"] = "Mineur Johnson",
+ ["Mistress of Pain"] = "Maîtresse de Douleur",
+ Moam = "Moam",
+ Mogor = "Mogor",
+ ["Mokra the Skullcrusher"] = "Mokra le Brise-tête",
+ Moorabi = "Moorabi",
+ Moragg = "Moragg",
+ ["Mordresh Fire Eye"] = "Mordresh Oeil-de-feu",
+ ["Mor Grayhoof"] = "Mor Sabot-gris",
+ Moroes = "Moroes",
+ ["Morogrim Tidewalker"] = "Morogrim Marcheur-des-flots",
+ Morphaz = "Morphaz",
+ ["Mother Shahraz"] = "Mère Shahraz",
+ ["Mother Smolderweb"] = "Matriarche Couveuse",
+ ["Mr. Smite"] = "M. Châtiment",
+ ["Muradin Bronzebeard"] = "Muradin Barbe-de-bronze",
+ ["Murkblood Twin"] = "Jumeau bourbesang",
+ ["Murkblood Twins"] = "Jumeaux bourbesang",
+ Murmur = "Marmon",
+ ["Murta Grimgut"] = "Murta Mornentraille",
+ ["M'uru"] = "M'uru",
+ Mushgog = "Mushgog",
+ ["Mutanus the Devourer"] = "Mutanus le Dévoreur",
+ Nalorakk = "Nalorakk",
+ Nazan = "Nazan",
+ Nefarian = "Nefarian",
+ ["Nekrum Gutchewer"] = "Nekrum Mâchetripes",
+ ["Nerub'enkan"] = "Nerub'enkan",
+ ["Nethermancer Sepethrea"] = "Néantomancien Sepethrea",
+ Netherspite = "Dédain-du-Néant",
+ ["Netherstrand Longbow"] = "Arc long brins-de-Néant",
+ ["Nexus-Prince Shaffar"] = "Prince-nexus Shaffar",
+ Nightbane = "Plaie-de-nuit",
+ ["Noth the Plaguebringer"] = "Noth le Porte-peste",
+ ["Novos the Summoner"] = "Novos l'Invocateur",
+ Noxxion = "Noxcion",
+ ["Obsidian Sentinel"] = "Sentinelle d'obsidienne",
+ ["Odo the Blindwatcher"] = "Odo l'Aveugle",
+ Oggleflint = "Lorgnesilex",
+ ["Ogom the Wretched"] = "Ogom le Misérable",
+ Ohgan = "Ohgan",
+ ["Ok'thor the Breaker"] = "Ok'thor le Briseur",
+ Olaf = "Olaf",
+ ["Old Serra'kis"] = "Vieux Serra'kis",
+ ["Olm the Summoner"] = "Olm l'Invocateur",
+ ["Omor the Unscarred"] = "Omor l'Intouché",
+ Onyxia = "Onyxia",
+ ["Opera Event"] = "Evénement de l'opéra",
+ ["Orgrim's Hammer"] = "Marteau d'Orgrim",
+ ["Ormorok the Tree-Shaper"] = "Ormorok le Sculpte-arbre",
+ ["Oro Eyegouge"] = "Oro Crève-oeil ",
+ ["Ossirian the Unscarred"] = "Ossirian l'Intouché",
+ Ouro = "Ouro",
+ ["Overlord Ramtusk"] = "Seigneur Brusquebroche",
+ ["Overlord Wyrmthalak"] = "Seigneur Wyrmthalak",
+ ["Overmaster Pyron"] = "Grand seigneur Pyron",
+ ["Overseer Tidewrath"] = "Surveillant Tidewrath",
+ Ozumat = "Ozumat",
+ Pandemonius = "Pandemonius",
+ ["Panzor the Invincible"] = "Panzor l'Invincible",
+ Patchwerk = "Le Recousu",
+ ["Pathaleon the Calculator"] = "Pathaleon le Calculateur",
+ Phalanx = "Phalange",
+ ["Phaseshift Bulwark"] = "Rempart de déphasage",
+ Pimgib = "Pimgib",
+ ["Plaguemaw the Rotting"] = "Pestegueule le Pourrissant",
+ ["Plugger Spazzring"] = "Lanfiche Brouillecircuit",
+ ["Postmaster Malown"] = "Postier Malown",
+ ["Priestess Delrissa"] = "Prêtresse Delrissa",
+ ["Prince Keleseth"] = "Prince Keleseth",
+ ["Prince Malchezaar"] = "Prince Malchezaar",
+ ["Prince Skaldrenox"] = "Prince Skaldrenox ",
+ ["Princess Huhuran"] = "Princesse Huhuran",
+ ["Princess Moira Bronzebeard"] = "Princesse Moira Barbe-de-bronze",
+ ["Princess Tempestria"] = "Princesse Tempestria",
+ ["Princess Theradras"] = "Princesse Theradras",
+ ["Princess Yauj"] = "Princesse Yauj",
+ ["Prince Taldaram"] = "Prince Taldaram",
+ ["Prince Tenris Mirkblood"] = "Prince Tenris Bourbassang",
+ ["Prince Tortheldrin"] = "Prince Tortheldrin",
+ ["Prince Valanar"] = "Prince Valanar",
+ ["Professor Putricide"] = "Professeur Putricide",
+ ["Pure Spawn of Hydross"] = "Pur rejeton d'Hydross",
+ Pusillin = "Pusillin",
+ ["Pyroguard Emberseer"] = "Pyrogarde Prophète ardent",
+ ["Pyromancer Loregrain"] = "Pyromancien Blé-du-savoir",
+ Quagmirran = "Bourbierreux",
+ ["Quartermaster Zigris"] = "Intendant Zigris",
+ ["Rage Winterchill"] = "Rage Froidhiver",
+ Ragglesnout = "Groinfendu",
+ ["Raging Spirit"] = "Esprit déchaîné",
+ Ragnaros = "Ragnaros",
+ ["Ramstein the Gorger"] = "Ramstein Grandgosier",
+ ["Ras Frostwhisper"] = "Ras Murmegivre",
+ Rattlegore = "Cliquettripes",
+ ["Razorclaw the Butcher"] = "Tranchegriffe le Boucher",
+ ["Razorgore the Untamed"] = "Tranchetripe l'Indompté",
+ Razorlash = "Tranchefouet",
+ Razorscale = "Tranchécaille",
+ ["Reliquary of Souls"] = "Le reliquaire des âmes",
+ Renataki = "Renataki",
+ ["Restless Skeleton"] = "Squelette sans repos",
+ Rethilgore = "Rethiltripe",
+ Revelosh = "Revelosh",
+ ["Rhahk'Zor"] = "Rhahk'Zor",
+ ["Ribbly Screwspigot"] = "Ribbly Fermevanne",
+ ["Right Arm"] = "Bras droit",
+ ["Ring of Law"] = "Cercle de la loi",
+ Roar = "Graou",
+ ["Rokad the Ravager"] = "Rodak le ravageur",
+ ["Rokdar the Sundered Lord"] = "Rokdar le Seigneur scindé",
+ ["Rokmar the Crackler"] = "Rokmar le Crépitant",
+ ["Rom'ogg Bonecrusher"] = "Broie-les-os Rom'ogg",
+ Romulo = "Romulo",
+ ["Romulo & Julianne"] = "Romulo & Julianne",
+ Roogug = "Roogug",
+ Rotface = "Trognepus",
+ Rotgrip = "Grippe-charogne",
+ ["Runemaster Molgeim"] = "Maître des runes Molgeim",
+ ["Runok Wildmane"] = "Runok Crin-sauvage",
+ Ruuzlu = "Ruuzlu",
+ ["Salramm the Fleshcrafter"] = "Salramm le Façonneur de chair",
+ ["Sanctum Sentry"] = "Factionnaire du sanctum",
+ ["Sandarr Dunereaver"] = "Sandarr Ravadune",
+ ["Sandfury Executioner"] = "Bourreau Furie-des-sables",
+ Sapphiron = "Saphiron",
+ Sara = "Sara",
+ ["Saronite Animus"] = "Animus de saronite",
+ Sartharion = "Sartharion",
+ ["Sathrovarr the Corruptor"] = "Sathrovarr le Corrupteur",
+ ["Saviana Ragefire"] = "Saviana Ragefeu",
+ ["Scarlet Commander Mograine"] = "Commandant écarlate Mograine",
+ ["Scourgelord Tyrannus"] = "Seigneur du Fléau Tyrannus",
+ ["Seeth'rel"] = "Fulmi'rel",
+ ["Selin Fireheart"] = "Selin Coeur-de-feu",
+ ["Sergeant Bly"] = "Sergent Bly",
+ ["Shade of Akama"] = "Ombre d'Akama",
+ ["Shade of Aran"] = "Ombre d'Aran",
+ ["Shade of Eranikus"] = "Ombre d'Eranikus",
+ ["Shadikith the Glider"] = "Shadikith le glisseur",
+ ["Shadow Hunter Vosh'gajin"] = "Chasseresse des ombres Vosh'gajin",
+ ["Shadow of Leotheras"] = "Ombre de Leotheras",
+ ["Shadowpriest Sezz'ziz"] = "Prêtre des ombres Sezz'ziz",
+ Shadron = "Obscuron",
+ Shazzrah = "Shazzrah",
+ ["Shirrak the Dead Watcher"] = "Shirrak le Veillemort",
+ Sindragosa = "Sindragosa",
+ ["Sir Zeliek"] = "Sire Zeliek",
+ ["Sjonnir The Ironshaper"] = "Sjonnir le Sculptefer",
+ ["Skadi the Ruthless"] = "Skadi le Brutal",
+ ["Skarr the Unbreakable"] = "Bâlhafr l'Invaincu",
+ ["Skarvald the Constructor"] = "Skarvald le Constructeur",
+ ["Skra'gath"] = "Skra'gath",
+ Skul = "Krân",
+ Skum = "Skum",
+ ["Slad'ran"] = "Slad'ran",
+ Sneed = "Sneed",
+ ["Sneed's Shredder"] = "Déchiqueteur de Sneed",
+ ["Solakar Flamewreath"] = "Solakar Voluteflamme",
+ ["Solarium Agent"] = "Agent du Solarium",
+ ["Solarium Priest"] = "Prêtre du Solarium",
+ ["Spirestone Battle Lord"] = "Seigneur de bataille Pierre-du-pic",
+ ["Spirestone Butcher"] = "Boucher Pierre-du-pic",
+ ["Spirestone Lord Magus"] = "Seigneur magus Pierre-du-pic",
+ ["Staff of Disintegration"] = "Bâton de désintégration",
+ Stalagg = "Stalagg",
+ Steelbreaker = "Brise-acier",
+ ["Stomper Kreeg"] = "Kreeg le Marteleur",
+ Stonespine = "Echine-de-pierre",
+ ["Stormcaller Brundir"] = "Mande-foudre Brundir",
+ Strawman = "Homme de paille",
+ ["Sulfuron Harbinger"] = "Messager de Sulfuron",
+ Supremus = "Supremus",
+ ["Svala Sorrowgrave"] = "Svala Tristetombe",
+ ["Swamplord Musel'ek"] = "Seigneur des marais Musel'ek",
+ Taerar = "Taerar",
+ ["Tainted Spawn of Hydross"] = "Rejeton d'Hydross souillé",
+ ["Talon King Ikiss"] = "Roi-serre Ikiss",
+ ["Taragaman the Hungerer"] = "Taragaman l'Affameur",
+ ["Targorr the Dread"] = "Targorr le Terrifiant",
+ Tavarok = "Tavarok",
+ Techbot = "Techbot",
+ Temporus = "Temporus",
+ ["Tendris Warpwood"] = "Tendris Crochebois",
+ Tenebron = "Ténébron",
+ ["Terestian Illhoof"] = "Terestian Malsabot",
+ ["Teron Gorefiend"] = "Teron Fielsang",
+ Thaddius = "Thaddius",
+ ["Thaladred the Darkener"] = "Thaladred l'Assombrisseur",
+ ["Thane Korth'azz"] = "Thane Korth'azz",
+ ["The Beast"] = "La Bête",
+ ["The Beasts of Northrend"] = "Les bêtes du Norfendre",
+ ["The Big Bad Wolf"] = "Le Grand Méchant Loup",
+ ["The Black Knight"] = "Le Chevalier noir",
+ ["The Black Stalker"] = "La Traqueuse noire",
+ ["The Blue Brothers"] = "Les Grands Bleus",
+ ["The Bug Family"] = "La famille insecte",
+ ["The Crone"] = "La Mégère",
+ ["The Curator"] = "Le conservateur",
+ ["The Eredar Twins"] = "Les jumelles érédars",
+ ["The Four Horsemen"] = "Les quatre cavaliers",
+ ["The Illidari Council"] = "Le conseil illidari",
+ ["The Iron Council"] = "Assemblée du fer",
+ ["Theka the Martyr"] = "Theka le Martyr",
+ ["The Lich King"] = "Le roi-liche",
+ ["The Lost Dwarves"] = "Les nains perdus",
+ ["The Lurker Below"] = "Le Rôdeur d'En bas",
+ ["The Maker"] = "Le Faiseur",
+ ["The Prophet Skeram"] = "Le Prophète Skeram",
+ ["The Prophet Tharon'ja"] = "Le prophète Tharon'ja",
+ ["The Ravenian"] = "Le Voracien",
+ ["The Razza"] = "La Razza",
+ ["The Seven Dwarves"] = "Les sept nains",
+ ["The Skybreaker"] = "Le Brise-ciel",
+ ["The Tribunal of Ages"] = "Le tribunal des Âges",
+ ["The Twin Emperors"] = "Les Empereurs jumeaux",
+ ["The Twin Val'kyr"] = "Les jumelles val'kyr",
+ ["The Unforgiven"] = "Le Condamné",
+ ["The Windreaver"] = "Ouraganien",
+ Thorim = "Thorim",
+ ["Thorngrin the Tender"] = "Rirépine le Tendre",
+ ["Tidewalker Lurker"] = "Rôdeur marcheur-des-flots",
+ ["Timmy the Cruel"] = "Timmy le Cruel",
+ Tinhead = "Tête de fer-blanc",
+ ["Tinkerer Gizlock"] = "Bricoleur Kadenaz",
+ ["Tirion Fordring"] = "Tirion Fordring",
+ Tito = "Tito",
+ ["Toravon the Ice Watcher"] = "Toravon la Sentinelle de glace",
+ ["Trigore the Lasher"] = "Trigore le Flagelleur",
+ Trollgore = "Trollétripe",
+ ["Tsu'zee"] = "Tsu'zee",
+ ["Tuten'kash"] = "Tuten'kash",
+ ["Twilight Lord Kelris"] = "Seigneur du crépuscule Kelris",
+ ["Urok Doomhowl"] = "Urok Hurleruine",
+ ["Vaelastrasz the Corrupt"] = "Vaelastrasz le Corrompu",
+ ["Valithria Dreamwalker"] = "Valithria Marcherêve",
+ ["Val'kyr Shadowguard"] = "Garde de l'ombre val'kyr",
+ ["Varian Wrynn"] = "Varian Wrynn",
+ ["Varos Cloudstrider"] = "Varos Arpentenuée",
+ Vazruden = "Vazruden",
+ ["Vazruden the Herald"] = "Vazruden le Héraut",
+ Vectus = "Vectus",
+ Vem = "Vem",
+ Veng = "Veng",
+ ["Veras Darkshadow"] = "Veras Ombrenoir",
+ ["Verdan the Everliving"] = "Verdan l'Immortel",
+ Verek = "Verek",
+ Vesperon = "Vespéron",
+ Vexallus = "Vexallus",
+ ["Veyzhak the Cannibal"] = "Veyzhak le Cannibale",
+ ["Vile'rel"] = "Ignobl'rel",
+ Viscidus = "Viscidus",
+ ["Viscous Fallout"] = "Retombée visqueuse",
+ ["Void Reaver"] = "Saccageur du Vide",
+ Volkhan = "Volkhan",
+ ["VX-001"] = "VX-001",
+ ["Warbringer O'mrogg"] = "Porteguerre O'mrogg",
+ ["Warchief Blackhand Piece"] = "Pion du Chef de guerre Main-noire",
+ ["Warchief Kargath Bladefist"] = "Chef de guerre Kargath Lamepoing",
+ ["Warchief Rend Blackhand"] = "Chef de guerre Rend Main-noire",
+ ["Warden Mellichar"] = "Gardien Mellichar",
+ ["Warder Stilgiss"] = "Gardien Stilgiss",
+ ["Warlord Kalithresh"] = "Seigneur de guerre Kalithresh",
+ ["War Master Voone"] = "Maître de guerre Voone",
+ ["Warmaul Champion"] = "Champion Cogneguerre",
+ ["Warp Slicer"] = "Tranchoir dimensionnel",
+ ["Warp Splinter"] = "Brise-dimension",
+ ["Watchkeeper Gargolmar"] = "Gardien des guetteurs Gargolmar",
+ Weaver = "Tisserand",
+ ["Witch Doctor Zum'rah"] = "Sorcier-docteur Zum'rah",
+ ["Wolf Master Nandos"] = "Maître-loup Nandos",
+ ["Wrath-Scryer Soccothrates"] = "Scrute-courroux Soccothrates",
+ Wushoolay = "Wushoolay",
+ Xevozz = "Xevozz",
+ ["XT-002 Deconstructor"] = "Déconstructeur XT-002",
+ ["Yogg-Saron"] = "Yogg-Saron",
+ Yor = "Yor",
+ Ysondre = "Ysondre",
+ Zekkis = "Zekkis",
+ ["Zelemar the Wrathful"] = "Zelemar le Courroucé",
+ ["Zereketh the Unbound"] = "Zereketh le Délié",
+ Zerillis = "Zerillis",
+ ["Zevrim Thornhoof"] = "Zevrim Sabot-de-ronce",
+ Zolo = "Zolo",
+ ["Zul'Farrak Dead Hero"] = "Héros mort de Zul'Farrak",
+ ["Zul'jin"] = "Zul'jin",
+ ["Zul'Lor"] = "Zul'Lor",
+ ["Zul'tore"] = "Zul'tore",
+ ["Zuramat the Obliterator"] = "Zuramat l'Oblitérateur",
+}
+elseif GAME_LOCALE == "koKR" then
+ lib:SetCurrentTranslations {
+ Acidmaw = "공포비늘",
+ Aeonus = "아에누스",
+ ["Aerial Command Unit"] = "공중 지휘기",
+ ["Agathelos the Raging"] = "흉포한 아가테로스",
+ -- ["Aggem Thorncurse"] = "",
+ Ahune = "아훈",
+ ["Akil'zon"] = "아킬존",
+ ["Aku'mai"] = "아쿠마이",
+ ["Al'ar"] = "알라르",
+ ["Algalon the Observer"] = "관찰자 알갈론",
+ ["Alzzin the Wildshaper"] = "칼날바람 알진",
+ Amanitar = "아마니타르",
+ ["Ambassador Flamelash"] = "사자 화염채찍",
+ ["Ambassador Hellmaw"] = "사자 지옥아귀",
+ ["Amnennar the Coldbringer"] = "혹한의 암네나르",
+ ["Ancient Stone Keeper"] = "고대 바위 문지기",
+ Anetheron = "아네테론",
+ ["Anger'rel"] = "격노의 문지기",
+ Anomalus = "아노말루스",
+ ["Antu'sul"] = "안투술",
+ ["Anub'arak"] = "아눕아락",
+ ["Anubisath Defender"] = "아누비사스 문지기",
+ ["Anubisath Guardian"] = "아누비사스 감시자",
+ ["Anub'Rekhan"] = "아눕레칸",
+ ["Anub'shiah"] = "아눕쉬아",
+ Anzu = "안주",
+ ["Arcane Watchman"] = "비전 보초",
+ ["Arcanist Doan"] = "신비술사 도안",
+ Archaedas = "아카에다스",
+ ["Archavon the Stone Watcher"] = "바위 감시자 아카본",
+ Archimonde = "아키몬드",
+ ["Archivist Galford"] = "기록관 갈포드",
+ ["Archmage Arugal"] = "대마법사 아루갈",
+ ["Argent Confessor Paletress"] = "은빛 고해사제 페일트리스",
+ ["Arugal's Voidwalker"] = "아루갈의 보이드워커",
+ -- ["Ascendant Lord Obsidius"] = "",
+ ["Assault Bot"] = "돌격로봇",
+ -- ["Assembly of Iron"] = "",
+ ["Atal'alarion"] = "아탈알라리온",
+ ["Attumen the Huntsman"] = "사냥꾼 어튜멘",
+ Auriaya = "아우리아야",
+ Avalanchion = "아발란치온",
+ ["Avatar of Hakkar"] = "학카르의 화신",
+ ["Ayamiss the Hunter"] = "사냥꾼 아야미스",
+ Azgalor = "아즈갈로",
+ ["Azshir the Sleepless"] = "잠들지 않는 아즈시르",
+ Azuregos = "아주어고스",
+ ["Bael'Gar"] = "벨가르",
+ Baelog = "밸로그",
+ Balnazzar = "발나자르",
+ ["Baltharus the Warborn"] = "전쟁의 아들 발타루스",
+ ["Bannok Grimaxe"] = "반노크 그림액스",
+ ["Baron Aquanis"] = "남작 아쿠아니스",
+ ["Baron Charr"] = "남작 차르",
+ ["Baroness Anastari"] = "남작부인 아나스타리",
+ ["Baron Geddon"] = "남작 게돈",
+ ["Baron Kazum"] = "남작 카줌",
+ ["Baron Rivendare"] = "남작 리븐데어",
+ ["Baron Silverlaine"] = "남작 실버레인",
+ ["Battleguard Sartura"] = "전투감시병 살투라",
+ ["Bazil Thredd"] = "바질 스레드",
+ Bazzalan = "바잘란",
+ -- Beauty = "",
+ ["Black Guard Swordsmith"] = "검은호위대 검제작자",
+ ["Blackheart the Inciter"] = "선동자 검은심장",
+ ["Blindeye the Seer"] = "현자 블라인드아이",
+ ["Blind Hunter"] = "장님 사냥꾼",
+ ["Blood Guard Porung"] = "혈투사 포룽",
+ ["Bloodlord Mandokir"] = "혈군주 만도키르",
+ ["Bloodmage Thalnos"] = "혈법사 탈노스",
+ ["Blood Prince Council"] = "피의 공작 의회",
+ ["Blood Princes"] = "피의 공작",
+ ["Blood-Queen Lana'thel"] = "피의 여왕 라나텔",
+ ["Blood Steward of Kirtonos"] = "키르토노스의 혈지기",
+ Boahn = "보안",
+ ["Bomb Bot"] = "폭탄로봇",
+ ["Brain of Yogg-Saron"] = "요그사론의 뇌",
+ ["Brainwashed Noble"] = "세뇌당한 귀족",
+ Broggok = "브로고크",
+ Brokentoe = "망치발굽",
+ Bronjahm = "브론잠",
+ ["Broodlord Lashlayer"] = "용기대장 래쉬레이어",
+ ["Bruegal Ironknuckle"] = "무쇠주먹 브루갈",
+ Brutallus = "브루탈루스",
+ ["Burning Felguard"] = "불타는 지옥수호병",
+ ["Buru the Gorger"] = "먹보 부루",
+ ["Cache of the Firelord"] = "Cache of the Firelord",
+ -- ["Cache of the Legion"] = "",
+ ["Cannon Master Willey"] = "포병대장 윌리",
+ ["Captain Greenskin"] = "선장 그린스킨",
+ ["Captain Kromcrush"] = "대장 크롬크러쉬",
+ ["Captain Skarloc"] = "경비대장 스칼록",
+ ["Celebras the Cursed"] = "저주받은 셀레브라스",
+ ["Charlga Razorflank"] = "서슬깃 차를가",
+ ["Chess Event"] = "Chess Event",
+ ["Chest of The Seven"] = "Chest of The Seven",
+ ["Chief Ukorz Sandscalp"] = "족장 우코르즈 샌드스칼프",
+ ["Cho'Rush the Observer"] = "정찰병 초루쉬",
+ Chromaggus = "크로마구스",
+ ["Chrono Lord Deja"] = "시간의 군주 데자",
+ ["Chrono-Lord Epoch"] = "시간의 군주 에포크",
+ Claw = "클로",
+ ["Coilfang Elite"] = "갈퀴송곳니 정예병",
+ ["Coilfang Strider"] = "갈퀴송곳니 포자손",
+ ["Commander Kolurg"] = "사령관 콜루르그",
+ ["Commander Sarannis"] = "지휘관 새래니스",
+ ["Commander Springvale"] = "사령관 스프링베일",
+ ["Commander Stoutbeard"] = "사령관 스타우트비어드",
+ -- ["Commander Ulthok"] = "",
+ ["Constructor & Controller"] = "건축가와 감시자",
+ Cookie = "쿠키",
+ ["Coren Direbrew"] = "코렌 다이어브루",
+ -- ["Corla, Herald of Twilight"] = "",
+ ["Cosmic Infuser"] = "붕괴의 지팡이",
+ ["Crimson Hammersmith"] = "진홍십자군 대장장이",
+ ["Crowd Pummeler 9-60"] = "고철 압축기 9-60",
+ ["Crystal Fang"] = "수정 맹독 거미",
+ ["C'Thun"] = "쑨",
+ Cyanigosa = "시아니고사",
+ ["Dalliah the Doomsayer"] = "파멸의 예언자 달리아",
+ ["Dalronn the Controller"] = "감시자 달론",
+ -- ["Dark Coffer"] = "",
+ ["Dark Iron Ambassador"] = "검은무쇠단 사절",
+ ["Darkmaster Gandling"] = "암흑스승 간틀링",
+ ["Darkweaver Syth"] = "흑마술사 시스",
+ ["Deathbound Ward"] = "죽음에 속박된 감시자",
+ ["Deathbringer Saurfang"] = "죽음의 인도자 사울팽",
+ ["Death Knight Darkreaver"] = "죽음의 기사 다크리버",
+ ["Death Knight Understudy"] = "죽음의 기사 수습생",
+ ["Deathspeaker High Priest"] = "죽음예언자 대사제",
+ ["Death Speaker Jargba"] = "죽음의 예언자 잘그바",
+ ["Deathstalker Visceri"] = "죽음의추적자 비세리",
+ ["Deathsworn Captain"] = "죽음의 경비대장",
+ Devastation = "황폐의 도끼",
+ ["Deviate Faerie Dragon"] = "돌연변이 요정용",
+ ["Devourer of Souls"] = "영혼의 포식자",
+ ["Dextren Ward"] = "덱스트렌 워드",
+ ["Digmaster Shovelphlange"] = "발굴단장 쇼벨플랜지",
+ ["Doctor Theolen Krastinov"] = "학자 테올린 크라스티노브",
+ ["Doom Lord Kazzak"] = "파멸의 군주 카자크",
+ ["Doom'rel"] = "운명의 문지기",
+ Doomwalker = "파멸의 절단기",
+ ["Dope'rel"] = "최면의 문지기",
+ Dorothee = "도로시",
+ -- ["Drahga Shodowburner"] = "",
+ ["Drakkari Colossus"] = "드라카리 거대골렘",
+ ["Drakos the Interrogator"] = "심문관 드라코스",
+ Dreadscale = "공포비늘",
+ Dreamscythe = "드림사이드",
+ ["Dust Covered Chest"] = "Dust Covered Chest",
+ Dustwraith = "더스트레이스",
+ ["Eadric the Pure"] = "성기사 에드릭",
+ ["Earthcaller Halmgar"] = "대지술사 함가르",
+ Ebonroc = "에본로크",
+ ["Eck the Ferocious"] = "사나운 엑크",
+ ["Edwin VanCleef"] = "에드윈 밴클리프",
+ ["Elder Brightleaf"] = "장로 밝은잎",
+ ["Elder Ironbranch"] = "장로 무쇠돌기",
+ ["Elder Nadox"] = "장로 나독스",
+ ["Elder Stonebark"] = "장로 돌나무껍질",
+ ["Electrocutioner 6000"] = "기계화 문지기 6000",
+ ["Emalon the Storm Watcher"] = "폭풍 감시자 에말론",
+ Emeriss = "에메리스",
+ ["Emperor Dagran Thaurissan"] = "제왕 다그란 타우릿산",
+ ["Emperor Vek'lor"] = "제왕 베클로어",
+ ["Emperor Vek'nilash"] = "제왕 베크닐라쉬",
+ Entropius = "엔트로피우스",
+ ["Eonar's Gift"] = "이오나의 선물",
+ ["Epoch Hunter"] = "시대의 사냥꾼",
+ Erekem = "에레켐",
+ ["Eressea Dawnsinger"] = "에레시아 돈싱어",
+ -- ["Eric \"The Swift\""] = "",
+ -- Erudax = "",
+ -- ["Erunak Stonespeaker"] = "",
+ ["Essence of Anger"] = "격노의 정수",
+ ["Essence of Desire"] = "욕망의 정수",
+ ["Essence of Suffering"] = "고뇌의 정수",
+ Eviscerator = "적출자",
+ ["Exarch Maladaar"] = "총독 말라다르",
+ ["Expedition Commander"] = "원정대 대장",
+ ["Eydis Darkbane"] = "아이디스 다크베인",
+ ["Eye of C'Thun"] = "쑨의 눈",
+ ["Faction Champions"] = "진영 대표 용사",
+ ["Fallen Champion"] = "타락한 용사",
+ Falric = "팔릭",
+ ["Falric and Marwyn"] = "팔릭과 마윈",
+ ["Fankriss the Unyielding"] = "불굴의 판크리스",
+ ["Fathom-Lord Karathress"] = "심연의 군주 카라드레스",
+ Felmyst = "지옥안개",
+ ["Fenrus the Devourer"] = "파멸의 펜루스",
+ ["Feral Defender"] = "수호 야수",
+ Festergut = "구린속",
+ Feugen = "퓨진",
+ ["Fineous Darkvire"] = "파이너스 다크바이어",
+ Firemaw = "화염아귀",
+ ["Fjola Lightbane"] = "피욜라 라이트베인",
+ Flamegor = "플레임고르",
+ ["Flame Leviathan"] = "거대 화염전차",
+ ["Foreman Thistlenettle"] = "현장감독 시슬네틀",
+ ["Forgemaster Garfrost"] = "괴철로감독관 가프로스트",
+ -- ["Forgremaster Throngus"] = "",
+ ["Four Horsemen Chest"] = "Four Horsemen Chest",
+ ["Fras Siabi"] = "프라스 샤비",
+ Freya = "프레이야",
+ ["Gahz'ranka"] = "가즈란카",
+ ["Gahz'rilla"] = "가즈릴라",
+ ["Gal'darah"] = "갈다라",
+ ["Galgann Firehammer"] = "갈간 파이어해머",
+ Garr = "가르",
+ ["Garrosh Hellscream"] = "가로쉬 헬스크림",
+ Gasher = "게이셔",
+ ["Gatewatcher Gyro-Kill"] = "문지기 회전톱날",
+ ["Gatewatcher Iron-Hand"] = "문지기 무쇠주먹",
+ ["Gathios the Shatterer"] = "파괴자 가디오스",
+ Gehennas = "게헨나스",
+ Gelihast = "겔리하스트",
+ Gelk = "겔크",
+ ["General Angerforge"] = "사령관 앵거포지",
+ ["General Bjarngrim"] = "장군 비야른그림",
+ ["General Drakkisath"] = "사령관 드라키사스",
+ ["General Rajaxx"] = "장군 라작스",
+ -- ["General Umbriss"] = "",
+ ["General Vezax"] = "장군 베작스",
+ ["General Zarithrian"] = "장군 자리스리안",
+ ["Ghamoo-ra"] = "가무라 ",
+ ["Ghaz'an"] = "가즈안",
+ ["Ghok Bashguud"] = "고크 배시구드",
+ Gilnid = "길니드",
+ ["Gizrul the Slavener"] = "흉포한 기즈룰",
+ ["Gloom'rel"] = "그늘의 문지기",
+ Gluth = "글루스",
+ Glutton = "게걸먹보",
+ ["Golemagg the Incinerator"] = "초열의 골레마그",
+ ["Golem Lord Argelmach"] = "골렘군주 아젤마크",
+ ["Goraluk Anvilcrack"] = "고랄루크 앤빌크랙",
+ ["Gormok the Impaler"] = "꿰뚫는 자 고르목",
+ ["Gorosh the Dervish"] = "광신자 고로쉬",
+ ["Gortok Palehoof"] = "고르톡 페일후프",
+ ["Gothik the Harvester"] = "영혼 착취자 고딕",
+ ["Grand Astromancer Capernian"] = "대점성술사 카퍼니안",
+ ["Grand Champions"] = "도시 최고 용사",
+ -- ["Grand Crusader Dathrohan"] = "",
+ ["Grand Magus Telestra"] = "대학자 텔레스트라",
+ ["Grandmaster Vorpil"] = "단장 보르필",
+ Grandmother = "할머니",
+ ["Grand Warlock Alythess"] = "대흑마법사 알리테스",
+ ["Grand Warlock Nethekurse"] = "대흑마법사 네더쿠르스",
+ ["Grand Widow Faerlina"] = "귀부인 팰리나",
+ ["Grethok the Controller"] = "감시자 그레토크",
+ ["Gri'lek"] = "그리렉",
+ Grimlok = "그림로크",
+ Grizzle = "그리즐",
+ Grobbulus = "그라불루스",
+ Grubbis = "그루비스 ",
+ ["Gruul the Dragonkiller"] = "용 학살자 그룰",
+ ["Guard Fengus"] = "경비병 펜구스",
+ ["Guardian of Yogg-Saron"] = "요그사론의 수호자",
+ ["Guard Mol'dar"] = "경비병 몰다르",
+ ["Guard Slip'kik"] = "경기병 슬립킥",
+ ["Gurtogg Bloodboil"] = "구르토그 블러드보일",
+ Gyth = "기스",
+ Hadronox = "하드로녹스",
+ Hakkar = "학카르",
+ Halazzi = "할라지",
+ Halion = "할리온",
+ Halycon = "할리콘",
+ Hamhock = "햄혹",
+ ["Harbinger Skyriss"] = "선구자 스키리스",
+ ["Hate'rel"] = "증오의 문지기",
+ ["Hazza'rah"] = "하자라",
+ Hazzas = "하자스",
+ ["Headless Horseman"] = "저주받은 기사",
+ ["Hearthsinger Forresten"] = "하스싱어 포레스턴",
+ ["Hedrum the Creeper"] = "왕거미 헤드룸",
+ ["Heigan the Unclean"] = "부정의 헤이건",
+ ["Hellfire Channeler"] = "지옥불 역술사",
+ ["Henry Stern"] = "헨리 스턴",
+ ["Herald Volazj"] = "사자 볼라즈",
+ Herod = "헤로드",
+ ["Hex Lord Malacrass"] = "주술 군주 말라크라스",
+ ["High Astromancer Solarian"] = "고위 점성술사 솔라리안",
+ ["High Botanist Freywinn"] = "고위 식물학자 프레이윈",
+ ["High Inquisitor Fairbanks"] = "종교재판관 페어뱅크스",
+ ["High Inquisitor Whitemane"] = "종교재판관 화이트메인",
+ ["High Interrogator Gerstahn"] = "대심문관 게르스탄",
+ ["High King Maulgar"] = "왕중왕 마울가르",
+ ["Highlord Mograine"] = "대영주 모그레인",
+ ["Highlord Omokk"] = "대군주 오모크",
+ ["High Marshal Whirlaxis"] = "대장군 휠락시스",
+ ["High Nethermancer Zerevor"] = "고위 황천술사 제레보르",
+ ["High Overlord Saurfang"] = "대군주 사울팽",
+ ["High Priestess Arlokk"] = "대여사제 알로크",
+ ["High Priestess Jeklik"] = "대여사제 제클릭",
+ ["High Priestess Mar'li"] = "대여사제 말리",
+ ["High Priestess of Thaurissan"] = "타우릿산의 대여사제",
+ ["High Priest Thekal"] = "대사제 데칼",
+ ["High Priest Venoxis"] = "대사제 베녹시스",
+ ["High Warlord Naj'entus"] = "대장군 나젠투스",
+ Hodir = "호디르",
+ ["Houndmaster Grebmar"] = "사냥개조련사 그렙마르",
+ ["Houndmaster Loksey"] = "사냥개 조련사 록시",
+ Hukku = "후쿠",
+ Hungarfen = "헝가르펜",
+ ["Hurley Blackbreath"] = "헐레이 블랙브레스",
+ ["Hyakiss the Lurker"] = "잠복꾼 히아키스",
+ ["Hydromancer Thespia"] = "풍수사 세스피아",
+ ["Hydromancer Velratha"] = "유체술사 벨라타",
+ Hydrospawn = "히드로스폰",
+ ["Hydross the Unstable"] = "불안정한 히드로스",
+ ["Icecrown Gunship Battle"] = "얼음왕관 비행포격선 전투",
+ Icehowl = "얼음울음",
+ ["Ice Sphere"] = "얼음 구슬",
+ Ichoron = "이코론",
+ Ick = "이크",
+ ["Ignis the Furnace Master"] = "용광로 군주 이그니스",
+ ["Illidan Stormrage"] = "일리단 스톰레이지",
+ ["Illidari Council"] = "일리다리 의회",
+ ["Illyanna Ravenoak"] = "일샨나 레이븐호크",
+ ["Immol'thar"] = "이몰타르",
+ ["Infinite Corruptor"] = "무한의 타락자",
+ ["Infinity Blades"] = "무한의 비수",
+ ["Ingvar the Plunderer"] = "약탈자 잉그바르",
+ ["Instructor Malicia"] = "조교 말리시아",
+ ["Instructor Razuvious"] = "훈련교관 라주비어스",
+ ["Interrogator Vishas"] = "심문관 비샤스",
+ Ionar = "아이오나",
+ Ironaya = "아이로나야",
+ Ironspine = "무쇠해골",
+ Isalien = "이살리엔",
+ Jade = "제이드",
+ ["Jammal'an the Prophet"] = "예언자 잠말란",
+ ["Jan'alai"] = "잔알라이",
+ ["Jandice Barov"] = "잔다이스 바로브",
+ ["Jedoga Shadowseeker"] = "어둠추적자 제도가",
+ ["Jed Runewatcher"] = "제드 룬와처",
+ ["Jergosh the Invoker"] = "기원사 제로쉬",
+ ["Jin'do the Hexxer"] = "주술사 진도",
+ ["Jormungar Behemoth"] = "요르문가르 거수",
+ Jormungars = "요르문가르",
+ Julianne = "줄리엔",
+ ["Junk Bot"] = "고철로봇",
+ ["Kael'thas Sunstrider"] = "캘타스 선스트라이더",
+ Kalecgos = "칼렉고스",
+ ["Kam Deepfury"] = "캄 딥퓨리",
+ -- ["Karsh Steelbender"] = "",
+ ["Kazkaz the Unholy"] = "타락한 카즈카즈",
+ ["Kaz'rogal"] = "카즈로갈",
+ ["Keli'dan the Breaker"] = "파괴자 켈리단",
+ ["Kel'Thuzad"] = "켈투자드",
+ Keristrasza = "케리스트라자",
+ ["Kiggler the Crazed"] = "광기의 키글러",
+ ["Kil'jaeden"] = "킬제덴",
+ ["Kil'rek"] = "킬렉",
+ ["King Dred"] = "랩터왕 서슬발톱",
+ ["King Gordok"] = "왕 고르독",
+ ["King Llane Piece"] = "국왕 레인",
+ ["King Ymiron"] = "왕 이미론",
+ ["Kirtonos the Herald"] = "사자 키르토노스",
+ ["Knot Thimblejack's Cache"] = "노트 팀블젝의 은닉품",
+ Kolk = "콜크",
+ Kologarn = "콜로간",
+ ["Koralon the Flame Watcher"] = "화염 감시자 코랄론",
+ Kormok = "코르모크",
+ Kresh = "크레쉬",
+ Krick = "크리크",
+ ["Krick and Ick"] = "크리크와 이크",
+ ["Krik'thir the Gatewatcher"] = "문지기 크릭시르",
+ ["Krosh Firehand"] = "크로쉬 파이어핸드",
+ Krystallus = "크리스탈루스",
+ Kurinnaxx = "쿠린낙스",
+ ["Lady Anacondra"] = "여군주 아나콘드라",
+ ["Lady Blaumeux"] = "여군주 블라미우스",
+ ["Lady Deathwhisper"] = "여교주 데스위스퍼",
+ ["Lady Illucia Barov"] = "여군주 일루시아 바로브",
+ ["Lady Malande"] = "여군주 말란데",
+ -- ["Lady Naz'jar"] = "",
+ ["Lady Sacrolash"] = "여군주 사크로래쉬",
+ ["Lady Sarevess"] = "여왕 사레베스",
+ ["Lady Vashj"] = "여군주 바쉬",
+ Laj = "라즈",
+ Landslide = "산사태",
+ Lavanthor = "라반토르",
+ ["Left Arm"] = "왼팔",
+ ["Leotheras the Blind"] = "눈먼 레오테라스",
+ Lethon = "레손",
+ Lethtendris = "레스텐드리스",
+ ["Leviathan Mk II"] = "거대 전차 Mk II",
+ ["Ley-Guardian Eregos"] = "지맥 수호자 에레고스",
+ ["Lieutenant Drake"] = "부관 드레이크",
+ ["Lieutenant General Andorov"] = "사령관 안도로브",
+ Loatheb = "로데브",
+ Loken = "로켄",
+ ["Lord Alexei Barov"] = "군주 알렉세이 바로브",
+ ["Lord Cobrahn"] = "군주 코브란",
+ ["Lord Hel'nurath"] = "군주 헬누라스",
+ ["Lord Incendius"] = "군주 인센디우스",
+ ["Lord Jaraxxus"] = "군주 자락서스",
+ ["Lord Kazzak"] = "군주 카자크",
+ ["Lord Kri"] = "군주 크리",
+ ["Lord Marrowgar"] = "군주 매로우가르",
+ ["Lord Pythas"] = "군주 피타스",
+ ["Lord Roccor"] = "불의군주 록코르",
+ ["Lord Sanguinar"] = "군주 생귀나르",
+ ["Lord Serpentis"] = "군주 서펜디스",
+ ["Lord Skwol"] = "군주 스퀄",
+ ["Lord Valthalak"] = "군주 발타라크",
+ ["Lord Victor Nefarius"] = "군주 빅터 네파리우스",
+ ["Lord Vyletongue"] = "군주 바일텅",
+ ["Lorekeeper Polkelt"] = "현자 폴켈트",
+ -- ["Lorgus Jett"] = "",
+ Loro = "로로",
+ Lucifron = "루시프론",
+ ["Mad Magglish"] = "광기의 매글리시",
+ Maexxna = "맥스나",
+ ["Mage-Lord Urom"] = "마법사 군주 우롬",
+ ["Magister Kalendris"] = "마법사 칼렌드리스",
+ ["Magistrate Barthilas"] = "집정관 바실라스",
+ Magmadar = "마그마다르",
+ Magmus = "마그무스",
+ Magra = "마그라",
+ Magtheridon = "마그테리돈",
+ ["Maiden of Grief"] = "고뇌의 마녀",
+ ["Maiden of Virtue"] = "고결의 여신",
+ ["Majordomo Executus"] = "청지기 이그젝큐투스",
+ Malacrass = "말라크라스",
+ ["Maleki the Pallid"] = "냉혈한 말레키",
+ ["Mal'Ganis"] = "말가니스",
+ Malygos = "말리고스",
+ Maraudos = "마라우도스",
+ ["Marduk Blackpool"] = "마르두크 블랙풀",
+ ["Marisa du'Paige"] = "마리사 두페이지",
+ Marwyn = "마윈",
+ ["Master Engineer Telonicus"] = "수석기술자 텔로니쿠스",
+ ["Maur Grimtotem"] = "마우르 그림토템",
+ Meathook = "살덩이갈고리",
+ ["Mechano-Lord Capacitus"] = "기계군주 캐퍼시투스",
+ Medivh = "메디브",
+ ["Mekgineer Steamrigger"] = "기계공학자 스팀리거",
+ ["Mekgineer Thermaplugg"] = "멕기니어 텔마플러그",
+ ["Mennu the Betrayer"] = "배반자 멘누",
+ ["Meshlok the Harvester"] = "정원사 메슬로크",
+ Midnight = "천둥이",
+ Mijan = "마이잔",
+ Mimiron = "미미론",
+ ["Miner Johnson"] = "광부 존슨",
+ ["Mistress of Pain"] = "고통의 여군주",
+ Moam = "모암",
+ Mogor = "모고르",
+ ["Mokra the Skullcrusher"] = "해골분쇄자 모크라",
+ Moorabi = "무라비",
+ Moragg = "모라그",
+ ["Mordresh Fire Eye"] = "불꽃눈 모드레쉬",
+ ["Mor Grayhoof"] = "모르 그레이후프",
+ Moroes = "모로스",
+ ["Morogrim Tidewalker"] = "겅둥파도 모로그림",
+ Morphaz = "몰파즈",
+ ["Mother Shahraz"] = "대모 샤라즈",
+ ["Mother Smolderweb"] = "여왕 불그물거미",
+ ["Mr. Smite"] = "미스터 스마이트",
+ ["Muradin Bronzebeard"] = "무라딘 브론즈비어드",
+ ["Murkblood Twin"] = "수렁피일족 쌍둥이",
+ ["Murkblood Twins"] = "수렁피일족 쌍둥이",
+ Murmur = "울림",
+ ["Murta Grimgut"] = "무르타 그림구트",
+ ["M'uru"] = "므우루",
+ Mushgog = "머쉬고그",
+ ["Mutanus the Devourer"] = "걸신들린 무타누스",
+ Nalorakk = "날로라크",
+ Nazan = "나잔",
+ Nefarian = "네파리안",
+ ["Nekrum Gutchewer"] = "네크룸 거트츄어",
+ ["Nerub'enkan"] = "네룹엔칸",
+ ["Nethermancer Sepethrea"] = "황천술사 세페스레아",
+ Netherspite = "황천의 원령",
+ ["Netherstrand Longbow"] = "황천매듭 장궁",
+ ["Nexus-Prince Shaffar"] = "연합왕자 샤파르",
+ Nightbane = "파멸의 어둠",
+ ["Noth the Plaguebringer"] = "역병술사 노스",
+ ["Novos the Summoner"] = "소환사 노보스",
+ Noxxion = "녹시온",
+ ["Obsidian Sentinel"] = "흑요석 파수꾼",
+ ["Odo the Blindwatcher"] = "눈먼감시자 오도",
+ -- Oggleflint = "",
+ ["Ogom the Wretched"] = "비운의 오그옴",
+ -- Ohgan = "",
+ ["Ok'thor the Breaker"] = "파괴자 오크토르",
+ -- Olaf = "",
+ ["Old Serra'kis"] = "늙은 세라키스",
+ ["Olm the Summoner"] = "소환사 올름",
+ ["Omor the Unscarred"] = "무적의 오모르",
+ Onyxia = "오닉시아",
+ -- ["Opera Event"] = "",
+ ["Orgrim's Hammer"] = "오그림의 망치호",
+ ["Ormorok the Tree-Shaper"] = "정원사 오르모로크",
+ ["Oro Eyegouge"] = "오로 아이가우지",
+ ["Ossirian the Unscarred"] = "무적의 오시리안",
+ Ouro = "아우로",
+ ["Overlord Ramtusk"] = "대군주 램터스크",
+ ["Overlord Wyrmthalak"] = "대군주 윔타라크",
+ ["Overmaster Pyron"] = "멸망의 파이론",
+ ["Overseer Tidewrath"] = "우두머리 성난파도",
+ -- Ozumat = "",
+ Pandemonius = "팬더모니우스",
+ ["Panzor the Invincible"] = "무적의 판저",
+ Patchwerk = "패치워크",
+ ["Pathaleon the Calculator"] = "철두철미한 파탈리온",
+ Phalanx = "팔란스",
+ ["Phaseshift Bulwark"] = "위상 변화의 보루방패",
+ Pimgib = "핌기브",
+ ["Plaguemaw the Rotting"] = "썩어가는 역병아귀",
+ ["Plugger Spazzring"] = "플러거스파즈링",
+ ["Postmaster Malown"] = "우체국장 말로운",
+ ["Priestess Delrissa"] = "여사제 델리사",
+ ["Prince Keleseth"] = "공작 켈레세스",
+ ["Prince Malchezaar"] = "공작 말체자르",
+ ["Prince Skaldrenox"] = "왕자 스칼레녹스",
+ ["Princess Huhuran"] = "공주 후후란",
+ ["Princess Moira Bronzebeard"] = "공주 모이라 브론즈비어드",
+ ["Princess Tempestria"] = "공주 템페스트리아",
+ ["Princess Theradras"] = "공주 테라드라스",
+ ["Princess Yauj"] = "공주 야우즈",
+ ["Prince Taldaram"] = "공작 탈다람",
+ ["Prince Tenris Mirkblood"] = "공작 텐리스 머크블러드",
+ ["Prince Tortheldrin"] = "왕자 토르텔드린",
+ ["Prince Valanar"] = "공작 발라나르",
+ ["Professor Putricide"] = "교수 퓨트리사이드",
+ ["Pure Spawn of Hydross"] = "순수한 히드로스의 피조물",
+ Pusillin = "푸실린",
+ ["Pyroguard Emberseer"] = "불의 수호자 엠버시어",
+ ["Pyromancer Loregrain"] = "화염술사 로어그레인",
+ Quagmirran = "쿠아그미란",
+ ["Quartermaster Zigris"] = "병참장교 지그리스",
+ ["Rage Winterchill"] = "격노한 윈터칠",
+ Ragglesnout = "너덜주둥이",
+ ["Raging Spirit"] = "분노한 영혼",
+ Ragnaros = "라그나로스",
+ ["Ramstein the Gorger"] = "먹보 람스타인",
+ ["Ras Frostwhisper"] = "라스 프로스트위스퍼",
+ Rattlegore = "들창어금니",
+ ["Razorclaw the Butcher"] = "도살자 칼날발톱",
+ ["Razorgore the Untamed"] = "폭군 서슬송곳니",
+ Razorlash = "칼날채찍",
+ Razorscale = "칼날비늘",
+ ["Reliquary of Souls"] = "영혼의 성물함",
+ Renataki = "레나타키",
+ ["Restless Skeleton"] = "잠 못 드는 해골",
+ Rethilgore = "레실고어",
+ Revelosh = "레벨로쉬",
+ ["Rhahk'Zor"] = "라크조르",
+ ["Ribbly Screwspigot"] = "리블리 스크류스피곳",
+ ["Right Arm"] = "오른팔",
+ -- ["Ring of Law"] = "",
+ Roar = "어흥이",
+ ["Rokad the Ravager"] = "파괴자 로카드",
+ ["Rokdar the Sundered Lord"] = "파괴의 군주 로크다르",
+ ["Rokmar the Crackler"] = "딱딱이 로크마르",
+ -- ["Rom'ogg Bonecrusher"] = "",
+ Romulo = "로밀로",
+ ["Romulo & Julianne"] = "로밀로 & 줄리엔",
+ -- Roogug = "",
+ Rotface = "썩은얼굴",
+ Rotgrip = "썩은 아귀",
+ ["Runemaster Molgeim"] = "룬술사 몰가임",
+ ["Runok Wildmane"] = "루노크 와일드메인",
+ Ruuzlu = "루즐루",
+ ["Salramm the Fleshcrafter"] = "살덩이창조자 살람",
+ ["Sanctum Sentry"] = "성소의 파수꾼",
+ ["Sandarr Dunereaver"] = "산다르 듄리버",
+ ["Sandfury Executioner"] = "성난모래부족 사형집행인",
+ Sapphiron = "사피론",
+ Sara = "사라",
+ ["Saronite Animus"] = "사로나이트 원혼",
+ Sartharion = "살타리온",
+ ["Sathrovarr the Corruptor"] = "타락의 사스로바르",
+ ["Saviana Ragefire"] = "사비아나 레이지파이어",
+ ["Scarlet Commander Mograine"] = "붉은십자군 사령관 모그레인",
+ ["Scourgelord Tyrannus"] = "스컬지군주 티라누스",
+ ["Seeth'rel"] = "불안의 문지기",
+ ["Selin Fireheart"] = "셀린 파이어하트",
+ ["Sergeant Bly"] = "하사관 블라이",
+ ["Shade of Akama"] = "아카마의 망령",
+ ["Shade of Aran"] = "아란의 망령",
+ ["Shade of Eranikus"] = "에라니쿠스의 사령",
+ ["Shadikith the Glider"] = "활강의 샤디키스",
+ ["Shadow Hunter Vosh'gajin"] = "어둠사냥꾼 보쉬가진",
+ ["Shadow of Leotheras"] = "레오테라스의 그림자",
+ ["Shadowpriest Sezz'ziz"] = "어둠의사제 세즈지즈",
+ Shadron = "샤드론",
+ Shazzrah = "샤즈라",
+ ["Shirrak the Dead Watcher"] = "죽음의 감시인 쉴라크",
+ Sindragosa = "신드라고사",
+ ["Sir Zeliek"] = "젤리에크 경",
+ ["Sjonnir The Ironshaper"] = "무쇠구체자 쇼니르",
+ ["Skadi the Ruthless"] = "학살자 스카디",
+ ["Skarr the Unbreakable"] = "무적의 스카르",
+ ["Skarvald the Constructor"] = "건축가 스카발드",
+ ["Skra'gath"] = "스크라가스",
+ Skul = "스컬",
+ Skum = "스컴",
+ ["Slad'ran"] = "슬라드란",
+ Sneed = "스니드",
+ ["Sneed's Shredder"] = "스니드의 벌목기",
+ ["Solakar Flamewreath"] = "화염고리 솔라카르",
+ ["Solarium Agent"] = "태양의 전당 요원",
+ ["Solarium Priest"] = "태양의 전당 사제",
+ ["Spirestone Battle Lord"] = "뾰족바위일족 전투대장",
+ ["Spirestone Butcher"] = "뾰족바위일족 학살자",
+ ["Spirestone Lord Magus"] = "뾰족바위일족 마법사장",
+ ["Staff of Disintegration"] = "우주 에너지 주입기",
+ Stalagg = "스탈라그",
+ Steelbreaker = "강철파괴자",
+ ["Stomper Kreeg"] = "천둥발 크리그",
+ Stonespine = "뾰족바위",
+ ["Stormcaller Brundir"] = "폭풍소환사 브룬디르",
+ Strawman = "허수아비",
+ ["Sulfuron Harbinger"] = "설퍼론 사자",
+ Supremus = "궁극의 심연",
+ ["Svala Sorrowgrave"] = "스발라 소로우그레이브",
+ ["Swamplord Musel'ek"] = "늪군주 뮤즐레크",
+ Taerar = "타에라",
+ ["Tainted Spawn of Hydross"] = "오염된 히드로스의 피조물",
+ ["Talon King Ikiss"] = "갈퀴대왕 이키스",
+ ["Taragaman the Hungerer"] = "욕망의 타라가만",
+ ["Targorr the Dread"] = "흉악범 타고르",
+ Tavarok = "타바로크",
+ Techbot = "첨단로봇",
+ Temporus = "템퍼루스",
+ ["Tendris Warpwood"] = "굽이나무 텐드리스",
+ Tenebron = "테네브론",
+ ["Terestian Illhoof"] = "테레스티안 일후프",
+ ["Teron Gorefiend"] = "테론 고어핀드",
+ Thaddius = "타디우스",
+ ["Thaladred the Darkener"] = "암흑의 인도자 탈라드레드",
+ ["Thane Korth'azz"] = "영주 코스아즈",
+ ["The Beast"] = "괴수",
+ ["The Beasts of Northrend"] = "노스렌드의 야수",
+ ["The Big Bad Wolf"] = "커다란 나쁜 늑대",
+ ["The Black Knight"] = "흑기사",
+ ["The Black Stalker"] = "검은 추적자",
+ ["The Blue Brothers"] = "푸른 형제들",
+ ["The Bug Family"] = "벌레 무리",
+ ["The Crone"] = "마녀",
+ ["The Curator"] = "전시 관리인",
+ ["The Eredar Twins"] = "에레다르 쌍둥이",
+ ["The Four Horsemen"] = "4인의 기병대",
+ ["The Illidari Council"] = "일리다리 의회",
+ ["The Iron Council"] = "무쇠 평의회",
+ ["Theka the Martyr"] = "순교자 데카",
+ ["The Lich King"] = "리치 왕",
+ -- ["The Lost Dwarves"] = "",
+ ["The Lurker Below"] = "심연의 잠복꾼",
+ ["The Maker"] = "재앙의 창조자",
+ ["The Prophet Skeram"] = "예언자 스케람",
+ ["The Prophet Tharon'ja"] = "예언자 타론자",
+ ["The Ravenian"] = "라베니안",
+ ["The Razza"] = "라자",
+ ["The Seven Dwarves"] = "The Seven Dwarves", -- Needs review
+ ["The Skybreaker"] = "하늘파괴자호",
+ ["The Tribunal of Ages"] = "시대의 심판장",
+ ["The Twin Emperors"] = "쌍둥이 제왕",
+ ["The Twin Val'kyr"] = "발키르 쌍둥이",
+ ["The Unforgiven"] = "용서받지 못한 자",
+ ["The Windreaver"] = "칼날바람",
+ Thorim = "토림",
+ ["Thorngrin the Tender"] = "감시인 쏜그린",
+ ["Tidewalker Lurker"] = "겅둥파도 잠복꾼",
+ ["Timmy the Cruel"] = "잔혹한 티미",
+ Tinhead = "양철나무꾼",
+ ["Tinkerer Gizlock"] = "땜장이 기즐록",
+ ["Tirion Fordring"] = "티리온 폴드링",
+ Tito = "티토",
+ ["Toravon the Ice Watcher"] = "얼음 감시자 토라본",
+ ["Trigore the Lasher"] = "채찍꼬리 트리고어",
+ Trollgore = "송곳아귀",
+ ["Tsu'zee"] = "츄지",
+ ["Tuten'kash"] = "투텐카쉬",
+ ["Twilight Lord Kelris"] = "황혼의 군주 켈리스",
+ ["Urok Doomhowl"] = "우르크 둠하울",
+ ["Vaelastrasz the Corrupt"] = "타락한 밸라스트라즈",
+ ["Valithria Dreamwalker"] = "발리스리아 드림워커",
+ ["Val'kyr Shadowguard"] = "발키르 어둠수호병",
+ ["Varian Wrynn"] = "바리안 린",
+ ["Varos Cloudstrider"] = "바로스 클라우드스트라이더",
+ Vazruden = "바즈루덴",
+ ["Vazruden the Herald"] = "사자 바즈루덴",
+ Vectus = "벡투스",
+ Vem = "벰",
+ Veng = "벵",
+ ["Veras Darkshadow"] = "베라스 다크섀도",
+ ["Verdan the Everliving"] = "영생의 베르단",
+ Verek = "베레크",
+ Vesperon = "베스페론",
+ Vexallus = "벡살루스",
+ ["Veyzhak the Cannibal"] = "식인트롤 베이쟉",
+ ["Vile'rel"] = "타락의 문지기",
+ Viscidus = "비시디우스",
+ ["Viscous Fallout"] = "방사성 폐기물",
+ ["Void Reaver"] = "공허의 절단기",
+ Volkhan = "볼칸",
+ ["VX-001"] = "VX-001",
+ ["Warbringer O'mrogg"] = "돌격대장 오므로그",
+ ["Warchief Blackhand Piece"] = "대족장 블랙핸드",
+ ["Warchief Kargath Bladefist"] = "대족장 카르가스 블레이드피스트",
+ ["Warchief Rend Blackhand"] = "대족장 렌드 블랙핸드",
+ ["Warden Mellichar"] = "교도관 멜리챠르",
+ ["Warder Stilgiss"] = "문지기 스틸기스",
+ ["Warlord Kalithresh"] = "장군 칼리스레쉬",
+ ["War Master Voone"] = "대장군 부네",
+ ["Warmaul Champion"] = "전쟁망치일족 용사",
+ ["Warp Slicer"] = "차원의 절단기",
+ ["Warp Splinter"] = "차원의 분리자",
+ ["Watchkeeper Gargolmar"] = "감시자 가르골마르",
+ Weaver = "위버",
+ ["Witch Doctor Zum'rah"] = "의술사 줌라",
+ ["Wolf Master Nandos"] = "늑대왕 난도스",
+ ["Wrath-Scryer Soccothrates"] = "격노의 점술사 소코드라테스",
+ Wushoolay = "우슬레이",
+ Xevozz = "제보즈",
+ ["XT-002 Deconstructor"] = "XT-002 해체자",
+ ["Yogg-Saron"] = "요그사론",
+ -- Yor = "",
+ Ysondre = "이손드레",
+ Zekkis = "젝키스",
+ ["Zelemar the Wrathful"] = "진노의 젤레마르",
+ ["Zereketh the Unbound"] = "속박이 풀린 제레케스",
+ Zerillis = "제릴리스",
+ ["Zevrim Thornhoof"] = "제브림 쏜후프",
+ Zolo = "졸로",
+ ["Zul'Farrak Dead Hero"] = "줄파락 죽음의 영웅",
+ ["Zul'jin"] = "줄진",
+ ["Zul'Lor"] = "줄로",
+ ["Zul'tore"] = "줄토어",
+ ["Zuramat the Obliterator"] = "파멸자 주라마트",
+}
+elseif GAME_LOCALE == "esES" then
+ lib:SetCurrentTranslations {
+ Acidmaw = "Fauceácida",
+ Aeonus = "Aeonus",
+ ["Aerial Command Unit"] = "Unidad de mando aérea",
+ ["Agathelos the Raging"] = "Agathelos el Furioso",
+ -- ["Aggem Thorncurse"] = "",
+ Ahune = "Ahune",
+ ["Akil'zon"] = "Akil'zon",
+ ["Aku'mai"] = "Aku'mai",
+ ["Al'ar"] = "Al'ar",
+ ["Algalon the Observer"] = "Algalon el Observador",
+ ["Alzzin the Wildshaper"] = "Alzzin el Formaferal",
+ Amanitar = "Amanitar",
+ ["Ambassador Flamelash"] = "Embajador Latifuego",
+ ["Ambassador Hellmaw"] = "Embajador Faucinferno",
+ ["Amnennar the Coldbringer"] = "Amnennar el Gélido",
+ ["Ancient Stone Keeper"] = "Vigilante pétreo anciano",
+ Anetheron = "Anetheron",
+ ["Anger'rel"] = "Anger'rel",
+ Anomalus = "Anomalus",
+ ["Antu'sul"] = "Antu'sul",
+ ["Anub'arak"] = "Anub'arak",
+ ["Anubisath Defender"] = "Defensor Anubisath",
+ ["Anubisath Guardian"] = "Guardián Anubisath",
+ ["Anub'Rekhan"] = "Anub'Rekhan",
+ ["Anub'shiah"] = "Anub'shiah",
+ Anzu = "Anzu",
+ ["Arcane Watchman"] = "Vigilante Arcano",
+ ["Arcanist Doan"] = "Arcanista Doan",
+ Archaedas = "Archaedas",
+ ["Archavon the Stone Watcher"] = "Archavon el Vigía de piedra",
+ Archimonde = "Archimonde",
+ ["Archivist Galford"] = "Archivista Galford",
+ ["Archmage Arugal"] = "Archimago Arugal",
+ ["Argent Confessor Paletress"] = "Confesora Argenta Cabelloclaro",
+ ["Arugal's Voidwalker"] = "Abisario de Arugal",
+ -- ["Ascendant Lord Obsidius"] = "",
+ ["Assault Bot"] = "Robot de asalto",
+ -- ["Assembly of Iron"] = "",
+ ["Atal'alarion"] = "Atal'alarion",
+ ["Attumen the Huntsman"] = "Attumen el Montero",
+ Auriaya = "Auriaya",
+ Avalanchion = "Avalanchion",
+ ["Avatar of Hakkar"] = "Avatar de Hakkar",
+ ["Ayamiss the Hunter"] = "Ayamiss el Cazador",
+ Azgalor = "Azgalor",
+ ["Azshir the Sleepless"] = "Azshir el Insomne",
+ Azuregos = "Azuregos",
+ ["Bael'Gar"] = "Bael'Gar",
+ Baelog = "Baelog",
+ Balnazzar = "Balnazzar",
+ ["Baltharus the Warborn"] = "Baltharus el Batallante",
+ ["Bannok Grimaxe"] = "Bannok Hachamacabra",
+ ["Baron Aquanis"] = "Barón Aquanis",
+ ["Baron Charr"] = "Barón Charr",
+ ["Baroness Anastari"] = "Baronesa Anastari",
+ ["Baron Geddon"] = "Barón Geddon",
+ ["Baron Kazum"] = "Barón Kazum",
+ ["Baron Rivendare"] = "Barón Rivendare",
+ ["Baron Silverlaine"] = "Barón Filargenta",
+ ["Battleguard Sartura"] = "Guardia de batalla Sartura",
+ ["Bazil Thredd"] = "Bazil Thredd",
+ Bazzalan = "Bazzalan",
+ -- Beauty = "",
+ ["Black Guard Swordsmith"] = "Armero Guardia Negra",
+ ["Blackheart the Inciter"] = "Negrozón el Incitador",
+ ["Blindeye the Seer"] = "Ciego el Vidente",
+ ["Blind Hunter"] = "Cazador ciego",
+ ["Blood Guard Porung"] = "Guardia de sangre Porung",
+ ["Bloodlord Mandokir"] = "Señor sangriento Mandokir",
+ ["Bloodmage Thalnos"] = "Mago sangriento Thalnos",
+ ["Blood Prince Council"] = "Consejo de Príncipes de Sangre",
+ ["Blood Princes"] = "Consejo de Príncipes de Sangre",
+ ["Blood-Queen Lana'thel"] = "Reina de sangre Lana’thel",
+ ["Blood Steward of Kirtonos"] = "Administrador de sangre de Kirtonos",
+ Boahn = "Boahn",
+ ["Bomb Bot"] = "Robot bum",
+ ["Brain of Yogg-Saron"] = "Cerebro de Yogg-Saron",
+ ["Brainwashed Noble"] = "Noble aducido",
+ Broggok = "Broggok",
+ Brokentoe = "Dedorroto",
+ Bronjahm = "Bronjahm",
+ ["Broodlord Lashlayer"] = "Señor de prole Capazote",
+ ["Bruegal Ironknuckle"] = "Bruegal Nudoferro",
+ Brutallus = "Brutallus",
+ ["Burning Felguard"] = "Guarda vil ardiente",
+ ["Buru the Gorger"] = "Buru el Manducador",
+ ["Cache of the Firelord"] = "Botín del Señor del Fuego",
+ -- ["Cache of the Legion"] = "",
+ ["Cannon Master Willey"] = "Cañonero Jefe Willey",
+ ["Captain Greenskin"] = "Capitán Verdepel",
+ ["Captain Kromcrush"] = "Capitán Kromcrush",
+ ["Captain Skarloc"] = "Capitán Skarloc",
+ ["Celebras the Cursed"] = "Celebras el Maldito",
+ ["Charlga Razorflank"] = "Charlga Filonavaja",
+ ["Chess Event"] = "Evento de ajedrez",
+ ["Chest of The Seven"] = "Tesoro de los Siete",
+ ["Chief Ukorz Sandscalp"] = "Jefe Ukorz Cabellarena",
+ ["Cho'Rush the Observer"] = "Cho'Rush el Observador",
+ Chromaggus = "Chromaggus",
+ ["Chrono Lord Deja"] = "Cronolord Deja",
+ ["Chrono-Lord Epoch"] = "Chrono-Lord Epoch",
+ Claw = "Zarpa",
+ ["Coilfang Elite"] = "Elite Colimillo Torcido",
+ ["Coilfang Strider"] = "Zancudo Colmillo Torcido",
+ ["Commander Kolurg"] = "Comandante Kolurg",
+ ["Commander Sarannis"] = "Comandante Sarannis",
+ ["Commander Springvale"] = "Comandante Vallefont",
+ ["Commander Stoutbeard"] = "Comandante Barbarrecia",
+ -- ["Commander Ulthok"] = "",
+ ["Constructor & Controller"] = "Constructor y Controlador",
+ Cookie = "El Chef",
+ ["Coren Direbrew"] = "Coren Cerveza Temible",
+ -- ["Corla, Herald of Twilight"] = "",
+ ["Cosmic Infuser"] = "Infusor cósmico",
+ ["Crimson Hammersmith"] = "Forjamartillos Carmesí",
+ ["Crowd Pummeler 9-60"] = "Gopleamasa 9-60",
+ ["Crystal Fang"] = "Colmillor de cristal",
+ ["C'Thun"] = "C'Thun",
+ Cyanigosa = "Cyanigosa",
+ ["Dalliah the Doomsayer"] = "Dalliah la Decidora del Destino",
+ ["Dalronn the Controller"] = "Dalronn el Controlador",
+ -- ["Dark Coffer"] = "",
+ ["Dark Iron Ambassador"] = "Embajador Hierro Negro",
+ ["Darkmaster Gandling"] = "Maestro oscuro Gandling",
+ ["Darkweaver Syth"] = "Tejeoscuro Syth",
+ ["Deathbound Ward"] = "Depositario vinculado a la muerte",
+ ["Deathbringer Saurfang"] = "Libramorte Colmillosauro",
+ ["Death Knight Darkreaver"] = "Caballero de la Muerte Atracoscuro",
+ ["Death Knight Understudy"] = "Suplente Caballero de la Muerte",
+ ["Deathspeaker High Priest"] = "Sumo sacerdote portavoz de la muerte",
+ ["Death Speaker Jargba"] = "Médium Jargba",
+ ["Deathstalker Visceri"] = "Mortacechador Visceri",
+ ["Deathsworn Captain"] = "Capitán Juramorte",
+ Devastation = "Devastación",
+ ["Deviate Faerie Dragon"] = "Dragón férico descarriado",
+ ["Devourer of Souls"] = "Devoradora de almas",
+ ["Dextren Ward"] = "Dextren Tutor",
+ ["Digmaster Shovelphlange"] = "Maestro de excavación Palatiro",
+ ["Doctor Theolen Krastinov"] = "Doctor Theolen Krastinov",
+ ["Doom Lord Kazzak"] = "Señor Apocalíptico Kazzak",
+ ["Doom'rel"] = "Doom'rel",
+ Doomwalker = "Caminante del Destino",
+ ["Dope'rel"] = "Dope'rel",
+ Dorothee = "Dorothea",
+ -- ["Drahga Shodowburner"] = "",
+ ["Drakkari Colossus"] = "Coloso Drakkari",
+ ["Drakos the Interrogator"] = "Drakos el interrogador",
+ Dreadscale = "Aterraescama",
+ Dreamscythe = "Guadañasueños",
+ ["Dust Covered Chest"] = "Cofre cubierto de polvo",
+ Dustwraith = "Ánima de polvo",
+ ["Eadric the Pure"] = "Eadric el Puro",
+ ["Earthcaller Halmgar"] = "Clamor de Tierra Halmgar",
+ Ebonroc = "Ebonroc",
+ ["Eck the Ferocious"] = "Eck the Ferocious",
+ ["Edwin VanCleef"] = "Edwin VanCleef",
+ ["Elder Brightleaf"] = "Ancestro Hojabrillante",
+ ["Elder Ironbranch"] = "Ancestro Hierrorrama",
+ ["Elder Nadox"] = "Ancestro Nadox",
+ ["Elder Stonebark"] = "Ancestro Cortezapiedra",
+ ["Electrocutioner 6000"] = "Electrocutor 6000",
+ ["Emalon the Storm Watcher"] = "Emalon el Vigía de la Tormenta",
+ Emeriss = "Emeriss",
+ ["Emperor Dagran Thaurissan"] = "Emperador Dagran Thaurissan",
+ ["Emperor Vek'lor"] = "Emperador Vek'lor",
+ ["Emperor Vek'nilash"] = "Emperador Vek'nilash",
+ Entropius = "Entropius",
+ ["Eonar's Gift"] = "Don de Eonar",
+ ["Epoch Hunter"] = "Cazador de eras",
+ Erekem = "Erekem",
+ ["Eressea Dawnsinger"] = "Eressea Cantoalba",
+ -- ["Eric \"The Swift\""] = "",
+ -- Erudax = "",
+ -- ["Erunak Stonespeaker"] = "",
+ ["Essence of Anger"] = "Esencia de Cólera",
+ ["Essence of Desire"] = "Esencia de Deseo",
+ ["Essence of Suffering"] = "Esencia de Sufrimiento",
+ Eviscerator = "Eviscerador",
+ ["Exarch Maladaar"] = "Exarca Maladaar",
+ ["Expedition Commander"] = "Comandante de expedición",
+ ["Eydis Darkbane"] = "Eydis Penaumbra",
+ ["Eye of C'Thun"] = "Ojo de C'Thun",
+ ["Faction Champions"] = "Campeones de la facción",
+ ["Fallen Champion"] = "Campeón caído",
+ Falric = "Falric",
+ ["Falric and Marwyn"] = "Falric y Marwyn",
+ ["Fankriss the Unyielding"] = "Fankriss el Implacable",
+ ["Fathom-Lord Karathress"] = "Señor de la profundidades Karathress",
+ Felmyst = "Brumavil",
+ ["Fenrus the Devourer"] = "Fenrus el Devorador",
+ ["Feral Defender"] = "Defensor feral",
+ Festergut = "Panzachancro",
+ Feugen = "Feugen",
+ ["Fineous Darkvire"] = "Finoso Virunegro",
+ Firemaw = "Faucefogo",
+ ["Fjola Lightbane"] = "Fjola Penívea",
+ Flamegor = "Flamagor",
+ ["Flame Leviathan"] = "Leviatán de llamas",
+ ["Foreman Thistlenettle"] = "Supervisor Cardortiga",
+ ["Forgemaster Garfrost"] = "Maestro de forja Gargelus",
+ -- ["Forgremaster Throngus"] = "",
+ ["Four Horsemen Chest"] = "Cofre de los Cuatro Jinetes",
+ ["Fras Siabi"] = "Fras Siabi",
+ Freya = "Freya",
+ ["Gahz'ranka"] = "Gahz'ranka",
+ ["Gahz'rilla"] = "Gahz'rilla",
+ ["Gal'darah"] = "Gal'darah",
+ ["Galgann Firehammer"] = "Galgann Flamartillo",
+ Garr = "Garr",
+ ["Garrosh Hellscream"] = "Garrosh Grito Infernal",
+ Gasher = "Gasher",
+ ["Gatewatcher Gyro-Kill"] = "Vígia de las puertas Giromata",
+ ["Gatewatcher Iron-Hand"] = "Vigía de las puertas Manoyerro",
+ ["Gathios the Shatterer"] = "Gathios the Shatterer",
+ Gehennas = "Gehennas",
+ Gelihast = "Gelihast",
+ Gelk = "Gelk",
+ ["General Angerforge"] = "General Forjira",
+ ["General Bjarngrim"] = "General Bjarngrim",
+ ["General Drakkisath"] = "General Drakkisath",
+ ["General Rajaxx"] = "General Rajaxx",
+ -- ["General Umbriss"] = "",
+ ["General Vezax"] = "General Vezax",
+ ["General Zarithrian"] = "General Zarithrian",
+ ["Ghamoo-ra"] = "Ghamoo-ra",
+ ["Ghaz'an"] = "Ghaz'an",
+ ["Ghok Bashguud"] = "Ghok Bashguud",
+ Gilnid = "Gilnid",
+ ["Gizrul the Slavener"] = "Gizrul el Esclavista",
+ ["Gloom'rel"] = "Gloom'rel",
+ Gluth = "Gluth",
+ Glutton = "Glotón",
+ ["Golemagg the Incinerator"] = "Golemagg el Incinerador",
+ ["Golem Lord Argelmach"] = "Señor Golem Argelmach",
+ ["Goraluk Anvilcrack"] = "Goraluk Yunquegrieta",
+ ["Gormok the Impaler"] = "Gormok el Empalador",
+ ["Gorosh the Dervish"] = "Gorosh el Endemoniado",
+ ["Gortok Palehoof"] = "Gortok Pezuña Pálida",
+ ["Gothik the Harvester"] = "Gothik el Cosechador",
+ ["Grand Astromancer Capernian"] = "Gran astromántica Capernian",
+ ["Grand Champions"] = "Grandes campeones",
+ -- ["Grand Crusader Dathrohan"] = "",
+ ["Grand Magus Telestra"] = "Gran maga Telestra",
+ ["Grandmaster Vorpil"] = "Maestro mayor Vorpil",
+ Grandmother = "Abuela",
+ ["Grand Warlock Alythess"] = "Bruja suprema Alythess",
+ ["Grand Warlock Nethekurse"] = "Brujo supremo Malbisal",
+ ["Grand Widow Faerlina"] = "Gran Viuda Faerlina",
+ ["Grethok the Controller"] = "Grethok el Controlador",
+ ["Gri'lek"] = "Gri'lek",
+ Grimlok = "Grimlok",
+ Grizzle = "\009Grisez",
+ Grobbulus = "Grobbulus",
+ Grubbis = "Grubbis",
+ ["Gruul the Dragonkiller"] = "Gruul el Asesino de Dragones",
+ ["Guard Fengus"] = "Guardia Fengus",
+ ["Guardian of Yogg-Saron"] = "Guardián de Yogg-Saron",
+ ["Guard Mol'dar"] = "Guardia Mol'dar",
+ ["Guard Slip'kik"] = "Guardia Slip'kik",
+ ["Gurtogg Bloodboil"] = "Gurtogg Sangre Hirviente",
+ Gyth = "Gyth",
+ Hadronox = "Hadronox",
+ Hakkar = "Hakkar",
+ Halazzi = "Halazzi",
+ Halion = "Halion",
+ Halycon = "Halycon",
+ Hamhock = "Hamhock",
+ ["Harbinger Skyriss"] = "Presagista Cieloriss",
+ ["Hate'rel"] = "Odio'rel",
+ ["Hazza'rah"] = "Hazza'rah",
+ Hazzas = "Hazzas",
+ ["Headless Horseman"] = "Cofre de los Cuatro Jinetes",
+ ["Hearthsinger Forresten"] = "Escupezones Foreste",
+ ["Hedrum the Creeper"] = "Hedrum el Trepador",
+ ["Heigan the Unclean"] = "Heigan el Impuro",
+ ["Hellfire Channeler"] = "Canalizador Fuego Infernal",
+ ["Henry Stern"] = "Henry Stern",
+ ["Herald Volazj"] = "Heraldo Volazj",
+ Herod = "Herod",
+ ["Hex Lord Malacrass"] = "Señor aojador Malacrass",
+ ["High Astromancer Solarian"] = "Gran astromántica Solarian",
+ ["High Botanist Freywinn"] = "Gran botánico Freywinn",
+ ["High Inquisitor Fairbanks"] = "Alto Inquisidor Ribalimpia",
+ ["High Inquisitor Whitemane"] = "Alta Inquisidora Melenablanca",
+ ["High Interrogator Gerstahn"] = "Alto Interrogador Gerstahn",
+ ["High King Maulgar"] = "Su majestad Maulgar",
+ ["Highlord Mograine"] = "Alto Señor Mograine",
+ ["Highlord Omokk"] = "Alto Señor Omokk",
+ ["High Marshal Whirlaxis"] = "High Marshal Whirlaxis",
+ ["High Nethermancer Zerevor"] = "High Nethermancer Zerevor",
+ ["High Overlord Saurfang"] = "Alto señor supremo Colmillosauro",
+ ["High Priestess Arlokk"] = "Suma Sacerdotisa Arlokk",
+ ["High Priestess Jeklik"] = "Suma Sacerdotisa Jeklik",
+ ["High Priestess Mar'li"] = "Suma Sacerdotisa Mar'li",
+ ["High Priestess of Thaurissan"] = "Alta Sacerdotisa de Thaurissan",
+ ["High Priest Thekal"] = "Sumo Sacerdote Thekal",
+ ["High Priest Venoxis"] = "Sumo Sacerdote Venoxis",
+ ["High Warlord Naj'entus"] = "Gran Señor de la Guerra Naj'entus",
+ Hodir = "Hodir",
+ ["Houndmaster Grebmar"] = "Maestro de canes Grebmar",
+ ["Houndmaster Loksey"] = "Maestro de canes Loksey",
+ Hukku = "Hukku",
+ Hungarfen = "Panthambre",
+ ["Hurley Blackbreath"] = "Hurley Negrálito",
+ ["Hyakiss the Lurker"] = "Hyakiss el Rondador",
+ ["Hydromancer Thespia"] = "Hidromántico Thespia",
+ ["Hydromancer Velratha"] = "Hidromántica Velratha",
+ Hydrospawn = "Hidromilecio",
+ ["Hydross the Unstable"] = "Hydross el Inestable",
+ ["Icecrown Gunship Battle"] = "Batalla aérea ",
+ Icehowl = "Aullahielo",
+ ["Ice Sphere"] = "Esfera de hielo",
+ Ichoron = "Icoron",
+ Ick = "Agh",
+ ["Ignis the Furnace Master"] = "Ignis el Maestro de la Caldera",
+ ["Illidan Stormrage"] = "Illidan Tempestira",
+ ["Illidari Council"] = "Concilio Illidari",
+ ["Illyanna Ravenoak"] = "Illyanna Roblecuervo",
+ ["Immol'thar"] = "Immol'thar",
+ ["Infinite Corruptor"] = "Corruptor Infinito",
+ ["Infinity Blades"] = "Hojas de infinidad",
+ ["Ingvar the Plunderer"] = "Ingvar the Plunderer",
+ ["Instructor Malicia"] = "Instructor Malicia",
+ ["Instructor Razuvious"] = "Instructor Razuvious",
+ ["Interrogator Vishas"] = "Interrogador Vishas",
+ Ionar = "Ionar",
+ Ironaya = "Hierraya",
+ Ironspine = "Dorsacerado",
+ Isalien = "Isalien",
+ Jade = "Jade",
+ ["Jammal'an the Prophet"] = "Jammal'an el Profeta",
+ ["Jan'alai"] = "Jan'alai",
+ ["Jandice Barov"] = "Jandice Barov",
+ ["Jedoga Shadowseeker"] = "Jedoga Buscasombras",
+ ["Jed Runewatcher"] = "Jed vigía de las runas",
+ ["Jergosh the Invoker"] = "Jergosh el Convocador",
+ ["Jin'do the Hexxer"] = "Jin'do el Aojador",
+ ["Jormungar Behemoth"] = "Behemoth Jormungar",
+ Jormungars = "jormungar",
+ Julianne = "Julianne",
+ ["Junk Bot"] = "Chatarrobot",
+ ["Kael'thas Sunstrider"] = "Kael'thas Caminante del Sol",
+ Kalecgos = "Kalecgos",
+ ["Kam Deepfury"] = "Kam Furiahonda",
+ -- ["Karsh Steelbender"] = "",
+ ["Kazkaz the Unholy"] = "Kazkaz el Blasfemo",
+ ["Kaz'rogal"] = "Kaz'rogal",
+ ["Keli'dan the Breaker"] = "Keli'dan el Ultrajador",
+ ["Kel'Thuzad"] = "Kel'Thuzad",
+ Keristrasza = "Keristrasza",
+ ["Kiggler the Crazed"] = "Kiggler el Enloquecido",
+ ["Kil'jaeden"] = "Kil'jaeden",
+ ["Kil'rek"] = "Kil'rek",
+ ["King Dred"] = "Rey Dred",
+ ["King Gordok"] = "Rey Gordok",
+ ["King Llane Piece"] = "Rey Llane",
+ ["King Ymiron"] = "Rey Ymiron",
+ ["Kirtonos the Herald"] = "Kirtonos el Heraldo",
+ ["Knot Thimblejack's Cache"] = "Carretilla de Knot Llavededo",
+ Kolk = "Kolk",
+ Kologarn = "Kologarn",
+ ["Koralon the Flame Watcher"] = "Koralon el Vigía de las llamas",
+ Kormok = "Kormok",
+ Kresh = "Kresh",
+ Krick = "Puagh",
+ ["Krick and Ick"] = "Agh y Puagh",
+ ["Krik'thir the Gatewatcher"] = "Krik’thir el vígia de las puertas",
+ ["Krosh Firehand"] = "Krosh Manofuego",
+ Krystallus = "Krystallus",
+ Kurinnaxx = "Kurinnaxx",
+ ["Lady Anacondra"] = "Lady Anacondra",
+ ["Lady Blaumeux"] = "Lady Blaumeux",
+ ["Lady Deathwhisper"] = "Lady Susurramuerte",
+ ["Lady Illucia Barov"] = "Lady Illucia Barov",
+ ["Lady Malande"] = "Lady Malande",
+ -- ["Lady Naz'jar"] = "",
+ ["Lady Sacrolash"] = "Lady Sacrolash",
+ ["Lady Sarevess"] = "Lady Sarevess",
+ ["Lady Vashj"] = "Lady Vashj",
+ Laj = "Laj",
+ Landslide = "Derrumblo",
+ Lavanthor = "Lavanthor",
+ ["Left Arm"] = "Brazo izquierdo",
+ ["Leotheras the Blind"] = "Leotheras el Ciego",
+ Lethon = "Lethon",
+ Lethtendris = "Lethtendris",
+ ["Leviathan Mk II"] = "Mk II de leviatán",
+ ["Ley-Guardian Eregos"] = "Guardian-Ley Eregos",
+ ["Lieutenant Drake"] = "Teniente Draco",
+ ["Lieutenant General Andorov"] = "Teniente General Andorov",
+ Loatheb = "Loatheb",
+ Loken = "Loken",
+ ["Lord Alexei Barov"] = "Lord Alexei Barov",
+ ["Lord Cobrahn"] = "Lord Cobrahn",
+ ["Lord Hel'nurath"] = "Lord Hel'nurath",
+ ["Lord Incendius"] = "Lord Incendius",
+ ["Lord Jaraxxus"] = "Lord Jaraxxus",
+ ["Lord Kazzak"] = "Lord Kazzak",
+ ["Lord Kri"] = "Lord Kri",
+ ["Lord Marrowgar"] = "Lord Tuétano",
+ ["Lord Pythas"] = "Lord Pythas",
+ ["Lord Roccor"] = "Lord Roccor",
+ ["Lord Sanguinar"] = "Lord Sanguinar",
+ ["Lord Serpentis"] = "Lord Serpentis",
+ ["Lord Skwol"] = "Lord Skwol",
+ ["Lord Valthalak"] = "Lord Valthalak",
+ ["Lord Victor Nefarius"] = "Lord Víctor Nefarius",
+ ["Lord Vyletongue"] = "Lord Lenguavil",
+ ["Lorekeeper Polkelt"] = "Tradicionalista Polkelt",
+ -- ["Lorgus Jett"] = "",
+ Loro = "Loro",
+ Lucifron = "Lucifron",
+ ["Mad Magglish"] = "Magglish el Loco",
+ Maexxna = "Maexxna",
+ ["Mage-Lord Urom"] = "Señor de la Magia Urom",
+ ["Magister Kalendris"] = "Magister Kalendris",
+ ["Magistrate Barthilas"] = "Magistrado Barthilas",
+ Magmadar = "Magmadar",
+ Magmus = "Magmus",
+ Magra = "Magra",
+ Magtheridon = "Magtheridon",
+ ["Maiden of Grief"] = "Doncella de Pena",
+ ["Maiden of Virtue"] = "Doncella de Virtud",
+ ["Majordomo Executus"] = "Mayordomo Executus",
+ Malacrass = "Malacrass",
+ ["Maleki the Pallid"] = "Maleki el Pálido",
+ ["Mal'Ganis"] = "Mal'Ganis",
+ Malygos = "Malygos",
+ Maraudos = "Maraudos",
+ ["Marduk Blackpool"] = "Marduz Pozonegro",
+ ["Marisa du'Paige"] = "Marisa du'Paige",
+ Marwyn = "Marwyn",
+ ["Master Engineer Telonicus"] = "Maestro Ingeriero Telonicus",
+ ["Maur Grimtotem"] = "Maur Tótem Siniestro",
+ Meathook = "Meathook",
+ ["Mechano-Lord Capacitus"] = "Lord-mecano Capacitus",
+ Medivh = "Medivh",
+ ["Mekgineer Steamrigger"] = "Mekigeniero Vaporino",
+ ["Mekgineer Thermaplugg"] = "Mekigeniero Termochufe",
+ ["Mennu the Betrayer"] = "Mennu el Traidor",
+ ["Meshlok the Harvester"] = "Meshlok el Cosechador",
+ Midnight = "Medianoche",
+ Mijan = "Mijar",
+ Mimiron = "Mimiron",
+ ["Miner Johnson"] = "Minero Johnson",
+ ["Mistress of Pain"] = "Maestra de dolor",
+ Moam = "Moam",
+ Mogor = "Mogor",
+ ["Mokra the Skullcrusher"] = "Mokra el Trituracráneos",
+ Moorabi = "Moorabi",
+ Moragg = "Moragg",
+ ["Mordresh Fire Eye"] = "Mordresh Ojo de Fuego",
+ ["Mor Grayhoof"] = "Mor Grayhoof",
+ Moroes = "Moroes",
+ ["Morogrim Tidewalker"] = "Morogrim Levantamareas",
+ Morphaz = "Morphaz",
+ ["Mother Shahraz"] = "Madre Shahraz",
+ ["Mother Smolderweb"] = "Madre Telabrasada",
+ ["Mr. Smite"] = "Sr. Golpin",
+ ["Muradin Bronzebeard"] = "Muradin Barbabronce",
+ ["Murkblood Twin"] = "Gemelo Sangreoscura",
+ ["Murkblood Twins"] = "Gemelos Sangreoscura",
+ Murmur = "Murmur",
+ ["Murta Grimgut"] = "Murta Tripuriosa",
+ ["M'uru"] = "M'uru",
+ Mushgog = "Mushgog",
+ ["Mutanus the Devourer"] = "Mutanus el Devorador",
+ Nalorakk = "Nalorakk",
+ Nazan = "Nazan",
+ Nefarian = "Nefarian",
+ ["Nekrum Gutchewer"] = "Nekrum Cometripas",
+ ["Nerub'enkan"] = "Nerub'enkan",
+ ["Nethermancer Sepethrea"] = "Abisálico Sepethrea",
+ Netherspite = "Rencor abisal",
+ ["Netherstrand Longbow"] = "Arco largo de fibra abisal",
+ ["Nexus-Prince Shaffar"] = "Príncipe-nexo Shaffar",
+ Nightbane = "Nocturno",
+ ["Noth the Plaguebringer"] = "Noth el Pesteador",
+ ["Novos the Summoner"] = "Novos el Invocador",
+ Noxxion = "Noxxion",
+ ["Obsidian Sentinel"] = "Centinela Obsidiano",
+ ["Odo the Blindwatcher"] = "Odo el vigía ciego",
+ -- Oggleflint = "",
+ ["Ogom the Wretched"] = "Ogom el Desdichado",
+ -- Ohgan = "",
+ ["Ok'thor the Breaker"] = "Ok'thor el Rompedor",
+ -- Olaf = "",
+ ["Old Serra'kis"] = "Viejo Serra'kis",
+ ["Olm the Summoner"] = "Olm el Invocador",
+ ["Omor the Unscarred"] = "Omor el Sinmarcas",
+ Onyxia = "Onyxia",
+ -- ["Opera Event"] = "",
+ ["Orgrim's Hammer"] = "Martillo de Orgrim",
+ ["Ormorok the Tree-Shaper"] = "Ormorok el cortador de árboles",
+ ["Oro Eyegouge"] = "Oro Bocojo ",
+ ["Ossirian the Unscarred"] = "Osirio el Sinmarcas",
+ Ouro = "Ouro",
+ ["Overlord Ramtusk"] = "Señor Supremo Colmicarnero",
+ ["Overlord Wyrmthalak"] = "Señor Supremo Vermiothalak",
+ ["Overmaster Pyron"] = "Gran maestro Pyron",
+ ["Overseer Tidewrath"] = "Avizor Aleta de Cólera",
+ -- Ozumat = "",
+ Pandemonius = "Pandemonius",
+ ["Panzor the Invincible"] = "Panzor el Invencible",
+ Patchwerk = "Remendejo",
+ ["Pathaleon the Calculator"] = "Panthaleon el Calculador",
+ Phalanx = "Falange",
+ ["Phaseshift Bulwark"] = "Baluarte de cambio de fase",
+ Pimgib = "Pimgib",
+ ["Plaguemaw the Rotting"] = "Fauzpeste el Putrefacto",
+ ["Plugger Spazzring"] = "Plugger Aropatoso",
+ ["Postmaster Malown"] = "Jefe de correos Malown",
+ ["Priestess Delrissa"] = "Sacerdotisa Delrissa",
+ ["Prince Keleseth"] = "Príncipe Keleseth",
+ ["Prince Malchezaar"] = "Príncipe Malchezaar",
+ ["Prince Skaldrenox"] = "Príncipe Skaldrenox",
+ ["Princess Huhuran"] = "Princesa Huhuran",
+ ["Princess Moira Bronzebeard"] = "Princesa Moira Barbabronce",
+ ["Princess Tempestria"] = "Princesa Tempestria",
+ ["Princess Theradras"] = "Princesa Theradras",
+ ["Princess Yauj"] = "Princesa Yauj",
+ ["Prince Taldaram"] = "Príncipe Taldaram",
+ ["Prince Tenris Mirkblood"] = "Príncipe Tenris Sangre Penumbra",
+ ["Prince Tortheldrin"] = "Príncipe Tortheldrin",
+ ["Prince Valanar"] = "Príncipe Valanar",
+ ["Professor Putricide"] = "Profesor Putricidio",
+ ["Pure Spawn of Hydross"] = "Engendro puro de Hydross",
+ Pusillin = "Pusillín",
+ ["Pyroguard Emberseer"] = "Piroguardián Brasadivino",
+ ["Pyromancer Loregrain"] = "Piromántico Cultugrano",
+ Quagmirran = "Quagmirran",
+ ["Quartermaster Zigris"] = "Intendente Zigris",
+ ["Rage Winterchill"] = "Ira Fríoinvierno",
+ Ragglesnout = "Morrandrajos",
+ ["Raging Spirit"] = "Espíritu enfurecido",
+ Ragnaros = "Ragnaros",
+ ["Ramstein the Gorger"] = "Ramstein el Empachador",
+ ["Ras Frostwhisper"] = "Ras Levescarcha",
+ Rattlegore = "Traquesangre",
+ ["Razorclaw the Butcher"] = "Zarpador el Carnicero",
+ ["Razorgore the Untamed"] = "Sangrevaja el Indomable",
+ Razorlash = "Lativaja",
+ Razorscale = "Tajoescama",
+ ["Reliquary of Souls"] = "Relicario de Almas",
+ Renataki = "Renataki",
+ ["Restless Skeleton"] = "Esqueleto inquieto",
+ Rethilgore = "Rethilgore",
+ Revelosh = "Revelosh",
+ ["Rhahk'Zor"] = "Rhahk'Zor",
+ ["Ribbly Screwspigot"] = "Ribbly Llavenrosca",
+ ["Right Arm"] = "Brazo derecho",
+ -- ["Ring of Law"] = "",
+ Roar = "Rugido",
+ ["Rokad the Ravager"] = "Rokad el Devastador",
+ ["Rokdar the Sundered Lord"] = "Rokdar el Señor Hendido",
+ ["Rokmar the Crackler"] = "Rokmar el Crujidor",
+ -- ["Rom'ogg Bonecrusher"] = "",
+ Romulo = "Romulo",
+ ["Romulo & Julianne"] = "Romeo y Julieta",
+ -- Roogug = "",
+ Rotface = "Carapútrea",
+ Rotgrip = "Escamapodrida",
+ ["Runemaster Molgeim"] = "Maestro de runas Molgeim",
+ ["Runok Wildmane"] = "Runok Ferocrín",
+ Ruuzlu = "Ruuzlu",
+ ["Salramm the Fleshcrafter"] = "Salramm el Modelador de carne",
+ ["Sanctum Sentry"] = "Centinela del sagrario",
+ ["Sandarr Dunereaver"] = "Sandarr Asaltadunas",
+ ["Sandfury Executioner"] = "Ejecutor Furiarena",
+ Sapphiron = "Sapphiron",
+ Sara = "Sara",
+ ["Saronite Animus"] = "Animus de saronita",
+ Sartharion = "Sartharion",
+ ["Sathrovarr the Corruptor"] = "Sathrovarr el Corruptor",
+ ["Saviana Ragefire"] = "Saviana Furia Ardiente",
+ ["Scarlet Commander Mograine"] = "Comandante Escarlata Mograine",
+ ["Scourgelord Tyrannus"] = "Señor de la Plaga Tyrannus",
+ ["Seeth'rel"] = "Seeth'rel",
+ ["Selin Fireheart"] = "Selin Corazón de Fuego",
+ ["Sergeant Bly"] = "Sargento Bly",
+ ["Shade of Akama"] = "Sombra de Akama",
+ ["Shade of Aran"] = "Sombra de Aran",
+ ["Shade of Eranikus"] = "Sombra de Eranikus",
+ ["Shadikith the Glider"] = "Shadikith the Glider",
+ ["Shadow Hunter Vosh'gajin"] = "Cazador de las Sombras Vosh'gajin",
+ ["Shadow of Leotheras"] = "Sombra de Leotheras",
+ ["Shadowpriest Sezz'ziz"] = "Sacerdote oscuro Sezz'ziz",
+ Shadron = "Shadron",
+ Shazzrah = "Shazzrah",
+ ["Shirrak the Dead Watcher"] = "Shirrak el Vigía de los Muertos",
+ Sindragosa = "Sindragosa",
+ ["Sir Zeliek"] = "Sir Zeliek",
+ ["Sjonnir The Ironshaper"] = "Sjonnir el afilador",
+ ["Skadi the Ruthless"] = "Skadi el Despiadado",
+ ["Skarr the Unbreakable"] = "Skarr el Inquebrantable",
+ ["Skarvald the Constructor"] = "Skarvald el Constructor",
+ ["Skra'gath"] = "Skra'gath",
+ Skul = "Skul",
+ Skum = "Skum",
+ ["Slad'ran"] = "Slad'ran",
+ Sneed = "Sneed",
+ ["Sneed's Shredder"] = "Machacador de Sneed",
+ ["Solakar Flamewreath"] = "Solakar Corona de Fuego",
+ ["Solarium Agent"] = "Agente Solarium",
+ ["Solarium Priest"] = "Sacerdote Solarium",
+ ["Spirestone Battle Lord"] = "Señor de batalla Cumbrerroca",
+ ["Spirestone Butcher"] = "Carnicero Cumbrerroca",
+ ["Spirestone Lord Magus"] = "Señor Magus Cumbrerroca",
+ ["Staff of Disintegration"] = "Bastón de desintegración",
+ Stalagg = "Stalagg",
+ Steelbreaker = "Rompeacero",
+ ["Stomper Kreeg"] = "Vapuleador Kreeg",
+ Stonespine = "Pidrespina",
+ ["Stormcaller Brundir"] = "Clamatormentas Brundir",
+ Strawman = "Espantapájaros",
+ ["Sulfuron Harbinger"] = "Sulfuron Presagista",
+ Supremus = "Supremus",
+ ["Svala Sorrowgrave"] = "Svala Tumbapena",
+ ["Swamplord Musel'ek"] = "Señor del pantano Musel'ek",
+ Taerar = "Taerar",
+ ["Tainted Spawn of Hydross"] = "Engendro de Hydross corrupto",
+ ["Talon King Ikiss"] = "Rey Garra Ikiss",
+ ["Taragaman the Hungerer"] = "Taragaman el Hambriento",
+ ["Targorr the Dread"] = "Targor el Pavoroso",
+ Tavarok = "Tavarok",
+ Techbot = "Tecnobot",
+ Temporus = "Temporus",
+ ["Tendris Warpwood"] = "Tendris Madeguerra",
+ Tenebron = "Tenebron",
+ ["Terestian Illhoof"] = "Terestian Pezuña Enferma",
+ ["Teron Gorefiend"] = "Teron Sanguino",
+ Thaddius = "Thaddius",
+ ["Thaladred the Darkener"] = "Thaladred el Oscurecedor",
+ ["Thane Korth'azz"] = "Thane Korth'azz",
+ ["The Beast"] = "La Bestia",
+ ["The Beasts of Northrend"] = "Las bestias de Rasganorte",
+ ["The Big Bad Wolf"] = "El Gran Lobo Malvado",
+ ["The Black Knight"] = "El Caballero Negro",
+ ["The Black Stalker"] = "La acechadora negra",
+ ["The Blue Brothers"] = "Los Hermanos Azules",
+ ["The Bug Family"] = "La Familia Insecto",
+ ["The Crone"] = "La Vieja Bruja",
+ ["The Curator"] = "Curator",
+ ["The Eredar Twins"] = "Los Gemelos Eredar",
+ ["The Four Horsemen"] = "Los Cuatro Jinetes",
+ ["The Illidari Council"] = "El concilio Illidari",
+ ["The Iron Council"] = "La Asamblea de Hierro",
+ ["Theka the Martyr"] = "Theka la Mártir",
+ ["The Lich King"] = "El Rey Exánime",
+ -- ["The Lost Dwarves"] = "",
+ ["The Lurker Below"] = "El Rondador de abajo",
+ ["The Maker"] = "El Hacedor",
+ ["The Prophet Skeram"] = "El profeta Skeram",
+ ["The Prophet Tharon'ja"] = "El Profeta Tharon'ja",
+ ["The Ravenian"] = "El Devorador",
+ ["The Razza"] = "El Razza",
+ ["The Seven Dwarves"] = "Los Siete Enanitos",
+ ["The Skybreaker"] = "El Rompecielos",
+ ["The Tribunal of Ages"] = "Cofre del Tribunal",
+ ["The Twin Emperors"] = "Los Emperadores Gemelos",
+ ["The Twin Val'kyr"] = "Gemelas Val'kyr",
+ ["The Unforgiven"] = "El Imperdonable",
+ ["The Windreaver"] = "El Atracavientos",
+ Thorim = "Thorim",
+ ["Thorngrin the Tender"] = "Thorngrin el Tierno",
+ ["Tidewalker Lurker"] = "Rondador Levantamareas",
+ ["Timmy the Cruel"] = "Timmy el Cruel",
+ Tinhead = "Cabezalata",
+ ["Tinkerer Gizlock"] = "Manitas Gizlock",
+ ["Tirion Fordring"] = "Tirion Vadín",
+ Tito = "Tito",
+ ["Toravon the Ice Watcher"] = "Toravon el Vigía de Hielo",
+ ["Trigore the Lasher"] = "Trigore el Azotador",
+ Trollgore = "Cuernotroll",
+ ["Tsu'zee"] = "Tsu'zee",
+ ["Tuten'kash"] = "Tuten'kash",
+ ["Twilight Lord Kelris"] = "Señor Crepuscular Kelris",
+ ["Urok Doomhowl"] = "Urok Aullapocalipsis",
+ ["Vaelastrasz the Corrupt"] = "Vaelastrasz el Corrupto",
+ ["Valithria Dreamwalker"] = "Valithria Caminasueños",
+ ["Val'kyr Shadowguard"] = "Guardia de las Sombras Val'kyr",
+ ["Varian Wrynn"] = "Varian Wrynn",
+ ["Varos Cloudstrider"] = "Varos Cloudstrider",
+ Vazruden = "Vazruden",
+ ["Vazruden the Herald"] = "Vazruden el Heraldo",
+ Vectus = "Vectus",
+ Vem = "Vem",
+ Veng = "Veng",
+ ["Veras Darkshadow"] = "Veras Darkshadow",
+ ["Verdan the Everliving"] = "Verdan el Eterno",
+ Verek = "Verek",
+ Vesperon = "Vesperon",
+ Vexallus = "Vexallus",
+ ["Veyzhak the Cannibal"] = "Veyzhak el Caníbal",
+ ["Vile'rel"] = "Vil'rel",
+ Viscidus = "Viscidus",
+ ["Viscous Fallout"] = "Radiactivo viscoso",
+ ["Void Reaver"] = "Atracador del vacío",
+ Volkhan = "Volkhan",
+ ["VX-001"] = "VX-001",
+ ["Warbringer O'mrogg"] = "Belisario O'mrogg",
+ ["Warchief Blackhand Piece"] = "Jefe de Guerra Mano Negra",
+ ["Warchief Kargath Bladefist"] = "Jefe de Guerra Kargath Garrafilada",
+ ["Warchief Rend Blackhand"] = "Jefe de Guerra Desgarro Puño Negro",
+ ["Warden Mellichar"] = "Celador Mellichar",
+ ["Warder Stilgiss"] = "Guarda Stilgiss",
+ ["Warlord Kalithresh"] = "Señor de la Guerra Kalithresh",
+ ["War Master Voone"] = "Maestro de guerra Voone",
+ ["Warmaul Champion"] = "Campeón Mazo de Guerra",
+ ["Warp Slicer"] = "Cercenadora de distorsión",
+ ["Warp Splinter"] = "Disidente de distorsión",
+ ["Watchkeeper Gargolmar"] = "Guardián vigía Gargolmar",
+ Weaver = "Sastrón",
+ ["Witch Doctor Zum'rah"] = "Médico brujo Zum'rah",
+ ["Wolf Master Nandos"] = "Maestro de lobos Nandos",
+ ["Wrath-Scryer Soccothrates"] = "Arúspice de cólera Soccothrates",
+ Wushoolay = "Wushoolay",
+ Xevozz = "Xevozz",
+ ["XT-002 Deconstructor"] = "Desarmador XA-002",
+ ["Yogg-Saron"] = "Yogg-Saron",
+ -- Yor = "",
+ Ysondre = "Ysondre",
+ Zekkis = "Zekkis",
+ ["Zelemar the Wrathful"] = "Zelemar el Colérico",
+ ["Zereketh the Unbound"] = "Zereketh el Desatado",
+ Zerillis = "Zerillis",
+ ["Zevrim Thornhoof"] = "Zevrim Pezuñahendida",
+ Zolo = "Zolo",
+ ["Zul'Farrak Dead Hero"] = "Héroe muerto Zul'Farrak",
+ ["Zul'jin"] = "Zul'jin",
+ ["Zul'Lor"] = "Zul'Lor",
+ ["Zul'tore"] = "Zul'tore",
+ ["Zuramat the Obliterator"] = "Zuramat el Obliterador",
+}
+elseif GAME_LOCALE == "esMX" then
+ lib:SetCurrentTranslations {
+ Acidmaw = "Fauceácida",
+ Aeonus = "Aeonus",
+ ["Aerial Command Unit"] = "Unidad de mando aérea",
+ ["Agathelos the Raging"] = "Agathelos el Furioso",
+ -- ["Aggem Thorncurse"] = "",
+ Ahune = "Ahune",
+ ["Akil'zon"] = "Akil'zon",
+ ["Aku'mai"] = "Aku'mai",
+ ["Al'ar"] = "Al'ar",
+ ["Algalon the Observer"] = "Algalon el Observador",
+ ["Alzzin the Wildshaper"] = "Alzzin el Formaferal",
+ Amanitar = "Amanitar",
+ ["Ambassador Flamelash"] = "Embajador Latifuego",
+ ["Ambassador Hellmaw"] = "Embajador Faucinferno",
+ ["Amnennar the Coldbringer"] = "Amnennar el Gélido",
+ ["Ancient Stone Keeper"] = "Vigilante pétreo anciano",
+ Anetheron = "Anetheron",
+ ["Anger'rel"] = "Anger'rel",
+ Anomalus = "Anomalus",
+ ["Antu'sul"] = "Antu'sul",
+ ["Anub'arak"] = "Anub'arak",
+ ["Anubisath Defender"] = "Defensor Anubisath",
+ ["Anubisath Guardian"] = "Guardián Anubisath",
+ ["Anub'Rekhan"] = "Anub'Rekhan",
+ ["Anub'shiah"] = "Anub'shiah",
+ Anzu = "Anzu",
+ ["Arcane Watchman"] = "Vigilante Arcano",
+ ["Arcanist Doan"] = "Arcanista Doan",
+ Archaedas = "Archaedas",
+ ["Archavon the Stone Watcher"] = "Archavon el vigía de piedra",
+ Archimonde = "Archimonde",
+ ["Archivist Galford"] = "Archivista Galford",
+ ["Archmage Arugal"] = "Archimago Arugal",
+ ["Argent Confessor Paletress"] = "confesora Argenta Cabelloclaro",
+ ["Arugal's Voidwalker"] = "Abisario de Arugal",
+ -- ["Ascendant Lord Obsidius"] = "",
+ ["Assault Bot"] = "Robot de asalto",
+ -- ["Assembly of Iron"] = "",
+ ["Atal'alarion"] = "Atal'alarion",
+ ["Attumen the Huntsman"] = "Attumen el Montero",
+ Auriaya = "Auriaya",
+ Avalanchion = "Avalanchion",
+ ["Avatar of Hakkar"] = "Avatar de Hakkar",
+ ["Ayamiss the Hunter"] = "Ayamiss el Cazador",
+ Azgalor = "Azgalor",
+ ["Azshir the Sleepless"] = "Azshir el Insomne",
+ Azuregos = "Azuregos",
+ ["Bael'Gar"] = "Bael'Gar",
+ Baelog = "Baelog",
+ Balnazzar = "Balnazzar",
+ -- ["Baltharus the Warborn"] = "",
+ ["Bannok Grimaxe"] = "Bannok Hachamacabra",
+ ["Baron Aquanis"] = "Barón Aquanis",
+ ["Baron Charr"] = "Barón Charr",
+ ["Baroness Anastari"] = "Baronesa Anastari",
+ ["Baron Geddon"] = "Barón Geddon",
+ ["Baron Kazum"] = "Barón Kazum",
+ ["Baron Rivendare"] = "Barón Osahendido",
+ ["Baron Silverlaine"] = "Barón Filargenta",
+ ["Battleguard Sartura"] = "Guardia de batalla Sartura",
+ ["Bazil Thredd"] = "Bazil Thredd",
+ Bazzalan = "Bazzalan",
+ -- Beauty = "",
+ ["Black Guard Swordsmith"] = "Armero Guardia Negra",
+ ["Blackheart the Inciter"] = "Negrozón el Incitador",
+ ["Blindeye the Seer"] = "Ciego el Vidente",
+ ["Blind Hunter"] = "Cazador ciego",
+ ["Blood Guard Porung"] = "Guardia de sangre Porung",
+ ["Bloodlord Mandokir"] = "Señor sangriento Mandokir",
+ ["Bloodmage Thalnos"] = "Mago sangriento Thalnos",
+ ["Blood Prince Council"] = "Consejo de Príncipes de Sangre",
+ ["Blood Princes"] = "Príncipes de Sangre",
+ ["Blood-Queen Lana'thel"] = "Reina de Sangre Lana'thel",
+ ["Blood Steward of Kirtonos"] = "Administrador de sangre de Kirtonos",
+ Boahn = "Boahn",
+ ["Bomb Bot"] = "Robot bum",
+ ["Brain of Yogg-Saron"] = "Cerebro de Yogg-Saron",
+ ["Brainwashed Noble"] = "Noble aducido",
+ Broggok = "Broggok",
+ Brokentoe = "Dedorroto",
+ Bronjahm = "Bronjahm",
+ ["Broodlord Lashlayer"] = "Señor de prole Capazote",
+ ["Bruegal Ironknuckle"] = "Bruegal Nudoferro",
+ Brutallus = "Brutallus",
+ ["Burning Felguard"] = "Guarda vil ardiente",
+ ["Buru the Gorger"] = "Buru el Manducador",
+ ["Cache of the Firelord"] = "Botín del Señor del Fuego",
+ -- ["Cache of the Legion"] = "",
+ ["Cannon Master Willey"] = "Cañonero Jefe Willey",
+ ["Captain Greenskin"] = "Capitán Verdepel",
+ ["Captain Kromcrush"] = "Capitán Kromcrush",
+ ["Captain Skarloc"] = "Capitán Skarloc",
+ ["Celebras the Cursed"] = "Celebras el Maldito",
+ ["Charlga Razorflank"] = "Charlga Filonavaja",
+ ["Chess Event"] = "Evento de ajedrez",
+ ["Chest of The Seven"] = "Tesoro de los Siete",
+ ["Chief Ukorz Sandscalp"] = "Jefe Ukorz Cabellarena",
+ ["Cho'Rush the Observer"] = "Cho'Rush el Observador",
+ Chromaggus = "Chromaggus",
+ ["Chrono Lord Deja"] = "Cronolord Deja",
+ ["Chrono-Lord Epoch"] = "Cronolord Época",
+ Claw = "Zarpa",
+ ["Coilfang Elite"] = "Elite Colimillo Torcido",
+ ["Coilfang Strider"] = "Zancudo Colmillo Torcido",
+ ["Commander Kolurg"] = "Comandante Kolurg",
+ ["Commander Sarannis"] = "Comandante Sarannis",
+ ["Commander Springvale"] = "Comandante Vallefont",
+ ["Commander Stoutbeard"] = "Comandante Barbarrecia",
+ -- ["Commander Ulthok"] = "",
+ ["Constructor & Controller"] = "Constructor & Controlador",
+ Cookie = "El Chef",
+ ["Coren Direbrew"] = "Coren Cerveza Temible",
+ -- ["Corla, Herald of Twilight"] = "",
+ ["Cosmic Infuser"] = "Infusor cósmico",
+ ["Crimson Hammersmith"] = "Forjamartillos Carmesí",
+ ["Crowd Pummeler 9-60"] = "Gopleamasa 9-60",
+ ["Crystal Fang"] = "Colmillor de cristal",
+ ["C'Thun"] = "C'Thun",
+ Cyanigosa = "Cyanigosa",
+ ["Dalliah the Doomsayer"] = "Dalliah la Decidora del Destino",
+ ["Dalronn the Controller"] = "Dalronn el Controlador",
+ -- ["Dark Coffer"] = "",
+ ["Dark Iron Ambassador"] = "Embajador Hierro Negro",
+ ["Darkmaster Gandling"] = "Maestro oscuro Gandling",
+ ["Darkweaver Syth"] = "Tejeoscuro Syth",
+ ["Deathbound Ward"] = "Depositario vinculado a la muerte",
+ ["Deathbringer Saurfang"] = "Libramorte Colmillosauro",
+ ["Death Knight Darkreaver"] = "Caballero de la Muerte Atracoscuro",
+ ["Death Knight Understudy"] = "Suplente Caballero de la Muerte",
+ ["Deathspeaker High Priest"] = "Sumo sacerdote portavoz de la muerte",
+ ["Death Speaker Jargba"] = "Médium Jargba",
+ ["Deathstalker Visceri"] = "Mortacechador Visceri",
+ ["Deathsworn Captain"] = "Capitán Juramorte",
+ Devastation = "Devastación",
+ ["Deviate Faerie Dragon"] = "Dragón férico descarriado",
+ ["Devourer of Souls"] = "Devorador de Almas",
+ ["Dextren Ward"] = "Dextren Tutor",
+ ["Digmaster Shovelphlange"] = "Maestro de excavación Palatiro",
+ ["Doctor Theolen Krastinov"] = "Doctor Theolen Krastinov",
+ ["Doom Lord Kazzak"] = "Señor Apocalíptico Kazzak",
+ ["Doom'rel"] = "Doom'rel",
+ Doomwalker = "Caminante del Destino",
+ ["Dope'rel"] = "Dope'rel",
+ Dorothee = "Dorothea",
+ -- ["Drahga Shodowburner"] = "",
+ ["Drakkari Colossus"] = "Coloso Drakkari",
+ ["Drakos the Interrogator"] = "Drakos el Interrogador",
+ Dreadscale = "Aterraescama",
+ Dreamscythe = "Guadañasueños",
+ ["Dust Covered Chest"] = "Cofre cubierto de polvo",
+ Dustwraith = "Ánima de polvo",
+ ["Eadric the Pure"] = "Eadric el Puro",
+ ["Earthcaller Halmgar"] = "Clamor de Tierra Halmgar",
+ Ebonroc = "Ebonroc",
+ ["Eck the Ferocious"] = "Eck el Feroz",
+ ["Edwin VanCleef"] = "Edwin VanCleef",
+ ["Elder Brightleaf"] = "Ancestro Hojabrillante",
+ ["Elder Ironbranch"] = "Ancestro Hierrorrama",
+ ["Elder Nadox"] = "Ancestro Nadox",
+ ["Elder Stonebark"] = "Ancestro Cortezapiedra",
+ ["Electrocutioner 6000"] = "Electrocutor 6000",
+ ["Emalon the Storm Watcher"] = "Emalon e Viagía de la Tormenta",
+ Emeriss = "Emeriss",
+ ["Emperor Dagran Thaurissan"] = "Emperador Dagran Thaurissan",
+ ["Emperor Vek'lor"] = "Emperador Vek'lor",
+ ["Emperor Vek'nilash"] = "Emperador Vek'nilash",
+ Entropius = "Entropius",
+ ["Eonar's Gift"] = "Don de Eonar",
+ ["Epoch Hunter"] = "Cazador de eras",
+ Erekem = "Erekem",
+ ["Eressea Dawnsinger"] = "Eressea Cantoalba",
+ -- ["Eric \"The Swift\""] = "",
+ -- Erudax = "",
+ -- ["Erunak Stonespeaker"] = "",
+ ["Essence of Anger"] = "Esencia de Cólera",
+ ["Essence of Desire"] = "Esencia de Deseo",
+ ["Essence of Suffering"] = "Esencia de Sufrimiento",
+ Eviscerator = "Eviscerador",
+ ["Exarch Maladaar"] = "Exarca Maladaar",
+ ["Expedition Commander"] = "Comandante de expedición",
+ ["Eydis Darkbane"] = "Eydis Penaumbra",
+ ["Eye of C'Thun"] = "Ojo de C'Thun",
+ ["Faction Champions"] = "Campeones de Facción",
+ ["Fallen Champion"] = "Campeón caído",
+ Falric = "Falric",
+ ["Falric and Marwyn"] = "Falric y Marwyn",
+ ["Fankriss the Unyielding"] = "Fankriss el Implacable",
+ ["Fathom-Lord Karathress"] = "Señor de la profundidades Karathress",
+ Felmyst = "Brumavil",
+ ["Fenrus the Devourer"] = "Fenrus el Devorador",
+ ["Feral Defender"] = "Defensor Feral",
+ Festergut = "Panzachancro",
+ Feugen = "Feugen",
+ ["Fineous Darkvire"] = "Finoso Virunegro",
+ Firemaw = "Faucefogo",
+ ["Fjola Lightbane"] = "Fjola Penívea",
+ Flamegor = "Flamagor",
+ ["Flame Leviathan"] = "Leviatán de llamas",
+ ["Foreman Thistlenettle"] = "Supervisor Cardortiga",
+ ["Forgemaster Garfrost"] = "Maestro de Forja Gargelus",
+ -- ["Forgremaster Throngus"] = "",
+ ["Four Horsemen Chest"] = "Cofre de los Cuatro Jinetes",
+ ["Fras Siabi"] = "Fras Siabi",
+ Freya = "Freya",
+ ["Gahz'ranka"] = "Gahz'ranka",
+ ["Gahz'rilla"] = "Gahz'rilla",
+ ["Gal'darah"] = "Gal'darah",
+ ["Galgann Firehammer"] = "Galgann Flamartillo",
+ Garr = "Garr",
+ ["Garrosh Hellscream"] = "Garrosh Garrosh Grito Inferna",
+ Gasher = "Gasher",
+ ["Gatewatcher Gyro-Kill"] = "Vígia de las puertas Giromata",
+ ["Gatewatcher Iron-Hand"] = "Vigía de las puertas Manoyerro",
+ ["Gathios the Shatterer"] = "Gathios the Shatterer",
+ Gehennas = "Gehennas",
+ Gelihast = "Gelihast",
+ Gelk = "Gelk",
+ ["General Angerforge"] = "General Forjira",
+ ["General Bjarngrim"] = "General Bjarngrim",
+ ["General Drakkisath"] = "General Drakkisath",
+ ["General Rajaxx"] = "General Rajaxx",
+ -- ["General Umbriss"] = "",
+ ["General Vezax"] = "General Vezax",
+ -- ["General Zarithrian"] = "",
+ ["Ghamoo-ra"] = "Ghamoo-ra",
+ ["Ghaz'an"] = "Ghaz'an",
+ ["Ghok Bashguud"] = "Ghok Bashguud",
+ Gilnid = "Gilnid",
+ ["Gizrul the Slavener"] = "Gizrul el Esclavista",
+ ["Gloom'rel"] = "Gloom'rel",
+ Gluth = "Gluth",
+ Glutton = "Glotón",
+ ["Golemagg the Incinerator"] = "Golemagg el Incinerador",
+ ["Golem Lord Argelmach"] = "Señor Golem Argelmach",
+ ["Goraluk Anvilcrack"] = "Goraluk Yunquegrieta",
+ ["Gormok the Impaler"] = "Gormok el Empalador",
+ ["Gorosh the Dervish"] = "Gorosh el Endemoniado",
+ ["Gortok Palehoof"] = "Gortok Pezuña Pálida",
+ ["Gothik the Harvester"] = "Gothik el Cosechador",
+ ["Grand Astromancer Capernian"] = "Gran astromántica Capernian",
+ ["Grand Champions"] = "Grandes Campeones",
+ -- ["Grand Crusader Dathrohan"] = "",
+ ["Grand Magus Telestra"] = "Gran maga Telestra",
+ ["Grandmaster Vorpil"] = "Maestro mayor Vorpil",
+ Grandmother = "Abuela",
+ ["Grand Warlock Alythess"] = "Bruja suprema Alythess",
+ ["Grand Warlock Nethekurse"] = "Brujo supremo Malbisal",
+ ["Grand Widow Faerlina"] = "Gran Viuda Faerlina",
+ ["Grethok the Controller"] = "Grethok el Controlador",
+ ["Gri'lek"] = "Gri'lek",
+ Grimlok = "Grimlok",
+ Grizzle = "\009Grisez",
+ Grobbulus = "Grobbulus",
+ Grubbis = "Grubbis",
+ ["Gruul the Dragonkiller"] = "Gruul el Asesino de Dragones",
+ ["Guard Fengus"] = "Guardia Fengus",
+ ["Guardian of Yogg-Saron"] = "Guardián de Yogg-Saron",
+ ["Guard Mol'dar"] = "Guardia Mol'dar",
+ ["Guard Slip'kik"] = "Guardia Slip'kik",
+ ["Gurtogg Bloodboil"] = "Gurtogg Sangre Hirviente",
+ Gyth = "Gyth",
+ Hadronox = "Hadronox",
+ Hakkar = "Hakkar",
+ Halazzi = "Halazzi",
+ -- Halion = "",
+ Halycon = "Halycon",
+ Hamhock = "Hamhock",
+ ["Harbinger Skyriss"] = "Presagista Cieloriss",
+ ["Hate'rel"] = "Odio'rel",
+ ["Hazza'rah"] = "Hazza'rah",
+ Hazzas = "Hazzas",
+ ["Headless Horseman"] = "Jinete sin Cabeza",
+ ["Hearthsinger Forresten"] = "Escupezones Foreste",
+ ["Hedrum the Creeper"] = "Hedrum el Trepador",
+ ["Heigan the Unclean"] = "Heigan el Impuro",
+ ["Hellfire Channeler"] = "Canalizador Fuego Infernal",
+ ["Henry Stern"] = "Henry Stern",
+ ["Herald Volazj"] = "Heraldo Volazj",
+ Herod = "Herod",
+ ["Hex Lord Malacrass"] = "Señor aojador Malacrass",
+ ["High Astromancer Solarian"] = "Gran astromántica Solarian",
+ ["High Botanist Freywinn"] = "Gran botánico Freywinn",
+ ["High Inquisitor Fairbanks"] = "Alto Inquisidor Ribalimpia",
+ ["High Inquisitor Whitemane"] = "Alta Inquisidora Melenablanca",
+ ["High Interrogator Gerstahn"] = "Alto Interrogador Gerstahn",
+ ["High King Maulgar"] = "Su majestad Maulgar",
+ ["Highlord Mograine"] = "Alto Señor Mograine",
+ ["Highlord Omokk"] = "Alto Señor Omokk",
+ ["High Marshal Whirlaxis"] = "High Marshal Whirlaxis",
+ ["High Nethermancer Zerevor"] = "High Nethermancer Zerevor",
+ ["High Overlord Saurfang"] = "Alto señor supremo Colmillosauro",
+ ["High Priestess Arlokk"] = "Suma Sacerdotisa Arlokk",
+ ["High Priestess Jeklik"] = "Suma Sacerdotisa Jeklik",
+ ["High Priestess Mar'li"] = "Suma Sacerdotisa Mar'li",
+ ["High Priestess of Thaurissan"] = "Alta Sacerdotisa de Thaurissan",
+ ["High Priest Thekal"] = "Sumo Sacerdote Thekal",
+ ["High Priest Venoxis"] = "Sumo Sacerdote Venoxis",
+ ["High Warlord Naj'entus"] = "Gran Señor de la Guerra Naj'entus",
+ Hodir = "Hodir",
+ ["Houndmaster Grebmar"] = "Maestro de canes Grebmar",
+ ["Houndmaster Loksey"] = "Maestro de canes Loksey",
+ Hukku = "Hukku",
+ Hungarfen = "Panthambre",
+ ["Hurley Blackbreath"] = "Hurley Negrálito",
+ ["Hyakiss the Lurker"] = "Hyakiss el Rondador",
+ ["Hydromancer Thespia"] = "Hidromántico Thespia",
+ ["Hydromancer Velratha"] = "Hidromántica Velratha",
+ Hydrospawn = "Hidromilecio",
+ ["Hydross the Unstable"] = "Hydross el Inestable",
+ ["Icecrown Gunship Battle"] = "Batalla de las Aeronaves de Corona de Hielo",
+ Icehowl = "Aullahielo",
+ ["Ice Sphere"] = "Esfera de hielo",
+ Ichoron = "Ícoron",
+ Ick = "Agh",
+ ["Ignis the Furnace Master"] = "Ignis el Maestro de la Caldera",
+ ["Illidan Stormrage"] = "Illidan Tempestira",
+ ["Illidari Council"] = "Concilio Illidari",
+ ["Illyanna Ravenoak"] = "Illyanna Roblecuervo",
+ ["Immol'thar"] = "Immol'thar",
+ ["Infinite Corruptor"] = "Corruptor Infinito",
+ ["Infinity Blades"] = "Hojas de infinidad",
+ ["Ingvar the Plunderer"] = "Ingvar the Plunderer",
+ ["Instructor Malicia"] = "Instructor Malicia",
+ ["Instructor Razuvious"] = "Instructor Razuvious",
+ ["Interrogator Vishas"] = "Interrogador Vishas",
+ Ionar = "Ionar",
+ Ironaya = "Hierraya",
+ Ironspine = "Dorsacerado",
+ Isalien = "Isalien",
+ Jade = "Jade",
+ ["Jammal'an the Prophet"] = "Jammal'an el Profeta",
+ ["Jan'alai"] = "Jan'alai",
+ ["Jandice Barov"] = "Jandice Barov",
+ ["Jedoga Shadowseeker"] = "Jedoga Buscasombras",
+ ["Jed Runewatcher"] = "Jed vigía de las runas",
+ ["Jergosh the Invoker"] = "Jergosh el Convocador",
+ ["Jin'do the Hexxer"] = "Jin'do el Aojador",
+ ["Jormungar Behemoth"] = "Behemoth Jormungar",
+ Jormungars = "Jormungars",
+ Julianne = "Julianne",
+ ["Junk Bot"] = "Chatarrabot",
+ ["Kael'thas Sunstrider"] = "Kael'thas Caminante del Sol",
+ Kalecgos = "Kalecgos",
+ ["Kam Deepfury"] = "Kam Furiahonda",
+ -- ["Karsh Steelbender"] = "",
+ ["Kazkaz the Unholy"] = "Kazkaz el Blasfemo",
+ ["Kaz'rogal"] = "Kaz'rogal",
+ ["Keli'dan the Breaker"] = "Keli'dan el Ultrajador",
+ ["Kel'Thuzad"] = "Kel'Thuzad",
+ Keristrasza = "Keristrasza",
+ ["Kiggler the Crazed"] = "Kiggler el Enloquecido",
+ ["Kil'jaeden"] = "Kil'jaeden",
+ ["Kil'rek"] = "Kil'rek",
+ ["King Dred"] = "Rey Dred",
+ ["King Gordok"] = "Rey Gordok",
+ ["King Llane Piece"] = "Rey Llane",
+ ["King Ymiron"] = "Rey Ymiron",
+ ["Kirtonos the Herald"] = "Kirtonos el Heraldo",
+ ["Knot Thimblejack's Cache"] = "Carretilla de Knot Llavededo",
+ Kolk = "Kolk",
+ Kologarn = "Kologarn",
+ ["Koralon the Flame Watcher"] = "Koralon el Vigía de las llamas",
+ Kormok = "Kormok",
+ Kresh = "Kresh",
+ Krick = "Puagh",
+ ["Krick and Ick"] = "Agh y Puagh",
+ ["Krik'thir the Gatewatcher"] = "Krik’thir el vígia de las puertas",
+ ["Krosh Firehand"] = "Krosh Manofuego",
+ Krystallus = "Krystallus",
+ Kurinnaxx = "Kurinnaxx",
+ ["Lady Anacondra"] = "Lady Anacondra",
+ ["Lady Blaumeux"] = "Lady Blaumeux",
+ ["Lady Deathwhisper"] = "Lady Susurramuerte",
+ ["Lady Illucia Barov"] = "Lady Illucia Barov",
+ ["Lady Malande"] = "Lady Malande",
+ -- ["Lady Naz'jar"] = "",
+ ["Lady Sacrolash"] = "Lady Sacrolash",
+ ["Lady Sarevess"] = "Lady Sarevess",
+ ["Lady Vashj"] = "Lady Vashj",
+ Laj = "Laj",
+ Landslide = "Derrumblo",
+ Lavanthor = "Lavanthor",
+ ["Left Arm"] = "Brazo Izquierdo",
+ ["Leotheras the Blind"] = "Leotheras el Ciego",
+ Lethon = "Lethon",
+ Lethtendris = "Lethtendris",
+ ["Leviathan Mk II"] = "Mk II de leviatán",
+ ["Ley-Guardian Eregos"] = "Guardián-Ley Eregos",
+ ["Lieutenant Drake"] = "Teniente Draco",
+ ["Lieutenant General Andorov"] = "Teniente General Andorov",
+ Loatheb = "Loatheb",
+ Loken = "Loken",
+ ["Lord Alexei Barov"] = "Lord Alexei Barov",
+ ["Lord Cobrahn"] = "Lord Cobrahn",
+ ["Lord Hel'nurath"] = "Lord Hel'nurath",
+ ["Lord Incendius"] = "Lord Incendius",
+ ["Lord Jaraxxus"] = "Lord Jaraxxus",
+ ["Lord Kazzak"] = "Lord Kazzak",
+ ["Lord Kri"] = "Lord Kri",
+ ["Lord Marrowgar"] = "Lord Tuétano",
+ ["Lord Pythas"] = "Lord Pythas",
+ ["Lord Roccor"] = "Lord Roccor",
+ ["Lord Sanguinar"] = "Lord Sanguinar",
+ ["Lord Serpentis"] = "Lord Serpentis",
+ ["Lord Skwol"] = "Lord Skwol",
+ ["Lord Valthalak"] = "Lord Valthalak",
+ ["Lord Victor Nefarius"] = "Lord Víctor Nefarius",
+ ["Lord Vyletongue"] = "Lord Lenguavil",
+ ["Lorekeeper Polkelt"] = "Tradicionalista Polkelt",
+ -- ["Lorgus Jett"] = "",
+ Loro = "Loro",
+ Lucifron = "Lucifron",
+ ["Mad Magglish"] = "Magglish el Loco",
+ Maexxna = "Maexxna",
+ ["Mage-Lord Urom"] = "Señor de la Magia Urom",
+ ["Magister Kalendris"] = "Magister Kalendris",
+ ["Magistrate Barthilas"] = "Magistrado Barthilas",
+ Magmadar = "Magmadar",
+ Magmus = "Magmus",
+ Magra = "Magra",
+ Magtheridon = "Magtheridon",
+ ["Maiden of Grief"] = "Doncella de Pena",
+ ["Maiden of Virtue"] = "Doncella de Virtud",
+ ["Majordomo Executus"] = "Mayordomo Executus",
+ Malacrass = "Malacrass",
+ ["Maleki the Pallid"] = "Maleki el Pálido",
+ ["Mal'Ganis"] = "Mal'Ganis",
+ Malygos = "Malygos",
+ Maraudos = "Maraudos",
+ ["Marduk Blackpool"] = "Marduz Pozonegro",
+ ["Marisa du'Paige"] = "Marisa du'Paige",
+ Marwyn = " Marwyn",
+ ["Master Engineer Telonicus"] = "Maestro Ingeriero Telonicus",
+ ["Maur Grimtotem"] = "Maur Tótem Siniestro",
+ Meathook = "Gancho",
+ ["Mechano-Lord Capacitus"] = "Lord-mecano Capacitus",
+ Medivh = "Medivh",
+ ["Mekgineer Steamrigger"] = "Mekigeniero Vaporino",
+ ["Mekgineer Thermaplugg"] = "Mekigeniero Termochufe",
+ ["Mennu the Betrayer"] = "Mennu el Traidor",
+ ["Meshlok the Harvester"] = "Meshlok el Cosechador",
+ Midnight = "Medianoche",
+ Mijan = "Mijar",
+ Mimiron = "Mimiron",
+ ["Miner Johnson"] = "Minero Johnson",
+ ["Mistress of Pain"] = "Doncella de Dolor",
+ Moam = "Moam",
+ Mogor = "Mogor",
+ ["Mokra the Skullcrusher"] = "Mokra el Trituracráneos",
+ Moorabi = "Moorabi",
+ Moragg = "Moragg",
+ ["Mordresh Fire Eye"] = "Mordresh Ojo de Fuego",
+ ["Mor Grayhoof"] = "Mor Grayhoof",
+ Moroes = "Moroes",
+ ["Morogrim Tidewalker"] = "Morogrim Levantamareas",
+ Morphaz = "Morphaz",
+ ["Mother Shahraz"] = "Madre Shahraz",
+ ["Mother Smolderweb"] = "Madre Telabrasada",
+ ["Mr. Smite"] = "Sr. Golpin",
+ ["Muradin Bronzebeard"] = "Muradin Barbabronce",
+ ["Murkblood Twin"] = "Gemelo Sangreoscura",
+ ["Murkblood Twins"] = "Gemelos Sangreoscura",
+ Murmur = "Murmur",
+ ["Murta Grimgut"] = "Murta Tripuriosa",
+ ["M'uru"] = "M'uru",
+ Mushgog = "Mushgog",
+ ["Mutanus the Devourer"] = "Mutanus el Devorador",
+ Nalorakk = "Nalorakk",
+ Nazan = "Nazan",
+ Nefarian = "Nefarian",
+ ["Nekrum Gutchewer"] = "Nekrum Cometripas",
+ ["Nerub'enkan"] = "Nerub'enkan",
+ ["Nethermancer Sepethrea"] = "Abisálico Sepethrea",
+ Netherspite = "Rencor abisal",
+ ["Netherstrand Longbow"] = "Arco largo de fibra abisal",
+ ["Nexus-Prince Shaffar"] = "Príncipe-nexo Shaffar",
+ Nightbane = "Nocturno",
+ ["Noth the Plaguebringer"] = "Noth el Pesteador",
+ ["Novos the Summoner"] = "Novos el Invocador",
+ Noxxion = "Noxxion",
+ ["Obsidian Sentinel"] = "Centinela Obsidiano",
+ ["Odo the Blindwatcher"] = "Odo el vigía ciego",
+ -- Oggleflint = "",
+ ["Ogom the Wretched"] = "Ogom el Desdichado",
+ -- Ohgan = "",
+ ["Ok'thor the Breaker"] = "Ok'thor el Rompedor",
+ -- Olaf = "",
+ ["Old Serra'kis"] = "Viejo Serra'kis",
+ ["Olm the Summoner"] = "Olm el Invocador",
+ ["Omor the Unscarred"] = "Omor el Sinmarcas",
+ Onyxia = "Onyxia",
+ -- ["Opera Event"] = "",
+ ["Orgrim's Hammer"] = "Martillo de Orgrim",
+ ["Ormorok the Tree-Shaper"] = "Ormorok el cortador de árboles",
+ ["Oro Eyegouge"] = "Oro Bocojo ",
+ ["Ossirian the Unscarred"] = "Osirio el Sinmarcas",
+ Ouro = "Ouro",
+ ["Overlord Ramtusk"] = "Señor Supremo Colmicarnero",
+ ["Overlord Wyrmthalak"] = "Señor Supremo Vermiothalak",
+ ["Overmaster Pyron"] = "Maestro Supremo Pyron",
+ ["Overseer Tidewrath"] = "Avizor Aleta de Cólera",
+ -- Ozumat = "",
+ Pandemonius = "Pandemonius",
+ ["Panzor the Invincible"] = "Panzor el Invencible",
+ Patchwerk = "Remendejo",
+ ["Pathaleon the Calculator"] = "Panthaleon el Calculador",
+ Phalanx = "Falange",
+ ["Phaseshift Bulwark"] = "Baluarte de cambio de fase",
+ Pimgib = "Pimgib",
+ ["Plaguemaw the Rotting"] = "Fauzpeste el Putrefacto",
+ ["Plugger Spazzring"] = "Plugger Aropatoso",
+ ["Postmaster Malown"] = "Jefe de correos Malown",
+ ["Priestess Delrissa"] = "Sacerdotisa Delrissa",
+ ["Prince Keleseth"] = "Príncipe Keleseth",
+ ["Prince Malchezaar"] = "Príncipe Malchezaar",
+ ["Prince Skaldrenox"] = "Príncipe Skaldrenox",
+ ["Princess Huhuran"] = "Princesa Huhuran",
+ ["Princess Moira Bronzebeard"] = "Princesa Moira Barbabronce",
+ ["Princess Tempestria"] = "Princesa Tempestria",
+ ["Princess Theradras"] = "Princesa Theradras",
+ ["Princess Yauj"] = "Princesa Yauj",
+ ["Prince Taldaram"] = "Príncipe Taldaram",
+ ["Prince Tenris Mirkblood"] = "Príncipe Tenris Sangre Penumbra",
+ ["Prince Tortheldrin"] = "Príncipe Tortheldrin",
+ ["Prince Valanar"] = "Principe Valanar",
+ ["Professor Putricide"] = "Profesor Putricidio",
+ ["Pure Spawn of Hydross"] = "Engendro puro de Hydross",
+ Pusillin = "Pusillín",
+ ["Pyroguard Emberseer"] = "Piroguardián Brasadivino",
+ ["Pyromancer Loregrain"] = "Piromántico Cultugrano",
+ Quagmirran = "Quagmirran",
+ ["Quartermaster Zigris"] = "Intendente Zigris",
+ ["Rage Winterchill"] = "Ira Fríoinvierno",
+ Ragglesnout = "Morrandrajos",
+ ["Raging Spirit"] = "Espíritu enfurecido",
+ Ragnaros = "Ragnaros",
+ ["Ramstein the Gorger"] = "Ramstein el Empachador",
+ ["Ras Frostwhisper"] = "Ras Levescarcha",
+ Rattlegore = "Traquesangre",
+ ["Razorclaw the Butcher"] = "Zarpador el Carnicero",
+ ["Razorgore the Untamed"] = "Sangrevaja el Indomable",
+ Razorlash = "Lativaja",
+ Razorscale = "Tajoescama",
+ ["Reliquary of Souls"] = "Relicario de Almas",
+ Renataki = "Renataki",
+ ["Restless Skeleton"] = "Esqueleto inquieto",
+ Rethilgore = "Rethilgore",
+ Revelosh = "Revelosh",
+ ["Rhahk'Zor"] = "Rhahk'Zor",
+ ["Ribbly Screwspigot"] = "Ribbly Llavenrosca",
+ ["Right Arm"] = "Brazo Derecho",
+ -- ["Ring of Law"] = "",
+ Roar = "Rugido",
+ ["Rokad the Ravager"] = "Rokad el Devastador",
+ ["Rokdar the Sundered Lord"] = "Rokdar el Señor Hendido",
+ ["Rokmar the Crackler"] = "Rokmar el Crujidor",
+ -- ["Rom'ogg Bonecrusher"] = "",
+ Romulo = "Romulo",
+ ["Romulo & Julianne"] = "Romeo y Julieta",
+ -- Roogug = "",
+ Rotface = "Carapútrea",
+ Rotgrip = "Escamapodrida",
+ ["Runemaster Molgeim"] = "Maestro de runas Molgeim",
+ ["Runok Wildmane"] = "Runok Ferocrín",
+ Ruuzlu = "Ruuzlu",
+ ["Salramm the Fleshcrafter"] = "Salramm el Modelador de carne",
+ ["Sanctum Sentry"] = "Centinela del sagrario",
+ ["Sandarr Dunereaver"] = "Sandarr Asaltadunas",
+ ["Sandfury Executioner"] = "Ejecutor Furiarena",
+ Sapphiron = "Sapphiron",
+ Sara = "Sara",
+ ["Saronite Animus"] = "Animus de saronita",
+ Sartharion = "Sartharion",
+ ["Sathrovarr the Corruptor"] = "Sathrovarr el Corruptor",
+ -- ["Saviana Ragefire"] = "",
+ ["Scarlet Commander Mograine"] = "Comandante Escarlata Mograine",
+ ["Scourgelord Tyrannus"] = "Señor de la Plaga Tyrannus",
+ ["Seeth'rel"] = "Seeth'rel",
+ ["Selin Fireheart"] = "Selin Corazón de Fuego",
+ ["Sergeant Bly"] = "Sargento Bly",
+ ["Shade of Akama"] = "Sombra de Akama",
+ ["Shade of Aran"] = "Sombra de Aran",
+ ["Shade of Eranikus"] = "Sombra de Eranikus",
+ ["Shadikith the Glider"] = "Shadikith the Glider",
+ ["Shadow Hunter Vosh'gajin"] = "Cazador de las Sombras Vosh'gajin",
+ ["Shadow of Leotheras"] = "Sombra de Leotheras",
+ ["Shadowpriest Sezz'ziz"] = "Sacerdote oscuro Sezz'ziz",
+ Shadron = "Shadron",
+ Shazzrah = "Shazzrah",
+ ["Shirrak the Dead Watcher"] = "Shirrak el Vigía de los Muertos",
+ Sindragosa = "Sindragosa",
+ ["Sir Zeliek"] = "Sir Zeliek",
+ ["Sjonnir The Ironshaper"] = "Sjonnir el Afilador",
+ ["Skadi the Ruthless"] = "Skadi el Despiadado",
+ ["Skarr the Unbreakable"] = "Skarr el Inquebrantable",
+ ["Skarvald the Constructor"] = "Skarvald el Constructor",
+ ["Skra'gath"] = "Skra'gath",
+ Skul = "Skul",
+ Skum = "Skum",
+ ["Slad'ran"] = "Slad'ran",
+ Sneed = "Sneed",
+ ["Sneed's Shredder"] = "Machacador de Sneed",
+ ["Solakar Flamewreath"] = "Solakar Corona de Fuego",
+ ["Solarium Agent"] = "Agente Solarium",
+ ["Solarium Priest"] = "Sacerdote Solarium",
+ ["Spirestone Battle Lord"] = "Señor de batalla Cumbrerroca",
+ ["Spirestone Butcher"] = "Carnicero Cumbrerroca",
+ ["Spirestone Lord Magus"] = "Señor Magus Cumbrerroca",
+ ["Staff of Disintegration"] = "Bastón de desintegración",
+ Stalagg = "Stalagg",
+ Steelbreaker = "Rompeacero",
+ ["Stomper Kreeg"] = "Vapuleador Kreeg",
+ Stonespine = "Pidrespina",
+ ["Stormcaller Brundir"] = "Clamatormentas Brundir",
+ Strawman = "Espantapájaros",
+ ["Sulfuron Harbinger"] = "Sulfuron Presagista",
+ Supremus = "Supremus",
+ ["Svala Sorrowgrave"] = "Svala Tumbapena",
+ ["Swamplord Musel'ek"] = "Señor del pantano Musel'ek",
+ Taerar = "Taerar",
+ ["Tainted Spawn of Hydross"] = "Engendro de Hydross corrupto",
+ ["Talon King Ikiss"] = "Rey Garra Ikiss",
+ ["Taragaman the Hungerer"] = "Taragaman el Hambriento",
+ ["Targorr the Dread"] = "Targor el Pavoroso",
+ Tavarok = "Tavarok",
+ Techbot = "Tecnobot",
+ Temporus = "Temporus",
+ ["Tendris Warpwood"] = "Tendris Madeguerra",
+ Tenebron = "Tenebron",
+ ["Terestian Illhoof"] = "Terestian Pezuña Enferma",
+ ["Teron Gorefiend"] = "Teron Sanguino",
+ Thaddius = "Thaddius",
+ ["Thaladred the Darkener"] = "Thaladred el Oscurecedor",
+ ["Thane Korth'azz"] = "Thane Korth'azz",
+ ["The Beast"] = "La Bestia",
+ ["The Beasts of Northrend"] = "Las bestias de Rasganorte ",
+ ["The Big Bad Wolf"] = "El Gran Lobo Malvado",
+ ["The Black Knight"] = "El Caballero Negro",
+ ["The Black Stalker"] = "La acechadora negra",
+ ["The Blue Brothers"] = "Los Hermanos Azules",
+ ["The Bug Family"] = "La Familia Insecto",
+ ["The Crone"] = "La Vieja Bruja",
+ ["The Curator"] = "Curator",
+ ["The Eredar Twins"] = "Los Gemelos Eredar",
+ ["The Four Horsemen"] = "Los Cuatro Jinetes",
+ ["The Illidari Council"] = "El concilio Illidari",
+ ["The Iron Council"] = "Asamblea de Hierro",
+ ["Theka the Martyr"] = "Theka la Mártir",
+ ["The Lich King"] = "El Rey Exánime",
+ -- ["The Lost Dwarves"] = "",
+ ["The Lurker Below"] = "El Rondador de abajo",
+ ["The Maker"] = "El Hacedor",
+ ["The Prophet Skeram"] = "El profeta Skeram",
+ ["The Prophet Tharon'ja"] = "El profeta Tharon'ja",
+ ["The Ravenian"] = "El Devorador",
+ ["The Razza"] = "El Razza",
+ ["The Seven Dwarves"] = "Los Siete Enanitos",
+ ["The Skybreaker"] = "El Rompecielos",
+ ["The Tribunal of Ages"] = "El Tribunal de las Eras",
+ ["The Twin Emperors"] = "Los Emperadores Gemelos",
+ ["The Twin Val'kyr"] = "las Gemelas Val'kyr",
+ ["The Unforgiven"] = "El Imperdonable",
+ ["The Windreaver"] = "El Atracavientos",
+ Thorim = "Thorim",
+ ["Thorngrin the Tender"] = "Thorngrin el Tierno",
+ ["Tidewalker Lurker"] = "Rondador Levantamareas",
+ ["Timmy the Cruel"] = "Timmy el Cruel",
+ Tinhead = "Cabezalata",
+ ["Tinkerer Gizlock"] = "Manitas Gizlock",
+ ["Tirion Fordring"] = "Tirion Vadín",
+ Tito = "Tito",
+ ["Toravon the Ice Watcher"] = "Toravon el Vigía de Hielo",
+ ["Trigore the Lasher"] = "Trigore el Azotador",
+ Trollgore = "Cuernotrol",
+ ["Tsu'zee"] = "Tsu'zee",
+ ["Tuten'kash"] = "Tuten'kash",
+ ["Twilight Lord Kelris"] = "Señor Crepuscular Kelris",
+ ["Urok Doomhowl"] = "Urok Aullapocalipsis",
+ ["Vaelastrasz the Corrupt"] = "Vaelastrasz el Corrupto",
+ ["Valithria Dreamwalker"] = "Valithria Caminasueños",
+ ["Val'kyr Shadowguard"] = "Guardia de las Sombras Val'kyr",
+ ["Varian Wrynn"] = "Varian Wrynn",
+ ["Varos Cloudstrider"] = "Varos Zancanubes",
+ Vazruden = "Vazruden",
+ ["Vazruden the Herald"] = "Vazruden el Heraldo",
+ Vectus = "Vectus",
+ Vem = "Vem",
+ Veng = "Veng",
+ ["Veras Darkshadow"] = "Veras Darkshadow",
+ ["Verdan the Everliving"] = "Verdan el Eterno",
+ Verek = "Verek",
+ Vesperon = "Vesperon",
+ Vexallus = "Vexallus",
+ ["Veyzhak the Cannibal"] = "Veyzhak el Caníbal",
+ ["Vile'rel"] = "Vil'rel",
+ Viscidus = "Viscidus",
+ ["Viscous Fallout"] = "Radiactivo viscoso",
+ ["Void Reaver"] = "Atracador del vacío",
+ Volkhan = "Volkhan",
+ ["VX-001"] = "VX-001",
+ ["Warbringer O'mrogg"] = "Belisario O'mrogg",
+ ["Warchief Blackhand Piece"] = "Jefe de Guerra Mano Negra",
+ ["Warchief Kargath Bladefist"] = "Jefe de Guerra Kargath Garrafilada",
+ ["Warchief Rend Blackhand"] = "Jefe de Guerra Desgarro Puño Negro",
+ ["Warden Mellichar"] = "Celador Mellichar",
+ ["Warder Stilgiss"] = "Guarda Stilgiss",
+ ["Warlord Kalithresh"] = "Señor de la Guerra Kalithresh",
+ ["War Master Voone"] = "Maestro de guerra Voone",
+ ["Warmaul Champion"] = "Campeón Mazo de Guerra",
+ ["Warp Slicer"] = "Cercenadora de distorsión",
+ ["Warp Splinter"] = "Disidente de distorsión",
+ ["Watchkeeper Gargolmar"] = "Guardián vigía Gargolmar",
+ Weaver = "Sastrón",
+ ["Witch Doctor Zum'rah"] = "Médico brujo Zum'rah",
+ ["Wolf Master Nandos"] = "Maestro de lobos Nandos",
+ ["Wrath-Scryer Soccothrates"] = "Arúspice de cólera Soccothrates",
+ Wushoolay = "Wushoolay",
+ Xevozz = "Xevozz",
+ ["XT-002 Deconstructor"] = "Desarmarmador XA-002",
+ ["Yogg-Saron"] = "Yogg-Saron",
+ -- Yor = "",
+ Ysondre = "Ysondre",
+ Zekkis = "Zekkis",
+ ["Zelemar the Wrathful"] = "Zelemar el Colérico",
+ ["Zereketh the Unbound"] = "Zereketh el Desatado",
+ Zerillis = "Zerillis",
+ ["Zevrim Thornhoof"] = "Zevrim Pezuñahendida",
+ Zolo = "Zolo",
+ ["Zul'Farrak Dead Hero"] = "Héroe muerto Zul'Farrak",
+ ["Zul'jin"] = "Zul'jin",
+ ["Zul'Lor"] = "Zul'Lor",
+ ["Zul'tore"] = "Zul'tore",
+ ["Zuramat the Obliterator"] = "Zuramat el Obliterador",
+}
+elseif GAME_LOCALE == "ruRU" then
+ lib:SetCurrentTranslations {
+ Acidmaw = "Кислотная Утроба",
+ Aeonus = "Эонус",
+ ["Aerial Command Unit"] = "Воздушное судно",
+ ["Agathelos the Raging"] = "Агателос Свирепый",
+ ["Aggem Thorncurse"] = "Аггем Терновое Проклятие",
+ Ahune = "Ахун",
+ ["Akil'zon"] = "Акил'зон",
+ ["Aku'mai"] = "Аку'май",
+ ["Al'ar"] = "Ал'ар",
+ ["Algalon the Observer"] = "Алгалон Наблюдатель",
+ ["Alzzin the Wildshaper"] = "Алззин Перевертень",
+ Amanitar = "Аманитар",
+ ["Ambassador Flamelash"] = "Посол Огнехлыст",
+ ["Ambassador Hellmaw"] = "Посол Гиблочрев",
+ ["Amnennar the Coldbringer"] = "Амненнар Хладовей",
+ ["Ancient Stone Keeper"] = "Древний Хранитель Камня",
+ Anetheron = "Анетерон",
+ ["Anger'rel"] = "Гнев'рел",
+ Anomalus = "Аномалус",
+ ["Antu'sul"] = "Анту'сул",
+ ["Anub'arak"] = "Ануб'арак",
+ ["Anubisath Defender"] = "Защитник-анубисат",
+ ["Anubisath Guardian"] = "Анубисат-страж",
+ ["Anub'Rekhan"] = "Ануб'Рекан",
+ ["Anub'shiah"] = "Ануб'шиа",
+ Anzu = "Анзу",
+ ["Arcane Watchman"] = "Чародейский стражник",
+ ["Arcanist Doan"] = "Чародей Доан",
+ Archaedas = "Аркедас",
+ ["Archavon the Stone Watcher"] = "Аркавон Страж Камня",
+ Archimonde = "Архимонд",
+ ["Archivist Galford"] = "Архивариус Галфорд",
+ ["Archmage Arugal"] = "Верховный маг Аругал",
+ ["Argent Confessor Paletress"] = "Исповедница Серебряного Авангарда Пейлтресс",
+ ["Arugal's Voidwalker"] = "Демон Бездны Аругала",
+ -- ["Ascendant Lord Obsidius"] = "",
+ ["Assault Bot"] = "Штурмовой робот",
+ -- ["Assembly of Iron"] = "",
+ ["Atal'alarion"] = "Атал'аларион",
+ ["Attumen the Huntsman"] = "Ловчий Аттумен",
+ Auriaya = "Ауриайя",
+ Avalanchion = "Лавинион",
+ ["Avatar of Hakkar"] = "Аватара Хаккара",
+ ["Ayamiss the Hunter"] = "Айамисса Охотница",
+ Azgalor = "Азгалор",
+ ["Azshir the Sleepless"] = "Азшир Неспящий",
+ Azuregos = "Азурегос",
+ ["Bael'Gar"] = "Бейл'Гор",
+ Baelog = "Бейлог",
+ Balnazzar = "Балназзар",
+ ["Baltharus the Warborn"] = "Балтар Рожденный в Битве",
+ ["Bannok Grimaxe"] = "Баннок Люторез",
+ ["Baron Aquanis"] = "Барон Акванис",
+ ["Baron Charr"] = "Барон Огнерр",
+ ["Baroness Anastari"] = "Баронесса Анастари",
+ ["Baron Geddon"] = "Барон Геддон",
+ ["Baron Kazum"] = "Барон Казум",
+ ["Baron Rivendare"] = "Барон Ривендер",
+ ["Baron Silverlaine"] = "Барон Сребролен",
+ ["Battleguard Sartura"] = "Боевой страж Сартура",
+ ["Bazil Thredd"] = "Базиль Тредд",
+ Bazzalan = "Баззалан",
+ -- Beauty = "",
+ ["Black Guard Swordsmith"] = "Оружейник Черной Стражи",
+ ["Blackheart the Inciter"] = "Черносерд Проповедник",
+ ["Blindeye the Seer"] = "Слепоглаз Ясновидец",
+ ["Blind Hunter"] = "Слепой охотник",
+ ["Blood Guard Porung"] = "Кровавый страж Порунг",
+ ["Bloodlord Mandokir"] = "Мандокир Повелитель Крови",
+ ["Bloodmage Thalnos"] = "Волшебник Крови Талнос",
+ ["Blood Prince Council"] = "Совет Принцев Крови",
+ ["Blood Princes"] = "Совет Принцев Крови",
+ ["Blood-Queen Lana'thel"] = "Кровавая королева Лана'тель",
+ ["Blood Steward of Kirtonos"] = "Кровавая прислужница Киртоноса",
+ Boahn = "Боан",
+ ["Bomb Bot"] = "Бомбот",
+ ["Brain of Yogg-Saron"] = "Мозг Йогг-Сарона",
+ ["Brainwashed Noble"] = "Зомбированный дворянин",
+ Broggok = "Броггок",
+ Brokentoe = "Хромоног",
+ Bronjahm = "Броньям",
+ ["Broodlord Lashlayer"] = "Предводитель драконов Разящий Бич",
+ ["Bruegal Ironknuckle"] = "Бругал Железный Кулак",
+ Brutallus = "Бруталл",
+ ["Burning Felguard"] = "Пылающий страж Скверны",
+ ["Buru the Gorger"] = "Буру Ненасытный",
+ ["Cache of the Firelord"] = "Тайник повелителя огня",
+ ["Cache of the Legion"] = "Тайник Легиона",
+ ["Cannon Master Willey"] = "Мастер-канонир Вилли",
+ ["Captain Greenskin"] = "Капитан Зеленямс",
+ ["Captain Kromcrush"] = "Капитан Давигром",
+ ["Captain Skarloc"] = "Капитан Скарлок",
+ ["Celebras the Cursed"] = "Селебрас Проклятый",
+ ["Charlga Razorflank"] = "Чарлга Остробок",
+ ["Chess Event"] = "Шахматы",
+ ["Chest of The Seven"] = "Сундук Семерых",
+ ["Chief Ukorz Sandscalp"] = "Вождь Укорз Песчаная Плешь",
+ ["Cho'Rush the Observer"] = "Чо'Раш Наблюдатель",
+ Chromaggus = "Хроммагус",
+ ["Chrono Lord Deja"] = "Повелитель времени Дежа",
+ ["Chrono-Lord Epoch"] = "Хронолорд Эпох",
+ Claw = "Коготь",
+ ["Coilfang Elite"] = "Гвардеец резервуара Кривого Клыка",
+ ["Coilfang Strider"] = "Странник резервуара Кривого Клыка",
+ ["Commander Kolurg"] = "Командир Колург",
+ ["Commander Sarannis"] = "Командир Сараннис",
+ ["Commander Springvale"] = "Командир Ручьедол",
+ ["Commander Stoutbeard"] = "Командир Пивобород",
+ -- ["Commander Ulthok"] = "",
+ ["Constructor & Controller"] = "Строитель и Контролирующий",
+ Cookie = "Пирожок",
+ ["Coren Direbrew"] = "Корен Худовар",
+ -- ["Corla, Herald of Twilight"] = "",
+ ["Cosmic Infuser"] = "Вселенский вдохновитель",
+ ["Crimson Hammersmith"] = "Молотобоец из Багрового Легиона",
+ ["Crowd Pummeler 9-60"] = "Толпогон 9-60",
+ ["Crystal Fang"] = "Хрустальный Клык",
+ ["C'Thun"] = "К'Тун",
+ Cyanigosa = "Синигоса",
+ ["Dalliah the Doomsayer"] = "Далия Глашатай Судьбы",
+ ["Dalronn the Controller"] = "Далронн Контролирующий",
+ ["Dark Coffer"] = "Черный ящик",
+ ["Dark Iron Ambassador"] = "Посол из клана Черного Железа",
+ ["Darkmaster Gandling"] = "Темный магистр Гандлинг",
+ ["Darkweaver Syth"] = "Темнопряд Сит",
+ ["Deathbound Ward"] = "Заклятый страж",
+ ["Deathbringer Saurfang"] = "Саурфанг Смертоносный",
+ ["Death Knight Darkreaver"] = "Рыцарь смерти Темный Терзатель",
+ ["Death Knight Understudy"] = "Ученик рыцаря смерти",
+ ["Deathspeaker High Priest"] = "Вестник смерти - верховный жрец",
+ ["Death Speaker Jargba"] = "Вестник смерти Джаргба",
+ ["Deathstalker Visceri"] = "Страж смерти Визери",
+ ["Deathsworn Captain"] = "Капитан служителей Смерти",
+ Devastation = "Сокрушитель",
+ ["Deviate Faerie Dragon"] = "Загадочный волшебный дракон",
+ ["Devourer of Souls"] = "Пожиратель Душ",
+ ["Dextren Ward"] = "Декстрен Вард",
+ ["Digmaster Shovelphlange"] = "Мастер Лопаторук",
+ ["Doctor Theolen Krastinov"] = "Доктор Теолен Крастинов",
+ ["Doom Lord Kazzak"] = "Владыка Судеб Каззак",
+ ["Doom'rel"] = "Рок'рел",
+ Doomwalker = "Судьболом",
+ ["Dope'rel"] = "Праздн'рел",
+ Dorothee = "Дороти",
+ -- ["Drahga Shodowburner"] = "",
+ ["Drakkari Colossus"] = "Колосс Драккари",
+ ["Drakos the Interrogator"] = "Дракос Дознаватель",
+ Dreadscale = "Жуткая Чешуя",
+ Dreamscythe = "Жнец Снов",
+ ["Dust Covered Chest"] = "Пыльный сундук",
+ Dustwraith = "Пыльный Призрак",
+ ["Eadric the Pure"] = "Эдрик Чистый",
+ ["Earthcaller Halmgar"] = "Заклинательница земли Халмгар",
+ Ebonroc = "Черноскал",
+ ["Eck the Ferocious"] = "Эк Свирепый",
+ ["Edwin VanCleef"] = "Эдвин ван Клиф",
+ ["Elder Brightleaf"] = "Древень Яркий Лист",
+ ["Elder Ironbranch"] = "Древень Железная Ветвь",
+ ["Elder Nadox"] = "Старейшина Надокс",
+ ["Elder Stonebark"] = "Древень Каменная Кора",
+ ["Electrocutioner 6000"] = "Электрошокер 6000",
+ ["Emalon the Storm Watcher"] = "Эмалон Страж Бури",
+ Emeriss = "Эмерисс",
+ ["Emperor Dagran Thaurissan"] = "Император Дагран Таурисан",
+ ["Emperor Vek'lor"] = "Император Век'лор",
+ ["Emperor Vek'nilash"] = "Император Век'нилаш",
+ Entropius = "Энтропий",
+ ["Eonar's Gift"] = "Дар Эонара",
+ ["Epoch Hunter"] = "Охотник Вечности",
+ Erekem = "Эрекем",
+ ["Eressea Dawnsinger"] = "Эрессея Певица Рассвета",
+ ["Eric \"The Swift\""] = "Эрик \"Быстрый\"",
+ -- Erudax = "",
+ -- ["Erunak Stonespeaker"] = "",
+ ["Essence of Anger"] = "Воплощение гнева",
+ ["Essence of Desire"] = "Воплощение желания",
+ ["Essence of Suffering"] = "Воплощение страдания",
+ Eviscerator = "Потрошитель",
+ ["Exarch Maladaar"] = "Экзарх Маладаар",
+ ["Expedition Commander"] = "Начальник экспедиции",
+ ["Eydis Darkbane"] = "Эйдис Погибель Тьмы",
+ ["Eye of C'Thun"] = "Око К'Туна",
+ ["Faction Champions"] = "Чемпионы фракций",
+ ["Fallen Champion"] = "Павший воитель",
+ Falric = "Фалрик",
+ ["Falric and Marwyn"] = "Фалрик и Марвин",
+ ["Fankriss the Unyielding"] = "Фанкрисс Неприклонный",
+ ["Fathom-Lord Karathress"] = "Повелитель глубин Каратресс",
+ Felmyst = "Пророк Скверны",
+ ["Fenrus the Devourer"] = "Фенрус Пожиратель",
+ ["Feral Defender"] = "Дикий защитник",
+ Festergut = "Тухлопуз",
+ Feugen = "Фойген",
+ ["Fineous Darkvire"] = "Точень Темнострой",
+ Firemaw = "Огнечрев",
+ ["Fjola Lightbane"] = "Фьола Погибель Света",
+ Flamegor = "Пламегор",
+ ["Flame Leviathan"] = "Огненный Левиафан",
+ ["Foreman Thistlenettle"] = "Штейгер Чертополох",
+ ["Forgemaster Garfrost"] = "Начальник кузни Гархлад",
+ -- ["Forgremaster Throngus"] = "",
+ ["Four Horsemen Chest"] = "Сундук Четырех Всадников",
+ ["Fras Siabi"] = "Фрас Сиаби",
+ Freya = "Фрейя",
+ ["Gahz'ranka"] = "Газ'ранка",
+ ["Gahz'rilla"] = "Газ'рилла",
+ ["Gal'darah"] = "Гал'дара",
+ ["Galgann Firehammer"] = "Галганн Огнемолот",
+ Garr = "Гарр",
+ ["Garrosh Hellscream"] = "Гаррош Адский Крик",
+ Gasher = "Ранокол",
+ ["Gatewatcher Gyro-Kill"] = "Страж ворот Точеный Нож",
+ ["Gatewatcher Iron-Hand"] = "Страж ворот Стальная Клешня",
+ ["Gathios the Shatterer"] = "Гатиос Изувер",
+ Gehennas = "Гееннас",
+ Gelihast = "Гелихаст",
+ Gelk = "Джелк",
+ ["General Angerforge"] = "Генерал Кузня Гнева",
+ ["General Bjarngrim"] = "Генерал Бьярнгрин",
+ ["General Drakkisath"] = "Генерал Драккисат",
+ ["General Rajaxx"] = "Генерал Раджакс",
+ -- ["General Umbriss"] = "",
+ ["General Vezax"] = "Генерал Везакс",
+ ["General Zarithrian"] = "Генерал Заритриан",
+ ["Ghamoo-ra"] = "Гхаму-ра",
+ ["Ghaz'an"] = "Газ'ан",
+ ["Ghok Bashguud"] = "Гок Крепкобив",
+ Gilnid = "Гилнид",
+ ["Gizrul the Slavener"] = "Гизрул Поработитель",
+ ["Gloom'rel"] = "Мрак'нел",
+ Gluth = "Глут",
+ Glutton = "Обжора",
+ ["Golemagg the Incinerator"] = "Маг-лорд из клана Гордок",
+ ["Golem Lord Argelmach"] = "Повелитель големов Аргелмах",
+ ["Goraluk Anvilcrack"] = "Горалук Треснувшая Наковальня",
+ ["Gormok the Impaler"] = "Гормок Пронзающий Бивень",
+ ["Gorosh the Dervish"] = "Горош Дервиш",
+ ["Gortok Palehoof"] = "Горток Бледное Копыто",
+ ["Gothik the Harvester"] = "Готик Жнец",
+ ["Grand Astromancer Capernian"] = "Верховный звездочет Каперниан",
+ ["Grand Champions"] = "Абсолютные чемпионы",
+ ["Grand Crusader Dathrohan"] = "Верховный рыцарь Датрохан",
+ ["Grand Magus Telestra"] = "Великая ведунья Телестра",
+ ["Grandmaster Vorpil"] = "Великий мастер Ворпил",
+ Grandmother = "Бабушка",
+ ["Grand Warlock Alythess"] = "Главная чернокнижница Алитесса",
+ ["Grand Warlock Nethekurse"] = "Главный чернокнижник Пустоклят",
+ ["Grand Widow Faerlina"] = "Великая вдова Фарлина",
+ ["Grethok the Controller"] = "Греток Регулятор",
+ ["Gri'lek"] = "Гри'лек",
+ Grimlok = "Гримлок",
+ Grizzle = "Гриззл",
+ Grobbulus = "Гроббулус",
+ Grubbis = "Грязнюк",
+ ["Gruul the Dragonkiller"] = "Груул Драконобой",
+ ["Guard Fengus"] = "Стражник Фенгус",
+ ["Guardian of Yogg-Saron"] = "Страж Йогг-Сарона",
+ ["Guard Mol'dar"] = "Стражник Мол'дар",
+ ["Guard Slip'kik"] = "Стражник Слип'кик",
+ ["Gurtogg Bloodboil"] = "Гуртогг Кипящая Кровь",
+ Gyth = "Гит",
+ Hadronox = "Хадронокс",
+ Hakkar = "Хаккар",
+ Halazzi = "Халаззи",
+ Halion = "Халион",
+ Halycon = "Халикон",
+ Hamhock = "Хрупконог",
+ ["Harbinger Skyriss"] = "Предвестник Скайрисс",
+ ["Hate'rel"] = "Злоб'рел",
+ ["Hazza'rah"] = "Хазза'рах",
+ Hazzas = "Хаззас",
+ ["Headless Horseman"] = "Всадник без головы",
+ ["Hearthsinger Forresten"] = "Певчий Форрестен",
+ ["Hedrum the Creeper"] = "Хедрум Ползун",
+ ["Heigan the Unclean"] = "Хейган Нечестивый",
+ ["Hellfire Channeler"] = "Чаротворец из цитадели Адского Пламени",
+ ["Henry Stern"] = "Генри Штерн",
+ ["Herald Volazj"] = "Глашатай Волаж",
+ Herod = "Герод",
+ ["Hex Lord Malacrass"] = "Повелитель проклятий Малакрасс",
+ ["High Astromancer Solarian"] = "Верховный звездочет Солариан",
+ ["High Botanist Freywinn"] = "Верховный ботаник Фрейвин",
+ ["High Inquisitor Fairbanks"] = "Верховный инквизитор Фэйрбанкс",
+ ["High Inquisitor Whitemane"] = "Верховный инквизитор Вайтмейн",
+ ["High Interrogator Gerstahn"] = "Верховный дознаватель Герштан",
+ ["High King Maulgar"] = "Король Молгар",
+ ["Highlord Mograine"] = "Верховный лорд Могрейн",
+ ["Highlord Omokk"] = "Вождь Омокк",
+ ["High Marshal Whirlaxis"] = "Маршал Кольцекрут",
+ ["High Nethermancer Zerevor"] = "Верховный пустомант Зеревор",
+ ["High Overlord Saurfang"] = "Верховный правитель Саурфанг",
+ ["High Priestess Arlokk"] = "Верховная жрица Арлокк",
+ ["High Priestess Jeklik"] = "Верховная жрица Джеклик",
+ ["High Priestess Mar'li"] = "Верховная жрица Мар'ли",
+ ["High Priestess of Thaurissan"] = "Верховная жрица Тауриссана",
+ ["High Priest Thekal"] = "Верховный жрец Текал",
+ ["High Priest Venoxis"] = "Верховный жрец Веноксис",
+ ["High Warlord Naj'entus"] = "Верховный Полководец Надж'ентус",
+ Hodir = "Ходир",
+ ["Houndmaster Grebmar"] = "Псарь Гребмар",
+ ["Houndmaster Loksey"] = "Псарь Локси",
+ Hukku = "Хукку",
+ Hungarfen = "Топеглад",
+ ["Hurley Blackbreath"] = "Харли Чернопых",
+ ["Hyakiss the Lurker"] = "Хиакисс Скрытень",
+ ["Hydromancer Thespia"] = "Гидромант Теспия",
+ ["Hydromancer Velratha"] = "Гидромант Велрата",
+ Hydrospawn = "Гидротварь",
+ ["Hydross the Unstable"] = "Гидросс Нестабильный",
+ ["Icecrown Gunship Battle"] = "Бой на кораблях",
+ Icehowl = "Ледяной Рев",
+ ["Ice Sphere"] = "Ледяная сфера",
+ Ichoron = "Гнойрон",
+ Ick = "Ик",
+ ["Ignis the Furnace Master"] = "Повелитель Горнов Игнис",
+ ["Illidan Stormrage"] = "Иллидан Ярость Бури",
+ ["Illidari Council"] = "Совет Иллидари",
+ ["Illyanna Ravenoak"] = "Иллиана Воронья Ольха",
+ ["Immol'thar"] = "Бессмер'тер",
+ ["Infinite Corruptor"] = "Осквернитель из рода Бесконечности",
+ ["Infinity Blades"] = "Клинки Бесконечности",
+ ["Ingvar the Plunderer"] = "Ингвар Расхититель",
+ ["Instructor Malicia"] = "Инструктор Коварница",
+ ["Instructor Razuvious"] = "Инструктор Разувий",
+ ["Interrogator Vishas"] = "Дознаватель Вишас",
+ Ionar = "Ионар",
+ Ironaya = "Иронайа",
+ Ironspine = "Железноспин",
+ Isalien = "Изалиен",
+ Jade = "Нефрит",
+ ["Jammal'an the Prophet"] = "Джаммал'ан Пророк",
+ ["Jan'alai"] = "Джан'алай",
+ ["Jandice Barov"] = "Джандис Барова",
+ ["Jedoga Shadowseeker"] = "Джедога Искательница Теней",
+ ["Jed Runewatcher"] = "Джед Руновед",
+ ["Jergosh the Invoker"] = "Жергош Призыватель Духов",
+ ["Jin'do the Hexxer"] = "Джин'до Проклинатель",
+ ["Jormungar Behemoth"] = "Йормунгарское чудовище",
+ Jormungars = "Йормунгары",
+ Julianne = "Джулианна",
+ ["Junk Bot"] = "Барахлобот",
+ ["Kael'thas Sunstrider"] = "Кель'тас Солнечный Скиталец",
+ Kalecgos = "Калесгос",
+ ["Kam Deepfury"] = "Кам Гневливый",
+ -- ["Karsh Steelbender"] = "",
+ ["Kazkaz the Unholy"] = "Казказ Нечистый",
+ ["Kaz'rogal"] = "Каз'рогал",
+ ["Keli'dan the Breaker"] = "Кели'дан Разрушитель",
+ ["Kel'Thuzad"] = "Кел'Тузад",
+ Keristrasza = "Керистраза",
+ ["Kiggler the Crazed"] = "Кигглер Безумный",
+ ["Kil'jaeden"] = "Кил'джеден",
+ ["Kil'rek"] = "Кил'рек",
+ ["King Dred"] = "Король Дред",
+ ["King Gordok"] = "Король Гордок",
+ ["King Llane Piece"] = "Король Ллейн",
+ ["King Ymiron"] = "Король Имирон",
+ ["Kirtonos the Herald"] = "Киртонос Глашатай",
+ ["Knot Thimblejack's Cache"] = "Тайник Уззла Наперстяка",
+ Kolk = "Колк",
+ Kologarn = "Кологарн",
+ ["Koralon the Flame Watcher"] = "Коралон Страж Огня",
+ Kormok = "Кормок",
+ Kresh = "Криг",
+ Krick = "Крик",
+ ["Krick and Ick"] = "Крик и Ик",
+ ["Krik'thir the Gatewatcher"] = "Крик'Тир Хранитель Врат",
+ ["Krosh Firehand"] = "Крош Огненная Рука",
+ Krystallus = "Кристаллус",
+ Kurinnaxx = "Куриннакс",
+ ["Lady Anacondra"] = "Повелительница Анакондра",
+ ["Lady Blaumeux"] = "Леди Бломе",
+ ["Lady Deathwhisper"] = "Леди Смертный Шепот",
+ ["Lady Illucia Barov"] = "Леди Иллюсия Барова",
+ ["Lady Malande"] = "Леди Маланда",
+ -- ["Lady Naz'jar"] = "",
+ ["Lady Sacrolash"] = "Леди Сакролаш",
+ ["Lady Sarevess"] = "Леди Саревесс",
+ ["Lady Vashj"] = "Леди Вайш",
+ Laj = "Ладж",
+ Landslide = "Сель",
+ Lavanthor = "Лавантор",
+ ["Left Arm"] = "Левая рука",
+ ["Leotheras the Blind"] = "Леотерас Слепец",
+ Lethon = "Летон",
+ Lethtendris = "Лефтендрис",
+ ["Leviathan Mk II"] = "Левиафан II",
+ ["Ley-Guardian Eregos"] = "Хранитель энергии Эрегос",
+ ["Lieutenant Drake"] = "Лейтенант Дрейк",
+ ["Lieutenant General Andorov"] = "Генерал-лейтенант Андоров",
+ Loatheb = "Лотхиб",
+ Loken = "Локен",
+ ["Lord Alexei Barov"] = "Лорд Алексей Баров",
+ ["Lord Cobrahn"] = "Лорд Кобран",
+ ["Lord Hel'nurath"] = "Лорд Хел'нурат",
+ ["Lord Incendius"] = "Лорд Опалитель",
+ ["Lord Jaraxxus"] = "Лорд Джараксус",
+ ["Lord Kazzak"] = "Лорд Каззак",
+ ["Lord Kri"] = "Лорд Кри",
+ ["Lord Marrowgar"] = "Лорд Ребрад",
+ ["Lord Pythas"] = "Лорд Питонас",
+ ["Lord Roccor"] = "Лорд Роккор",
+ ["Lord Sanguinar"] = "Лорд Сангвинар",
+ ["Lord Serpentis"] = "Лорд Серпентис",
+ ["Lord Skwol"] = "Лорд Сквол",
+ ["Lord Valthalak"] = "Лорд Вальтхалак",
+ ["Lord Victor Nefarius"] = "Лорд Виктор Нефариус",
+ ["Lord Vyletongue"] = "Лорд Злоязыкий",
+ ["Lorekeeper Polkelt"] = "Сказитель Полкелт",
+ ["Lorgus Jett"] = "Лоргус Джетт",
+ Loro = "Лоро",
+ Lucifron = "Люцифрон",
+ ["Mad Magglish"] = "Безумный Магглиш",
+ Maexxna = "Мексна",
+ ["Mage-Lord Urom"] = "Маг-лорд Уром",
+ ["Magister Kalendris"] = "Магистр Календрис",
+ ["Magistrate Barthilas"] = "Мировой судья Бартилас",
+ Magmadar = "Магмадар",
+ Magmus = "Магмус",
+ Magra = "Магра",
+ Magtheridon = "Магтеридон",
+ ["Maiden of Grief"] = "Дева Скорби",
+ ["Maiden of Virtue"] = "Благочестивая дева",
+ ["Majordomo Executus"] = "Мажордом Экзекутус",
+ Malacrass = "Малакрасс",
+ ["Maleki the Pallid"] = "Малекай Бледный",
+ ["Mal'Ganis"] = "Мал'Ганис",
+ Malygos = "Малигос",
+ Maraudos = "Мародос",
+ ["Marduk Blackpool"] = "Мардук Блэкпул",
+ ["Marisa du'Paige"] = "Мариса дю Пэж",
+ Marwyn = "Марвин",
+ ["Master Engineer Telonicus"] = "Старший инженер Телоникус",
+ ["Maur Grimtotem"] = "Маур Зловещий Тотем",
+ Meathook = "Мясной Крюк",
+ ["Mechano-Lord Capacitus"] = "Механо-лорд Конденсарон",
+ Medivh = "Медив",
+ ["Mekgineer Steamrigger"] = "Мекжинер Паропуск",
+ ["Mekgineer Thermaplugg"] = "Мекжинер Термоштепсель",
+ ["Mennu the Betrayer"] = "Менну Предатель",
+ ["Meshlok the Harvester"] = "Мешлок Жнец",
+ Midnight = "Полночь",
+ Mijan = "Миджан",
+ Mimiron = "Мимирон",
+ ["Miner Johnson"] = "Шахтер Джонсон",
+ ["Mistress of Pain"] = "Госпожа Боли",
+ Moam = "Моам",
+ Mogor = "Могор",
+ ["Mokra the Skullcrusher"] = "Мокра Дробитель Черепов",
+ Moorabi = "Мураби",
+ Moragg = "Морагг",
+ ["Mordresh Fire Eye"] = "Мордреш Огненный Глаз",
+ ["Mor Grayhoof"] = "Мор Серое Копыто",
+ Moroes = "Мороуз",
+ ["Morogrim Tidewalker"] = "Морогрим Волноступ",
+ Morphaz = "Морфаз",
+ ["Mother Shahraz"] = "Матушка Шахраз",
+ ["Mother Smolderweb"] = "Мать Дымная Паутина",
+ ["Mr. Smite"] = "Мистер Каюк",
+ ["Muradin Bronzebeard"] = "Мурадин Бронзобород",
+ ["Murkblood Twin"] = "Близнец Темной Крови",
+ ["Murkblood Twins"] = "Близнецы Темной Крови",
+ Murmur = "Бормотун",
+ ["Murta Grimgut"] = "Мурта Мрачнобрюх",
+ ["M'uru"] = "М'ару",
+ Mushgog = "Мушгог",
+ ["Mutanus the Devourer"] = "Мутанус Пожиратель",
+ Nalorakk = "Налоракк",
+ Nazan = "Назан",
+ Nefarian = "Нефариан",
+ ["Nekrum Gutchewer"] = "Некрум Кишкожуй",
+ ["Nerub'enkan"] = "Неруб'энкан",
+ ["Nethermancer Sepethrea"] = "Пустомант Сепетрея",
+ Netherspite = "Гнев Пустоты",
+ ["Netherstrand Longbow"] = "Длинный лук Края Пустоты",
+ ["Nexus-Prince Shaffar"] = "Принц Шаффар",
+ Nightbane = "Ночная Погибель",
+ ["Noth the Plaguebringer"] = "Нот Чумной",
+ ["Novos the Summoner"] = "Новос Призыватель",
+ Noxxion = "Ноксион",
+ ["Obsidian Sentinel"] = "Обсидиановый часовой",
+ ["Odo the Blindwatcher"] = "Одо Слепой Страж",
+ Oggleflint = "Огглфлинт",
+ ["Ogom the Wretched"] = "Огом Презренный",
+ Ohgan = "Охган",
+ ["Ok'thor the Breaker"] = "Ок'тор Разрушитель",
+ Olaf = "Олаф",
+ ["Old Serra'kis"] = "Старина Серракис",
+ ["Olm the Summoner"] = "Олм Созывающий",
+ ["Omor the Unscarred"] = "Омор Неодолимый",
+ Onyxia = "Ониксия",
+ -- ["Opera Event"] = "",
+ ["Orgrim's Hammer"] = "Молот Оргрима",
+ ["Ormorok the Tree-Shaper"] = "Орморок Воспитатель Дерев",
+ ["Oro Eyegouge"] = "Оро Вырвиглаз",
+ ["Ossirian the Unscarred"] = "Оссириан Неуязвимый",
+ Ouro = "Оуро",
+ ["Overlord Ramtusk"] = "Властитель Таранный Клык",
+ ["Overlord Wyrmthalak"] = "Властитель Змейталак",
+ ["Overmaster Pyron"] = "Подчинитель Пирон",
+ ["Overseer Tidewrath"] = "Наблюдатель Гнев Прилива",
+ -- Ozumat = "",
+ Pandemonius = "Пандемоний",
+ ["Panzor the Invincible"] = "Панцер Непобедимый",
+ Patchwerk = "Лоскутик",
+ ["Pathaleon the Calculator"] = "Паталеон Вычислитель",
+ Phalanx = "Фаланкс",
+ ["Phaseshift Bulwark"] = "Фазовый колет",
+ Pimgib = "Пимгиб",
+ ["Plaguemaw the Rotting"] = "Чумобрюх Гнилой",
+ ["Plugger Spazzring"] = "Штоппор Наливалс",
+ ["Postmaster Malown"] = "Почтальон Мэлоун",
+ ["Priestess Delrissa"] = "Жрица Делрисса",
+ ["Prince Keleseth"] = "Принц Келесет",
+ ["Prince Malchezaar"] = "Принц Малчезар",
+ ["Prince Skaldrenox"] = "Принц Скальдренокс",
+ ["Princess Huhuran"] = "Принцесса Хухуран",
+ ["Princess Moira Bronzebeard"] = "Принцесса Мойра Бронзобород",
+ ["Princess Tempestria"] = "Принцесса Бурилла",
+ ["Princess Theradras"] = "Принцесса Терадрас",
+ ["Princess Yauj"] = "Принцесса Яудж",
+ ["Prince Taldaram"] = "Принц Талдарам",
+ ["Prince Tenris Mirkblood"] = "Принц Тенрис Мутная Кровь",
+ ["Prince Tortheldrin"] = "Принц Тортелдрин",
+ ["Prince Valanar"] = "Принц Валанар",
+ ["Professor Putricide"] = "Профессор Мерзоцид",
+ ["Pure Spawn of Hydross"] = "Чистое порождение Гидросса",
+ Pusillin = "Пузиллин",
+ ["Pyroguard Emberseer"] = "Пиростраж Созерцатель Углей",
+ ["Pyromancer Loregrain"] = "Пироман Зерно Мудрости",
+ Quagmirran = "Квагмирран",
+ ["Quartermaster Zigris"] = "Интендант Зигрис",
+ ["Rage Winterchill"] = "Лютый Хлад",
+ Ragglesnout = "Круглорыл",
+ ["Raging Spirit"] = "Гневный дух",
+ Ragnaros = "Рагнарос",
+ ["Ramstein the Gorger"] = "Рамштайн Ненасытный",
+ ["Ras Frostwhisper"] = "Рас Ледяной Шепот",
+ Rattlegore = "Громоклин",
+ ["Razorclaw the Butcher"] = "Остроклык Мясник",
+ ["Razorgore the Untamed"] = "Бритвосмерт Неукротимый",
+ Razorlash = "Бритвохлест",
+ Razorscale = "Острокрылая",
+ ["Reliquary of Souls"] = "Гробница душ",
+ Renataki = "Ренатаки",
+ ["Restless Skeleton"] = "Недремлющий скелет",
+ Rethilgore = "Ретилгор",
+ Revelosh = "Ревелош",
+ ["Rhahk'Zor"] = "Рак'Зор",
+ ["Ribbly Screwspigot"] = "Риббли Крутипроб",
+ ["Right Arm"] = "Правая рука",
+ -- ["Ring of Law"] = "",
+ Roar = "Хохотун",
+ ["Rokad the Ravager"] = "Рокад Опустошитель",
+ ["Rokdar the Sundered Lord"] = "Рокдар Покинутый Лорд",
+ ["Rokmar the Crackler"] = "Рокмар Трескун",
+ -- ["Rom'ogg Bonecrusher"] = "",
+ Romulo = "Ромуло",
+ ["Romulo & Julianne"] = "Ромуло и Джульенна",
+ Roogug = "Ругуг",
+ Rotface = "Гниломорд",
+ Rotgrip = "Гнилопасть",
+ ["Runemaster Molgeim"] = "Мастер рун Молгейм",
+ ["Runok Wildmane"] = "Рунок Буйногривый",
+ Ruuzlu = "Руузлу",
+ ["Salramm the Fleshcrafter"] = "Салрамм Плоторез",
+ ["Sanctum Sentry"] = "Часовой святилища",
+ ["Sandarr Dunereaver"] = "Сандарр Разоритель Барханов",
+ ["Sandfury Executioner"] = "Палач из клана Песчаной Бури",
+ Sapphiron = "Сапфирон",
+ Sara = "Сара",
+ ["Saronite Animus"] = "Саронитовый враг",
+ Sartharion = "Сартарион",
+ ["Sathrovarr the Corruptor"] = "Сатроварр Осквернитель",
+ ["Saviana Ragefire"] = "Савиана Огненная Пропасть",
+ ["Scarlet Commander Mograine"] = "Командир Могрейн из Алого ордена",
+ ["Scourgelord Tyrannus"] = "Повелитель Плети Тираний",
+ ["Seeth'rel"] = "Сит'рел",
+ ["Selin Fireheart"] = "Селин Огненное Сердце",
+ ["Sergeant Bly"] = "Сержант Блай",
+ ["Shade of Akama"] = "Тень Акамы",
+ ["Shade of Aran"] = "Тень Арана",
+ ["Shade of Eranikus"] = "Тень Эраникуса",
+ ["Shadikith the Glider"] = "Шадикит Скользящий",
+ ["Shadow Hunter Vosh'gajin"] = "Темная охотница Вос'гаджин",
+ ["Shadow of Leotheras"] = "Тень Леотераса",
+ ["Shadowpriest Sezz'ziz"] = "Темный жрец Шезз'зиз",
+ Shadron = "Шадрон",
+ Shazzrah = "Шаззрах",
+ ["Shirrak the Dead Watcher"] = "Ширрак Страж Мертвых",
+ Sindragosa = "Синдрагоса",
+ ["Sir Zeliek"] = "Сэр Зелиек",
+ ["Sjonnir The Ironshaper"] = "Сьоннир Литейщик",
+ ["Skadi the Ruthless"] = "Скади Безжалостный",
+ ["Skarr the Unbreakable"] = "Скарр Непреклонный",
+ ["Skarvald the Constructor"] = "Скальвард Строитель",
+ ["Skra'gath"] = "Скрагат",
+ Skul = "Череп",
+ Skum = "Шкам",
+ ["Slad'ran"] = "Слад'ран",
+ Sneed = "Снид",
+ ["Sneed's Shredder"] = "Крошшер Снида",
+ ["Solakar Flamewreath"] = "Солакарский огнечервь",
+ ["Solarium Agent"] = "Агент Солнечной террасы",
+ ["Solarium Priest"] = "Жрец Солнечной террасы",
+ ["Spirestone Battle Lord"] = "Полководец из клана Черной Вершины",
+ ["Spirestone Butcher"] = "Мясник из клана Черной Вершины",
+ ["Spirestone Lord Magus"] = "Лорд-волхв из клана Черной Вершины",
+ ["Staff of Disintegration"] = "Посох Распыления",
+ Stalagg = "Сталагг",
+ Steelbreaker = "Сталелом",
+ ["Stomper Kreeg"] = "Топотун Криг",
+ Stonespine = "Каменный Гребень",
+ ["Stormcaller Brundir"] = "Буревестник Брундир",
+ Strawman = "Балбес",
+ ["Sulfuron Harbinger"] = "Предвестник Сульфурон",
+ Supremus = "Супремус",
+ ["Svala Sorrowgrave"] = "Свала Вечноскорбящая",
+ ["Swamplord Musel'ek"] = "Владыка болота Мусел'ек",
+ Taerar = "Таэрар",
+ ["Tainted Spawn of Hydross"] = "Оскверненное порождение Гидросса",
+ ["Talon King Ikiss"] = "Король воронов Айкисс",
+ ["Taragaman the Hungerer"] = "Тарагаман Ненасытный",
+ ["Targorr the Dread"] = "Таргорр Ужасный",
+ Tavarok = "Таварок",
+ Techbot = "Техбот",
+ Temporus = "Темпорус",
+ ["Tendris Warpwood"] = "Тендрис Криводрев",
+ Tenebron = "Тенеброн",
+ ["Terestian Illhoof"] = "Терестиан Больное Копыто",
+ ["Teron Gorefiend"] = "Терон Кровожад",
+ Thaddius = "Таддиус",
+ ["Thaladred the Darkener"] = "Таладред Затемнитель",
+ ["Thane Korth'azz"] = "Тан Кортазз",
+ ["The Beast"] = "Зверь",
+ ["The Beasts of Northrend"] = "Нордскольские чудовища",
+ ["The Big Bad Wolf"] = "Злой и страшный серый волк",
+ ["The Black Knight"] = "Черный рыцарь",
+ ["The Black Stalker"] = "Черная Охотница",
+ ["The Blue Brothers"] = "Синие братья",
+ ["The Bug Family"] = "Семейство насекомых",
+ ["The Crone"] = "Ведьма",
+ ["The Curator"] = "Смотритель",
+ ["The Eredar Twins"] = "Близнецы Эредара",
+ ["The Four Horsemen"] = "Четыре Всадника",
+ ["The Illidari Council"] = "Совет Иллидари",
+ ["The Iron Council"] = "Железное собрание",
+ ["Theka the Martyr"] = "Тека Мученик",
+ ["The Lich King"] = "Король-лич",
+ -- ["The Lost Dwarves"] = "",
+ ["The Lurker Below"] = "Скрытень глубин",
+ ["The Maker"] = "Мастер",
+ ["The Prophet Skeram"] = "Пророк Скерам",
+ ["The Prophet Tharon'ja"] = "Пророк Тарон'джа",
+ ["The Ravenian"] = "Равениан",
+ ["The Razza"] = "Разза",
+ ["The Seven Dwarves"] = "Темные хранители",
+ ["The Skybreaker"] = "Усмиритель небес",
+ ["The Tribunal of Ages"] = "Трибунал веков",
+ ["The Twin Emperors"] = "Близнецы Императора",
+ ["The Twin Val'kyr"] = "Валь'киры-близнецы",
+ ["The Unforgiven"] = "Непрощенный",
+ ["The Windreaver"] = "Ветробой",
+ Thorim = "Торим",
+ ["Thorngrin the Tender"] = "Скалезуб Скорбный",
+ ["Tidewalker Lurker"] = "Приливный крадень",
+ ["Timmy the Cruel"] = "Тайлер",
+ Tinhead = "Медноголовый",
+ ["Tinkerer Gizlock"] = "Ремонтник Гизлок",
+ ["Tirion Fordring"] = "Тирион Фордринг",
+ Tito = "Тито",
+ ["Toravon the Ice Watcher"] = "Торавон Страж Льда",
+ ["Trigore the Lasher"] = "Тригор Хлестун",
+ Trollgore = "Кровотролль",
+ ["Tsu'zee"] = "Цу'зи",
+ ["Tuten'kash"] = "Тутен'каш",
+ ["Twilight Lord Kelris"] = "Повелитель сумрака Келрис",
+ ["Urok Doomhowl"] = "Аррок Смертный Вопль",
+ ["Vaelastrasz the Corrupt"] = "Валестраз Порочный",
+ ["Valithria Dreamwalker"] = "Валитрия Сноходица",
+ ["Val'kyr Shadowguard"] = "Валь'кира - страж Тьмы",
+ ["Varian Wrynn"] = "Вариан Ринн",
+ ["Varos Cloudstrider"] = "Варос Заоблачный Странник",
+ Vazruden = "Вазруден",
+ ["Vazruden the Herald"] = "Геральд Вазруден",
+ Vectus = "Вектус",
+ Vem = "Вем",
+ Veng = "Венг",
+ ["Veras Darkshadow"] = "Верас Глубокий Мрак",
+ ["Verdan the Everliving"] = "Вердан Бессмертный",
+ Verek = "Верек",
+ Vesperon = "Весперон",
+ Vexallus = "Вексалиус",
+ ["Veyzhak the Cannibal"] = "Вейжак Каннибал",
+ ["Vile'rel"] = "Гнус'рел",
+ Viscidus = "Нечистотон",
+ ["Viscous Fallout"] = "Липкая муть",
+ ["Void Reaver"] = "Страж Бездны",
+ Volkhan = "Волхан",
+ ["VX-001"] = "VX-001",
+ ["Warbringer O'mrogg"] = "О'мрогг Завоеватель",
+ ["Warchief Blackhand Piece"] = "Боевой вождь Чернорук",
+ ["Warchief Kargath Bladefist"] = "Вождь Каргат Острорук",
+ ["Warchief Rend Blackhand"] = "Вождь Ренд Чернорук",
+ ["Warden Mellichar"] = "Страж Мелличар",
+ ["Warder Stilgiss"] = "Тюремщик Стилгисс",
+ ["Warlord Kalithresh"] = "Полководец Калитреш",
+ ["War Master Voone"] = "Воевода Вун",
+ ["Warmaul Champion"] = "Чемпион клана Боевого Молота",
+ ["Warp Slicer"] = "Искореженная ломтерезка",
+ ["Warp Splinter"] = "Узлодревень",
+ ["Watchkeeper Gargolmar"] = "Начальник стражи Гарголмар",
+ Weaver = "Ткачик",
+ ["Witch Doctor Zum'rah"] = "Знахарь Зум'рах",
+ ["Wolf Master Nandos"] = "Командир воргенов Нандос",
+ ["Wrath-Scryer Soccothrates"] = "Провидец Гнева Соккорат",
+ Wushoolay = "Вушулай",
+ Xevozz = "Ксевозз",
+ ["XT-002 Deconstructor"] = "Разрушитель XT-002",
+ ["Yogg-Saron"] = "Йогг-Сарон",
+ Yor = "Йор",
+ Ysondre = "Исондра",
+ Zekkis = "Зеккис",
+ ["Zelemar the Wrathful"] = "Зелемар Гневный",
+ ["Zereketh the Unbound"] = "Зерекет Бездонный",
+ Zerillis = "Зериллис",
+ ["Zevrim Thornhoof"] = "Зеврим Терновое Копыто",
+ Zolo = "Золо",
+ ["Zul'Farrak Dead Hero"] = "Мертвый Герой Зул'Фаррака",
+ ["Zul'jin"] = "Зул'джин",
+ ["Zul'Lor"] = "Зул'Лор",
+ ["Zul'tore"] = "Зул'тор",
+ ["Zuramat the Obliterator"] = "Зурамат Уничтожитель",
+}
+elseif GAME_LOCALE == "zhCN" then
+ lib:SetCurrentTranslations {
+ Acidmaw = "酸喉",
+ Aeonus = "埃欧努斯",
+ ["Aerial Command Unit"] = "空中指挥单位",
+ ["Agathelos the Raging"] = "暴怒的阿迦赛罗斯",
+ ["Aggem Thorncurse"] = "阿格姆",
+ Ahune = "埃霍恩",
+ ["Akil'zon"] = "埃基尔松",
+ ["Aku'mai"] = "阿库麦尔",
+ ["Al'ar"] = "奥",
+ ["Algalon the Observer"] = "观察者奥尔加隆",
+ ["Alzzin the Wildshaper"] = "奥兹恩",
+ Amanitar = "埃曼尼塔",
+ ["Ambassador Flamelash"] = "弗莱拉斯大使",
+ ["Ambassador Hellmaw"] = "赫尔默大使",
+ ["Amnennar the Coldbringer"] = "寒冰之王亚门纳尔",
+ ["Ancient Stone Keeper"] = "古代的石头看守者",
+ Anetheron = "安纳塞隆",
+ ["Anger'rel"] = "安格雷尔",
+ Anomalus = "阿诺玛鲁斯",
+ ["Antu'sul"] = "安图苏尔",
+ ["Anub'arak"] = "阿努巴拉克",
+ ["Anubisath Defender"] = "阿努比萨斯防御者",
+ ["Anubisath Guardian"] = "阿努比萨斯守卫者",
+ ["Anub'Rekhan"] = "阿努布雷坎",
+ ["Anub'shiah"] = "阿努希尔",
+ Anzu = "安苏",
+ ["Arcane Watchman"] = "奥术看守",
+ ["Arcanist Doan"] = "奥法师杜安",
+ Archaedas = "阿扎达斯",
+ ["Archavon the Stone Watcher"] = "岩石看守者阿尔卡冯",
+ Archimonde = "阿克蒙德",
+ ["Archivist Galford"] = "档案管理员加尔福特",
+ ["Archmage Arugal"] = "大法师阿鲁高",
+ ["Argent Confessor Paletress"] = "银色神官帕尔崔丝",
+ ["Arugal's Voidwalker"] = "阿鲁高的虚空行者",
+ ["Ascendant Lord Obsidius"] = "Ascendant Lord Obsidius", -- Needs review
+ ["Assault Bot"] = "突击机器人",
+ ["Assembly of Iron"] = "钢铁议会",
+ ["Atal'alarion"] = "阿塔拉利恩",
+ ["Attumen the Huntsman"] = "猎手阿图门",
+ Auriaya = "欧尔莉亚",
+ Avalanchion = "阿瓦兰奇奥",
+ ["Avatar of Hakkar"] = "哈卡的化身",
+ ["Ayamiss the Hunter"] = "狩猎者阿亚米斯",
+ Azgalor = "阿兹加洛",
+ ["Azshir the Sleepless"] = "永醒的艾希尔",
+ Azuregos = "艾索雷葛斯",
+ ["Bael'Gar"] = "贝尔加",
+ Baelog = "巴尔洛戈",
+ Balnazzar = "巴纳扎尔",
+ ["Baltharus the Warborn"] = "战争之子巴尔萨鲁斯",
+ ["Bannok Grimaxe"] = "班诺克·巨斧",
+ ["Baron Aquanis"] = "阿奎尼斯男爵",
+ ["Baron Charr"] = "火焰男爵查尔",
+ ["Baroness Anastari"] = "安娜丝塔丽男爵夫人",
+ ["Baron Geddon"] = "迦顿男爵",
+ ["Baron Kazum"] = "卡苏姆男爵",
+ ["Baron Rivendare"] = "瑞文戴尔男爵",
+ ["Baron Silverlaine"] = "席瓦莱恩男爵",
+ ["Battleguard Sartura"] = "沙尔图拉",
+ ["Bazil Thredd"] = "巴基尔·斯瑞德",
+ Bazzalan = "巴扎兰",
+ Beauty = "Beauty", -- Needs review
+ ["Black Guard Swordsmith"] = "黑衣守卫铸剑师",
+ ["Blackheart the Inciter"] = "煽动者布莱卡特",
+ ["Blindeye the Seer"] = "盲眼先知",
+ ["Blind Hunter"] = "盲眼猎手",
+ ["Blood Guard Porung"] = "血卫士伯鲁恩",
+ ["Bloodlord Mandokir"] = "血领主曼多基尔",
+ ["Bloodmage Thalnos"] = "血法师萨尔诺斯",
+ ["Blood Prince Council"] = "鲜血王子议会",
+ ["Blood Princes"] = "鲜血王子",
+ ["Blood-Queen Lana'thel"] = "鲜血女王兰娜瑟尔",
+ ["Blood Steward of Kirtonos"] = "基尔图诺斯的卫士",
+ Boahn = "博艾恩",
+ ["Bomb Bot"] = "炸弹机器人",
+ ["Brain of Yogg-Saron"] = "尤格-萨隆的大脑",
+ ["Brainwashed Noble"] = "被洗脑的贵族",
+ Broggok = "布洛戈克",
+ Brokentoe = "断蹄",
+ Bronjahm = "布隆亚姆",
+ ["Broodlord Lashlayer"] = "勒什雷尔",
+ ["Bruegal Ironknuckle"] = "布鲁高·铁拳",
+ Brutallus = "布鲁塔卢斯",
+ ["Burning Felguard"] = "燃烧地狱卫士",
+ ["Buru the Gorger"] = "吞咽者布鲁",
+ ["Cache of the Firelord"] = "火焰之王的宝箱",
+ ["Cache of the Legion"] = "军团宝箱",
+ ["Cannon Master Willey"] = "炮手威利",
+ ["Captain Greenskin"] = "绿皮队长",
+ ["Captain Kromcrush"] = "克罗卡斯",
+ ["Captain Skarloc"] = "斯卡洛克上尉",
+ ["Celebras the Cursed"] = "被诅咒的塞雷布拉斯",
+ ["Charlga Razorflank"] = "卡尔加·刺肋",
+ ["Chess Event"] = "国际象棋",
+ ["Chest of The Seven"] = "七贤之箱",
+ ["Chief Ukorz Sandscalp"] = "乌克兹·沙顶",
+ ["Cho'Rush the Observer"] = "观察者克鲁什",
+ Chromaggus = "克洛玛古斯",
+ ["Chrono Lord Deja"] = "时空领主德亚",
+ ["Chrono-Lord Epoch"] = "时光领主埃博克",
+ Claw = "克劳恩",
+ ["Coilfang Elite"] = "盘牙精英",
+ ["Coilfang Strider"] = "盘牙巡逻者",
+ ["Commander Kolurg"] = "指挥官库鲁尔格",
+ ["Commander Sarannis"] = "指挥官萨拉妮丝",
+ ["Commander Springvale"] = "指挥官斯普林瓦尔",
+ ["Commander Stoutbeard"] = "指挥官斯托比德",
+ ["Commander Ulthok"] = "Commander Ulthok", -- Needs review
+ ["Constructor & Controller"] = "建筑师与控制者",
+ Cookie = "曲奇",
+ ["Coren Direbrew"] = "科林·烈酒",
+ ["Corla, Herald of Twilight"] = "Corla, Herald of Twilight", -- Needs review
+ ["Cosmic Infuser"] = "宇宙灌注者",
+ ["Crimson Hammersmith"] = "红衣铸锤师",
+ ["Crowd Pummeler 9-60"] = "群体打击者9-60",
+ ["Crystal Fang"] = "水晶之牙",
+ ["C'Thun"] = "克苏恩",
+ Cyanigosa = "塞安妮苟萨",
+ ["Dalliah the Doomsayer"] = "末日预言者达尔莉安",
+ ["Dalronn the Controller"] = "控制者达尔隆",
+ ["Dark Coffer"] = "黑暗宝箱",
+ ["Dark Iron Ambassador"] = "黑铁大师",
+ ["Darkmaster Gandling"] = "黑暗院长加丁",
+ ["Darkweaver Syth"] = "黑暗编织者塞斯",
+ ["Deathbound Ward"] = "缚亡守卫",
+ ["Deathbringer Saurfang"] = "死亡使者萨鲁法尔",
+ ["Death Knight Darkreaver"] = "死亡骑士达克雷尔",
+ ["Death Knight Understudy"] = "见习死亡骑士",
+ ["Deathspeaker High Priest"] = "亡语高阶祭司",
+ ["Death Speaker Jargba"] = "亡语者贾格巴",
+ ["Deathstalker Visceri"] = "死亡猎手维瑟里",
+ ["Deathsworn Captain"] = "死亡之誓",
+ Devastation = "毁坏",
+ ["Deviate Faerie Dragon"] = "变异精灵龙",
+ ["Devourer of Souls"] = "噬魂者",
+ ["Dextren Ward"] = "迪克斯特·瓦德",
+ ["Digmaster Shovelphlange"] = "挖掘专家舒尔弗拉格",
+ ["Doctor Theolen Krastinov"] = "瑟尔林·卡斯迪诺夫教授",
+ ["Doom Lord Kazzak"] = "末日领主卡扎克",
+ ["Doom'rel"] = "杜姆雷尔",
+ Doomwalker = "末日行者",
+ ["Dope'rel"] = "多普雷尔",
+ Dorothee = "多萝茜",
+ ["Drahga Shodowburner"] = "Drahga Shodowburner", -- Needs review
+ ["Drakkari Colossus"] = "达卡莱巨像",
+ ["Drakos the Interrogator"] = "审讯者达库斯",
+ Dreadscale = "恐鳞",
+ Dreamscythe = "德姆塞卡尔",
+ ["Dust Covered Chest"] = "灰尘覆盖的箱子",
+ Dustwraith = "灰尘怨灵",
+ ["Eadric the Pure"] = "纯洁者耶德瑞克",
+ ["Earthcaller Halmgar"] = "唤地者哈穆加",
+ Ebonroc = "埃博诺克",
+ ["Eck the Ferocious"] = "凶残的伊克",
+ ["Edwin VanCleef"] = "艾德温·范克里夫",
+ ["Elder Brightleaf"] = "明叶长老",
+ ["Elder Ironbranch"] = "铁枝长老",
+ ["Elder Nadox"] = "纳多克斯长老",
+ ["Elder Stonebark"] = "石树长老",
+ ["Electrocutioner 6000"] = "电刑器6000型",
+ ["Emalon the Storm Watcher"] = "风暴看守者埃玛尔隆",
+ Emeriss = "艾莫莉丝",
+ ["Emperor Dagran Thaurissan"] = "达格兰·索瑞森大帝",
+ ["Emperor Vek'lor"] = "维克洛尔大帝",
+ ["Emperor Vek'nilash"] = "维克尼拉斯大帝",
+ Entropius = "熵魔",
+ ["Eonar's Gift"] = "艾欧娜尔的礼物",
+ ["Epoch Hunter"] = "时空猎手",
+ Erekem = "埃雷克姆",
+ ["Eressea Dawnsinger"] = "伊蕾希亚·晨歌",
+ ["Eric \"The Swift\""] = "埃瑞克",
+ Erudax = "Erudax", -- Needs review
+ ["Erunak Stonespeaker"] = "Erunak Stonespeaker", -- Needs review
+ ["Essence of Anger"] = "愤怒精华",
+ ["Essence of Desire"] = "欲望精华",
+ ["Essence of Suffering"] = "苦痛精华",
+ Eviscerator = "剜眼者",
+ ["Exarch Maladaar"] = "大主教玛拉达尔",
+ ["Expedition Commander"] = "远征军指挥官",
+ ["Eydis Darkbane"] = "黑暗邪使艾蒂丝",
+ ["Eye of C'Thun"] = "克苏恩之眼",
+ ["Faction Champions"] = "阵营冠军",
+ ["Fallen Champion"] = "死灵勇士",
+ Falric = "法瑞克",
+ ["Falric and Marwyn"] = "法瑞克和玛维恩",
+ ["Fankriss the Unyielding"] = "顽强的范克瑞斯",
+ ["Fathom-Lord Karathress"] = "深水领主卡拉瑟雷斯",
+ Felmyst = "菲米丝",
+ ["Fenrus the Devourer"] = "吞噬者芬鲁斯",
+ ["Feral Defender"] = "野性防御者",
+ Festergut = "烂肠",
+ Feugen = "费尔根",
+ ["Fineous Darkvire"] = "弗诺斯·达克维尔",
+ Firemaw = "费尔默",
+ ["Fjola Lightbane"] = "光明邪使菲奥拉",
+ Flamegor = "弗莱格尔",
+ ["Flame Leviathan"] = "烈焰巨兽",
+ ["Foreman Thistlenettle"] = "工头希斯耐特",
+ ["Forgemaster Garfrost"] = "熔炉之主加弗斯特",
+ ["Forgremaster Throngus"] = "Forgremaster Throngus", -- Needs review
+ ["Four Horsemen Chest"] = "四骑士之箱",
+ ["Fras Siabi"] = "弗拉斯·希亚比",
+ Freya = "弗蕾亚",
+ ["Gahz'ranka"] = "加兹兰卡",
+ ["Gahz'rilla"] = "加兹瑞拉",
+ ["Gal'darah"] = "迦尔达拉",
+ ["Galgann Firehammer"] = "加加恩·火锤",
+ Garr = "加尔",
+ ["Garrosh Hellscream"] = "加尔鲁什·地狱咆哮",
+ Gasher = "加什尔",
+ ["Gatewatcher Gyro-Kill"] = "看守者盖罗基尔",
+ ["Gatewatcher Iron-Hand"] = "看守者埃隆汉",
+ ["Gathios the Shatterer"] = "击碎者加西奥斯",
+ Gehennas = "基赫纳斯",
+ Gelihast = "格里哈斯特",
+ Gelk = "吉尔克",
+ ["General Angerforge"] = "安格弗将军",
+ ["General Bjarngrim"] = "比亚格里将军",
+ ["General Drakkisath"] = "达基萨斯将军",
+ ["General Rajaxx"] = "拉贾克斯将军",
+ ["General Umbriss"] = "General Umbriss", -- Needs review
+ ["General Vezax"] = "维扎克斯将军",
+ ["General Zarithrian"] = "萨瑞瑟里安将军",
+ ["Ghamoo-ra"] = "加摩拉",
+ ["Ghaz'an"] = "加兹安",
+ ["Ghok Bashguud"] = "霍克·巴什古德",
+ Gilnid = "基尔尼格",
+ ["Gizrul the Slavener"] = "奴役者基兹鲁尔",
+ ["Gloom'rel"] = "格鲁雷尔",
+ Gluth = "格拉斯",
+ Glutton = "暴食者",
+ ["Golemagg the Incinerator"] = "焚化者古雷曼格",
+ ["Golem Lord Argelmach"] = "傀儡统帅阿格曼奇",
+ ["Goraluk Anvilcrack"] = "古拉鲁克",
+ ["Gormok the Impaler"] = "穿刺者哥莫克",
+ ["Gorosh the Dervish"] = "修行者高罗什",
+ ["Gortok Palehoof"] = "戈托克·苍蹄",
+ ["Gothik the Harvester"] = "收割者戈提克",
+ ["Grand Astromancer Capernian"] = "星术师卡波妮娅",
+ ["Grand Champions"] = "总冠军",
+ ["Grand Crusader Dathrohan"] = "大十字军战士达索汉",
+ ["Grand Magus Telestra"] = "大魔导师泰蕾丝塔",
+ ["Grandmaster Vorpil"] = "沃匹尔大师",
+ Grandmother = "老奶奶",
+ ["Grand Warlock Alythess"] = "高阶术士奥蕾塞丝",
+ ["Grand Warlock Nethekurse"] = "高阶术士奈瑟库斯",
+ ["Grand Widow Faerlina"] = "黑女巫法琳娜",
+ ["Grethok the Controller"] = "黑翼控制者",
+ ["Gri'lek"] = "格里雷克",
+ Grimlok = "格瑞姆洛克",
+ Grizzle = "格里兹尔",
+ Grobbulus = "格罗布鲁斯",
+ Grubbis = "格鲁比斯",
+ ["Gruul the Dragonkiller"] = "屠龙者格鲁尔",
+ ["Guard Fengus"] = "卫兵芬古斯",
+ ["Guardian of Yogg-Saron"] = "尤格-萨隆的卫士",
+ ["Guard Mol'dar"] = "卫兵摩尔达",
+ ["Guard Slip'kik"] = "卫兵斯里基克",
+ ["Gurtogg Bloodboil"] = "古尔图格·血沸",
+ Gyth = "盖斯",
+ Hadronox = "哈多诺克斯",
+ Hakkar = "哈卡",
+ Halazzi = "哈尔拉兹",
+ Halion = "海里昂",
+ Halycon = "哈雷肯",
+ Hamhock = "哈姆霍克",
+ ["Harbinger Skyriss"] = "预言者斯克瑞斯",
+ ["Hate'rel"] = "黑特雷尔",
+ ["Hazza'rah"] = "哈扎拉尔",
+ Hazzas = "哈扎斯",
+ ["Headless Horseman"] = "无头骑士",
+ ["Hearthsinger Forresten"] = "弗雷斯特恩",
+ ["Hedrum the Creeper"] = "爬行者赫杜姆",
+ ["Heigan the Unclean"] = "肮脏的希尔盖",
+ ["Hellfire Channeler"] = "地狱火导魔者",
+ ["Henry Stern"] = "亨利·斯特恩",
+ ["Herald Volazj"] = "传令官沃拉兹",
+ Herod = "赫洛德",
+ ["Hex Lord Malacrass"] = "妖术领主玛拉卡斯",
+ ["High Astromancer Solarian"] = "大星术师索兰莉安",
+ ["High Botanist Freywinn"] = "高级植物学家弗雷温",
+ ["High Inquisitor Fairbanks"] = "大检察官法尔班克斯",
+ ["High Inquisitor Whitemane"] = "大检察官怀特迈恩",
+ ["High Interrogator Gerstahn"] = "审讯官格斯塔恩",
+ ["High King Maulgar"] = "莫加尔大王",
+ ["Highlord Mograine"] = "大领主莫格莱尼",
+ ["Highlord Omokk"] = "欧莫克大王",
+ ["High Marshal Whirlaxis"] = "大元帅维拉希斯",
+ ["High Nethermancer Zerevor"] = "高阶灵术师塞勒沃尔",
+ ["High Overlord Saurfang"] = "萨鲁法尔大王",
+ ["High Priestess Arlokk"] = "高阶祭司娅尔罗",
+ ["High Priestess Jeklik"] = "高阶祭司耶克里克",
+ ["High Priestess Mar'li"] = "高阶祭司玛尔里",
+ ["High Priestess of Thaurissan"] = "索瑞森高阶女祭司",
+ ["High Priest Thekal"] = "高阶祭司塞卡尔",
+ ["High Priest Venoxis"] = "高阶祭司温诺希斯",
+ ["High Warlord Naj'entus"] = "高阶督军纳因图斯",
+ Hodir = "霍迪尔",
+ ["Houndmaster Grebmar"] = "驯犬者格雷布玛尔",
+ ["Houndmaster Loksey"] = "驯犬者洛克希",
+ Hukku = "胡库",
+ Hungarfen = "霍加尔芬",
+ ["Hurley Blackbreath"] = "霍尔雷·黑须",
+ ["Hyakiss the Lurker"] = "潜伏者希亚其斯",
+ ["Hydromancer Thespia"] = "水术师瑟丝比娅",
+ ["Hydromancer Velratha"] = "水占师维蕾萨",
+ Hydrospawn = "海多斯博恩",
+ ["Hydross the Unstable"] = "不稳定的海度斯",
+ ["Icecrown Gunship Battle"] = "冰冠炮舰战斗",
+ Icehowl = "冰吼",
+ ["Ice Sphere"] = "Ice Sphere", -- Needs review
+ Ichoron = "艾库隆",
+ Ick = "伊克",
+ ["Ignis the Furnace Master"] = "掌炉者伊格尼斯",
+ ["Illidan Stormrage"] = "伊利丹·怒风",
+ ["Illidari Council"] = "伊利达雷议会",
+ ["Illyanna Ravenoak"] = "伊琳娜·暗木",
+ ["Immol'thar"] = "伊莫塔尔",
+ ["Infinite Corruptor"] = "永恒腐蚀者",
+ ["Infinity Blades"] = "无尽之刃",
+ ["Ingvar the Plunderer"] = "劫掠者因格瓦尔",
+ ["Instructor Malicia"] = "讲师玛丽希亚",
+ ["Instructor Razuvious"] = "教官拉苏维奥斯",
+ ["Interrogator Vishas"] = "审讯员韦沙斯",
+ Ionar = "艾欧纳尔",
+ Ironaya = "艾隆纳亚",
+ Ironspine = "铁脊死灵",
+ Isalien = "伊萨利恩",
+ Jade = "玉龙",
+ ["Jammal'an the Prophet"] = "预言者迦玛兰",
+ ["Jan'alai"] = "加亚莱",
+ ["Jandice Barov"] = "詹迪斯·巴罗夫",
+ ["Jedoga Shadowseeker"] = "耶戈达·觅影者",
+ ["Jed Runewatcher"] = "杰德",
+ ["Jergosh the Invoker"] = "祈求者耶戈什",
+ ["Jin'do the Hexxer"] = "妖术师金度",
+ ["Jormungar Behemoth"] = "蛰猛巨虫",
+ Jormungars = "冰虫",
+ Julianne = "朱丽叶",
+ ["Junk Bot"] = "废物机器人",
+ ["Kael'thas Sunstrider"] = "凯尔萨斯·逐日者",
+ Kalecgos = "卡雷苟斯",
+ ["Kam Deepfury"] = "卡姆·深怒",
+ ["Karsh Steelbender"] = "Karsh Steelbender", -- Needs review
+ ["Kazkaz the Unholy"] = "邪恶的卡萨卡兹",
+ ["Kaz'rogal"] = "卡兹洛加",
+ ["Keli'dan the Breaker"] = "击碎者克里丹",
+ ["Kel'Thuzad"] = "克尔苏加德",
+ Keristrasza = "克莉斯塔萨",
+ ["Kiggler the Crazed"] = "疯狂的基戈尔",
+ ["Kil'jaeden"] = "基尔加丹",
+ ["Kil'rek"] = "基尔里克",
+ ["King Dred"] = "暴龙之王爵德",
+ ["King Gordok"] = "戈多克大王",
+ ["King Llane Piece"] = "莱恩国王",
+ ["King Ymiron"] = "伊米隆国王",
+ ["Kirtonos the Herald"] = "传令官基尔图诺斯",
+ ["Knot Thimblejack's Cache"] = "诺特·希姆加克的储物箱",
+ Kolk = "考尔克",
+ Kologarn = "科隆加恩",
+ ["Koralon the Flame Watcher"] = "火焰看守者科拉隆",
+ Kormok = "库尔莫克",
+ Kresh = "克雷什",
+ Krick = "科里克",
+ ["Krick and Ick"] = "科里克和伊克",
+ ["Krik'thir the Gatewatcher"] = "看门者克里克希尔",
+ ["Krosh Firehand"] = "克洛什·火拳",
+ Krystallus = "克莱斯塔卢斯",
+ Kurinnaxx = "库林纳克斯",
+ ["Lady Anacondra"] = "安娜科德拉",
+ ["Lady Blaumeux"] = "女公爵布劳缪克丝",
+ ["Lady Deathwhisper"] = "亡语者女士",
+ ["Lady Illucia Barov"] = "伊露希亚·巴罗夫",
+ ["Lady Malande"] = "女公爵玛兰德",
+ ["Lady Naz'jar"] = "Lady Naz'jar", -- Needs review
+ ["Lady Sacrolash"] = "萨洛拉丝女王",
+ ["Lady Sarevess"] = "萨利维丝",
+ ["Lady Vashj"] = "瓦丝琪",
+ Laj = "拉伊",
+ Landslide = "兰斯利德",
+ Lavanthor = "拉文索尔",
+ ["Left Arm"] = "左臂",
+ ["Leotheras the Blind"] = "盲眼者莱欧瑟拉斯",
+ Lethon = "莱索恩",
+ Lethtendris = "蕾瑟塔蒂丝",
+ ["Leviathan Mk II"] = "巨兽二型",
+ ["Ley-Guardian Eregos"] = "魔网守护者埃雷苟斯",
+ ["Lieutenant Drake"] = "德拉克中尉",
+ ["Lieutenant General Andorov"] = "安多洛夫中将",
+ Loatheb = "洛欧塞布",
+ Loken = "洛肯",
+ ["Lord Alexei Barov"] = "阿雷克斯·巴罗夫",
+ ["Lord Cobrahn"] = "考布莱恩",
+ ["Lord Hel'nurath"] = "赫尔努拉斯",
+ ["Lord Incendius"] = "伊森迪奥斯",
+ ["Lord Jaraxxus"] = "加拉克苏斯大王",
+ ["Lord Kazzak"] = "末日领主卡扎克",
+ ["Lord Kri"] = "克里勋爵",
+ ["Lord Marrowgar"] = "玛洛加尔领主",
+ ["Lord Pythas"] = "皮萨斯",
+ ["Lord Roccor"] = "洛考尔",
+ ["Lord Sanguinar"] = "萨古纳尔男爵",
+ ["Lord Serpentis"] = "瑟芬迪斯",
+ ["Lord Skwol"] = "斯古恩男爵",
+ ["Lord Valthalak"] = "瓦塔拉克公爵",
+ ["Lord Victor Nefarius"] = "维克多·奈法里奥斯",
+ ["Lord Vyletongue"] = "维利塔恩",
+ ["Lorekeeper Polkelt"] = "博学者普克尔特",
+ ["Lorgus Jett"] = "洛古斯·杰特",
+ Loro = "洛若尔",
+ Lucifron = "鲁西弗隆",
+ ["Mad Magglish"] = "疯狂的马格利什",
+ Maexxna = "迈克斯纳",
+ ["Mage-Lord Urom"] = "法师领主伊洛姆",
+ ["Magister Kalendris"] = "卡雷迪斯镇长",
+ ["Magistrate Barthilas"] = "巴瑟拉斯镇长",
+ Magmadar = "玛格曼达",
+ Magmus = "玛格姆斯",
+ Magra = "玛格拉",
+ Magtheridon = "玛瑟里顿",
+ ["Maiden of Grief"] = "悲伤圣女",
+ ["Maiden of Virtue"] = "贞节圣女",
+ ["Majordomo Executus"] = "管理者埃克索图斯",
+ Malacrass = "玛拉卡斯",
+ ["Maleki the Pallid"] = "苍白的玛勒基",
+ ["Mal'Ganis"] = "玛尔加尼斯",
+ Malygos = "玛里苟斯",
+ Maraudos = "玛拉多斯",
+ ["Marduk Blackpool"] = "马杜克·布莱克波尔",
+ ["Marisa du'Paige"] = "玛里莎·杜派格",
+ Marwyn = "玛维恩",
+ ["Master Engineer Telonicus"] = "首席技师塔隆尼库斯",
+ ["Maur Grimtotem"] = "玛尔·恐怖图腾",
+ Meathook = "肉钩",
+ ["Mechano-Lord Capacitus"] = "机械领主卡帕西图斯",
+ Medivh = "麦迪文",
+ ["Mekgineer Steamrigger"] = "机械师斯蒂里格",
+ ["Mekgineer Thermaplugg"] = "麦克尼尔·瑟玛普拉格",
+ ["Mennu the Betrayer"] = "背叛者门努",
+ ["Meshlok the Harvester"] = "收割者麦什洛克",
+ Midnight = "午夜",
+ Mijan = "米杉",
+ Mimiron = "米米尔隆",
+ ["Miner Johnson"] = "矿工约翰森",
+ ["Mistress of Pain"] = "痛苦女王",
+ Moam = "莫阿姆",
+ Mogor = "穆戈尔",
+ ["Mokra the Skullcrusher"] = "碎颅者莫克拉",
+ Moorabi = "莫拉比",
+ Moragg = "摩拉格",
+ ["Mordresh Fire Eye"] = "火眼莫德雷斯",
+ ["Mor Grayhoof"] = "莫尔·灰蹄",
+ Moroes = "莫罗斯",
+ ["Morogrim Tidewalker"] = "莫洛格里·踏潮者",
+ Morphaz = "摩弗拉斯",
+ ["Mother Shahraz"] = "莎赫拉丝主母",
+ ["Mother Smolderweb"] = "烟网蛛后",
+ ["Mr. Smite"] = "重拳先生",
+ ["Muradin Bronzebeard"] = "穆拉丁·铜须",
+ ["Murkblood Twin"] = "暗血双子",
+ ["Murkblood Twins"] = "暗血双子",
+ Murmur = "摩摩尔",
+ ["Murta Grimgut"] = "穆尔塔",
+ ["M'uru"] = "穆鲁",
+ Mushgog = "姆斯高格",
+ ["Mutanus the Devourer"] = "吞噬者穆坦努斯",
+ Nalorakk = "纳洛拉克",
+ Nazan = "纳杉",
+ Nefarian = "奈法利安",
+ ["Nekrum Gutchewer"] = "耐克鲁姆",
+ ["Nerub'enkan"] = "奈鲁布恩坎",
+ ["Nethermancer Sepethrea"] = "灵术师塞比瑟蕾",
+ Netherspite = "虚空幽龙",
+ ["Netherstrand Longbow"] = "灵弦长弓",
+ ["Nexus-Prince Shaffar"] = "节点亲王沙法尔",
+ Nightbane = "夜之魇",
+ ["Noth the Plaguebringer"] = "瘟疫使者诺斯",
+ ["Novos the Summoner"] = "召唤者诺沃斯",
+ Noxxion = "诺克赛恩",
+ ["Obsidian Sentinel"] = "黑曜石哨兵",
+ ["Odo the Blindwatcher"] = "盲眼守卫奥杜",
+ Oggleflint = "奥格弗林特",
+ ["Ogom the Wretched"] = "可悲的奥戈姆",
+ Ohgan = "奥根",
+ ["Ok'thor the Breaker"] = "破坏者奥科索尔",
+ Olaf = "奥拉夫",
+ ["Old Serra'kis"] = "瑟拉吉斯",
+ ["Olm the Summoner"] = "召唤者沃尔姆",
+ ["Omor the Unscarred"] = "无疤者奥摩尔",
+ Onyxia = "奥妮克希亚",
+ ["Opera Event"] = "歌剧院",
+ ["Orgrim's Hammer"] = "奥格瑞姆之锤",
+ ["Ormorok the Tree-Shaper"] = "塑树者奥莫洛克",
+ ["Oro Eyegouge"] = "欧罗·血眼",
+ ["Ossirian the Unscarred"] = "无疤者奥斯里安",
+ Ouro = "奥罗",
+ ["Overlord Ramtusk"] = "主宰拉姆塔斯",
+ ["Overlord Wyrmthalak"] = "维姆萨拉克",
+ ["Overmaster Pyron"] = "征服者派隆",
+ ["Overseer Tidewrath"] = "工头泰德瓦斯",
+ Ozumat = "Ozumat", -- Needs review
+ Pandemonius = "潘德莫努斯",
+ ["Panzor the Invincible"] = "无敌的潘佐尔",
+ Patchwerk = "帕奇维克",
+ ["Pathaleon the Calculator"] = "计算者帕萨雷恩",
+ Phalanx = "方阵",
+ ["Phaseshift Bulwark"] = "相位壁垒",
+ Pimgib = "匹姆吉布",
+ ["Plaguemaw the Rotting"] = "腐烂的普雷莫尔",
+ ["Plugger Spazzring"] = "普拉格",
+ ["Postmaster Malown"] = "邮差马龙",
+ ["Priestess Delrissa"] = "女祭司德莉希亚",
+ ["Prince Keleseth"] = "凯雷塞斯王子",
+ ["Prince Malchezaar"] = "玛克扎尔王子",
+ ["Prince Skaldrenox"] = "斯卡德诺克斯王子",
+ ["Princess Huhuran"] = "哈霍兰公主",
+ ["Princess Moira Bronzebeard"] = "铁炉堡公主茉艾拉·铜须",
+ ["Princess Tempestria"] = "泰比斯蒂亚公主",
+ ["Princess Theradras"] = "瑟莱德丝公主",
+ ["Princess Yauj"] = "亚尔基公主",
+ ["Prince Taldaram"] = "塔达拉姆王子",
+ ["Prince Tenris Mirkblood"] = "特里斯·黯血王子",
+ ["Prince Tortheldrin"] = "托塞德林王子",
+ ["Prince Valanar"] = "瓦拉纳王子",
+ ["Professor Putricide"] = "普崔塞德教授",
+ ["Pure Spawn of Hydross"] = "纯净的海度斯爪牙",
+ Pusillin = "普希林",
+ ["Pyroguard Emberseer"] = "烈焰卫士艾博希尔",
+ ["Pyromancer Loregrain"] = "控火师罗格雷恩",
+ Quagmirran = "夸格米拉",
+ ["Quartermaster Zigris"] = "军需官兹格雷斯",
+ ["Rage Winterchill"] = "雷基·冬寒",
+ Ragglesnout = "拉戈斯诺特",
+ ["Raging Spirit"] = "暴怒灵魂", -- Needs review
+ Ragnaros = "拉格纳罗斯",
+ ["Ramstein the Gorger"] = "吞咽者拉姆斯登",
+ ["Ras Frostwhisper"] = "莱斯·霜语",
+ Rattlegore = "血骨傀儡",
+ ["Razorclaw the Butcher"] = "屠夫拉佐克劳",
+ ["Razorgore the Untamed"] = "狂野的拉佐格尔",
+ Razorlash = "锐刺鞭笞者",
+ Razorscale = "锋鳞",
+ ["Reliquary of Souls"] = "灵魂之匣",
+ Renataki = "雷纳塔基",
+ ["Restless Skeleton"] = "无法安息的骷髅",
+ Rethilgore = "雷希戈尔",
+ Revelosh = "鲁维罗什",
+ ["Rhahk'Zor"] = "拉克佐",
+ ["Ribbly Screwspigot"] = "雷布里·斯库比格特",
+ ["Right Arm"] = "右臂",
+ ["Ring of Law"] = "秩序竞技场",
+ Roar = "胆小的狮子",
+ ["Rokad the Ravager"] = "蹂躏者洛卡德",
+ ["Rokdar the Sundered Lord"] = "裂石之王洛卡达尔",
+ ["Rokmar the Crackler"] = "巨钳鲁克玛尔",
+ ["Rom'ogg Bonecrusher"] = "Rom'ogg Bonecrusher", -- Needs review
+ Romulo = "罗密欧",
+ ["Romulo & Julianne"] = "罗密欧与朱丽叶",
+ Roogug = "鲁古",
+ Rotface = "腐面",
+ Rotgrip = "洛特格里普",
+ ["Runemaster Molgeim"] = "符文大师莫尔基姆",
+ ["Runok Wildmane"] = "鲁诺克·蛮鬃",
+ Ruuzlu = "卢兹鲁",
+ ["Salramm the Fleshcrafter"] = "塑血者沙尔拉姆",
+ ["Sanctum Sentry"] = "圣所警卫",
+ ["Sandarr Dunereaver"] = "杉达尔·沙掠者",
+ ["Sandfury Executioner"] = "沙怒刽子手",
+ Sapphiron = "萨菲隆",
+ Sara = "萨拉",
+ ["Saronite Animus"] = "萨隆邪铁畸体",
+ Sartharion = "萨塔里奥",
+ ["Sathrovarr the Corruptor"] = "腐蚀者萨索瓦尔",
+ ["Saviana Ragefire"] = "塞维娅娜·怒火",
+ ["Scarlet Commander Mograine"] = "血色十字军指挥官莫格莱尼",
+ ["Scourgelord Tyrannus"] = "天灾领主泰兰努斯",
+ ["Seeth'rel"] = "西斯雷尔",
+ ["Selin Fireheart"] = "塞林·火心",
+ ["Sergeant Bly"] = "布莱中士",
+ ["Shade of Akama"] = "阿卡玛之影",
+ ["Shade of Aran"] = "埃兰之影",
+ ["Shade of Eranikus"] = "伊兰尼库斯的阴影",
+ ["Shadikith the Glider"] = "滑翔者沙德基斯",
+ ["Shadow Hunter Vosh'gajin"] = "暗影猎手沃什加斯",
+ ["Shadow of Leotheras"] = "莱欧瑟拉斯之影",
+ ["Shadowpriest Sezz'ziz"] = "暗影祭司塞瑟斯",
+ Shadron = "沙德隆",
+ Shazzrah = "沙斯拉尔",
+ ["Shirrak the Dead Watcher"] = "死亡观察者希尔拉克",
+ Sindragosa = "辛达苟萨",
+ ["Sir Zeliek"] = "瑟里耶克爵士",
+ ["Sjonnir The Ironshaper"] = "塑铁者斯约尼尔",
+ ["Skadi the Ruthless"] = "残忍的斯卡迪",
+ ["Skarr the Unbreakable"] = "无敌的斯卡尔",
+ ["Skarvald the Constructor"] = "建筑师斯卡瓦尔德",
+ ["Skra'gath"] = "瑟克拉加斯",
+ Skul = "斯库尔",
+ Skum = "斯卡姆",
+ ["Slad'ran"] = "斯拉德兰",
+ Sneed = "斯尼德",
+ ["Sneed's Shredder"] = "斯尼德的伐木机",
+ ["Solakar Flamewreath"] = "索拉卡·火冠",
+ ["Solarium Agent"] = "日晷密探",
+ ["Solarium Priest"] = "日晷祭司",
+ ["Spirestone Battle Lord"] = "尖石统帅",
+ ["Spirestone Butcher"] = "尖石屠夫",
+ ["Spirestone Lord Magus"] = "尖石首席法师",
+ ["Staff of Disintegration"] = "瓦解法杖",
+ Stalagg = "斯塔拉格",
+ Steelbreaker = "断钢者",
+ ["Stomper Kreeg"] = "践踏者克雷格",
+ Stonespine = "石脊",
+ ["Stormcaller Brundir"] = "唤雷者布隆迪尔",
+ Strawman = "稻草人",
+ ["Sulfuron Harbinger"] = "萨弗隆先驱者",
+ Supremus = "苏普雷姆斯",
+ ["Svala Sorrowgrave"] = "席瓦拉·索格蕾",
+ ["Swamplord Musel'ek"] = "沼地领主穆塞雷克",
+ Taerar = "泰拉尔",
+ ["Tainted Spawn of Hydross"] = "污染的海度斯爪牙",
+ ["Talon King Ikiss"] = "利爪之王艾吉斯",
+ ["Taragaman the Hungerer"] = "饥饿者塔拉加曼",
+ ["Targorr the Dread"] = "可怕的塔格尔",
+ Tavarok = "塔瓦洛克",
+ Techbot = "尖端机器人",
+ Temporus = "坦普卢斯",
+ ["Tendris Warpwood"] = "特迪斯·扭木",
+ Tenebron = "塔尼布隆",
+ ["Terestian Illhoof"] = "特雷斯坦·邪蹄",
+ ["Teron Gorefiend"] = "塔隆·血魔",
+ Thaddius = "塔迪乌斯",
+ ["Thaladred the Darkener"] = "亵渎者萨拉德雷",
+ ["Thane Korth'azz"] = "库尔塔兹领主",
+ ["The Beast"] = "比斯巨兽",
+ ["The Beasts of Northrend"] = "诺森德猛兽",
+ ["The Big Bad Wolf"] = "大灰狼",
+ ["The Black Knight"] = "黑骑士",
+ ["The Black Stalker"] = "黑色阔步者",
+ ["The Blue Brothers"] = "蓝色兄弟",
+ ["The Bug Family"] = "虫子一家",
+ ["The Crone"] = "巫婆",
+ ["The Curator"] = "馆长",
+ ["The Eredar Twins"] = "艾瑞达双子",
+ ["The Four Horsemen"] = "四骑士",
+ ["The Illidari Council"] = "伊利达雷议会",
+ ["The Iron Council"] = "钢铁议会",
+ ["Theka the Martyr"] = "殉教者塞卡",
+ ["The Lich King"] = "巫妖王",
+ ["The Lost Dwarves"] = "失踪的矮人",
+ ["The Lurker Below"] = "鱼斯拉",
+ ["The Maker"] = "制造者",
+ ["The Prophet Skeram"] = "预言者斯克拉姆",
+ ["The Prophet Tharon'ja"] = "先知萨隆亚",
+ ["The Ravenian"] = "拉文尼亚",
+ ["The Razza"] = "拉扎尔",
+ ["The Seven Dwarves"] = "七贤矮人",
+ ["The Skybreaker"] = "破天号",
+ ["The Tribunal of Ages"] = "远古法庭",
+ ["The Twin Emperors"] = "双子皇帝",
+ ["The Twin Val'kyr"] = "瓦格里双子",
+ ["The Unforgiven"] = "不可宽恕者",
+ ["The Windreaver"] = "烈风掠夺者",
+ Thorim = "托里姆",
+ ["Thorngrin the Tender"] = "看管者索恩格林",
+ ["Tidewalker Lurker"] = "踏潮潜伏者",
+ ["Timmy the Cruel"] = "悲惨的提米",
+ Tinhead = "铁皮人",
+ ["Tinkerer Gizlock"] = "工匠吉兹洛克",
+ ["Tirion Fordring"] = "提里奧·弗丁",
+ Tito = "托托",
+ ["Toravon the Ice Watcher"] = "寒冰看守者图拉旺",
+ ["Trigore the Lasher"] = "鞭笞者特里高雷",
+ Trollgore = "托尔戈",
+ ["Tsu'zee"] = "苏斯",
+ ["Tuten'kash"] = "图特卡什",
+ ["Twilight Lord Kelris"] = "梦游者克尔里斯",
+ ["Urok Doomhowl"] = "乌洛克",
+ ["Vaelastrasz the Corrupt"] = "堕落的瓦拉斯塔兹",
+ ["Valithria Dreamwalker"] = "踏梦者瓦莉瑟瑞娅",
+ ["Val'kyr Shadowguard"] = "Val'kyr Shadowguard", -- Needs review
+ ["Varian Wrynn"] = "瓦里安·乌瑞恩",
+ ["Varos Cloudstrider"] = "瓦尔洛斯·云击",
+ Vazruden = "瓦兹德",
+ ["Vazruden the Herald"] = "传令官瓦兹德",
+ Vectus = "维克图斯",
+ Vem = "维姆",
+ Veng = "温格",
+ ["Veras Darkshadow"] = "维尔莱斯·深影",
+ ["Verdan the Everliving"] = "永生者沃尔丹",
+ Verek = "维雷克",
+ Vesperon = "维斯匹隆",
+ Vexallus = "维萨鲁斯",
+ ["Veyzhak the Cannibal"] = "食尸者维萨克",
+ ["Vile'rel"] = "瓦勒雷尔",
+ Viscidus = "维希度斯",
+ ["Viscous Fallout"] = "粘性辐射尘",
+ ["Void Reaver"] = "空灵机甲",
+ Volkhan = "沃尔坎",
+ ["VX-001"] = "VX-001",
+ ["Warbringer O'mrogg"] = "战争使者沃姆罗格",
+ ["Warchief Blackhand Piece"] = "黑手酋长",
+ ["Warchief Kargath Bladefist"] = "酋长卡加斯·刃拳",
+ ["Warchief Rend Blackhand"] = "大酋长雷德·黑手",
+ ["Warden Mellichar"] = "监护者梅里卡尔",
+ ["Warder Stilgiss"] = "典狱官斯迪尔基斯",
+ ["Warlord Kalithresh"] = "督军卡利瑟里斯",
+ ["War Master Voone"] = "指挥官沃恩",
+ ["Warmaul Champion"] = "战槌勇士",
+ ["Warp Slicer"] = "迁跃切割者",
+ ["Warp Splinter"] = "迁跃扭木",
+ ["Watchkeeper Gargolmar"] = "巡视者加戈玛",
+ Weaver = "德拉维沃尔",
+ ["Witch Doctor Zum'rah"] = "巫医祖穆拉恩",
+ ["Wolf Master Nandos"] = "狼王南杜斯",
+ ["Wrath-Scryer Soccothrates"] = "天怒预言者苏克拉底",
+ Wushoolay = "乌苏雷",
+ Xevozz = "谢沃兹",
+ ["XT-002 Deconstructor"] = "XT-002拆解者",
+ ["Yogg-Saron"] = "尤格-萨隆",
+ Yor = "尤尔",
+ Ysondre = "伊森德雷",
+ Zekkis = "泽基斯",
+ ["Zelemar the Wrathful"] = "愤怒者塞雷玛尔",
+ ["Zereketh the Unbound"] = "自由的瑟雷凯斯",
+ Zerillis = "泽雷利斯",
+ ["Zevrim Thornhoof"] = "瑟雷姆·刺蹄",
+ Zolo = "祖罗",
+ ["Zul'Farrak Dead Hero"] = "祖尔法拉克阵亡英雄",
+ ["Zul'jin"] = "祖尔金",
+ ["Zul'Lor"] = "祖罗尔",
+ ["Zul'tore"] = "祖尔托",
+ ["Zuramat the Obliterator"] = "湮灭者祖拉玛特",
+}
+elseif GAME_LOCALE == "zhTW" then
+ lib:SetCurrentTranslations {
+ Acidmaw = "酸喉",
+ Aeonus = "艾奧那斯",
+ ["Aerial Command Unit"] = "空中指揮裝置",
+ ["Agathelos the Raging"] = "暴怒的阿迦賽羅斯",
+ ["Aggem Thorncurse"] = "阿葛金·棘咒",
+ Ahune = "艾胡恩",
+ ["Akil'zon"] = "阿奇爾森",
+ ["Aku'mai"] = "阿庫麥爾",
+ ["Al'ar"] = "歐爾",
+ ["Algalon the Observer"] = "『觀察者』艾爾加隆",
+ ["Alzzin the Wildshaper"] = "『狂野變形者』奧茲恩",
+ Amanitar = "毒蕈魔",
+ ["Ambassador Flamelash"] = "弗萊拉斯大使",
+ ["Ambassador Hellmaw"] = "海爾瑪大使",
+ ["Amnennar the Coldbringer"] = "『寒冰使者』亞門納爾",
+ ["Ancient Stone Keeper"] = "古代的石頭看守者",
+ Anetheron = "安納塞隆",
+ ["Anger'rel"] = "安格雷爾",
+ Anomalus = "艾諾瑪路斯",
+ ["Antu'sul"] = "安圖蘇爾",
+ ["Anub'arak"] = "阿努巴拉克",
+ ["Anubisath Defender"] = "阿努比薩斯防衛者",
+ ["Anubisath Guardian"] = "阿努比薩斯守衛者",
+ ["Anub'Rekhan"] = "阿努比瑞克漢",
+ ["Anub'shiah"] = "阿努希爾",
+ Anzu = "安祖",
+ ["Arcane Watchman"] = "秘法警備者",
+ ["Arcanist Doan"] = "秘法師杜安",
+ Archaedas = "阿札達斯",
+ ["Archavon the Stone Watcher"] = "『石之看守者』亞夏梵",
+ Archimonde = "阿克蒙德",
+ ["Archivist Galford"] = "檔案管理員加爾福特",
+ ["Archmage Arugal"] = "大法師阿魯高",
+ ["Argent Confessor Paletress"] = "銀白告解者帕爾璀絲",
+ ["Arugal's Voidwalker"] = "阿魯高的虛無行者",
+ ["Ascendant Lord Obsidius"] = "Ascendant Lord Obsidius", -- Needs review
+ ["Assault Bot"] = "突襲機器人",
+ ["Assembly of Iron"] = "鐵之集會",
+ ["Atal'alarion"] = "阿塔拉利恩",
+ ["Attumen the Huntsman"] = "獵人阿圖曼",
+ Auriaya = "奧芮雅",
+ Avalanchion = "阿瓦蘭奇奧",
+ ["Avatar of Hakkar"] = "哈卡的化身",
+ ["Ayamiss the Hunter"] = "『狩獵者』阿亞米斯",
+ Azgalor = "亞茲加洛",
+ ["Azshir the Sleepless"] = "不眠的艾希爾",
+ Azuregos = "艾索雷葛斯",
+ ["Bael'Gar"] = "貝爾加",
+ Baelog = "巴爾洛戈",
+ Balnazzar = "巴納札爾",
+ ["Baltharus the Warborn"] = "『戰爭之子』巴爾薩魯斯",
+ ["Bannok Grimaxe"] = "班諾克·巨斧",
+ ["Baron Aquanis"] = "阿奎尼斯男爵",
+ ["Baron Charr"] = "火焰男爵查爾",
+ ["Baroness Anastari"] = "安娜絲塔麗男爵夫人",
+ ["Baron Geddon"] = "迦頓男爵",
+ ["Baron Kazum"] = "卡蘇姆男爵",
+ ["Baron Rivendare"] = "瑞文戴爾男爵",
+ ["Baron Silverlaine"] = "席瓦萊恩男爵",
+ ["Battleguard Sartura"] = "沙爾圖拉",
+ ["Bazil Thredd"] = "巴基爾·斯瑞德",
+ Bazzalan = "巴札蘭",
+ Beauty = "Beauty", -- Needs review
+ ["Black Guard Swordsmith"] = "黑衣守衛鑄劍師",
+ ["Blackheart the Inciter"] = "煽動者黑心",
+ ["Blindeye the Seer"] = "先知盲眼",
+ ["Blind Hunter"] = "盲眼獵手",
+ ["Blood Guard Porung"] = "血衛士波洛克",
+ ["Bloodlord Mandokir"] = "血領主曼多基爾",
+ ["Bloodmage Thalnos"] = "血法師薩爾諾斯",
+ ["Blood Prince Council"] = "血親王議會",
+ ["Blood Princes"] = "血親王",
+ ["Blood-Queen Lana'thel"] = "血腥女王菈娜薩爾",
+ ["Blood Steward of Kirtonos"] = "基爾圖諾斯的衛士",
+ Boahn = "博艾恩",
+ ["Bomb Bot"] = "炸彈機器人",
+ ["Brain of Yogg-Saron"] = "尤格薩倫的腦部",
+ ["Brainwashed Noble"] = "被洗腦的貴族",
+ Broggok = "布洛克",
+ Brokentoe = "斷趾",
+ Bronjahm = "布朗吉姆",
+ ["Broodlord Lashlayer"] = "龍領主勒西雷爾",
+ ["Bruegal Ironknuckle"] = "布魯戈·艾爾克納寇",
+ Brutallus = "布魯托魯斯",
+ ["Burning Felguard"] = "燃燒惡魔守衛",
+ ["Buru the Gorger"] = "『暴食者』布魯",
+ ["Cache of the Firelord"] = "火焰之王的寶箱",
+ ["Cache of the Legion"] = "軍團貯藏箱",
+ ["Cannon Master Willey"] = "砲手威利",
+ ["Captain Greenskin"] = "綠皮隊長",
+ ["Captain Kromcrush"] = "克羅卡斯",
+ ["Captain Skarloc"] = "史卡拉克上尉",
+ ["Celebras the Cursed"] = "被詛咒的塞雷布拉斯",
+ ["Charlga Razorflank"] = "卡爾加·刺肋",
+ ["Chess Event"] = "西洋棋事件",
+ ["Chest of The Seven"] = "七賢之箱",
+ ["Chief Ukorz Sandscalp"] = "烏克茲·沙頂",
+ ["Cho'Rush the Observer"] = "『觀察者』克魯什",
+ Chromaggus = "克洛瑪古斯",
+ ["Chrono Lord Deja"] = "時間領主迪賈",
+ ["Chrono-Lord Epoch"] = "紀元時間領主",
+ Claw = "裂爪",
+ ["Coilfang Elite"] = "盤牙精英",
+ ["Coilfang Strider"] = "盤牙旅行者",
+ ["Commander Kolurg"] = "指揮官寇勒格",
+ ["Commander Sarannis"] = "指揮官薩瑞尼斯",
+ ["Commander Springvale"] = "指揮官斯普林瓦爾",
+ ["Commander Stoutbeard"] = "指揮官厚鬚",
+ ["Commander Ulthok"] = "Commander Ulthok", -- Needs review
+ ["Constructor & Controller"] = "『建造者』與『控制者』",
+ Cookie = "廚師",
+ ["Coren Direbrew"] = "寇仁·恐酒",
+ ["Corla, Herald of Twilight"] = "Corla, Herald of Twilight", -- Needs review
+ ["Cosmic Infuser"] = "宇宙灌溉者",
+ ["Crimson Hammersmith"] = "紅衣鑄錘師",
+ ["Crowd Pummeler 9-60"] = "群體打擊者9-60",
+ ["Crystal Fang"] = "水晶之牙",
+ ["C'Thun"] = "克蘇恩",
+ Cyanigosa = "霞妮苟莎",
+ ["Dalliah the Doomsayer"] = "末日預言者達利亞",
+ ["Dalronn the Controller"] = "『控制者』達隆恩",
+ ["Dark Coffer"] = "黑暗寶箱",
+ ["Dark Iron Ambassador"] = "黑鐵大使",
+ ["Darkmaster Gandling"] = "黑暗院長加丁",
+ ["Darkweaver Syth"] = "暗法師希斯",
+ ["Deathbound Ward"] = "亡縛守衛",
+ ["Deathbringer Saurfang"] = "死亡使者薩魯法爾",
+ ["Death Knight Darkreaver"] = "死亡騎士達克雷爾",
+ ["Death Knight Understudy"] = "死亡騎士實習者",
+ ["Deathspeaker High Priest"] = "亡頌者高階祭司",
+ ["Death Speaker Jargba"] = "亡語者賈格巴",
+ ["Deathstalker Visceri"] = "亡靈哨兵威瑟瑞",
+ ["Deathsworn Captain"] = "死亡誓言者隊長",
+ Devastation = "毀滅",
+ ["Deviate Faerie Dragon"] = "變異精靈龍",
+ ["Devourer of Souls"] = "眾魂吞噬者",
+ ["Dextren Ward"] = "迪克斯特·瓦德",
+ ["Digmaster Shovelphlange"] = "挖掘專家舒爾弗拉格",
+ ["Doctor Theolen Krastinov"] = "瑟爾林·卡斯迪諾夫教授",
+ ["Doom Lord Kazzak"] = "毀滅領主卡札克",
+ ["Doom'rel"] = "杜姆雷爾",
+ Doomwalker = "厄運行者",
+ ["Dope'rel"] = "多普雷爾",
+ Dorothee = "桃樂絲",
+ ["Drahga Shodowburner"] = "Drahga Shodowburner", -- Needs review
+ ["Drakkari Colossus"] = "德拉克瑞巨像",
+ ["Drakos the Interrogator"] = "『審問者』德拉高斯",
+ Dreadscale = "懼鱗",
+ Dreamscythe = "德姆塞卡爾",
+ ["Dust Covered Chest"] = "滿佈灰塵箱子",
+ Dustwraith = "灰塵怨靈",
+ ["Eadric the Pure"] = "『純淨者』埃卓克",
+ ["Earthcaller Halmgar"] = "喚地者哈穆加",
+ Ebonroc = "埃博諾克",
+ ["Eck the Ferocious"] = "『兇猛』埃克",
+ ["Edwin VanCleef"] = "艾德溫·范克里夫",
+ ["Elder Brightleaf"] = "亮葉長者",
+ ["Elder Ironbranch"] = "鐵枝長者",
+ ["Elder Nadox"] = "老那杜斯",
+ ["Elder Stonebark"] = "石木長者",
+ ["Electrocutioner 6000"] = "電刑器6000型",
+ ["Emalon the Storm Watcher"] = "『風暴看守者』艾瑪隆",
+ Emeriss = "艾莫莉絲",
+ ["Emperor Dagran Thaurissan"] = "達格蘭·索瑞森大帝",
+ ["Emperor Vek'lor"] = "維克洛爾大帝",
+ ["Emperor Vek'nilash"] = "維克尼拉斯大帝",
+ Entropius = "安卓普斯",
+ ["Eonar's Gift"] = "伊歐娜的贈禮",
+ ["Epoch Hunter"] = "紀元狩獵者",
+ Erekem = "伊銳坎",
+ ["Eressea Dawnsinger"] = "艾瑞西雅·曦詠",
+ ["Eric \"The Swift\""] = "『迅捷』艾利克",
+ Erudax = "Erudax", -- Needs review
+ ["Erunak Stonespeaker"] = "Erunak Stonespeaker", -- Needs review
+ ["Essence of Anger"] = "憤怒精華",
+ ["Essence of Desire"] = "慾望精華",
+ ["Essence of Suffering"] = "受難精華",
+ Eviscerator = "剜眼者",
+ ["Exarch Maladaar"] = "主教瑪拉達爾",
+ ["Expedition Commander"] = "遠征隊指揮官",
+ ["Eydis Darkbane"] = "艾狄絲·暗寂",
+ ["Eye of C'Thun"] = "克蘇恩之眼",
+ ["Faction Champions"] = "陣營勇士",
+ ["Fallen Champion"] = "亡靈勇士",
+ Falric = "法勒瑞克",
+ ["Falric and Marwyn"] = "法勒瑞克和麥爾溫",
+ ["Fankriss the Unyielding"] = "不屈的范克里斯",
+ ["Fathom-Lord Karathress"] = "深淵之王卡拉薩瑞斯",
+ Felmyst = "魔龍謎霧",
+ ["Fenrus the Devourer"] = "『吞噬者』芬魯斯",
+ ["Feral Defender"] = "野性防衛者",
+ Festergut = "膿腸",
+ Feugen = "伏晨",
+ ["Fineous Darkvire"] = "弗諾斯·達克維爾",
+ Firemaw = "費爾默",
+ ["Fjola Lightbane"] = "菲歐拉·光寂",
+ Flamegor = "弗萊格爾",
+ ["Flame Leviathan"] = "烈焰戰輪",
+ ["Foreman Thistlenettle"] = "工頭希斯耐特",
+ ["Forgemaster Garfrost"] = "鍛造大師加弗羅斯",
+ ["Forgremaster Throngus"] = "Forgremaster Throngus", -- Needs review
+ ["Four Horsemen Chest"] = "四騎士箱子",
+ ["Fras Siabi"] = "弗拉斯·希亞比",
+ Freya = "芙蕾雅",
+ ["Gahz'ranka"] = "加茲蘭卡",
+ ["Gahz'rilla"] = "加茲瑞拉",
+ ["Gal'darah"] = "蓋爾達拉",
+ ["Galgann Firehammer"] = "加加恩·火錘",
+ Garr = "加爾",
+ ["Garrosh Hellscream"] = "卡爾洛斯·地獄吼",
+ Gasher = "加什爾",
+ ["Gatewatcher Gyro-Kill"] = "看守者蓋洛奇歐",
+ ["Gatewatcher Iron-Hand"] = "看守者鐵手",
+ ["Gathios the Shatterer"] = "粉碎者高希歐",
+ Gehennas = "基赫納斯",
+ Gelihast = "格里哈斯特",
+ Gelk = "吉爾克",
+ ["General Angerforge"] = "安格弗將軍",
+ ["General Bjarngrim"] = "畢亞格林將軍",
+ ["General Drakkisath"] = "達基薩斯將軍",
+ ["General Rajaxx"] = "拉賈克斯將軍",
+ ["General Umbriss"] = "General Umbriss", -- Needs review
+ ["General Vezax"] = "威札斯將軍",
+ ["General Zarithrian"] = "扎里斯利安將軍",
+ ["Ghamoo-ra"] = "加摩拉",
+ ["Ghaz'an"] = "高薩安",
+ ["Ghok Bashguud"] = "霍克·巴什古德",
+ Gilnid = "基爾尼格",
+ ["Gizrul the Slavener"] = "『奴役者』基茲盧爾",
+ ["Gloom'rel"] = "格魯雷爾",
+ Gluth = "古魯斯",
+ Glutton = "暴食者",
+ ["Golemagg the Incinerator"] = "『焚化者』古雷曼格",
+ ["Golem Lord Argelmach"] = "魔像領主阿格曼奇",
+ ["Goraluk Anvilcrack"] = "古拉魯克",
+ ["Gormok the Impaler"] = "「穿刺者」戈莫克",
+ ["Gorosh the Dervish"] = "『修行者』高羅什",
+ ["Gortok Palehoof"] = "戈托克·白蹄",
+ ["Gothik the Harvester"] = "『收割者』高希",
+ ["Grand Astromancer Capernian"] = "大星術師卡普尼恩",
+ ["Grand Champions"] = "大勇士",
+ ["Grand Crusader Dathrohan"] = "大十字軍戰士達索漢",
+ ["Grand Magus Telestra"] = "大魔導師特雷斯翠",
+ ["Grandmaster Vorpil"] = "領導者瓦皮歐",
+ Grandmother = "外婆",
+ ["Grand Warlock Alythess"] = "大術士艾黎瑟絲",
+ ["Grand Warlock Nethekurse"] = "大術士奈德克斯",
+ ["Grand Widow Faerlina"] = "大寡婦費琳娜",
+ ["Grethok the Controller"] = "『控制者』葛瑞托克",
+ ["Gri'lek"] = "格里雷克",
+ Grimlok = "格瑞姆洛克",
+ Grizzle = "格里茲爾",
+ Grobbulus = "葛羅巴斯",
+ Grubbis = "格魯比斯",
+ ["Gruul the Dragonkiller"] = "弒龍者戈魯爾",
+ ["Guard Fengus"] = "衛兵芬古斯",
+ ["Guardian of Yogg-Saron"] = "尤格薩倫守護者",
+ ["Guard Mol'dar"] = "衛兵摩爾達",
+ ["Guard Slip'kik"] = "衛兵斯里基克",
+ ["Gurtogg Bloodboil"] = "葛塔格·血沸",
+ Gyth = "蓋斯",
+ Hadronox = "哈卓諾克斯",
+ Hakkar = "哈卡",
+ Halazzi = "哈拉齊",
+ Halion = "海萊恩",
+ Halycon = "哈雷肯",
+ Hamhock = "哈姆霍克",
+ ["Harbinger Skyriss"] = "先驅者史蓋力司",
+ ["Hate'rel"] = "黑特雷爾",
+ ["Hazza'rah"] = "哈札拉爾",
+ Hazzas = "哈札斯",
+ ["Headless Horseman"] = "無頭騎士",
+ ["Hearthsinger Forresten"] = "弗雷斯特恩",
+ ["Hedrum the Creeper"] = "『爬行者』赫杜姆",
+ ["Heigan the Unclean"] = "『不潔者』海根",
+ ["Hellfire Channeler"] = "地獄火導魔師",
+ ["Henry Stern"] = "亨利·斯特恩",
+ ["Herald Volazj"] = "信使沃菈齊",
+ Herod = "赫洛德",
+ ["Hex Lord Malacrass"] = "妖術領主瑪拉克雷斯",
+ ["High Astromancer Solarian"] = "高階星術師索拉瑞恩",
+ ["High Botanist Freywinn"] = "大植物學家費瑞衛恩",
+ ["High Inquisitor Fairbanks"] = "高等審判官法爾班克斯",
+ ["High Inquisitor Whitemane"] = "高等審判官懷特邁恩",
+ ["High Interrogator Gerstahn"] = "審訊官格斯塔恩",
+ ["High King Maulgar"] = "大君王莫卡爾",
+ ["Highlord Mograine"] = "大領主莫格萊尼",
+ ["Highlord Omokk"] = "歐莫克大王",
+ ["High Marshal Whirlaxis"] = "大元帥維拉希斯",
+ ["High Nethermancer Zerevor"] = "高等虛空術師札瑞佛",
+ ["High Overlord Saurfang"] = "薩魯法爾霸王",
+ ["High Priestess Arlokk"] = "哈卡萊先知",
+ ["High Priestess Jeklik"] = "高階祭司耶克里克",
+ ["High Priestess Mar'li"] = "哈卡萊安魂者",
+ ["High Priestess of Thaurissan"] = "索瑞森高階女祭司",
+ ["High Priest Thekal"] = "高階祭司塞卡爾",
+ ["High Priest Venoxis"] = "高階祭司溫諾希斯",
+ ["High Warlord Naj'entus"] = "高階督軍納珍塔斯",
+ Hodir = "霍迪爾",
+ ["Houndmaster Grebmar"] = "馴犬者格雷布瑪爾",
+ ["Houndmaster Loksey"] = "馴犬者洛克希",
+ Hukku = "胡庫",
+ Hungarfen = "飢餓之牙",
+ ["Hurley Blackbreath"] = "霍爾雷·黑鬚",
+ ["Hyakiss the Lurker"] = "潛伏者亞奇斯",
+ ["Hydromancer Thespia"] = "海法師希斯比亞",
+ ["Hydromancer Velratha"] = "水占師維蕾薩",
+ Hydrospawn = "海多斯博恩",
+ ["Hydross the Unstable"] = "不穩定者海卓司",
+ ["Icecrown Gunship Battle"] = "寒冰皇冠空中艦艇戰",
+ Icehowl = "冰嚎",
+ ["Ice Sphere"] = "寒冰球體",
+ Ichoron = "伊仇隆",
+ Ick = "艾克",
+ ["Ignis the Furnace Master"] = "『火爐之主』伊格尼司",
+ ["Illidan Stormrage"] = "伊利丹·怒風",
+ ["Illidari Council"] = "伊利達瑞議會",
+ ["Illyanna Ravenoak"] = "伊琳娜·鴉橡",
+ ["Immol'thar"] = "伊莫塔爾",
+ ["Infinite Corruptor"] = "恆龍墮落者",
+ ["Infinity Blades"] = "無盡之刃",
+ ["Ingvar the Plunderer"] = "『盜掠者』因格瓦",
+ ["Instructor Malicia"] = "講師瑪麗希亞",
+ ["Instructor Razuvious"] = "講師拉祖維斯",
+ ["Interrogator Vishas"] = "審訊員韋沙斯",
+ Ionar = "埃歐納",
+ Ironaya = "艾隆納亞",
+ Ironspine = "鐵脊死靈",
+ Isalien = "依薩利恩",
+ Jade = "玉龍",
+ ["Jammal'an the Prophet"] = "『預言者』迦瑪蘭",
+ ["Jan'alai"] = "賈納雷",
+ ["Jandice Barov"] = "詹迪斯·巴羅夫",
+ ["Jedoga Shadowseeker"] = "潔杜佳·尋影者",
+ ["Jed Runewatcher"] = "傑德",
+ ["Jergosh the Invoker"] = "『塑能師』耶戈什",
+ ["Jin'do the Hexxer"] = "『妖術師』金度",
+ ["Jormungar Behemoth"] = "蟄猛巨獸",
+ Jormungars = "巨蟲",
+ Julianne = "茱麗葉",
+ ["Junk Bot"] = "垃圾機器人",
+ ["Kael'thas Sunstrider"] = "凱爾薩斯·逐日者",
+ Kalecgos = "卡雷苟斯",
+ ["Kam Deepfury"] = "卡姆·深怒",
+ ["Karsh Steelbender"] = "Karsh Steelbender", -- Needs review
+ ["Kazkaz the Unholy"] = "邪惡的卡薩卡茲",
+ ["Kaz'rogal"] = "卡茲洛加",
+ ["Keli'dan the Breaker"] = "『破壞者』凱利丹",
+ ["Kel'Thuzad"] = "科爾蘇加德",
+ Keristrasza = "凱瑞史卓莎",
+ ["Kiggler the Crazed"] = "瘋癲者奇克勒",
+ ["Kil'jaeden"] = "基爾加丹",
+ ["Kil'rek"] = "基瑞克",
+ ["King Dred"] = "崔德王",
+ ["King Gordok"] = "戈多克大王",
+ ["King Llane Piece"] = "萊恩王棋子",
+ ["King Ymiron"] = "依米倫王",
+ ["Kirtonos the Herald"] = "傳令官基爾圖諾斯",
+ ["Knot Thimblejack's Cache"] = "諾特·希姆加克的儲物箱",
+ Kolk = "考爾克",
+ Kologarn = "柯洛剛恩",
+ ["Koralon the Flame Watcher"] = "『烈焰看守者』寇拉隆",
+ Kormok = "科爾莫克",
+ Kresh = "克雷什",
+ Krick = "克瑞克",
+ ["Krick and Ick"] = "艾克與克瑞克",
+ ["Krik'thir the Gatewatcher"] = "『守門者』齊力克西爾",
+ ["Krosh Firehand"] = "克羅斯·火手",
+ Krystallus = "克利斯托魯斯",
+ Kurinnaxx = "庫林納克斯",
+ ["Lady Anacondra"] = "安娜科德拉",
+ ["Lady Blaumeux"] = "布洛莫斯女士",
+ ["Lady Deathwhisper"] = "亡語女士",
+ ["Lady Illucia Barov"] = "伊露希亞·巴羅夫女士",
+ ["Lady Malande"] = "瑪蘭黛女士",
+ ["Lady Naz'jar"] = "Lady Naz'jar", -- Needs review
+ ["Lady Sacrolash"] = "莎珂蕾希女士",
+ ["Lady Sarevess"] = "薩利維絲女士",
+ ["Lady Vashj"] = "瓦許女士",
+ Laj = "拉杰",
+ Landslide = "蘭斯利德",
+ Lavanthor = "拉方索",
+ ["Left Arm"] = "左臂",
+ ["Leotheras the Blind"] = "『盲目者』李奧薩拉斯",
+ Lethon = "雷索",
+ Lethtendris = "蕾瑟塔蒂絲",
+ ["Leviathan Mk II"] = "戰輪MK II",
+ ["Ley-Guardian Eregos"] = "地脈守護者伊瑞茍斯",
+ ["Lieutenant Drake"] = "中尉崔克",
+ ["Lieutenant General Andorov"] = "安多洛夫中將",
+ Loatheb = "憎恨者",
+ Loken = "洛肯",
+ ["Lord Alexei Barov"] = "阿萊克斯·巴羅夫領主",
+ ["Lord Cobrahn"] = "考布萊恩領主",
+ ["Lord Hel'nurath"] = "赫爾努拉斯領主",
+ ["Lord Incendius"] = "伊森迪奧斯領主",
+ ["Lord Jaraxxus"] = "賈拉克瑟斯領主",
+ ["Lord Kazzak"] = "毀滅領主卡札克",
+ ["Lord Kri"] = "克里領主",
+ ["Lord Marrowgar"] = "瑪洛嘉領主",
+ ["Lord Pythas"] = "皮薩斯領主",
+ ["Lord Roccor"] = "洛考爾領主",
+ ["Lord Sanguinar"] = "桑古納爾領主",
+ ["Lord Serpentis"] = "瑟芬迪斯領主",
+ ["Lord Skwol"] = "斯古恩領主",
+ ["Lord Valthalak"] = "瓦薩拉克領主",
+ ["Lord Victor Nefarius"] = "維克多·奈法利斯領主",
+ ["Lord Vyletongue"] = "維利塔恩領主",
+ ["Lorekeeper Polkelt"] = "博學者普克爾特",
+ ["Lorgus Jett"] = "洛古斯·傑特",
+ Loro = "洛若爾",
+ Lucifron = "魯西弗隆",
+ ["Mad Magglish"] = "瘋狂的馬格利什",
+ Maexxna = "梅克絲娜",
+ ["Mage-Lord Urom"] = "法師領主厄隆",
+ ["Magister Kalendris"] = "卡雷迪斯鎮長",
+ ["Magistrate Barthilas"] = "巴瑟拉斯鎮長",
+ Magmadar = "瑪格曼達",
+ Magmus = "瑪格姆斯",
+ Magra = "瑪格拉",
+ Magtheridon = "瑪瑟里頓",
+ ["Maiden of Grief"] = "悲嘆少女",
+ ["Maiden of Virtue"] = "貞潔聖女",
+ ["Majordomo Executus"] = "管理者埃克索圖斯",
+ Malacrass = "瑪拉克雷斯",
+ ["Maleki the Pallid"] = "蒼白的瑪勒基",
+ ["Mal'Ganis"] = "瑪爾加尼斯",
+ Malygos = "瑪里苟斯",
+ Maraudos = "瑪拉多斯",
+ ["Marduk Blackpool"] = "馬杜克·布萊克波爾",
+ ["Marisa du'Paige"] = "瑪里莎·杜派格",
+ Marwyn = "麥爾溫",
+ ["Master Engineer Telonicus"] = "工程大師泰隆尼卡斯",
+ ["Maur Grimtotem"] = "瑪爾·恐怖圖騰",
+ Meathook = "肉鉤",
+ ["Mechano-Lord Capacitus"] = "機械王卡帕希特斯",
+ Medivh = "麥迪文",
+ ["Mekgineer Steamrigger"] = "米克吉勒·蒸氣操控者",
+ ["Mekgineer Thermaplugg"] = "麥克尼爾·瑟瑪普拉格",
+ ["Mennu the Betrayer"] = "背叛者曼紐",
+ ["Meshlok the Harvester"] = "『收割者』麥什洛克",
+ Midnight = "午夜",
+ Mijan = "米杉",
+ Mimiron = "彌米倫",
+ ["Miner Johnson"] = "礦工約翰森",
+ ["Mistress of Pain"] = "痛苦仕女",
+ Moam = "莫阿姆",
+ Mogor = "莫古",
+ ["Mokra the Skullcrusher"] = "『碎顱者』莫克拉",
+ Moorabi = "慕拉比",
+ Moragg = "摩拉革",
+ ["Mordresh Fire Eye"] = "火眼莫德雷斯",
+ ["Mor Grayhoof"] = "莫爾·灰蹄",
+ Moroes = "摩洛",
+ ["Morogrim Tidewalker"] = "莫洛葛利姆·潮行者",
+ Morphaz = "摩弗拉斯",
+ ["Mother Shahraz"] = "薩拉茲女士",
+ ["Mother Smolderweb"] = "煙網蛛后",
+ ["Mr. Smite"] = "重拳先生",
+ ["Muradin Bronzebeard"] = "穆拉丁·銅鬚",
+ ["Murkblood Twin"] = "黑暗之血雙子",
+ ["Murkblood Twins"] = "黑暗之血雙子",
+ Murmur = "莫爾墨",
+ ["Murta Grimgut"] = "莫爾塔",
+ ["M'uru"] = "莫魯",
+ Mushgog = "姆斯高格",
+ ["Mutanus the Devourer"] = "『吞噬者』穆坦努斯",
+ Nalorakk = "納羅拉克",
+ Nazan = "納桑",
+ Nefarian = "奈法利安",
+ ["Nekrum Gutchewer"] = "耐克魯姆",
+ ["Nerub'enkan"] = "奈幽布恩坎",
+ ["Nethermancer Sepethrea"] = "虛空術師賽菲瑞雅",
+ Netherspite = "尼德斯",
+ ["Netherstrand Longbow"] = "虛空之絃長弓",
+ ["Nexus-Prince Shaffar"] = "奈薩斯王子薩法爾",
+ Nightbane = "夜禍",
+ ["Noth the Plaguebringer"] = "『瘟疫使者』諾斯",
+ ["Novos the Summoner"] = "『召喚者』諾沃司",
+ Noxxion = "諾克賽恩",
+ ["Obsidian Sentinel"] = "黑曜石哨兵",
+ ["Odo the Blindwatcher"] = "『盲眼守衛』奧杜",
+ Oggleflint = "奧格弗林特",
+ ["Ogom the Wretched"] = "可悲的奧戈姆",
+ Ohgan = "奧根",
+ ["Ok'thor the Breaker"] = "『破壞者』奧科索爾",
+ Olaf = "奧拉夫",
+ ["Old Serra'kis"] = "瑟拉吉斯",
+ ["Olm the Summoner"] = "召喚者歐莫",
+ ["Omor the Unscarred"] = "無疤者歐瑪爾",
+ Onyxia = "奧妮克希亞",
+ ["Opera Event"] = "歌劇院",
+ ["Orgrim's Hammer"] = "奧格林之錘",
+ ["Ormorok the Tree-Shaper"] = "『樹木造形者』歐爾莫洛克",
+ ["Oro Eyegouge"] = "歐魯·鑿眼",
+ ["Ossirian the Unscarred"] = "『無疤者』奧斯里安",
+ Ouro = "奧羅",
+ ["Overlord Ramtusk"] = "拉姆塔斯主宰",
+ ["Overlord Wyrmthalak"] = "維姆薩拉克主宰",
+ ["Overmaster Pyron"] = "征服者派隆",
+ ["Overseer Tidewrath"] = "監督者泰洛斯",
+ Ozumat = "Ozumat", -- Needs review
+ Pandemonius = "班提蒙尼厄斯",
+ ["Panzor the Invincible"] = "無敵的潘佐爾",
+ Patchwerk = "縫補者",
+ ["Pathaleon the Calculator"] = "操縱者帕薩里歐",
+ Phalanx = "法拉克斯",
+ ["Phaseshift Bulwark"] = "相位壁壘",
+ Pimgib = "匹姆吉布",
+ ["Plaguemaw the Rotting"] = "腐爛的普雷莫爾",
+ ["Plugger Spazzring"] = "普拉格",
+ ["Postmaster Malown"] = "郵差瑪羅恩",
+ ["Priestess Delrissa"] = "女牧師戴利莎",
+ ["Prince Keleseth"] = "凱雷希斯親王",
+ ["Prince Malchezaar"] = "莫克札王子",
+ ["Prince Skaldrenox"] = "斯卡德諾克斯王子",
+ ["Princess Huhuran"] = "哈霍蘭公主",
+ ["Princess Moira Bronzebeard"] = "茉艾拉·銅鬚公主",
+ ["Princess Tempestria"] = "泰比斯蒂亞公主",
+ ["Princess Theradras"] = "瑟萊德絲公主",
+ ["Princess Yauj"] = "亞爾基公主",
+ ["Prince Taldaram"] = "泰爾達朗親王",
+ ["Prince Tenris Mirkblood"] = "坦瑞斯·暗血王子",
+ ["Prince Tortheldrin"] = "托塞德林王子",
+ ["Prince Valanar"] = "瓦拉納爾親王",
+ ["Professor Putricide"] = "普崔希德教授",
+ ["Pure Spawn of Hydross"] = "純正的海卓司子嗣",
+ Pusillin = "普希林",
+ ["Pyroguard Emberseer"] = "烈焰衛士艾博希爾",
+ ["Pyromancer Loregrain"] = "控火師羅格雷恩",
+ Quagmirran = "奎克米瑞",
+ ["Quartermaster Zigris"] = "軍需官茲格雷斯",
+ ["Rage Winterchill"] = "瑞齊·凜冬",
+ Ragglesnout = "拉戈斯諾特",
+ ["Raging Spirit"] = "狂怒的鬼魂",
+ Ragnaros = "拉格納羅斯",
+ ["Ramstein the Gorger"] = "『暴食者』拉姆斯登",
+ ["Ras Frostwhisper"] = "萊斯·霜語",
+ Rattlegore = "血骨傀儡",
+ ["Razorclaw the Butcher"] = "屠夫拉佐克勞",
+ ["Razorgore the Untamed"] = "狂野的拉佐格爾",
+ Razorlash = "銳刺鞭笞者",
+ Razorscale = "銳鱗",
+ ["Reliquary of Souls"] = "靈魂之匣",
+ Renataki = "雷納塔基",
+ ["Restless Skeleton"] = "永不安息的骷髏",
+ Rethilgore = "雷希戈爾",
+ Revelosh = "魯維羅什",
+ ["Rhahk'Zor"] = "拉克佐",
+ ["Ribbly Screwspigot"] = "雷布里·斯庫比格特",
+ ["Right Arm"] = "右臂",
+ ["Ring of Law"] = "秩序競技場",
+ Roar = "獅子",
+ ["Rokad the Ravager"] = "劫毀者拉卡",
+ ["Rokdar the Sundered Lord"] = "『碎裂領主』洛克達",
+ ["Rokmar the Crackler"] = "爆裂者洛克瑪",
+ ["Rom'ogg Bonecrusher"] = "Rom'ogg Bonecrusher", -- Needs review
+ Romulo = "羅慕歐",
+ ["Romulo & Julianne"] = "羅慕歐與茱麗葉",
+ Roogug = "魯古格",
+ Rotface = "腐臉",
+ Rotgrip = "洛特格里普",
+ ["Runemaster Molgeim"] = "符文大師墨吉姆",
+ ["Runok Wildmane"] = "魯諾克·蠻鬃",
+ Ruuzlu = "盧茲魯",
+ ["Salramm the Fleshcrafter"] = "『血肉工匠』塞歐朗姆",
+ ["Sanctum Sentry"] = "聖所哨兵",
+ ["Sandarr Dunereaver"] = "杉達爾·沙掠者",
+ ["Sandfury Executioner"] = "沙怒劊子手",
+ Sapphiron = "薩菲隆",
+ Sara = "薩拉",
+ ["Saronite Animus"] = "薩倫聚惡體",
+ Sartharion = "撒爾薩里安",
+ ["Sathrovarr the Corruptor"] = "『墮落者』塞斯諾瓦",
+ ["Saviana Ragefire"] = "薩薇安娜‧怒焰",
+ ["Scarlet Commander Mograine"] = "血色十字軍指揮官莫格萊尼",
+ ["Scourgelord Tyrannus"] = "天譴領主提朗紐斯",
+ ["Seeth'rel"] = "西斯雷爾",
+ ["Selin Fireheart"] = "賽林·炎心",
+ ["Sergeant Bly"] = "布萊中士",
+ ["Shade of Akama"] = "阿卡瑪的黑暗面",
+ ["Shade of Aran"] = "埃蘭之影",
+ ["Shade of Eranikus"] = "伊蘭尼庫斯的陰影",
+ ["Shadikith the Glider"] = "滑翔者薛迪依斯",
+ ["Shadow Hunter Vosh'gajin"] = "暗影獵手沃許加斯",
+ ["Shadow of Leotheras"] = "李奧薩拉斯的陰影",
+ ["Shadowpriest Sezz'ziz"] = "暗影祭司塞瑟斯",
+ Shadron = "夏德朗",
+ Shazzrah = "沙斯拉爾",
+ ["Shirrak the Dead Watcher"] = "死亡看守者辛瑞克",
+ Sindragosa = "辛德拉苟莎",
+ ["Sir Zeliek"] = "札里克爵士",
+ ["Sjonnir The Ironshaper"] = "『塑鐵者』斯雍尼爾",
+ ["Skadi the Ruthless"] = "無情的斯卡迪",
+ ["Skarr the Unbreakable"] = "無敵的斯卡爾",
+ ["Skarvald the Constructor"] = "『建造者』史卡沃",
+ ["Skra'gath"] = "史卡拉克斯",
+ Skul = "斯庫爾",
+ Skum = "斯卡姆",
+ ["Slad'ran"] = "史拉德銳",
+ Sneed = "斯尼德",
+ ["Sneed's Shredder"] = "斯尼德的伐木機",
+ ["Solakar Flamewreath"] = "索拉卡·火冠",
+ ["Solarium Agent"] = "日光之室密探",
+ ["Solarium Priest"] = "日光之室牧師",
+ ["Spirestone Battle Lord"] = "尖石戰鬥統帥",
+ ["Spirestone Butcher"] = "尖石屠夫",
+ ["Spirestone Lord Magus"] = "尖石首席魔導師",
+ ["Staff of Disintegration"] = "瓦解之杖",
+ Stalagg = "斯塔拉格",
+ Steelbreaker = "破鋼者",
+ ["Stomper Kreeg"] = "踐踏者克雷格",
+ Stonespine = "石脊",
+ ["Stormcaller Brundir"] = "風暴召喚者布倫迪爾",
+ Strawman = "稻草人",
+ ["Sulfuron Harbinger"] = "薩弗隆先驅者",
+ Supremus = "瑟普莫斯",
+ ["Svala Sorrowgrave"] = "絲瓦拉·悲傷亡墓",
+ ["Swamplord Musel'ek"] = "沼澤之王莫斯萊克",
+ Taerar = "泰拉爾",
+ ["Tainted Spawn of Hydross"] = "腐化的海卓司之子",
+ ["Talon King Ikiss"] = "鷹王伊奇斯",
+ ["Taragaman the Hungerer"] = "『飢餓者』塔拉加曼",
+ ["Targorr the Dread"] = "可怕的塔高爾",
+ Tavarok = "塔瓦洛克",
+ Techbot = "尖端機器人",
+ Temporus = "坦普拉斯",
+ ["Tendris Warpwood"] = "特迪斯·扭木",
+ Tenebron = "坦納伯朗",
+ ["Terestian Illhoof"] = "泰瑞斯提安·疫蹄",
+ ["Teron Gorefiend"] = "泰朗·血魔",
+ Thaddius = "泰迪斯",
+ ["Thaladred the Darkener"] = "扭曲預言家薩拉瑞德",
+ ["Thane Korth'azz"] = "寇斯艾茲族長",
+ ["The Beast"] = "比斯巨獸",
+ ["The Beasts of Northrend"] = "北裂境巨獸",
+ ["The Big Bad Wolf"] = "大野狼",
+ ["The Black Knight"] = "黑騎士",
+ ["The Black Stalker"] = "黑色捕獵者",
+ ["The Blue Brothers"] = "憂鬱兄弟黨",
+ ["The Bug Family"] = "蟲子家族",
+ ["The Crone"] = "老巫婆",
+ ["The Curator"] = "館長",
+ ["The Eredar Twins"] = "埃雷達爾雙子",
+ ["The Four Horsemen"] = "四騎士",
+ ["The Illidari Council"] = "伊利達瑞議事",
+ ["The Iron Council"] = "鐵之集會",
+ ["Theka the Martyr"] = "『殉教者』塞卡",
+ ["The Lich King"] = "巫妖王",
+ ["The Lost Dwarves"] = "失蹤的矮人",
+ ["The Lurker Below"] = "海底潛伏者",
+ ["The Maker"] = "創造者",
+ ["The Prophet Skeram"] = "預言者斯克拉姆",
+ ["The Prophet Tharon'ja"] = "預言者薩隆杰",
+ ["The Ravenian"] = "拉文尼亞",
+ ["The Razza"] = "拉札",
+ ["The Seven Dwarves"] = "七賢人",
+ ["The Skybreaker"] = "破天者號",
+ ["The Tribunal of Ages"] = "歲月議庭",
+ ["The Twin Emperors"] = "雙子皇帝",
+ ["The Twin Val'kyr"] = "華爾琪雙子",
+ ["The Unforgiven"] = "不可寬恕者",
+ ["The Windreaver"] = "烈風搶奪者",
+ Thorim = "索林姆",
+ ["Thorngrin the Tender"] = "『看管者』索古林",
+ ["Tidewalker Lurker"] = "潮行者潛伏者",
+ ["Timmy the Cruel"] = "悲慘的提米",
+ Tinhead = "機器人",
+ ["Tinkerer Gizlock"] = "技工吉茲洛克",
+ ["Tirion Fordring"] = "提里奧·弗丁",
+ Tito = "多多",
+ ["Toravon the Ice Watcher"] = "『寒冰看守者』拓拉梵",
+ ["Trigore the Lasher"] = "『鞭笞者』特里高雷",
+ Trollgore = "血角食人妖",
+ ["Tsu'zee"] = "蘇斯",
+ ["Tuten'kash"] = "圖特卡什",
+ ["Twilight Lord Kelris"] = "暮光領主克爾里斯",
+ ["Urok Doomhowl"] = "烏洛克",
+ ["Vaelastrasz the Corrupt"] = "墮落的瓦拉斯塔茲",
+ ["Valithria Dreamwalker"] = "瓦莉絲瑞雅·夢行者",
+ ["Val'kyr Shadowguard"] = "華爾琪影衛",
+ ["Varian Wrynn"] = "瓦里安·烏瑞恩",
+ ["Varos Cloudstrider"] = "瓦羅斯·雲行者",
+ Vazruden = "維斯路登",
+ ["Vazruden the Herald"] = "『信使』維斯路登",
+ Vectus = "維克圖斯",
+ Vem = "維姆",
+ Veng = "溫格",
+ ["Veras Darkshadow"] = "維拉斯·深影",
+ ["Verdan the Everliving"] = "永生的沃爾丹",
+ Verek = "維雷克",
+ Vesperon = "維斯佩朗",
+ Vexallus = "維克索魯斯",
+ ["Veyzhak the Cannibal"] = "『食人者』維薩克",
+ ["Vile'rel"] = "瓦勒雷爾",
+ Viscidus = "維希度斯",
+ ["Viscous Fallout"] = "粘性輻射塵",
+ ["Void Reaver"] = "虛無搶奪者",
+ Volkhan = "渥克瀚",
+ ["VX-001"] = "VX-001",
+ ["Warbringer O'mrogg"] = "戰爭製造者·歐姆拉格",
+ ["Warchief Blackhand Piece"] = "黑手大酋長棋子",
+ ["Warchief Kargath Bladefist"] = "大酋長卡加斯·刃拳",
+ ["Warchief Rend Blackhand"] = "大酋長雷德·黑手",
+ ["Warden Mellichar"] = "看守者米利恰爾",
+ ["Warder Stilgiss"] = "守衛斯迪爾基斯",
+ ["Warlord Kalithresh"] = "督軍卡利斯瑞",
+ ["War Master Voone"] = "指揮官沃恩",
+ ["Warmaul Champion"] = "戰槌勇士",
+ ["Warp Slicer"] = "扭曲分割者",
+ ["Warp Splinter"] = "扭曲分裂者",
+ ["Watchkeeper Gargolmar"] = "看護者卡爾古瑪",
+ Weaver = "德拉維沃爾",
+ ["Witch Doctor Zum'rah"] = "巫醫·祖穆拉恩",
+ ["Wolf Master Nandos"] = "狼王南杜斯",
+ ["Wrath-Scryer Soccothrates"] = "怒鐮者索寇斯瑞特",
+ Wushoolay = "烏蘇雷",
+ Xevozz = "基沃滋",
+ ["XT-002 Deconstructor"] = "XT-002拆解者",
+ ["Yogg-Saron"] = "尤格薩倫",
+ Yor = "約兒",
+ Ysondre = "伊索德雷",
+ Zekkis = "澤基斯",
+ ["Zelemar the Wrathful"] = "憤怒的賽勒瑪爾",
+ ["Zereketh the Unbound"] = "無約束的希瑞奇斯",
+ Zerillis = "澤雷利斯",
+ ["Zevrim Thornhoof"] = "瑟雷姆·刺蹄",
+ Zolo = "祖羅",
+ ["Zul'Farrak Dead Hero"] = "祖爾法拉克陣亡英雄",
+ ["Zul'jin"] = "祖爾金",
+ ["Zul'Lor"] = "祖羅爾",
+ ["Zul'tore"] = "祖爾拓",
+ ["Zuramat the Obliterator"] = "『消滅者』舒拉邁特",
+}
+
+else
+ error(("%s: Locale %q not supported"):format(MAJOR_VERSION, GAME_LOCALE))
+end
diff --git a/AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-Boss-3.0.toc b/AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-Boss-3.0.toc
new file mode 100644
index 0000000..7a47b64
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Boss-3.0/LibBabble-Boss-3.0.toc
@@ -0,0 +1,21 @@
+## Interface: 30300
+## LoadOnDemand: 1
+## Title: Lib: Babble-Boss-3.0
+## Notes: A library to help with localization of bosses.
+## Notes-zhCN: 为本地化服务的支持库[首领名称]
+## Notes-zhTW: 為本地化服務的函式庫[首領名稱]
+## Notes-deDE: BabbleLib ist eine Bibliothek, die bei der Lokalisierung helfen soll.
+## Notes-frFR: Une bibliothèque d'aide à la localisation.
+## Notes-esES: Una biblioteca para ayudar con las localizaciones.
+## Author: ckknight
+## X-eMail: ckknight@gmail.com
+## X-Category: Library
+## X-License: MIT
+## X-Curse-Packaged-Version: r296
+## X-Curse-Project-Name: LibBabble-Boss-3.0
+## X-Curse-Project-ID: libbabble-boss-3-0
+## X-Curse-Repository-ID: wow/libbabble-boss-3-0/mainline
+
+LibStub\LibStub.lua
+lib.xml
+
diff --git a/AtlasLoot/Libs/LibBabble-Boss-3.0/LibStub/LibStub.lua b/AtlasLoot/Libs/LibBabble-Boss-3.0/LibStub/LibStub.lua
new file mode 100644
index 0000000..cfc97de
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Boss-3.0/LibStub/LibStub.lua
@@ -0,0 +1,30 @@
+-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
+-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
+local LibStub = _G[LIBSTUB_MAJOR]
+
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+ LibStub = LibStub or {libs = {}, minors = {} }
+ _G[LIBSTUB_MAJOR] = LibStub
+ LibStub.minor = LIBSTUB_MINOR
+
+ function LibStub:NewLibrary(major, minor)
+ assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+ minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
+
+ local oldminor = self.minors[major]
+ if oldminor and oldminor >= minor then return nil end
+ self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+ return self.libs[major], oldminor
+ end
+
+ function LibStub:GetLibrary(major, silent)
+ if not self.libs[major] and not silent then
+ error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
+ end
+ return self.libs[major], self.minors[major]
+ end
+
+ function LibStub:IterateLibraries() return pairs(self.libs) end
+ setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
diff --git a/AtlasLoot/Libs/LibBabble-Boss-3.0/lib.xml b/AtlasLoot/Libs/LibBabble-Boss-3.0/lib.xml
new file mode 100644
index 0000000..1680d7d
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Boss-3.0/lib.xml
@@ -0,0 +1,5 @@
+
+
+
+
diff --git a/AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-3.0.lua b/AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-3.0.lua
new file mode 100644
index 0000000..9b032f3
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-3.0.lua
@@ -0,0 +1,292 @@
+-- LibBabble-3.0 is hereby placed in the Public Domain
+-- Credits: ckknight
+local LIBBABBLE_MAJOR, LIBBABBLE_MINOR = "LibBabble-3.0", 2
+
+local LibBabble = LibStub:NewLibrary(LIBBABBLE_MAJOR, LIBBABBLE_MINOR)
+if not LibBabble then
+ return
+end
+
+local data = LibBabble.data or {}
+for k,v in pairs(LibBabble) do
+ LibBabble[k] = nil
+end
+LibBabble.data = data
+
+local tablesToDB = {}
+for namespace, db in pairs(data) do
+ for k,v in pairs(db) do
+ tablesToDB[v] = db
+ end
+end
+
+local function warn(message)
+ local _, ret = pcall(error, message, 3)
+ geterrorhandler()(ret)
+end
+
+local lookup_mt = { __index = function(self, key)
+ local db = tablesToDB[self]
+ local current_key = db.current[key]
+ if current_key then
+ self[key] = current_key
+ return current_key
+ end
+ local base_key = db.base[key]
+ local real_MAJOR_VERSION
+ for k,v in pairs(data) do
+ if v == db then
+ real_MAJOR_VERSION = k
+ break
+ end
+ end
+ if not real_MAJOR_VERSION then
+ real_MAJOR_VERSION = LIBBABBLE_MAJOR
+ end
+ if base_key then
+ warn(("%s: Translation %q not found for locale %q"):format(real_MAJOR_VERSION, key, GetLocale()))
+ rawset(self, key, base_key)
+ return base_key
+ end
+ warn(("%s: Translation %q not found."):format(real_MAJOR_VERSION, key))
+ rawset(self, key, key)
+ return key
+end }
+
+local function initLookup(module, lookup)
+ local db = tablesToDB[module]
+ for k in pairs(lookup) do
+ lookup[k] = nil
+ end
+ setmetatable(lookup, lookup_mt)
+ tablesToDB[lookup] = db
+ db.lookup = lookup
+ return lookup
+end
+
+local function initReverse(module, reverse)
+ local db = tablesToDB[module]
+ for k in pairs(reverse) do
+ reverse[k] = nil
+ end
+ for k,v in pairs(db.current) do
+ reverse[v] = k
+ end
+ tablesToDB[reverse] = db
+ db.reverse = reverse
+ db.reverseIterators = nil
+ return reverse
+end
+
+local prototype = {}
+local prototype_mt = {__index = prototype}
+
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will warn but allow the code to pass through.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local BL = B:GetLookupTable()
+ assert(BL["Some english word"] == "Some localized word")
+ DoSomething(BL["Some english word that doesn't exist"]) -- warning!
+-----------------------------------------------------------------------------]]
+function prototype:GetLookupTable()
+ local db = tablesToDB[self]
+
+ local lookup = db.lookup
+ if lookup then
+ return lookup
+ end
+ return initLookup(self, {})
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local B_has = B:GetUnstrictLookupTable()
+ assert(B_has["Some english word"] == "Some localized word")
+ assert(B_has["Some english word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetUnstrictLookupTable()
+ local db = tablesToDB[self]
+
+ return db.current
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+ * This is useful for checking if the base (English) table has a key, even if the localized one does not have it registered.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local B_hasBase = B:GetBaseLookupTable()
+ assert(B_hasBase["Some english word"] == "Some english word")
+ assert(B_hasBase["Some english word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetBaseLookupTable()
+ local db = tablesToDB[self]
+
+ return db.base
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+ * This will return only one English word that it maps to, if there are more than one to check, see :GetReverseIterator("word")
+Returns:
+ A lookup table for localized to english words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local BR = B:GetReverseLookupTable()
+ assert(BR["Some localized word"] == "Some english word")
+ assert(BR["Some localized word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetReverseLookupTable()
+ local db = tablesToDB[self]
+
+ local reverse = db.reverse
+ if reverse then
+ return reverse
+ end
+ return initReverse(self, {})
+end
+local blank = {}
+local weakVal = {__mode='v'}
+--[[---------------------------------------------------------------------------
+Arguments:
+ string - the localized word to chek for.
+Returns:
+ An iterator to traverse all English words that map to the given key
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ for word in B:GetReverseIterator("Some localized word") do
+ DoSomething(word)
+ end
+-----------------------------------------------------------------------------]]
+function prototype:GetReverseIterator(key)
+ local db = tablesToDB[self]
+ local reverseIterators = db.reverseIterators
+ if not reverseIterators then
+ reverseIterators = setmetatable({}, weakVal)
+ db.reverseIterators = reverseIterators
+ elseif reverseIterators[key] then
+ return pairs(reverseIterators[key])
+ end
+ local t
+ for k,v in pairs(db.current) do
+ if v == key then
+ if not t then
+ t = {}
+ end
+ t[k] = true
+ end
+ end
+ reverseIterators[key] = t or blank
+ return pairs(reverseIterators[key])
+end
+--[[---------------------------------------------------------------------------
+Returns:
+ An iterator to traverse all translations English to localized.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ for english, localized in B:Iterate() do
+ DoSomething(english, localized)
+ end
+-----------------------------------------------------------------------------]]
+function prototype:Iterate()
+ local db = tablesToDB[self]
+
+ return pairs(db.current)
+end
+
+-- #NODOC
+-- modules need to call this to set the base table
+function prototype:SetBaseTranslations(base)
+ local db = tablesToDB[self]
+ local oldBase = db.base
+ if oldBase then
+ for k in pairs(oldBase) do
+ oldBase[k] = nil
+ end
+ for k, v in pairs(base) do
+ oldBase[k] = v
+ end
+ base = oldBase
+ else
+ db.base = base
+ end
+ for k,v in pairs(base) do
+ if v == true then
+ base[k] = k
+ end
+ end
+end
+
+local function init(module)
+ local db = tablesToDB[module]
+ if db.lookup then
+ initLookup(module, db.lookup)
+ end
+ if db.reverse then
+ initReverse(module, db.reverse)
+ end
+ db.reverseIterators = nil
+end
+
+-- #NODOC
+-- modules need to call this to set the current table. if current is true, use the base table.
+function prototype:SetCurrentTranslations(current)
+ local db = tablesToDB[self]
+ if current == true then
+ db.current = db.base
+ else
+ local oldCurrent = db.current
+ if oldCurrent then
+ for k in pairs(oldCurrent) do
+ oldCurrent[k] = nil
+ end
+ for k, v in pairs(current) do
+ oldCurrent[k] = v
+ end
+ current = oldCurrent
+ else
+ db.current = current
+ end
+ end
+ init(self)
+end
+
+for namespace, db in pairs(data) do
+ setmetatable(db.module, prototype_mt)
+ init(db.module)
+end
+
+-- #NODOC
+-- modules need to call this to create a new namespace.
+function LibBabble:New(namespace, minor)
+ local module, oldminor = LibStub:NewLibrary(namespace, minor)
+ if not module then
+ return
+ end
+
+ if not oldminor then
+ local db = {
+ module = module,
+ }
+ data[namespace] = db
+ tablesToDB[module] = db
+ else
+ for k,v in pairs(module) do
+ module[k] = nil
+ end
+ end
+
+ setmetatable(module, prototype_mt)
+
+ return module
+end
diff --git a/AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-Faction-3.0.lua b/AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-Faction-3.0.lua
new file mode 100644
index 0000000..5ab6768
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-Faction-3.0.lua
@@ -0,0 +1,799 @@
+--[[
+Name: LibBabble-Faction-3.0
+Revision: $Rev: 112 $
+Maintainers: ckknight, nevcairiel, Ackis
+Website: http://www.wowace.com/projects/libbabble-faction-3-0/
+Dependencies: None
+License: MIT
+]]
+
+local MAJOR_VERSION = "LibBabble-Faction-3.0"
+local MINOR_VERSION = 90000 + tonumber(("$Rev: 112 $"):match("%d+"))
+
+if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
+local lib = LibStub("LibBabble-3.0"):New(MAJOR_VERSION, MINOR_VERSION)
+if not lib then return end
+
+local GAME_LOCALE = GetLocale()
+
+lib:SetBaseTranslations {
+ Alliance = "Alliance",
+ ["Alliance Vanguard"] = "Alliance Vanguard",
+ ["Argent Crusade"] = "Argent Crusade",
+ ["Argent Dawn"] = "Argent Dawn",
+ ["Ashtongue Deathsworn"] = "Ashtongue Deathsworn",
+ ["Bloodsail Buccaneers"] = "Bloodsail Buccaneers",
+ ["Booty Bay"] = "Booty Bay",
+ ["Brood of Nozdormu"] = "Brood of Nozdormu",
+ ["Cenarion Circle"] = "Cenarion Circle",
+ ["Cenarion Expedition"] = "Cenarion Expedition",
+ ["Darkmoon Faire"] = "Darkmoon Faire",
+ ["Darkspear Trolls"] = "Darkspear Trolls",
+ Darnassus = "Darnassus",
+ Everlook = "Everlook",
+ Exalted = "Exalted",
+ Exodar = "Exodar",
+ ["Explorers' League"] = "Explorers' League",
+ ["Frenzyheart Tribe"] = "Frenzyheart Tribe",
+ Friendly = "Friendly",
+ ["Frostwolf Clan"] = "Frostwolf Clan",
+ Gadgetzan = "Gadgetzan",
+ ["Gelkis Clan Centaur"] = "Gelkis Clan Centaur",
+ ["Gnomeregan Exiles"] = "Gnomeregan Exiles",
+ Honored = "Honored",
+ ["Honor Hold"] = "Honor Hold",
+ Horde = "Horde",
+ ["Horde Expedition"] = "Horde Expedition",
+ ["Hydraxian Waterlords"] = "Hydraxian Waterlords",
+ Ironforge = "Ironforge",
+ ["Keepers of Time"] = "Keepers of Time",
+ ["Kirin Tor"] = "Kirin Tor",
+ ["Knights of the Ebon Blade"] = "Knights of the Ebon Blade",
+ Kurenai = "Kurenai",
+ ["Lower City"] = "Lower City",
+ ["Magram Clan Centaur"] = "Magram Clan Centaur",
+ Netherwing = "Netherwing",
+ Neutral = "Neutral",
+ ["Ogri'la"] = "Ogri'la",
+ Orgrimmar = "Orgrimmar",
+ Ratchet = "Ratchet",
+ Ravenholdt = "Ravenholdt",
+ Revered = "Revered",
+ ["Sha'tari Skyguard"] = "Sha'tari Skyguard",
+ ["Shattered Sun Offensive"] = "Shattered Sun Offensive",
+ ["Shen'dralar"] = "Shen'dralar",
+ ["Silvermoon City"] = "Silvermoon City",
+ ["Silverwing Sentinels"] = "Silverwing Sentinels",
+ Sporeggar = "Sporeggar",
+ ["Stormpike Guard"] = "Stormpike Guard",
+ Stormwind = "Stormwind",
+ Syndicate = "Syndicate",
+ ["The Aldor"] = "The Aldor",
+ ["The Ashen Verdict"] = "The Ashen Verdict",
+ ["The Consortium"] = "The Consortium",
+ ["The Defilers"] = "The Defilers",
+ ["The Frostborn"] = "The Frostborn",
+ ["The Hand of Vengeance"] = "The Hand of Vengeance",
+ ["The Kalu'ak"] = "The Kalu'ak",
+ ["The League of Arathor"] = "The League of Arathor",
+ ["The Mag'har"] = "The Mag'har",
+ ["The Oracles"] = "The Oracles",
+ ["The Scale of the Sands"] = "The Scale of the Sands",
+ ["The Scryers"] = "The Scryers",
+ ["The Sha'tar"] = "The Sha'tar",
+ ["The Silver Covenant"] = "The Silver Covenant",
+ ["The Sons of Hodir"] = "The Sons of Hodir",
+ ["The Sunreavers"] = "The Sunreavers",
+ ["The Taunka"] = "The Taunka",
+ ["The Violet Eye"] = "The Violet Eye",
+ ["The Wyrmrest Accord"] = "The Wyrmrest Accord",
+ ["Thorium Brotherhood"] = "Thorium Brotherhood",
+ Thrallmar = "Thrallmar",
+ ["Thunder Bluff"] = "Thunder Bluff",
+ ["Timbermaw Hold"] = "Timbermaw Hold",
+ Tranquillien = "Tranquillien",
+ Undercity = "Undercity",
+ ["Valiance Expedition"] = "Valiance Expedition",
+ ["Warsong Offensive"] = "Warsong Offensive",
+ ["Warsong Outriders"] = "Warsong Outriders",
+ ["Wildhammer Clan"] = "Wildhammer Clan",
+ ["Winterfin Retreat"] = "Winterfin Retreat",
+ ["Wintersaber Trainers"] = "Wintersaber Trainers",
+ ["Zandalar Tribe"] = "Zandalar Tribe",
+}
+
+
+if GAME_LOCALE == "enUS" then
+ lib:SetCurrentTranslations(true)
+elseif GAME_LOCALE == "deDE" then
+ lib:SetCurrentTranslations {
+ Alliance = "Allianz",
+ ["Alliance Vanguard"] = "Vorposten der Allianz",
+ ["Argent Crusade"] = "Argentumkreuzzug",
+ ["Argent Dawn"] = "Argentumdämmerung",
+ ["Ashtongue Deathsworn"] = "Die Todeshörigen",
+ ["Bloodsail Buccaneers"] = "Blutsegelbukaniere",
+ ["Booty Bay"] = "Beutebucht",
+ ["Brood of Nozdormu"] = "Brut Nozdormus",
+ ["Cenarion Circle"] = "Zirkel des Cenarius",
+ ["Cenarion Expedition"] = "Expedition des Cenarius",
+ ["Darkmoon Faire"] = "Dunkelmond-Jahrmarkt",
+ ["Darkspear Trolls"] = "Dunkelspeertrolle",
+ Darnassus = "Darnassus",
+ Everlook = "Ewige Warte",
+ Exalted = "Ehrfürchtig",
+ Exodar = "Die Exodar",
+ ["Explorers' League"] = "Forscherliga",
+ ["Frenzyheart Tribe"] = "Stamm der Wildherzen",
+ Friendly = "Freundlich",
+ ["Frostwolf Clan"] = "Frostwolfklan",
+ Gadgetzan = "Gadgetzan",
+ ["Gelkis Clan Centaur"] = "Gelkisklan",
+ ["Gnomeregan Exiles"] = "Gnomeregangnome",
+ Honored = "Wohlwollend",
+ ["Honor Hold"] = "Ehrenfeste",
+ Horde = "Horde",
+ ["Horde Expedition"] = "Expedition der Horde",
+ ["Hydraxian Waterlords"] = "Hydraxianer",
+ Ironforge = "Eisenschmiede",
+ ["Keepers of Time"] = "Hüter der Zeit",
+ ["Kirin Tor"] = "Kirin Tor",
+ ["Knights of the Ebon Blade"] = "Ritter der Schwarzen Klinge",
+ Kurenai = "Kurenai",
+ ["Lower City"] = "Unteres Viertel",
+ ["Magram Clan Centaur"] = "Magramklan",
+ Netherwing = "Netherschwingen",
+ Neutral = "Neutral",
+ ["Ogri'la"] = "Ogri'la",
+ Orgrimmar = "Orgrimmar",
+ Ratchet = "Ratschet",
+ Ravenholdt = "Rabenholdt",
+ Revered = "Respektvoll",
+ ["Sha'tari Skyguard"] = "Himmelswache der Sha'tari",
+ ["Shattered Sun Offensive"] = "Offensive der Zerschmetterten Sonne",
+ ["Shen'dralar"] = "Shen'dralar",
+ ["Silvermoon City"] = "Silbermond",
+ ["Silverwing Sentinels"] = "Silberschwingen",
+ Sporeggar = "Sporeggar",
+ ["Stormpike Guard"] = "Sturmlanzengarde",
+ Stormwind = "Sturmwind",
+ Syndicate = "Syndikat",
+ ["The Aldor"] = "Die Aldor",
+ ["The Ashen Verdict"] = "Das Äscherne Verdikt",
+ ["The Consortium"] = "Das Konsortium",
+ ["The Defilers"] = "Die Entweihten",
+ ["The Frostborn"] = "Die Frosterben",
+ ["The Hand of Vengeance"] = "Die Hand der Rache",
+ ["The Kalu'ak"] = "Die Kalu'ak",
+ ["The League of Arathor"] = "Der Bund von Arathor",
+ ["The Mag'har"] = "Die Mag'har",
+ ["The Oracles"] = "Die Orakel",
+ ["The Scale of the Sands"] = "Die Wächter der Sande",
+ ["The Scryers"] = "Die Seher",
+ ["The Sha'tar"] = "Die Sha'tar",
+ ["The Silver Covenant"] = "Der Silberbund",
+ ["The Sons of Hodir"] = "Die Söhne Hodirs",
+ ["The Sunreavers"] = "Die Sonnenhäscher",
+ ["The Taunka"] = "Die Taunka",
+ ["The Violet Eye"] = "Das Violette Auge",
+ ["The Wyrmrest Accord"] = "Der Wyrmruhpakt",
+ ["Thorium Brotherhood"] = "Thoriumbruderschaft",
+ Thrallmar = "Thrallmar",
+ ["Thunder Bluff"] = "Donnerfels",
+ ["Timbermaw Hold"] = "Holzschlundfeste",
+ Tranquillien = "Tristessa",
+ Undercity = "Unterstadt",
+ ["Valiance Expedition"] = "Expedition Valianz",
+ ["Warsong Offensive"] = "Kriegshymnenoffensive",
+ ["Warsong Outriders"] = "Vorhut des Kriegshymnenklan",
+ ["Wildhammer Clan"] = "Wildhammerklan",
+ ["Winterfin Retreat"] = "Zuflucht der Winterflossen",
+ ["Wintersaber Trainers"] = "Wintersäblerausbilder",
+ ["Zandalar Tribe"] = "Stamm der Zandalari",
+}
+elseif GAME_LOCALE == "frFR" then
+ lib:SetCurrentTranslations {
+ Alliance = "Alliance",
+ ["Alliance Vanguard"] = "Avant-garde de l'Alliance",
+ ["Argent Crusade"] = "La Croisade d'argent",
+ ["Argent Dawn"] = "Aube d'argent",
+ ["Ashtongue Deathsworn"] = "Ligemort cendrelangue",
+ ["Bloodsail Buccaneers"] = "La Voile sanglante",
+ ["Booty Bay"] = "Baie-du-Butin",
+ ["Brood of Nozdormu"] = "Progéniture de Nozdormu",
+ ["Cenarion Circle"] = "Cercle cénarien",
+ ["Cenarion Expedition"] = "Expédition cénarienne",
+ ["Darkmoon Faire"] = "Foire de Sombrelune",
+ ["Darkspear Trolls"] = "Trolls Sombrelance",
+ Darnassus = "Darnassus",
+ Everlook = "Long-guet",
+ Exalted = "Exalté",
+ Exodar = "Exodar",
+ ["Explorers' League"] = "Ligue des explorateurs",
+ ["Frenzyheart Tribe"] = "La tribu Frénécœur",
+ Friendly = "Amical",
+ ["Frostwolf Clan"] = "Clan Loup-de-givre",
+ Gadgetzan = "Gadgetzan",
+ ["Gelkis Clan Centaur"] = "Centaures (Gelkis)",
+ ["Gnomeregan Exiles"] = "Exilés de Gnomeregan",
+ Honored = "Honoré",
+ ["Honor Hold"] = "Bastion de l'Honneur",
+ Horde = "Horde",
+ ["Horde Expedition"] = "Expédition de la Horde",
+ ["Hydraxian Waterlords"] = "Les Hydraxiens",
+ Ironforge = "Forgefer",
+ ["Keepers of Time"] = "Gardiens du Temps",
+ ["Kirin Tor"] = "Kirin Tor",
+ ["Knights of the Ebon Blade"] = "Chevaliers de la Lame d'ébène",
+ Kurenai = "Kurenaï",
+ ["Lower City"] = "Ville basse",
+ ["Magram Clan Centaur"] = "Centaures (Magram)",
+ Netherwing = "Aile-du-Néant",
+ Neutral = "Neutre",
+ ["Ogri'la"] = "Ogri'la",
+ Orgrimmar = "Orgrimmar",
+ Ratchet = "Cabestan",
+ Ravenholdt = "Ravenholdt",
+ Revered = "Révéré",
+ ["Sha'tari Skyguard"] = "Garde-ciel sha'tari",
+ ["Shattered Sun Offensive"] = "Opération Soleil brisé",
+ ["Shen'dralar"] = "Shen'dralar",
+ ["Silvermoon City"] = "Lune-d'argent",
+ ["Silverwing Sentinels"] = "Sentinelles d'Aile-argent",
+ Sporeggar = "Sporeggar",
+ ["Stormpike Guard"] = "Garde Foudrepique",
+ Stormwind = "Hurlevent",
+ Syndicate = "Syndicat",
+ ["The Aldor"] = "L'Aldor",
+ ["The Ashen Verdict"] = "Le Verdict des cendres",
+ ["The Consortium"] = "Le Consortium",
+ ["The Defilers"] = "Les Profanateurs",
+ ["The Frostborn"] = "Les Givre-nés",
+ ["The Hand of Vengeance"] = "La Main de la vengeance",
+ ["The Kalu'ak"] = "Les Kalu'aks",
+ ["The League of Arathor"] = "La Ligue d'Arathor",
+ ["The Mag'har"] = "Les Mag'har",
+ ["The Oracles"] = "Les Oracles",
+ ["The Scale of the Sands"] = "La Balance des sables",
+ ["The Scryers"] = "Les Clairvoyants",
+ ["The Sha'tar"] = "Les Sha'tar",
+ ["The Silver Covenant"] = "Le Concordat argenté",
+ ["The Sons of Hodir"] = "Les Fils de Hodir",
+ ["The Sunreavers"] = "Les Saccage-soleil",
+ ["The Taunka"] = "Les Taunkas",
+ ["The Violet Eye"] = "L'Œil pourpre",
+ ["The Wyrmrest Accord"] = "L'Accord du Repos du ver",
+ ["Thorium Brotherhood"] = "Confrérie du thorium",
+ Thrallmar = "Thrallmar",
+ ["Thunder Bluff"] = "Les Pitons du Tonnerre",
+ ["Timbermaw Hold"] = "Les Grumegueules",
+ Tranquillien = "Tranquillien",
+ Undercity = "Fossoyeuse",
+ ["Valiance Expedition"] = "Expédition de la Bravoure",
+ ["Warsong Offensive"] = "Offensive chanteguerre",
+ ["Warsong Outriders"] = "Voltigeurs Chanteguerre",
+ ["Wildhammer Clan"] = "Clan Marteau-hardi",
+ ["Winterfin Retreat"] = "Retraite des Ailerons-d'hiver",
+ ["Wintersaber Trainers"] = "Éleveurs de sabres-d'hiver",
+ ["Zandalar Tribe"] = "Tribu Zandalar",
+}
+elseif GAME_LOCALE == "koKR" then
+ lib:SetCurrentTranslations {
+ Alliance = "얼라이언스",
+ ["Alliance Vanguard"] = "얼라이언스 선봉대",
+ ["Argent Crusade"] = "은빛십자군",
+ ["Argent Dawn"] = "은빛 여명회",
+ ["Ashtongue Deathsworn"] = "잿빛혓바닥 결사단",
+ ["Bloodsail Buccaneers"] = "붉은 해적단",
+ ["Booty Bay"] = "무법항",
+ ["Brood of Nozdormu"] = "노즈도르무 혈족",
+ ["Cenarion Circle"] = "세나리온 의회",
+ ["Cenarion Expedition"] = "세나리온 원정대",
+ ["Darkmoon Faire"] = "다크문 유랑단",
+ ["Darkspear Trolls"] = "검은창 트롤",
+ Darnassus = "다르나서스",
+ Everlook = "눈망루 마을",
+ Exalted = "확고한 동맹",
+ Exodar = "엑소다르",
+ ["Explorers' League"] = "탐험가 연맹",
+ ["Frenzyheart Tribe"] = "광란의심장일족",
+ Friendly = "약간 우호적",
+ ["Frostwolf Clan"] = "서리늑대 부족",
+ Gadgetzan = "가젯잔",
+ ["Gelkis Clan Centaur"] = "겔키스 부족 켄타로우스",
+ ["Gnomeregan Exiles"] = "놈리건",
+ Honored = "우호적",
+ ["Honor Hold"] = "명예의 요새",
+ Horde = "호드",
+ ["Horde Expedition"] = "호드 원정대",
+ ["Hydraxian Waterlords"] = "히드락시안 물의 군주",
+ Ironforge = "아이언포지",
+ ["Keepers of Time"] = "시간의 수호자",
+ ["Kirin Tor"] = "키린 토",
+ ["Knights of the Ebon Blade"] = "칠흑의 기사단",
+ Kurenai = "쿠레나이",
+ ["Lower City"] = "고난의 거리",
+ ["Magram Clan Centaur"] = "마그람 부족 켄타로우스",
+ Netherwing = "황천의 용군단",
+ Neutral = "중립적",
+ ["Ogri'la"] = "오그릴라",
+ Orgrimmar = "오그리마",
+ Ratchet = "톱니항",
+ Ravenholdt = "라벤홀트",
+ Revered = "매우 우호적",
+ ["Sha'tari Skyguard"] = "샤타리 하늘경비대",
+ ["Shattered Sun Offensive"] = "무너진 태양 공격대",
+ ["Shen'dralar"] = "센드렐라",
+ ["Silvermoon City"] = "실버문",
+ ["Silverwing Sentinels"] = "은빛날개 파수대",
+ Sporeggar = "스포어가르",
+ ["Stormpike Guard"] = "스톰파이크 경비대",
+ Stormwind = "스톰윈드",
+ Syndicate = "비밀결사대",
+ ["The Aldor"] = "알도르 사제회",
+ ["The Ashen Verdict"] = "잿빛 선고단",
+ ["The Consortium"] = "무역연합",
+ ["The Defilers"] = "포세이큰 파멸단",
+ ["The Frostborn"] = "서릿결부족 드워프",
+ ["The Hand of Vengeance"] = "복수의 대리인",
+ ["The Kalu'ak"] = "칼루아크",
+ ["The League of Arathor"] = "아라소르 연맹",
+ ["The Mag'har"] = "마그하르",
+ ["The Oracles"] = "점쟁이 조합",
+ ["The Scale of the Sands"] = "시간의 중재자",
+ ["The Scryers"] = "점술가 길드",
+ ["The Sha'tar"] = "샤타르",
+ ["The Silver Covenant"] = "은빛 서약단",
+ ["The Sons of Hodir"] = "호디르의 후예",
+ ["The Sunreavers"] = "선리버",
+ ["The Taunka"] = "타운카",
+ ["The Violet Eye"] = "보랏빛 눈의 감시자",
+ ["The Wyrmrest Accord"] = "고룡쉼터 사원 용군단",
+ ["Thorium Brotherhood"] = "토륨 대장조합 ",
+ Thrallmar = "스랄마",
+ ["Thunder Bluff"] = "썬더 블러프",
+ ["Timbermaw Hold"] = "나무구렁 요새",
+ Tranquillien = "트랜퀼리엔",
+ Undercity = "언더시티",
+ ["Valiance Expedition"] = "용맹의 원정대",
+ ["Warsong Offensive"] = "전쟁노래 공격대",
+ ["Warsong Outriders"] = "전쟁노래 정찰대",
+ ["Wildhammer Clan"] = "와일드해머 부족",
+ ["Winterfin Retreat"] = "겨울지느러미 은신처",
+ ["Wintersaber Trainers"] = "눈호랑이 조련사",
+ ["Zandalar Tribe"] = "잔달라 부족",
+}
+elseif GAME_LOCALE == "esES" then
+ lib:SetCurrentTranslations {
+ Alliance = "Alianza",
+ ["Alliance Vanguard"] = "Vanguardia de la Alianza",
+ ["Argent Crusade"] = "Cruzada Argenta",
+ ["Argent Dawn"] = "El Alba Argenta",
+ ["Ashtongue Deathsworn"] = "Juramorte Lengua de ceniza",
+ ["Bloodsail Buccaneers"] = "Bucaneros Velasangre",
+ ["Booty Bay"] = "Bahía del Botín",
+ ["Brood of Nozdormu"] = "Linaje de Nozdormu",
+ ["Cenarion Circle"] = "Círculo Cenarion",
+ ["Cenarion Expedition"] = "Expedición Cenarion",
+ ["Darkmoon Faire"] = "Feria de la Luna Negra",
+ ["Darkspear Trolls"] = "Trols Lanza Negra",
+ Darnassus = "Darnassus",
+ Everlook = "Vista Eterna",
+ Exalted = "Exaltado",
+ Exodar = "El Exodar",
+ ["Explorers' League"] = "Liga de Expedicionarios",
+ ["Frenzyheart Tribe"] = "Tribu Corazón Frenético",
+ Friendly = "Amistoso",
+ ["Frostwolf Clan"] = "Clan Lobo Gélido",
+ Gadgetzan = "Gadgetzan",
+ ["Gelkis Clan Centaur"] = "Centauros del clan Gelkis",
+ ["Gnomeregan Exiles"] = "Exiliados de Gnomeregan",
+ Honored = "Honorable",
+ ["Honor Hold"] = "Bastión del Honor",
+ Horde = "Horda",
+ ["Horde Expedition"] = "Expedición de la Horda",
+ ["Hydraxian Waterlords"] = "Srs. del Agua de Hydraxis",
+ Ironforge = "Forjaz",
+ ["Keepers of Time"] = "Vigilantes del Tiempo",
+ ["Kirin Tor"] = "Kirin Tor",
+ ["Knights of the Ebon Blade"] = "Caballeros de la Espada de Ébano",
+ Kurenai = "Kurenai",
+ ["Lower City"] = "Bajo Arrabal",
+ ["Magram Clan Centaur"] = "Centauros del clan Magram",
+ Netherwing = "Ala Abisal",
+ Neutral = "Neutral",
+ ["Ogri'la"] = "Ogri'la",
+ Orgrimmar = "Orgrimmar",
+ Ratchet = "Trinquete",
+ Ravenholdt = "Ravenholdt",
+ Revered = "Reverenciado",
+ ["Sha'tari Skyguard"] = "Guardia del cielo Sha'tari",
+ ["Shattered Sun Offensive"] = "Ofensiva Sol Devastado",
+ ["Shen'dralar"] = "Shen'dralar",
+ ["Silvermoon City"] = "Ciudad de Lunargenta",
+ ["Silverwing Sentinels"] = "Centinelas Ala de Plata",
+ Sporeggar = "Esporaggar",
+ ["Stormpike Guard"] = "Guardia Pico Tormenta",
+ Stormwind = "Ventormenta",
+ Syndicate = "La Hermandad",
+ ["The Aldor"] = "Los Aldor",
+ ["The Ashen Verdict"] = "El Veredicto Cinéreo",
+ ["The Consortium"] = "El Consorcio",
+ ["The Defilers"] = "Los Rapiñadores",
+ ["The Frostborn"] = "Los Natoescarcha",
+ ["The Hand of Vengeance"] = "La Mano de la Venganza",
+ ["The Kalu'ak"] = "Los Kalu'ak",
+ ["The League of Arathor"] = "Liga de Arathor",
+ ["The Mag'har"] = "Los Mag'har",
+ ["The Oracles"] = "Los Oráculos",
+ ["The Scale of the Sands"] = "La Escama de las Arenas",
+ ["The Scryers"] = "Los Arúspices",
+ ["The Sha'tar"] = "Los Sha'tar",
+ ["The Silver Covenant"] = "El Pacto de Plata",
+ ["The Sons of Hodir"] = "Los Hijos de Hodir",
+ ["The Sunreavers"] = "Los Atracasol",
+ ["The Taunka"] = "Los Taunka",
+ ["The Violet Eye"] = "El Ojo Violeta",
+ ["The Wyrmrest Accord"] = "El Acuerdo del Reposo del Dragón",
+ ["Thorium Brotherhood"] = "Hermandad del Torio",
+ Thrallmar = "Thrallmar",
+ ["Thunder Bluff"] = "Cima del Trueno",
+ ["Timbermaw Hold"] = "Bastión Fauces de Madera",
+ Tranquillien = "Tranquillien",
+ Undercity = "Entrañas",
+ ["Valiance Expedition"] = "Expedición de Denuedo",
+ ["Warsong Offensive"] = "Ofensiva Grito de Guerra",
+ ["Warsong Outriders"] = "Escoltas Grito de Guerra",
+ ["Wildhammer Clan"] = "Clan Martillo Salvaje",
+ ["Winterfin Retreat"] = "Retiro Aleta Invernal",
+ ["Wintersaber Trainers"] = "Instructores de Sableinvernales",
+ ["Zandalar Tribe"] = "Tribu Zandalar",
+}
+elseif GAME_LOCALE == "esMX" then
+ lib:SetCurrentTranslations {
+ Alliance = "Alianza",
+ ["Alliance Vanguard"] = "Vanguardia de la Alianza",
+ ["Argent Crusade"] = "Cruzada Argenta",
+ ["Argent Dawn"] = "Alba Argenta",
+ ["Ashtongue Deathsworn"] = "Juramorte Lengua de ceniza",
+ ["Bloodsail Buccaneers"] = "Bucaneros Velasangre",
+ ["Booty Bay"] = "Bahía del Botín",
+ ["Brood of Nozdormu"] = "Linaje de Nozdormu",
+ ["Cenarion Circle"] = "Círculo Cenarion",
+ ["Cenarion Expedition"] = "Expedición Cenarion",
+ ["Darkmoon Faire"] = "Feria de la Luna Negra",
+ ["Darkspear Trolls"] = "Trols Lanza Negra",
+ Darnassus = "Darnassus",
+ Everlook = "Vista Eterna",
+ Exalted = "Exaltado",
+ Exodar = "Exodar",
+ ["Explorers' League"] = "Liga de Expedicionarios",
+ ["Frenzyheart Tribe"] = "Tribu Corazón Frenético",
+ Friendly = "Amistoso",
+ ["Frostwolf Clan"] = "Clan Lobo Gélido",
+ Gadgetzan = "Gadgetzan",
+ ["Gelkis Clan Centaur"] = "Centauro del clan Gelkis",
+ ["Gnomeregan Exiles"] = "Exiliados de Gnomeregan",
+ Honored = "Honorable",
+ ["Honor Hold"] = "Bastión del Honor",
+ Horde = "Horda",
+ ["Horde Expedition"] = "Expedición de la Horda",
+ ["Hydraxian Waterlords"] = "Srs. del Agua de Hydraxis",
+ Ironforge = "Forjaz",
+ ["Keepers of Time"] = "Vigilantes del tiempo",
+ ["Kirin Tor"] = "Kirin Tor",
+ ["Knights of the Ebon Blade"] = "Caballeros de la Espada de Ébano",
+ Kurenai = "Kurenai",
+ ["Lower City"] = "Bajo Arrabal",
+ ["Magram Clan Centaur"] = "Centauro del clan Magram",
+ Netherwing = "Ala Abisal",
+ Neutral = "Neutral",
+ ["Ogri'la"] = "Ogri'la",
+ Orgrimmar = "Orgrimmar",
+ Ratchet = "Trinquete",
+ Ravenholdt = "Ravenholdt",
+ Revered = "Reverenciado",
+ ["Sha'tari Skyguard"] = "Guardia del cielo Sha'tari",
+ ["Shattered Sun Offensive"] = "Ofensiva Sol Devastado",
+ ["Shen'dralar"] = "Shen'dralar",
+ ["Silvermoon City"] = "Ciudad de Lunargenta",
+ ["Silverwing Sentinels"] = "Centinelas Ala de Plata",
+ Sporeggar = "Esporaggar",
+ ["Stormpike Guard"] = "Guardia Pico Tormenta",
+ Stormwind = "Ventormenta",
+ Syndicate = "La Hermandad",
+ ["The Aldor"] = "Los Aldor",
+ -- ["The Ashen Verdict"] = "",
+ ["The Consortium"] = "El Consorcio",
+ ["The Defilers"] = "Los Rapiñadores",
+ ["The Frostborn"] = "Los Natoescarcha",
+ ["The Hand of Vengeance"] = "La Mano de la Venganza",
+ ["The Kalu'ak"] = "Los Kalu'ak",
+ ["The League of Arathor"] = "Liga de Arathor",
+ ["The Mag'har"] = "Los Mag'har",
+ ["The Oracles"] = "Los Oráculos",
+ ["The Scale of the Sands"] = "La Escama de las Arenas",
+ ["The Scryers"] = "Los Arúspices",
+ ["The Sha'tar"] = "Los Sha'tar",
+ ["The Silver Covenant"] = "El Pacto de Plata",
+ ["The Sons of Hodir"] = "Los Hijos de Hodir",
+ ["The Sunreavers"] = "Los Atracasol",
+ ["The Taunka"] = "Los taunka",
+ ["The Violet Eye"] = "El Ojo Violeta",
+ ["The Wyrmrest Accord"] = "El Acuerdo del Reposo del Dragón",
+ ["Thorium Brotherhood"] = "Hermandad del torio",
+ Thrallmar = "Thrallmar",
+ ["Thunder Bluff"] = "Cima del Trueno",
+ ["Timbermaw Hold"] = "Bastión Fauces de Madera",
+ Tranquillien = "Tranquilien",
+ Undercity = "Entrañas",
+ ["Valiance Expedition"] = "Expedición de Denuedo",
+ ["Warsong Offensive"] = "Ofensiva Grito de Guerra",
+ ["Warsong Outriders"] = "Escoltas Grito de Guerra",
+ ["Wildhammer Clan"] = "Clan Martillo Salvaje",
+ ["Winterfin Retreat"] = "Retiro Aleta Invernal",
+ ["Wintersaber Trainers"] = "Instructores de Sableinvernales",
+ ["Zandalar Tribe"] = "Tribu Zandalar",
+}
+elseif GAME_LOCALE == "ruRU" then
+ lib:SetCurrentTranslations {
+ Alliance = "Альянс",
+ ["Alliance Vanguard"] = "Авангард Альянса",
+ ["Argent Crusade"] = "Серебряный Авангард",
+ ["Argent Dawn"] = "Серебряный Рассвет",
+ ["Ashtongue Deathsworn"] = "Пеплоусты-служители",
+ ["Bloodsail Buccaneers"] = "Пираты Кровавого Паруса",
+ ["Booty Bay"] = "Пиратская бухта",
+ ["Brood of Nozdormu"] = "Род Ноздорму",
+ ["Cenarion Circle"] = "Круг Кенария",
+ ["Cenarion Expedition"] = "Экспедиция Ценариона",
+ ["Darkmoon Faire"] = "Ярмарка Новолуния",
+ ["Darkspear Trolls"] = "Тролли Черного Копья",
+ Darnassus = "Дарнас",
+ Everlook = "Круговзор",
+ Exalted = "Превознесение",
+ Exodar = "Экзодар",
+ ["Explorers' League"] = "Лига исследователей",
+ ["Frenzyheart Tribe"] = "Племя Мятежного Сердца",
+ Friendly = "Дружелюбие",
+ ["Frostwolf Clan"] = "Клан Северного Волка",
+ Gadgetzan = "Прибамбасск",
+ ["Gelkis Clan Centaur"] = "Кентавры из племени Гелкис",
+ ["Gnomeregan Exiles"] = "Изгнанники Гномрегана",
+ Honored = "Уважение",
+ ["Honor Hold"] = "Оплот Чести",
+ Horde = "Орда",
+ ["Horde Expedition"] = "Экспедиция Орды",
+ ["Hydraxian Waterlords"] = "Гидраксианские Повелители Вод",
+ Ironforge = "Стальгорн",
+ ["Keepers of Time"] = "Хранители Времени",
+ ["Kirin Tor"] = "Кирин-Тор",
+ ["Knights of the Ebon Blade"] = "Рыцари Черного Клинка",
+ Kurenai = "Куренай",
+ ["Lower City"] = "Нижний Город",
+ ["Magram Clan Centaur"] = "Кентавры из племени Маграм",
+ Netherwing = "Крылья Пустоты",
+ Neutral = "Равнодушие",
+ ["Ogri'la"] = "Огри'ла",
+ Orgrimmar = "Оргриммар",
+ Ratchet = "Кабестан",
+ Ravenholdt = "Черный Ворон",
+ Revered = "Почтение",
+ ["Sha'tari Skyguard"] = "Стражи Небес Ша'тар",
+ ["Shattered Sun Offensive"] = "Армия Расколотого Солнца",
+ ["Shen'dralar"] = "Шен'дралар",
+ ["Silvermoon City"] = "Луносвет",
+ ["Silverwing Sentinels"] = "Среброкрылые Часовые",
+ Sporeggar = "Спореггар",
+ ["Stormpike Guard"] = "Стража Грозовой Вершины",
+ Stormwind = "Штормград",
+ Syndicate = "Синдикат",
+ ["The Aldor"] = "Алдоры",
+ ["The Ashen Verdict"] = "Пепельный союз",
+ ["The Consortium"] = "Консорциум",
+ ["The Defilers"] = "Осквернители",
+ ["The Frostborn"] = "Зиморожденные",
+ ["The Hand of Vengeance"] = "Карающая длань",
+ ["The Kalu'ak"] = "Калу'ак",
+ ["The League of Arathor"] = "Лига Аратора",
+ ["The Mag'har"] = "Маг'хары",
+ ["The Oracles"] = "Оракулы",
+ ["The Scale of the Sands"] = "Песчаная Чешуя",
+ ["The Scryers"] = "Провидцы",
+ ["The Sha'tar"] = "Ша'тар",
+ ["The Silver Covenant"] = "Серебряный Союз",
+ ["The Sons of Hodir"] = "Сыновья Ходира",
+ ["The Sunreavers"] = "Похитители солнца",
+ ["The Taunka"] = "Таунка",
+ ["The Violet Eye"] = "Аметистовое Око",
+ ["The Wyrmrest Accord"] = "Драконий союз",
+ ["Thorium Brotherhood"] = "Братство Тория",
+ Thrallmar = "Траллмар",
+ ["Thunder Bluff"] = "Громовой Утес",
+ ["Timbermaw Hold"] = "Древобрюхи",
+ Tranquillien = "Транквиллион",
+ Undercity = "Подгород",
+ ["Valiance Expedition"] = "Экспедиция Отважных",
+ ["Warsong Offensive"] = "Армия Песни Войны",
+ ["Warsong Outriders"] = "Всадники Песни Войны",
+ ["Wildhammer Clan"] = "Неистовый Молот",
+ ["Winterfin Retreat"] = "Холодный Плавник",
+ ["Wintersaber Trainers"] = "Укротители ледопардов",
+ ["Zandalar Tribe"] = "Племя Зандалар",
+}
+elseif GAME_LOCALE == "zhCN" then
+ lib:SetCurrentTranslations {
+ Alliance = "联盟",
+ ["Alliance Vanguard"] = "联盟先遣军",
+ ["Argent Crusade"] = "银色北伐军",
+ ["Argent Dawn"] = "银色黎明",
+ ["Ashtongue Deathsworn"] = "灰舌死誓者",
+ ["Bloodsail Buccaneers"] = "血帆海盗",
+ ["Booty Bay"] = "藏宝海湾",
+ ["Brood of Nozdormu"] = "诺兹多姆的子嗣",
+ ["Cenarion Circle"] = "塞纳里奥议会",
+ ["Cenarion Expedition"] = "塞纳里奥远征队",
+ ["Darkmoon Faire"] = "暗月马戏团",
+ ["Darkspear Trolls"] = "暗矛巨魔",
+ Darnassus = "达纳苏斯",
+ Everlook = "永望镇",
+ Exalted = "崇拜",
+ Exodar = "埃索达",
+ ["Explorers' League"] = "探险者协会",
+ ["Frenzyheart Tribe"] = "狂心氏族",
+ Friendly = "友善",
+ ["Frostwolf Clan"] = "霜狼氏族",
+ Gadgetzan = "加基森",
+ ["Gelkis Clan Centaur"] = "吉尔吉斯半人马",
+ ["Gnomeregan Exiles"] = "诺莫瑞根流亡者",
+ Honored = "尊敬",
+ ["Honor Hold"] = "荣耀堡",
+ Horde = "部落",
+ ["Horde Expedition"] = "部落先遣军",
+ ["Hydraxian Waterlords"] = "海达希亚水元素",
+ Ironforge = "铁炉堡",
+ ["Keepers of Time"] = "时光守护者",
+ ["Kirin Tor"] = "肯瑞托",
+ ["Knights of the Ebon Blade"] = "黑锋骑士团",
+ Kurenai = "库雷尼",
+ ["Lower City"] = "贫民窟",
+ ["Magram Clan Centaur"] = "玛格拉姆半人马",
+ Netherwing = "灵翼之龙",
+ Neutral = "中立",
+ ["Ogri'la"] = "奥格瑞拉",
+ Orgrimmar = "奥格瑞玛",
+ Ratchet = "棘齿城",
+ Ravenholdt = "拉文霍德",
+ Revered = "崇敬",
+ ["Sha'tari Skyguard"] = "沙塔尔天空卫士",
+ ["Shattered Sun Offensive"] = "破碎残阳",
+ ["Shen'dralar"] = "辛德拉",
+ ["Silvermoon City"] = "银月城",
+ ["Silverwing Sentinels"] = "银翼哨兵",
+ Sporeggar = "孢子村",
+ ["Stormpike Guard"] = "雷矛卫队",
+ Stormwind = "暴风城",
+ Syndicate = "辛迪加",
+ ["The Aldor"] = "奥尔多",
+ ["The Ashen Verdict"] = "灰烬审判军",
+ ["The Consortium"] = "星界财团",
+ ["The Defilers"] = "污染者",
+ ["The Frostborn"] = "霜脉矮人",
+ ["The Hand of Vengeance"] = "复仇之手",
+ ["The Kalu'ak"] = "卡鲁亚克",
+ ["The League of Arathor"] = "阿拉索联军",
+ ["The Mag'har"] = "玛格汉",
+ ["The Oracles"] = "神谕者",
+ ["The Scale of the Sands"] = "流沙之鳞",
+ ["The Scryers"] = "占星者",
+ ["The Sha'tar"] = "沙塔尔",
+ ["The Silver Covenant"] = "银色盟约",
+ ["The Sons of Hodir"] = "霍迪尔之子",
+ ["The Sunreavers"] = "夺日者",
+ ["The Taunka"] = "牦牛人",
+ ["The Violet Eye"] = "紫罗兰之眼",
+ ["The Wyrmrest Accord"] = "龙眠联军",
+ ["Thorium Brotherhood"] = "瑟银兄弟会",
+ Thrallmar = "萨尔玛",
+ ["Thunder Bluff"] = "雷霆崖",
+ ["Timbermaw Hold"] = "木喉要塞",
+ Tranquillien = "塔奎林",
+ Undercity = "幽暗城",
+ ["Valiance Expedition"] = "无畏远征军",
+ ["Warsong Offensive"] = "战歌远征军",
+ ["Warsong Outriders"] = "战歌侦察骑兵",
+ ["Wildhammer Clan"] = "蛮锤部族",
+ ["Winterfin Retreat"] = "冬鳞避难所",
+ ["Wintersaber Trainers"] = "冬刃豹训练师",
+ ["Zandalar Tribe"] = "赞达拉部族",
+}
+elseif GAME_LOCALE == "zhTW" then
+ lib:SetCurrentTranslations {
+ Alliance = "聯盟",
+ ["Alliance Vanguard"] = "聯盟先鋒",
+ ["Argent Crusade"] = "銀白十字軍",
+ ["Argent Dawn"] = "銀色黎明",
+ ["Ashtongue Deathsworn"] = "灰舌死亡誓言者",
+ ["Bloodsail Buccaneers"] = "血帆海盜",
+ ["Booty Bay"] = "藏寶海灣",
+ ["Brood of Nozdormu"] = "諾茲多姆的子嗣",
+ ["Cenarion Circle"] = "塞納里奧議會",
+ ["Cenarion Expedition"] = "塞納里奧遠征隊",
+ ["Darkmoon Faire"] = "暗月馬戲團",
+ ["Darkspear Trolls"] = "暗矛食人妖",
+ Darnassus = "達納蘇斯",
+ Everlook = "永望鎮",
+ Exalted = "崇拜",
+ Exodar = "艾克索達",
+ ["Explorers' League"] = "探險者協會",
+ ["Frenzyheart Tribe"] = "狂心部族",
+ Friendly = "友好",
+ ["Frostwolf Clan"] = "霜狼氏族",
+ Gadgetzan = "加基森",
+ ["Gelkis Clan Centaur"] = "吉爾吉斯半人馬",
+ ["Gnomeregan Exiles"] = "諾姆瑞根流亡者",
+ Honored = "尊敬",
+ ["Honor Hold"] = "榮譽堡",
+ Horde = "部落",
+ ["Horde Expedition"] = "部落遠征軍",
+ ["Hydraxian Waterlords"] = "海達希亞水元素",
+ Ironforge = "鐵爐堡",
+ ["Keepers of Time"] = "時光守望者",
+ ["Kirin Tor"] = "祈倫托",
+ ["Knights of the Ebon Blade"] = "黯刃騎士團",
+ Kurenai = "卡爾奈",
+ ["Lower City"] = "陰鬱城",
+ ["Magram Clan Centaur"] = "瑪格拉姆半人馬",
+ Netherwing = "虛空之翼",
+ Neutral = "中立",
+ ["Ogri'la"] = "歐格利拉",
+ Orgrimmar = "奧格瑪",
+ Ratchet = "棘齒城",
+ Ravenholdt = "拉文霍德",
+ Revered = "崇敬",
+ ["Sha'tari Skyguard"] = "薩塔禦天者",
+ ["Shattered Sun Offensive"] = "破碎之日進攻部隊",
+ ["Shen'dralar"] = "辛德拉",
+ ["Silvermoon City"] = "銀月城",
+ ["Silverwing Sentinels"] = "銀翼哨兵",
+ Sporeggar = "斯博格爾",
+ ["Stormpike Guard"] = "雷矛衛隊",
+ Stormwind = "暴風城",
+ Syndicate = "辛迪加",
+ ["The Aldor"] = "奧多爾",
+ ["The Ashen Verdict"] = "灰燼裁決軍",
+ ["The Consortium"] = "聯合團",
+ ["The Defilers"] = "污染者",
+ ["The Frostborn"] = "霜誕矮人",
+ ["The Hand of Vengeance"] = "復仇之手",
+ ["The Kalu'ak"] = "卡魯耶克",
+ ["The League of Arathor"] = "阿拉索聯軍",
+ ["The Mag'har"] = "瑪格哈",
+ ["The Oracles"] = "神諭者",
+ ["The Scale of the Sands"] = "流沙之鱗",
+ ["The Scryers"] = "占卜者",
+ ["The Sha'tar"] = "薩塔",
+ ["The Silver Covenant"] = "白銀誓盟",
+ ["The Sons of Hodir"] = "霍迪爾之子",
+ ["The Sunreavers"] = "奪日者",
+ ["The Taunka"] = "坦卡族",
+ ["The Violet Eye"] = "紫羅蘭之眼",
+ ["The Wyrmrest Accord"] = "龍眠協調者",
+ ["Thorium Brotherhood"] = "瑟銀兄弟會",
+ Thrallmar = "索爾瑪",
+ ["Thunder Bluff"] = "雷霆崖",
+ ["Timbermaw Hold"] = "木喉要塞",
+ Tranquillien = "安寧地",
+ Undercity = "幽暗城",
+ ["Valiance Expedition"] = "驍勇遠征隊",
+ ["Warsong Offensive"] = "戰歌進攻部隊",
+ ["Warsong Outriders"] = "戰歌偵察騎兵",
+ ["Wildhammer Clan"] = "蠻錘氏族",
+ ["Winterfin Retreat"] = "冬鰭避居地",
+ ["Wintersaber Trainers"] = "冬刃豹訓練師",
+ ["Zandalar Tribe"] = "贊達拉部族",
+}
+
+else
+ error(("%s: Locale %q not supported"):format(MAJOR_VERSION, GAME_LOCALE))
+end
diff --git a/AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-Faction-3.0.toc b/AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-Faction-3.0.toc
new file mode 100644
index 0000000..5d08f12
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Faction-3.0/LibBabble-Faction-3.0.toc
@@ -0,0 +1,22 @@
+## Interface: 30300
+## LoadOnDemand: 1
+## Title: Lib: Babble-Faction-3.0
+## Notes: A library to help with localization of factions.
+## Notes-zhCN: 为本地化服务的支持库[声望阵营]
+## Notes-zhTW: 為本地化服務的函式庫[聲望陣營]
+## Notes-deDE: BabbleLib ist eine Bibliothek, die bei der Lokalisierung helfen soll.
+## Notes-frFR: Une bibliothèque d'aide à la localisation.
+## Notes-esES: Una biblioteca para ayudar con las localizaciones.
+## Notes-ruRU: Библиотека для локализации аддонов.
+## Author: Daviesh
+## X-eMail: oma_daviesh@hotmail.com
+## X-Category: Library
+## X-License: MIT
+## X-Curse-Packaged-Version: r112
+## X-Curse-Project-Name: LibBabble-Faction-3.0
+## X-Curse-Project-ID: libbabble-faction-3-0
+## X-Curse-Repository-ID: wow/libbabble-faction-3-0/mainline
+
+LibStub\LibStub.lua
+lib.xml
+
diff --git a/AtlasLoot/Libs/LibBabble-Faction-3.0/LibStub/LibStub.lua b/AtlasLoot/Libs/LibBabble-Faction-3.0/LibStub/LibStub.lua
new file mode 100644
index 0000000..cfc97de
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Faction-3.0/LibStub/LibStub.lua
@@ -0,0 +1,30 @@
+-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
+-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
+local LibStub = _G[LIBSTUB_MAJOR]
+
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+ LibStub = LibStub or {libs = {}, minors = {} }
+ _G[LIBSTUB_MAJOR] = LibStub
+ LibStub.minor = LIBSTUB_MINOR
+
+ function LibStub:NewLibrary(major, minor)
+ assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+ minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
+
+ local oldminor = self.minors[major]
+ if oldminor and oldminor >= minor then return nil end
+ self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+ return self.libs[major], oldminor
+ end
+
+ function LibStub:GetLibrary(major, silent)
+ if not self.libs[major] and not silent then
+ error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
+ end
+ return self.libs[major], self.minors[major]
+ end
+
+ function LibStub:IterateLibraries() return pairs(self.libs) end
+ setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
diff --git a/AtlasLoot/Libs/LibBabble-Faction-3.0/lib.xml b/AtlasLoot/Libs/LibBabble-Faction-3.0/lib.xml
new file mode 100644
index 0000000..f356574
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Faction-3.0/lib.xml
@@ -0,0 +1,5 @@
+
+
+
+
diff --git a/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-3.0.lua b/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-3.0.lua
new file mode 100644
index 0000000..9b032f3
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-3.0.lua
@@ -0,0 +1,292 @@
+-- LibBabble-3.0 is hereby placed in the Public Domain
+-- Credits: ckknight
+local LIBBABBLE_MAJOR, LIBBABBLE_MINOR = "LibBabble-3.0", 2
+
+local LibBabble = LibStub:NewLibrary(LIBBABBLE_MAJOR, LIBBABBLE_MINOR)
+if not LibBabble then
+ return
+end
+
+local data = LibBabble.data or {}
+for k,v in pairs(LibBabble) do
+ LibBabble[k] = nil
+end
+LibBabble.data = data
+
+local tablesToDB = {}
+for namespace, db in pairs(data) do
+ for k,v in pairs(db) do
+ tablesToDB[v] = db
+ end
+end
+
+local function warn(message)
+ local _, ret = pcall(error, message, 3)
+ geterrorhandler()(ret)
+end
+
+local lookup_mt = { __index = function(self, key)
+ local db = tablesToDB[self]
+ local current_key = db.current[key]
+ if current_key then
+ self[key] = current_key
+ return current_key
+ end
+ local base_key = db.base[key]
+ local real_MAJOR_VERSION
+ for k,v in pairs(data) do
+ if v == db then
+ real_MAJOR_VERSION = k
+ break
+ end
+ end
+ if not real_MAJOR_VERSION then
+ real_MAJOR_VERSION = LIBBABBLE_MAJOR
+ end
+ if base_key then
+ warn(("%s: Translation %q not found for locale %q"):format(real_MAJOR_VERSION, key, GetLocale()))
+ rawset(self, key, base_key)
+ return base_key
+ end
+ warn(("%s: Translation %q not found."):format(real_MAJOR_VERSION, key))
+ rawset(self, key, key)
+ return key
+end }
+
+local function initLookup(module, lookup)
+ local db = tablesToDB[module]
+ for k in pairs(lookup) do
+ lookup[k] = nil
+ end
+ setmetatable(lookup, lookup_mt)
+ tablesToDB[lookup] = db
+ db.lookup = lookup
+ return lookup
+end
+
+local function initReverse(module, reverse)
+ local db = tablesToDB[module]
+ for k in pairs(reverse) do
+ reverse[k] = nil
+ end
+ for k,v in pairs(db.current) do
+ reverse[v] = k
+ end
+ tablesToDB[reverse] = db
+ db.reverse = reverse
+ db.reverseIterators = nil
+ return reverse
+end
+
+local prototype = {}
+local prototype_mt = {__index = prototype}
+
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will warn but allow the code to pass through.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local BL = B:GetLookupTable()
+ assert(BL["Some english word"] == "Some localized word")
+ DoSomething(BL["Some english word that doesn't exist"]) -- warning!
+-----------------------------------------------------------------------------]]
+function prototype:GetLookupTable()
+ local db = tablesToDB[self]
+
+ local lookup = db.lookup
+ if lookup then
+ return lookup
+ end
+ return initLookup(self, {})
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local B_has = B:GetUnstrictLookupTable()
+ assert(B_has["Some english word"] == "Some localized word")
+ assert(B_has["Some english word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetUnstrictLookupTable()
+ local db = tablesToDB[self]
+
+ return db.current
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+ * This is useful for checking if the base (English) table has a key, even if the localized one does not have it registered.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local B_hasBase = B:GetBaseLookupTable()
+ assert(B_hasBase["Some english word"] == "Some english word")
+ assert(B_hasBase["Some english word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetBaseLookupTable()
+ local db = tablesToDB[self]
+
+ return db.base
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+ * This will return only one English word that it maps to, if there are more than one to check, see :GetReverseIterator("word")
+Returns:
+ A lookup table for localized to english words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local BR = B:GetReverseLookupTable()
+ assert(BR["Some localized word"] == "Some english word")
+ assert(BR["Some localized word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetReverseLookupTable()
+ local db = tablesToDB[self]
+
+ local reverse = db.reverse
+ if reverse then
+ return reverse
+ end
+ return initReverse(self, {})
+end
+local blank = {}
+local weakVal = {__mode='v'}
+--[[---------------------------------------------------------------------------
+Arguments:
+ string - the localized word to chek for.
+Returns:
+ An iterator to traverse all English words that map to the given key
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ for word in B:GetReverseIterator("Some localized word") do
+ DoSomething(word)
+ end
+-----------------------------------------------------------------------------]]
+function prototype:GetReverseIterator(key)
+ local db = tablesToDB[self]
+ local reverseIterators = db.reverseIterators
+ if not reverseIterators then
+ reverseIterators = setmetatable({}, weakVal)
+ db.reverseIterators = reverseIterators
+ elseif reverseIterators[key] then
+ return pairs(reverseIterators[key])
+ end
+ local t
+ for k,v in pairs(db.current) do
+ if v == key then
+ if not t then
+ t = {}
+ end
+ t[k] = true
+ end
+ end
+ reverseIterators[key] = t or blank
+ return pairs(reverseIterators[key])
+end
+--[[---------------------------------------------------------------------------
+Returns:
+ An iterator to traverse all translations English to localized.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ for english, localized in B:Iterate() do
+ DoSomething(english, localized)
+ end
+-----------------------------------------------------------------------------]]
+function prototype:Iterate()
+ local db = tablesToDB[self]
+
+ return pairs(db.current)
+end
+
+-- #NODOC
+-- modules need to call this to set the base table
+function prototype:SetBaseTranslations(base)
+ local db = tablesToDB[self]
+ local oldBase = db.base
+ if oldBase then
+ for k in pairs(oldBase) do
+ oldBase[k] = nil
+ end
+ for k, v in pairs(base) do
+ oldBase[k] = v
+ end
+ base = oldBase
+ else
+ db.base = base
+ end
+ for k,v in pairs(base) do
+ if v == true then
+ base[k] = k
+ end
+ end
+end
+
+local function init(module)
+ local db = tablesToDB[module]
+ if db.lookup then
+ initLookup(module, db.lookup)
+ end
+ if db.reverse then
+ initReverse(module, db.reverse)
+ end
+ db.reverseIterators = nil
+end
+
+-- #NODOC
+-- modules need to call this to set the current table. if current is true, use the base table.
+function prototype:SetCurrentTranslations(current)
+ local db = tablesToDB[self]
+ if current == true then
+ db.current = db.base
+ else
+ local oldCurrent = db.current
+ if oldCurrent then
+ for k in pairs(oldCurrent) do
+ oldCurrent[k] = nil
+ end
+ for k, v in pairs(current) do
+ oldCurrent[k] = v
+ end
+ current = oldCurrent
+ else
+ db.current = current
+ end
+ end
+ init(self)
+end
+
+for namespace, db in pairs(data) do
+ setmetatable(db.module, prototype_mt)
+ init(db.module)
+end
+
+-- #NODOC
+-- modules need to call this to create a new namespace.
+function LibBabble:New(namespace, minor)
+ local module, oldminor = LibStub:NewLibrary(namespace, minor)
+ if not module then
+ return
+ end
+
+ if not oldminor then
+ local db = {
+ module = module,
+ }
+ data[namespace] = db
+ tablesToDB[module] = db
+ else
+ for k,v in pairs(module) do
+ module[k] = nil
+ end
+ end
+
+ setmetatable(module, prototype_mt)
+
+ return module
+end
diff --git a/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-Inventory-3.0.lua b/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-Inventory-3.0.lua
new file mode 100644
index 0000000..7d8a9bd
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-Inventory-3.0.lua
@@ -0,0 +1,1330 @@
+--[[
+Name: LibBabble-Inventory-3.0
+Revision: $Rev: 101 $
+Maintainers: ckknight, nevcairiel, Ackis
+Website: http://www.wowace.com/projects/libbabble-inventory-3-0/
+Dependencies: None
+License: MIT
+]]
+
+local MAJOR_VERSION = "LibBabble-Inventory-3.0"
+local MINOR_VERSION = 90000 + tonumber(("$Rev: 101 $"):match("%d+"))
+
+if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
+local lib = LibStub("LibBabble-3.0"):New(MAJOR_VERSION, MINOR_VERSION)
+if not lib then return end
+
+local GAME_LOCALE = GetLocale()
+
+lib:SetBaseTranslations {
+ Alchemy = "Alchemy",
+ ["Ammo Pouch"] = "Ammo Pouch",
+ Armor = "Armor",
+ ["Armor Enchantment"] = "Armor Enchantment",
+ Arrow = "Arrow",
+ Axe = "Axe",
+ Back = "Back",
+ Bag = "Bag",
+ Bandage = "Bandage",
+ Blacksmithing = "Blacksmithing",
+ Blue = "Blue",
+ Book = "Book",
+ Bow = "Bow",
+ Bows = "Bows",
+ Bullet = "Bullet",
+ Chest = "Chest",
+ Cloth = "Cloth",
+ Consumable = "Consumable",
+ Container = "Container",
+ Cooking = "Cooking",
+ Crossbow = "Crossbow",
+ Crossbows = "Crossbows",
+ Dagger = "Dagger",
+ Daggers = "Daggers",
+ ["Death Knight"] = "Death Knight",
+ Devices = "Devices",
+ Drink = "Drink",
+ Druid = "Druid",
+ Elemental = "Elemental",
+ Elixir = "Elixir",
+ Enchanting = "Enchanting",
+ ["Enchanting Bag"] = "Enchanting Bag",
+ Engineering = "Engineering",
+ ["Engineering Bag"] = "Engineering Bag",
+ Explosives = "Explosives",
+ Feet = "Feet",
+ ["First Aid"] = "First Aid",
+ Fishing = "Fishing",
+ ["Fishing Pole"] = "Fishing Pole",
+ ["Fishing Poles"] = "Fishing Poles",
+ ["Fist Weapon"] = "Fist Weapon",
+ ["Fist Weapons"] = "Fist Weapons",
+ Flask = "Flask",
+ Food = "Food",
+ ["Food & Drink"] = "Food & Drink",
+ Gem = "Gem",
+ ["Gem Bag"] = "Gem Bag",
+ Glyph = "Glyph",
+ Green = "Green",
+ Gun = "Gun",
+ Guns = "Guns",
+ Hands = "Hands",
+ Head = "Head",
+ ["Held in Off-Hand"] = "Held in Off-Hand",
+ Herb = "Herb",
+ ["Herb Bag"] = "Herb Bag",
+ Holiday = "Holiday",
+ Hunter = "Hunter",
+ Idol = "Idol",
+ Idols = "Idols",
+ ["Inscription Bag"] = "Inscription Bag",
+ ["Item Enhancement"] = "Item Enhancement",
+ Jewelcrafting = "Jewelcrafting",
+ Junk = "Junk",
+ Key = "Key",
+ Leather = "Leather",
+ Leatherworking = "Leatherworking",
+ ["Leatherworking Bag"] = "Leatherworking Bag",
+ Legs = "Legs",
+ Libram = "Libram",
+ Librams = "Librams",
+ Mace = "Mace",
+ Mage = "Mage",
+ Mail = "Mail",
+ ["Main Hand"] = "Main Hand",
+ Materials = "Materials",
+ Meat = "Meat",
+ Meta = "Meta",
+ ["Metal & Stone"] = "Metal & Stone",
+ ["Mining Bag"] = "Mining Bag",
+ Miscellaneous = "Miscellaneous",
+ Mount = "Mount",
+ Neck = "Neck",
+ ["Off Hand"] = "Off Hand",
+ ["One-Hand"] = "One-Hand",
+ ["One-Handed Axes"] = "One-Handed Axes",
+ ["One-Handed Maces"] = "One-Handed Maces",
+ ["One-Handed Swords"] = "One-Handed Swords",
+ Orange = "Orange",
+ Other = "Other",
+ Paladin = "Paladin",
+ Parts = "Parts",
+ Pet = "Pet",
+ Plate = "Plate",
+ Polearm = "Polearm",
+ Polearms = "Polearms",
+ Potion = "Potion",
+ Priest = "Priest",
+ Prismatic = "Prismatic",
+ Projectile = "Projectile",
+ Purple = "Purple",
+ Quest = "Quest",
+ Quiver = "Quiver",
+ Ranged = "Ranged",
+ Reagent = "Reagent",
+ Recipe = "Recipe",
+ Red = "Red",
+ Relic = "Relic",
+ Ring = "Ring",
+ Rogue = "Rogue",
+ Scroll = "Scroll",
+ Shaman = "Shaman",
+ Shield = "Shield",
+ Shields = "Shields",
+ Shirt = "Shirt",
+ Shoulder = "Shoulder",
+ Sigils = "Sigils",
+ Simple = "Simple",
+ ["Soul Bag"] = "Soul Bag",
+ Staff = "Staff",
+ Staves = "Staves",
+ Sword = "Sword",
+ Tabard = "Tabard",
+ Tailoring = "Tailoring",
+ Thrown = "Thrown",
+ Totem = "Totem",
+ Totems = "Totems",
+ ["Trade Goods"] = "Trade Goods",
+ Trinket = "Trinket",
+ ["Two-Hand"] = "Two-Hand",
+ ["Two-Handed Axes"] = "Two-Handed Axes",
+ ["Two-Handed Maces"] = "Two-Handed Maces",
+ ["Two-Handed Swords"] = "Two-Handed Swords",
+ Waist = "Waist",
+ Wand = "Wand",
+ Wands = "Wands",
+ Warlock = "Warlock",
+ Warrior = "Warrior",
+ Weapon = "Weapon",
+ ["Weapon Enchantment"] = "Weapon Enchantment",
+ Wrist = "Wrist",
+ Yellow = "Yellow",
+}
+
+
+if GAME_LOCALE == "enUS" then
+ lib:SetCurrentTranslations(true)
+elseif GAME_LOCALE == "deDE" then
+ lib:SetCurrentTranslations {
+ Alchemy = "Alchemie",
+ ["Ammo Pouch"] = "Munitionsbeutel",
+ Armor = "Rüstung",
+ ["Armor Enchantment"] = "Rüstungsverzauberung",
+ Arrow = "Pfeil",
+ Axe = "Axt",
+ Back = "Rücken",
+ Bag = "Behälter",
+ Bandage = "Verband",
+ Blacksmithing = "Schmiedekunst",
+ Blue = "Blau",
+ Book = "Buch",
+ Bow = "Bogen",
+ Bows = "Bögen",
+ Bullet = "Kugel",
+ Chest = "Brust",
+ Cloth = "Stoff",
+ Consumable = "Verbrauchbar",
+ Container = "Behälter",
+ Cooking = "Kochkunst",
+ Crossbow = "Armbrust",
+ Crossbows = "Armbrüste",
+ Dagger = "Dolch",
+ Daggers = "Dolche",
+ ["Death Knight"] = "Todesritter",
+ Devices = "Geräte",
+ Drink = "Getränk",
+ Druid = "Druide",
+ Elemental = "Elementar",
+ Elixir = "Elixier",
+ Enchanting = "Verzauberkunst",
+ ["Enchanting Bag"] = "Verzauberertasche",
+ Engineering = "Ingenieurskunst",
+ ["Engineering Bag"] = "Ingenieurstasche",
+ Explosives = "Sprengstoff",
+ Feet = "Füße",
+ ["First Aid"] = "Erste Hilfe",
+ Fishing = "Angeln",
+ ["Fishing Pole"] = "Angelrute",
+ ["Fishing Poles"] = "Angelruten",
+ ["Fist Weapon"] = "Faustwaffe",
+ ["Fist Weapons"] = "Faustwaffen",
+ Flask = "Fläschchen",
+ Food = "Essen",
+ ["Food & Drink"] = "Essen & Trinken",
+ Gem = "Edelstein",
+ ["Gem Bag"] = "Edelsteintasche",
+ Glyph = "Glyphe",
+ Green = "Grün",
+ Gun = "Schusswaffe",
+ Guns = "Schusswaffen",
+ Hands = "Hände",
+ Head = "Kopf",
+ ["Held in Off-Hand"] = "In Schildhand geführt",
+ Herb = "Kräuter",
+ ["Herb Bag"] = "Kräutertasche",
+ Holiday = "Festtag",
+ Hunter = "Jäger",
+ Idol = "Götze",
+ Idols = "Götzen",
+ ["Inscription Bag"] = "Schreibertasche",
+ ["Item Enhancement"] = "Gegenstandsverbesserung",
+ Jewelcrafting = "Juwelenschleifen",
+ Junk = "Plunder",
+ Key = "Schlüssel",
+ Leather = "Leder",
+ Leatherworking = "Lederverarbeitung",
+ ["Leatherworking Bag"] = "Lederertasche",
+ Legs = "Beine",
+ Libram = "Buchband",
+ Librams = "Buchbände",
+ Mace = "Streitkolben",
+ Mage = "Magier",
+ Mail = "Schwere Rüstung",
+ ["Main Hand"] = "Waffenhand",
+ Materials = "Materialien",
+ Meat = "Fleisch",
+ Meta = "Meta",
+ ["Metal & Stone"] = "Metall & Stein",
+ ["Mining Bag"] = "Bergbautasche",
+ Miscellaneous = "Verschiedenes",
+ Mount = "Reittier",
+ Neck = "Hals",
+ ["Off Hand"] = "Schildhand",
+ ["One-Hand"] = "Einhändig",
+ ["One-Handed Axes"] = "Einhandäxte",
+ ["One-Handed Maces"] = "Einhandstreitkolben",
+ ["One-Handed Swords"] = "Einhandschwerter",
+ Orange = "Orange",
+ Other = "Sonstige",
+ Paladin = "Paladin",
+ Parts = "Teile",
+ Pet = "Begleiter",
+ Plate = "Platte",
+ Polearm = "Stangenwaffe",
+ Polearms = "Stangenwaffen",
+ Potion = "Trank",
+ Priest = "Priester",
+ Prismatic = "Prismatisch",
+ Projectile = "Projektil",
+ Purple = "Violett",
+ Quest = "Quest",
+ Quiver = "Köcher",
+ Ranged = "Distanz",
+ Reagent = "Reagenz",
+ Recipe = "Rezept",
+ Red = "Rot",
+ Relic = "Relikt",
+ Ring = "Finger",
+ Rogue = "Schurke",
+ Scroll = "Rolle",
+ Shaman = "Schamane",
+ Shield = "Schild",
+ Shields = "Schilde",
+ Shirt = "Hemd",
+ Shoulder = "Schulter",
+ Sigils = "Siegel",
+ Simple = "Einfach",
+ ["Soul Bag"] = "Seelentasche",
+ Staff = "Stab",
+ Staves = "Stäbe",
+ Sword = "Schwert",
+ Tabard = "Wappenrock",
+ Tailoring = "Schneiderei",
+ Thrown = "Wurfwaffen",
+ Totem = "Totem",
+ Totems = "Totems",
+ ["Trade Goods"] = "Handwerkswaren",
+ Trinket = "Schmuck",
+ ["Two-Hand"] = "Zweihändig",
+ ["Two-Handed Axes"] = "Zweihandäxte",
+ ["Two-Handed Maces"] = "Zweihandstreitkolben",
+ ["Two-Handed Swords"] = "Zweihandschwerter",
+ Waist = "Taille",
+ Wand = "Zauberstab",
+ Wands = "Zauberstäbe",
+ Warlock = "Hexenmeister",
+ Warrior = "Krieger",
+ Weapon = "Waffe",
+ ["Weapon Enchantment"] = "Waffenverzauberung",
+ Wrist = "Handgelenke",
+ Yellow = "Gelb",
+}
+elseif GAME_LOCALE == "frFR" then
+ lib:SetCurrentTranslations {
+ Alchemy = "Alchimie",
+ ["Ammo Pouch"] = "Giberne",
+ Armor = "Armure",
+ ["Armor Enchantment"] = "Enchantements d'armure",
+ Arrow = "Flèche",
+ Axe = "Hache",
+ Back = "Dos",
+ Bag = "Sac",
+ Bandage = "Bandage",
+ Blacksmithing = "Forge",
+ Blue = "Bleu",
+ Book = "Livre",
+ Bow = "Arc",
+ Bows = "Arcs",
+ Bullet = "Balle",
+ Chest = "Torse",
+ Cloth = "Tissu",
+ Consumable = "Consommable",
+ Container = "Conteneur",
+ Cooking = "Cuisine",
+ Crossbow = "Arbalète",
+ Crossbows = "Arbalètes",
+ Dagger = "Dague",
+ Daggers = "Dagues",
+ ["Death Knight"] = "Chevalier de la mort",
+ Devices = "Élémentaire",
+ Drink = "Breuvage",
+ Druid = "Druide",
+ Elemental = "Élémentaire",
+ Elixir = "Élixir",
+ Enchanting = "Enchantement",
+ ["Enchanting Bag"] = "Sac d'enchantement",
+ Engineering = "Ingénierie",
+ ["Engineering Bag"] = "Sac d'ingéniérie",
+ Explosives = "Explosifs",
+ Feet = "Pieds",
+ ["First Aid"] = "Secourisme",
+ Fishing = "Pêche",
+ ["Fishing Pole"] = "Canne à pêche",
+ ["Fishing Poles"] = "Cannes à pêche",
+ ["Fist Weapon"] = "Arme de pugilat",
+ ["Fist Weapons"] = "Armes de pugilat",
+ Flask = "Flacon",
+ Food = "Ration",
+ ["Food & Drink"] = "Nourriture & boissons",
+ Gem = "Gemme",
+ ["Gem Bag"] = "Sac de gemmes",
+ Glyph = "Glyphe",
+ Green = "Verte",
+ Gun = "Arme à feu",
+ Guns = "Fusils",
+ Hands = "Mains",
+ Head = "Tête",
+ ["Held in Off-Hand"] = "Tenu(e) en main gauche",
+ Herb = "Herbes",
+ ["Herb Bag"] = "Sac d'herbes",
+ Holiday = "Vacances",
+ Hunter = "Chasseur",
+ Idol = "Idole",
+ Idols = "Idoles",
+ ["Inscription Bag"] = "Sac de calligraphie",
+ ["Item Enhancement"] = "Amélioration d'objet",
+ Jewelcrafting = "Joaillerie",
+ Junk = "Camelote",
+ Key = "Clé",
+ Leather = "Cuir",
+ Leatherworking = "Travail du cuir",
+ ["Leatherworking Bag"] = "Sac de travailleur du cuir",
+ Legs = "Jambes",
+ Libram = "Libram",
+ Librams = "Librams",
+ Mace = "Masse",
+ Mage = "Mage",
+ Mail = "Mailles",
+ ["Main Hand"] = "Main droite",
+ Materials = "Matériaux",
+ Meat = "Viande",
+ Meta = "Méta",
+ ["Metal & Stone"] = "Métal & pierre",
+ ["Mining Bag"] = "Sac de mineur",
+ Miscellaneous = "Divers",
+ Mount = "Monture",
+ Neck = "Cou",
+ ["Off Hand"] = "Main gauche",
+ ["One-Hand"] = "A une main",
+ ["One-Handed Axes"] = "Haches à une main",
+ ["One-Handed Maces"] = "Masses à une main",
+ ["One-Handed Swords"] = "Epées à une main",
+ Orange = "Orange",
+ Other = "Autre",
+ Paladin = "Paladin",
+ Parts = "Eléments",
+ Pet = "Familier",
+ Plate = "Plaques",
+ Polearm = "Arme d'hast",
+ Polearms = "Armes d'hast",
+ Potion = "Potion",
+ Priest = "Prêtre",
+ Prismatic = "Prismatique",
+ Projectile = "Projectile",
+ Purple = "Violette",
+ Quest = "Quête",
+ Quiver = "Carquois",
+ Ranged = "À distance",
+ Reagent = "Réactif",
+ Recipe = "Recette",
+ Red = "Rouge",
+ Relic = "Relique",
+ Ring = "Anneau",
+ Rogue = "Voleur",
+ Scroll = "Parchemin",
+ Shaman = "Chaman",
+ Shield = "Bouclier",
+ Shields = "Boucliers",
+ Shirt = "Chemise",
+ Shoulder = "Epaule",
+ Sigils = "Glyphes",
+ Simple = "Simple",
+ ["Soul Bag"] = "Sac d'âme",
+ Staff = "Bâton",
+ Staves = "Bâtons",
+ Sword = "Epée",
+ Tabard = "Tabard",
+ Tailoring = "Couture",
+ Thrown = "Armes de jets",
+ Totem = "Totem",
+ Totems = "Totems",
+ ["Trade Goods"] = "Artisanat",
+ Trinket = "Bijou",
+ ["Two-Hand"] = "Deux mains",
+ ["Two-Handed Axes"] = "Haches à deux mains",
+ ["Two-Handed Maces"] = "Masses à deux mains",
+ ["Two-Handed Swords"] = "Epées à deux mains",
+ Waist = "Taille",
+ Wand = "Baguette",
+ Wands = "Baguettes",
+ Warlock = "Démoniste",
+ Warrior = "Guerrier",
+ Weapon = "Arme",
+ ["Weapon Enchantment"] = "Enchantements d'arme",
+ Wrist = "Poignets",
+ Yellow = "Jaune",
+}
+elseif GAME_LOCALE == "koKR" then
+ lib:SetCurrentTranslations {
+ Alchemy = "연금술",
+ ["Ammo Pouch"] = "탄약 주머니",
+ Armor = "방어구",
+ ["Armor Enchantment"] = "방어구 마부",
+ Arrow = "화살",
+ Axe = "도끼",
+ Back = "등",
+ Bag = "가방",
+ Bandage = "붕대",
+ Blacksmithing = "대장기술",
+ Blue = "푸른색",
+ Book = "책",
+ Bow = "활",
+ Bows = "활류",
+ Bullet = "탄환",
+ Chest = "가슴",
+ Cloth = "천",
+ Consumable = "소비용품",
+ Container = "보관함",
+ Cooking = "요리",
+ Crossbow = "석궁",
+ Crossbows = "석궁류",
+ Dagger = "단검",
+ Daggers = "단검류",
+ ["Death Knight"] = "죽음의 기사",
+ Devices = "기계 장치",
+ Drink = "음료",
+ Druid = "드루이드",
+ Elemental = "원소",
+ Elixir = "비약",
+ Enchanting = "마법부여",
+ ["Enchanting Bag"] = "마법부여 가방",
+ Engineering = "기계공학",
+ ["Engineering Bag"] = "기계공학 가방",
+ Explosives = "폭발물",
+ Feet = "발",
+ ["First Aid"] = "응급치료",
+ Fishing = "낚시",
+ ["Fishing Pole"] = "낚싯대",
+ ["Fishing Poles"] = "낚싯대",
+ ["Fist Weapon"] = "장착 무기",
+ ["Fist Weapons"] = "장착 무기류",
+ Flask = "영약",
+ Food = "음식",
+ ["Food & Drink"] = "음식과 음료",
+ Gem = "보석",
+ ["Gem Bag"] = "보석 가방",
+ Glyph = "문양",
+ Green = "녹색",
+ Gun = "총기",
+ Guns = "총기류",
+ Hands = "손",
+ Head = "머리",
+ ["Held in Off-Hand"] = "보조장비",
+ Herb = "약초",
+ ["Herb Bag"] = "약초 가방",
+ Holiday = "축제용품",
+ Hunter = "사냥꾼",
+ Idol = "우상",
+ Idols = "우상",
+ ["Inscription Bag"] = "주문각인사의 가방",
+ ["Item Enhancement"] = "아이템 강화",
+ Jewelcrafting = "보석세공",
+ Junk = "잡동사니",
+ Key = "열쇠",
+ Leather = "가죽",
+ Leatherworking = "가죽세공",
+ ["Leatherworking Bag"] = "가죽세공 가방",
+ Legs = "다리",
+ Libram = "성서",
+ Librams = "성서",
+ Mace = "둔기",
+ Mage = "마법사",
+ Mail = "사슬",
+ ["Main Hand"] = "주장비",
+ Materials = "재료",
+ Meat = "고기",
+ Meta = "얼개",
+ ["Metal & Stone"] = "광물",
+ ["Mining Bag"] = "채광 가방",
+ Miscellaneous = "기타",
+ Mount = "탈것",
+ Neck = "목",
+ ["Off Hand"] = "보조장비",
+ ["One-Hand"] = "한손",
+ ["One-Handed Axes"] = "한손 도끼류",
+ ["One-Handed Maces"] = "한손 둔기류",
+ ["One-Handed Swords"] = "한손 도검류",
+ Orange = "주황색",
+ Other = "기타",
+ Paladin = "성기사",
+ Parts = "부품",
+ Pet = "애완동물",
+ Plate = "판금",
+ Polearm = "장창",
+ Polearms = "장창류",
+ Potion = "물약",
+ Priest = "사제",
+ Prismatic = "다색",
+ Projectile = "투사체",
+ Purple = "보라색",
+ Quest = "퀘스트",
+ Quiver = "화살통",
+ Ranged = "원거리 장비",
+ Reagent = "재료",
+ Recipe = "제조법",
+ Red = "붉은색",
+ Relic = "유물",
+ Ring = "손가락",
+ Rogue = "도적",
+ Scroll = "두루마리",
+ Shaman = "주술사",
+ Shield = "방패",
+ Shields = "방패",
+ Shirt = "속옷",
+ Shoulder = "어깨",
+ Sigils = "인장",
+ Simple = "일반",
+ ["Soul Bag"] = "영혼의 가방",
+ Staff = "지팡이",
+ Staves = "지팡이류",
+ Sword = "도검",
+ Tabard = "휘장",
+ Tailoring = "재봉술",
+ Thrown = "투척 무기",
+ Totem = "토템",
+ Totems = "토템",
+ ["Trade Goods"] = "직업용품",
+ Trinket = "장신구",
+ ["Two-Hand"] = "양손",
+ ["Two-Handed Axes"] = "양손 도끼류",
+ ["Two-Handed Maces"] = "양손 둔기류",
+ ["Two-Handed Swords"] = "양손 도검류",
+ Waist = "허리",
+ Wand = "마법봉",
+ Wands = "마법봉류",
+ Warlock = "흑마법사",
+ Warrior = "전사",
+ Weapon = "무기",
+ ["Weapon Enchantment"] = "무기 마부",
+ Wrist = "손목",
+ Yellow = "노란색",
+}
+elseif GAME_LOCALE == "esES" then
+ lib:SetCurrentTranslations {
+ Alchemy = "Alquimia",
+ ["Ammo Pouch"] = "Bolsa de Munición",
+ Armor = "Armadura",
+ ["Armor Enchantment"] = "Encantamiento de Armadura",
+ Arrow = "Flecha",
+ Axe = "Hacha",
+ Back = "Espalda",
+ Bag = "Bolsa",
+ Bandage = "Venda",
+ Blacksmithing = "Herrería",
+ Blue = "Azul",
+ Book = "Libro",
+ Bow = "Arco",
+ Bows = "Arcos",
+ Bullet = "Bala",
+ Chest = "Torso",
+ Cloth = "Tela",
+ Consumable = "Consumible",
+ Container = "Contenedor",
+ Cooking = "Cocina",
+ Crossbow = "Ballesta",
+ Crossbows = "Ballestas",
+ Dagger = "Daga",
+ Daggers = "Dagas",
+ ["Death Knight"] = "Caballero de la Muerte",
+ Devices = "Dispositivos",
+ Drink = "Bebida",
+ Druid = "Druída",
+ Elemental = "Elemental",
+ Elixir = "Elixir",
+ Enchanting = "Encantamiento",
+ ["Enchanting Bag"] = "Bolsa de Encantamiento",
+ Engineering = "Ingeniería",
+ ["Engineering Bag"] = "Bolsa de Ingeniería",
+ Explosives = "Explosivos",
+ Feet = "Pies",
+ ["First Aid"] = "Primeros auxilios",
+ Fishing = "Pesca",
+ ["Fishing Pole"] = "Caña de pescar",
+ ["Fishing Poles"] = "Cañas de pescar",
+ ["Fist Weapon"] = "Arma de Puño",
+ ["Fist Weapons"] = "Armas de Puño",
+ Flask = "Frasco",
+ Food = "Comida",
+ ["Food & Drink"] = "Comida y bebida",
+ Gem = "Gema",
+ ["Gem Bag"] = "Bolsa de Gemas",
+ Glyph = "Glifo",
+ Green = "Verde",
+ Gun = "Pistola",
+ Guns = "Pistolas",
+ Hands = "Manos",
+ Head = "Cabeza",
+ ["Held in Off-Hand"] = "Sostener con la mano izquierda",
+ Herb = "Herbalísmo",
+ ["Herb Bag"] = "Bolsa de Hierbas",
+ Holiday = "Festivo",
+ Hunter = "Cazador",
+ Idol = "Ídolo",
+ Idols = "Ídolos",
+ ["Inscription Bag"] = "Bolsa de Inscripción",
+ ["Item Enhancement"] = "Mejora de Objeto",
+ Jewelcrafting = "Joyería",
+ Junk = "Basura",
+ Key = "Llave",
+ Leather = "Cuero",
+ Leatherworking = "Peletería",
+ ["Leatherworking Bag"] = "Bolsa de Peletería",
+ Legs = "Piernas",
+ Libram = "Tratado",
+ Librams = "Tratados",
+ Mace = "Maza",
+ Mage = "Mago",
+ Mail = "Mallas",
+ ["Main Hand"] = "Mano Derecha",
+ Materials = "Materiales",
+ Meat = "Carne",
+ Meta = "Meta",
+ ["Metal & Stone"] = "Metal y Piedra",
+ ["Mining Bag"] = "Bolsa de Minería",
+ Miscellaneous = "Miscelánea",
+ Mount = "Montura",
+ Neck = "Cuello",
+ ["Off Hand"] = "Mano Izquierda",
+ ["One-Hand"] = "Una Mano",
+ ["One-Handed Axes"] = "Hachas de Una Mano",
+ ["One-Handed Maces"] = "Mazas de Una Mano",
+ ["One-Handed Swords"] = "Espadas de Una Mano",
+ Orange = "Naranja",
+ Other = "Otro",
+ Paladin = "Paladín",
+ Parts = "Partes",
+ Pet = "Mascota",
+ Plate = "Placas",
+ Polearm = "Arma de asta",
+ Polearms = "Armas de asta",
+ Potion = "Poción",
+ Priest = "Sacerdote",
+ Prismatic = "Prismático",
+ Projectile = "Proyectil",
+ Purple = "Morado",
+ Quest = "Misión",
+ Quiver = "Carcaj",
+ Ranged = "Rango",
+ Reagent = "Reactivo",
+ Recipe = "Receta",
+ Red = "Rojo",
+ Relic = "Reliquia",
+ Ring = "Anillo",
+ Rogue = "Pícaro",
+ Scroll = "Pergamino",
+ Shaman = "Chamán",
+ Shield = "Escudo",
+ Shields = "Escudos",
+ Shirt = "Camisa",
+ Shoulder = "Hombros",
+ Sigils = "Sigilos",
+ Simple = "Simple",
+ ["Soul Bag"] = "Bolsa de Almas",
+ Staff = "Bastón",
+ Staves = "Bastones",
+ Sword = "Espada",
+ Tabard = "Tabardo",
+ Tailoring = "Sastrería",
+ Thrown = "Arrojadiza",
+ Totem = "Tótem",
+ Totems = "Tótems",
+ ["Trade Goods"] = "Objeto comerciable",
+ Trinket = "Abalorio",
+ ["Two-Hand"] = "Dos Manos",
+ ["Two-Handed Axes"] = "Hachas a Dos Manos",
+ ["Two-Handed Maces"] = "Mazas a Dos Manos",
+ ["Two-Handed Swords"] = "Espadas a Dos Manos",
+ Waist = "Cintura",
+ Wand = "Varita",
+ Wands = "Varitas",
+ Warlock = "Brujo",
+ Warrior = "Guerrero",
+ Weapon = "Arma",
+ ["Weapon Enchantment"] = "Encantamiento de Armas",
+ Wrist = "Muñeca",
+ Yellow = "Amarillo",
+}
+elseif GAME_LOCALE == "esMX" then
+ lib:SetCurrentTranslations {
+ Alchemy = "Alquimia",
+ ["Ammo Pouch"] = "Bolsa de Munición",
+ Armor = "Armadura",
+ ["Armor Enchantment"] = "Encantamiento de Armadura",
+ Arrow = "Flecha",
+ Axe = "Hacha",
+ Back = "Espalda",
+ Bag = "Bolsa",
+ Bandage = "Venda",
+ Blacksmithing = "Herrería",
+ Blue = "Azul",
+ Book = "Libro",
+ Bow = "Arco",
+ Bows = "Arcos",
+ Bullet = "Bala",
+ Chest = "Torso",
+ Cloth = "Tela",
+ Consumable = "Consumible",
+ Container = "Contenedor",
+ Cooking = "Cocina",
+ Crossbow = "Ballesta",
+ Crossbows = "Ballestas",
+ Dagger = "Daga",
+ Daggers = "Dagas",
+ ["Death Knight"] = "Caballero de la Muerte",
+ Devices = "Dispositivos",
+ Drink = "Bebida",
+ Druid = "Druída",
+ Elemental = "Elemental",
+ Elixir = "Elixir",
+ Enchanting = "Encantamiento",
+ ["Enchanting Bag"] = "Bolsa de Encantamiento",
+ Engineering = "Ingeniería",
+ ["Engineering Bag"] = "Bolsa de Ingeniería",
+ Explosives = "Explosivos",
+ Feet = "Pies",
+ ["First Aid"] = "Primeros auxilios",
+ Fishing = "Pesca",
+ ["Fishing Pole"] = "Caña de pescar",
+ ["Fishing Poles"] = "Cañas de pescar",
+ ["Fist Weapon"] = "Arma de Puño",
+ ["Fist Weapons"] = "Armas de Puño",
+ Flask = "Frasco",
+ Food = "Comida",
+ ["Food & Drink"] = "Comida y bebida",
+ Gem = "Gema",
+ ["Gem Bag"] = "Bolsa de Gemas",
+ Glyph = "Glifo",
+ Green = "Verde",
+ Gun = "Pistola",
+ Guns = "Pistolas",
+ Hands = "Manos",
+ Head = "Cabeza",
+ ["Held in Off-Hand"] = "Sostener con la mano izquierda",
+ Herb = "Herbalísmo",
+ ["Herb Bag"] = "Bolsa de Hierbas",
+ Holiday = "Festivo",
+ Hunter = "Cazador",
+ Idol = "Ãdolo",
+ Idols = "Ãdolos",
+ ["Inscription Bag"] = "Bolsa de Inscripción",
+ ["Item Enhancement"] = "Mejora de Objeto",
+ Jewelcrafting = "Joyería",
+ Junk = "Basura",
+ Key = "Llave",
+ Leather = "Cuero",
+ Leatherworking = "Peletería",
+ ["Leatherworking Bag"] = "Bolsa de Peletería",
+ Legs = "Piernas",
+ Libram = "Tratado",
+ Librams = "Tratados",
+ Mace = "Maza",
+ Mage = "Mago",
+ Mail = "Mallas",
+ ["Main Hand"] = "Mano Derecha",
+ Materials = "Materiales",
+ Meat = "Carne",
+ Meta = "Meta",
+ ["Metal & Stone"] = "Metal y Piedra",
+ ["Mining Bag"] = "Bolsa de Minería",
+ Miscellaneous = "Miscelánea",
+ Mount = "Montura",
+ Neck = "Cuello",
+ ["Off Hand"] = "Mano Izquierda",
+ ["One-Hand"] = "Una Mano",
+ ["One-Handed Axes"] = "Hachas de Una Mano",
+ ["One-Handed Maces"] = "Mazas de Una Mano",
+ ["One-Handed Swords"] = "Espadas de Una Mano",
+ Orange = "Naranja",
+ Other = "Otro",
+ Paladin = "Paladín",
+ Parts = "Partes",
+ Pet = "Mascota",
+ Plate = "Placas",
+ Polearm = "Arma de asta",
+ Polearms = "Armas de asta",
+ Potion = "Poción",
+ Priest = "Sacerdote",
+ Prismatic = "Prismático",
+ Projectile = "Proyectil",
+ Purple = "Morado",
+ Quest = "Misión",
+ Quiver = "Carcaj",
+ Ranged = "Rango",
+ Reagent = "Reactivo",
+ Recipe = "Receta",
+ Red = "Rojo",
+ Relic = "Reliquia",
+ Ring = "Anillo",
+ Rogue = "Pícaro",
+ Scroll = "Pergamino",
+ Shaman = "Chamán",
+ Shield = "Escudo",
+ Shields = "Escudos",
+ Shirt = "Camisa",
+ Shoulder = "Hombros",
+ Sigils = "Sigilos",
+ Simple = "Simple",
+ ["Soul Bag"] = "Bolsa de Almas",
+ Staff = "Bastón",
+ Staves = "Bastones",
+ Sword = "Espada",
+ Tabard = "Tabardo",
+ Tailoring = "Sastrería",
+ Thrown = "Arrojadiza",
+ Totem = "Tótem",
+ Totems = "Tótems",
+ ["Trade Goods"] = "Objeto comerciable",
+ Trinket = "Abalorio",
+ ["Two-Hand"] = "Dos Manos",
+ ["Two-Handed Axes"] = "Hachas a Dos Manos",
+ ["Two-Handed Maces"] = "Mazas a Dos Manos",
+ ["Two-Handed Swords"] = "Espadas a Dos Manos",
+ Waist = "Cintura",
+ Wand = "Varita",
+ Wands = "Varitas",
+ Warlock = "Brujo",
+ Warrior = "Guerrero",
+ Weapon = "Arma",
+ ["Weapon Enchantment"] = "Encantamiento de Armas",
+ Wrist = "Muñeca",
+ Yellow = "Amarillo",
+}
+elseif GAME_LOCALE == "ruRU" then
+ lib:SetCurrentTranslations {
+ Alchemy = "Алхимия",
+ ["Ammo Pouch"] = "Подсумок",
+ Armor = "Доспехи",
+ ["Armor Enchantment"] = "Чары для доспехов",
+ Arrow = "Стрела",
+ Axe = "Топор",
+ Back = "Спина",
+ Bag = "Сумка",
+ Bandage = "Бинты",
+ Blacksmithing = "Кузнечное дело",
+ Blue = "Синий",
+ Book = "Книга",
+ Bow = "Лук",
+ Bows = "Луки",
+ Bullet = "Пуля",
+ Chest = "Грудь",
+ Cloth = "Ткань",
+ Consumable = "Потребляемые",
+ Container = "Сумки",
+ Cooking = "Кулинария",
+ Crossbow = "Арбалет",
+ Crossbows = "Арбалеты",
+ Dagger = "Кинжал",
+ Daggers = "Кинжалы",
+ ["Death Knight"] = "Рыцарь смерти",
+ Devices = "Устройства",
+ Drink = "Питье",
+ Druid = "Друид",
+ Elemental = "Стихии",
+ Elixir = "Эликсир",
+ Enchanting = "Наложение чар",
+ ["Enchanting Bag"] = "Сумка зачаровывателя",
+ Engineering = "Механика",
+ ["Engineering Bag"] = "Сумка механика",
+ Explosives = "Взрывчатка",
+ Feet = "Ступни",
+ ["First Aid"] = "Первая помощь",
+ Fishing = "Рыбная ловля",
+ ["Fishing Pole"] = "Удочка",
+ ["Fishing Poles"] = "Удочки",
+ ["Fist Weapon"] = "Кистевое",
+ ["Fist Weapons"] = "Кистевое",
+ Flask = "Фляга",
+ Food = "Еда",
+ ["Food & Drink"] = "Еда и напитки",
+ Gem = "Самоцветы",
+ ["Gem Bag"] = "Сумка ювелира",
+ Glyph = "Символ",
+ Green = "Зеленый",
+ Gun = "Огнестрельное",
+ Guns = "Огнестрельное",
+ Hands = "Кисти рук",
+ Head = "Голова",
+ ["Held in Off-Hand"] = "Левая рука",
+ Herb = "Трава",
+ ["Herb Bag"] = "Сумка травника",
+ Holiday = "Праздник",
+ Hunter = "Охотник",
+ Idol = "Идол",
+ Idols = "Идолы",
+ ["Inscription Bag"] = "Сумка начертателя",
+ ["Item Enhancement"] = "Улучшение",
+ Jewelcrafting = "Ювелирное дело",
+ Junk = "Мусор",
+ Key = "Ключ",
+ Leather = "Кожа",
+ Leatherworking = "Кожевничество",
+ ["Leatherworking Bag"] = "Сумка кожевника",
+ Legs = "Ноги",
+ Libram = "Манускрипт",
+ Librams = "Манускрипты",
+ Mace = "Дробящее",
+ Mage = "Маг",
+ Mail = "Кольчуга",
+ ["Main Hand"] = "Правая рука",
+ Materials = "Материалы",
+ Meat = "Мясо",
+ Meta = "Особый",
+ ["Metal & Stone"] = "Металл и камень",
+ ["Mining Bag"] = "Шахтерская сумка",
+ Miscellaneous = "Разное",
+ Mount = "Верховые животные",
+ Neck = "Шея",
+ ["Off Hand"] = "Левая рука",
+ ["One-Hand"] = "Одноручное",
+ ["One-Handed Axes"] = "Одноручные топоры",
+ ["One-Handed Maces"] = "Одноручное дробящее",
+ ["One-Handed Swords"] = "Одноручные мечи",
+ Orange = "Оранжевый",
+ Other = "Другое",
+ Paladin = "Паладин",
+ Parts = "Детали",
+ Pet = "Питомец",
+ Plate = "Латы",
+ Polearm = "Древковое",
+ Polearms = "Древковое",
+ Potion = "Зелье",
+ Priest = "Жрец",
+ Prismatic = "Радужный",
+ Projectile = "Боеприпасы",
+ Purple = "Фиолетовый",
+ Quest = "Задания",
+ Quiver = "Колчан",
+ Ranged = "Для оружия дальнего боя",
+ Reagent = "Реагент",
+ Recipe = "Рецепты",
+ Red = "Красный",
+ Relic = "Реликвия",
+ Ring = "Палец",
+ Rogue = "Разбойник",
+ Scroll = "Свиток",
+ Shaman = "Шаман",
+ Shield = "Щит",
+ Shields = "Щиты",
+ Shirt = "Рубашка",
+ Shoulder = "Плечо",
+ Sigils = "Печати",
+ Simple = "Простой",
+ ["Soul Bag"] = "Сумка душ",
+ Staff = "Посох",
+ Staves = "Посохи",
+ Sword = "Меч",
+ Tabard = "Гербовая накидка",
+ Tailoring = "Портняжное дело",
+ Thrown = "Метательное",
+ Totem = "Тотем",
+ Totems = "Тотемы",
+ ["Trade Goods"] = "Хозяйственные товары",
+ Trinket = "Аксессуар",
+ ["Two-Hand"] = "Двуручное",
+ ["Two-Handed Axes"] = "Двуручные топоры",
+ ["Two-Handed Maces"] = "Двуручное дробящее",
+ ["Two-Handed Swords"] = "Двуручные мечи",
+ Waist = "Пояс",
+ Wand = "Жезл",
+ Wands = "Жезлы",
+ Warlock = "Чернокнижник",
+ Warrior = "Воин",
+ Weapon = "Оружие",
+ ["Weapon Enchantment"] = "Чары для оружия\009",
+ Wrist = "Запястья",
+ Yellow = "Желтый",
+}
+elseif GAME_LOCALE == "zhCN" then
+ lib:SetCurrentTranslations {
+ Alchemy = "炼金术",
+ ["Ammo Pouch"] = "弹药袋",
+ Armor = "护甲",
+ ["Armor Enchantment"] = "护甲强化",
+ Arrow = "箭",
+ Axe = "斧",
+ Back = "背部",
+ Bag = "容器",
+ Bandage = "绷带",
+ Blacksmithing = "锻造",
+ Blue = "蓝色",
+ Book = "书籍",
+ Bow = "弓",
+ Bows = "弓",
+ Bullet = "子弹",
+ Chest = "胸部",
+ Cloth = "布甲",
+ Consumable = "消耗品",
+ Container = "容器",
+ Cooking = "烹饪",
+ Crossbow = "弩",
+ Crossbows = "弩",
+ Dagger = "匕首",
+ Daggers = "匕首",
+ ["Death Knight"] = "死亡骑士",
+ Devices = "装置",
+ Drink = "饮料",
+ Druid = "德鲁伊",
+ Elemental = "元素",
+ Elixir = "药剂",
+ Enchanting = "附魔",
+ ["Enchanting Bag"] = "附魔材料袋",
+ Engineering = "工程学",
+ ["Engineering Bag"] = "工程学材料袋",
+ Explosives = "爆炸物",
+ Feet = "脚",
+ ["First Aid"] = "急救",
+ Fishing = "钓鱼",
+ ["Fishing Pole"] = "鱼竿",
+ ["Fishing Poles"] = "鱼竿",
+ ["Fist Weapon"] = "拳套",
+ ["Fist Weapons"] = "拳套",
+ Flask = "合剂",
+ Food = "食物",
+ ["Food & Drink"] = "食物和饮料",
+ Gem = "宝石",
+ ["Gem Bag"] = "宝石袋",
+ Glyph = "雕文",
+ Green = "绿色",
+ Gun = "枪械",
+ Guns = "枪械",
+ Hands = "手",
+ Head = "头部",
+ ["Held in Off-Hand"] = "副手物品",
+ Herb = "草药",
+ ["Herb Bag"] = "草药袋",
+ Holiday = "节日",
+ Hunter = "猎人",
+ Idol = "神像",
+ Idols = "神像",
+ ["Inscription Bag"] = "铭文包",
+ ["Item Enhancement"] = "物品强化",
+ Jewelcrafting = "珠宝加工",
+ Junk = "垃圾",
+ Key = "钥匙",
+ Leather = "皮甲",
+ Leatherworking = "制皮",
+ ["Leatherworking Bag"] = "制皮材料袋",
+ Legs = "腿部",
+ Libram = "圣契",
+ Librams = "圣契",
+ Mace = "锤",
+ Mage = "法师",
+ Mail = "锁甲",
+ ["Main Hand"] = "主手",
+ Materials = "原料",
+ Meat = "肉类",
+ Meta = "多彩",
+ ["Metal & Stone"] = "金属和矿石",
+ ["Mining Bag"] = "矿石袋",
+ Miscellaneous = "其他",
+ Mount = "坐骑",
+ Neck = "颈部",
+ ["Off Hand"] = "副手",
+ ["One-Hand"] = "单手",
+ ["One-Handed Axes"] = "单手斧",
+ ["One-Handed Maces"] = "单手锤",
+ ["One-Handed Swords"] = "单手剑",
+ Orange = "橙色",
+ Other = "其它",
+ Paladin = "圣骑士",
+ Parts = "零件",
+ Pet = "宠物",
+ Plate = "板甲",
+ Polearm = "长柄武器",
+ Polearms = "长柄武器",
+ Potion = "药水",
+ Priest = "牧师",
+ Prismatic = "棱彩",
+ Projectile = "弹药",
+ Purple = "紫色",
+ Quest = "任务",
+ Quiver = "箭袋",
+ Ranged = "远程",
+ Reagent = "材料",
+ Recipe = "配方",
+ Red = "红色",
+ Relic = "圣物",
+ Ring = "手指",
+ Rogue = "潜行者",
+ Scroll = "卷轴",
+ Shaman = "萨满祭司",
+ Shield = "盾牌",
+ Shields = "盾牌",
+ Shirt = "衬衫",
+ Shoulder = "肩部",
+ Sigils = "魔印",
+ Simple = "简易",
+ ["Soul Bag"] = "灵魂袋",
+ Staff = "法杖",
+ Staves = "法杖",
+ Sword = "剑",
+ Tabard = "战袍",
+ Tailoring = "裁缝",
+ Thrown = "投掷武器",
+ Totem = "图腾",
+ Totems = "图腾",
+ ["Trade Goods"] = "商品",
+ Trinket = "饰品",
+ ["Two-Hand"] = "双手",
+ ["Two-Handed Axes"] = "双手斧",
+ ["Two-Handed Maces"] = "双手锤",
+ ["Two-Handed Swords"] = "双手剑",
+ Waist = "腰部",
+ Wand = "魔杖",
+ Wands = "魔杖",
+ Warlock = "术士",
+ Warrior = "战士",
+ Weapon = "武器",
+ ["Weapon Enchantment"] = "武器强化",
+ Wrist = "手腕",
+ Yellow = "黄色",
+}
+elseif GAME_LOCALE == "zhTW" then
+ lib:SetCurrentTranslations {
+ Alchemy = "鍊金術",
+ ["Ammo Pouch"] = "彈藥袋",
+ Armor = "護甲",
+ ["Armor Enchantment"] = "護甲附魔",
+ Arrow = "箭",
+ Axe = "斧",
+ Back = "背部",
+ Bag = "容器",
+ Bandage = "繃帶",
+ Blacksmithing = "鍛造",
+ Blue = "藍色",
+ Book = "書籍",
+ Bow = "弓",
+ Bows = "弓",
+ Bullet = "子彈",
+ Chest = "胸部",
+ Cloth = "布甲",
+ Consumable = "消耗品",
+ Container = "容器",
+ Cooking = "烹飪",
+ Crossbow = "弩",
+ Crossbows = "弩",
+ Dagger = "匕首",
+ Daggers = "匕首",
+ ["Death Knight"] = "死亡騎士",
+ Devices = "裝置",
+ Drink = "飲料",
+ Druid = "德魯伊",
+ Elemental = "元素材料",
+ Elixir = "藥劑",
+ Enchanting = "附魔",
+ ["Enchanting Bag"] = "附魔包",
+ Engineering = "工程學",
+ ["Engineering Bag"] = "工程包",
+ Explosives = "爆裂物",
+ Feet = "腳",
+ ["First Aid"] = "急救",
+ Fishing = "釣魚",
+ ["Fishing Pole"] = "魚竿",
+ ["Fishing Poles"] = "魚竿",
+ ["Fist Weapon"] = "拳套",
+ ["Fist Weapons"] = "拳套",
+ Flask = "精煉藥劑",
+ Food = "食物",
+ ["Food & Drink"] = "食物和飲料",
+ Gem = "寶石",
+ ["Gem Bag"] = "寶石背包",
+ Glyph = "雕紋",
+ Green = "綠色",
+ Gun = "槍械",
+ Guns = "槍械",
+ Hands = "手",
+ Head = "頭部",
+ ["Held in Off-Hand"] = "副手物品",
+ Herb = "草藥",
+ ["Herb Bag"] = "草藥包",
+ Holiday = "節慶用品",
+ Hunter = "獵人",
+ Idol = "塑像",
+ Idols = "塑像",
+ ["Inscription Bag"] = "銘文包",
+ ["Item Enhancement"] = "物品強化",
+ Jewelcrafting = "珠寶設計",
+ Junk = "垃圾",
+ Key = "鑰匙",
+ Leather = "皮甲",
+ Leatherworking = "製皮",
+ ["Leatherworking Bag"] = "製皮包",
+ Legs = "腿部",
+ Libram = "聖契",
+ Librams = "聖契",
+ Mace = "錘",
+ Mage = "法師",
+ Mail = "鎖甲",
+ ["Main Hand"] = "主手",
+ Materials = "原料",
+ Meat = "肉類",
+ Meta = "變換",
+ ["Metal & Stone"] = "金屬和石頭",
+ ["Mining Bag"] = "礦石包",
+ Miscellaneous = "其他",
+ Mount = "坐騎",
+ Neck = "頸部",
+ ["Off Hand"] = "副手",
+ ["One-Hand"] = "單手",
+ ["One-Handed Axes"] = "單手斧",
+ ["One-Handed Maces"] = "單手錘",
+ ["One-Handed Swords"] = "單手劍",
+ Orange = "橘色",
+ Other = "其他",
+ Paladin = "聖騎士",
+ Parts = "零件",
+ Pet = "寵物",
+ Plate = "鎧甲",
+ Polearm = "長柄武器",
+ Polearms = "長柄武器",
+ Potion = "藥水",
+ Priest = "牧師",
+ Prismatic = "稜彩",
+ Projectile = "彈藥",
+ Purple = "紫色",
+ Quest = "任務",
+ Quiver = "箭袋",
+ Ranged = "遠程",
+ Reagent = "施法材料",
+ Recipe = "配方",
+ Red = "紅色",
+ Relic = "聖物",
+ Ring = "手指",
+ Rogue = "盜賊",
+ Scroll = "卷軸",
+ Shaman = "薩滿",
+ Shield = "盾牌",
+ Shields = "盾牌",
+ Shirt = "襯衣",
+ Shoulder = "肩部",
+ Sigils = "符印",
+ Simple = "簡單",
+ ["Soul Bag"] = "靈魂裂片包",
+ Staff = "法杖",
+ Staves = "法杖",
+ Sword = "劍",
+ Tabard = "外袍",
+ Tailoring = "裁縫",
+ Thrown = "投擲武器",
+ Totem = "圖騰",
+ Totems = "圖騰",
+ ["Trade Goods"] = "商品",
+ Trinket = "飾品",
+ ["Two-Hand"] = "雙手",
+ ["Two-Handed Axes"] = "雙手斧",
+ ["Two-Handed Maces"] = "雙手錘",
+ ["Two-Handed Swords"] = "雙手劍",
+ Waist = "腰部",
+ Wand = "魔杖",
+ Wands = "魔杖",
+ Warlock = "術士",
+ Warrior = "戰士",
+ Weapon = "武器",
+ ["Weapon Enchantment"] = "武器附魔",
+ Wrist = "手腕",
+ Yellow = "黃色",
+}
+
+else
+ error(("%s: Locale %q not supported"):format(MAJOR_VERSION, GAME_LOCALE))
+end
diff --git a/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-Inventory-3.0.toc b/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-Inventory-3.0.toc
new file mode 100644
index 0000000..a9ff79b
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibBabble-Inventory-3.0.toc
@@ -0,0 +1,16 @@
+## Interface: 30300
+## LoadOnDemand: 1
+## Title: Lib: Babble-Inventory-3.0
+## Notes: A library to help with localization of item types and subtypes.
+## Notes-esES: Una libreria para ayudar con la traduccion de tipos y subtipos de objetos.
+## Author: ckknight
+## X-eMail: ckknight@gmail.com
+## X-Category: Library
+## X-License: MIT
+## X-Curse-Packaged-Version: r101
+## X-Curse-Project-Name: LibBabble-Inventory-3.0
+## X-Curse-Project-ID: libbabble-inventory-3-0
+## X-Curse-Repository-ID: wow/libbabble-inventory-3-0/mainline
+
+LibStub\LibStub.lua
+lib.xml
diff --git a/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibStub/LibStub.lua b/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibStub/LibStub.lua
new file mode 100644
index 0000000..cfc97de
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Inventory-3.0/LibStub/LibStub.lua
@@ -0,0 +1,30 @@
+-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
+-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
+local LibStub = _G[LIBSTUB_MAJOR]
+
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+ LibStub = LibStub or {libs = {}, minors = {} }
+ _G[LIBSTUB_MAJOR] = LibStub
+ LibStub.minor = LIBSTUB_MINOR
+
+ function LibStub:NewLibrary(major, minor)
+ assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+ minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
+
+ local oldminor = self.minors[major]
+ if oldminor and oldminor >= minor then return nil end
+ self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+ return self.libs[major], oldminor
+ end
+
+ function LibStub:GetLibrary(major, silent)
+ if not self.libs[major] and not silent then
+ error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
+ end
+ return self.libs[major], self.minors[major]
+ end
+
+ function LibStub:IterateLibraries() return pairs(self.libs) end
+ setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
diff --git a/AtlasLoot/Libs/LibBabble-Inventory-3.0/lib.xml b/AtlasLoot/Libs/LibBabble-Inventory-3.0/lib.xml
new file mode 100644
index 0000000..8d5fd4a
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Inventory-3.0/lib.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-3.0.lua b/AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-3.0.lua
new file mode 100644
index 0000000..9b032f3
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-3.0.lua
@@ -0,0 +1,292 @@
+-- LibBabble-3.0 is hereby placed in the Public Domain
+-- Credits: ckknight
+local LIBBABBLE_MAJOR, LIBBABBLE_MINOR = "LibBabble-3.0", 2
+
+local LibBabble = LibStub:NewLibrary(LIBBABBLE_MAJOR, LIBBABBLE_MINOR)
+if not LibBabble then
+ return
+end
+
+local data = LibBabble.data or {}
+for k,v in pairs(LibBabble) do
+ LibBabble[k] = nil
+end
+LibBabble.data = data
+
+local tablesToDB = {}
+for namespace, db in pairs(data) do
+ for k,v in pairs(db) do
+ tablesToDB[v] = db
+ end
+end
+
+local function warn(message)
+ local _, ret = pcall(error, message, 3)
+ geterrorhandler()(ret)
+end
+
+local lookup_mt = { __index = function(self, key)
+ local db = tablesToDB[self]
+ local current_key = db.current[key]
+ if current_key then
+ self[key] = current_key
+ return current_key
+ end
+ local base_key = db.base[key]
+ local real_MAJOR_VERSION
+ for k,v in pairs(data) do
+ if v == db then
+ real_MAJOR_VERSION = k
+ break
+ end
+ end
+ if not real_MAJOR_VERSION then
+ real_MAJOR_VERSION = LIBBABBLE_MAJOR
+ end
+ if base_key then
+ warn(("%s: Translation %q not found for locale %q"):format(real_MAJOR_VERSION, key, GetLocale()))
+ rawset(self, key, base_key)
+ return base_key
+ end
+ warn(("%s: Translation %q not found."):format(real_MAJOR_VERSION, key))
+ rawset(self, key, key)
+ return key
+end }
+
+local function initLookup(module, lookup)
+ local db = tablesToDB[module]
+ for k in pairs(lookup) do
+ lookup[k] = nil
+ end
+ setmetatable(lookup, lookup_mt)
+ tablesToDB[lookup] = db
+ db.lookup = lookup
+ return lookup
+end
+
+local function initReverse(module, reverse)
+ local db = tablesToDB[module]
+ for k in pairs(reverse) do
+ reverse[k] = nil
+ end
+ for k,v in pairs(db.current) do
+ reverse[v] = k
+ end
+ tablesToDB[reverse] = db
+ db.reverse = reverse
+ db.reverseIterators = nil
+ return reverse
+end
+
+local prototype = {}
+local prototype_mt = {__index = prototype}
+
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will warn but allow the code to pass through.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local BL = B:GetLookupTable()
+ assert(BL["Some english word"] == "Some localized word")
+ DoSomething(BL["Some english word that doesn't exist"]) -- warning!
+-----------------------------------------------------------------------------]]
+function prototype:GetLookupTable()
+ local db = tablesToDB[self]
+
+ local lookup = db.lookup
+ if lookup then
+ return lookup
+ end
+ return initLookup(self, {})
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local B_has = B:GetUnstrictLookupTable()
+ assert(B_has["Some english word"] == "Some localized word")
+ assert(B_has["Some english word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetUnstrictLookupTable()
+ local db = tablesToDB[self]
+
+ return db.current
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+ * This is useful for checking if the base (English) table has a key, even if the localized one does not have it registered.
+Returns:
+ A lookup table for english to localized words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local B_hasBase = B:GetBaseLookupTable()
+ assert(B_hasBase["Some english word"] == "Some english word")
+ assert(B_hasBase["Some english word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetBaseLookupTable()
+ local db = tablesToDB[self]
+
+ return db.base
+end
+--[[---------------------------------------------------------------------------
+Notes:
+ * If you try to access a nonexistent key, it will return nil.
+ * This will return only one English word that it maps to, if there are more than one to check, see :GetReverseIterator("word")
+Returns:
+ A lookup table for localized to english words.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ local BR = B:GetReverseLookupTable()
+ assert(BR["Some localized word"] == "Some english word")
+ assert(BR["Some localized word that doesn't exist"] == nil)
+-----------------------------------------------------------------------------]]
+function prototype:GetReverseLookupTable()
+ local db = tablesToDB[self]
+
+ local reverse = db.reverse
+ if reverse then
+ return reverse
+ end
+ return initReverse(self, {})
+end
+local blank = {}
+local weakVal = {__mode='v'}
+--[[---------------------------------------------------------------------------
+Arguments:
+ string - the localized word to chek for.
+Returns:
+ An iterator to traverse all English words that map to the given key
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ for word in B:GetReverseIterator("Some localized word") do
+ DoSomething(word)
+ end
+-----------------------------------------------------------------------------]]
+function prototype:GetReverseIterator(key)
+ local db = tablesToDB[self]
+ local reverseIterators = db.reverseIterators
+ if not reverseIterators then
+ reverseIterators = setmetatable({}, weakVal)
+ db.reverseIterators = reverseIterators
+ elseif reverseIterators[key] then
+ return pairs(reverseIterators[key])
+ end
+ local t
+ for k,v in pairs(db.current) do
+ if v == key then
+ if not t then
+ t = {}
+ end
+ t[k] = true
+ end
+ end
+ reverseIterators[key] = t or blank
+ return pairs(reverseIterators[key])
+end
+--[[---------------------------------------------------------------------------
+Returns:
+ An iterator to traverse all translations English to localized.
+Example:
+ local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
+ for english, localized in B:Iterate() do
+ DoSomething(english, localized)
+ end
+-----------------------------------------------------------------------------]]
+function prototype:Iterate()
+ local db = tablesToDB[self]
+
+ return pairs(db.current)
+end
+
+-- #NODOC
+-- modules need to call this to set the base table
+function prototype:SetBaseTranslations(base)
+ local db = tablesToDB[self]
+ local oldBase = db.base
+ if oldBase then
+ for k in pairs(oldBase) do
+ oldBase[k] = nil
+ end
+ for k, v in pairs(base) do
+ oldBase[k] = v
+ end
+ base = oldBase
+ else
+ db.base = base
+ end
+ for k,v in pairs(base) do
+ if v == true then
+ base[k] = k
+ end
+ end
+end
+
+local function init(module)
+ local db = tablesToDB[module]
+ if db.lookup then
+ initLookup(module, db.lookup)
+ end
+ if db.reverse then
+ initReverse(module, db.reverse)
+ end
+ db.reverseIterators = nil
+end
+
+-- #NODOC
+-- modules need to call this to set the current table. if current is true, use the base table.
+function prototype:SetCurrentTranslations(current)
+ local db = tablesToDB[self]
+ if current == true then
+ db.current = db.base
+ else
+ local oldCurrent = db.current
+ if oldCurrent then
+ for k in pairs(oldCurrent) do
+ oldCurrent[k] = nil
+ end
+ for k, v in pairs(current) do
+ oldCurrent[k] = v
+ end
+ current = oldCurrent
+ else
+ db.current = current
+ end
+ end
+ init(self)
+end
+
+for namespace, db in pairs(data) do
+ setmetatable(db.module, prototype_mt)
+ init(db.module)
+end
+
+-- #NODOC
+-- modules need to call this to create a new namespace.
+function LibBabble:New(namespace, minor)
+ local module, oldminor = LibStub:NewLibrary(namespace, minor)
+ if not module then
+ return
+ end
+
+ if not oldminor then
+ local db = {
+ module = module,
+ }
+ data[namespace] = db
+ tablesToDB[module] = db
+ else
+ for k,v in pairs(module) do
+ module[k] = nil
+ end
+ end
+
+ setmetatable(module, prototype_mt)
+
+ return module
+end
diff --git a/AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-Zone-3.0.lua b/AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-Zone-3.0.lua
new file mode 100644
index 0000000..721f002
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-Zone-3.0.lua
@@ -0,0 +1,2464 @@
+--[[
+Name: LibBabble-Zone-3.0
+Revision: $Rev: 277 $
+Maintainers: ckknight, nevcairiel, Ackis
+Website: http://www.wowace.com/projects/libbabble-zone-3-0/
+Dependencies: None
+License: MIT
+]]
+
+local MAJOR_VERSION = "LibBabble-Zone-3.0"
+local MINOR_VERSION = 90000 + tonumber(("$Rev: 277 $"):match("%d+"))
+
+if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
+local lib = LibStub("LibBabble-3.0"):New(MAJOR_VERSION, MINOR_VERSION)
+if not lib then return end
+
+local GAME_LOCALE = GetLocale()
+
+lib:SetBaseTranslations {
+ ["Abyssal Depths"] = "Abyssal Depths",
+ ["Ahn'kahet: The Old Kingdom"] = "Ahn'kahet: The Old Kingdom",
+ ["Ahn'Qiraj"] = "Ahn'Qiraj",
+ ["Alliance Base"] = "Alliance Base",
+ ["Alterac Mountains"] = "Alterac Mountains",
+ ["Alterac Valley"] = "Alterac Valley",
+ ["Amani Pass"] = "Amani Pass",
+ ["Arathi Basin"] = "Arathi Basin",
+ ["Arathi Highlands"] = "Arathi Highlands",
+ Armory = "Armory",
+ Ashenvale = "Ashenvale",
+ Auberdine = "Auberdine",
+ ["Auchenai Crypts"] = "Auchenai Crypts",
+ Auchindoun = "Auchindoun",
+ Azeroth = "Azeroth",
+ ["Azjol-Nerub"] = "Azjol-Nerub",
+ Azshara = "Azshara",
+ ["Azuremyst Isle"] = "Azuremyst Isle",
+ Badlands = "Badlands",
+ ["Bash'ir Landing"] = "Bash'ir Landing",
+ ["Blackfathom Deeps"] = "Blackfathom Deeps",
+ ["Blackrock Caverns"] = "Blackrock Caverns",
+ ["Blackrock Depths"] = "Blackrock Depths",
+ ["Blackrock Mountain"] = "Blackrock Mountain",
+ ["Blackrock Spire"] = "Blackrock Spire",
+ ["Black Temple"] = "Black Temple",
+ ["Blackwind Lake"] = "Blackwind Lake",
+ ["Blackwing Lair"] = "Blackwing Lair",
+ ["Blade's Edge Arena"] = "Blade's Edge Arena",
+ ["Blade's Edge Mountains"] = "Blade's Edge Mountains",
+ ["Blasted Lands"] = "Blasted Lands",
+ ["Bloodmyst Isle"] = "Bloodmyst Isle",
+ ["Booty Bay"] = "Booty Bay",
+ ["Borean Tundra"] = "Borean Tundra",
+ ["Burning Steppes"] = "Burning Steppes",
+ Cathedral = "Cathedral",
+ ["Caverns of Time"] = "Caverns of Time",
+ ["Champions' Hall"] = "Champions' Hall",
+ ["Coilfang Reservoir"] = "Coilfang Reservoir",
+ Coldarra = "Coldarra",
+ ["Cosmic map"] = "Cosmic map",
+ ["Crystalsong Forest"] = "Crystalsong Forest",
+ ["Crystal Spine"] = "Crystal Spine",
+ Dalaran = "Dalaran",
+ ["Dalaran Arena"] = "Dalaran Arena",
+ ["Dalaran Sewers"] = "Dalaran Sewers",
+ ["Darkmoon Faire"] = "Darkmoon Faire",
+ Darkshore = "Darkshore",
+ Darnassus = "Darnassus",
+ ["Deadwind Pass"] = "Deadwind Pass",
+ Deepholm = "Deepholm",
+ ["Deeprun Tram"] = "Deeprun Tram",
+ Desolace = "Desolace",
+ ["Dire Maul"] = "Dire Maul",
+ ["Dire Maul (East)"] = "Dire Maul (East)",
+ ["Dire Maul (North)"] = "Dire Maul (North)",
+ ["Dire Maul (West)"] = "Dire Maul (West)",
+ Dragonblight = "Dragonblight",
+ ["Drak'Tharon Keep"] = "Drak'Tharon Keep",
+ ["Dun Morogh"] = "Dun Morogh",
+ Durotar = "Durotar",
+ Duskwood = "Duskwood",
+ ["Dustwallow Marsh"] = "Dustwallow Marsh",
+ ["Eastern Kingdoms"] = "Eastern Kingdoms",
+ ["Eastern Plaguelands"] = "Eastern Plaguelands",
+ ["Elwynn Forest"] = "Elwynn Forest",
+ Everlook = "Everlook",
+ ["Eversong Woods"] = "Eversong Woods",
+ ["Eye of the Storm"] = "Eye of the Storm",
+ Felwood = "Felwood",
+ Feralas = "Feralas",
+ ["Forge Camp: Terror"] = "Forge Camp: Terror",
+ ["Forge Camp: Wrath"] = "Forge Camp: Wrath",
+ ["Frostwyrm Lair"] = "Frostwyrm Lair",
+ ["Furywing's Perch"] = "Furywing's Perch",
+ Gadgetzan = "Gadgetzan",
+ ["Gates of Ahn'Qiraj"] = "Gates of Ahn'Qiraj",
+ Ghostlands = "Ghostlands",
+ Gilneas = "Gilneas",
+ ["Gilneas City"] = "Gilneas City",
+ Gnomeregan = "Gnomeregan",
+ Graveyard = "Graveyard",
+ ["Grim Batol"] = "Grim Batol",
+ ["Grizzly Hills"] = "Grizzly Hills",
+ ["Grom'gol Base Camp"] = "Grom'gol Base Camp",
+ ["Gruul's Lair"] = "Gruul's Lair",
+ Gundrak = "Gundrak",
+ ["Hall of Champions"] = "Hall of Champions",
+ ["Hall of Legends"] = "Hall of Legends",
+ ["Halls of Lightning"] = "Halls of Lightning",
+ ["Halls of Reflection"] = "Halls of Reflection",
+ ["Halls of Stone"] = "Halls of Stone",
+ ["Hellfire Citadel"] = "Hellfire Citadel",
+ ["Hellfire Peninsula"] = "Hellfire Peninsula",
+ ["Hellfire Ramparts"] = "Hellfire Ramparts",
+ ["Hillsbrad Foothills"] = "Hillsbrad Foothills",
+ ["Horde Encampment"] = "Horde Encampment",
+ ["Howling Fjord"] = "Howling Fjord",
+ ["Hrothgar's Landing"] = "Hrothgar's Landing",
+ Hyjal = "Hyjal",
+ ["Hyjal Summit"] = "Hyjal Summit",
+ Icecrown = "Icecrown",
+ ["Icecrown Citadel"] = "Icecrown Citadel",
+ ["Insidion's Perch"] = "Insidion's Perch",
+ Ironforge = "Ironforge",
+ ["Isle of Conquest"] = "Isle of Conquest",
+ ["Isle of Quel'Danas"] = "Isle of Quel'Danas",
+ Kalimdor = "Kalimdor",
+ Karazhan = "Karazhan",
+ ["Kelp Forest"] = "Kelp Forest",
+ Kezan = "Kezan",
+ ["Krasus' Landing"] = "Krasus' Landing",
+ Library = "Library",
+ ["Loch Modan"] = "Loch Modan",
+ ["Lower Blackrock Spire"] = "Lower Blackrock Spire",
+ ["Magisters' Terrace"] = "Magisters' Terrace",
+ ["Magtheridon's Lair"] = "Magtheridon's Lair",
+ ["Mana-Tombs"] = "Mana-Tombs",
+ Maraudon = "Maraudon",
+ ["Marshlight Lake"] = "Marshlight Lake",
+ ["Menethil Harbor"] = "Menethil Harbor",
+ ["Molten Core"] = "Molten Core",
+ Moonglade = "Moonglade",
+ ["Mount Hyjal"] = "Mount Hyjal",
+ Mulgore = "Mulgore",
+ Nagrand = "Nagrand",
+ ["Nagrand Arena"] = "Nagrand Arena",
+ Naxxramas = "Naxxramas",
+ Netherstorm = "Netherstorm",
+ ["Night Elf Village"] = "Night Elf Village",
+ ["Northern Barrens"] = "Northern Barrens",
+ ["Northern Stranglethorn"] = "Northern Stranglethorn",
+ Northrend = "Northrend",
+ ["Obsidia's Perch"] = "Obsidia's Perch",
+ ["Ogri'la"] = "Ogri'la",
+ ["Old Hillsbrad Foothills"] = "Old Hillsbrad Foothills",
+ ["Old Stratholme"] = "Old Stratholme",
+ ["Onyxia's Lair"] = "Onyxia's Lair",
+ Orgrimmar = "Orgrimmar",
+ Outland = "Outland",
+ ["Pit of Saron"] = "Pit of Saron",
+ ["Plaguelands: The Scarlet Enclave"] = "Plaguelands: The Scarlet Enclave",
+ Plaguewood = "Plaguewood",
+ ["Quel'thalas"] = "Quel'thalas",
+ ["Ragefire Chasm"] = "Ragefire Chasm",
+ Ratchet = "Ratchet",
+ ["Razorfen Downs"] = "Razorfen Downs",
+ ["Razorfen Kraul"] = "Razorfen Kraul",
+ ["Redridge Mountains"] = "Redridge Mountains",
+ ["Ring of Observance"] = "Ring of Observance",
+ ["Rivendark's Perch"] = "Rivendark's Perch",
+ ["Ruins of Ahn'Qiraj"] = "Ruins of Ahn'Qiraj",
+ ["Ruins of Gilneas"] = "Ruins of Gilneas",
+ ["Ruins of Lordaeron"] = "Ruins of Lordaeron",
+ ["Scalebeard's Cave"] = "Scalebeard's Cave",
+ ["Scarlet Monastery"] = "Scarlet Monastery",
+ Scholomance = "Scholomance",
+ ["Searing Gorge"] = "Searing Gorge",
+ ["Serpent Lake"] = "Serpent Lake",
+ ["Serpentshrine Cavern"] = "Serpentshrine Cavern",
+ ["Sethekk Halls"] = "Sethekk Halls",
+ ["Shadowfang Keep"] = "Shadowfang Keep",
+ ["Shadow Labyrinth"] = "Shadow Labyrinth",
+ ["Shadowmoon Valley"] = "Shadowmoon Valley",
+ ["Shartuul's Transporter"] = "Shartuul's Transporter",
+ Shattrath = "Shattrath",
+ ["Shattrath City"] = "Shattrath City",
+ ["Shimmering Expanse"] = "Shimmering Expanse",
+ ["Sholazar Basin"] = "Sholazar Basin",
+ Silithus = "Silithus",
+ ["Silvermoon City"] = "Silvermoon City",
+ ["Silverpine Forest"] = "Silverpine Forest",
+ ["Skyguard Outpost"] = "Skyguard Outpost",
+ ["Skysong Lake"] = "Skysong Lake",
+ ["Southern Barrens"] = "Southern Barrens",
+ ["Sporewind Lake"] = "Sporewind Lake",
+ Stonard = "Stonard",
+ ["Stonetalon Mountains"] = "Stonetalon Mountains",
+ Stormwind = "Stormwind",
+ ["Stormwind City"] = "Stormwind City",
+ ["Strand of the Ancients"] = "Strand of the Ancients",
+ ["Stranglethorn Vale"] = "Stranglethorn Vale",
+ Stratholme = "Stratholme",
+ ["Sunken Temple"] = "Sunken Temple",
+ ["Sunwell Plateau"] = "Sunwell Plateau",
+ ["Swamp of Sorrows"] = "Swamp of Sorrows",
+ Tanaris = "Tanaris",
+ Teldrassil = "Teldrassil",
+ ["Tempest Keep"] = "Tempest Keep",
+ ["Temple of Ahn'Qiraj"] = "Temple of Ahn'Qiraj",
+ ["Terokkar Forest"] = "Terokkar Forest",
+ ["Terokk's Rest"] = "Terokk's Rest",
+ ["The Arachnid Quarter"] = "The Arachnid Quarter",
+ ["The Arcatraz"] = "The Arcatraz",
+ ["The Argent Coliseum"] = "The Argent Coliseum",
+ ["The Barrens"] = "The Barrens",
+ ["The Black Morass"] = "The Black Morass",
+ ["The Blood Furnace"] = "The Blood Furnace",
+ ["The Bone Wastes"] = "The Bone Wastes",
+ ["The Botanica"] = "The Botanica",
+ ["The Construct Quarter"] = "The Construct Quarter",
+ ["The Culling of Stratholme"] = "The Culling of Stratholme",
+ ["The Dark Portal"] = "The Dark Portal",
+ ["The Deadmines"] = "The Deadmines",
+ ["The Descent into Madness"] = "The Descent into Madness",
+ ["The Exodar"] = "The Exodar",
+ ["The Eye"] = "The Eye",
+ ["The Eye of Eternity"] = "The Eye of Eternity",
+ ["The Forbidding Sea"] = "The Forbidding Sea",
+ ["The Forge of Souls"] = "The Forge of Souls",
+ ["The Frozen Halls"] = "The Frozen Halls",
+ ["The Frozen Sea"] = "The Frozen Sea",
+ ["The Great Sea"] = "The Great Sea",
+ ["The Halls of Winter"] = "The Halls of Winter",
+ ["The Hinterlands"] = "The Hinterlands",
+ ["The Mechanar"] = "The Mechanar",
+ ["The Military Quarter"] = "The Military Quarter",
+ ["The Nexus"] = "The Nexus",
+ ["The North Sea"] = "The North Sea",
+ ["The Obsidian Sanctum"] = "The Obsidian Sanctum",
+ ["The Oculus"] = "The Oculus",
+ ["The Plague Quarter"] = "The Plague Quarter",
+ ["The Prison of Yogg-Saron"] = "The Prison of Yogg-Saron",
+ ["Theramore Isle"] = "Theramore Isle",
+ ["The Ring of Valor"] = "The Ring of Valor",
+ ["The Ruby Sanctum"] = "The Ruby Sanctum",
+ ["The Scarlet Enclave"] = "The Scarlet Enclave",
+ ["The Shattered Halls"] = "The Shattered Halls",
+ ["The Slave Pens"] = "The Slave Pens",
+ ["The Spark of Imagination"] = "The Spark of Imagination",
+ ["The Steamvault"] = "The Steamvault",
+ ["The Stockade"] = "The Stockade",
+ ["The Storm Peaks"] = "The Storm Peaks",
+ ["The Temple of Atal'Hakkar"] = "The Temple of Atal'Hakkar",
+ ["The Underbog"] = "The Underbog",
+ ["The Veiled Sea"] = "The Veiled Sea",
+ ["The Violet Hold"] = "The Violet Hold",
+ ["Thousand Needles"] = "Thousand Needles",
+ ["Throne of the Tides"] = "Throne of the Tides",
+ ["Thunder Bluff"] = "Thunder Bluff",
+ Tirisfal = "Tirisfal",
+ ["Tirisfal Glades"] = "Tirisfal Glades",
+ ["Trial of the Champion"] = "Trial of the Champion",
+ ["Trial of the Crusader"] = "Trial of the Crusader",
+ ["Twisting Nether"] = "Twisting Nether",
+ Uldaman = "Uldaman",
+ Ulduar = "Ulduar",
+ Undercity = "Undercity",
+ ["Un'Goro Crater"] = "Un'Goro Crater",
+ ["Upper Blackrock Spire"] = "Upper Blackrock Spire",
+ ["Utgarde Keep"] = "Utgarde Keep",
+ ["Utgarde Pinnacle"] = "Utgarde Pinnacle",
+ ["Vashj'ir"] = "Vashj'ir",
+ ["Vault of Archavon"] = "Vault of Archavon",
+ ["Vortex Pinnacle"] = "Vortex Pinnacle",
+ ["Wailing Caverns"] = "Wailing Caverns",
+ ["Warsong Gulch"] = "Warsong Gulch",
+ ["Western Plaguelands"] = "Western Plaguelands",
+ Westfall = "Westfall",
+ Wetlands = "Wetlands",
+ Wintergrasp = "Wintergrasp",
+ Winterspring = "Winterspring",
+ ["Wyrmrest Temple"] = "Wyrmrest Temple",
+ Zangarmarsh = "Zangarmarsh",
+ ["Zul'Aman"] = "Zul'Aman",
+ ["Zul'Drak"] = "Zul'Drak",
+ ["Zul'Farrak"] = "Zul'Farrak",
+ ["Zul'Gurub"] = "Zul'Gurub",
+}
+
+
+if GAME_LOCALE == "enUS" then
+ lib:SetCurrentTranslations(true)
+elseif GAME_LOCALE == "deDE" then
+ lib:SetCurrentTranslations {
+ ["Abyssal Depths"] = "Abyssische Tiefen",
+ ["Ahn'kahet: The Old Kingdom"] = "Ahn'kahet: Das Alte Königreich",
+ ["Ahn'Qiraj"] = "Ahn'Qiraj",
+ ["Alliance Base"] = "Basis der Allianz",
+ ["Alterac Mountains"] = "Alteracgebirge",
+ ["Alterac Valley"] = "Alteractal",
+ ["Amani Pass"] = "Amanipass",
+ ["Arathi Basin"] = "Arathibecken",
+ ["Arathi Highlands"] = "Arathihochland",
+ Armory = "Waffenkammer",
+ Ashenvale = "Eschental",
+ Auberdine = "Auberdine",
+ ["Auchenai Crypts"] = "Auchenaikrypta",
+ Auchindoun = "Auchindoun",
+ Azeroth = "Azeroth",
+ ["Azjol-Nerub"] = "Azjol-Nerub",
+ Azshara = "Azshara",
+ ["Azuremyst Isle"] = "Azurmythosinsel",
+ Badlands = "Ödland",
+ ["Bash'ir Landing"] = "Landeplatz von Bash'ir",
+ ["Blackfathom Deeps"] = "Tiefschwarze Grotte",
+ -- ["Blackrock Caverns"] = "",
+ ["Blackrock Depths"] = "Schwarzfelstiefen",
+ ["Blackrock Mountain"] = "Der Schwarzfels",
+ ["Blackrock Spire"] = "Schwarzfelsspitze",
+ ["Black Temple"] = "Der Schwarze Tempel",
+ ["Blackwind Lake"] = "Schattenwindsee",
+ ["Blackwing Lair"] = "Pechschwingenhort",
+ ["Blade's Edge Arena"] = "Arena des Schergrats",
+ ["Blade's Edge Mountains"] = "Schergrat",
+ ["Blasted Lands"] = "Verwüstete Lande",
+ ["Bloodmyst Isle"] = "Blutmythosinsel",
+ ["Booty Bay"] = "Beutebucht",
+ ["Borean Tundra"] = "Boreanische Tundra",
+ ["Burning Steppes"] = "Brennende Steppe",
+ Cathedral = "Kathedrale",
+ ["Caverns of Time"] = "Höhlen der Zeit",
+ ["Champions' Hall"] = "Halle der Champions",
+ ["Coilfang Reservoir"] = "Der Echsenkessel",
+ Coldarra = "Kaltarra",
+ ["Cosmic map"] = "Kosmische Karte",
+ ["Crystalsong Forest"] = "Kristallsangwald",
+ ["Crystal Spine"] = "Kristallrücken",
+ Dalaran = "Dalaran",
+ ["Dalaran Arena"] = "Arena von Dalaran",
+ ["Dalaran Sewers"] = "Arena von Dalaran",
+ ["Darkmoon Faire"] = "Dunkelmond-Jahrmarkt",
+ Darkshore = "Dunkelküste",
+ Darnassus = "Darnassus",
+ ["Deadwind Pass"] = "Gebirgspass der Totenwinde",
+ Deepholm = "Tiefenheim",
+ ["Deeprun Tram"] = "Die Tiefenbahn",
+ Desolace = "Desolace",
+ ["Dire Maul"] = "Düsterbruch",
+ ["Dire Maul (East)"] = "Düsterbruch (Ost)",
+ ["Dire Maul (North)"] = "Düsterbruch (Nord)",
+ ["Dire Maul (West)"] = "Düsterbruch (West)",
+ Dragonblight = "Drachenöde",
+ ["Drak'Tharon Keep"] = "Feste Drak'Tharon",
+ ["Dun Morogh"] = "Dun Morogh",
+ Durotar = "Durotar",
+ Duskwood = "Dämmerwald",
+ ["Dustwallow Marsh"] = "Düstermarschen",
+ ["Eastern Kingdoms"] = "Östliche Königreiche",
+ ["Eastern Plaguelands"] = "Östliche Pestländer",
+ ["Elwynn Forest"] = "Wald von Elwynn",
+ Everlook = "Ewige Warte",
+ ["Eversong Woods"] = "Immersangwald",
+ ["Eye of the Storm"] = "Auge des Sturms",
+ Felwood = "Teufelswald",
+ Feralas = "Feralas",
+ ["Forge Camp: Terror"] = "Konstruktionslager: Terror",
+ ["Forge Camp: Wrath"] = "Konstruktionslager: Wut",
+ ["Frostwyrm Lair"] = "Frostwyrmbau",
+ ["Furywing's Perch"] = "Isidions Hort",
+ Gadgetzan = "Gadgetzan",
+ ["Gates of Ahn'Qiraj"] = "Tore von Ahn'Qiraj",
+ Ghostlands = "Geisterlande",
+ Gilneas = "Gilneas",
+ -- ["Gilneas City"] = "",
+ Gnomeregan = "Gnomeregan",
+ Graveyard = "Friedhof",
+ ["Grim Batol"] = "Grim Batol",
+ ["Grizzly Hills"] = "Grizzlyhügel",
+ ["Grom'gol Base Camp"] = "Basislager von Grom'gol",
+ ["Gruul's Lair"] = "Gruuls Unterschlupf",
+ Gundrak = "Gundrak",
+ ["Hall of Champions"] = "Halle der Champions",
+ ["Hall of Legends"] = "Halle der Legenden",
+ ["Halls of Lightning"] = "Die Hallen der Blitze",
+ ["Halls of Reflection"] = "Hallen der Reflexion",
+ ["Halls of Stone"] = "Die Hallen des Steins",
+ ["Hellfire Citadel"] = "Höllenfeuerzitadelle",
+ ["Hellfire Peninsula"] = "Höllenfeuerhalbinsel",
+ ["Hellfire Ramparts"] = "Höllenfeuerbollwerk",
+ ["Hillsbrad Foothills"] = "Vorgebirge des Hügellands",
+ ["Horde Encampment"] = "Lager der Horde",
+ ["Howling Fjord"] = "Der heulende Fjord",
+ ["Hrothgar's Landing"] = "Hrothgars Landestelle",
+ Hyjal = "Hyjal",
+ ["Hyjal Summit"] = "Hyjalgipfel",
+ Icecrown = "Eiskrone",
+ ["Icecrown Citadel"] = "Eiskronenzitadelle",
+ ["Insidion's Perch"] = "Isidions Hort",
+ Ironforge = "Eisenschmiede",
+ ["Isle of Conquest"] = "Insel der Eroberung",
+ ["Isle of Quel'Danas"] = "Insel von Quel'Danas",
+ Kalimdor = "Kalimdor",
+ Karazhan = "Karazhan",
+ ["Kelp Forest"] = "Tangwald",
+ Kezan = "Kezan",
+ ["Krasus' Landing"] = "Krasus' Landeplatz",
+ Library = "Bibliothek",
+ ["Loch Modan"] = "Loch Modan",
+ ["Lower Blackrock Spire"] = "Untere Schwarzfelsspitze",
+ ["Magisters' Terrace"] = "Terrasse der Magister",
+ ["Magtheridon's Lair"] = "Magtheridons Kammer",
+ ["Mana-Tombs"] = "Managruft",
+ Maraudon = "Maraudon",
+ ["Marshlight Lake"] = "Sumpflichtsee",
+ ["Menethil Harbor"] = "Hafen von Menethil",
+ ["Molten Core"] = "Geschmolzener Kern",
+ Moonglade = "Mondlichtung",
+ ["Mount Hyjal"] = "Berg Hyjal",
+ Mulgore = "Mulgore",
+ Nagrand = "Nagrand",
+ ["Nagrand Arena"] = "Arena von Nagrand",
+ Naxxramas = "Naxxramas",
+ Netherstorm = "Nethersturm",
+ ["Night Elf Village"] = "Nachtelfen Dorf",
+ -- ["Northern Barrens"] = "",
+ -- ["Northern Stranglethorn"] = "",
+ Northrend = "Nordend",
+ ["Obsidia's Perch"] = "Obsidias Hort",
+ ["Ogri'la"] = "Ogri'la",
+ ["Old Hillsbrad Foothills"] = "Vorgebirge des Alten Hügellands",
+ ["Old Stratholme"] = "Alt-Stratholme",
+ ["Onyxia's Lair"] = "Onyxias Hort",
+ Orgrimmar = "Orgrimmar",
+ Outland = "Scherbenwelt",
+ ["Pit of Saron"] = "Grube von Saron",
+ ["Plaguelands: The Scarlet Enclave"] = "Pestländer: Die Scharlachrote Enklave",
+ Plaguewood = "Seuchenwald",
+ ["Quel'thalas"] = "Quel'Thalas",
+ ["Ragefire Chasm"] = "Der Flammenschlund",
+ Ratchet = "Ratschet",
+ ["Razorfen Downs"] = "Hügel der Klingenhauer",
+ ["Razorfen Kraul"] = "Kral der Klingenhauer",
+ ["Redridge Mountains"] = "Rotkammgebirge",
+ ["Ring of Observance"] = "Ring der Beobachtung",
+ ["Rivendark's Perch"] = "Nachtreißers Hort",
+ ["Ruins of Ahn'Qiraj"] = "Ruinen von Ahn'Qiraj",
+ ["Ruins of Gilneas"] = "Ruinen von Gilneas",
+ ["Ruins of Lordaeron"] = "Ruinen von Lordaeron",
+ ["Scalebeard's Cave"] = "Schuppenbarts Höhle",
+ ["Scarlet Monastery"] = "Das Scharlachrote Kloster",
+ Scholomance = "Scholomance",
+ ["Searing Gorge"] = "Sengende Schlucht",
+ ["Serpent Lake"] = "Schlangensee",
+ ["Serpentshrine Cavern"] = "Höhle des Schlangenschreins",
+ ["Sethekk Halls"] = "Sethekkhallen",
+ ["Shadowfang Keep"] = "Burg Schattenfang",
+ ["Shadow Labyrinth"] = "Schattenlabyrinth",
+ ["Shadowmoon Valley"] = "Schattenmondtal",
+ ["Shartuul's Transporter"] = "Shartuuls Transporter",
+ Shattrath = "Shattrath",
+ ["Shattrath City"] = "Shattrath",
+ ["Shimmering Expanse"] = "Schimmernde Weiten",
+ ["Sholazar Basin"] = "Sholazarbecken",
+ Silithus = "Silithus",
+ ["Silvermoon City"] = "Silbermond",
+ ["Silverpine Forest"] = "Silberwald",
+ ["Skyguard Outpost"] = "Außenposten der Himmelswache",
+ ["Skysong Lake"] = "Himmelsweisensee",
+ -- ["Southern Barrens"] = "",
+ ["Sporewind Lake"] = "Sporenwindsee",
+ Stonard = "Steinard",
+ ["Stonetalon Mountains"] = "Steinkrallengebirge",
+ Stormwind = "Sturmwind",
+ ["Stormwind City"] = "Sturmwind",
+ ["Strand of the Ancients"] = "Strand der Uralten",
+ ["Stranglethorn Vale"] = "Schlingendorntal",
+ Stratholme = "Stratholme",
+ ["Sunken Temple"] = "Versunkener Tempel",
+ ["Sunwell Plateau"] = "Sonnenbrunnenplateau",
+ ["Swamp of Sorrows"] = "Sümpfe des Elends",
+ Tanaris = "Tanaris",
+ Teldrassil = "Teldrassil",
+ ["Tempest Keep"] = "Festung der Stürme",
+ ["Temple of Ahn'Qiraj"] = "Tempel von Ahn'Qiraj",
+ ["Terokkar Forest"] = "Wälder von Terokkar",
+ ["Terokk's Rest"] = "Terokks Ruh",
+ ["The Arachnid Quarter"] = "Das Arachnidenviertel",
+ ["The Arcatraz"] = "Die Arkatraz",
+ ["The Argent Coliseum"] = "Das Kolosseum der Kreuzfahrer",
+ ["The Barrens"] = "Brachland",
+ ["The Black Morass"] = "Der schwarze Morast",
+ ["The Blood Furnace"] = "Der Blutkessel",
+ ["The Bone Wastes"] = "Die Knochenwüste",
+ ["The Botanica"] = "Die Botanika",
+ ["The Construct Quarter"] = "Das Konstruktviertel",
+ ["The Culling of Stratholme"] = "Das Ausmerzen von Stratholme",
+ ["The Dark Portal"] = "Das Dunkle Portal",
+ ["The Deadmines"] = "Die Todesminen",
+ ["The Descent into Madness"] = "Der Abstieg in den Wahnsinn",
+ ["The Exodar"] = "Die Exodar",
+ ["The Eye"] = "Das Auge",
+ ["The Eye of Eternity"] = "Das Auge der Ewigkeit",
+ ["The Forbidding Sea"] = "Das verbotene Meer",
+ ["The Forge of Souls"] = "Die Schmiede der Seelen",
+ ["The Frozen Halls"] = "Die gefrorenen Hallen",
+ ["The Frozen Sea"] = "Die gefrorene See",
+ ["The Great Sea"] = "Das große Meer",
+ ["The Halls of Winter"] = "Die Hallen des Winters",
+ ["The Hinterlands"] = "Hinterland",
+ ["The Mechanar"] = "Die Mechanar",
+ ["The Military Quarter"] = "Das Militärviertel",
+ ["The Nexus"] = "Der Nexus",
+ ["The North Sea"] = "Das nördliche Meer",
+ ["The Obsidian Sanctum"] = "Das Obsidiansanktum",
+ ["The Oculus"] = "Das Oculus",
+ ["The Plague Quarter"] = "Das Seuchenviertel",
+ ["The Prison of Yogg-Saron"] = "Das Gefängnis von Yogg-Saron",
+ ["Theramore Isle"] = "Insel Theramore",
+ ["The Ring of Valor"] = "Der Ring der Ehre",
+ ["The Ruby Sanctum"] = "Das Rubinsanktum",
+ ["The Scarlet Enclave"] = "Die Scharlachrote Enklave",
+ ["The Shattered Halls"] = "Die zerschmetterten Hallen",
+ ["The Slave Pens"] = "Die Sklavenunterkünfte",
+ ["The Spark of Imagination"] = "Der Funke der Imagination",
+ ["The Steamvault"] = "Die Dampfkammer",
+ ["The Stockade"] = "Das Verlies",
+ ["The Storm Peaks"] = "Die Sturmgipfel",
+ ["The Temple of Atal'Hakkar"] = "Der Tempel von Atal'Hakkar",
+ ["The Underbog"] = "Der Tiefensumpf",
+ ["The Veiled Sea"] = "Das verhüllte Meer",
+ ["The Violet Hold"] = "Die Violette Festung",
+ ["Thousand Needles"] = "Tausend Nadeln",
+ ["Throne of the Tides"] = "Thron der Gezeiten",
+ ["Thunder Bluff"] = "Donnerfels",
+ Tirisfal = "Tirisfal",
+ ["Tirisfal Glades"] = "Tirisfal",
+ ["Trial of the Champion"] = "Prüfung des Champions",
+ ["Trial of the Crusader"] = "Prüfung des Kreuzfahrers",
+ ["Twisting Nether"] = "Wirbelnder Nether",
+ Uldaman = "Uldaman",
+ Ulduar = "Ulduar",
+ Undercity = "Unterstadt",
+ ["Un'Goro Crater"] = "Krater von Un'Goro",
+ ["Upper Blackrock Spire"] = "Obere Schwarzfelsspitze",
+ ["Utgarde Keep"] = "Burg Utgarde",
+ ["Utgarde Pinnacle"] = "Turm Utgarde",
+ ["Vashj'ir"] = "Vashj'ir",
+ ["Vault of Archavon"] = "Archavons Kammer",
+ ["Vortex Pinnacle"] = "Vortexgipfel",
+ ["Wailing Caverns"] = "Die Höhlen des Wehklagens",
+ ["Warsong Gulch"] = "Kriegshymnenschlucht",
+ ["Western Plaguelands"] = "Westliche Pestländer",
+ Westfall = "Westfall",
+ Wetlands = "Sumpfland",
+ Wintergrasp = "Tausendwintersee",
+ Winterspring = "Winterquell",
+ ["Wyrmrest Temple"] = "Wyrmruhtempel",
+ Zangarmarsh = "Zangarmarschen",
+ ["Zul'Aman"] = "Zul'Aman",
+ ["Zul'Drak"] = "Zul'Drak",
+ ["Zul'Farrak"] = "Zul'Farrak",
+ ["Zul'Gurub"] = "Zul'Gurub",
+}
+elseif GAME_LOCALE == "frFR" then
+ lib:SetCurrentTranslations {
+ ["Abyssal Depths"] = "Profondeurs Abyssales",
+ ["Ahn'kahet: The Old Kingdom"] = "Ahn'kahet : l'Ancien royaume",
+ ["Ahn'Qiraj"] = "Ahn'Qiraj",
+ ["Alliance Base"] = "Base de l'Alliance",
+ ["Alterac Mountains"] = "Montagnes d'Alterac",
+ ["Alterac Valley"] = "Vallée d'Alterac",
+ ["Amani Pass"] = "Passage des Amani",
+ ["Arathi Basin"] = "Bassin d'Arathi",
+ ["Arathi Highlands"] = "Hautes-terres d'Arathi",
+ Armory = "Armurerie",
+ Ashenvale = "Orneval",
+ Auberdine = "Auberdine",
+ ["Auchenai Crypts"] = "Cryptes Auchenaï",
+ Auchindoun = "Auchindoun",
+ Azeroth = "Azeroth",
+ ["Azjol-Nerub"] = "Azjol-Nérub",
+ Azshara = "Azshara",
+ ["Azuremyst Isle"] = "Île de Brume-azur",
+ Badlands = "Terres ingrates",
+ ["Bash'ir Landing"] = "Point d'ancrage de Bash'ir",
+ ["Blackfathom Deeps"] = "Profondeurs de Brassenoire",
+ ["Blackrock Caverns"] = "Cavernes de Rochenoire",
+ ["Blackrock Depths"] = "Profondeurs de Rochenoire",
+ ["Blackrock Mountain"] = "Mont Rochenoire",
+ ["Blackrock Spire"] = "Pic Rochenoire",
+ ["Black Temple"] = "Temple noir",
+ ["Blackwind Lake"] = "Lac Noirvent",
+ ["Blackwing Lair"] = "Repaire de l'Aile noire",
+ ["Blade's Edge Arena"] = "Arène des Tranchantes",
+ ["Blade's Edge Mountains"] = "Les Tranchantes",
+ ["Blasted Lands"] = "Terres foudroyées",
+ ["Bloodmyst Isle"] = "Île de Brume-sang",
+ ["Booty Bay"] = "Baie-du-Butin",
+ ["Borean Tundra"] = "Toundra Boréenne",
+ ["Burning Steppes"] = "Steppes ardentes",
+ Cathedral = "Cathédrale",
+ ["Caverns of Time"] = "Grottes du temps",
+ ["Champions' Hall"] = "Hall des Champions",
+ ["Coilfang Reservoir"] = "Réservoir de Glissecroc",
+ Coldarra = "Frimarra",
+ ["Cosmic map"] = "Carte cosmique",
+ ["Crystalsong Forest"] = "Forêt du Chant de cristal",
+ ["Crystal Spine"] = "Éperon de cristal",
+ Dalaran = "Dalaran",
+ ["Dalaran Arena"] = "Arène de Dalaran",
+ ["Dalaran Sewers"] = "Égouts de Dalaran",
+ ["Darkmoon Faire"] = "Foire de Sombrelune",
+ Darkshore = "Sombrivage",
+ Darnassus = "Darnassus",
+ ["Deadwind Pass"] = "Défilé de Deuillevent",
+ Deepholm = "Le Tréfonds",
+ ["Deeprun Tram"] = "Tram des profondeurs",
+ Desolace = "Désolace",
+ ["Dire Maul"] = "Hache-tripes",
+ ["Dire Maul (East)"] = "Hache-tripes (Est)",
+ ["Dire Maul (North)"] = "Hache-tripes (Nord)",
+ ["Dire Maul (West)"] = "Hache-tripes (Ouest)",
+ Dragonblight = "Désolation des dragons",
+ ["Drak'Tharon Keep"] = "Donjon de Drak'Tharon",
+ ["Dun Morogh"] = "Dun Morogh",
+ Durotar = "Durotar",
+ Duskwood = "Bois de la Pénombre",
+ ["Dustwallow Marsh"] = "Marécage d'Âprefange",
+ ["Eastern Kingdoms"] = "Royaumes de l'est",
+ ["Eastern Plaguelands"] = "Maleterres de l'est",
+ ["Elwynn Forest"] = "Forêt d'Elwynn",
+ Everlook = "Long-guet",
+ ["Eversong Woods"] = "Bois des Chants éternels",
+ ["Eye of the Storm"] = "L'Œil du cyclone",
+ Felwood = "Gangrebois",
+ Feralas = "Féralas",
+ ["Forge Camp: Terror"] = "Camp de forge : Terreur",
+ ["Forge Camp: Wrath"] = "Camp de forge : Courroux",
+ ["Frostwyrm Lair"] = "Repaire du wyrm de givre",
+ ["Furywing's Perch"] = "Perchoir d'Aile-furie",
+ Gadgetzan = "Gadgetzan",
+ ["Gates of Ahn'Qiraj"] = "Portes d'Ahn'Qiraj",
+ Ghostlands = "Les Terres fantômes",
+ Gilneas = "Gilnéas",
+ -- ["Gilneas City"] = "",
+ Gnomeregan = "Gnomeregan",
+ Graveyard = "Cimetière",
+ ["Grim Batol"] = "Grim Batol",
+ ["Grizzly Hills"] = "Les Grisonnes",
+ ["Grom'gol Base Camp"] = "Campement Grom'gol",
+ ["Gruul's Lair"] = "Repaire de Gruul",
+ Gundrak = "Gundrak",
+ ["Hall of Champions"] = "Hall des Champions",
+ ["Hall of Legends"] = "Hall des Légendes",
+ ["Halls of Lightning"] = "Les salles de Foudre",
+ ["Halls of Reflection"] = "Les salles des Reflets",
+ ["Halls of Stone"] = "Les salles de Pierre",
+ ["Hellfire Citadel"] = "Citadelle des Flammes infernales",
+ ["Hellfire Peninsula"] = "Péninsule des Flammes infernales",
+ ["Hellfire Ramparts"] = "Remparts des Flammes infernales",
+ ["Hillsbrad Foothills"] = "Contreforts de Hautebrande",
+ ["Horde Encampment"] = "Campement de la Horde",
+ ["Howling Fjord"] = "Fjord Hurlant",
+ ["Hrothgar's Landing"] = "Accostage de Hrothgar",
+ Hyjal = "Hyjal",
+ ["Hyjal Summit"] = "Sommet d'Hyjal",
+ Icecrown = "La Couronne de glace",
+ ["Icecrown Citadel"] = "Citadelle de la Couronne de glace",
+ ["Insidion's Perch"] = "Perchoir d'Insidion",
+ Ironforge = "Forgefer",
+ ["Isle of Conquest"] = "Île des Conquérants",
+ ["Isle of Quel'Danas"] = "Île de Quel'Danas",
+ Kalimdor = "Kalimdor",
+ Karazhan = "Karazhan",
+ ["Kelp Forest"] = "Forêt de varech",
+ Kezan = "Kezan",
+ ["Krasus' Landing"] = "Aire de Krasus",
+ Library = "Bibliothèque",
+ ["Loch Modan"] = "Loch Modan",
+ ["Lower Blackrock Spire"] = "Pic de Rochenoire inférieur",
+ ["Magisters' Terrace"] = "Terrasse des Magistères",
+ ["Magtheridon's Lair"] = "Le repaire de Magtheridon",
+ ["Mana-Tombs"] = "Tombes-mana",
+ Maraudon = "Maraudon",
+ ["Marshlight Lake"] = "Lac des furoles",
+ ["Menethil Harbor"] = "Port de Menethil",
+ ["Molten Core"] = "Cœur du Magma",
+ Moonglade = "Reflet-de-Lune",
+ ["Mount Hyjal"] = "Mont Hyjal",
+ Mulgore = "Mulgore",
+ Nagrand = "Nagrand",
+ ["Nagrand Arena"] = "Arène de Nagrand",
+ Naxxramas = "Naxxramas",
+ Netherstorm = "Raz-de-Néant",
+ ["Night Elf Village"] = "Village elfe de la nuit",
+ ["Northern Barrens"] = "Les Tarides dunord",
+ ["Northern Stranglethorn"] = "Strangleronce septentrionale",
+ Northrend = "Norfendre",
+ ["Obsidia's Perch"] = "Perchoir d'Obsidia",
+ ["Ogri'la"] = "Ogri'la",
+ ["Old Hillsbrad Foothills"] = "Contreforts de Hautebrande d'antan",
+ ["Old Stratholme"] = "L'Épuration de Stratholme",
+ ["Onyxia's Lair"] = "Repaire d'Onyxia",
+ Orgrimmar = "Orgrimmar",
+ Outland = "Outreterre",
+ ["Pit of Saron"] = "Fosse de Saron",
+ ["Plaguelands: The Scarlet Enclave"] = "Maleterres : l'enclave Écarlate",
+ Plaguewood = "Pestebois",
+ ["Quel'thalas"] = "Quel'thalas",
+ ["Ragefire Chasm"] = "Gouffre de Ragefeu",
+ Ratchet = "Cabestan",
+ ["Razorfen Downs"] = "Souilles de Tranchebauge",
+ ["Razorfen Kraul"] = "Kraal de Tranchebauge",
+ ["Redridge Mountains"] = "Les Carmines",
+ ["Ring of Observance"] = "Cercle d'observance",
+ ["Rivendark's Perch"] = "Perchoir de Clivenuit",
+ ["Ruins of Ahn'Qiraj"] = "Ruines d'Ahn'Qiraj",
+ ["Ruins of Gilneas"] = "Ruines de Gilnéas",
+ ["Ruins of Lordaeron"] = "Ruines de Lordaeron",
+ ["Scalebeard's Cave"] = "Caverne de Barbe-d'écailles",
+ ["Scarlet Monastery"] = "Monastère écarlate",
+ Scholomance = "Scholomance",
+ ["Searing Gorge"] = "Gorge des Vents brûlants",
+ ["Serpent Lake"] = "Lac des Serpents",
+ ["Serpentshrine Cavern"] = "Caverne du sanctuaire du Serpent",
+ ["Sethekk Halls"] = "Les salles des Sethekk",
+ ["Shadowfang Keep"] = "Donjon d'Ombrecroc",
+ ["Shadow Labyrinth"] = "Labyrinthe des ombres",
+ ["Shadowmoon Valley"] = "Vallée d'Ombrelune",
+ ["Shartuul's Transporter"] = "Transporteur de Shartuul",
+ Shattrath = "Shattrath",
+ ["Shattrath City"] = "Shattrath",
+ ["Shimmering Expanse"] = "Étendues Chatoyantes",
+ ["Sholazar Basin"] = "Bassin de Sholazar",
+ Silithus = "Silithus",
+ ["Silvermoon City"] = "Lune-d'argent",
+ ["Silverpine Forest"] = "Forêt des Pins argentés",
+ ["Skyguard Outpost"] = "Avant-poste de la Garde-ciel",
+ ["Skysong Lake"] = "Lac Chanteciel",
+ ["Southern Barrens"] = "Tarides du sud",
+ ["Sporewind Lake"] = "Lac Ventespore",
+ Stonard = "Pierrêche",
+ ["Stonetalon Mountains"] = "Les Serres-Rocheuses",
+ Stormwind = "Hurlevent",
+ ["Stormwind City"] = "Hurlevent",
+ ["Strand of the Ancients"] = "Rivage des anciens",
+ ["Stranglethorn Vale"] = "Vallée de Strangleronce",
+ Stratholme = "Stratholme",
+ ["Sunken Temple"] = "Temple englouti",
+ ["Sunwell Plateau"] = "Plateau du Puits de soleil",
+ ["Swamp of Sorrows"] = "Marais des Chagrins",
+ Tanaris = "Tanaris",
+ Teldrassil = "Teldrassil",
+ ["Tempest Keep"] = "Donjon de la Tempête",
+ ["Temple of Ahn'Qiraj"] = "Le temple d'Ahn'Qiraj",
+ ["Terokkar Forest"] = "Forêt de Terokkar",
+ ["Terokk's Rest"] = "Repos de Terokk",
+ ["The Arachnid Quarter"] = "Le quartier des Arachnides",
+ ["The Arcatraz"] = "L'Arcatraz",
+ ["The Argent Coliseum"] = "Le colisée d'Argent",
+ ["The Barrens"] = "Les Tarides",
+ ["The Black Morass"] = "Le Noir Marécage",
+ ["The Blood Furnace"] = "La Fournaise du sang",
+ ["The Bone Wastes"] = "Le désert des Ossements",
+ ["The Botanica"] = "La Botanica",
+ ["The Construct Quarter"] = "Le quartier des Assemblages",
+ ["The Culling of Stratholme"] = "L'Épuration de Stratholme",
+ ["The Dark Portal"] = "La Porte des ténèbres",
+ ["The Deadmines"] = "Les Mortemines",
+ ["The Descent into Madness"] = "La Descente dans la folie",
+ ["The Exodar"] = "L'Exodar",
+ ["The Eye"] = "L'Œil",
+ ["The Eye of Eternity"] = "L'Œil de l'éternité",
+ ["The Forbidding Sea"] = "La Mer interdite",
+ ["The Forge of Souls"] = "La Forge des âmes",
+ ["The Frozen Halls"] = "Les salles Gelées",
+ ["The Frozen Sea"] = "La mer Gelée",
+ ["The Great Sea"] = "La Grande mer",
+ ["The Halls of Winter"] = "Les salles de l'Hiver",
+ ["The Hinterlands"] = "Les Hinterlands",
+ ["The Mechanar"] = "Le Méchanar",
+ ["The Military Quarter"] = "Le quartier Militaire",
+ ["The Nexus"] = "Le Nexus",
+ ["The North Sea"] = "La mer Boréale",
+ ["The Obsidian Sanctum"] = "Le sanctum Obsidien",
+ ["The Oculus"] = "L'Oculus",
+ ["The Plague Quarter"] = "Le quartier de la Peste",
+ ["The Prison of Yogg-Saron"] = "La prison de Yogg-Saron",
+ ["Theramore Isle"] = "Île de Theramore",
+ ["The Ring of Valor"] = "L'Arène des valeureux",
+ ["The Ruby Sanctum"] = "Le sanctum Rubis",
+ ["The Scarlet Enclave"] = "L'enclave Écarlate",
+ ["The Shattered Halls"] = "Les Salles brisées",
+ ["The Slave Pens"] = "Les enclos aux esclaves",
+ ["The Spark of Imagination"] = "L'Étincelle d'imagination",
+ ["The Steamvault"] = "Le Caveau de la vapeur",
+ ["The Stockade"] = "La Prison",
+ ["The Storm Peaks"] = "Les pics Foudroyés",
+ ["The Temple of Atal'Hakkar"] = "Le temple d'Atal'Hakkar",
+ ["The Underbog"] = "La Basse-tourbière",
+ ["The Veiled Sea"] = "La Mer voilée",
+ ["The Violet Hold"] = "Le fort Pourpre",
+ ["Thousand Needles"] = "Mille pointes",
+ ["Throne of the Tides"] = "Trône des marées",
+ ["Thunder Bluff"] = "Les Pitons du Tonnerre",
+ Tirisfal = "Tirisfal",
+ ["Tirisfal Glades"] = "Clairières de Tirisfal",
+ ["Trial of the Champion"] = "L'épreuve du champion",
+ ["Trial of the Crusader"] = "L'épreuve du croisé",
+ ["Twisting Nether"] = "Le Néant distordu",
+ Uldaman = "Uldaman",
+ Ulduar = "Ulduar",
+ Undercity = "Fossoyeuse",
+ ["Un'Goro Crater"] = "Cratère d'Un'Goro",
+ ["Upper Blackrock Spire"] = "Pic de Rochenoire supérieur",
+ ["Utgarde Keep"] = "Donjon d'Utgarde",
+ ["Utgarde Pinnacle"] = "Cime d'Utgarde",
+ ["Vashj'ir"] = "Vashj'ir",
+ ["Vault of Archavon"] = "Caveau d'Archavon",
+ ["Vortex Pinnacle"] = "Cime du vortex",
+ ["Wailing Caverns"] = "Cavernes des lamentations",
+ ["Warsong Gulch"] = "Goulet des Chanteguerres",
+ ["Western Plaguelands"] = "Maleterres de l'ouest",
+ Westfall = "Marche de l'Ouest",
+ Wetlands = "Les Paluns",
+ Wintergrasp = "Joug-d'hiver",
+ Winterspring = "Berceau-de-l'Hiver",
+ ["Wyrmrest Temple"] = "Temple du Repos du ver",
+ Zangarmarsh = "Marécage de Zangar",
+ ["Zul'Aman"] = "Zul'Aman",
+ ["Zul'Drak"] = "Zul'Drak",
+ ["Zul'Farrak"] = "Zul'Farrak",
+ ["Zul'Gurub"] = "Zul'Gurub",
+}
+elseif GAME_LOCALE == "koKR" then
+ lib:SetCurrentTranslations {
+ ["Abyssal Depths"] = "Abyssal Depths", -- Needs review
+ ["Ahn'kahet: The Old Kingdom"] = "안카헤트: 고대 왕국",
+ ["Ahn'Qiraj"] = "안퀴라즈",
+ ["Alliance Base"] = "얼라이언스 주둔지",
+ ["Alterac Mountains"] = "알터랙 산맥",
+ ["Alterac Valley"] = "알터랙 계곡",
+ ["Amani Pass"] = "아마니 고개",
+ ["Arathi Basin"] = "아라시 분지",
+ ["Arathi Highlands"] = "아라시 고원",
+ Armory = "무기고",
+ Ashenvale = "잿빛 골짜기",
+ Auberdine = "아우버다인",
+ ["Auchenai Crypts"] = "아키나이 납골당",
+ Auchindoun = "아킨둔",
+ Azeroth = "아제로스",
+ ["Azjol-Nerub"] = "아졸네룹",
+ Azshara = "아즈샤라",
+ ["Azuremyst Isle"] = "하늘안개 섬",
+ Badlands = "황야의 땅",
+ ["Bash'ir Landing"] = "바쉬르 영지",
+ ["Blackfathom Deeps"] = "검은심연의 나락",
+ ["Blackrock Caverns"] = "검은바위 동굴",
+ ["Blackrock Depths"] = "검은바위 나락",
+ ["Blackrock Mountain"] = "검은바위 산",
+ ["Blackrock Spire"] = "검은바위 첨탑",
+ ["Black Temple"] = "검은 사원",
+ ["Blackwind Lake"] = "검은바람 호수",
+ ["Blackwing Lair"] = "검은날개 둥지",
+ ["Blade's Edge Arena"] = "칼날 투기장",
+ ["Blade's Edge Mountains"] = "칼날 산맥",
+ ["Blasted Lands"] = "저주받은 땅",
+ ["Bloodmyst Isle"] = "핏빛안개 섬",
+ ["Booty Bay"] = "무법항",
+ ["Borean Tundra"] = "북풍의 땅",
+ ["Burning Steppes"] = "불타는 평원",
+ Cathedral = "대성당",
+ ["Caverns of Time"] = "시간의 동굴",
+ ["Champions' Hall"] = "용사의 전당",
+ ["Coilfang Reservoir"] = "갈퀴송곳니 저수지",
+ Coldarra = "콜다라",
+ ["Cosmic map"] = "세계 지도",
+ ["Crystalsong Forest"] = "수정노래 숲",
+ ["Crystal Spine"] = "수정 돌기",
+ Dalaran = "달라란",
+ ["Dalaran Arena"] = "달라란 투기장",
+ ["Dalaran Sewers"] = "달라란 하수도",
+ ["Darkmoon Faire"] = "다크문 축제",
+ Darkshore = "어둠의 해안",
+ Darnassus = "다르나서스",
+ ["Deadwind Pass"] = "죽음의 고개",
+ Deepholm = "Deepholm", -- Needs review
+ ["Deeprun Tram"] = "깊은굴 지하철",
+ Desolace = "잊혀진 땅",
+ ["Dire Maul"] = "혈투의 전장",
+ ["Dire Maul (East)"] = "혈투의 전장 동부",
+ ["Dire Maul (North)"] = "혈투의 전장 북부",
+ ["Dire Maul (West)"] = "혈투의 전장 서부",
+ Dragonblight = "용의 안식처",
+ ["Drak'Tharon Keep"] = "드락타론 성채",
+ ["Dun Morogh"] = "던 모로",
+ Durotar = "듀로타",
+ Duskwood = "그늘숲",
+ ["Dustwallow Marsh"] = "먼지진흙 습지대",
+ ["Eastern Kingdoms"] = "동부 왕국",
+ ["Eastern Plaguelands"] = "동부 역병지대",
+ ["Elwynn Forest"] = "엘윈 숲",
+ Everlook = "눈망루 마을",
+ ["Eversong Woods"] = "영원노래 숲",
+ ["Eye of the Storm"] = "폭풍의 눈",
+ Felwood = "악령의 숲",
+ Feralas = "페랄라스",
+ ["Forge Camp: Terror"] = "공포의 괴철로 기지",
+ ["Forge Camp: Wrath"] = "격노의 괴철로 기지",
+ ["Frostwyrm Lair"] = "서리고룡의 방",
+ ["Furywing's Perch"] = "퓨리윙의 둥지",
+ Gadgetzan = "가젯잔",
+ ["Gates of Ahn'Qiraj"] = "안퀴라즈 성문",
+ Ghostlands = "유령의 땅",
+ Gilneas = "길니아스",
+ ["Gilneas City"] = "Gilneas City", -- Needs review
+ Gnomeregan = "놈리건",
+ Graveyard = "묘지",
+ ["Grim Batol"] = "그림 바톨",
+ ["Grizzly Hills"] = "회색 구릉지",
+ ["Grom'gol Base Camp"] = "그롬골 주둔지",
+ ["Gruul's Lair"] = "그룰의 둥지",
+ Gundrak = "군드락",
+ ["Hall of Champions"] = "용사의 전당",
+ ["Hall of Legends"] = "전설의 전당",
+ ["Halls of Lightning"] = "번개의 전당",
+ ["Halls of Reflection"] = "투영의 전당",
+ ["Halls of Stone"] = "돌의 전당",
+ ["Hellfire Citadel"] = "지옥불 성채",
+ ["Hellfire Peninsula"] = "지옥불 반도",
+ ["Hellfire Ramparts"] = "지옥불 성루",
+ ["Hillsbrad Foothills"] = "힐스브래드 구릉지",
+ ["Horde Encampment"] = "호드 야영지",
+ ["Howling Fjord"] = "울부짖는 협만",
+ ["Hrothgar's Landing"] = "흐로스가르 상륙지",
+ Hyjal = "하이잘",
+ ["Hyjal Summit"] = "하이잘 정상",
+ Icecrown = "얼음왕관",
+ ["Icecrown Citadel"] = "얼음왕관 성채",
+ ["Insidion's Perch"] = "인시디온의 둥지",
+ Ironforge = "아이언포지",
+ ["Isle of Conquest"] = "정복의 섬",
+ ["Isle of Quel'Danas"] = "쿠엘다나스 섬",
+ Kalimdor = "칼림도어",
+ Karazhan = "카라잔",
+ ["Kelp Forest"] = "Kelp Forest", -- Needs review
+ Kezan = "케잔",
+ ["Krasus' Landing"] = "크라서스 착륙장",
+ Library = "도서관",
+ ["Loch Modan"] = "모단 호수",
+ ["Lower Blackrock Spire"] = "검은바위 첨탑 하층",
+ ["Magisters' Terrace"] = "마법학자의 정원",
+ ["Magtheridon's Lair"] = "마그테리돈의 둥지",
+ ["Mana-Tombs"] = "마나 무덤",
+ Maraudon = "마라우돈",
+ ["Marshlight Lake"] = "수렁등불 호수",
+ ["Menethil Harbor"] = "메네실 항구",
+ ["Molten Core"] = "화산 심장부",
+ Moonglade = "달의 숲",
+ ["Mount Hyjal"] = "하이잘 산",
+ Mulgore = "멀고어",
+ Nagrand = "나그란드",
+ ["Nagrand Arena"] = "나그란드 투기장",
+ Naxxramas = "낙스라마스",
+ Netherstorm = "황천의 폭풍",
+ ["Night Elf Village"] = "나이트 엘프 마을",
+ ["Northern Barrens"] = "Northern Barrens", -- Needs review
+ ["Northern Stranglethorn"] = "Northern Stranglethorn", -- Needs review
+ Northrend = "노스렌드",
+ ["Obsidia's Perch"] = "옵시디아의 둥지",
+ ["Ogri'la"] = "오그릴라",
+ ["Old Hillsbrad Foothills"] = "옛 힐스브래드 구릉지",
+ ["Old Stratholme"] = "옛 스트라솔름",
+ ["Onyxia's Lair"] = "오닉시아의 둥지",
+ Orgrimmar = "오그리마",
+ Outland = "아웃랜드",
+ ["Pit of Saron"] = "사론의 구덩이",
+ ["Plaguelands: The Scarlet Enclave"] = "동부 역병지대: 붉은십자군 초소",
+ Plaguewood = "역병의 숲",
+ ["Quel'thalas"] = "쿠엘탈라스",
+ ["Ragefire Chasm"] = "성난불길 협곡",
+ Ratchet = "톱니항",
+ ["Razorfen Downs"] = "가시덩굴 구릉",
+ ["Razorfen Kraul"] = "가시덩굴 우리",
+ ["Redridge Mountains"] = "붉은마루 산맥",
+ ["Ring of Observance"] = "규율의 광장",
+ ["Rivendark's Perch"] = "리븐다크의 둥지",
+ ["Ruins of Ahn'Qiraj"] = "안퀴라즈 폐허",
+ ["Ruins of Gilneas"] = "길니아스 폐허",
+ ["Ruins of Lordaeron"] = "로데론의 폐허",
+ ["Scalebeard's Cave"] = "비늘수염 동굴",
+ ["Scarlet Monastery"] = "붉은십자군 수도원",
+ Scholomance = "스칼로맨스",
+ ["Searing Gorge"] = "이글거리는 협곡",
+ ["Serpent Lake"] = "물갈퀴 호수",
+ ["Serpentshrine Cavern"] = "불뱀 제단",
+ ["Sethekk Halls"] = "세데크 전당",
+ ["Shadowfang Keep"] = "그림자송곳니 성채",
+ ["Shadow Labyrinth"] = "어둠의 미궁",
+ ["Shadowmoon Valley"] = "어둠달 골짜기",
+ ["Shartuul's Transporter"] = "샤툴의 순간이동기",
+ Shattrath = "샤트라스",
+ ["Shattrath City"] = "샤트라스",
+ ["Shimmering Expanse"] = "Shimmering Expanse", -- Needs review
+ ["Sholazar Basin"] = "숄라자르 분지",
+ Silithus = "실리더스",
+ ["Silvermoon City"] = "실버문",
+ ["Silverpine Forest"] = "은빛소나무 숲",
+ ["Skyguard Outpost"] = "하늘경비대 전초기지",
+ ["Skysong Lake"] = "하늘노래 호수",
+ ["Southern Barrens"] = "Southern Barrens", -- Needs review
+ ["Sporewind Lake"] = "포자바람 호수",
+ Stonard = "스토나드",
+ ["Stonetalon Mountains"] = "돌발톱 산맥",
+ Stormwind = "스톰윈드",
+ ["Stormwind City"] = "스톰윈드",
+ ["Strand of the Ancients"] = "고대의 해안",
+ ["Stranglethorn Vale"] = "가시덤불 골짜기",
+ Stratholme = "스트라솔름",
+ ["Sunken Temple"] = "가라앉은 사원",
+ ["Sunwell Plateau"] = "태양샘 고원",
+ ["Swamp of Sorrows"] = "슬픔의 늪",
+ Tanaris = "타나리스",
+ Teldrassil = "텔드랏실",
+ ["Tempest Keep"] = "폭풍우 요새",
+ ["Temple of Ahn'Qiraj"] = "안퀴라즈 사원",
+ ["Terokkar Forest"] = "테로카르 숲",
+ ["Terokk's Rest"] = "테로크의 안식처",
+ ["The Arachnid Quarter"] = "거미 지구",
+ ["The Arcatraz"] = "알카트라즈",
+ ["The Argent Coliseum"] = "십자군 원형경기장",
+ ["The Barrens"] = "불모의 땅",
+ ["The Black Morass"] = "검은늪",
+ ["The Blood Furnace"] = "피의 용광로",
+ ["The Bone Wastes"] = "해골 무덤",
+ ["The Botanica"] = "신록의 정원",
+ ["The Construct Quarter"] = "피조물 지구",
+ ["The Culling of Stratholme"] = "옛 스트라솔름",
+ ["The Dark Portal"] = "어둠의 문",
+ ["The Deadmines"] = "죽음의 폐광",
+ ["The Descent into Madness"] = "광기의 내리막길",
+ ["The Exodar"] = "엑소다르",
+ ["The Eye"] = "눈",
+ ["The Eye of Eternity"] = "영원의 눈",
+ ["The Forbidding Sea"] = "성난폭풍 해안",
+ ["The Forge of Souls"] = "영혼의 제련소",
+ ["The Frozen Halls"] = "얼어붙은 전당",
+ ["The Frozen Sea"] = "얼어붙은 바다",
+ ["The Great Sea"] = "대해",
+ ["The Halls of Winter"] = "겨울의 전당",
+ ["The Hinterlands"] = "동부 내륙지",
+ ["The Mechanar"] = "메카나르",
+ ["The Military Quarter"] = "군사 지구",
+ ["The Nexus"] = "마력의 탑",
+ ["The North Sea"] = "북해",
+ ["The Obsidian Sanctum"] = "흑요석 성소",
+ ["The Oculus"] = "마력의 눈",
+ ["The Plague Quarter"] = "역병 지구",
+ ["The Prison of Yogg-Saron"] = "요그사론의 감옥",
+ ["Theramore Isle"] = "테라모어 섬",
+ ["The Ring of Valor"] = "용맹의 투기장",
+ ["The Ruby Sanctum"] = "루비 성소",
+ ["The Scarlet Enclave"] = "진홍빛 전당",
+ ["The Shattered Halls"] = "으스러진 손의 전당",
+ ["The Slave Pens"] = "강제 노역소",
+ ["The Spark of Imagination"] = "상상의 흔적",
+ ["The Steamvault"] = "증기 저장고",
+ ["The Stockade"] = "스톰윈드 지하감옥",
+ ["The Storm Peaks"] = "폭풍우 봉우리",
+ ["The Temple of Atal'Hakkar"] = "아탈학카르 신전",
+ ["The Underbog"] = "지하수렁",
+ ["The Veiled Sea"] = "장막의 바다",
+ ["The Violet Hold"] = "보랏빛 요새",
+ ["Thousand Needles"] = "버섯구름 봉우리",
+ ["Throne of the Tides"] = "Throne of the Tides", -- Needs review
+ ["Thunder Bluff"] = "썬더 블러프",
+ Tirisfal = "티리스팔",
+ ["Tirisfal Glades"] = "티리스팔 숲",
+ ["Trial of the Champion"] = "용사의 시험장",
+ ["Trial of the Crusader"] = "십자군의 시험장",
+ ["Twisting Nether"] = "뒤틀린 황천",
+ Uldaman = "울다만",
+ Ulduar = "울두아르",
+ Undercity = "언더시티",
+ ["Un'Goro Crater"] = "운고로 분화구",
+ ["Upper Blackrock Spire"] = "검은바위 첨탑 상층",
+ ["Utgarde Keep"] = "우트가드 성채",
+ ["Utgarde Pinnacle"] = "우트가드 첨탑",
+ ["Vashj'ir"] = "바쉬르",
+ ["Vault of Archavon"] = "아카본 석실",
+ ["Vortex Pinnacle"] = "소용돌이 고원",
+ ["Wailing Caverns"] = "통곡의 동굴",
+ ["Warsong Gulch"] = "전쟁노래 협곡",
+ ["Western Plaguelands"] = "서부 역병지대",
+ Westfall = "서부 몰락지대",
+ Wetlands = "저습지",
+ Wintergrasp = "겨울손아귀 호수",
+ Winterspring = "여명의 설원",
+ ["Wyrmrest Temple"] = "고룡쉼터 사원",
+ Zangarmarsh = "장가르 습지대",
+ ["Zul'Aman"] = "줄아만",
+ ["Zul'Drak"] = "줄드락",
+ ["Zul'Farrak"] = "줄파락",
+ ["Zul'Gurub"] = "줄구룹",
+}
+elseif GAME_LOCALE == "esES" then
+ lib:SetCurrentTranslations {
+ ["Abyssal Depths"] = "Abyssal Depths", -- Needs review
+ ["Ahn'kahet: The Old Kingdom"] = "Ahn'kahet: El Antiguo Reino",
+ ["Ahn'Qiraj"] = "Ahn'Qiraj",
+ ["Alliance Base"] = "Base de la Alianza",
+ ["Alterac Mountains"] = "Montañas de Alterac",
+ ["Alterac Valley"] = "Valle de Alterac",
+ ["Amani Pass"] = "Paso de Amani",
+ ["Arathi Basin"] = "Cuenca de Arathi",
+ ["Arathi Highlands"] = "Tierras Altas de Arathi",
+ Armory = "Armería",
+ Ashenvale = "Vallefresno",
+ Auberdine = "Auberdine",
+ ["Auchenai Crypts"] = "Criptas Auchenai",
+ Auchindoun = "Auchindoun",
+ Azeroth = "Azeroth",
+ ["Azjol-Nerub"] = "Azjol-Nerub",
+ Azshara = "Azshara",
+ ["Azuremyst Isle"] = "Isla Bruma Azur",
+ Badlands = "Tierras Inhóspitas",
+ ["Bash'ir Landing"] = "Zona de aterrizaje Bash'ir",
+ ["Blackfathom Deeps"] = "Cavernas de Brazanegra",
+ ["Blackrock Caverns"] = "Blackrock Caverns", -- Needs review
+ ["Blackrock Depths"] = "Profundidades de Roca Negra",
+ ["Blackrock Mountain"] = "Montaña Roca Negra",
+ ["Blackrock Spire"] = "Cumbre de Roca Negra",
+ ["Black Temple"] = "El Templo Oscuro",
+ ["Blackwind Lake"] = "Lago Vientonegro",
+ ["Blackwing Lair"] = "Guarida Alanegra",
+ ["Blade's Edge Arena"] = "Arena Filospada",
+ ["Blade's Edge Mountains"] = "Montañas Filospada",
+ ["Blasted Lands"] = "Las Tierras Devastadas",
+ ["Bloodmyst Isle"] = "Isla Bruma de Sangre",
+ ["Booty Bay"] = "Bahía del Botín",
+ ["Borean Tundra"] = "Tundra Boreal",
+ ["Burning Steppes"] = "Las Estepas Ardientes",
+ Cathedral = "Catedral",
+ ["Caverns of Time"] = "Cavernas del Tiempo",
+ ["Champions' Hall"] = "Sala de los Campeones",
+ ["Coilfang Reservoir"] = "Reserva Colmillo Torcido",
+ Coldarra = "Gelidar",
+ ["Cosmic map"] = "Mapa cósmico",
+ ["Crystalsong Forest"] = "Bosque Canto de Cristal",
+ ["Crystal Spine"] = "Espina de Cristal",
+ Dalaran = "Dalaran",
+ ["Dalaran Arena"] = "Arena de Dalaran",
+ ["Dalaran Sewers"] = "Cloacas de Dalaran",
+ ["Darkmoon Faire"] = "Feria de la Luna Negra",
+ Darkshore = "Costa Oscura",
+ Darnassus = "Darnassus",
+ ["Deadwind Pass"] = "Paso de la Muerte",
+ Deepholm = "Deepholm", -- Needs review
+ ["Deeprun Tram"] = "Tranvía Subterráneo",
+ Desolace = "Desolace",
+ ["Dire Maul"] = "La Masacre",
+ ["Dire Maul (East)"] = "La Masacre (Este)",
+ ["Dire Maul (North)"] = "La Masacre (Norte)",
+ ["Dire Maul (West)"] = "La Masacre (Oeste)",
+ Dragonblight = "Cementerio de Dragones",
+ ["Drak'Tharon Keep"] = "Fortaleza de Drak'Tharon",
+ ["Dun Morogh"] = "Dun Morogh",
+ Durotar = "Durotar",
+ Duskwood = "Bosque del Ocaso",
+ ["Dustwallow Marsh"] = "Marjal Revolcafango",
+ ["Eastern Kingdoms"] = "Reinos del Este",
+ ["Eastern Plaguelands"] = "Tierras de la Peste del Este",
+ ["Elwynn Forest"] = "Bosque de Elwynn",
+ Everlook = "Vista Eterna",
+ ["Eversong Woods"] = "Bosque Canción Eterna",
+ ["Eye of the Storm"] = "Ojo de la Tormenta",
+ Felwood = "Frondavil",
+ Feralas = "Feralas",
+ ["Forge Camp: Terror"] = "Campamento forja: Terror",
+ ["Forge Camp: Wrath"] = "Campamento forja: Cólera",
+ ["Frostwyrm Lair"] = "Guarida de Vermis de Escarcha",
+ ["Furywing's Perch"] = "Nido de Alafuria",
+ Gadgetzan = "Gadgetzan",
+ ["Gates of Ahn'Qiraj"] = "Puertas de Ahn'Qiraj",
+ Ghostlands = "Tierras Fantasma",
+ Gilneas = "Gilneas", -- Needs review
+ ["Gilneas City"] = "Gilneas City", -- Needs review
+ Gnomeregan = "Gnomeregan",
+ Graveyard = "Cementerio",
+ ["Grim Batol"] = "Grim Batol", -- Needs review
+ ["Grizzly Hills"] = "Colinas Pardas",
+ ["Grom'gol Base Camp"] = "Campamento Grom'gol",
+ ["Gruul's Lair"] = "Guarida de Gruul",
+ Gundrak = "Gundrak",
+ ["Hall of Champions"] = "Sala de los Campeones",
+ ["Hall of Legends"] = "Sala de las Leyendas",
+ ["Halls of Lightning"] = "Cámaras de Relámpagos",
+ ["Halls of Reflection"] = "Cámaras de Reflexión",
+ ["Halls of Stone"] = "Cámaras de Piedra",
+ ["Hellfire Citadel"] = "Ciudadela del Fuego Infernal",
+ ["Hellfire Peninsula"] = "Península del Fuego Infernal",
+ ["Hellfire Ramparts"] = "Murallas del Fuego Infernal",
+ ["Hillsbrad Foothills"] = "Laderas de Trabalomas",
+ ["Horde Encampment"] = "Campamento Horda",
+ ["Howling Fjord"] = "Fiordo Aquilonal",
+ ["Hrothgar's Landing"] = "Desembarco de Hrothgar",
+ Hyjal = "Hyjal",
+ ["Hyjal Summit"] = "Cima Hyjal",
+ Icecrown = "Corona de Hielo",
+ ["Icecrown Citadel"] = "Ciudadela de la Corona de Hielo",
+ ["Insidion's Perch"] = "Nido de Insidion",
+ Ironforge = "Forjaz",
+ ["Isle of Conquest"] = "Isla de la Conquista",
+ ["Isle of Quel'Danas"] = "Isla de Quel'Danas",
+ Kalimdor = "Kalimdor",
+ Karazhan = "Karazhan",
+ ["Kelp Forest"] = "Kelp Forest", -- Needs review
+ Kezan = "Kezan", -- Needs review
+ ["Krasus' Landing"] = "Krasus' Landing",
+ Library = "Biblioteca",
+ ["Loch Modan"] = "Loch Modan",
+ ["Lower Blackrock Spire"] = "Cumbre inferior de Roca Negra",
+ ["Magisters' Terrace"] = "Bancal Del Magister",
+ ["Magtheridon's Lair"] = "Guarida de Magtheridon",
+ ["Mana-Tombs"] = "Tumbas de Maná",
+ Maraudon = "Maraudon",
+ ["Marshlight Lake"] = "Lago Luz Pantanosa",
+ ["Menethil Harbor"] = "Puerto de Menethil",
+ ["Molten Core"] = "Núcleo de Magma",
+ Moonglade = "Claro de la Luna",
+ ["Mount Hyjal"] = "Mount Hyjal", -- Needs review
+ Mulgore = "Mulgore",
+ Nagrand = "Nagrand",
+ ["Nagrand Arena"] = "Arena de Nagrand",
+ Naxxramas = "Naxxramas",
+ Netherstorm = "Tormenta Abisal",
+ ["Night Elf Village"] = "Poblado Elfo de la Noche",
+ ["Northern Barrens"] = "Northern Barrens", -- Needs review
+ ["Northern Stranglethorn"] = "Northern Stranglethorn", -- Needs review
+ Northrend = "Rasganorte",
+ ["Obsidia's Perch"] = "Nido de Obsidia",
+ ["Ogri'la"] = "Ogri'la",
+ ["Old Hillsbrad Foothills"] = "Antiguas Laderas de Trabalomas",
+ ["Old Stratholme"] = "Stratholme en el pasado",
+ ["Onyxia's Lair"] = "Guarida de Onyxia",
+ Orgrimmar = "Orgrimmar",
+ Outland = "Terrallende",
+ ["Pit of Saron"] = "Foso de Saron",
+ ["Plaguelands: The Scarlet Enclave"] = "Tierras de la Peste del Este: El Enclave Escarlata",
+ Plaguewood = "Bosque de la Plaga",
+ ["Quel'thalas"] = "Quel'thalas",
+ ["Ragefire Chasm"] = "Sima ígnea",
+ Ratchet = "Trinquete",
+ ["Razorfen Downs"] = "Zahúrda Rajacieno",
+ ["Razorfen Kraul"] = "Horado Rajacieno",
+ ["Redridge Mountains"] = "Montañas Crestagrana",
+ ["Ring of Observance"] = "Círculo de la Observancia",
+ ["Rivendark's Perch"] = "Nido de Desgarro Oscuro",
+ ["Ruins of Ahn'Qiraj"] = "Ruinas de Ahn'Qiraj",
+ ["Ruins of Gilneas"] = "Ruins of Gilneas", -- Needs review
+ ["Ruins of Lordaeron"] = "Ruinas de Lordaeron",
+ ["Scalebeard's Cave"] = "Cueva de Barbascamas",
+ ["Scarlet Monastery"] = "Monasterio Escarlata",
+ Scholomance = "Scholomance",
+ ["Searing Gorge"] = "La Garganta de Fuego",
+ ["Serpent Lake"] = "Lago Serpiente",
+ ["Serpentshrine Cavern"] = "Caverna Santuario Serpiente",
+ ["Sethekk Halls"] = "Salas Sethekk",
+ ["Shadowfang Keep"] = "Castillo de Colmillo Oscuro",
+ ["Shadow Labyrinth"] = "Laberinto de las Sombras",
+ ["Shadowmoon Valley"] = "Valle Sombraluna",
+ ["Shartuul's Transporter"] = "Transportador de Shartuul",
+ Shattrath = "Shattrath",
+ ["Shattrath City"] = "Ciudad de Shattrath",
+ ["Shimmering Expanse"] = "Shimmering Expanse", -- Needs review
+ ["Sholazar Basin"] = "Cuenca de Sholazar",
+ Silithus = "Silithus",
+ ["Silvermoon City"] = "Ciudad de Lunargenta",
+ ["Silverpine Forest"] = "Bosque de Argénteos",
+ ["Skyguard Outpost"] = "Puesto de la guardia de cielo",
+ ["Skysong Lake"] = "Lago Sol Celeste",
+ ["Southern Barrens"] = "Southern Barrens", -- Needs review
+ ["Sporewind Lake"] = "Lago Espora Volante",
+ Stonard = "Rocal",
+ ["Stonetalon Mountains"] = "Sierra Espolón",
+ Stormwind = "Ventormenta",
+ ["Stormwind City"] = "Ciudad de Ventormenta",
+ ["Strand of the Ancients"] = "Playa de los Ancestros",
+ ["Stranglethorn Vale"] = "Vega de Tuercespina",
+ Stratholme = "Stratholme",
+ ["Sunken Temple"] = "El Templo Sumergido",
+ ["Sunwell Plateau"] = "Meseta de la Fuente del Sol",
+ ["Swamp of Sorrows"] = "Pantano de las Penas",
+ Tanaris = "Tanaris",
+ Teldrassil = "Teldrassil",
+ ["Tempest Keep"] = "El Castillo de la Tempestad",
+ ["Temple of Ahn'Qiraj"] = "El Templo de Ahn'Qiraj",
+ ["Terokkar Forest"] = "Bosque de Terokkar",
+ ["Terokk's Rest"] = "Sosiego de Terokk",
+ ["The Arachnid Quarter"] = "Ala Arácnida",
+ ["The Arcatraz"] = "El Alcatraz",
+ ["The Argent Coliseum"] = "El Coliseo Argenta",
+ ["The Barrens"] = "Los Baldíos",
+ ["The Black Morass"] = "La Ciénaga Negra",
+ ["The Blood Furnace"] = "El Horno de Sangre",
+ ["The Bone Wastes"] = "El Vertedero de Huesos",
+ ["The Botanica"] = "El Invernáculo",
+ ["The Construct Quarter"] = "Ala de Abominación",
+ ["The Culling of Stratholme"] = "La Matanza de Stratholme",
+ ["The Dark Portal"] = "El Portal Oscuro",
+ ["The Deadmines"] = "Las Minas de la Muerte",
+ ["The Descent into Madness"] = "Descenso a la Locura",
+ ["The Exodar"] = "El Exodar",
+ ["The Eye"] = "El Ojo",
+ ["The Eye of Eternity"] = "El Ojo de la Eternidad",
+ ["The Forbidding Sea"] = "Mar Adusto",
+ ["The Forge of Souls"] = "La Forja de Almas",
+ ["The Frozen Halls"] = "Las Cámaras Heladas",
+ ["The Frozen Sea"] = "El Mar Gélido",
+ ["The Great Sea"] = "Mare Magnum",
+ ["The Halls of Winter"] = "Las Cámaras del Invierno",
+ ["The Hinterlands"] = "Tierras del Interior",
+ ["The Mechanar"] = "El Mechanar",
+ ["The Military Quarter"] = "Ala Militar",
+ ["The Nexus"] = "El Nexo",
+ ["The North Sea"] = "El Mar Norte",
+ ["The Obsidian Sanctum"] = "El Sagrario Obsidiana",
+ ["The Oculus"] = "El Oculus",
+ ["The Plague Quarter"] = "Ala de la Plaga",
+ ["The Prison of Yogg-Saron"] = "La Prisión de Yogg-Saron",
+ ["Theramore Isle"] = "Isla Theramore",
+ ["The Ring of Valor"] = "El Anillo del Valor",
+ ["The Ruby Sanctum"] = "El Sagrario Rubí",
+ ["The Scarlet Enclave"] = "Tierras de la Peste: El Enclave Escarlata",
+ ["The Shattered Halls"] = "Las Salas Arrasadas",
+ ["The Slave Pens"] = "Recinto de los Esclavos",
+ ["The Spark of Imagination"] = "Cámaras de la Invención",
+ ["The Steamvault"] = "La Cámara de Vapor",
+ ["The Stockade"] = "Las Mazmorras",
+ ["The Storm Peaks"] = "Las Cumbres Tormentosas",
+ ["The Temple of Atal'Hakkar"] = "El Templo de Atal'Hakkar",
+ ["The Underbog"] = "La Sotiénaga",
+ ["The Veiled Sea"] = "Mar de la Bruma",
+ ["The Violet Hold"] = "El Bastión Violeta",
+ ["Thousand Needles"] = "Las Mil Agujas",
+ ["Throne of the Tides"] = "Throne of the Tides", -- Needs review
+ ["Thunder Bluff"] = "Cima del Trueno",
+ Tirisfal = "Tirisfal",
+ ["Tirisfal Glades"] = "Claros de Tirisfal",
+ ["Trial of the Champion"] = "Prueba del Cruzado",
+ ["Trial of the Crusader"] = "Prueba del Cruzado",
+ ["Twisting Nether"] = "El Vacío Abisal",
+ Uldaman = "Uldaman",
+ Ulduar = "Ulduar",
+ Undercity = "Entrañas",
+ ["Un'Goro Crater"] = "Cráter de Un'Goro",
+ ["Upper Blackrock Spire"] = "Cumbre de Roca Negra",
+ ["Utgarde Keep"] = "Fortaleza de Utgarde",
+ ["Utgarde Pinnacle"] = "Pináculo de Utgarde",
+ ["Vashj'ir"] = "Vashj'ir", -- Needs review
+ ["Vault of Archavon"] = "La Cámara de Archavon",
+ ["Vortex Pinnacle"] = "Cumbre del Vórtice",
+ ["Wailing Caverns"] = "Cuevas de los Lamentos",
+ ["Warsong Gulch"] = "Garganta Grito de Guerra",
+ ["Western Plaguelands"] = "Tierras de la Peste del Oeste",
+ Westfall = "Páramos de Poniente",
+ Wetlands = "Los Humedales",
+ Wintergrasp = "Conquista del Invierno",
+ Winterspring = "Cuna del Invierno",
+ ["Wyrmrest Temple"] = "Templo del Reposo del Dragón",
+ Zangarmarsh = "Marisma de Zangar",
+ ["Zul'Aman"] = "Zul'Aman",
+ ["Zul'Drak"] = "Zul'Drak",
+ ["Zul'Farrak"] = "Zul'Farrak",
+ ["Zul'Gurub"] = "Zul'Gurub",
+}
+elseif GAME_LOCALE == "esMX" then
+ lib:SetCurrentTranslations {
+ -- ["Abyssal Depths"] = "",
+ ["Ahn'kahet: The Old Kingdom"] = "Ahn'kahet: El Antiguo Reino",
+ ["Ahn'Qiraj"] = "Ahn'Qiraj",
+ ["Alliance Base"] = "Base de la Alianza",
+ ["Alterac Mountains"] = "Montañas de Alterac",
+ ["Alterac Valley"] = "Valle de Alterac",
+ ["Amani Pass"] = "Paso de Amani",
+ ["Arathi Basin"] = "Cuenca de Arathi",
+ ["Arathi Highlands"] = "Tierras Altas de Arathi",
+ Armory = "Armería",
+ Ashenvale = "Vallefresno",
+ Auberdine = "Auberdine",
+ ["Auchenai Crypts"] = "Criptas Auchenai",
+ Auchindoun = "Auchindoun",
+ Azeroth = "Azeroth",
+ ["Azjol-Nerub"] = "Azjol-Nerub",
+ Azshara = "Azshara",
+ ["Azuremyst Isle"] = "Isla Bruma Azur",
+ Badlands = "Tierras Inhóspitas",
+ ["Bash'ir Landing"] = "Zona de aterrizaje Bash'ir",
+ ["Blackfathom Deeps"] = "Cavernas de Brazanegra",
+ -- ["Blackrock Caverns"] = "",
+ ["Blackrock Depths"] = "Profundidades de Roca Negra",
+ ["Blackrock Mountain"] = "Montaña Roca Negra",
+ ["Blackrock Spire"] = "Cumbre de Roca Negra",
+ ["Black Temple"] = "El Templo Oscuro",
+ ["Blackwind Lake"] = "Lago Vientonegro",
+ ["Blackwing Lair"] = "Guarida Alanegra",
+ ["Blade's Edge Arena"] = "Arena Filospada",
+ ["Blade's Edge Mountains"] = "Montañas Filospada",
+ ["Blasted Lands"] = "Las Tierras Devastadas",
+ ["Bloodmyst Isle"] = "Isla Bruma de Sangre",
+ ["Booty Bay"] = "Bahía del Botín",
+ ["Borean Tundra"] = "Tundra Boreal",
+ ["Burning Steppes"] = "Las Estepas Ardientes",
+ Cathedral = "Catedral",
+ ["Caverns of Time"] = "Cavernas del Tiempo",
+ ["Champions' Hall"] = "Sala de los Campeones",
+ ["Coilfang Reservoir"] = "Reserva Colmillo Torcido",
+ Coldarra = "Gelidar",
+ ["Cosmic map"] = "Mapa cósmico",
+ ["Crystalsong Forest"] = "Bosque Canto de Cristal",
+ ["Crystal Spine"] = "Espina de Cristal",
+ Dalaran = "Dalaran",
+ ["Dalaran Arena"] = "Arena de Dalaran",
+ ["Dalaran Sewers"] = "Cloacas de Dalaran",
+ ["Darkmoon Faire"] = "Feria de la Luna Negra",
+ Darkshore = "Costa Oscura",
+ Darnassus = "Darnassus",
+ ["Deadwind Pass"] = "Paso de la Muerte",
+ -- Deepholm = "",
+ ["Deeprun Tram"] = "Tranvía Subterráneo",
+ Desolace = "Desolace",
+ ["Dire Maul"] = "La Masacre",
+ ["Dire Maul (East)"] = "La Masacre (Este)",
+ ["Dire Maul (North)"] = "La Masacre (Norte)",
+ ["Dire Maul (West)"] = "La Masacre (Oeste)",
+ Dragonblight = "Cementerio de Dragones",
+ ["Drak'Tharon Keep"] = "Fortaleza de Drak'Tharon",
+ ["Dun Morogh"] = "Dun Morogh",
+ Durotar = "Durotar",
+ Duskwood = "Bosque del Ocaso",
+ ["Dustwallow Marsh"] = "Marjal Revolcafango",
+ ["Eastern Kingdoms"] = "Reinos del Este",
+ ["Eastern Plaguelands"] = "Tierras de la Peste del Este",
+ ["Elwynn Forest"] = "Bosque de Elwynn",
+ Everlook = "Vista Eterna",
+ ["Eversong Woods"] = "Bosque Canción Eterna",
+ ["Eye of the Storm"] = "Ojo de la Tormenta",
+ Felwood = "Frondavil",
+ Feralas = "Feralas",
+ ["Forge Camp: Terror"] = "Campamento forja: Terror",
+ ["Forge Camp: Wrath"] = "Campamento forja: Cólera",
+ ["Frostwyrm Lair"] = "Guarida de Vermis de Escarcha",
+ ["Furywing's Perch"] = "Nido de Alafuria",
+ Gadgetzan = "Gadgetzan",
+ ["Gates of Ahn'Qiraj"] = "Puertas de Ahn'Qiraj",
+ Ghostlands = "Tierras Fantasma",
+ -- Gilneas = "",
+ -- ["Gilneas City"] = "",
+ Gnomeregan = "Gnomeregan",
+ Graveyard = "Cementerio",
+ -- ["Grim Batol"] = "",
+ ["Grizzly Hills"] = "Colinas Pardas",
+ ["Grom'gol Base Camp"] = "Campamento Grom'gol",
+ ["Gruul's Lair"] = "Guarida de Gruul",
+ Gundrak = "Gundrak",
+ ["Hall of Champions"] = "Sala de los Campeones",
+ ["Hall of Legends"] = "Sala de las Leyendas",
+ ["Halls of Lightning"] = "Cámaras de Relámpagos",
+ ["Halls of Reflection"] = "Camáras de Reflexión",
+ ["Halls of Stone"] = "Cámaras de Piedra",
+ ["Hellfire Citadel"] = "Ciudadela del Fuego Infernal",
+ ["Hellfire Peninsula"] = "Península del Fuego Infernal",
+ ["Hellfire Ramparts"] = "Murallas del Fuego Infernal",
+ ["Hillsbrad Foothills"] = "Laderas de Trabalomas",
+ ["Horde Encampment"] = "Campamento Horda",
+ ["Howling Fjord"] = "Fiordo Aquilonal",
+ ["Hrothgar's Landing"] = "Desembarco de Hrothgar",
+ Hyjal = "Hyjal",
+ ["Hyjal Summit"] = "Cima Hyjal",
+ Icecrown = "Corona de Hielo",
+ ["Icecrown Citadel"] = "Ciudadela de la Corona de Hielo",
+ ["Insidion's Perch"] = "Nido de Insidion",
+ Ironforge = "Forjaz",
+ ["Isle of Conquest"] = "Isla de la Conquista",
+ ["Isle of Quel'Danas"] = "Isla de Quel'Danas",
+ Kalimdor = "Kalimdor",
+ Karazhan = "Karazhan",
+ -- ["Kelp Forest"] = "",
+ -- Kezan = "",
+ ["Krasus' Landing"] = "Krasus' Landing",
+ Library = "Biblioteca",
+ ["Loch Modan"] = "Loch Modan",
+ ["Lower Blackrock Spire"] = "Cumbre inferior de Roca Negra",
+ ["Magisters' Terrace"] = "Bancal Del Magister",
+ ["Magtheridon's Lair"] = "Guarida de Magtheridon",
+ ["Mana-Tombs"] = "Tumbas de Maná",
+ Maraudon = "Maraudon",
+ ["Marshlight Lake"] = "Lago Luz Pantanosa",
+ ["Menethil Harbor"] = "Puerto de Menethil",
+ ["Molten Core"] = "Núcleo de Magma",
+ Moonglade = "Claro de la Luna",
+ -- ["Mount Hyjal"] = "",
+ Mulgore = "Mulgore",
+ Nagrand = "Nagrand",
+ ["Nagrand Arena"] = "Arena de Nagrand",
+ Naxxramas = "Naxxramas",
+ Netherstorm = "Tormenta Abisal",
+ ["Night Elf Village"] = "Poblado Elfo de la Noche",
+ -- ["Northern Barrens"] = "",
+ -- ["Northern Stranglethorn"] = "",
+ Northrend = "Rasganorte",
+ ["Obsidia's Perch"] = "Nido de Obsidia",
+ ["Ogri'la"] = "Ogri'la",
+ ["Old Hillsbrad Foothills"] = "Antiguas Laderas de Trabalomas",
+ ["Old Stratholme"] = "Stratholme en el pasado",
+ ["Onyxia's Lair"] = "Guarida de Onyxia",
+ Orgrimmar = "Orgrimmar",
+ Outland = "Terrallende",
+ ["Pit of Saron"] = "Foso de Saron",
+ ["Plaguelands: The Scarlet Enclave"] = "Tierras de la Peste del Este: El Enclave Escarlata",
+ Plaguewood = "Bosque de la Plaga",
+ ["Quel'thalas"] = "Quel'thalas",
+ ["Ragefire Chasm"] = "Sima ígnea",
+ Ratchet = "Trinquete",
+ ["Razorfen Downs"] = "Zahúrda Rajacieno",
+ ["Razorfen Kraul"] = "Horado Rajacieno",
+ ["Redridge Mountains"] = "Montañas Crestagrana",
+ ["Ring of Observance"] = "Círculo de la Observancia",
+ ["Rivendark's Perch"] = "Nido de Desgarro Oscuro",
+ ["Ruins of Ahn'Qiraj"] = "Ruinas de Ahn'Qiraj",
+ -- ["Ruins of Gilneas"] = "",
+ ["Ruins of Lordaeron"] = "Ruinas de Lordaeron",
+ ["Scalebeard's Cave"] = "Cueva de Barbaescamas",
+ ["Scarlet Monastery"] = "Monasterio Escarlata",
+ Scholomance = "Scholomance",
+ ["Searing Gorge"] = "La Garganta de Fuego",
+ ["Serpent Lake"] = "Lago Serpiente",
+ ["Serpentshrine Cavern"] = "Caverna Santuario Serpiente",
+ ["Sethekk Halls"] = "Salas Sethekk",
+ ["Shadowfang Keep"] = "Castillo de Colmillo Oscuro",
+ ["Shadow Labyrinth"] = "Laberinto de las Sombras",
+ ["Shadowmoon Valley"] = "Valle Sombraluna",
+ ["Shartuul's Transporter"] = "Transportador de Shartuul",
+ Shattrath = "Shattrath",
+ ["Shattrath City"] = "Ciudad de Shattrath",
+ -- ["Shimmering Expanse"] = "",
+ ["Sholazar Basin"] = "Cuenca de Sholazar",
+ Silithus = "Silithus",
+ ["Silvermoon City"] = "Ciudad de Lunargenta",
+ ["Silverpine Forest"] = "Bosque de Argénteos",
+ ["Skyguard Outpost"] = "Puesto de la guardia de cielo",
+ ["Skysong Lake"] = "Lago Son Celeste",
+ -- ["Southern Barrens"] = "",
+ ["Sporewind Lake"] = "Lago Espora Volante",
+ Stonard = "Rocal",
+ ["Stonetalon Mountains"] = "Sierra Espolón",
+ Stormwind = "Ventormenta",
+ ["Stormwind City"] = "Ciudad de Ventormenta",
+ ["Strand of the Ancients"] = "Playa de los Ancestros",
+ ["Stranglethorn Vale"] = "Vega de Tuercespina",
+ Stratholme = "Stratholme",
+ ["Sunken Temple"] = "El Templo Sumergido",
+ ["Sunwell Plateau"] = "Meseta de la Fuente del Sol",
+ ["Swamp of Sorrows"] = "Pantano de las Penas",
+ Tanaris = "Tanaris",
+ Teldrassil = "Teldrassil",
+ ["Tempest Keep"] = "El Castillo de la Tempestad",
+ ["Temple of Ahn'Qiraj"] = "El Templo de Ahn'Qiraj",
+ ["Terokkar Forest"] = "Bosque de Terokkar",
+ ["Terokk's Rest"] = "Sosiego de Terokk",
+ ["The Arachnid Quarter"] = "Ala Arácnida",
+ ["The Arcatraz"] = "El Alcatraz",
+ ["The Argent Coliseum"] = "El Coliseo Argenta",
+ ["The Barrens"] = "Los Baldíos",
+ ["The Black Morass"] = "La Ciénaga Negra",
+ ["The Blood Furnace"] = "El Horno de Sangre",
+ ["The Bone Wastes"] = "El Vertedero de Huesos",
+ ["The Botanica"] = "El Invernáculo",
+ ["The Construct Quarter"] = "Ala de Abominación",
+ ["The Culling of Stratholme"] = "La Matanza de Stratholme",
+ ["The Dark Portal"] = "El Portal Oscuro",
+ ["The Deadmines"] = "Las Minas de la Muerte",
+ ["The Descent into Madness"] = "Descenso a la Locura",
+ ["The Exodar"] = "El Exodar",
+ ["The Eye"] = "El Ojo",
+ ["The Eye of Eternity"] = "El Ojo de la Eternidad",
+ ["The Forbidding Sea"] = "Mar Adusto",
+ ["The Forge of Souls"] = "La Forja de Almas",
+ ["The Frozen Halls"] = "Las Salas Gélidas",
+ ["The Frozen Sea"] = "El Mar Gélido",
+ ["The Great Sea"] = "Mare Magnum",
+ ["The Halls of Winter"] = "Las Cámaras del Invierno",
+ ["The Hinterlands"] = "Tierras del Interior",
+ ["The Mechanar"] = "El Mechanar",
+ ["The Military Quarter"] = "Ala Militar",
+ ["The Nexus"] = "El Nexo",
+ ["The North Sea"] = "El Mar Norte",
+ ["The Obsidian Sanctum"] = "El Sagrario Obsidiana",
+ ["The Oculus"] = "El Oculus",
+ ["The Plague Quarter"] = "Ala de la Plaga",
+ ["The Prison of Yogg-Saron"] = "La Prisión de Yogg-Saron",
+ ["Theramore Isle"] = "Isla Theramore",
+ ["The Ring of Valor"] = "El Anillo del Valor",
+ -- ["The Ruby Sanctum"] = "",
+ ["The Scarlet Enclave"] = "El Enclave Escarlata",
+ ["The Shattered Halls"] = "Las Salas Arrasadas",
+ ["The Slave Pens"] = "Recinto de los Esclavos",
+ ["The Spark of Imagination"] = "Cámaras de la Invención",
+ ["The Steamvault"] = "La Cámara de Vapor",
+ ["The Stockade"] = "Las Mazmorras",
+ ["The Storm Peaks"] = "Las Cumbres Tormentosas",
+ ["The Temple of Atal'Hakkar"] = "El Templo de Atal'Hakkar",
+ ["The Underbog"] = "La Sotiénaga",
+ ["The Veiled Sea"] = "Mar de la Bruma",
+ ["The Violet Hold"] = "El Bastión Violeta",
+ ["Thousand Needles"] = "Las Mil Agujas",
+ -- ["Throne of the Tides"] = "",
+ ["Thunder Bluff"] = "Cima del Trueno",
+ Tirisfal = "Tirisfal",
+ ["Tirisfal Glades"] = "Claros de Tirisfal",
+ ["Trial of the Champion"] = "Pueba del Campeon",
+ ["Trial of the Crusader"] = "Prueba del Cruzado",
+ ["Twisting Nether"] = "El Vacío Abisal",
+ Uldaman = "Uldaman",
+ Ulduar = "Ulduar",
+ Undercity = "Entrañas",
+ ["Un'Goro Crater"] = "Cráter de Un'Goro",
+ ["Upper Blackrock Spire"] = "Cumbre de Roca Negra",
+ ["Utgarde Keep"] = "Fortaleza de Utgarde",
+ ["Utgarde Pinnacle"] = "Pináculo de Utgarde",
+ -- ["Vashj'ir"] = "",
+ ["Vault of Archavon"] = "La Cámara de Archavon",
+ ["Vortex Pinnacle"] = "Cumbre del Vórtice",
+ ["Wailing Caverns"] = "Cuevas de los Lamentos",
+ ["Warsong Gulch"] = "Garganta Grito de Guerra",
+ ["Western Plaguelands"] = "Tierras de la Peste del Oeste",
+ Westfall = "Páramos de Poniente",
+ Wetlands = "Los Humedales",
+ Wintergrasp = "Conquista del Invierno",
+ Winterspring = "Cuna del Invierno",
+ ["Wyrmrest Temple"] = "Templo del Reposo del Dragón",
+ Zangarmarsh = "Marisma de Zangar",
+ ["Zul'Aman"] = "Zul'Aman",
+ ["Zul'Drak"] = "Zul'Drak",
+ ["Zul'Farrak"] = "Zul'Farrak",
+ ["Zul'Gurub"] = "Zul'Gurub",
+}
+elseif GAME_LOCALE == "ruRU" then
+ lib:SetCurrentTranslations {
+ -- ["Abyssal Depths"] = "",
+ ["Ahn'kahet: The Old Kingdom"] = "Ан'кахет: Старое Королевство",
+ ["Ahn'Qiraj"] = "Ан'Кираж",
+ ["Alliance Base"] = "База Альянса",
+ ["Alterac Mountains"] = "Альтеракские горы",
+ ["Alterac Valley"] = "Альтеракская долина",
+ ["Amani Pass"] = "Перевал Амани",
+ ["Arathi Basin"] = "Низина Арати",
+ ["Arathi Highlands"] = "Нагорье Арати",
+ Armory = "Оружейная",
+ Ashenvale = "Ясеневый лес",
+ Auberdine = "Аубердин",
+ ["Auchenai Crypts"] = "Аукенайские гробницы",
+ Auchindoun = "Аукиндон",
+ Azeroth = "Азерот",
+ ["Azjol-Nerub"] = "Азжол-Неруб",
+ Azshara = "Азшара",
+ ["Azuremyst Isle"] = "Остров Лазурной Дымки",
+ Badlands = "Бесплодные земли",
+ ["Bash'ir Landing"] = "Лагерь Баш'ира",
+ ["Blackfathom Deeps"] = "Непроглядная Пучина",
+ -- ["Blackrock Caverns"] = "",
+ ["Blackrock Depths"] = "Глубины Черной горы",
+ ["Blackrock Mountain"] = "Черная гора",
+ ["Blackrock Spire"] = "Пик Черной горы",
+ ["Black Temple"] = "Черный храм",
+ ["Blackwind Lake"] = "Озеро Черного Ветра",
+ ["Blackwing Lair"] = "Логово Крыла Тьмы",
+ ["Blade's Edge Arena"] = "Арена Острогорья",
+ ["Blade's Edge Mountains"] = "Острогорье",
+ ["Blasted Lands"] = "Выжженные земли",
+ ["Bloodmyst Isle"] = "Остров Кровавой Дымки",
+ ["Booty Bay"] = "Пиратская Бухта",
+ ["Borean Tundra"] = "Борейская тундра",
+ ["Burning Steppes"] = "Пылающие степи",
+ Cathedral = "Собор",
+ ["Caverns of Time"] = "Пещеры Времени",
+ ["Champions' Hall"] = "Зал Защитника",
+ ["Coilfang Reservoir"] = "Резервуар Кривого Клыка",
+ Coldarra = "Хладарра",
+ ["Cosmic map"] = "Карта Вселенной",
+ ["Crystalsong Forest"] = "Лес Хрустальной Песни",
+ ["Crystal Spine"] = "Хрустальное поле",
+ Dalaran = "Даларан",
+ ["Dalaran Arena"] = "Арена Даларана",
+ ["Dalaran Sewers"] = "Арена Даларана",
+ ["Darkmoon Faire"] = "Ярмарка Новолуния",
+ Darkshore = "Темные берега",
+ Darnassus = "Дарнас",
+ ["Deadwind Pass"] = "Перевал Мертвого Ветра",
+ -- Deepholm = "",
+ ["Deeprun Tram"] = "Подземный поезд",
+ Desolace = "Пустоши",
+ ["Dire Maul"] = "Забытый Город",
+ ["Dire Maul (East)"] = "Забытый Город: Восток",
+ ["Dire Maul (North)"] = "Забытый Город: Север",
+ ["Dire Maul (West)"] = "Забытый Город: Запад",
+ Dragonblight = "Драконий Погост",
+ ["Drak'Tharon Keep"] = "Крепость Драк'Тарон",
+ ["Dun Morogh"] = "Дун Морог",
+ Durotar = "Дуротар",
+ Duskwood = "Сумеречный лес",
+ ["Dustwallow Marsh"] = "Пылевые топи",
+ ["Eastern Kingdoms"] = "Восточные королевства",
+ ["Eastern Plaguelands"] = "Восточные Чумные земли",
+ ["Elwynn Forest"] = "Элвиннский лес",
+ Everlook = "Круговзор",
+ ["Eversong Woods"] = "Леса Вечной Песни",
+ ["Eye of the Storm"] = "Око Бури",
+ Felwood = "Оскверненный лес",
+ Feralas = "Фералас",
+ ["Forge Camp: Terror"] = "Лагерь Легиона: Ужас",
+ ["Forge Camp: Wrath"] = "Лагерь Легиона: Гнев",
+ ["Frostwyrm Lair"] = "Логово Ледяного змея",
+ ["Furywing's Perch"] = "Гнездовье Ярокрыла",
+ Gadgetzan = "Прибамбасск",
+ ["Gates of Ahn'Qiraj"] = "Врата Ан'Киража",
+ Ghostlands = "Призрачные земли",
+ -- Gilneas = "",
+ -- ["Gilneas City"] = "",
+ Gnomeregan = "Гномреган",
+ Graveyard = "Кладбище",
+ -- ["Grim Batol"] = "",
+ ["Grizzly Hills"] = "Седые холмы",
+ ["Grom'gol Base Camp"] = "Лагерь Гром'гол",
+ ["Gruul's Lair"] = "Логово Груула",
+ Gundrak = "Гундрак",
+ ["Hall of Champions"] = "Чертог Защитников",
+ ["Hall of Legends"] = "Зал Легенд",
+ ["Halls of Lightning"] = "Чертоги Молний",
+ ["Halls of Reflection"] = "Залы Отражений",
+ ["Halls of Stone"] = "Чертоги Камня",
+ ["Hellfire Citadel"] = "Цитадель Адского Пламени",
+ ["Hellfire Peninsula"] = "Полуостров Адского Пламени",
+ ["Hellfire Ramparts"] = "Бастионы Адского Пламени",
+ ["Hillsbrad Foothills"] = "Предгорья Хилсбрада",
+ ["Horde Encampment"] = "Стоянка Орды",
+ ["Howling Fjord"] = "Ревущий фьорд",
+ ["Hrothgar's Landing"] = "Лагерь Хротгара",
+ Hyjal = "Хиджал",
+ ["Hyjal Summit"] = "Вершина Хиджала",
+ Icecrown = "Ледяная Корона",
+ ["Icecrown Citadel"] = "Цитадель Ледяной Короны",
+ ["Insidion's Perch"] = "Гнездо Инсидиона",
+ Ironforge = "Стальгорн",
+ ["Isle of Conquest"] = "Остров Завоеваний",
+ ["Isle of Quel'Danas"] = "Остров Кель'Данас",
+ Kalimdor = "Калимдор",
+ Karazhan = "Каражан",
+ -- ["Kelp Forest"] = "",
+ -- Kezan = "",
+ ["Krasus' Landing"] = "Площадка Краса",
+ Library = "Библиотека",
+ ["Loch Modan"] = "Лок Модан",
+ ["Lower Blackrock Spire"] = "Нижний ярус Черной горы",
+ ["Magisters' Terrace"] = "Терраса Магистров",
+ ["Magtheridon's Lair"] = "Логово Магтеридона",
+ ["Mana-Tombs"] = "Гробницы Маны",
+ Maraudon = "Мародон",
+ ["Marshlight Lake"] = "Озеро Болотных Огоньков",
+ ["Menethil Harbor"] = "Гавань Менетилов",
+ ["Molten Core"] = "Огненные Недра",
+ Moonglade = "Лунная поляна",
+ -- ["Mount Hyjal"] = "",
+ Mulgore = "Мулгор",
+ Nagrand = "Награнд",
+ ["Nagrand Arena"] = "Арена Награнда",
+ Naxxramas = "Наксрамас",
+ Netherstorm = "Пустоверть",
+ ["Night Elf Village"] = "Деревня ночных эльфов",
+ -- ["Northern Barrens"] = "",
+ -- ["Northern Stranglethorn"] = "",
+ Northrend = "Нордскол",
+ ["Obsidia's Perch"] = "Гнездо Обсидии",
+ ["Ogri'la"] = "Огри'ла",
+ ["Old Hillsbrad Foothills"] = "Старые предгорья Хилсбрада",
+ ["Old Stratholme"] = "Старый Стратхольм",
+ ["Onyxia's Lair"] = "Логово Ониксии",
+ Orgrimmar = "Оргриммар",
+ Outland = "Запределье",
+ ["Pit of Saron"] = "Яма Сарона",
+ ["Plaguelands: The Scarlet Enclave"] = "Чумные земли: Анклав Алого ордена",
+ Plaguewood = "Проклятый лес",
+ ["Quel'thalas"] = "Кель'Талас",
+ ["Ragefire Chasm"] = "Огненная пропасть",
+ Ratchet = "Кабестан",
+ ["Razorfen Downs"] = "Курганы Иглошкурых",
+ ["Razorfen Kraul"] = "Лабиринты Иглошкурых",
+ ["Redridge Mountains"] = "Красногорье",
+ ["Ring of Observance"] = "Ритуальный Круг",
+ ["Rivendark's Perch"] = "Гнездо Чернокрыла",
+ ["Ruins of Ahn'Qiraj"] = "Руины Ан'Киража",
+ -- ["Ruins of Gilneas"] = "",
+ ["Ruins of Lordaeron"] = "Руины Лордерона",
+ ["Scalebeard's Cave"] = "Пещера Чешуеборода",
+ ["Scarlet Monastery"] = "Монастырь Алого ордена",
+ Scholomance = "Некроситет",
+ ["Searing Gorge"] = "Тлеющее ущелье",
+ ["Serpent Lake"] = "Змеиное озеро",
+ ["Serpentshrine Cavern"] = "Змеиное святилище",
+ ["Sethekk Halls"] = "Сетеккские залы",
+ ["Shadowfang Keep"] = "Крепость Темного Клыка",
+ ["Shadow Labyrinth"] = "Темный лабиринт",
+ ["Shadowmoon Valley"] = "Долина Призрачной Луны",
+ ["Shartuul's Transporter"] = "Транспортер Шартуула",
+ Shattrath = "Шаттрат",
+ ["Shattrath City"] = "Шаттрат",
+ -- ["Shimmering Expanse"] = "",
+ ["Sholazar Basin"] = "Низина Шолазар",
+ Silithus = "Силитус",
+ ["Silvermoon City"] = "Луносвет",
+ ["Silverpine Forest"] = "Серебряный бор",
+ ["Skyguard Outpost"] = "Застава Стражи Небес",
+ ["Skysong Lake"] = "Озеро Небесной Песни",
+ -- ["Southern Barrens"] = "",
+ ["Sporewind Lake"] = "Озеро Спороветра",
+ Stonard = "Каменор",
+ ["Stonetalon Mountains"] = "Когтистые горы",
+ Stormwind = "Штормград",
+ ["Stormwind City"] = "Штормград",
+ ["Strand of the Ancients"] = "Берег Древних",
+ ["Stranglethorn Vale"] = "Тернистая долина",
+ Stratholme = "Стратхольм",
+ ["Sunken Temple"] = "Затонувший храм",
+ ["Sunwell Plateau"] = "Плато Солнечного Колодца",
+ ["Swamp of Sorrows"] = "Болото Печали",
+ Tanaris = "Танарис",
+ Teldrassil = "Тельдрассил",
+ ["Tempest Keep"] = "Крепость Бурь",
+ ["Temple of Ahn'Qiraj"] = "Храм Ан'Кираж",
+ ["Terokkar Forest"] = "Лес Тероккар",
+ ["Terokk's Rest"] = "Покой Терокка",
+ ["The Arachnid Quarter"] = "Паучий квартал",
+ ["The Arcatraz"] = "Аркатрац",
+ ["The Argent Coliseum"] = "Испытание крестоносца",
+ ["The Barrens"] = "Степи",
+ ["The Black Morass"] = "Черные топи",
+ ["The Blood Furnace"] = "Кузня Крови",
+ ["The Bone Wastes"] = "Костяные пустоши",
+ ["The Botanica"] = "Ботаника",
+ ["The Construct Quarter"] = "Квартал Мерзости",
+ ["The Culling of Stratholme"] = "Очищение Стратхольма",
+ ["The Dark Portal"] = "Темный портал",
+ ["The Deadmines"] = "Мертвые копи",
+ ["The Descent into Madness"] = "Провал Безумия",
+ ["The Exodar"] = "Экзодар",
+ ["The Eye"] = "Око",
+ ["The Eye of Eternity"] = "Око Вечности",
+ ["The Forbidding Sea"] = "Зловещее море",
+ ["The Forge of Souls"] = "Кузня Душ",
+ ["The Frozen Halls"] = "Ледяные залы",
+ ["The Frozen Sea"] = "Ледяное море",
+ ["The Great Sea"] = "Великое море",
+ ["The Halls of Winter"] = "Залы Зимы",
+ ["The Hinterlands"] = "Внутренние земли",
+ ["The Mechanar"] = "Механар",
+ ["The Military Quarter"] = "Военный квартал",
+ ["The Nexus"] = "Нексус",
+ ["The North Sea"] = "Северное море",
+ ["The Obsidian Sanctum"] = "Обсидиановое святилище",
+ ["The Oculus"] = "Окулус",
+ ["The Plague Quarter"] = "Чумной квартал",
+ ["The Prison of Yogg-Saron"] = "Темница Йогг-Сарона",
+ ["Theramore Isle"] = "Остров Терамор",
+ ["The Ring of Valor"] = "Круг Доблести",
+ ["The Ruby Sanctum"] = "Рубиновое святилище",
+ ["The Scarlet Enclave"] = "Анклав Алого ордена",
+ ["The Shattered Halls"] = "Разрушенные залы",
+ ["The Slave Pens"] = "Узилище",
+ ["The Spark of Imagination"] = "Искра Воображения",
+ ["The Steamvault"] = "Паровое подземелье",
+ ["The Stockade"] = "Тюрьма",
+ ["The Storm Peaks"] = "Грозовая Гряда",
+ ["The Temple of Atal'Hakkar"] = "Храм Атал'Хаккара",
+ ["The Underbog"] = "Нижетопь",
+ ["The Veiled Sea"] = "Сокрытое Море",
+ ["The Violet Hold"] = "Аметистовая крепость",
+ ["Thousand Needles"] = "Тысяча Игл",
+ -- ["Throne of the Tides"] = "",
+ ["Thunder Bluff"] = "Громовой Утес",
+ Tirisfal = "Тирисфальские леса",
+ ["Tirisfal Glades"] = "Тирисфальские леса",
+ ["Trial of the Champion"] = "Испытание чемпиона",
+ ["Trial of the Crusader"] = "Испытание крестоносца",
+ ["Twisting Nether"] = "Круговерть Пустоты",
+ Uldaman = "Ульдаман",
+ Ulduar = "Ульдуар",
+ Undercity = "Подгород",
+ ["Un'Goro Crater"] = "Кратер Ун'Горо",
+ ["Upper Blackrock Spire"] = "Верхний ярус Черной горы",
+ ["Utgarde Keep"] = "Крепость Утгард",
+ ["Utgarde Pinnacle"] = "Вершина Утгард",
+ -- ["Vashj'ir"] = "",
+ ["Vault of Archavon"] = "Склеп Аркавона",
+ ["Vortex Pinnacle"] = "Нагорье Смерчей",
+ ["Wailing Caverns"] = "Пещеры Стенаний",
+ ["Warsong Gulch"] = "Ущелье Песни Войны",
+ ["Western Plaguelands"] = "Западные Чумные земли",
+ Westfall = "Западный Край",
+ Wetlands = "Болотина",
+ Wintergrasp = "Озеро Ледяных Оков",
+ Winterspring = "Зимние Ключи",
+ ["Wyrmrest Temple"] = "Храм Драконьего Покоя",
+ Zangarmarsh = "Зангартопь",
+ ["Zul'Aman"] = "Зул'Аман",
+ ["Zul'Drak"] = "Зул'Драк",
+ ["Zul'Farrak"] = "Зул'Фаррак",
+ ["Zul'Gurub"] = "Зул'Гуруб",
+}
+elseif GAME_LOCALE == "zhCN" then
+ lib:SetCurrentTranslations {
+ ["Abyssal Depths"] = "Abyssal Depths", -- Needs review
+ ["Ahn'kahet: The Old Kingdom"] = "安卡雷:古代王国",
+ ["Ahn'Qiraj"] = "安其拉",
+ ["Alliance Base"] = "联盟基地",
+ ["Alterac Mountains"] = "奥特兰克山脉",
+ ["Alterac Valley"] = "奥特兰克山谷",
+ ["Amani Pass"] = "阿曼尼小径",
+ ["Arathi Basin"] = "阿拉希盆地",
+ ["Arathi Highlands"] = "阿拉希高地",
+ Armory = "军械库",
+ Ashenvale = "灰谷",
+ Auberdine = "奥伯丁",
+ ["Auchenai Crypts"] = "奥金尼地穴",
+ Auchindoun = "奥金顿",
+ Azeroth = "艾泽拉斯",
+ ["Azjol-Nerub"] = "艾卓-尼鲁布",
+ Azshara = "艾萨拉",
+ ["Azuremyst Isle"] = "秘蓝岛",
+ Badlands = "荒芜之地",
+ ["Bash'ir Landing"] = "巴什伊尔码头",
+ ["Blackfathom Deeps"] = "黑暗深渊",
+ ["Blackrock Caverns"] = "Blackrock Caverns", -- Needs review
+ ["Blackrock Depths"] = "黑石深渊",
+ ["Blackrock Mountain"] = "黑石山",
+ ["Blackrock Spire"] = "黑石塔",
+ ["Black Temple"] = "黑暗神殿",
+ ["Blackwind Lake"] = "黑风湖",
+ ["Blackwing Lair"] = "黑翼之巢",
+ ["Blade's Edge Arena"] = "刀锋山竞技场",
+ ["Blade's Edge Mountains"] = "刀锋山",
+ ["Blasted Lands"] = "诅咒之地",
+ ["Bloodmyst Isle"] = "秘血岛",
+ ["Booty Bay"] = "藏宝海湾",
+ ["Borean Tundra"] = "北风苔原",
+ ["Burning Steppes"] = "燃烧平原",
+ Cathedral = "教堂",
+ ["Caverns of Time"] = "时光之穴",
+ ["Champions' Hall"] = "勇士大厅",
+ ["Coilfang Reservoir"] = "盘牙水库",
+ Coldarra = "考达拉",
+ ["Cosmic map"] = "全部地图",
+ ["Crystalsong Forest"] = "晶歌森林",
+ ["Crystal Spine"] = "水晶之脊",
+ Dalaran = "达拉然",
+ ["Dalaran Arena"] = "达拉然竞技场",
+ ["Dalaran Sewers"] = "达拉然下水道",
+ ["Darkmoon Faire"] = "暗月马戏团",
+ Darkshore = "黑海岸",
+ Darnassus = "达纳苏斯",
+ ["Deadwind Pass"] = "逆风小径",
+ Deepholm = "Deepholm", -- Needs review
+ ["Deeprun Tram"] = "矿道地铁",
+ Desolace = "凄凉之地",
+ ["Dire Maul"] = "厄运之槌",
+ ["Dire Maul (East)"] = "厄运之槌(东)",
+ ["Dire Maul (North)"] = "厄运之槌(北)",
+ ["Dire Maul (West)"] = "厄运之槌(西)",
+ Dragonblight = "龙骨荒野",
+ ["Drak'Tharon Keep"] = "达克萨隆要塞",
+ ["Dun Morogh"] = "丹莫罗",
+ Durotar = "杜隆塔尔",
+ Duskwood = "暮色森林",
+ ["Dustwallow Marsh"] = "尘泥沼泽",
+ ["Eastern Kingdoms"] = "东部王国",
+ ["Eastern Plaguelands"] = "东瘟疫之地",
+ ["Elwynn Forest"] = "艾尔文森林",
+ Everlook = "永望镇",
+ ["Eversong Woods"] = "永歌森林",
+ ["Eye of the Storm"] = "风暴之眼",
+ Felwood = "费伍德森林",
+ Feralas = "菲拉斯",
+ ["Forge Camp: Terror"] = "铸魔营地:恐怖",
+ ["Forge Camp: Wrath"] = "铸魔营地:天罚",
+ ["Frostwyrm Lair"] = "冰霜巨龙的巢穴",
+ ["Furywing's Perch"] = "弗雷文栖木",
+ Gadgetzan = "加基森",
+ ["Gates of Ahn'Qiraj"] = "安其拉之门",
+ Ghostlands = "幽魂之地",
+ Gilneas = "Gilneas", -- Needs review
+ ["Gilneas City"] = "Gilneas City", -- Needs review
+ Gnomeregan = "诺莫瑞根",
+ Graveyard = "墓地",
+ ["Grim Batol"] = "格瑞姆巴托",
+ ["Grizzly Hills"] = "灰熊丘陵",
+ ["Grom'gol Base Camp"] = "格罗姆高营地",
+ ["Gruul's Lair"] = "格鲁尔的巢穴",
+ Gundrak = "古达克",
+ ["Hall of Champions"] = "勇士大厅",
+ ["Hall of Legends"] = "传说大厅",
+ ["Halls of Lightning"] = "闪电大厅",
+ ["Halls of Reflection"] = "映像大厅",
+ ["Halls of Stone"] = "岩石大厅",
+ ["Hellfire Citadel"] = "地狱火堡垒",
+ ["Hellfire Peninsula"] = "地狱火半岛",
+ ["Hellfire Ramparts"] = "地狱火城墙",
+ ["Hillsbrad Foothills"] = "希尔斯布莱德丘陵",
+ ["Horde Encampment"] = "部落营地",
+ ["Howling Fjord"] = "嚎风峡湾",
+ ["Hrothgar's Landing"] = "洛斯加尔登陆点",
+ Hyjal = "海加尔山",
+ ["Hyjal Summit"] = "海加尔峰",
+ Icecrown = "冰冠冰川",
+ ["Icecrown Citadel"] = "冰冠堡垒",
+ ["Insidion's Perch"] = "因斯迪安栖木",
+ Ironforge = "铁炉堡",
+ ["Isle of Conquest"] = "征服之岛",
+ ["Isle of Quel'Danas"] = "奎尔丹纳斯岛",
+ Kalimdor = "卡利姆多",
+ Karazhan = "卡拉赞",
+ ["Kelp Forest"] = "Kelp Forest", -- Needs review
+ Kezan = "Kezan", -- Needs review
+ ["Krasus' Landing"] = "克拉苏斯平台",
+ Library = "图书馆",
+ ["Loch Modan"] = "洛克莫丹",
+ ["Lower Blackrock Spire"] = "下层黑石塔",
+ ["Magisters' Terrace"] = "魔导师平台",
+ ["Magtheridon's Lair"] = "玛瑟里顿的巢穴",
+ ["Mana-Tombs"] = "法力陵墓",
+ Maraudon = "玛拉顿",
+ ["Marshlight Lake"] = "沼光湖",
+ ["Menethil Harbor"] = "米奈希尔港",
+ ["Molten Core"] = "熔火之心",
+ Moonglade = "月光林地",
+ ["Mount Hyjal"] = "Mount Hyjal", -- Needs review
+ Mulgore = "莫高雷",
+ Nagrand = "纳格兰",
+ ["Nagrand Arena"] = "纳格兰竞技场",
+ Naxxramas = "纳克萨玛斯",
+ Netherstorm = "虚空风暴",
+ ["Night Elf Village"] = "暗夜精灵村庄",
+ ["Northern Barrens"] = "Northern Barrens", -- Needs review
+ ["Northern Stranglethorn"] = "Northern Stranglethorn", -- Needs review
+ Northrend = "诺森德",
+ ["Obsidia's Perch"] = "欧比斯迪栖木",
+ ["Ogri'la"] = "奥格瑞拉",
+ ["Old Hillsbrad Foothills"] = "旧希尔斯布莱德丘陵",
+ ["Old Stratholme"] = "旧斯坦索姆",
+ ["Onyxia's Lair"] = "奥妮克希亚的巢穴",
+ Orgrimmar = "奥格瑞玛",
+ Outland = "外域",
+ ["Pit of Saron"] = "萨隆矿坑",
+ ["Plaguelands: The Scarlet Enclave"] = "东瘟疫之地:血色领地",
+ Plaguewood = "病木林",
+ ["Quel'thalas"] = "奎尔萨拉斯",
+ ["Ragefire Chasm"] = "怒焰裂谷",
+ Ratchet = "棘齿城",
+ ["Razorfen Downs"] = "剃刀高地",
+ ["Razorfen Kraul"] = "剃刀沼泽",
+ ["Redridge Mountains"] = "赤脊山",
+ ["Ring of Observance"] = "仪式广场",
+ ["Rivendark's Perch"] = "雷文达克栖木",
+ ["Ruins of Ahn'Qiraj"] = "安其拉废墟",
+ ["Ruins of Gilneas"] = "Ruins of Gilneas", -- Needs review
+ ["Ruins of Lordaeron"] = "洛丹伦废墟",
+ ["Scalebeard's Cave"] = "鳞须海龟洞穴",
+ ["Scarlet Monastery"] = "血色修道院",
+ Scholomance = "通灵学院",
+ ["Searing Gorge"] = "灼热峡谷",
+ ["Serpent Lake"] = "毒蛇湖",
+ ["Serpentshrine Cavern"] = "毒蛇神殿",
+ ["Sethekk Halls"] = "塞泰克大厅",
+ ["Shadowfang Keep"] = "影牙城堡",
+ ["Shadow Labyrinth"] = "暗影迷宫",
+ ["Shadowmoon Valley"] = "影月谷",
+ ["Shartuul's Transporter"] = "沙图尔的传送器",
+ Shattrath = "沙塔斯",
+ ["Shattrath City"] = "沙塔斯城",
+ ["Shimmering Expanse"] = "Shimmering Expanse", -- Needs review
+ ["Sholazar Basin"] = "索拉查盆地",
+ Silithus = "希利苏斯",
+ ["Silvermoon City"] = "银月城",
+ ["Silverpine Forest"] = "银松森林",
+ ["Skyguard Outpost"] = "天空卫队哨站",
+ ["Skysong Lake"] = "天歌湖",
+ ["Southern Barrens"] = "Southern Barrens", -- Needs review
+ ["Sporewind Lake"] = "孢子湖",
+ Stonard = "斯通纳德",
+ ["Stonetalon Mountains"] = "石爪山脉",
+ Stormwind = "暴风城",
+ ["Stormwind City"] = "暴风城",
+ ["Strand of the Ancients"] = "远古海滩",
+ ["Stranglethorn Vale"] = "荆棘谷",
+ Stratholme = "斯坦索姆",
+ ["Sunken Temple"] = "沉没的神庙",
+ ["Sunwell Plateau"] = "太阳之井高地",
+ ["Swamp of Sorrows"] = "悲伤沼泽",
+ Tanaris = "塔纳利斯",
+ Teldrassil = "泰达希尔",
+ ["Tempest Keep"] = "风暴要塞",
+ ["Temple of Ahn'Qiraj"] = "安其拉神殿",
+ ["Terokkar Forest"] = "泰罗卡森林",
+ ["Terokk's Rest"] = "泰罗克之墓",
+ ["The Arachnid Quarter"] = "蜘蛛区",
+ ["The Arcatraz"] = "禁魔监狱",
+ ["The Argent Coliseum"] = "银色试炼场", -- Needs review
+ ["The Barrens"] = "贫瘠之地",
+ ["The Black Morass"] = "黑色沼泽",
+ ["The Blood Furnace"] = "鲜血熔炉",
+ ["The Bone Wastes"] = "白骨荒野",
+ ["The Botanica"] = "生态船",
+ ["The Construct Quarter"] = "构造区",
+ ["The Culling of Stratholme"] = "净化斯坦索姆",
+ ["The Dark Portal"] = "黑暗之门",
+ ["The Deadmines"] = "死亡矿井",
+ ["The Descent into Madness"] = "疯狂阶梯",
+ ["The Exodar"] = "埃索达",
+ ["The Eye"] = "风暴要塞",
+ ["The Eye of Eternity"] = "永恒之眼",
+ ["The Forbidding Sea"] = "禁忌之海",
+ ["The Forge of Souls"] = "灵魂洪炉",
+ ["The Frozen Halls"] = "The Frozen Halls", -- Needs review
+ ["The Frozen Sea"] = "冰冻之海",
+ ["The Great Sea"] = "无尽之海",
+ ["The Halls of Winter"] = "寒冬之厅",
+ ["The Hinterlands"] = "辛特兰",
+ ["The Mechanar"] = "能源舰",
+ ["The Military Quarter"] = "军事区",
+ ["The Nexus"] = "魔枢",
+ ["The North Sea"] = "北海",
+ ["The Obsidian Sanctum"] = "黑曜石圣殿",
+ ["The Oculus"] = "魔环",
+ ["The Plague Quarter"] = "瘟疫区",
+ ["The Prison of Yogg-Saron"] = "尤格-萨隆的监狱",
+ ["Theramore Isle"] = "塞拉摩岛",
+ ["The Ring of Valor"] = "勇气竞技场",
+ ["The Ruby Sanctum"] = "红玉圣殿",
+ ["The Scarlet Enclave"] = "血色领地",
+ ["The Shattered Halls"] = "破碎大厅",
+ ["The Slave Pens"] = "奴隶围栏",
+ ["The Spark of Imagination"] = "思想火花",
+ ["The Steamvault"] = "蒸汽地窟",
+ ["The Stockade"] = "监狱",
+ ["The Storm Peaks"] = "风暴峭壁",
+ ["The Temple of Atal'Hakkar"] = "阿塔哈卡神庙",
+ ["The Underbog"] = "幽暗沼泽",
+ ["The Veiled Sea"] = "迷雾之海",
+ ["The Violet Hold"] = "紫罗兰监狱",
+ ["Thousand Needles"] = "千针石林",
+ ["Throne of the Tides"] = "Throne of the Tides", -- Needs review
+ ["Thunder Bluff"] = "雷霆崖",
+ Tirisfal = "提里斯法林地",
+ ["Tirisfal Glades"] = "提瑞斯法林地",
+ ["Trial of the Champion"] = "冠军的试炼",
+ ["Trial of the Crusader"] = "十字军的试炼",
+ ["Twisting Nether"] = "扭曲虚空",
+ Uldaman = "奥达曼",
+ Ulduar = "奥杜尔",
+ Undercity = "幽暗城",
+ ["Un'Goro Crater"] = "安戈洛环形山",
+ ["Upper Blackrock Spire"] = "上层黑石塔",
+ ["Utgarde Keep"] = "乌特加德城堡",
+ ["Utgarde Pinnacle"] = "乌特加德之巅",
+ ["Vashj'ir"] = "Vashj'ir", -- Needs review
+ ["Vault of Archavon"] = "阿尔卡冯的宝库",
+ ["Vortex Pinnacle"] = "漩涡峰",
+ ["Wailing Caverns"] = "哀嚎洞穴",
+ ["Warsong Gulch"] = "战歌峡谷",
+ ["Western Plaguelands"] = "西瘟疫之地",
+ Westfall = "西部荒野",
+ Wetlands = "湿地",
+ Wintergrasp = "冬拥湖",
+ Winterspring = "冬泉谷",
+ ["Wyrmrest Temple"] = "龙眠神殿",
+ Zangarmarsh = "赞加沼泽",
+ ["Zul'Aman"] = "祖阿曼",
+ ["Zul'Drak"] = "祖达克",
+ ["Zul'Farrak"] = "祖尔法拉克",
+ ["Zul'Gurub"] = "祖尔格拉布",
+}
+elseif GAME_LOCALE == "zhTW" then
+ lib:SetCurrentTranslations {
+ ["Abyssal Depths"] = "Abyssal Depths", -- Needs review
+ ["Ahn'kahet: The Old Kingdom"] = "安卡罕特:古王國",
+ ["Ahn'Qiraj"] = "安其拉",
+ ["Alliance Base"] = "聯盟營地",
+ ["Alterac Mountains"] = "奧特蘭克山脈",
+ ["Alterac Valley"] = "奧特蘭克山谷",
+ ["Amani Pass"] = "阿曼尼小俓",
+ ["Arathi Basin"] = "阿拉希盆地",
+ ["Arathi Highlands"] = "阿拉希高地",
+ Armory = "軍械庫",
+ Ashenvale = "梣谷",
+ Auberdine = "奧伯丁",
+ ["Auchenai Crypts"] = "奧奇奈地穴",
+ Auchindoun = "奧齊頓",
+ Azeroth = "艾澤拉斯",
+ ["Azjol-Nerub"] = "阿茲歐-奈幽",
+ Azshara = "艾薩拉",
+ ["Azuremyst Isle"] = "藍謎島",
+ Badlands = "荒蕪之地",
+ ["Bash'ir Landing"] = "貝許爾平臺",
+ ["Blackfathom Deeps"] = "黑暗深淵",
+ ["Blackrock Caverns"] = "Blackrock Caverns", -- Needs review
+ ["Blackrock Depths"] = "黑石深淵",
+ ["Blackrock Mountain"] = "黑石山",
+ ["Blackrock Spire"] = "黑石塔",
+ ["Black Temple"] = "黑暗神廟",
+ ["Blackwind Lake"] = "黑風湖",
+ ["Blackwing Lair"] = "黑翼之巢",
+ ["Blade's Edge Arena"] = "劍刃競技場",
+ ["Blade's Edge Mountains"] = "劍刃山脈",
+ ["Blasted Lands"] = "詛咒之地",
+ ["Bloodmyst Isle"] = "血謎島",
+ ["Booty Bay"] = "藏寶海灣",
+ ["Borean Tundra"] = "北風凍原",
+ ["Burning Steppes"] = "燃燒平原",
+ Cathedral = "教堂",
+ ["Caverns of Time"] = "時光之穴",
+ ["Champions' Hall"] = "勇士大廳",
+ ["Coilfang Reservoir"] = "盤牙洞穴",
+ Coldarra = "凜懼島",
+ ["Cosmic map"] = "宇宙地圖",
+ ["Crystalsong Forest"] = "水晶之歌森林",
+ ["Crystal Spine"] = "水晶背脊",
+ Dalaran = "達拉然",
+ ["Dalaran Arena"] = "達拉然競技場",
+ ["Dalaran Sewers"] = "達拉然下水道",
+ ["Darkmoon Faire"] = "暗月馬戲團",
+ Darkshore = "黑海岸",
+ Darnassus = "達納蘇斯",
+ ["Deadwind Pass"] = "逆風小徑",
+ Deepholm = "Deepholm", -- Needs review
+ ["Deeprun Tram"] = "礦道地鐵",
+ Desolace = "淒涼之地",
+ ["Dire Maul"] = "厄運之槌",
+ ["Dire Maul (East)"] = "厄運之槌 - 東",
+ ["Dire Maul (North)"] = "厄運之槌 - 北",
+ ["Dire Maul (West)"] = "厄運之槌 - 西",
+ Dragonblight = "龍骨荒野",
+ ["Drak'Tharon Keep"] = "德拉克薩隆要塞",
+ ["Dun Morogh"] = "丹莫洛",
+ Durotar = "杜洛塔",
+ Duskwood = "暮色森林",
+ ["Dustwallow Marsh"] = "塵泥沼澤",
+ ["Eastern Kingdoms"] = "東部王國",
+ ["Eastern Plaguelands"] = "東瘟疫之地",
+ ["Elwynn Forest"] = "艾爾文森林",
+ Everlook = "永望鎮",
+ ["Eversong Woods"] = "永歌森林",
+ ["Eye of the Storm"] = "暴風之眼",
+ Felwood = "費伍德森林",
+ Feralas = "菲拉斯",
+ ["Forge Camp: Terror"] = "煉冶場:驚駭",
+ ["Forge Camp: Wrath"] = "煉冶場:憤怒",
+ ["Frostwyrm Lair"] = "冰霜巨龍的巢穴",
+ ["Furywing's Perch"] = "狂怒之翼棲所",
+ Gadgetzan = "加基森",
+ ["Gates of Ahn'Qiraj"] = "安其拉之門",
+ Ghostlands = "鬼魂之地",
+ Gilneas = "吉爾尼斯", -- Needs review
+ ["Gilneas City"] = "吉爾尼斯城", -- Needs review
+ Gnomeregan = "諾姆瑞根",
+ Graveyard = "墓地",
+ ["Grim Batol"] = "Grim Batol", -- Needs review
+ ["Grizzly Hills"] = "灰白之丘",
+ ["Grom'gol Base Camp"] = "格羅姆高營地",
+ ["Gruul's Lair"] = "戈魯爾之巢",
+ Gundrak = "剛德拉克",
+ ["Hall of Champions"] = "勇士大廳",
+ ["Hall of Legends"] = "傳說大廳",
+ ["Halls of Lightning"] = "雷光大廳",
+ ["Halls of Reflection"] = "倒影大廳",
+ ["Halls of Stone"] = "石之大廳",
+ ["Hellfire Citadel"] = "地獄火堡壘",
+ ["Hellfire Peninsula"] = "地獄火半島",
+ ["Hellfire Ramparts"] = "地獄火壁壘",
+ ["Hillsbrad Foothills"] = "希爾斯布萊德丘陵",
+ ["Horde Encampment"] = "部落營地",
+ ["Howling Fjord"] = "凜風峽灣",
+ ["Hrothgar's Landing"] = "赫魯斯加臺地",
+ Hyjal = "海加爾山",
+ ["Hyjal Summit"] = "海加爾山",
+ Icecrown = "寒冰皇冠",
+ ["Icecrown Citadel"] = "冰冠城塞",
+ ["Insidion's Perch"] = "印希迪恩棲所",
+ Ironforge = "鐵爐堡",
+ ["Isle of Conquest"] = "征服之島",
+ ["Isle of Quel'Danas"] = "奎爾達納斯之島",
+ Kalimdor = "卡林多",
+ Karazhan = "卡拉贊",
+ ["Kelp Forest"] = "Kelp Forest", -- Needs review
+ Kezan = "卡贊", -- Needs review
+ ["Krasus' Landing"] = "卡薩斯平臺",
+ Library = "圖書館",
+ ["Loch Modan"] = "洛克莫丹",
+ ["Lower Blackrock Spire"] = "黑石塔",
+ ["Magisters' Terrace"] = "博學者殿堂",
+ ["Magtheridon's Lair"] = "瑪瑟里頓的巢穴",
+ ["Mana-Tombs"] = "法力墓地",
+ Maraudon = "瑪拉頓",
+ ["Marshlight Lake"] = "沼澤光之湖",
+ ["Menethil Harbor"] = "米奈希爾港",
+ ["Molten Core"] = "熔火之心",
+ Moonglade = "月光林地",
+ ["Mount Hyjal"] = "海加爾山", -- Needs review
+ Mulgore = "莫高雷",
+ Nagrand = "納葛蘭",
+ ["Nagrand Arena"] = "納葛蘭競技場",
+ Naxxramas = "納克薩瑪斯",
+ Netherstorm = "虛空風暴",
+ ["Night Elf Village"] = "夜精靈村",
+ ["Northern Barrens"] = "Northern Barrens", -- Needs review
+ ["Northern Stranglethorn"] = "Northern Stranglethorn", -- Needs review
+ Northrend = "北裂境",
+ ["Obsidia's Perch"] = "歐比希迪亞棲所",
+ ["Ogri'la"] = "歐格利拉",
+ ["Old Hillsbrad Foothills"] = "希爾斯布萊德丘陵舊址",
+ ["Old Stratholme"] = "舊斯坦索姆",
+ ["Onyxia's Lair"] = "奧妮克希亞的巢穴",
+ Orgrimmar = "奧格瑪",
+ Outland = "外域",
+ ["Pit of Saron"] = "薩倫之淵",
+ ["Plaguelands: The Scarlet Enclave"] = "東瘟疫之地: 血色領區",
+ Plaguewood = "病木林",
+ ["Quel'thalas"] = "奎爾薩拉斯",
+ ["Ragefire Chasm"] = "怒焰裂谷",
+ Ratchet = "棘齒城",
+ ["Razorfen Downs"] = "剃刀高地",
+ ["Razorfen Kraul"] = "剃刀沼澤",
+ ["Redridge Mountains"] = "赤脊山",
+ ["Ring of Observance"] = "儀式競技場",
+ ["Rivendark's Perch"] = "瑞文達科棲所",
+ ["Ruins of Ahn'Qiraj"] = "安其拉廢墟",
+ ["Ruins of Gilneas"] = "Ruins of Gilneas", -- Needs review
+ ["Ruins of Lordaeron"] = "羅德隆廢墟",
+ ["Scalebeard's Cave"] = "鱗鬚洞穴",
+ ["Scarlet Monastery"] = "血色修道院",
+ Scholomance = "通靈學院",
+ ["Searing Gorge"] = "灼熱峽谷",
+ ["Serpent Lake"] = "毒蛇之湖",
+ ["Serpentshrine Cavern"] = "毒蛇神殿洞穴",
+ ["Sethekk Halls"] = "塞司克大廳",
+ ["Shadowfang Keep"] = "影牙城堡",
+ ["Shadow Labyrinth"] = "暗影迷宮",
+ ["Shadowmoon Valley"] = "影月谷",
+ ["Shartuul's Transporter"] = "夏圖歐的傳送門",
+ Shattrath = "撒塔斯城",
+ ["Shattrath City"] = "撒塔斯城",
+ ["Shimmering Expanse"] = "Shimmering Expanse", -- Needs review
+ ["Sholazar Basin"] = "休拉薩盆地",
+ Silithus = "希利蘇斯",
+ ["Silvermoon City"] = "銀月城",
+ ["Silverpine Forest"] = "銀松森林",
+ ["Skyguard Outpost"] = "禦天者崗哨",
+ ["Skysong Lake"] = "天歌湖",
+ ["Southern Barrens"] = "Southern Barrens", -- Needs review
+ ["Sporewind Lake"] = "孢子風之湖",
+ Stonard = "斯通納德",
+ ["Stonetalon Mountains"] = "石爪山脈",
+ Stormwind = "暴風城",
+ ["Stormwind City"] = "暴風城",
+ ["Strand of the Ancients"] = "遠祖灘頭",
+ ["Stranglethorn Vale"] = "荊棘谷",
+ Stratholme = "斯坦索姆",
+ ["Sunken Temple"] = "沉沒的神廟",
+ ["Sunwell Plateau"] = "太陽之井高地",
+ ["Swamp of Sorrows"] = "悲傷沼澤",
+ Tanaris = "塔納利斯",
+ Teldrassil = "泰達希爾",
+ ["Tempest Keep"] = "風暴要塞",
+ ["Temple of Ahn'Qiraj"] = "安其拉神廟",
+ ["Terokkar Forest"] = "泰洛卡森林",
+ ["Terokk's Rest"] = "泰洛克之墓",
+ ["The Arachnid Quarter"] = "蜘蛛區",
+ ["The Arcatraz"] = "亞克崔茲",
+ ["The Argent Coliseum"] = "銀白大競技場",
+ ["The Barrens"] = "貧瘠之地",
+ ["The Black Morass"] = "黑色沼澤",
+ ["The Blood Furnace"] = "血熔爐",
+ ["The Bone Wastes"] = "白骨荒野",
+ ["The Botanica"] = "波塔尼卡",
+ ["The Construct Quarter"] = "傀儡區",
+ ["The Culling of Stratholme"] = "斯坦索姆的抉擇",
+ ["The Dark Portal"] = "黑暗之門",
+ ["The Deadmines"] = "死亡礦坑",
+ ["The Descent into Madness"] = "驟狂斜廊",
+ ["The Exodar"] = "艾克索達",
+ ["The Eye"] = "風暴要塞",
+ ["The Eye of Eternity"] = "永恆之眼",
+ ["The Forbidding Sea"] = "禁忌之海",
+ ["The Forge of Souls"] = "眾魂熔爐",
+ ["The Frozen Halls"] = "冰封大廳",
+ ["The Frozen Sea"] = "冰凍之海",
+ ["The Great Sea"] = "無盡之海",
+ ["The Halls of Winter"] = "凜冬之廳",
+ ["The Hinterlands"] = "辛特蘭",
+ ["The Mechanar"] = "麥克納爾",
+ ["The Military Quarter"] = "軍事區",
+ ["The Nexus"] = "奧核之心",
+ ["The North Sea"] = "北海",
+ ["The Obsidian Sanctum"] = "黑曜聖所",
+ ["The Oculus"] = "奧核之眼",
+ ["The Plague Quarter"] = "瘟疫區",
+ ["The Prison of Yogg-Saron"] = "尤格薩倫之獄",
+ ["Theramore Isle"] = "塞拉摩島",
+ ["The Ring of Valor"] = "勇武之環",
+ ["The Ruby Sanctum"] = "晶紅聖所",
+ ["The Scarlet Enclave"] = "血色領區",
+ ["The Shattered Halls"] = "破碎大廳",
+ ["The Slave Pens"] = "奴隸監獄",
+ ["The Spark of Imagination"] = "創思之廳",
+ ["The Steamvault"] = "蒸汽洞窟",
+ ["The Stockade"] = "監獄",
+ ["The Storm Peaks"] = "風暴群山",
+ ["The Temple of Atal'Hakkar"] = "阿塔哈卡神廟",
+ ["The Underbog"] = "深幽泥沼",
+ ["The Veiled Sea"] = "迷霧之海",
+ ["The Violet Hold"] = "紫羅蘭堡",
+ ["Thousand Needles"] = "千針石林",
+ ["Throne of the Tides"] = "Throne of the Tides", -- Needs review
+ ["Thunder Bluff"] = "雷霆崖",
+ Tirisfal = "提里斯法林地",
+ ["Tirisfal Glades"] = "提里斯法林地",
+ ["Trial of the Champion"] = "勇士試煉",
+ ["Trial of the Crusader"] = "十字軍試煉",
+ ["Twisting Nether"] = "扭曲虛空",
+ Uldaman = "奧達曼",
+ Ulduar = "奧杜亞",
+ Undercity = "幽暗城",
+ ["Un'Goro Crater"] = "安戈洛環形山",
+ ["Upper Blackrock Spire"] = "黑石塔上層",
+ ["Utgarde Keep"] = "俄特加德要塞",
+ ["Utgarde Pinnacle"] = "俄特加德之巔",
+ ["Vashj'ir"] = "Vashj'ir", -- Needs review
+ ["Vault of Archavon"] = "亞夏梵穹殿",
+ ["Vortex Pinnacle"] = "漩渦尖塔",
+ ["Wailing Caverns"] = "哀嚎洞穴",
+ ["Warsong Gulch"] = "戰歌峽谷",
+ ["Western Plaguelands"] = "西瘟疫之地",
+ Westfall = "西部荒野",
+ Wetlands = "濕地",
+ Wintergrasp = "冬握湖",
+ Winterspring = "冬泉谷",
+ ["Wyrmrest Temple"] = "龍眠神殿",
+ Zangarmarsh = "贊格沼澤",
+ ["Zul'Aman"] = "祖阿曼",
+ ["Zul'Drak"] = "祖爾德拉克",
+ ["Zul'Farrak"] = "祖爾法拉克",
+ ["Zul'Gurub"] = "祖爾格拉布",
+}
+
+else
+ error(("%s: Locale %q not supported"):format(MAJOR_VERSION, GAME_LOCALE))
+end
diff --git a/AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-Zone-3.0.toc b/AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-Zone-3.0.toc
new file mode 100644
index 0000000..02d1db9
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Zone-3.0/LibBabble-Zone-3.0.toc
@@ -0,0 +1,18 @@
+## Interface: 30300
+## LoadOnDemand: 1
+## Title: Lib: Babble-Zone-3.0
+## Notes: A library to help with localization of Zones.
+## Notes-deDE: BabbleLib ist eine Bibliothek, die bei der Lokalisierung helfen soll.
+## Notes-frFR: Une bibliothèque d'aide à la localisation.
+## Notes-esES: Una biblioteca para ayudar con las localizaciones.
+## Author: ckknight
+## X-eMail: ckknight@gmail.com
+## X-Category: Library
+## X-License: MIT
+## X-Curse-Packaged-Version: r277
+## X-Curse-Project-Name: LibBabble-Zone-3.0
+## X-Curse-Project-ID: libbabble-zone-3-0
+## X-Curse-Repository-ID: wow/libbabble-zone-3-0/mainline
+
+LibStub\LibStub.lua
+lib.xml
diff --git a/AtlasLoot/Libs/LibBabble-Zone-3.0/LibStub/LibStub.lua b/AtlasLoot/Libs/LibBabble-Zone-3.0/LibStub/LibStub.lua
new file mode 100644
index 0000000..cfc97de
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Zone-3.0/LibStub/LibStub.lua
@@ -0,0 +1,30 @@
+-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
+-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
+local LibStub = _G[LIBSTUB_MAJOR]
+
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+ LibStub = LibStub or {libs = {}, minors = {} }
+ _G[LIBSTUB_MAJOR] = LibStub
+ LibStub.minor = LIBSTUB_MINOR
+
+ function LibStub:NewLibrary(major, minor)
+ assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+ minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
+
+ local oldminor = self.minors[major]
+ if oldminor and oldminor >= minor then return nil end
+ self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+ return self.libs[major], oldminor
+ end
+
+ function LibStub:GetLibrary(major, silent)
+ if not self.libs[major] and not silent then
+ error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
+ end
+ return self.libs[major], self.minors[major]
+ end
+
+ function LibStub:IterateLibraries() return pairs(self.libs) end
+ setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
diff --git a/AtlasLoot/Libs/LibBabble-Zone-3.0/lib.xml b/AtlasLoot/Libs/LibBabble-Zone-3.0/lib.xml
new file mode 100644
index 0000000..07af556
--- /dev/null
+++ b/AtlasLoot/Libs/LibBabble-Zone-3.0/lib.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/AtlasLoot/Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua b/AtlasLoot/Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua
new file mode 100644
index 0000000..04b5037
--- /dev/null
+++ b/AtlasLoot/Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua
@@ -0,0 +1,66 @@
+
+assert(LibStub, "LibDataBroker-1.1 requires LibStub")
+assert(LibStub:GetLibrary("CallbackHandler-1.0", true), "LibDataBroker-1.1 requires CallbackHandler-1.0")
+
+local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 3)
+if not lib then return end
+oldminor = oldminor or 0
+
+
+lib.callbacks = lib.callbacks or LibStub:GetLibrary("CallbackHandler-1.0"):New(lib)
+lib.attributestorage, lib.namestorage, lib.proxystorage = lib.attributestorage or {}, lib.namestorage or {}, lib.proxystorage or {}
+local attributestorage, namestorage, callbacks = lib.attributestorage, lib.namestorage, lib.callbacks
+
+if oldminor < 2 then
+ lib.domt = {
+ __metatable = "access denied",
+ __index = function(self, key) return attributestorage[self] and attributestorage[self][key] end,
+ }
+end
+
+if oldminor < 3 then
+ lib.domt.__newindex = function(self, key, value)
+ if not attributestorage[self] then attributestorage[self] = {} end
+ if attributestorage[self][key] == value then return end
+ attributestorage[self][key] = value
+ local name = namestorage[self]
+ if not name then return end
+ callbacks:Fire("LibDataBroker_AttributeChanged", name, key, value, self)
+ callbacks:Fire("LibDataBroker_AttributeChanged_"..name, name, key, value, self)
+ callbacks:Fire("LibDataBroker_AttributeChanged_"..name.."_"..key, name, key, value, self)
+ callbacks:Fire("LibDataBroker_AttributeChanged__"..key, name, key, value, self)
+ end
+end
+
+if oldminor < 2 then
+ function lib:NewDataObject(name, dataobj)
+ if self.proxystorage[name] then return end
+
+ if dataobj then
+ assert(type(dataobj) == "table", "Invalid dataobj, must be nil or a table")
+ self.attributestorage[dataobj] = {}
+ for i,v in pairs(dataobj) do
+ self.attributestorage[dataobj][i] = v
+ dataobj[i] = nil
+ end
+ end
+ dataobj = setmetatable(dataobj or {}, self.domt)
+ self.proxystorage[name], self.namestorage[dataobj] = dataobj, name
+ self.callbacks:Fire("LibDataBroker_DataObjectCreated", name, dataobj)
+ return dataobj
+ end
+end
+
+if oldminor < 1 then
+ function lib:DataObjectIterator()
+ return pairs(self.proxystorage)
+ end
+
+ function lib:GetDataObjectByName(dataobjectname)
+ return self.proxystorage[dataobjectname]
+ end
+
+ function lib:GetNameByDataObject(dataobject)
+ return self.namestorage[dataobject]
+ end
+end
diff --git a/AtlasLoot/Libs/LibStub/LibStub.lua b/AtlasLoot/Libs/LibStub/LibStub.lua
new file mode 100644
index 0000000..cfc97de
--- /dev/null
+++ b/AtlasLoot/Libs/LibStub/LibStub.lua
@@ -0,0 +1,30 @@
+-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
+-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
+local LibStub = _G[LIBSTUB_MAJOR]
+
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+ LibStub = LibStub or {libs = {}, minors = {} }
+ _G[LIBSTUB_MAJOR] = LibStub
+ LibStub.minor = LIBSTUB_MINOR
+
+ function LibStub:NewLibrary(major, minor)
+ assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+ minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
+
+ local oldminor = self.minors[major]
+ if oldminor and oldminor >= minor then return nil end
+ self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+ return self.libs[major], oldminor
+ end
+
+ function LibStub:GetLibrary(major, silent)
+ if not self.libs[major] and not silent then
+ error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
+ end
+ return self.libs[major], self.minors[major]
+ end
+
+ function LibStub:IterateLibraries() return pairs(self.libs) end
+ setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
diff --git a/AtlasLoot/Libs/LibStub/LibStub.toc b/AtlasLoot/Libs/LibStub/LibStub.toc
new file mode 100644
index 0000000..b43e20c
--- /dev/null
+++ b/AtlasLoot/Libs/LibStub/LibStub.toc
@@ -0,0 +1,13 @@
+## Interface: 20400
+## Title: Lib: LibStub
+## Notes: Universal Library Stub
+## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
+## X-Website: http://jira.wowace.com/browse/LS
+## X-Category: Library
+## X-License: Public Domain
+## X-Curse-Packaged-Version: 1.0
+## X-Curse-Project-Name: LibStub
+## X-Curse-Project-ID: libstub
+## X-Curse-Repository-ID: wow/libstub/mainline
+
+LibStub.lua