diff --git a/!Compatibility/!Compatibility.toc b/!Compatibility/!Compatibility.toc
new file mode 100644
index 0000000..e4481b2
--- /dev/null
+++ b/!Compatibility/!Compatibility.toc
@@ -0,0 +1,8 @@
+## Interface: 20400
+## Title: !Compatibility
+## Notes: Compatibility functions for TBC
+## Version: 1.0
+
+errorHandler.lua
+api\api.xml
+slashCommands.lua
\ No newline at end of file
diff --git a/!Compatibility/api/api.xml b/!Compatibility/api/api.xml
new file mode 100644
index 0000000..46e4dfa
--- /dev/null
+++ b/!Compatibility/api/api.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/!Compatibility/api/luaAPI.lua b/!Compatibility/api/luaAPI.lua
new file mode 100644
index 0000000..888c73f
--- /dev/null
+++ b/!Compatibility/api/luaAPI.lua
@@ -0,0 +1,86 @@
+--Cache global variables
+local error = error
+local geterrorhandler = geterrorhandler
+local pairs = pairs
+local pcall = pcall
+local securecall = securecall
+local select = select
+local tostring = tostring
+local type = type
+local unpack = unpack
+
+function table.wipe(t)
+ assert(type(t) == "table", format("bad argument #1 to 'wipe' (table expected, got %s)", t and type(t) or "no value"))
+
+ for k in pairs(t) do
+ t[k] = nil
+ end
+
+ return t
+end
+wipe = table.wipe
+
+local LOCAL_ToStringAllTemp = {}
+function tostringall(...)
+ local n = select('#', ...)
+ -- Simple versions for common argument counts
+ if (n == 1) then
+ return tostring(...)
+ elseif (n == 2) then
+ local a, b = ...
+ return tostring(a), tostring(b)
+ elseif (n == 3) then
+ local a, b, c = ...
+ return tostring(a), tostring(b), tostring(c)
+ elseif (n == 0) then
+ return
+ end
+
+ local needfix
+ for i = 1, n do
+ local v = select(i, ...)
+ if (type(v) ~= "string") then
+ needfix = i
+ break
+ end
+ end
+ if (not needfix) then return ... end
+
+ wipe(LOCAL_ToStringAllTemp)
+ for i = 1, needfix - 1 do
+ LOCAL_ToStringAllTemp[i] = select(i, ...)
+ end
+ for i = needfix, n do
+ LOCAL_ToStringAllTemp[i] = tostring(select(i, ...))
+ end
+ return unpack(LOCAL_ToStringAllTemp)
+end
+
+local LOCAL_PrintHandler = function(...)
+ DEFAULT_CHAT_FRAME:AddMessage(strjoin(" ", tostringall(...)))
+end
+
+function setprinthandler(func)
+ if (type(func) ~= "function") then
+ error("Invalid print handler")
+ else
+ LOCAL_PrintHandler = func
+ end
+end
+
+function getprinthandler() return LOCAL_PrintHandler end
+
+local function print_inner(...)
+ local ok, err = pcall(LOCAL_PrintHandler, ...)
+ if (not ok) then
+ local func = geterrorhandler()
+ func(err)
+ end
+end
+
+function print(...)
+ securecall(pcall, print_inner, ...)
+end
+
+SLASH_PRINT1 = "/print"
+SlashCmdList["PRINT"] = print
\ No newline at end of file
diff --git a/!Compatibility/api/widgetAPI.lua b/!Compatibility/api/widgetAPI.lua
new file mode 100644
index 0000000..59a731a
--- /dev/null
+++ b/!Compatibility/api/widgetAPI.lua
@@ -0,0 +1,51 @@
+--Cache global variables
+local assert = assert
+local format = string.format
+local tonumber = tonumber
+local type = type
+
+local function GetSize(frame)
+ return frame:GetWidth(), frame:GetHeight()
+end
+
+local function SetSize(frame, width, height)
+ width, height = tonumber(width), tonumber(height)
+
+ assert(type(width) == "number" or type(width) == "string", format("Usage: %s:SetSize(width, height)", frame.GetName and frame:GetName() or tostring(frame)))
+
+ frame:SetWidth(width)
+ frame:SetHeight(type(height) == "number" and height or width)
+end
+
+local function HookScript2(frame, scriptType, handler)
+ assert((type(scriptType) == "string" or type(scriptType) == "number") and type(handler) == "function", format("Usage: %s:HookScript2(\"type\", function)", frame.GetName and frame:GetName() or tostring(frame)))
+
+ if frame:GetScript(scriptType) then
+ frame:HookScript(scriptType, handler)
+ else
+ frame:SetScript(scriptType, handler)
+ end
+end
+
+local function addapi(object)
+ local mt = getmetatable(object).__index
+ if not object.GetSize then mt.GetSize = GetSize end
+ if not object.SetSize then mt.SetSize = SetSize end
+ if not object.HookScript2 then mt.HookScript2 = HookScript2 end
+end
+
+local handled = {["Frame"] = true}
+local object = CreateFrame("Frame")
+addapi(object)
+addapi(object:CreateTexture())
+addapi(object:CreateFontString())
+
+object = EnumerateFrames()
+while object do
+ if not handled[object:GetObjectType()] then
+ addapi(object)
+ handled[object:GetObjectType()] = true
+ end
+
+ object = EnumerateFrames(object)
+end
\ No newline at end of file
diff --git a/!Compatibility/api/wowAPI.lua b/!Compatibility/api/wowAPI.lua
new file mode 100644
index 0000000..9af1bfc
--- /dev/null
+++ b/!Compatibility/api/wowAPI.lua
@@ -0,0 +1,313 @@
+--Cache global variables
+local assert = assert
+local date = date
+local pairs = pairs
+local tonumber = tonumber
+local type = type
+local format, gsub, lower, match, upper = string.format, string.gsub, string.lower, string.match, string.upper
+--WoW API
+local GetCurrentDungeonDifficulty = GetCurrentDungeonDifficulty
+local GetQuestGreenRange = GetQuestGreenRange
+local GetRealZoneText = GetRealZoneText
+local IsInInstance = IsInInstance
+local UnitBuff = UnitBuff
+local UnitDebuff = UnitDebuff
+local UnitLevel = UnitLevel
+--WoW Variables
+local DUNGEON_DIFFICULTY1 = DUNGEON_DIFFICULTY1
+local DUNGEON_DIFFICULTY2 = DUNGEON_DIFFICULTY2
+local TIMEMANAGER_AM = TIMEMANAGER_AM
+local TIMEMANAGER_PM = TIMEMANAGER_PM
+--Libs
+local LBC = LibStub("LibBabble-Class-3.0"):GetLookupTable()
+local LBZ = LibStub("LibBabble-Zone-3.0"):GetLookupTable()
+
+CLASS_SORT_ORDER = {
+ "WARRIOR",
+ "PALADIN",
+ "PRIEST",
+ "SHAMAN",
+ "DRUID",
+ "ROGUE",
+ "MAGE",
+ "WARLOCK",
+ "HUNTER"
+}
+MAX_CLASSES = #CLASS_SORT_ORDER
+
+LOCALIZED_CLASS_NAMES_MALE = {}
+LOCALIZED_CLASS_NAMES_FEMALE = {}
+
+CLASS_ICON_TCOORDS = {
+ ["WARRIOR"] = {0, 0.25, 0, 0.25},
+ ["MAGE"] = {0.25, 0.49609375, 0, 0.25},
+ ["ROGUE"] = {0.49609375, 0.7421875, 0, 0.25},
+ ["DRUID"] = {0.7421875, 0.98828125, 0, 0.25},
+ ["HUNTER"] = {0, 0.25, 0.25, 0.5},
+ ["SHAMAN"] = {0.25, 0.49609375, 0.25, 0.5},
+ ["PRIEST"] = {0.49609375, 0.7421875, 0.25, 0.5},
+ ["WARLOCK"] = {0.7421875, 0.98828125, 0.25, 0.5},
+ ["PALADIN"] = {0, 0.25, 0.5, 0.75}
+}
+
+QuestDifficultyColors = {
+ ["impossible"] = {r = 1.00, g = 0.10, b = 0.10},
+ ["verydifficult"] = {r = 1.00, g = 0.50, b = 0.25},
+ ["difficult"] = {r = 1.00, g = 1.00, b = 0.00},
+ ["standard"] = {r = 0.25, g = 0.75, b = 0.25},
+ ["trivial"] = {r = 0.50, g = 0.50, b = 0.50},
+ ["header"] = {r = 0.70, g = 0.70, b = 0.70}
+}
+
+function UnitAura(unit, i, filter)
+ assert((type(unit) == "string" or type(unit) == "number") and (type(i) == "string" or type(i) == "number"), "Usage: UnitAura(\"unit\", index [, filter])")
+
+ if not filter or match(filter, "(HELPFUL)") then
+ local name, rank, aura, count, duration, maxDuration = UnitBuff(unit, i, filter)
+ return name, rank, aura, count, nil, duration or 0, maxDuration or 0
+ else
+ local name, rank, aura, count, dType, duration, maxDuration = UnitDebuff(unit, i, filter)
+ return name, rank, aura, count, dType, duration or 0, maxDuration or 0
+ end
+end
+
+function BetterDate(formatString, timeVal)
+ local dateTable = date("*t", timeVal)
+ local amString = (dateTable.hour >= 12) and TIMEMANAGER_PM or TIMEMANAGER_AM
+
+ --First, we'll replace %p with the appropriate AM or PM.
+ formatString = gsub(formatString, "^%%p", amString) --Replaces %p at the beginning of the string with the am/pm token
+ formatString = gsub(formatString, "([^%%])%%p", "%1"..amString) -- Replaces %p anywhere else in the string, but doesn't replace %%p (since the first % escapes the second)
+
+ return date(formatString, timeVal)
+end
+
+function GetQuestDifficultyColor(level)
+ local levelDiff = level - UnitLevel("player")
+ if levelDiff >= 5 then
+ return QuestDifficultyColors["impossible"]
+ elseif levelDiff >= 3 then
+ return QuestDifficultyColors["verydifficult"]
+ elseif levelDiff >= -2 then
+ return QuestDifficultyColors["difficult"]
+ elseif -levelDiff <= GetQuestGreenRange() then
+ return QuestDifficultyColors["standard"]
+ else
+ return QuestDifficultyColors["trivial"]
+ end
+end
+
+function FillLocalizedClassList(tab, female)
+ assert(type(tab) == "table", "Usage: FillLocalizedClassList(classTable[, isFemale])")
+
+ for _, engClass in ipairs(CLASS_SORT_ORDER) do
+ if female then
+ tab[engClass] = LBC[engClass]
+ else
+ tab[engClass] = LBC[engClass:lower():gsub("^%l", upper)]
+ end
+ end
+
+ return true
+end
+
+FillLocalizedClassList(LOCALIZED_CLASS_NAMES_MALE)
+FillLocalizedClassList(LOCALIZED_CLASS_NAMES_FEMALE, true)
+
+local zoneInfo = {
+ -- Battlegrounds
+ [LBZ["Warsong Gulch"]] = {mapID = 443, maxPlayers = 10},
+ [LBZ["Arathi Basin"]] = {mapID = 461, maxPlayers = 15},
+ [LBZ["Alterac Valley"]] = {mapID = 401, maxPlayers = 40},
+ -- TBC
+ [LBZ["Eye of the Storm"]] = {mapID = 566, maxPlayers = 15},
+
+ -- Raids
+ [LBZ["Zul'Gurub"]] = {mapID = 309, maxPlayers = 20},
+ [LBZ["Onyxia's Lair"]] = {mapID = 249, maxPlayers = 40},
+ [LBZ["Molten Core"]] = {mapID = 409, maxPlayers = 40},
+ [LBZ["Ruins of Ahn'Qiraj"]] = {mapID = 509, maxPlayers = 20},
+ [LBZ["Temple of Ahn'Qiraj"]] = {mapID = 531, maxPlayers = 40},
+ [LBZ["Blackwing Lair"]] = {mapID = 469, maxPlayers = 40},
+-- [LBZ["Naxxramas"]] = {mapID = 533, maxPlayers = 40},
+ -- TBC
+ [LBZ["Karazhan"]] = {mapID = 532, maxPlayers = 10},
+ [LBZ["Gruul's Lair"]] = {mapID = 565, maxPlayers = 25},
+ [LBZ["Magtheridon's Lair"]] = {mapID = 544, maxPlayers = 25},
+ [LBZ["Zul'Aman"]] = {mapID = 568, maxPlayers = 10},
+ [LBZ["Serpentshrine Cavern"]] = {mapID = 548, maxPlayers = 25},
+ [LBZ["The Eye"]] = {mapID = 550, maxPlayers = 25},
+ [LBZ["Hyjal Summit"]] = {mapID = 534, maxPlayers = 25},
+ [LBZ["Black Temple"]] = {mapID = 564, maxPlayers = 25},
+ [LBZ["Sunwell Plateau"]] = {mapID = 580, maxPlayers = 25},
+}
+
+local mapByID = {}
+for mapName in pairs(zoneInfo) do
+ mapByID[zoneInfo[mapName].mapID] = mapName
+end
+
+local function GetMaxPlayersByType(instanceType, zoneName)
+ if instanceType == "none" then
+ return 40
+ elseif instanceType == "party" then
+ return 5
+ elseif instanceType == "arena" then
+ return 5
+ elseif zoneName ~= "" and zoneInfo[zoneName] then
+ if instanceType == "pvp" then
+ return zoneInfo[zoneName].maxPlayers
+ elseif instanceType == "raid" then
+ return zoneInfo[zoneName].maxPlayers
+ end
+ else
+ return 0
+ end
+end
+
+function GetInstanceInfo()
+ local inInstance, instanceType = IsInInstance()
+ if not inInstance then return end
+
+ local name = GetRealZoneText()
+
+ local difficulty = GetCurrentDungeonDifficulty()
+ local difficultyName = difficulty == 1 and DUNGEON_DIFFICULTY1 or DUNGEON_DIFFICULTY2
+ local maxPlayers = GetMaxPlayersByType(instanceType, name)
+
+ difficultyName = format("%d %s", maxPlayers, difficultyName)
+
+ return name, instanceType, difficulty, difficultyName, maxPlayers
+end
+
+function GetCurrentMapAreaID()
+ if not IsInInstance() then return end
+ local zoneName = GetRealZoneText()
+
+ if zoneName ~= "" and zoneInfo[zoneName] then
+ return zoneInfo[zoneName].mapID
+ else
+ return 0
+ end
+end
+
+function GetMapNameByID(id)
+ assert(type(id) == "string" or type(id) == "number", format("Bad argument #1 to \"GetMapNameByID\" (number expected, got %s)", id and type(id) or "no value"))
+
+ return mapByID[tonumber(id)]
+end
+
+local arrow
+function GetPlayerFacing()
+ if not arrow then
+ local obj = Minimap
+ for i = 1, obj:GetNumChildren() do
+ local child = select(i, obj:GetChildren())
+ if child and child.GetModel and child:GetModel() == "interface\\minimap\\minimaparrow.m2" then
+ arrow = child
+ break
+ end
+ end
+ end
+
+ return arrow and arrow:GetFacing()
+end
+
+function ToggleFrame(frame)
+ if frame:IsShown() then
+ HideUIPanel(frame)
+ else
+ ShowUIPanel(frame)
+ end
+end
+
+local function OnOrientationChanged(self, orientation)
+ self.texturePointer.verticalOrientation = orientation == "VERTICAL"
+
+ if self.texturePointer.verticalOrientation then
+ self.texturePointer:SetPoint("BOTTOMLEFT", self)
+ else
+ self.texturePointer:SetPoint("LEFT", self)
+ end
+end
+
+local function OnSizeChanged(self, width, height)
+ self.texturePointer.width = width
+ self.texturePointer.height = height
+ self.texturePointer:SetWidth(width)
+ self.texturePointer:SetHeight(height)
+end
+
+local function OnValueChanged(self, value)
+ local _, max = self:GetMinMaxValues()
+
+ if self.texturePointer.verticalOrientation then
+ self.texturePointer:SetHeight(self.texturePointer.height * (value / max))
+ else
+ self.texturePointer:SetWidth(self.texturePointer.width * (value / max))
+ end
+end
+
+function CreateStatusBarTexturePointer(statusbar)
+ assert(type(statusbar) == "table", format("Bad argument #1 to \"CreateStatusBarTexturePointer\" (table expected, got %s)", statusbar and type(statusbar) or "no value"))
+ assert(statusbar.GetObjectType and statusbar:GetObjectType() == "StatusBar", "Bad argument #1 to \"CreateStatusBarTexturePointer\" (statusbar object expected)")
+
+ local f = statusbar:CreateTexture()
+ f.width = statusbar:GetWidth()
+ f.height = statusbar:GetHeight()
+ f.vertical = statusbar:GetOrientation() == "VERTICAL"
+ f:SetWidth(f.width)
+ f:SetHeight(f.height)
+
+ if f.verticalOrientation then
+ f:SetPoint("BOTTOMLEFT", statusbar)
+ else
+ f:SetPoint("LEFT", statusbar)
+ end
+
+ statusbar.texturePointer = f
+
+ statusbar:SetScript("OnSizeChanged", OnSizeChanged)
+ statusbar:SetScript("OnValueChanged", OnValueChanged)
+
+ hooksecurefunc(statusbar, "SetOrientation", OnOrientationChanged)
+
+ return f
+end
+
+local threatColors = {
+ [0] = {0.69, 0.69, 0.69},
+ [1] = {1, 1, 0.47},
+ [2] = {1, 0.6, 0},
+ [3] = {1, 0, 0}
+}
+
+function GetThreatStatusColor(statusIndex)
+ if not (type(statusIndex) == "number" and statusIndex >= 0 and statusIndex < 4) then
+ statusIndex = 0
+ end
+
+ return threatColors[statusIndex][1], threatColors[statusIndex][2], threatColors[statusIndex][3]
+end
+
+
+function GetThreatStatus(currentThreat, maxThreat)
+ assert(type(currentThreat) == "number" and type(maxThreat) == "number", "Usage: GetThreatStatus(currentThreat, maxThreat)")
+
+ if not maxThreat or maxThreat == 0 then
+ maxThreat = 0
+ maxThreat = 1
+ end
+
+ local threatPercent = currentThreat / maxThreat * 100
+
+ if threatPercent >= 100 then
+ return 3, threatPercent
+ elseif threatPercent < 100 and threatPercent >= 80 then
+ return 2, threatPercent
+ elseif threatPercent < 80 and threatPercent >= 50 then
+ return 1, threatPercent
+ else
+ return 0, threatPercent
+ end
+end
\ No newline at end of file
diff --git a/!Compatibility/errorHandler.lua b/!Compatibility/errorHandler.lua
new file mode 100644
index 0000000..b859e49
--- /dev/null
+++ b/!Compatibility/errorHandler.lua
@@ -0,0 +1,46 @@
+--Cache global variables
+local strmatch = strmatch
+--WoW API
+local GetCVar = GetCVar
+local IsAddOnLoaded = IsAddOnLoaded
+local LoadAddOn = LoadAddOn
+
+local _ERROR_COUNT = 0
+local _ERROR_LIMIT = 1000
+
+function _ERRORMESSAGE_NEW(message)
+ debuginfo()
+
+ LoadAddOn("!DebugTools")
+ local loaded = IsAddOnLoaded("!DebugTools")
+
+ if (GetCVar("scriptErrors") == "1") then
+ if (not loaded or DEBUG_DEBUGTOOLS) then
+ ScriptErrors_Message:SetText(message)
+ ScriptErrors:Show()
+ if (DEBUG_DEBUGTOOLS) then
+ ScriptErrorsFrame_OnError(message)
+ end
+ else
+ ScriptErrorsFrame_OnError(message)
+ end
+ elseif (loaded) then
+ ScriptErrorsFrame_OnError(message, true)
+ end
+
+ _ERROR_COUNT = _ERROR_COUNT + 1
+ if (_ERROR_COUNT == _ERROR_LIMIT) then
+ StaticPopup_Show("TOO_MANY_LUA_ERRORS")
+ end
+
+ return message
+end
+
+seterrorhandler(_ERRORMESSAGE_NEW)
+
+function message(text)
+ if (not ScriptErrors:IsShown()) then
+ ScriptErrors_Message:SetText(text)
+ ScriptErrors:Show()
+ end
+end
\ No newline at end of file
diff --git a/!Compatibility/libs/LibBabble-3.0.lua b/!Compatibility/libs/LibBabble-3.0.lua
new file mode 100644
index 0000000..d9003a6
--- /dev/null
+++ b/!Compatibility/libs/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
\ No newline at end of file
diff --git a/!Compatibility/libs/LibBabble-Class-3.0.lua b/!Compatibility/libs/LibBabble-Class-3.0.lua
new file mode 100644
index 0000000..cfb5ec1
--- /dev/null
+++ b/!Compatibility/libs/LibBabble-Class-3.0.lua
@@ -0,0 +1,239 @@
+--[[
+Name: LibBabble-Class-3.0
+Revision: $Rev: 50 $
+Author(s): ckknight (ckknight@gmail.com)
+Website: http://ckknight.wowinterface.com/
+Dependencies: None
+License: MIT
+]]
+
+local MAJOR_VERSION = "LibBabble-Class-3.0"
+local MINOR_VERSION = 90000 + tonumber(("$Revision: 50 $"):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 {
+ Warlock = true,
+ Warrior = true,
+ Hunter = true,
+ Mage = true,
+ Priest = true,
+ Druid = true,
+ Paladin = true,
+ Shaman = true,
+ Rogue = true,
+ Deathknight = "Death Knight",
+
+ WARLOCK = true,
+ WARRIOR = true,
+ HUNTER = true,
+ MAGE = true,
+ PRIEST = true,
+ DRUID = true,
+ PALADIN = true,
+ SHAMAN = true,
+ ROGUE = true,
+ DEATHKNIGHT = "Death Knight",
+}
+
+if GAME_LOCALE == "enUS" then
+ lib:SetCurrentTranslations(true)
+elseif GAME_LOCALE == "deDE" then
+ lib:SetCurrentTranslations {
+ ["Warlock"] = "Hexenmeister",
+ ["Warrior"] = "Krieger",
+ ["Hunter"] = "Jäger",
+ ["Mage"] = "Magier",
+ ["Priest"] = "Priester",
+ ["Druid"] = "Druide",
+ ["Paladin"] = "Paladin",
+ ["Shaman"] = "Schamane",
+ ["Rogue"] = "Schurke",
+ ["Deathknight"] = "Todesritter",
+
+ ["WARLOCK"] = "Hexenmeisterin",
+ ["WARRIOR"] = "Kriegerin",
+ ["HUNTER"] = "Jägerin",
+ ["MAGE"] = "Magierin",
+ ["PRIEST"] = "Priesterin",
+ ["DRUID"] = "Druidin",
+ ["PALADIN"] = "Paladin",
+ ["SHAMAN"] = "Schamanin",
+ ["ROGUE"] = "Schurkin",
+ ["DEATHKNIGHT"] = "Todesritter",
+ }
+elseif GAME_LOCALE == "frFR" then
+ lib:SetCurrentTranslations {
+ ["Warlock"] = "Démoniste",
+ ["Warrior"] = "Guerrier",
+ ["Hunter"] = "Chasseur",
+ ["Mage"] = "Mage",
+ ["Priest"] = "Prêtre",
+ ["Druid"] = "Druide",
+ ["Paladin"] = "Paladin",
+ ["Shaman"] = "Chaman",
+ ["Rogue"] = "Voleur",
+ ["Deathknight"] = "Chevalier de la mort",
+
+ ["WARLOCK"] = "Démoniste",
+ ["WARRIOR"] = "Guerrière",
+ ["HUNTER"] = "Chasseresse",
+ ["MAGE"] = "Mage",
+ ["PRIEST"] = "Prêtresse",
+ ["DRUID"] = "Druidesse",
+ ["PALADIN"] = "Paladin",
+ ["SHAMAN"] = "Chamane",
+ ["ROGUE"] = "Voleuse",
+ ["DEATHKNIGHT"] = "Chevalier de la mort",
+ }
+elseif GAME_LOCALE == "zhCN" then
+ lib:SetCurrentTranslations {
+ ["Warlock"] = "术士",
+ ["Warrior"] = "战士",
+ ["Hunter"] = "猎人",
+ ["Mage"] = "法师",
+ ["Priest"] = "牧师",
+ ["Druid"] = "德鲁伊",
+ ["Paladin"] = "圣骑士",
+ ["Shaman"] = "萨满祭司",
+ ["Rogue"] = "潜行者",
+ ["Deathknight"] = "死亡骑士",
+
+ ["WARLOCK"] = "术士",
+ ["WARRIOR"] = "战士",
+ ["HUNTER"] = "猎人",
+ ["MAGE"] = "法师",
+ ["PRIEST"] = "牧师",
+ ["DRUID"] = "德鲁伊",
+ ["PALADIN"] = "圣骑士",
+ ["SHAMAN"] = "萨满祭司",
+ ["ROGUE"] = "潜行者",
+ ["DEATHKNIGHT"] = "死亡骑士",
+ }
+elseif GAME_LOCALE == "zhTW" then
+ lib:SetCurrentTranslations {
+ ["Warlock"] = "術士",
+ ["Warrior"] = "戰士",
+ ["Hunter"] = "獵人",
+ ["Mage"] = "法師",
+ ["Priest"] = "牧師",
+ ["Druid"] = "德魯伊",
+ ["Paladin"] = "聖騎士",
+ ["Shaman"] = "薩滿",
+ ["Rogue"] = "盜賊",
+ ["Deathknight"] = "死亡騎士",
+
+ ["WARLOCK"] = "術士",
+ ["WARRIOR"] = "戰士",
+ ["HUNTER"] = "獵人",
+ ["MAGE"] = "法師",
+ ["PRIEST"] = "牧師",
+ ["DRUID"] = "德魯伊",
+ ["PALADIN"] = "聖騎士",
+ ["SHAMAN"] = "薩滿",
+ ["ROGUE"] = "盜賊",
+ ["DEATHKNIGHT"] = "死亡騎士",
+ }
+elseif GAME_LOCALE == "koKR" then
+ lib:SetCurrentTranslations {
+ ["Warlock"] = "흑마법사",
+ ["Warrior"] = "전사",
+ ["Hunter"] = "사냥꾼",
+ ["Mage"] = "마법사",
+ ["Priest"] = "사제",
+ ["Druid"] = "드루이드",
+ ["Paladin"] = "성기사",
+ ["Shaman"] = "주술사",
+ ["Rogue"] = "도적",
+ ["Deathknight"] = "죽음의 기사",
+
+ ["WARLOCK"] = "흑마법사",
+ ["WARRIOR"] = "전사",
+ ["HUNTER"] = "사냥꾼",
+ ["MAGE"] = "마법사",
+ ["PRIEST"] = "사제",
+ ["DRUID"] = "드루이드",
+ ["PALADIN"] = "성기사",
+ ["SHAMAN"] = "주술사",
+ ["ROGUE"] = "도적",
+ ["DEATHKNIGHT"] = "죽음의 기사",
+ }
+elseif GAME_LOCALE == "esES" then
+ lib:SetCurrentTranslations {
+ ["Warlock"] = "Brujo",
+ ["Warrior"] = "Guerrero",
+ ["Hunter"] = "Cazador",
+ ["Mage"] = "Mago",
+ ["Priest"] = "Sacerdote",
+ ["Druid"] = "Druida",
+ ["Paladin"] = "Paladín",
+ ["Shaman"] = "Chamán",
+ ["Rogue"] = "Pícaro",
+ ["Deathknight"] = "Caballero de la muerte",
+
+ ["WARLOCK"] = "Bruja",
+ ["WARRIOR"] = "Guerrera",
+ ["HUNTER"] = "Cazadora",
+ ["MAGE"] = "Maga",
+ ["PRIEST"] = "Sacerdotisa",
+ ["DRUID"] = "Druida",
+ ["PALADIN"] = "Paladín",
+ ["SHAMAN"] = "Chamán",
+ ["ROGUE"] = "Pícara",
+ ["Deathknight"] = "Caballero de la muerte",
+ }
+elseif GAME_LOCALE == "esMX" then
+ lib:SetCurrentTranslations {
+ ["Warlock"] = "Brujo",
+ ["Warrior"] = "Guerrero",
+ ["Hunter"] = "Cazador",
+ ["Mage"] = "Mago",
+ ["Priest"] = "Sacerdote",
+ ["Druid"] = "Druida",
+ ["Paladin"] = "Paladín",
+ ["Shaman"] = "Chamán",
+ ["Rogue"] = "Pícaro",
+ ["Deathknight"] = "Caballero de la muerte",
+
+ ["WARLOCK"] = "Bruja",
+ ["WARRIOR"] = "Guerrera",
+ ["HUNTER"] = "Cazadora",
+ ["MAGE"] = "Maga",
+ ["PRIEST"] = "Sacerdotisa",
+ ["DRUID"] = "Druida",
+ ["PALADIN"] = "Paladín",
+ ["SHAMAN"] = "Chamán",
+ ["ROGUE"] = "Pícara",
+ ["Deathknight"] = "Caballero de la muerte",
+ }
+elseif GAME_LOCALE == "ruRU" then
+ lib:SetCurrentTranslations {
+ ["Warlock"] = "Чернокнижник",
+ ["Warrior"] = "Воин",
+ ["Hunter"] = "Охотник",
+ ["Mage"] = "Маг",
+ ["Priest"] = "Жрец",
+ ["Druid"] = "Друид",
+ ["Paladin"] = "Паладин",
+ ["Shaman"] = "Шаман",
+ ["Rogue"] = "Разбойник",
+ ["Deathknight"] = "Рыцарь смерти",
+
+ ["WARLOCK"] = "Чернокнижница",
+ ["WARRIOR"] = "Воин",
+ ["HUNTER"] = "Охотница",
+ ["MAGE"] = "Маг",
+ ["PRIEST"] = "Жрица",
+ ["DRUID"] = "Друид",
+ ["PALADIN"] = "Паладин",
+ ["SHAMAN"] = "Шаманка",
+ ["ROGUE"] = "Разбойница",
+ ["DEATHKNIGHT"] = "Рыцарь смерти",
+ }
+else
+ error(("%s: Locale %q not supported"):format(MAJOR_VERSION, GAME_LOCALE))
+end
\ No newline at end of file
diff --git a/!Compatibility/libs/LibBabble-Zone-3.0.lua b/!Compatibility/libs/LibBabble-Zone-3.0.lua
new file mode 100644
index 0000000..a3afa1e
--- /dev/null
+++ b/!Compatibility/libs/LibBabble-Zone-3.0.lua
@@ -0,0 +1,1805 @@
+--[[
+Name: LibBabble-Zone-3.0
+Revision: $Rev: 107 $
+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(("$Revision: 107 $"):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 {
+ ["Azeroth"] = true,
+ ["Eastern Kingdoms"] = true,
+ ["Kalimdor"] = true,
+ ["Outland"] = true,
+ ["Cosmic map"] = true,
+
+ ["Ahn'Qiraj"] = true,
+ ["Alterac Mountains"] = true,
+ ["Alterac Valley"] = true,
+ ["Arathi Basin"] = true,
+ ["Arathi Highlands"] = true,
+ ["Ashenvale"] = true,
+ ["Auberdine"] = true,
+ ["Azshara"] = true,
+ ["Badlands"] = true,
+ ["The Barrens"] = true,
+ ["Blackfathom Deeps"] = true,
+ ["Blackrock Depths"] = true,
+ ["Blackrock Mountain"] = true,
+ ["Blackrock Spire"] = true,
+ ["Blackwing Lair"] = true,
+ ["Blasted Lands"] = true,
+ ["Booty Bay"] = true,
+ ["Burning Steppes"] = true,
+ ["Darkshore"] = true,
+ ["Darnassus"] = true,
+ ["The Deadmines"] = true,
+ ["Deadwind Pass"] = true,
+ ["Deeprun Tram"] = true,
+ ["Desolace"] = true,
+ ["Dire Maul"] = true,
+ ["Dire Maul (East)"] = true,
+ ["Dire Maul (West)"] = true,
+ ["Dire Maul (North)"] = true,
+ ["Dun Morogh"] = true,
+ ["Durotar"] = true,
+ ["Duskwood"] = true,
+ ["Dustwallow Marsh"] = true,
+ ["Eastern Plaguelands"] = true,
+ ["Elwynn Forest"] = true,
+ ["Everlook"] = true,
+ ["Felwood"] = true,
+ ["Feralas"] = true,
+ ["The Forbidding Sea"] = true,
+ ["Gadgetzan"] = true,
+ ["Gates of Ahn'Qiraj"] = true,
+ ["Gnomeregan"] = true,
+ ["The Great Sea"] = true,
+ ["Grom'gol Base Camp"] = true,
+ ["Hall of Legends"] = true,
+ ["Hillsbrad Foothills"] = true,
+ ["The Hinterlands"] = true,
+ ["Hyjal"] = true,
+ ["Hyjal Summit"] = true,
+ ["Ironforge"] = true,
+ ["Loch Modan"] = true,
+ ["Lower Blackrock Spire"] = true,
+ ["Maraudon"] = true,
+ ["Menethil Harbor"] = true,
+ ["Molten Core"] = true,
+ ["Moonglade"] = true,
+ ["Mulgore"] = true,
+ ["Naxxramas"] = true,
+ ["Onyxia's Lair"] = true,
+ ["Orgrimmar"] = true,
+ ["Ratchet"] = true,
+ ["Ragefire Chasm"] = true,
+ ["Razorfen Downs"] = true,
+ ["Razorfen Kraul"] = true,
+ ["Redridge Mountains"] = true,
+ ["Ruins of Ahn'Qiraj"] = true,
+ ["Scarlet Monastery"] = true,
+ ["Scholomance"] = true,
+ ["Searing Gorge"] = true,
+ ["Shadowfang Keep"] = true,
+ ["Silithus"] = true,
+ ["Silverpine Forest"] = true,
+ ["The Stockade"] = true,
+ ["Stonard"] = true,
+ ["Stonetalon Mountains"] = true,
+ ["Stormwind City"] = true,
+ ["Stormwind"] = true,
+ ["Stranglethorn Vale"] = true,
+ ["Stratholme"] = true,
+ ["Swamp of Sorrows"] = true,
+ ["Tanaris"] = true,
+ ["Teldrassil"] = true,
+ ["Temple of Ahn'Qiraj"] = true,
+ ["The Temple of Atal'Hakkar"] = true,
+ ["Theramore Isle"] = true,
+ ["Thousand Needles"] = true,
+ ["Thunder Bluff"] = true,
+ ["Tirisfal Glades"] = true,
+ ["Uldaman"] = true,
+ ["Un'Goro Crater"] = true,
+ ["Undercity"] = true,
+ ["Upper Blackrock Spire"] = true,
+ ["Wailing Caverns"] = true,
+ ["Warsong Gulch"] = true,
+ ["Western Plaguelands"] = true,
+ ["Westfall"] = true,
+ ["Wetlands"] = true,
+ ["Winterspring"] = true,
+ ["Zul'Farrak"] = true,
+ ["Zul'Gurub"] = true,
+
+ ["Champions' Hall"] = true,
+ ["Hall of Champions"] = true,
+ ["Blade's Edge Arena"] = true,
+ ["Nagrand Arena"] = true,
+ ["Ruins of Lordaeron"] = true,
+ ["Twisting Nether"] = true,
+ ["The Veiled Sea"] = true,
+ ["The North Sea"] = true,
+ ["Armory"] = true,
+ ["Library"] = true,
+ ["Cathedral"] = true,
+ ["Graveyard"] = true,
+
+ -- Burning Crusade
+
+ -- Subzones used for displaying instances.
+ ["Plaguewood"] = true,
+ ["Hellfire Citadel"] = true,
+ ["Auchindoun"] = true,
+ ["The Bone Wastes"] = true, -- Substitute for Auchindoun, since this is what shows on the minimap.
+ ["Ring of Observance"] = true,
+ ["Coilfang Reservoir"] = true,
+ ["Amani Pass"] = true,
+
+ ["Azuremyst Isle"] = true,
+ ["Bloodmyst Isle"] = true,
+ ["Eversong Woods"] = true,
+ ["Ghostlands"] = true,
+ ["The Exodar"] = true,
+ ["Silvermoon City"] = true,
+ ["Shadowmoon Valley"] = true,
+ ["Black Temple"] = true,
+ ["Terokkar Forest"] = true,
+ ["Auchenai Crypts"] = true,
+ ["Mana-Tombs"] = true,
+ ["Shadow Labyrinth"] = true,
+ ["Sethekk Halls"] = true,
+ ["Hellfire Peninsula"] = true,
+ ["The Dark Portal"] = true,
+ ["Hellfire Ramparts"] = true,
+ ["The Blood Furnace"] = true,
+ ["The Shattered Halls"] = true,
+ ["Magtheridon's Lair"] = true,
+ ["Nagrand"] = true,
+ ["Zangarmarsh"] = true,
+ ["The Slave Pens"] = true,
+ ["The Underbog"] = true,
+ ["The Steamvault"] = true,
+ ["Serpentshrine Cavern"] = true,
+ ["Blade's Edge Mountains"] = true,
+ ["Gruul's Lair"] = true,
+ ["Netherstorm"] = true,
+ ["Tempest Keep"] = true,
+ ["The Mechanar"] = true,
+ ["The Botanica"] = true,
+ ["The Arcatraz"] = true,
+ ["The Eye"] = true,
+ ["Eye of the Storm"] = true,
+ ["Shattrath City"] = true,
+ ["Shattrath"] = true,
+ ["Karazhan"] = true,
+ ["Caverns of Time"] = true,
+ ["Old Hillsbrad Foothills"] = true,
+ ["The Black Morass"] = true,
+ ["Night Elf Village"] = true,
+ ["Horde Encampment"] = true,
+ ["Alliance Base"] = true,
+ ["Zul'Aman"] = true,
+ ["Quel'thalas"] = true,
+ ["Isle of Quel'Danas"] = true,
+ ["Sunwell Plateau"] = true,
+ ["Magisters' Terrace"] = true,
+
+ -- Blade's Edge Plateau
+ ["Forge Camp: Terror"] = true,
+ ["Vortex Pinnacle"] = true,
+ ["Rivendark's Perch"] = true,
+ ["Ogri'la"] = true,
+ ["Obsidia's Perch"] = true,
+ ["Skyguard Outpost"] = true,
+ ["Shartuul's Transporter"] = true,
+ ["Forge Camp: Wrath"] = true,
+ ["Bash'ir Landing"] = true,
+ ["Crystal Spine"] = true,
+ ["Insidion's Perch"] = true,
+ ["Furywing's Perch"] = true,
+
+ ["Tirisfal"] = true,
+ ["Sunken Temple"] = true,
+}
+
+if GAME_LOCALE == "enUS" then
+ lib:SetCurrentTranslations(true)
+elseif GAME_LOCALE == "deDE" then
+ lib:SetCurrentTranslations {
+ ["Azeroth"] = "Azeroth",
+ ["Eastern Kingdoms"] = "Östliche Königreiche",
+ ["Kalimdor"] = "Kalimdor",
+ ["Outland"] = "Scherbenwelt",
+ ["Cosmic map"] = "Kosmische Karte",
+
+ ["Ahn'Qiraj"] = "Ahn'Qiraj",
+ ["Alterac Mountains"] = "Alteracgebirge",
+ ["Alterac Valley"] = "Alteractal",
+ ["Arathi Basin"] = "Arathibecken",
+ ["Arathi Highlands"] = "Arathihochland",
+ ["Ashenvale"] = "Eschental",
+ ["Auberdine"] = "Auberdine",
+ ["Azshara"] = "Azshara",
+ ["Badlands"] = "Ödland",
+ ["The Barrens"] = "Brachland",
+ ["Blackfathom Deeps"] = "Tiefschwarze Grotte",
+ ["Blackrock Depths"] = "Schwarzfelstiefen",
+ ["Blackrock Mountain"] = "Der Schwarzfels",
+ ["Blackrock Spire"] = "Schwarzfelsspitze",
+ ["Blackwing Lair"] = "Pechschwingenhort",
+ ["Blasted Lands"] = "Verwüstete Lande",
+ ["Booty Bay"] = "Beutebucht",
+ ["Burning Steppes"] = "Brennende Steppe",
+ ["Darkshore"] = "Dunkelküste",
+ ["Darnassus"] = "Darnassus",
+ ["The Deadmines"] = "Die Todesminen",
+ ["Deadwind Pass"] = "Gebirgspass der Totenwinde",
+ ["Deeprun Tram"] = "Die Tiefenbahn",
+ ["Desolace"] = "Desolace",
+ ["Dire Maul"] = "Düsterbruch",
+ ["Dire Maul (North)"] = "Düsterbruch (Nord)",
+ ["Dire Maul (East)"] = "Düsterbruch (Ost)",
+ ["Dire Maul (West)"] = "Düsterbruch (West)",
+ ["Dun Morogh"] = "Dun Morogh",
+ ["Durotar"] = "Durotar",
+ ["Duskwood"] = "Dämmerwald",
+ ["Dustwallow Marsh"] = "Düstermarschen",
+ ["Eastern Plaguelands"] = "Östliche Pestländer",
+ ["Elwynn Forest"] = "Wald von Elwynn",
+ ["Everlook"] = "Ewige Warte",
+ ["Felwood"] = "Teufelswald",
+ ["Feralas"] = "Feralas",
+ ["The Forbidding Sea"] = "Das verbotene Meer",
+ ["Gadgetzan"] = "Gadgetzan",
+ ["Gates of Ahn'Qiraj"] = "Tore von Ahn'Qiraj",
+ ["Gnomeregan"] = "Gnomeregan",
+ ["Grom'gol Base Camp"] = "Basislager von Grom'gol",
+ ["The Great Sea"] = "Das große Meer",
+ ["Hall of Legends"] = "Halle der Legenden",
+ ["Hillsbrad Foothills"] = "Vorgebirge des Hügellands",
+ ["The Hinterlands"] = "Hinterland",
+ ["Hyjal"] = "Hyjal",
+ ["Hyjal Summit"] = "Hyjalgipfel",
+ ["Ironforge"] = "Eisenschmiede",
+ ["Loch Modan"] = "Loch Modan",
+ ["Lower Blackrock Spire"] = "Untere Schwarzfelsspitze",
+ ["Maraudon"] = "Maraudon",
+ ["Menethil Harbor"] = "Hafen von Menethil",
+ ["Molten Core"] = "Geschmolzener Kern",
+ ["Moonglade"] = "Mondlichtung",
+ ["Mulgore"] = "Mulgore",
+ ["Naxxramas"] = "Naxxramas",
+ ["Onyxia's Lair"] = "Onyxias Hort",
+ ["Orgrimmar"] = "Orgrimmar",
+ ["Ratchet"] = "Ratschet",
+ ["Ragefire Chasm"] = "Der Flammenschlund",
+ ["Razorfen Downs"] = "Hügel der Klingenhauer",
+ ["Razorfen Kraul"] = "Kral der Klingenhauer",
+ ["Redridge Mountains"] = "Rotkammgebirge",
+ ["Ruins of Ahn'Qiraj"] = "Ruinen von Ahn'Qiraj",
+ ["Scarlet Monastery"] = "Das Scharlachrote Kloster",
+ ["Scholomance"] = "Scholomance",
+ ["Searing Gorge"] = "Sengende Schlucht",
+ ["Shadowfang Keep"] = "Burg Schattenfang",
+ ["Silithus"] = "Silithus",
+ ["Silverpine Forest"] = "Silberwald",
+ ["The Stockade"] = "Das Verlies",
+ ["Stonard"] = "Steinard",
+ ["Stonetalon Mountains"] = "Steinkrallengebirge",
+ ["Stormwind City"] = "Sturmwind",
+ ["Stormwind"] = "Sturmwind",
+ ["Stranglethorn Vale"] = "Schlingendorntal",
+ ["Stratholme"] = "Stratholme",
+ ["Swamp of Sorrows"] = "Sümpfe des Elends",
+ ["Tanaris"] = "Tanaris",
+ ["Teldrassil"] = "Teldrassil",
+ ["Temple of Ahn'Qiraj"] = "Tempel von Ahn'Qiraj",
+ ["The Temple of Atal'Hakkar"] = "Der Tempel von Atal'Hakkar",
+ ["Theramore Isle"] = "Insel Theramore",
+ ["Thousand Needles"] = "Tausend Nadeln",
+ ["Thunder Bluff"] = "Donnerfels",
+ ["Tirisfal Glades"] = "Tirisfal",
+ ["Uldaman"] = "Uldaman",
+ ["Un'Goro Crater"] = "Krater von Un'Goro",
+ ["Undercity"] = "Unterstadt",
+ ["Upper Blackrock Spire"] = "Obere Schwarzfelsspitze",
+ ["Wailing Caverns"] = "Die Höhlen des Wehklagens",
+ ["Warsong Gulch"] = "Kriegshymnenschlucht",
+ ["Western Plaguelands"] = "Westliche Pestländer",
+ ["Westfall"] = "Westfall",
+ ["Wetlands"] = "Sumpfland",
+ ["Winterspring"] = "Winterquell",
+ ["Zul'Farrak"] = "Zul'Farrak",
+ ["Zul'Gurub"] = "Zul'Gurub",
+
+ ["Champions' Hall"] = "Halle der Champions",
+ ["Hall of Champions"] = "Halle der Champions",
+ ["Blade's Edge Arena"] = "Arena des Schergrats",
+ ["Nagrand Arena"] = "Arena von Nagrand",
+ ["Ruins of Lordaeron"] = "Ruinen von Lordaeron",
+ ["Twisting Nether"] = "Wirbelnder Nether",
+ ["The Veiled Sea"] = "Das verhüllte Meer",
+ ["The North Sea"] = "Das nördliche Meer",
+ ["Armory"] = "Waffenkammer",
+ ["Library"] = "Bibliothek",
+ ["Cathedral"] = "Kathedrale",
+ ["Graveyard"] = "Friedhof",
+
+ -- Burning Crusade
+
+ -- Subzones used for displaying instances.
+ ["Plaguewood"] = "Seuchenwald",
+ ["Hellfire Citadel"] = "Höllenfeuerzitadelle",
+ ["Auchindoun"] = "Auchindoun",
+ ["The Bone Wastes"] = "Die Knochenwüste", -- Substitute for Auchindoun, since this is what shows on the minimap.
+ ["Ring of Observance"] = "Ring der Beobachtung",
+ ["Coilfang Reservoir"] = "Der Echsenkessel",
+ ["Amani Pass"] = "Amanipass",
+
+ ["Azuremyst Isle"] = "Azurmythosinsel",
+ ["Bloodmyst Isle"] = "Blutmythosinsel",
+ ["Eversong Woods"] = "Immersangwald",
+ ["Ghostlands"] = "Geisterlande",
+ ["The Exodar"] = "Die Exodar",
+ ["Silvermoon City"] = "Silbermond",
+ ["Shadowmoon Valley"] = "Schattenmondtal",
+ ["Black Temple"] = "Der Schwarze Tempel",
+ ["Terokkar Forest"] = "Wälder von Terokkar",
+ ["Auchenai Crypts"] = "Auchenaikrypta",
+ ["Mana-Tombs"] = "Managruft",
+ ["Shadow Labyrinth"] = "Schattenlabyrinth",
+ ["Sethekk Halls"] = "Sethekkhallen",
+ ["Hellfire Peninsula"] = "Höllenfeuerhalbinsel",
+ ["The Dark Portal"] = "Das Dunkle Portal",
+ ["Hellfire Ramparts"] = "Höllenfeuerbollwerk",
+ ["The Blood Furnace"] = "Der Blutkessel",
+ ["The Shattered Halls"] = "Die zerschmetterten Hallen",
+ ["Magtheridon's Lair"] = "Magtheridons Kammer",
+ ["Nagrand"] = "Nagrand",
+ ["Zangarmarsh"] = "Zangarmarschen",
+ ["The Slave Pens"] = "Die Sklavenunterkünfte",
+ ["The Underbog"] = "Der Tiefensumpf",
+ ["The Steamvault"] = "Die Dampfkammer",
+ ["Serpentshrine Cavern"] = "Höhle des Schlangenschreins",
+ ["Blade's Edge Mountains"] = "Schergrat",
+ ["Gruul's Lair"] = "Gruuls Unterschlupf",
+ ["Netherstorm"] = "Nethersturm",
+ ["Tempest Keep"] = "Festung der Stürme",
+ ["The Mechanar"] = "Die Mechanar",
+ ["The Botanica"] = "Die Botanika",
+ ["The Arcatraz"] = "Die Arkatraz",
+ ["The Eye"] = "Das Auge",
+ ["Eye of the Storm"] = "Auge des Sturms",
+ ["Shattrath City"] = "Shattrath",
+ ["Shattrath"] = "Shattrath",
+ ["Karazhan"] = "Karazhan",
+ ["Caverns of Time"] = "Die Höhlen der Zeit",
+ ["Old Hillsbrad Foothills"] = "Vorgebirge des Alten Hügellands",
+ ["The Black Morass"] = "Der schwarze Morast",
+ ["Night Elf Village"] = "Nachtelfen Dorf",
+ ["Horde Encampment"] = "Lager der Horde",
+ ["Alliance Base"] = "Basis der Allianz",
+ ["Zul'Aman"] = "Zul'Aman",
+ ["Quel'thalas"] = "Quel'Thalas",
+ ["Isle of Quel'Danas"] = "Insel von Quel'Danas",
+ ["Sunwell Plateau"] = "Sonnenbrunnenplateau",
+ ["Magisters' Terrace"] = "Terrasse der Magister",
+
+ -- Blade's Edge Plateau
+ ["Forge Camp: Terror"] = "",
+ ["Vortex Pinnacle"] = "",
+ ["Rivendark's Perch"] = "",
+ ["Ogri'la"] = "",
+ ["Obsidia's Perch"] = "",
+ ["Skyguard Outpost"] = "",
+ ["Shartuul's Transporter"] = "",
+ ["Forge Camp: Wrath"] = "",
+ ["Bash'ir Landing"] = "",
+ ["Crystal Spine"] = "",
+ ["Insidion's Perch"] = "",
+ ["Furywing's Perch"] = "",
+
+ ["Tirisfal"] = "Tirisfal",
+ ["Sunken Temple"] = "Versunkener Tempel",
+ }
+elseif GAME_LOCALE == "frFR" then
+ lib:SetCurrentTranslations {
+ ["Azeroth"] = "Azeroth",
+ ["Eastern Kingdoms"] = "Royaumes de l'est",
+ ["Kalimdor"] = "Kalimdor",
+ ["Outland"] = "Outreterre",
+ ["Cosmic map"] = "Carte cosmique",
+
+ ["Ahn'Qiraj"] = "Ahn'Qiraj",
+ ["Alterac Mountains"] = "Montagnes d'Alterac",
+ ["Alterac Valley"] = "Vallée d'Alterac",
+ ["Arathi Basin"] = "Bassin d'Arathi",
+ ["Arathi Highlands"] = "Hautes-terres d'Arathi",
+ ["Ashenvale"] = "Orneval",
+ ["Auberdine"] = "Auberdine",
+ ["Azshara"] = "Azshara",
+ ["Badlands"] = "Terres ingrates",
+ ["The Barrens"] = "Les Tarides",
+ ["Blackfathom Deeps"] = "Profondeurs de Brassenoire",
+ ["Blackrock Depths"] = "Profondeurs de Rochenoire",
+ ["Blackrock Mountain"] = "Mont Rochenoire",
+ ["Blackrock Spire"] = "Pic Rochenoire",
+ ["Blackwing Lair"] = "Repaire de l'Aile noire",
+ ["Blasted Lands"] = "Terres foudroyées",
+ ["Booty Bay"] = "Baie-du-Butin",
+ ["Burning Steppes"] = "Steppes ardentes",
+ ["Darkshore"] = "Sombrivage",
+ ["Darnassus"] = "Darnassus",
+ ["The Deadmines"] = "Les Mortemines",
+ ["Deadwind Pass"] = "Défilé de Deuillevent",
+ ["Deeprun Tram"] = "Tram des profondeurs",
+ ["Desolace"] = "Désolace",
+ ["Dire Maul"] = "Hache-tripes",
+ ["Dire Maul (East)"] = "Hache-tripes (Est)",
+ ["Dire Maul (West)"] = "Hache-tripes (Ouest)",
+ ["Dire Maul (North)"] = "Hache-tripes (Nord)",
+ ["Dun Morogh"] = "Dun Morogh",
+ ["Durotar"] = "Durotar",
+ ["Duskwood"] = "Bois de la Pénombre",
+ ["Dustwallow Marsh"] = "Marécage d'Âprefange",
+ ["Eastern Plaguelands"] = "Maleterres de l'est",
+ ["Elwynn Forest"] = "Forêt d'Elwynn",
+ ["Everlook"] = "Long-guet",
+ ["Felwood"] = "Gangrebois",
+ ["Feralas"] = "Féralas",
+ ["The Forbidding Sea"] = "La Mer interdite",
+ ["Gadgetzan"] = "Gadgetzan",
+ ["Gates of Ahn'Qiraj"] = "Portes d'Ahn'Qiraj",
+ ["Gnomeregan"] = "Gnomeregan",
+ ["Grom'gol Base Camp"] = "Campement Grom'gol",
+ ["The Great Sea"] = "La Grande mer",
+ ["Hall of Legends"] = "Hall des Légendes",
+ ["Hillsbrad Foothills"] = "Contreforts de Hautebrande",
+ ["The Hinterlands"] = "Les Hinterlands",
+ ["Hyjal"] = "Hyjal",
+ ["Hyjal Summit"] = "Sommet d'Hyjal",
+ ["Ironforge"] = "Forgefer",
+ ["Loch Modan"] = "Loch Modan",
+ ["Lower Blackrock Spire"] = "Pic de Rochenoire inférieur",
+ ["Maraudon"] = "Maraudon",
+ ["Menethil Harbor"] = "Port de Menethil",
+ ["Molten Core"] = "Cœur du Magma",
+ ["Moonglade"] = "Reflet-de-Lune",
+ ["Mulgore"] = "Mulgore",
+ ["Onyxia's Lair"] = "Repaire d'Onyxia",
+ ["Naxxramas"] = "Naxxramas",
+ ["Orgrimmar"] = "Orgrimmar",
+ ["Ratchet"] = "Cabestan",
+ ["Ragefire Chasm"] = "Gouffre de Ragefeu",
+ ["Razorfen Downs"] = "Souilles de Tranchebauge",
+ ["Razorfen Kraul"] = "Kraal de Tranchebauge",
+ ["Redridge Mountains"] = "Les Carmines",
+ ["Ruins of Ahn'Qiraj"] = "Ruines d'Ahn'Qiraj",
+ ["Scarlet Monastery"] = "Monastère écarlate",
+ ["Scholomance"] = "Scholomance",
+ ["Searing Gorge"] = "Gorge des Vents brûlants",
+ ["Shadowfang Keep"] = "Donjon d'Ombrecroc",
+ ["Silithus"] = "Silithus",
+ ["Silverpine Forest"] = "Forêt des Pins argentés",
+ ["The Stockade"] = "La Prison",
+ ["Stonard"] = "Pierrêche",
+ ["Stonetalon Mountains"] = "Les Serres-Rocheuses",
+ ["Stormwind City"] = "Hurlevent",
+ ["Stormwind"] = "Hurlevent",
+ ["Stranglethorn Vale"] = "Vallée de Strangleronce",
+ ["Stratholme"] = "Stratholme",
+ ["Swamp of Sorrows"] = "Marais des Chagrins",
+ ["Tanaris"] = "Tanaris",
+ ["Teldrassil"] = "Teldrassil",
+ ["Temple of Ahn'Qiraj"] = "Le temple d'Ahn'Qiraj",
+ ["The Temple of Atal'Hakkar"] = "Le temple d'Atal'Hakkar",
+ ["Theramore Isle"] = "Ile de Theramore",
+ ["Thousand Needles"] = "Mille pointes",
+ ["Thunder Bluff"] = "Les Pitons du Tonnerre",
+ ["Tirisfal Glades"] = "Clairières de Tirisfal",
+ ["Uldaman"] = "Uldaman",
+ ["Un'Goro Crater"] = "Cratère d'Un'Goro",
+ ["Undercity"] = "Fossoyeuse",
+ ["Upper Blackrock Spire"] = "Pic de Rochenoire supérieur",
+ ["Wailing Caverns"] = "Cavernes des lamentations",
+ ["Warsong Gulch"] = "Goulet des Chanteguerres",
+ ["Western Plaguelands"] = "Maleterres de l'ouest",
+ ["Westfall"] = "Marche de l'Ouest",
+ ["Wetlands"] = "Les Paluns",
+ ["Winterspring"] = "Berceau-de-l'Hiver",
+ ["Zul'Farrak"] = "Zul'Farrak",
+ ["Zul'Gurub"] = "Zul'Gurub",
+
+ ["Champions' Hall"] = "Hall des Champions",
+ ["Hall of Champions"] = "Hall des Champions",
+ ["Blade's Edge Arena"] = "Arène des Tranchantes",
+ ["Nagrand Arena"] = "Arène de Nagrand",
+ ["Ruins of Lordaeron"] = "Ruines de Lordaeron",
+ ["Twisting Nether"] = "Le Néant distordu",
+ ["The Veiled Sea"] = "La Mer voilée",
+ ["The North Sea"] = "La mer Boréale",
+ ["Armory"] = "Armurerie",
+ ["Library"] = "Bibliothèque",
+ ["Cathedral"] = "Cathédrale",
+ ["Graveyard"] = "Cimetière",
+
+ -- Burning Crusade
+
+ -- Subzones used for displaying instances.
+ ["Plaguewood"] = "Pestebois",
+ ["Hellfire Citadel"] = "Citadelle des Flammes infernales",
+ ["Auchindoun"] = "Auchindoun",
+ ["The Bone Wastes"] = "Le désert des Ossements", -- Substitute for Auchindoun, since this is what shows on the minimap.
+ ["Ring of Observance"] = "Cercle d'observance",
+ ["Coilfang Reservoir"] = "Réservoir de Glissecroc",
+ ["Amani Pass"] = "Passage des Amani",
+
+ ["Azuremyst Isle"] = "Ile de Brume-azur",
+ ["Bloodmyst Isle"] = "Ile de Brume-sang",
+ ["Eversong Woods"] = "Bois des Chants éternels",
+ ["Ghostlands"] = "Les Terres fantômes",
+ ["The Exodar"] = "L'Exodar",
+ ["Silvermoon City"] = "Lune-d'argent",
+ ["Shadowmoon Valley"] = "Vallée d'Ombrelune",
+ ["Black Temple"] = "Temple noir",
+ ["Terokkar Forest"] = "Forêt de Terokkar",
+ ["Auchenai Crypts"] = "Cryptes Auchenaï",
+ ["Mana-Tombs"] = "Tombes-mana",
+ ["Shadow Labyrinth"] = "Labyrinthe des ombres",
+ ["Sethekk Halls"] = "Les salles des Sethekk",
+ ["Hellfire Peninsula"] = "Péninsule des Flammes infernales",
+ ["The Dark Portal"] = "La Porte des ténèbres",
+ ["Hellfire Ramparts"] = "Remparts des Flammes infernales",
+ ["The Blood Furnace"] = "La Fournaise du sang",
+ ["The Shattered Halls"] = "Les Salles brisées",
+ ["Magtheridon's Lair"] = "Le repaire de Magtheridon",
+ ["Nagrand"] = "Nagrand",
+ ["Zangarmarsh"] = "Marécage de Zangar",
+ ["The Slave Pens"] = "Les enclos aux esclaves",
+ ["The Underbog"] = "La Basse-tourbière",
+ ["The Steamvault"] = "Le Caveau de la vapeur",
+ ["Serpentshrine Cavern"] = "Caverne du sanctuaire du Serpent",
+ ["Blade's Edge Mountains"] = "Les Tranchantes",
+ ["Gruul's Lair"] = "Repaire de Gruul",
+ ["Netherstorm"] = "Raz-de-Néant",
+ ["Tempest Keep"] = "Donjon de la Tempête",
+ ["The Mechanar"] = "Le Méchanar",
+ ["The Botanica"] = "La Botanica",
+ ["The Arcatraz"] = "L'Arcatraz",
+ ["The Eye"] = "L'Œil",
+ ["Eye of the Storm"] = "L'Œil du cyclone",
+ ["Shattrath City"] = "Shattrath",
+ ["Shattrath"] = "Shattrath",
+ ["Karazhan"] = "Karazhan",
+ ["Caverns of Time"] = "Grottes du temps",
+ ["Old Hillsbrad Foothills"] = "Contreforts de Hautebrande d'antan",
+ ["The Black Morass"] = "Le Noir Marécage",
+ ["Night Elf Village"] = "Village elfe de la nuit",
+ ["Horde Encampment"] = "Campement de la Horde",
+ ["Alliance Base"] = "Base de l'Alliance",
+ ["Zul'Aman"] = "Zul'Aman",
+ ["Quel'thalas"] = "Quel'thalas",
+ ["Isle of Quel'Danas"] = "Île de Quel'Danas",
+ ["Sunwell Plateau"] = "Plateau du Puits de soleil",
+ ["Magisters' Terrace"] = "Terrasse des Magistères",
+
+ -- Blade's Edge Plateau
+ ["Forge Camp: Terror"] = "Camp de forge : Terreur",
+ ["Vortex Pinnacle"] = "Cime du vortex",
+ ["Rivendark's Perch"] = "Perchoir de Clivenuit",
+ ["Ogri'la"] = "Ogri'la",
+ ["Obsidia's Perch"] = "Perchoir d'Obsidia",
+ ["Skyguard Outpost"] = "Avant-poste de la Garde-ciel",
+ ["Shartuul's Transporter"] = "Transporteur de Shartuul",
+ ["Forge Camp: Wrath"] = "Camp de forge : Courroux",
+ ["Bash'ir Landing"] = "Point d'ancrage de Bash'ir",
+ ["Crystal Spine"] = "Éperon de cristal",
+ ["Insidion's Perch"] = "Perchoir d'Insidion",
+ ["Furywing's Perch"] = "Perchoir d'Aile-furie",
+
+ ["Tirisfal"] = "Tirisfal",
+ ["Sunken Temple"] = "Temple englouti",
+ }
+elseif GAME_LOCALE == "zhCN" then
+ lib:SetCurrentTranslations {
+ ["Azeroth"] = "艾泽拉斯",
+ ["Eastern Kingdoms"] = "东部王国",
+ ["Kalimdor"] = "卡利姆多",
+ ["Outland"] = "外域",
+ ["Cosmic map"] = "全部地图",
+
+ ["Ahn'Qiraj"] = "安其拉",
+ ["Alterac Mountains"] = "奥特兰克山脉",
+ ["Alterac Valley"] = "奥特兰克山谷",
+ ["Arathi Basin"] = "阿拉希盆地",
+ ["Arathi Highlands"] = "阿拉希高地",
+ ["Ashenvale"] = "灰谷",
+ ["Auberdine"] = "奥伯丁",
+ ["Azshara"] = "艾萨拉",
+ ["Badlands"] = "荒芜之地",
+ ["The Barrens"] = "贫瘠之地",
+ ["Blackfathom Deeps"] = "黑暗深渊",
+ ["Blackrock Depths"] = "黑石深渊",
+ ["Blackrock Mountain"] = "黑石山",
+ ["Blackrock Spire"] = "黑石塔",
+ ["Blackwing Lair"] = "黑翼之巢",
+ ["Blasted Lands"] = "诅咒之地",
+ ["Booty Bay"] = "藏宝海湾",
+ ["Burning Steppes"] = "燃烧平原",
+ ["Darkshore"] = "黑海岸",
+ ["Darnassus"] = "达纳苏斯",
+ ["The Deadmines"] = "死亡矿井",
+ ["Deadwind Pass"] = "逆风小径",
+ ["Deeprun Tram"] = "矿道地铁",
+ ["Desolace"] = "凄凉之地",
+ ["Dire Maul"] = "厄运之槌",
+ ["Dire Maul (East)"] = "厄运之槌 (东)",
+ ["Dire Maul (West)"] = "厄运之槌 (西)",
+ ["Dire Maul (North)"] = "厄运之槌 (北)",
+ ["Dun Morogh"] = "丹莫罗",
+ ["Durotar"] = "杜隆塔尔",
+ ["Duskwood"] = "暮色森林",
+ ["Dustwallow Marsh"] = "尘泥沼泽",
+ ["Eastern Plaguelands"] = "东瘟疫之地",
+ ["Elwynn Forest"] = "艾尔文森林",
+ ["Everlook"] = "永望镇",
+ ["Felwood"] = "费伍德森林",
+ ["Feralas"] = "菲拉斯",
+ ["The Forbidding Sea"] = "禁忌之海",
+ ["Gadgetzan"] = "加基森",
+ ["Gates of Ahn'Qiraj"] = "安其拉之门",
+ ["Gnomeregan"] = "诺莫瑞根",
+ ["The Great Sea"] = "无尽之海",
+ ["Grom'gol Base Camp"] = "格罗姆高营地",
+ ["Hall of Legends"] = "传说大厅",
+ ["Hillsbrad Foothills"] = "希尔斯布莱德丘陵",
+ ["The Hinterlands"] = "辛特兰",
+ ["Hyjal"] = "海加尔山",
+ ["Hyjal Summit"] = "海加尔峰",
+ ["Ironforge"] = "铁炉堡",
+ ["Loch Modan"] = "洛克莫丹",
+ ["Lower Blackrock Spire"] = "黑石塔 (下层)",
+ ["Maraudon"] = "玛拉顿",
+ ["Menethil Harbor"] = "米奈希尔港",
+ ["Molten Core"] = "熔火之心",
+ ["Moonglade"] = "月光林地",
+ ["Mulgore"] = "莫高雷",
+ ["Naxxramas"] = "纳克萨玛斯",
+ ["Onyxia's Lair"] = "奥妮克希亚的巢穴",
+ ["Orgrimmar"] = "奥格瑞玛",
+ ["Ratchet"] = "棘齿城",
+ ["Ragefire Chasm"] = "怒焰裂谷",
+ ["Razorfen Downs"] = "剃刀高地",
+ ["Razorfen Kraul"] = "剃刀沼泽",
+ ["Redridge Mountains"] = "赤脊山",
+ ["Ruins of Ahn'Qiraj"] = "安其拉废墟",
+ ["Scarlet Monastery"] = "血色修道院",
+ ["Scholomance"] = "通灵学院",
+ ["Searing Gorge"] = "灼热峡谷",
+ ["Shadowfang Keep"] = "影牙城堡",
+ ["Silithus"] = "希利苏斯",
+ ["Silverpine Forest"] = "银松森林",
+ ["The Stockade"] = "监狱",
+ ["Stonard"] = "斯通纳德",
+ ["Stonetalon Mountains"] = "石爪山脉",
+ ["Stormwind City"] = "暴风城",
+ ["Stormwind"] = "暴风城",--TaxiNodesDBC
+ ["Stranglethorn Vale"] = "荆棘谷",
+ ["Stratholme"] = "斯坦索姆",
+ ["Swamp of Sorrows"] = "悲伤沼泽",
+ ["Tanaris"] = "塔纳利斯",
+ ["Teldrassil"] = "泰达希尔",
+ ["Temple of Ahn'Qiraj"] = "安其拉神殿",
+ ["The Temple of Atal'Hakkar"] = "阿塔哈卡神庙",
+ ["Theramore Isle"] = "塞拉摩岛",
+ ["Thousand Needles"] = "千针石林",
+ ["Thunder Bluff"] = "雷霆崖",
+ ["Tirisfal Glades"] = "提瑞斯法林地",
+ ["Uldaman"] = "奥达曼",
+ ["Un'Goro Crater"] = "安戈洛环形山",
+ ["Undercity"] = "幽暗城",
+ ["Upper Blackrock Spire"] = "黑石塔 (上层)",
+ ["Wailing Caverns"] = "哀嚎洞穴",
+ ["Warsong Gulch"] = "战歌峡谷",
+ ["Western Plaguelands"] = "西瘟疫之地",
+ ["Westfall"] = "西部荒野",
+ ["Wetlands"] = "湿地",
+ ["Winterspring"] = "冬泉谷",
+ ["Zul'Farrak"] = "祖尔法拉克",
+ ["Zul'Gurub"] = "祖尔格拉布",
+
+ ["Champions' Hall"] = "勇士大厅",
+ ["Hall of Champions"] = "勇士大厅",--WMOAreaTableDBC
+ ["Blade's Edge Arena"] = "刀锋山竞技场",
+ ["Nagrand Arena"] = "纳格兰竞技场",
+ ["Ruins of Lordaeron"] = "洛丹伦废墟",
+ ["Twisting Nether"] = "扭曲虚空",
+ ["The Veiled Sea"] = "迷雾之海",
+ ["The North Sea"] = "北海",
+ ["Armory"] = "军械库",
+ ["Library"] = "图书馆",
+ ["Cathedral"] = "教堂",
+ ["Graveyard"] = "墓地",
+
+ -- Burning Crusade
+
+ -- Subzones used for displaying instances.
+ ["Plaguewood"] = "病木林",
+ ["Hellfire Citadel"] = "地狱火堡垒",
+ ["Auchindoun"] = "奥金顿",
+ ["The Bone Wastes"] = "白骨荒野",
+ ["Ring of Observance"] = "仪式广场",
+ ["Coilfang Reservoir"] = "盘牙水库",
+ ["Amani Pass"] = "阿曼尼小径",
+
+ ["Azuremyst Isle"] = "秘蓝岛",
+ ["Bloodmyst Isle"] = "秘血岛",
+ ["Eversong Woods"] = "永歌森林",
+ ["Ghostlands"] = "幽魂之地",
+ ["The Exodar"] = "埃索达",
+ ["Silvermoon City"] = "银月城",
+ ["Shadowmoon Valley"] = "影月谷",
+ ["Black Temple"] = "黑暗神殿",
+ ["Terokkar Forest"] = "泰罗卡森林",
+ ["Auchenai Crypts"] = "奥金尼地穴",
+ ["Mana-Tombs"] = "法力陵墓",
+ ["Shadow Labyrinth"] = "暗影迷宫",
+ ["Sethekk Halls"] = "塞泰克大厅",
+ ["Hellfire Peninsula"] = "地狱火半岛",
+ ["The Dark Portal"] = "黑暗之门",
+ ["Hellfire Ramparts"] = "地狱火城墙",
+ ["The Blood Furnace"] = "鲜血熔炉",
+ ["The Shattered Halls"] = "破碎大厅",
+ ["Magtheridon's Lair"] = "玛瑟里顿的巢穴",
+ ["Nagrand"] = "纳格兰",
+ ["Zangarmarsh"] = "赞加沼泽",
+ ["The Slave Pens"] = "奴隶围栏",
+ ["The Underbog"] = "幽暗沼泽",
+ ["The Steamvault"] = "蒸汽地窟",
+ ["Serpentshrine Cavern"] = "毒蛇神殿",
+ ["Blade's Edge Mountains"] = "刀锋山",
+ ["Gruul's Lair"] = "格鲁尔的巢穴",
+ ["Netherstorm"] = "虚空风暴",
+ ["Tempest Keep"] = "风暴要塞",
+ ["The Mechanar"] = "能源舰",
+ ["The Botanica"] = "生态船",
+ ["The Arcatraz"] = "禁魔监狱",
+ ["The Eye"] = "风暴要塞",
+ ["Eye of the Storm"] = "风暴之眼",
+ ["Shattrath City"] = "沙塔斯城",
+ ["Shattrath"] = "沙塔斯",--TaxiNodesDBC
+ ["Karazhan"] = "卡拉赞",
+ ["Caverns of Time"] = "时光之穴",
+ ["Old Hillsbrad Foothills"] = "旧希尔斯布莱德丘陵",
+ ["The Black Morass"] = "黑色沼泽",
+ ["Night Elf Village"] = "暗夜精灵村庄",
+ ["Horde Encampment"] = "部落营地",
+ ["Alliance Base"] = "联盟基地",
+ ["Zul'Aman"] = "祖阿曼",
+ ["Quel'thalas"] = "奎尔萨拉斯",
+ ["Isle of Quel'Danas"] = "奎尔丹纳斯岛",
+ ["Sunwell Plateau"] = "太阳之井高地",
+ ["Magisters' Terrace"] = "魔导师平台",
+
+ -- Blade's Edge Plateau
+ ["Forge Camp: Terror"] = "铸魔营地:恐怖",
+ ["Vortex Pinnacle"] = "漩涡峰",
+ ["Rivendark's Perch"] = "雷文达克栖木",
+ ["Ogri'la"] = "奥格瑞拉",
+ ["Obsidia's Perch"] = "欧比斯迪栖木",
+ ["Skyguard Outpost"] = "天空卫队哨站",
+ ["Shartuul's Transporter"] = "沙图尔的传送器",
+ ["Forge Camp: Wrath"] = "铸魔营地:天罚",
+ ["Bash'ir Landing"] = "巴什伊尔码头",
+ ["Crystal Spine"] = "水晶之脊",
+ ["Insidion's Perch"] = "因斯迪安栖木",
+ ["Furywing's Perch"] = "弗雷文栖木",
+
+ ["Tirisfal"] = "提里斯法林地",--TaxiNodesDBC
+ ["Sunken Temple"] = "沉没的神庙",--AreaTableDBC
+ }
+elseif GAME_LOCALE == "zhTW" then
+ lib:SetCurrentTranslations {
+ ["Azeroth"] = "艾澤拉斯",
+ ["Eastern Kingdoms"] = "東部王國",
+ ["Kalimdor"] = "卡林多",
+ ["Outland"] = "外域",
+ ["Cosmic map"] = "宇宙地圖",
+
+ ["Ahn'Qiraj"] = "安其拉",
+ ["Alterac Mountains"] = "奧特蘭克山脈",
+ ["Alterac Valley"] = "奧特蘭克山谷",
+ ["Arathi Basin"] = "阿拉希盆地",
+ ["Arathi Highlands"] = "阿拉希高地",
+ ["Ashenvale"] = "梣谷",
+ ["Auberdine"] = "奧伯丁",
+ ["Azshara"] = "艾薩拉",
+ ["Badlands"] = "荒蕪之地",
+ ["The Barrens"] = "貧瘠之地",
+ ["Blackfathom Deeps"] = "黑暗深淵",
+ ["Blackrock Depths"] = "黑石深淵",
+ ["Blackrock Mountain"] = "黑石山",
+ ["Blackrock Spire"] = "黑石塔",
+ ["Blackwing Lair"] = "黑翼之巢",
+ ["Blasted Lands"] = "詛咒之地",
+ ["Booty Bay"] = "藏寶海灣",
+ ["Burning Steppes"] = "燃燒平原",
+ ["Darkshore"] = "黑海岸",
+ ["Darnassus"] = "達納蘇斯",
+ ["The Deadmines"] = "死亡礦坑",
+ ["Deadwind Pass"] = "逆風小徑",
+ ["Deeprun Tram"] = "礦道地鐵",
+ ["Desolace"] = "淒涼之地",
+ ["Dire Maul"] = "厄運之槌",
+ ["Dire Maul (East)"] = "厄運之槌 - 東",
+ ["Dire Maul (West)"] = "厄運之槌 - 西",
+ ["Dire Maul (North)"] = "厄運之槌 - 北",
+ ["Dun Morogh"] = "丹莫洛",
+ ["Durotar"] = "杜洛塔",
+ ["Duskwood"] = "暮色森林",
+ ["Dustwallow Marsh"] = "塵泥沼澤",
+ ["Eastern Plaguelands"] = "東瘟疫之地",
+ ["Elwynn Forest"] = "艾爾文森林",
+ ["Everlook"] = "永望鎮",
+ ["Felwood"] = "費伍德森林",
+ ["Feralas"] = "菲拉斯",
+ ["The Forbidding Sea"] = "禁忌之海",
+ ["Gadgetzan"] = "加基森",
+ ["Gates of Ahn'Qiraj"] = "安其拉之門",
+ ["Gnomeregan"] = "諾姆瑞根",
+ ["The Great Sea"] = "無盡之海",
+ ["Grom'gol Base Camp"] = "格羅姆高營地",
+ ["Hall of Legends"] = "傳說大廳",
+ ["Hillsbrad Foothills"] = "希爾斯布萊德丘陵",
+ ["The Hinterlands"] = "辛特蘭",
+ ["Hyjal"] = "海加爾山",
+ ["Hyjal Summit"] = "海加爾山",
+ ["Ironforge"] = "鐵爐堡",
+ ["Loch Modan"] = "洛克莫丹",
+ ["Lower Blackrock Spire"] = "低階黑石塔",
+ ["Maraudon"] = "瑪拉頓",
+ ["Menethil Harbor"] = "米奈希爾港",
+ ["Molten Core"] = "熔火之心",
+ ["Moonglade"] = "月光林地",
+ ["Mulgore"] = "莫高雷",
+ ["Naxxramas"] = "納克薩瑪斯",
+ ["Onyxia's Lair"] = "奧妮克希亞的巢穴",
+ ["Orgrimmar"] = "奧格瑪",
+ ["Ratchet"] = "棘齒城",
+ ["Ragefire Chasm"] = "怒焰裂谷",
+ ["Razorfen Downs"] = "剃刀高地",
+ ["Razorfen Kraul"] = "剃刀沼澤",
+ ["Redridge Mountains"] = "赤脊山",
+ ["Ruins of Ahn'Qiraj"] = "安其拉廢墟",
+ ["Scarlet Monastery"] = "血色修道院",
+ ["Scholomance"] = "通靈學院",
+ ["Searing Gorge"] = "灼熱峽谷",
+ ["Shadowfang Keep"] = "影牙城堡",
+ ["Silithus"] = "希利蘇斯",
+ ["Silverpine Forest"] = "銀松森林",
+ ["The Stockade"] = "監獄",
+ ["Stonard"] = "斯通納德",
+ ["Stonetalon Mountains"] = "石爪山脈",
+ ["Stormwind City"] = "暴風城",
+ --["Stormwind"] = true,
+ ["Stranglethorn Vale"] = "荊棘谷",
+ ["Stratholme"] = "斯坦索姆",
+ ["Swamp of Sorrows"] = "悲傷沼澤",
+ ["Tanaris"] = "塔納利斯",
+ ["Teldrassil"] = "泰達希爾",
+ ["Temple of Ahn'Qiraj"] = "安其拉神廟",
+ ["The Temple of Atal'Hakkar"] = "阿塔哈卡神廟",
+ ["Theramore Isle"] = "塞拉摩島",
+ ["Thousand Needles"] = "千針石林",
+ ["Thunder Bluff"] = "雷霆崖",
+ ["Tirisfal Glades"] = "提里斯法林地",
+ ["Uldaman"] = "奧達曼",
+ ["Un'Goro Crater"] = "安戈洛環形山",
+ ["Undercity"] = "幽暗城",
+ ["Upper Blackrock Spire"] = "高階黑石塔",
+ ["Wailing Caverns"] = "哀嚎洞穴",
+ ["Warsong Gulch"] = "戰歌峽谷",
+ ["Western Plaguelands"] = "西瘟疫之地",
+ ["Westfall"] = "西部荒野",
+ ["Wetlands"] = "濕地",
+ ["Winterspring"] = "冬泉谷",
+ ["Zul'Farrak"] = "祖爾法拉克",
+ ["Zul'Gurub"] = "祖爾格拉布",
+
+ ["Champions' Hall"] = "勇士大廳",
+ --["Hall of Champions"] = true,
+ ["Blade's Edge Arena"] = "劍刃競技場",
+ ["Nagrand Arena"] = "納葛蘭競技場",
+ ["Ruins of Lordaeron"] = "羅德隆廢墟",
+ ["Twisting Nether"] = "扭曲虛空",
+ ["The Veiled Sea"] = "迷霧之海",
+ ["The North Sea"] = "北方海岸",
+ ["Armory"] = "軍械庫",
+ ["Library"] = "圖書館",
+ ["Cathedral"] = "教堂",
+ ["Graveyard"] = "墓地",
+
+ -- Burning Crusade
+
+ -- Subzones used for displaying instances.
+ ["Plaguewood"] = "病木林",
+ ["Hellfire Citadel"] = "地獄火堡壘",
+ ["Auchindoun"] = "奧齊頓",
+ ["The Bone Wastes"] = "白骨荒野", -- Substitute for Auchindoun, since this is what shows on the minimap.
+ ["Ring of Observance"] = "儀式競技場",
+ ["Coilfang Reservoir"] = "盤牙洞穴",
+ ["Amani Pass"] = "阿曼尼小俓",
+
+ ["Azuremyst Isle"] = "藍謎島",
+ ["Bloodmyst Isle"] = "血謎島",
+ ["Eversong Woods"] = "永歌森林",
+ ["Ghostlands"] = "鬼魂之地",
+ ["The Exodar"] = "艾克索達",
+ ["Silvermoon City"] = "銀月城",
+ ["Shadowmoon Valley"] = "影月谷",
+ ["Black Temple"] = "黑暗神廟",
+ ["Terokkar Forest"] = "泰洛卡森林",
+ ["Auchenai Crypts"] = "奧奇奈地穴",
+ ["Mana-Tombs"] = "法力墓地",
+ ["Shadow Labyrinth"] = "暗影迷宮",
+ ["Sethekk Halls"] = "塞司克大廳",
+ ["Hellfire Peninsula"] = "地獄火半島",
+ ["The Dark Portal"] = "黑暗之門",
+ ["Hellfire Ramparts"] = "地獄火壁壘",
+ ["The Blood Furnace"] = "血熔爐",
+ ["The Shattered Halls"] = "破碎大廳",
+ ["Magtheridon's Lair"] = "瑪瑟里頓的巢穴",
+ ["Nagrand"] = "納葛蘭",
+ ["Zangarmarsh"] = "贊格沼澤",
+ ["The Slave Pens"] = "奴隸監獄",
+ ["The Underbog"] = "深幽泥沼",
+ ["The Steamvault"] = "蒸汽洞窟",
+ ["Serpentshrine Cavern"] = "毒蛇神殿洞穴",
+ ["Blade's Edge Mountains"] = "劍刃山脈",
+ ["Gruul's Lair"] = "戈魯爾之巢",
+ ["Netherstorm"] = "虛空風暴",
+ ["Tempest Keep"] = "風暴要塞",
+ ["The Mechanar"] = "麥克納爾",
+ ["The Botanica"] = "波塔尼卡",
+ ["The Arcatraz"] = "亞克崔茲",
+ ["The Eye"] = "風暴要塞",
+ ["Eye of the Storm"] = "暴風之眼",
+ ["Shattrath City"] = "撒塔斯城",
+ --["Shattrath"] = true,
+ ["Karazhan"] = "卡拉贊",
+ ["Caverns of Time"] = "時光之穴",
+ ["Old Hillsbrad Foothills"] = "希爾斯布萊德丘陵舊址",
+ ["The Black Morass"] = "黑色沼澤",
+ ["Night Elf Village"] = "夜精靈村",
+ ["Horde Encampment"] = "部落營地",
+ ["Alliance Base"] = "聯盟營地",
+ ["Zul'Aman"] = "祖阿曼",
+ ["Quel'thalas"] = "奎爾薩拉斯",
+ ["Isle of Quel'Danas"] = "奎爾達納斯之島",
+ ["Sunwell Plateau"] = "太陽之井高地",
+ ["Magisters' Terrace"] = "博學者殿堂",
+
+ -- Blade's Edge Plateau
+ ["Forge Camp: Terror"] = "煉冶場:驚駭",
+ ["Vortex Pinnacle"] = "漩渦尖塔",
+ ["Rivendark's Perch"] = "瑞文達科棲所",
+ ["Ogri'la"] = "歐格利拉",
+ ["Obsidia's Perch"] = "歐比希迪亞棲所",
+ ["Skyguard Outpost"] = "禦天者崗哨",
+ ["Shartuul's Transporter"] = "夏圖歐的傳送門",
+ ["Forge Camp: Wrath"] = "煉冶場:憤怒",
+ ["Bash'ir Landing"] = "貝許爾平臺",
+ ["Crystal Spine"] = "水晶背脊",
+ ["Insidion's Perch"] = "印希迪恩棲所",
+ ["Furywing's Perch"] = "狂怒之翼棲所",
+
+ ["Tirisfal"] = "提里斯法林地",
+ ["Sunken Temple"] = "沉沒的神廟",
+ }
+elseif GAME_LOCALE == "koKR" then
+ lib:SetCurrentTranslations {
+ ["Azeroth"] = "아제로스",
+ ["Eastern Kingdoms"] = "동부 왕국",
+ ["Kalimdor"] = "칼림도어",
+ ["Outland"] = "아웃랜드",
+ ["Cosmic map"] = "세계 지도",
+
+ ["Ahn'Qiraj"] = "안퀴라즈",
+ ["Alterac Mountains"] = "알터랙 산맥",
+ ["Alterac Valley"] = "알터랙 계곡",
+ ["Arathi Basin"] = "아라시 분지",
+ ["Arathi Highlands"] = "아라시 고원",
+ ["Ashenvale"] = "잿빛 골짜기",
+ ["Auberdine"] = "아우버다인",
+ ["Azshara"] = "아즈샤라",
+ ["Badlands"] = "황야의 땅",
+ ["The Barrens"] = "불모의 땅",
+ ["Blackfathom Deeps"] = "검은심연의 나락",
+ ["Blackrock Depths"] = "검은바위 나락",
+ ["Blackrock Mountain"] = "검은바위 산",
+ ["Blackrock Spire"] = "검은바위 첨탑",
+ ["Blackwing Lair"] = "검은날개 둥지",
+ ["Blasted Lands"] = "저주받은 땅",
+ ["Booty Bay"] = "무법항",
+ ["Burning Steppes"] = "불타는 평원",
+ ["Darkshore"] = "어둠의 해안",
+ ["Darnassus"] = "다르나서스",
+ ["The Deadmines"] = "죽음의 폐광",
+ ["Deadwind Pass"] = "죽음의 고개",
+ ["Deeprun Tram"] = "깊은굴 지하철",
+ ["Desolace"] = "잊혀진 땅",
+ ["Dire Maul"] = "혈투의 전장",
+ ["Dire Maul (East)"] = "혈투의 전장 동부",
+ ["Dire Maul (West)"] = "혈투의 전장 서부",
+ ["Dire Maul (North)"] = "혈투의 전장 북부",
+ ["Dun Morogh"] = "던 모로",
+ ["Durotar"] = "듀로타",
+ ["Duskwood"] = "그늘숲",
+ ["Dustwallow Marsh"] = "먼지진흙 습지대",
+ ["Eastern Plaguelands"] = "동부 역병지대",
+ ["Elwynn Forest"] = "엘윈 숲",
+ ["Everlook"] = "눈망루 마을",
+ ["Felwood"] = "악령의 숲",
+ ["Feralas"] = "페랄라스",
+ ["The Forbidding Sea"] = "성난폭풍 해안",
+ ["Gadgetzan"] = "가젯잔",
+ ["Gates of Ahn'Qiraj"] = "안퀴라즈 성문",
+ ["Gnomeregan"] = "놈리건",
+ ["The Great Sea"] = "대해",
+ ["Grom'gol Base Camp"] = "그롬골 주둔지",
+ ["Hall of Legends"] = "전설의 전당",
+ ["Hillsbrad Foothills"] = "힐스브래드 구릉지",
+ ["The Hinterlands"] = "동부 내륙지",
+ ["Hyjal"] = "하이잘",
+ ["Hyjal Summit"] = "하이잘 정상",
+ ["Ironforge"] = "아이언포지",
+ ["Loch Modan"] = "모단 호수",
+ ["Lower Blackrock Spire"] = "검은바위 첨탑 하층",
+ ["Maraudon"] = "마라우돈",
+ ["Menethil Harbor"] = "메네실 항구",
+ ["Molten Core"] = "화산 심장부",
+ ["Moonglade"] = "달의 숲",
+ ["Mulgore"] = "멀고어",
+ ["Naxxramas"] = "낙스라마스",
+ ["Onyxia's Lair"] = "오닉시아의 둥지",
+ ["Orgrimmar"] = "오그리마",
+ ["Ratchet"] = "톱니항",
+ ["Ragefire Chasm"] = "성난불길 협곡",
+ ["Razorfen Downs"] = "가시덩굴 구릉",
+ ["Razorfen Kraul"] = "가시덩굴 우리",
+ ["Redridge Mountains"] = "붉은마루 산맥",
+ ["Ruins of Ahn'Qiraj"] = "안퀴라즈 폐허",
+ ["Scarlet Monastery"] = "붉은십자군 수도원",
+ ["Scholomance"] = "스칼로맨스",
+ ["Searing Gorge"] = "이글거리는 협곡",
+ ["Shadowfang Keep"] = "그림자송곳니 성채",
+ ["Silithus"] = "실리더스",
+ ["Silverpine Forest"] = "은빛소나무 숲",
+ ["The Stockade"] = "스톰윈드 지하감옥",
+ ["Stonard"] = "스토나드",
+ ["Stonetalon Mountains"] = "돌발톱 산맥",
+ ["Stormwind City"] = "스톰윈드",
+ ["Stormwind"] = "스톰윈드",
+ ["Stranglethorn Vale"] = "가시덤불 골짜기",
+ ["Stratholme"] = "스트라솔름",
+ ["Swamp of Sorrows"] = "슬픔의 늪",
+ ["Tanaris"] = "타나리스",
+ ["Teldrassil"] = "텔드랏실",
+ ["Temple of Ahn'Qiraj"] = "안퀴라즈 사원",
+ ["The Temple of Atal'Hakkar"] = "아탈학카르 신전",
+ ["Theramore Isle"] = "테라모어 섬",
+ ["Thousand Needles"] = "버섯구름 봉우리",
+ ["Thunder Bluff"] = "썬더 블러프",
+ ["Tirisfal Glades"] = "티리스팔 숲",
+ ["Uldaman"] = "울다만",
+ ["Un'Goro Crater"] = "운고로 분화구",
+ ["Undercity"] = "언더시티",
+ ["Upper Blackrock Spire"] = "검은바위 첨탑 상층",
+ ["Wailing Caverns"] = "통곡의 동굴",
+ ["Warsong Gulch"] = "전쟁노래 협곡",
+ ["Western Plaguelands"] = "서부 역병지대",
+ ["Westfall"] = "서부 몰락지대",
+ ["Wetlands"] = "저습지",
+ ["Winterspring"] = "여명의 설원",
+ ["Zul'Farrak"] = "줄파락",
+ ["Zul'Gurub"] = "줄구룹",
+
+ ["Champions' Hall"] = "용사의 전당",
+ ["Hall of Champions"] = "용사의 전당",
+ ["Blade's Edge Arena"] = "칼날 투기장",
+ ["Nagrand Arena"] = "나그란드 투기장",
+ ["Ruins of Lordaeron"] = "로데론의 폐허",
+ ["Twisting Nether"] = "뒤틀린 황천",
+ ["The Veiled Sea"] = "장막의 바다",
+ ["The North Sea"] = "북해", -- check
+ ["Armory"] = "무기고",
+ ["Library"] = "도서관",
+ ["Cathedral"] = "대성당",
+ ["Graveyard"] = "묘지",
+
+ -- Burning Crusade
+
+ -- Subzones used for displaying instances.
+ ["Plaguewood"] = "역병의 숲",
+ ["Hellfire Citadel"] = "지옥불 성채",
+ ["Auchindoun"] = "아킨둔",
+ ["The Bone Wastes"] = "해골 무덤", -- Substitute for Auchindoun, since this is what shows on the minimap.
+ ["Ring of Observance"] = "규율의 광장",
+ ["Coilfang Reservoir"] = "갈퀴송곳니 저수지",
+ ["Amani Pass"] = "아마니 고개",
+
+ ["Azuremyst Isle"] = "하늘안개 섬",
+ ["Bloodmyst Isle"] = "핏빛안개 섬",
+ ["Eversong Woods"] = "영원노래 숲",
+ ["Ghostlands"] = "유령의 땅",
+ ["The Exodar"] = "엑소다르",
+ ["Silvermoon City"] = "실버문",
+ ["Shadowmoon Valley"] = "어둠달 골짜기",
+ ["Black Temple"] = "검은 사원",
+ ["Terokkar Forest"] = "테로카르 숲",
+ ["Auchenai Crypts"] = "아키나이 납골당",
+ ["Mana-Tombs"] = "마나 무덤",
+ ["Shadow Labyrinth"] = "어둠의 미궁",
+ ["Sethekk Halls"] = "세데크 전당",
+ ["Hellfire Peninsula"] = "지옥불 반도",
+ ["The Dark Portal"] = "어둠의 문",
+ ["Hellfire Ramparts"] = "지옥불 성루",
+ ["The Blood Furnace"] = "피의 용광로",
+ ["The Shattered Halls"] = "으스러진 손의 전당",
+ ["Magtheridon's Lair"] = "마그테리돈의 둥지",
+ ["Nagrand"] = "나그란드",
+ ["Zangarmarsh"] = "장가르 습지대",
+ ["The Slave Pens"] = "강제 노역소",
+ ["The Underbog"] = "지하수렁",
+ ["The Steamvault"] = "증기 저장고",
+ ["Serpentshrine Cavern"] = "불뱀 제단",
+ ["Blade's Edge Mountains"] = "칼날 산맥",
+ ["Gruul's Lair"] = "그룰의 둥지",
+ ["Netherstorm"] = "황천의 폭풍",
+ ["Tempest Keep"] = "폭풍우 요새",
+ ["The Mechanar"] = "메카나르",
+ ["The Botanica"] = "신록의 정원",
+ ["The Arcatraz"] = "알카트라즈",
+ ["The Eye"] = "눈", -- check
+ ["Eye of the Storm"] = "폭풍의 눈",
+ ["Shattrath City"] = "샤트라스",
+ ["Shattrath"] = "샤트라스",
+ ["Karazhan"] = "카라잔",
+ ["Caverns of Time"] = "시간의 동굴",
+ ["Old Hillsbrad Foothills"] = "옛 힐스브래드 구릉지",
+ ["The Black Morass"] = "검은늪",
+ ["Night Elf Village"] = "나이트 엘프 마을",
+ ["Horde Encampment"] = "호드 야영지",
+ ["Alliance Base"] = "얼라이언스 주둔지",
+ ["Zul'Aman"] = "줄아만",
+ ["Quel'thalas"] = "쿠엘탈라스",
+ ["Isle of Quel'Danas"] = "쿠엘다나스 섬",
+ ["Sunwell Plateau"] = "태양샘 고원",
+ ["Magisters' Terrace"] = "마법학자의 정원",
+
+ -- Blade's Edge Plateau
+ ["Forge Camp: Terror"] = "공포의 괴철로 기지",
+ ["Vortex Pinnacle"] = "소용돌이 고원",
+ ["Rivendark's Perch"] = "리븐다크의 둥지",
+ ["Ogri'la"] = "오그릴라",
+ ["Obsidia's Perch"] = "옵시디아의 둥지",
+ ["Skyguard Outpost"] = "하늘경비대 전초기지",
+ ["Shartuul's Transporter"] = "샤툴의 순간이동기",
+ ["Forge Camp: Wrath"] = "격노의 괴철로 기지",
+ ["Bash'ir Landing"] = "바쉬르 영지",
+ ["Crystal Spine"] = "수정 돌기",
+ ["Insidion's Perch"] = "인시디온의 둥지",
+ ["Furywing's Perch"] = "퓨리윙의 둥지",
+
+ ["Tirisfal"] = "티리스팔",
+ ["Sunken Temple"] = "가라앉은 사원",
+ }
+elseif GAME_LOCALE == "esES" then
+ lib:SetCurrentTranslations {
+ ["Azeroth"] = "Azeroth",
+ ["Eastern Kingdoms"] = "Reinos del Este",
+ ["Kalimdor"] = "Kalimdor",
+ ["Outland"] = "Terrallende",
+ ["Cosmic map"] = "Mapa cósmico",
+
+ ["Ahn'Qiraj"] = "Ahn'Qiraj",
+ ["Alterac Mountains"] = "Montañas de Alterac",
+ ["Alterac Valley"] = "Valle de Alterac",
+ ["Arathi Basin"] = "Cuenca de Arathi",
+ ["Arathi Highlands"] = "Tierras Altas de Arathi",
+ ["Ashenvale"] = "Vallefresno",
+ ["Auberdine"] = "Auberdine",
+ ["Azshara"] = "Azshara",
+ ["Badlands"] = "Tierras Inhóspitas",
+ ["The Barrens"] = "Los Baldíos",
+ ["Blackfathom Deeps"] = "Cavernas de Brazanegra",
+ ["Blackrock Depths"] = "Profundidades de Roca Negra",
+ ["Blackrock Mountain"] = "Montaña Roca Negra",
+ ["Blackrock Spire"] = "Cumbre de Roca Negra",
+ ["Blackwing Lair"] = "Guarida Alanegra",
+ ["Blasted Lands"] = "Las Tierras Devastadas",
+ ["Booty Bay"] = "Bahía del Botín",
+ ["Burning Steppes"] = "Las Estepas Ardientes",
+ ["Darkshore"] = "Costa Oscura",
+ ["Darnassus"] = "Darnassus",
+ ["The Deadmines"] = "Las Minas de la Muerte",
+ ["Deadwind Pass"] = "Paso de la Muerte",
+ ["Deeprun Tram"] = "Tranvía Subterráneo",
+ ["Desolace"] = "Desolace",
+ ["Dire Maul"] = "La Masacre",
+ ["Dire Maul (East)"] = "La Masacre (Este)",
+ ["Dire Maul (West)"] = "La Masacre (Oeste)",
+ ["Dire Maul (North)"] = "La Masacre (Norte)",
+ ["Dun Morogh"] = "Dun Morogh",
+ ["Durotar"] = "Durotar",
+ ["Duskwood"] = "Bosque del Ocaso",
+ ["Dustwallow Marsh"] = "Marjal Revolcafango",
+ ["Eastern Plaguelands"] = "Tierras de la Peste del Este",
+ ["Elwynn Forest"] = "Bosque de Elwynn",
+ ["Everlook"] = "Vista Eterna",
+ ["Felwood"] = "Frondavil",
+ ["Feralas"] = "Feralas",
+ ["The Forbidding Sea"] = "Mar Adusto",
+ ["Gadgetzan"] = "Gadgetzan",
+ ["Gates of Ahn'Qiraj"] = "Puertas de Ahn'Qiraj",
+ ["Gnomeregan"] = "Gnomeregan",
+ ["The Great Sea"] = "Mare Magnum",
+ ["Grom'gol Base Camp"] = "Campamento Grom'gol",
+ ["Hall of Legends"] = "Sala de las Leyendas",
+ ["Hillsbrad Foothills"] = "Laderas de Trabalomas",
+ ["The Hinterlands"] = "Tierras del Interior",
+ ["Hyjal"] = "Hyjal",
+ ["Hyjal Summit"] = "Hyjal Summit",
+ ["Ironforge"] = "Forjaz",
+ ["Loch Modan"] = "Loch Modan",
+ ["Lower Blackrock Spire"] = "Cumbre inferior de Roca Negra",
+ ["Maraudon"] = "Maraudon",
+ ["Menethil Harbor"] = "Puerto de Menethil",
+ ["Molten Core"] = "Núcleo de Magma",
+ ["Moonglade"] = "Claro de la Luna",
+ ["Mulgore"] = "Mulgore",
+ ["Naxxramas"] = "Naxxramas",
+ ["Onyxia's Lair"] = "Guarida de Onyxia",
+ ["Orgrimmar"] = "Orgrimmar",
+ ["Ratchet"] = "Trinquete",
+ ["Ragefire Chasm"] = "Sima ígnea",
+ ["Razorfen Downs"] = "Zahúrda Rajacieno",
+ ["Razorfen Kraul"] = "Horado Rajacieno",
+ ["Redridge Mountains"] = "Montañas Crestagrana",
+ ["Ruins of Ahn'Qiraj"] = "Ruinas de Ahn'Qiraj",
+ ["Scarlet Monastery"] = "Monasterio Escarlata",
+ ["Scholomance"] = "Scholomance",
+ ["Searing Gorge"] = "La Garganta de Fuego",
+ ["Shadowfang Keep"] = "Castillo de Colmillo Oscuro",
+ ["Silithus"] = "Silithus",
+ ["Silverpine Forest"] = "Bosque de Argénteos",
+ ["The Stockade"] = "Las Mazmorras",
+ --["Stonard"] = "",
+ ["Stonetalon Mountains"] = "Sierra Espolón",
+ ["Stormwind City"] = "Ciudad de Ventormenta",
+ ["Stormwind"] = "Ventormenta",
+ ["Stranglethorn Vale"] = "Vega de Tuercespina",
+ ["Stratholme"] = "Stratholme",
+ ["Swamp of Sorrows"] = "Pantano de las Penas",
+ ["Tanaris"] = "Tanaris",
+ ["Teldrassil"] = "Teldrassil",
+ ["Temple of Ahn'Qiraj"] = "El Templo de Ahn'Qiraj",
+ ["The Temple of Atal'Hakkar"] = "El Templo de Atal'Hakkar",
+ ["Theramore Isle"] = "Isla Theramore",
+ ["Thousand Needles"] = "Las Mil Agujas",
+ ["Thunder Bluff"] = "Cima del Trueno",
+ ["Tirisfal Glades"] = "Claros de Tirisfal",
+ ["Uldaman"] = "Uldaman",
+ ["Un'Goro Crater"] = "Cráter de Un'Goro",
+ ["Undercity"] = "Entrañas",
+ ["Upper Blackrock Spire"] = "Cumbre de Roca Negra",
+ ["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",
+ ["Winterspring"] = "Cuna del Invierno",
+ ["Zul'Farrak"] = "Zul'Farrak",
+ ["Zul'Gurub"] = "Zul'Gurub",
+
+ ["Champions' Hall"] = "Sala de los Campeones",
+ ["Hall of Champions"] = "Sala de los Campeones",
+ ["Blade's Edge Arena"] = "Arena Filospada",
+ ["Nagrand Arena"] = "Arena de Nagrand",
+ ["Ruins of Lordaeron"] = "Ruinas de Lordaeron", -- check
+ ["Twisting Nether"] = "El Vacío Abisal",
+ ["The Veiled Sea"] = "Mar de la Bruma",
+ ["The North Sea"] = "El Mar Norte",
+ ["Armory"] = "Armería",
+ ["Library"] = "Biblioteca",
+ ["Cathedral"] = "Catedral",
+ ["Graveyard"] = "Cementerio",
+
+ -- Burning Crusade
+
+ -- Subzones used for displaying instances.
+ ["Plaguewood"] = "Bosque de la Plaga",
+ ["Hellfire Citadel"] = "Ciudadela del Fuego Infernal",
+ ["Auchindoun"] = "Auchindoun",
+ ["The Bone Wastes"] = "El Vertedero de Huesos",
+ ["Ring of Observance"] = "Círculo de la Observancia",
+ ["Coilfang Reservoir"] = "Reserva Colmillo Torcido",
+ ["Amani Pass"] = "Paso de Amani",
+
+ ["Azuremyst Isle"] = "Isla Bruma Azur",
+ ["Bloodmyst Isle"] = "Isla Bruma de Sangre",
+ ["Eversong Woods"] = "Bosque Canción Eterna",
+ ["Ghostlands"] = "Tierras Fantasma",
+ ["The Exodar"] = "El Exodar",
+ ["Silvermoon City"] = "Ciudad de Lunargenta",
+ ["Shadowmoon Valley"] = "Valle Sombraluna",
+ ["Black Temple"] = "El Templo Oscuro", -- check
+ ["Terokkar Forest"] = "Bosque de Terokkar",
+ ["Auchenai Crypts"] = "Criptas Auchenai",
+ ["Mana-Tombs"] = "Tumbas de Maná",
+ ["Shadow Labyrinth"] = "Laberinto de las Sombras",
+ ["Sethekk Halls"] = "Salas Sethekk",
+ ["Hellfire Peninsula"] = "Península del Fuego Infernal",
+ ["The Dark Portal"] = "El Portal Oscuro",
+ ["Hellfire Ramparts"] = "Murallas del Fuego Infernal",
+ ["The Blood Furnace"] = "El Horno de Sangre",
+ ["The Shattered Halls"] = "Las Salas Arrasadas",
+ ["Magtheridon's Lair"] = "Guarida de Magtheridon", -- check - Magtheradon /Magtheridon ??
+ ["Nagrand"] = "Nagrand",
+ ["Zangarmarsh"] = "Marisma de Zangar",
+ ["The Slave Pens"] = "Recinto de los Esclavos",
+ ["The Underbog"] = "La Sotiénaga",
+ ["The Steamvault"] = "La Cámara de Vapor",
+ ["Serpentshrine Cavern"] = "Caverna Santuario Serpiente", -- check
+ ["Blade's Edge Mountains"] = "Montañas Filospada",
+ ["Gruul's Lair"] = "Guarida de Gruul",
+ ["Netherstorm"] = "Tormenta Abisal",
+ ["Tempest Keep"] = "El Castillo de la Tempestad",
+ ["The Mechanar"] = "El Mechanar",
+ ["The Botanica"] = "El Invernáculo",
+ ["The Arcatraz"] = "El Alcatraz",
+ ["The Eye"] = "El Ojo", -- check
+ ["Eye of the Storm"] = "Ojo de la Tormenta",
+ ["Shattrath City"] = "Ciudad de Shattrath",
+ ["Shattrath"] = "Shattrath",
+ ["Karazhan"] = "Karazhan",
+ ["Caverns of Time"] = "Cavernas del Tiempo",
+ ["Old Hillsbrad Foothills"] = "Viejas Laderas de Trabalomas", -- doesn't work in spanish anyway
+ ["The Black Morass"] = "La Ciénaga Negra",
+ ["Night Elf Village"] = "Night Elf Village",
+ ["Horde Encampment"] = "Horde Encampment",
+ ["Alliance Base"] = "Alliance Base",
+ ["Zul'Aman"] = "Zul'Aman",
+ ["Quel'thalas"] = "Quel'thalas",
+ ["Isle of Quel'Danas"] = "Isla de Quel'Danas",
+ ["Sunwell Plateau"] = "Meseta de la Fuente del Sol",
+ ["Magisters' Terrace"] = "Bancal Del Magister" ,
+
+ -- Blade's Edge Plateau
+ ["Forge Camp: Terror"] = "",
+ ["Vortex Pinnacle"] = "",
+ ["Rivendark's Perch"] = "",
+ ["Ogri'la"] = "",
+ ["Obsidia's Perch"] = "",
+ ["Skyguard Outpost"] = "",
+ ["Shartuul's Transporter"] = "",
+ ["Forge Camp: Wrath"] = "",
+ ["Bash'ir Landing"] = "",
+ ["Crystal Spine"] = "",
+ ["Insidion's Perch"] = "",
+ ["Furywing's Perch"] = "",
+
+ ["Tirisfal"] = "Tirisfal",
+ ["Sunken Temple"] = "El Templo de Sunken",
+ }
+elseif GAME_LOCALE == "esMX" then
+ lib:SetCurrentTranslations {
+ ["Azeroth"] = "Azeroth",
+ ["Eastern Kingdoms"] = "Reinos del Este",
+ ["Kalimdor"] = "Kalimdor",
+ ["Outland"] = "Terrallende",
+ ["Cosmic map"] = "Mapa cósmico",
+
+ ["Ahn'Qiraj"] = "Ahn'Qiraj",
+ ["Alterac Mountains"] = "Montañas de Alterac",
+ ["Alterac Valley"] = "Valle de Alterac",
+ ["Arathi Basin"] = "Cuenca de Arathi",
+ ["Arathi Highlands"] = "Tierras Altas de Arathi",
+ ["Ashenvale"] = "Vallefresno",
+ ["Auberdine"] = "Auberdine",
+ ["Azshara"] = "Azshara",
+ ["Badlands"] = "Tierras Inhóspitas",
+ ["The Barrens"] = "Los Baldíos",
+ ["Blackfathom Deeps"] = "Cavernas de Brazanegra",
+ ["Blackrock Depths"] = "Profundidades de Roca Negra",
+ ["Blackrock Mountain"] = "Montaña Roca Negra",
+ ["Blackrock Spire"] = "Cumbre de Roca Negra",
+ ["Blackwing Lair"] = "Guarida Alanegra",
+ ["Blasted Lands"] = "Las Tierras Devastadas",
+ ["Booty Bay"] = "Bahía del Botín",
+ ["Burning Steppes"] = "Las Estepas Ardientes",
+ ["Darkshore"] = "Costa Oscura",
+ ["Darnassus"] = "Darnassus",
+ ["The Deadmines"] = "Las Minas de la Muerte",
+ ["Deadwind Pass"] = "Paso de la Muerte",
+ ["Deeprun Tram"] = "Tranvía Subterráneo",
+ ["Desolace"] = "Desolace",
+ ["Dire Maul"] = "La Masacre",
+ ["Dire Maul (East)"] = "La Masacre (Este)",
+ ["Dire Maul (West)"] = "La Masacre (Oeste)",
+ ["Dire Maul (North)"] = "La Masacre (Norte)",
+ ["Dun Morogh"] = "Dun Morogh",
+ ["Durotar"] = "Durotar",
+ ["Duskwood"] = "Bosque del Ocaso",
+ ["Dustwallow Marsh"] = "Marjal Revolcafango",
+ ["Eastern Plaguelands"] = "Tierras de la Peste del Este",
+ ["Elwynn Forest"] = "Bosque de Elwynn",
+ ["Everlook"] = "Vista Eterna",
+ ["Felwood"] = "Frondavil",
+ ["Feralas"] = "Feralas",
+ ["The Forbidding Sea"] = "Mar Adusto",
+ ["Gadgetzan"] = "Gadgetzan",
+ ["Gates of Ahn'Qiraj"] = "Puertas de Ahn'Qiraj",
+ ["Gnomeregan"] = "Gnomeregan",
+ ["The Great Sea"] = "Mare Magnum",
+ ["Grom'gol Base Camp"] = "Campamento Grom'gol",
+ ["Hall of Legends"] = "Sala de las Leyendas",
+ ["Hillsbrad Foothills"] = "Laderas de Trabalomas",
+ ["The Hinterlands"] = "Tierras del Interior",
+ ["Hyjal"] = "Hyjal",
+ ["Hyjal Summit"] = "Hyjal Summit",
+ ["Ironforge"] = "Forjaz",
+ ["Loch Modan"] = "Loch Modan",
+ ["Lower Blackrock Spire"] = "Cumbre inferior de Roca Negra",
+ ["Maraudon"] = "Maraudon",
+ ["Menethil Harbor"] = "Puerto de Menethil",
+ ["Molten Core"] = "Núcleo de Magma",
+ ["Moonglade"] = "Claro de la Luna",
+ ["Mulgore"] = "Mulgore",
+ ["Naxxramas"] = "Naxxramas",
+ ["Onyxia's Lair"] = "Guarida de Onyxia",
+ ["Orgrimmar"] = "Orgrimmar",
+ ["Ratchet"] = "Trinquete",
+ ["Ragefire Chasm"] = "Sima ígnea",
+ ["Razorfen Downs"] = "Zahúrda Rajacieno",
+ ["Razorfen Kraul"] = "Horado Rajacieno",
+ ["Redridge Mountains"] = "Montañas Crestagrana",
+ ["Ruins of Ahn'Qiraj"] = "Ruinas de Ahn'Qiraj",
+ ["Scarlet Monastery"] = "Monasterio Escarlata",
+ ["Scholomance"] = "Scholomance",
+ ["Searing Gorge"] = "La Garganta de Fuego",
+ ["Shadowfang Keep"] = "Castillo de Colmillo Oscuro",
+ ["Silithus"] = "Silithus",
+ ["Silverpine Forest"] = "Bosque de Argénteos",
+ ["The Stockade"] = "Las Mazmorras",
+ --["Stonard"] = "",
+ ["Stonetalon Mountains"] = "Sierra Espolón",
+ ["Stormwind City"] = "Ciudad de Ventormenta",
+ ["Stormwind"] = "Ventormenta",
+ ["Stranglethorn Vale"] = "Vega de Tuercespina",
+ ["Stratholme"] = "Stratholme",
+ ["Swamp of Sorrows"] = "Pantano de las Penas",
+ ["Tanaris"] = "Tanaris",
+ ["Teldrassil"] = "Teldrassil",
+ ["Temple of Ahn'Qiraj"] = "El Templo de Ahn'Qiraj",
+ ["The Temple of Atal'Hakkar"] = "El Templo de Atal'Hakkar",
+ ["Theramore Isle"] = "Isla Theramore",
+ ["Thousand Needles"] = "Las Mil Agujas",
+ ["Thunder Bluff"] = "Cima del Trueno",
+ ["Tirisfal Glades"] = "Claros de Tirisfal",
+ ["Uldaman"] = "Uldaman",
+ ["Un'Goro Crater"] = "Cráter de Un'Goro",
+ ["Undercity"] = "Entrañas",
+ ["Upper Blackrock Spire"] = "Cumbre de Roca Negra",
+ ["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",
+ ["Winterspring"] = "Cuna del Invierno",
+ ["Zul'Farrak"] = "Zul'Farrak",
+ ["Zul'Gurub"] = "Zul'Gurub",
+
+ ["Champions' Hall"] = "Sala de los Campeones",
+ ["Hall of Champions"] = "Sala de los Campeones",
+ ["Blade's Edge Arena"] = "Arena Filospada",
+ ["Nagrand Arena"] = "Arena de Nagrand",
+ ["Ruins of Lordaeron"] = "Ruinas de Lordaeron", -- check
+ ["Twisting Nether"] = "El Vacío Abisal",
+ ["The Veiled Sea"] = "Mar de la Bruma",
+ ["The North Sea"] = "El Mar Norte",
+ ["Armory"] = "Armería",
+ ["Library"] = "Biblioteca",
+ ["Cathedral"] = "Catedral",
+ ["Graveyard"] = "Cementerio",
+
+ -- Burning Crusade
+
+ -- Subzones used for displaying instances.
+ ["Plaguewood"] = "Bosque de la Plaga",
+ ["Hellfire Citadel"] = "Ciudadela del Fuego Infernal",
+ ["Auchindoun"] = "Auchindoun",
+ ["The Bone Wastes"] = "El Vertedero de Huesos",
+ ["Ring of Observance"] = "Círculo de la Observancia",
+ ["Coilfang Reservoir"] = "Reserva Colmillo Torcido",
+ ["Amani Pass"] = "Paso de Amani",
+
+ ["Azuremyst Isle"] = "Isla Bruma Azur",
+ ["Bloodmyst Isle"] = "Isla Bruma de Sangre",
+ ["Eversong Woods"] = "Bosque Canción Eterna",
+ ["Ghostlands"] = "Tierras Fantasma",
+ ["The Exodar"] = "El Exodar",
+ ["Silvermoon City"] = "Ciudad de Lunargenta",
+ ["Shadowmoon Valley"] = "Valle Sombraluna",
+ ["Black Temple"] = "El Templo Oscuro", -- check
+ ["Terokkar Forest"] = "Bosque de Terokkar",
+ ["Auchenai Crypts"] = "Criptas Auchenai",
+ ["Mana-Tombs"] = "Tumbas de Maná",
+ ["Shadow Labyrinth"] = "Laberinto de las Sombras",
+ ["Sethekk Halls"] = "Salas Sethekk",
+ ["Hellfire Peninsula"] = "Península del Fuego Infernal",
+ ["The Dark Portal"] = "El Portal Oscuro",
+ ["Hellfire Ramparts"] = "Murallas del Fuego Infernal",
+ ["The Blood Furnace"] = "El Horno de Sangre",
+ ["The Shattered Halls"] = "Las Salas Arrasadas",
+ ["Magtheridon's Lair"] = "Guarida de Magtheridon", -- check - Magtheradon /Magtheridon ??
+ ["Nagrand"] = "Nagrand",
+ ["Zangarmarsh"] = "Marisma de Zangar",
+ ["The Slave Pens"] = "Recinto de los Esclavos",
+ ["The Underbog"] = "La Sotiénaga",
+ ["The Steamvault"] = "La Cámara de Vapor",
+ ["Serpentshrine Cavern"] = "Caverna Santuario Serpiente", -- check
+ ["Blade's Edge Mountains"] = "Montañas Filospada",
+ ["Gruul's Lair"] = "Guarida de Gruul",
+ ["Netherstorm"] = "Tormenta Abisal",
+ ["Tempest Keep"] = "El Castillo de la Tempestad",
+ ["The Mechanar"] = "El Mechanar",
+ ["The Botanica"] = "El Invernáculo",
+ ["The Arcatraz"] = "El Alcatraz",
+ ["The Eye"] = "El Ojo", -- check
+ ["Eye of the Storm"] = "Ojo de la Tormenta",
+ ["Shattrath City"] = "Ciudad de Shattrath",
+ ["Shattrath"] = "Shattrath",
+ ["Karazhan"] = "Karazhan",
+ ["Caverns of Time"] = "Cavernas del Tiempo",
+ ["Old Hillsbrad Foothills"] = "Viejas Laderas de Trabalomas", -- doesn't work in spanish anyway
+ ["The Black Morass"] = "La Ciénaga Negra",
+ ["Night Elf Village"] = "Night Elf Village",
+ ["Horde Encampment"] = "Horde Encampment",
+ ["Alliance Base"] = "Alliance Base",
+ ["Zul'Aman"] = "Zul'Aman",
+ ["Quel'thalas"] = "Quel'thalas",
+ ["Isle of Quel'Danas"] = "Isla de Quel'Danas",
+ ["Sunwell Plateau"] = "Meseta de la Fuente del Sol",
+ ["Magisters' Terrace"] = "Bancal Del Magister" ,
+
+ -- Blade's Edge Plateau
+ ["Forge Camp: Terror"] = "",
+ ["Vortex Pinnacle"] = "",
+ ["Rivendark's Perch"] = "",
+ ["Ogri'la"] = "",
+ ["Obsidia's Perch"] = "",
+ ["Skyguard Outpost"] = "",
+ ["Shartuul's Transporter"] = "",
+ ["Forge Camp: Wrath"] = "",
+ ["Bash'ir Landing"] = "",
+ ["Crystal Spine"] = "",
+ ["Insidion's Perch"] = "",
+ ["Furywing's Perch"] = "",
+
+ ["Tirisfal"] = "Tirisfal",
+ ["Sunken Temple"] = "El Templo de Sunken",
+ }
+elseif GAME_LOCALE == "ruRU" then
+ lib:SetCurrentTranslations {
+ ["Azeroth"] = "Азерот",
+ ["Eastern Kingdoms"] = "Восточные королевства",
+ ["Kalimdor"] = "Калимдор",
+ ["Outland"] = "Запределье",
+ ["Cosmic map"] = "Карта Вселенной",
+
+ ["Ahn'Qiraj"] = "Ан'Кираж",
+ ["Alterac Mountains"] = "Альтеракские горы",
+ ["Alterac Valley"] = "Альтеракская долина",
+ ["Arathi Basin"] = "Низина Арати",
+ ["Arathi Highlands"] = "Нагорье Арати",
+ ["Ashenvale"] = "Ясеневый лес",
+ ["Auberdine"] = "Аубердин",
+ ["Azshara"] = "Азшара",
+ ["Badlands"] = "Бесплодные земли",
+ ["The Barrens"] = "Степи",
+ ["Blackfathom Deeps"] = "Непроглядная Пучина",
+ ["Blackrock Depths"] = "Глубины Черной горы",
+ ["Blackrock Mountain"] = "Черная гора",
+ ["Blackrock Spire"] = "Вершина Черной горы",
+ ["Blackwing Lair"] = "Логово Крыла Тьмы",
+ ["Blasted Lands"] = "Выжженные земли",
+ ["Booty Bay"] = "Пиратская Бухта",
+ ["Burning Steppes"] = "Пылающие степи",
+ ["Darkshore"] = "Темные берега",
+ ["Darnassus"] = "Дарнасс",
+ ["The Deadmines"] = "Мертвые копи",
+ ["Deadwind Pass"] = "Перевал Мертвого Ветра",
+ ["Deeprun Tram"] = "Подземный поезд",
+ ["Desolace"] = "Пустоши",
+ ["Dire Maul"] = "Забытый Город",
+ ["Dire Maul (East)"] = "Забытый Город: Восток",
+ ["Dire Maul (West)"] = "Забытый Город: Запад",
+ ["Dire Maul (North)"] = "Забытый Город: Север",
+ ["Dun Morogh"] = "Дун Морог",
+ ["Durotar"] = "Дуротар",
+ ["Duskwood"] = "Сумеречный лес",
+ ["Dustwallow Marsh"] = "Пылевые топи",
+ ["Eastern Plaguelands"] = "Восточное Лихоземье",
+ ["Elwynn Forest"] = "Элвиннский лес",
+ ["Everlook"] = "Круговзор",
+ ["Felwood"] = "Оскверненный лес",
+ ["Feralas"] = "Фералас",
+ ["The Forbidding Sea"] = "Зловещее море",
+ ["Gadgetzan"] = "Прибамбасск",
+ ["Gates of Ahn'Qiraj"] = "Врата Ан'Киража",
+ ["Gnomeregan"] = "Гномреган",
+ ["The Great Sea"] = "Великое море",
+ ["Grom'gol Base Camp"] = "Лагерь Гром'гол",
+ ["Hall of Legends"] = "Зал Легенд",
+ ["Hillsbrad Foothills"] = "Предгорья Хилсбрада",
+ ["The Hinterlands"] = "Внутренние земли",
+ ["Hyjal"] = "Хиджал",
+ ["Hyjal Summit"] = "Вершина Хиджала",
+ ["Ironforge"] = "Стальгорн",
+ ["Loch Modan"] = "Лок Модан",
+ ["Lower Blackrock Spire"] = "Нижний ярус Черной горы",
+ ["Maraudon"] = "Мародон",
+ ["Menethil Harbor"] = "Гавань Менетил",
+ ["Molten Core"] = "Огненные Недра",
+ ["Moonglade"] = "Лунная поляна",
+ ["Mulgore"] = "Мулгор",
+ ["Naxxramas"] = "Наксрамас",
+ ["Onyxia's Lair"] = "Логово Ониксии",
+ ["Orgrimmar"] = "Оргриммар",
+ ["Ratchet"] = "Кабестан",
+ ["Ragefire Chasm"] = "Огненная пропасть",
+ ["Razorfen Downs"] = "Курганы Иглошкурых",
+ ["Razorfen Kraul"] = "Лабиринты Иглошкурых",
+ ["Redridge Mountains"] = "Красногорье",
+ ["Ruins of Ahn'Qiraj"] = "Руины Ан'Киража",
+ ["Scarlet Monastery"] = "Монастырь Алого ордена",
+ ["Scholomance"] = "Некроситет",
+ ["Searing Gorge"] = "Тлеющее ущелье",
+ ["Shadowfang Keep"] = "Крепость Темного Клыка",
+ ["Silithus"] = "Силитус",
+ ["Silverpine Forest"] = "Серебряный бор",
+ ["The Stockade"] = "Тюрьма",
+ ["Stonard"] = "Каменор",
+ ["Stonetalon Mountains"] = "Когтистые горы",
+ ["Stormwind City"] = "Штормград",
+ ["Stormwind"] = "Штормград",
+ ["Stranglethorn Vale"] = "Тернистая долина",
+ ["Stratholme"] = "Стратхольм",
+ ["Swamp of Sorrows"] = "Болото Печали",
+ ["Tanaris"] = "Танарис",
+ ["Teldrassil"] = "Тельдрассил",
+ ["Temple of Ahn'Qiraj"] = "Храм Ан'Кираж",
+ ["The Temple of Atal'Hakkar"] = "Храм Атал'Хаккара",
+ ["Theramore Isle"] = "Остров Терамор",
+ ["Thousand Needles"] = "Тысяча Игл",
+ ["Thunder Bluff"] = "Громовой Утес",
+ ["Tirisfal Glades"] = "Тирисфальские леса",
+ ["Uldaman"] = "Ульдаман",
+ ["Un'Goro Crater"] = "Кратер Ун'Горо",
+ ["Undercity"] = "Подгород",
+ ["Upper Blackrock Spire"] = "Верхний ярус Черной горы",
+ ["Wailing Caverns"] = "Пещеры Стенаний",
+ ["Warsong Gulch"] = "Ущелье Песни Войны",
+ ["Western Plaguelands"] = "Западное Лихоземье",
+ ["Westfall"] = "Западный Край",
+ ["Wetlands"] = "Болотина",
+ ["Winterspring"] = "Зимние Ключи",
+ ["Zul'Farrak"] = "Зул'Фаррак",
+ ["Zul'Gurub"] = "Зул'Гуруб",
+
+ ["Champions' Hall"] = "Зал Защитника",
+ ["Hall of Champions"] = "Чертог Защитников",
+ ["Blade's Edge Arena"] = "Арена Острогорья",
+ ["Nagrand Arena"] = "Арена Награнда",
+ ["Ruins of Lordaeron"] = "Руины Лордерона",
+ ["Twisting Nether"] = "Круговерть Пустоты",
+ ["The Veiled Sea"] = "Сокрытое Море",
+ ["The North Sea"] = "Северное море",
+ ["Armory"] = "Оружейная",
+ ["Library"] = "Библиотека",
+ ["Cathedral"] = "Собор",
+ ["Graveyard"] = "Кладбище",
+
+ -- Burning Crusade
+
+ -- Subzones used for displaying instances.
+ ["Plaguewood"] = "Проклятый лес",
+ ["Hellfire Citadel"] = "Цитадель Адского Пламени",
+ ["Auchindoun"] = "Аукиндон",
+ ["The Bone Wastes"] = "Костяные пустоши",
+ ["Ring of Observance"] = "Ритуальный Круг",
+ ["Coilfang Reservoir"] = "Резервуар Кривого Клыка",
+ ["Amani Pass"] = "Перевал Амани",
+
+ ["Azuremyst Isle"] = "Остров Лазурной Дымки",
+ ["Bloodmyst Isle"] = "Остров Кровавой Дымки",
+ ["Eversong Woods"] = "Леса Вечной Песни",
+ ["Ghostlands"] = "Призрачные земли",
+ ["The Exodar"] = "Экзодар",
+ ["Silvermoon City"] = "Луносвет",
+ ["Shadowmoon Valley"] = "Долина Призрачной Луны",
+ ["Black Temple"] = "Черный храм",
+ ["Terokkar Forest"] = "Лес Тероккар",
+ ["Auchenai Crypts"] = "Аукенайские гробницы",
+ ["Mana-Tombs"] = "Гробницы Маны",
+ ["Shadow Labyrinth"] = "Темный Лабиринт",
+ ["Sethekk Halls"] = "Сетеккские залы",
+ ["Hellfire Peninsula"] = "Полуостров Адского Пламени",
+ ["The Dark Portal"] = "Темный портал",
+ ["Hellfire Ramparts"] = "Бастионы Адского Пламени",
+ ["The Blood Furnace"] = "Кузня Крови",
+ ["The Shattered Halls"] = "Разрушенные залы",
+ ["Magtheridon's Lair"] = "Логово Магтеридона",
+ ["Nagrand"] = "Награнд",
+ ["Zangarmarsh"] = "Зангартопь",
+ ["The Slave Pens"] = "Узилище",
+ ["The Underbog"] = "Нижетопь",
+ ["The Steamvault"] = "Паровое Подземелье",
+ ["Serpentshrine Cavern"] = "Змеиное святилище",
+ ["Blade's Edge Mountains"] = "Острогорье",
+ ["Gruul's Lair"] = "Логово Груула",
+ ["Netherstorm"] = "Пустоверть",
+ ["Tempest Keep"] = "Крепость Бурь",
+ ["The Mechanar"] = "Механар",
+ ["The Botanica"] = "Ботаника",
+ ["The Arcatraz"] = "Аркатрац",
+ ["The Eye"] = "Око",
+ ["Eye of the Storm"] = "Око Бури",
+ ["Shattrath City"] = "Шаттрат",
+ ["Shattrath"] = "Шаттрат",
+ ["Karazhan"] = "Каражан",
+ ["Caverns of Time"] = "Пещеры Времени",
+ ["Old Hillsbrad Foothills"] = "Старые предгорья Хилсбрада",
+ ["The Black Morass"] = "Черные топи",
+ ["Night Elf Village"] = "Деревня ночных эльфов",
+ ["Horde Encampment"] = "Стоянка Орды",
+ ["Alliance Base"] = "База Альянса",
+ ["Zul'Aman"] = "Зул'Аман",
+ ["Quel'thalas"] = "Кель'Талас",
+ ["Isle of Quel'Danas"] = "Остров Кель'Данас",
+ ["Sunwell Plateau"] = "Плато Солнечного Колодца",
+ ["Magisters' Terrace"] = "Терраса Магистров",
+
+ -- Blade's Edge Plateau
+ ["Forge Camp: Terror"] = "Лагерь Легиона: Ужас",
+ ["Vortex Pinnacle"] = "Нагорье Смерчей",
+ ["Rivendark's Perch"] = "Гнездо Чернокрыла",
+ ["Ogri'la"] = "Огри'ла",
+ ["Obsidia's Perch"] = "Гнездо Обсидии",
+ ["Skyguard Outpost"] = "Застава Стражи Небес",
+ ["Shartuul's Transporter"] = "Транспортер Шартуула",
+ ["Forge Camp: Wrath"] = "Лагерь Легиона: Гнев",
+ ["Bash'ir Landing"] = "Лагерь Баш'ира",
+ ["Crystal Spine"] = "Хрустальное поле",
+ ["Insidion's Perch"] = "Гнездо Инсидиона",
+ ["Furywing's Perch"] = "Гнездовье Ярокрыла",
+
+ ["Tirisfal"] = "Тирисфальские леса",
+ ["Sunken Temple"] = "Затонувший храм",
+ }
+else
+ error(("%s: Locale %q not supported"):format(MAJOR_VERSION, GAME_LOCALE))
+end
\ No newline at end of file
diff --git a/!Compatibility/libs/LibStub.lua b/!Compatibility/libs/LibStub.lua
new file mode 100644
index 0000000..d198f45
--- /dev/null
+++ b/!Compatibility/libs/LibStub.lua
@@ -0,0 +1,51 @@
+-- $Id: LibStub.lua 103 2014-10-16 03:02:50Z mikk $
+-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/addons/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]
+
+-- Check to see is this version of the stub is obsolete
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+ LibStub = LibStub or {libs = {}, minors = {} }
+ _G[LIBSTUB_MAJOR] = LibStub
+ LibStub.minor = LIBSTUB_MINOR
+
+ -- LibStub:NewLibrary(major, minor)
+ -- major (string) - the major version of the library
+ -- minor (string or number ) - the minor version of the library
+ --
+ -- returns nil if a newer or same version of the lib is already present
+ -- returns empty library object or old library object if upgrade is needed
+ 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
+
+ -- LibStub:GetLibrary(major, [silent])
+ -- major (string) - the major version of the library
+ -- silent (boolean) - if true, library is optional, silently return nil if its not found
+ --
+ -- throws an error if the library can not be found (except silent is set)
+ -- returns the library object if found
+ 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
+
+ -- LibStub:IterateLibraries()
+ --
+ -- Returns an iterator for the currently registered libraries
+ function LibStub:IterateLibraries()
+ return pairs(self.libs)
+ end
+
+ setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
\ No newline at end of file
diff --git a/!Compatibility/libs/libs.xml b/!Compatibility/libs/libs.xml
new file mode 100644
index 0000000..b37fb2c
--- /dev/null
+++ b/!Compatibility/libs/libs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/!Compatibility/slashCommands.lua b/!Compatibility/slashCommands.lua
new file mode 100644
index 0000000..89cc5b4
--- /dev/null
+++ b/!Compatibility/slashCommands.lua
@@ -0,0 +1,59 @@
+--Cache global variables
+local strmatch = strmatch
+--WoW API
+local IsAddOnLoaded = IsAddOnLoaded
+
+local checked
+local function LoadDebugTools()
+ if checked then return end
+
+ local _, _, _, loadable, _, reason = GetAddOnInfo("!DebugTools")
+ checked = true
+
+ if reason == "MISSING" then return end
+
+ if loadable then
+ LoadAddOn("!DebugTools")
+ else
+ EnableAddOn("!DebugTools")
+ LoadAddOn("!DebugTools")
+ DisableAddOn("!DebugTools")
+ end
+end
+
+SLASH_FRAMESTACK1 = "/framestack"
+SLASH_FRAMESTACK2 = "/fstack"
+SlashCmdList["FRAMESTACK"] = function(msg)
+ LoadDebugTools()
+
+ if IsAddOnLoaded("!DebugTools") then
+ local showHiddenArg, showRegionsArg = strmatch(msg, "^%s*(%S+)%s+(%S+)%s*$")
+ if (not showHiddenArg or not showRegionsArg) then
+ showHiddenArg = strmatch(msg, "^%s*(%S+)%s*$")
+ showRegionsArg = "1"
+ end
+ local showHidden = showHiddenArg == "true" or showHiddenArg == "1"
+ local showRegions = showRegions == "true" or showRegionsArg == "1"
+
+ FrameStackTooltip_Toggle(showHidden, showRegions)
+ end
+end
+
+SLASH_EVENTTRACE1 = "/eventtrace"
+SLASH_EVENTTRACE2 = "/etrace"
+SlashCmdList["EVENTTRACE"] = function(msg)
+ LoadDebugTools()
+
+ if IsAddOnLoaded("!DebugTools") then
+ EventTraceFrame_HandleSlashCmd(msg)
+ end
+end
+
+SLASH_DUMP1 = "/dump"
+SlashCmdList["DUMP"] = function(msg)
+ LoadDebugTools()
+
+ if IsAddOnLoaded("!DebugTools") then
+ DevTools_DumpCommand(msg)
+ end
+end
\ No newline at end of file
diff --git a/!DebugTools/!DebugTools.toc b/!DebugTools/!DebugTools.toc
new file mode 100644
index 0000000..c54108d
--- /dev/null
+++ b/!DebugTools/!DebugTools.toc
@@ -0,0 +1,13 @@
+## Interface: 20400
+## Title: !DebugTools
+## Notes: Tools for developing addons (Blizzard UI Debug Tools)
+## Author: Blizzard Entertainment
+## Special Thanks: Iriel, Kirov, Esamynn
+## Version: 1.0
+## Dependencies: !Compatibility
+## LoadOnDemand: 1
+
+Compatibility.lua
+Dump.lua
+Blizzard_DebugTools.lua
+Blizzard_DebugTools.xml
\ No newline at end of file
diff --git a/!DebugTools/Blizzard_DebugTools.lua b/!DebugTools/Blizzard_DebugTools.lua
new file mode 100644
index 0000000..973d4e2
--- /dev/null
+++ b/!DebugTools/Blizzard_DebugTools.lua
@@ -0,0 +1,732 @@
+EVENT_TRACE_EVENT_HEIGHT = 16;
+EVENT_TRACE_MAX_ENTRIES = 1000;
+
+DEBUGLOCALS_LEVEL = 4;
+local _normalFontColor = {1, .82, 0, 1};
+
+EVENT_TRACE_SYSTEM_TIMES = {};
+EVENT_TRACE_SYSTEM_TIMES["System"] = true;
+EVENT_TRACE_SYSTEM_TIMES["Elapsed"] = true;
+
+EVENT_TRACE_EVENT_COLORS = {};
+EVENT_TRACE_EVENT_COLORS["System"] = _normalFontColor;
+EVENT_TRACE_EVENT_COLORS["Elapsed"] = {.6, .6, .6, 1};
+
+local _EventTraceFrame;
+
+local _framesSinceLast = 0;
+local _timeSinceLast = 0;
+
+local _timer = CreateFrame("FRAME");
+_timer:SetScript("OnUpdate", function (self, elapsed) _framesSinceLast = _framesSinceLast + 1; _timeSinceLast = _timeSinceLast + elapsed; end);
+
+function EventTraceFrame_OnLoad(self)
+ local frameName = self:GetName()
+ _G[frameName.."Scroll"].thumb = _G[frameName.."ScrollThumb"]
+ _G[frameName.."DialogBG"]:SetVertexColor(0, 0, 0)
+ _G[frameName.."DialogBG"]:SetAlpha(0.75)
+
+ self.buttons = {};
+ self.events = {};
+ self.times = {};
+ self.rawtimes = {};
+ self.eventids = {};
+ self.eventtimes = {};
+ self.numhandlers = {};
+ self.slowesthandlers = {};
+ self.slowesthandlertimes = {}
+ self.timeSinceLast = {};
+ self.framesSinceLast = {};
+ self.args = {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}};
+ self.ignoredEvents = {};
+ self.lastIndex = 0;
+ self.visibleButtons = 0;
+ _EventTraceFrame = self;
+ self:SetScript("OnSizeChanged", EventTraceFrame_OnSizeChanged);
+ EventTraceFrame_OnSizeChanged(self, self:GetWidth(), self:GetHeight());
+ self:EnableMouse(true);
+ self:EnableMouseWheel(true);
+ self:SetScript("OnMouseWheel", EventTraceFrame_OnMouseWheel);
+end
+
+local _workTable = {};
+function EventTraceFrame_OnEvent (self, event, ...)
+ if (not self.ignoredEvents[event]) then
+ if (_framesSinceLast ~= 0 and event ~= "On Update") then
+ EventTraceFrame_OnEvent(self, "On Update");
+ end
+
+ local nextIndex = self.lastIndex + 1;
+ if (nextIndex > EVENT_TRACE_MAX_ENTRIES) then
+ local staleIndex = nextIndex - EVENT_TRACE_MAX_ENTRIES;
+ self.events[staleIndex] = nil;
+ self.times[staleIndex] = nil;
+ self.rawtimes[staleIndex] = nil;
+ self.timeSinceLast[staleIndex] = nil;
+ self.framesSinceLast[staleIndex] = nil;
+ self.eventids[staleIndex] = nil;
+ self.eventtimes[staleIndex] = nil;
+ self.numhandlers[staleIndex] = nil;
+ self.slowesthandlers[staleIndex] = nil;
+ self.slowesthandlertimes[staleIndex] = nil;
+ for k, v in next, self.args do
+ self.args[k][staleIndex] = nil;
+ end
+ end
+
+ if (event == "Begin Capture" or event == "End Capture") then
+ self.times[nextIndex] = "System";
+ if (self.eventsToCapture) then
+ self.events[nextIndex] = string.format("%s (%s events)", event, tostring(self.eventsToCapture));
+ else
+ self.events[nextIndex] = event;
+ end
+ self.timeSinceLast[nextIndex] = 0;
+ self.framesSinceLast[nextIndex] = 0;
+ elseif (event == "On Update") then
+ self.times[nextIndex] = "Elapsed";
+ self.events[nextIndex] = string.format("%.3f sec - %d frame(s)", _timeSinceLast, _framesSinceLast);
+ self.timeSinceLast[nextIndex] = _timeSinceLast;
+ self.framesSinceLast[nextIndex] = _framesSinceLast;
+ _timeSinceLast = 0;
+ _framesSinceLast = 0;
+ else
+ self.events[nextIndex] = event;
+ local seconds = GetTime();
+ local minutes = math.floor(math.floor(seconds) / 60);
+ local hours = math.floor(minutes / 60);
+ seconds = seconds - 60 * minutes;
+ minutes = minutes - 60 * hours;
+ hours = hours % 1000;
+ self.times[nextIndex] = string.format("%.2d:%.2d:%06.3f", hours, minutes, seconds);
+ self.timeSinceLast[nextIndex] = 0;
+ self.framesSinceLast[nextIndex] = 0;
+ self.eventids[nextIndex] = GetCurrentEventID();
+
+ local numArgs = select("#", ...);
+ for i=1, numArgs do
+ if (not self.args[i]) then
+ self.args[i] = {};
+ end
+ self.args[i][nextIndex] = select(i, ...);
+ end
+
+ if (self.eventsToCapture) then
+ self.eventsToCapture = self.eventsToCapture - 1;
+ end
+ end
+
+ self.rawtimes[nextIndex] = GetTime();
+ self.lastIndex = nextIndex;
+ if (self.eventsToCapture and self.eventsToCapture <= 0) then
+ self.eventsToCapture = nil;
+ EventTraceFrame_StopEventCapture();
+ end
+ end
+end
+
+function EventTraceFrame_OnShow(self)
+ wipe(self.ignoredEvents);
+ local scrollBar = _G["EventTraceFrameScroll"];
+ local minValue, maxValue = scrollBar:GetMinMaxValues();
+ scrollBar:SetValue(maxValue);
+end
+
+function EventTraceFrame_OnUpdate (self, elapsed)
+ EventTraceFrame_Update();
+end
+
+function EventTraceFrame_OnSizeChanged (self, width, height)
+ local numButtonsToDisplay = math.floor((height - 36)/EVENT_TRACE_EVENT_HEIGHT);
+ local numButtonsCreated = #self.buttons;
+
+ if (numButtonsCreated < numButtonsToDisplay) then
+ for i = numButtonsCreated + 1, numButtonsToDisplay do
+ local button = CreateFrame("BUTTON", "EventTraceFrameButton" .. i, self, "EventTraceEventTemplate");
+ button:SetPoint("BOTTOMLEFT", 12, (16 * (i - 1)) + 12);
+ button:SetPoint("RIGHT", -28, 0);
+ tinsert(self.buttons, button);
+ end
+ for i = self.visibleButtons + 1, numButtonsToDisplay do
+ self.buttons[i]:Show();
+ end
+ self.visibleButtons = numButtonsToDisplay;
+ EventTraceFrame_Update();
+ elseif (self.visibleButtons < numButtonsToDisplay) then
+ for i = self.visibleButtons + 1, numButtonsToDisplay do
+ self.buttons[i]:Show();
+ end
+ self.visibleButtons = numButtonsToDisplay;
+ EventTraceFrame_Update();
+ elseif (numButtonsToDisplay < self.visibleButtons) then
+ for i = numButtonsToDisplay + 1, self.visibleButtons do
+ self.buttons[i]:Hide();
+ end
+ self.visibleButtons = numButtonsToDisplay;
+ end
+end
+
+function EventTraceFrame_Update ()
+ local offset = 0;
+
+ local scrollBar = _G["EventTraceFrameScroll"];
+ local scrollBarValue = scrollBar:GetValue();
+ local minValue, maxValue = scrollBar:GetMinMaxValues();
+
+ local firstID = max(1, _EventTraceFrame.lastIndex - EVENT_TRACE_MAX_ENTRIES + 1);
+ local lastID = _EventTraceFrame.lastIndex or 1;
+
+ if (firstID >= lastID) then
+ scrollBar:SetMinMaxValues(firstID-1, lastID);
+ else
+ scrollBar:SetMinMaxValues(firstID, lastID);
+ end
+ if (scrollBarValue < firstID) then
+ scrollBar:SetValue(firstID);
+ scrollBarValue = firstID;
+ end
+
+ if (scrollBarValue < 1) then
+ scrollBarValue = 1;
+ elseif (not _EventTraceFrame.selectedEvent) then
+ if (scrollBarValue == maxValue) then
+ scrollBar:SetValue(_EventTraceFrame.lastIndex);
+ end
+ end
+
+ for i = 1, _EventTraceFrame.visibleButtons do
+ local button = _EventTraceFrame.buttons[i];
+ if (button) then
+ local index = scrollBarValue - (i - 1);
+ local event = _EventTraceFrame.events[index];
+ if (event) then
+ local timeString = _EventTraceFrame.times[index]
+ button.index = index;
+ button.time:SetText(timeString);
+ button.event:SetText(event);
+ if (_EventTraceFrame.eventids[index] and not _EventTraceFrame.eventtimes[index]) then
+ local eventTime, numHandlers, slowestHandler, slowestHandlerTime = GetEventTime(_EventTraceFrame.eventids[index]);
+ _EventTraceFrame.eventtimes[index] = eventTime;
+ _EventTraceFrame.numhandlers[index] = numHandlers;
+ _EventTraceFrame.slowesthandlers[index] = slowestHandler;
+ _EventTraceFrame.slowesthandlertimes[index] = slowestHandlerTime;
+ end
+ local color = EVENT_TRACE_EVENT_COLORS[event] or EVENT_TRACE_EVENT_COLORS[timeString];
+ if (color) then
+ button.time:SetTextColor(unpack(color));
+ button.event:SetTextColor(unpack(color));
+ else
+ local eventTime = _EventTraceFrame.eventtimes[index];
+ if (eventTime and eventTime > 50.0) then
+ button.time:SetTextColor(1, 0, 0, 1);
+ button.event:SetTextColor(1, 0, 0, 1);
+ elseif (eventTime and eventTime > 20.0) then
+ button.time:SetTextColor(1, .5, 0, 1);
+ button.event:SetTextColor(1, .5, 0, 1);
+ elseif (eventTime and eventTime > 10.0) then
+ button.time:SetTextColor(1, .8, 0, 1);
+ button.event:SetTextColor(1, .8, 0, 1);
+ elseif (eventTime and eventTime > 5.0) then
+ button.time:SetTextColor(1, 1, .6, 1);
+ button.event:SetTextColor(1, 1, .6, 1);
+ else
+ button.time:SetTextColor(1, 1, 1, 1);
+ button.event:SetTextColor(1, 1, 1, 1);
+ end
+ end
+ button:Show();
+ if (_EventTraceFrame.selectedEvent) then
+ if (index == _EventTraceFrame.selectedEvent) then
+ EventTraceFrameEvent_DisplayTooltip(button);
+ button:GetHighlightTexture():SetVertexColor(.15, .25, 1, .35);
+ button:LockHighlight(true);
+ button.wasSelected = true;
+ elseif (button.wasSelected) then
+ button.wasSelected = nil;
+ button:GetHighlightTexture():SetVertexColor(.8, .8, 1, .15);
+ button:UnlockHighlight();
+ end
+ else
+ if (button.wasSelected) then
+ button.wasSelected = nil;
+ button:GetHighlightTexture():SetVertexColor(.8, .8, 1, .15);
+ button:UnlockHighlight();
+ end
+ end
+ if (button == GetMouseFocus()) then
+ EventTraceFrameEvent_OnEnter(button);
+ else
+ button.HideButton:Hide();
+ end
+ else
+ button.index = index;
+ button:Hide();
+ end
+ end
+ end
+
+ EventTraceFrame_UpdateKeyboardStatus();
+end
+
+function EventTraceFrame_StartEventCapture()
+ if (_EventTraceFrame.started) then
+ return;
+ end
+
+ EventHandler_Enable()
+
+ _EventTraceFrame.started = true;
+ _framesSinceLast = 0;
+ _timeSinceLast = 0;
+ _EventTraceFrame:RegisterAllEvents();
+ EventTraceFrame_OnEvent(_EventTraceFrame, "Begin Capture");
+end
+
+function EventTraceFrame_StopEventCapture()
+ if (not _EventTraceFrame.started) then
+ return;
+ end
+
+ EventHandler_Disable()
+
+ _EventTraceFrame.started = false;
+ _framesSinceLast = 0;
+ _timeSinceLast = 0;
+ _EventTraceFrame:UnregisterAllEvents();
+ EventTraceFrame_OnEvent(_EventTraceFrame, "End Capture");
+end
+
+function EventTraceFrame_HandleSlashCmd(msg)
+ msg = strlower(msg);
+ if (msg == "start") then
+ EventTraceFrame_StartEventCapture();
+ elseif (msg == "stop") then
+ EventTraceFrame_StopEventCapture();
+ elseif (tonumber(msg) and tonumber(msg) > 0) then
+ if (not _EventTraceFrame.started) then
+ _EventTraceFrame.eventsToCapture = tonumber(msg);
+ EventTraceFrame_StartEventCapture();
+ end
+ elseif (msg == "") then
+ if (not _EventTraceFrame:IsShown()) then
+ _EventTraceFrame:Show();
+ if (_EventTraceFrame.started == nil) then
+ EventTraceFrame_StartEventCapture();
+ end
+ else
+ _EventTraceFrame:Hide();
+ end
+ end
+end
+
+function EventTraceFrame_OnMouseWheel(self, delta)
+ local scrollBar = _G["EventTraceFrameScroll"];
+ local minVal, maxVal = scrollBar:GetMinMaxValues();
+ local currentValue = scrollBar:GetValue();
+
+ local newValue = currentValue - (delta * 3);
+ newValue = max(newValue, minVal);
+ newValue = min(newValue, maxVal);
+ if (newValue ~= currentValue) then
+ scrollBar:SetValue(newValue);
+ end
+end
+
+function EventTraceFrame_UpdateKeyboardStatus()
+ if (_EventTraceFrame.selectedEvent) then
+ local focus = GetMouseFocus();
+ if (focus == _EventTraceFrame or (focus and focus:GetParent() == _EventTraceFrame)) then
+ _EventTraceFrame:EnableKeyboard(true);
+ return;
+ end
+ end
+ _EventTraceFrame:EnableKeyboard(false);
+end
+
+function EventTraceFrame_OnKeyUp(self, key)
+ if (key == "ESCAPE") then
+ self.selectedEvent = nil;
+ EventTraceTooltip:Hide();
+ EventTraceFrame_Update();
+ end
+end
+
+function EventTraceFrame_RemoveEvent(i)
+ if (i >= 1 and i <= EventTraceFrame.lastIndex) then
+ tremove(EventTraceFrame.events, i);
+ tremove(EventTraceFrame.times, i);
+ tremove(EventTraceFrame.rawtimes, i);
+ tremove(EventTraceFrame.timeSinceLast, i);
+ tremove(EventTraceFrame.framesSinceLast, i);
+ tremove(EventTraceFrame.eventtimes, i);
+ tremove(EventTraceFrame.eventids, i);
+ tremove(EventTraceFrame.numhandlers, i);
+ tremove(EventTraceFrame.slowesthandlers, i);
+ tremove(EventTraceFrame.slowesthandlertimes, i);
+
+ for k, v in next, EventTraceFrame.args do
+ for j = i, EventTraceFrame.lastIndex do
+ EventTraceFrame.args[k][j] = EventTraceFrame.args[k][j+1];
+ end
+ end
+ EventTraceFrame.lastIndex = EventTraceFrame.lastIndex-1;
+ end
+end
+
+local TIME_LABEL = "Time:";
+local DETAILS_LABEL = "Details:";
+local SLOWEST_LABEL = "Slowest:";
+local ARGUMENT_LABEL_FORMAT = "arg %d:";
+local NUM_HANDLERS_FORMAT = "(%d handlers)";
+local EVENT_TIME_FORMAT = "%.2fms";
+
+local function EventTrace_FormatArgValue (val)
+ if (type(val) == "string") then
+ return string.format('"%s"', val);
+ elseif (type(val) == "number") then
+ return tostring(val);
+ elseif (type(val) == "boolean") then
+ return string.format('|cffaaaaff%s|r', tostring(val));
+ elseif (type(val) == "table" or type(val) == "bool") then
+ return string.format('|cffffaaaa%s|r', tostring(val));
+ end
+end
+
+function EventTraceFrameEvent_DisplayTooltip (eventButton)
+ local index = eventButton.index;
+ if (not index) then
+ return;
+ end
+
+ local tooltip = _G["EventTraceTooltip"];
+ tooltip:SetOwner(eventButton, "ANCHOR_NONE");
+ tooltip:SetPoint("TOPLEFT", eventButton, "TOPRIGHT", 24, 2);
+ local timeString = _EventTraceFrame.times[index]
+ if (EVENT_TRACE_SYSTEM_TIMES[timeString]) then
+ tooltip:AddLine(timeString, 1, 1, 1);
+ tooltip:AddDoubleLine(TIME_LABEL, _EventTraceFrame.rawtimes[index], 1, .82, 0, 1, 1, 1);
+ tooltip:AddDoubleLine(DETAILS_LABEL, _EventTraceFrame.events[index], 1, .82, 0, 1, 1, 1);
+ else
+ tooltip:AddLine(_EventTraceFrame.events[index], 1, 1, 1);
+ local eventTime = _EventTraceFrame.eventtimes[index];
+ if (eventTime) then
+ if (eventTime < 0) then
+ eventTime = "?";
+ else
+ eventTime = format(EVENT_TIME_FORMAT, eventTime);
+ end
+ tooltip:AddDoubleLine(TIME_LABEL, eventTime .. " " .. format(NUM_HANDLERS_FORMAT, _EventTraceFrame.numhandlers[index] or 0), 1, .82, 0, 1, 1, 1);
+ else
+ tooltip:AddDoubleLine(TIME_LABEL, _EventTraceFrame.rawtimes[index], 1, .82, 0, 1, 1, 1);
+ end
+ if (_EventTraceFrame.slowesthandlers[index]) then
+ tooltip:AddDoubleLine(SLOWEST_LABEL, format("%s (%.2fms)", _EventTraceFrame.slowesthandlers[index], _EventTraceFrame.slowesthandlertimes[index]), 1, .82, 0, 1, 1, 1);
+ end
+ for k, v in ipairs(EventTraceFrame.args) do
+ if (v[index]) then
+ tooltip:AddDoubleLine(format(ARGUMENT_LABEL_FORMAT, k), EventTrace_FormatArgValue(v[index]), 1, .82, 0, 1, 1, 1);
+ end
+ end
+ end
+ tooltip:Show();
+end
+
+function EventTraceFrameEvent_OnEnter (self)
+ if (not EVENT_TRACE_SYSTEM_TIMES[EventTraceFrame.times[self.index]]) then
+ self.HideButton:Show();
+ else
+ self.HideButton:Hide();
+ end
+ if (_EventTraceFrame.selectedEvent) then
+ return;
+ else
+ EventTraceFrameEvent_DisplayTooltip(self);
+ end
+end
+
+function EventTraceFrameEvent_OnLeave (self)
+ if (not self.HideButton == GetMouseFocus()) then
+ self.HideButton:Hide();
+ end
+ if (not _EventTraceFrame.selectedEvent) then
+ EventTraceTooltip:Hide();
+ end
+end
+
+function EventTraceFrameEvent_OnClick (self)
+ if (_EventTraceFrame.selectedEvent == self.index) then
+ _EventTraceFrame.selectedEvent = nil;
+ else
+ _EventTraceFrame.selectedEvent = self.index;
+ end
+ EventTraceFrame_Update();
+end
+
+function EventTraceFrameEventHideButton_OnClick (button)
+ local eventName = button:GetParent().event:GetText();
+ EventTraceFrame.ignoredEvents[eventName] = 1;
+ EventTraceFrame.selectedEvent = nil;
+
+ for i = EventTraceFrame.lastIndex, 1, -1 do
+ if (EventTraceFrame.events[i] == eventName) then
+ EventTraceFrame_RemoveEvent(i);
+ end
+ end
+
+ local lastWasElapsed = false;
+ for i = EventTraceFrame.lastIndex, 1, -1 do
+ if (EventTraceFrame.times[i] == "Elapsed") then
+ if (lastWasElapsed) then
+ EventTraceFrame.timeSinceLast[i] = EventTraceFrame.timeSinceLast[i] + EventTraceFrame.timeSinceLast[i+1];
+ EventTraceFrame.framesSinceLast[i] = EventTraceFrame.framesSinceLast[i] + EventTraceFrame.framesSinceLast[i+1];
+ EventTraceFrame.events[i] = string.format(string.format("%.3f sec", EventTraceFrame.timeSinceLast[i]) .. " - %d frame(s)", EventTraceFrame.framesSinceLast[i]);
+ EventTraceFrame_RemoveEvent(i+1);
+ end
+ lastWasElapsed = true;
+ else
+ lastWasElapsed = false;
+ end
+ end
+
+ EventTraceFrame_Update();
+end
+
+local ERROR_FORMAT = [[|cffffd200Message:|r|cffffffff %s|r
+|cffffd200Time:|r|cffffffff %s|r
+|cffffd200Count:|r|cffffffff %s|r
+|cffffd200Stack:|r|cffffffff %s|r]];
+
+local WARNING_AS_ERROR_FORMAT = [[|cffffd200Message:|r|cffffffff %s|r
+|cffffd200Time:|r|cffffffff %s|r
+|cffffd200Count:|r|cffffffff %s|r]];
+
+local WARNING_FORMAT = "Lua Warning:\n"..WARNING_AS_ERROR_FORMAT;
+
+local INDEX_ORDER_FORMAT = "%d / %d"
+
+local _ScriptErrorsFrame;
+
+function ScriptErrorsFrame_OnLoad (self)
+ local frameName = self:GetName()
+ self.title = _G[frameName.."Title"]
+ self.indexLabel = _G[frameName.."IndexLabel"]
+ self.reload = _G[frameName.."Reload"]
+ self.previous = _G[frameName.."Previous"]
+ self.next = _G[frameName.."Next"]
+ self.close = _G[frameName.."CloseButton"]
+
+ self.title:SetText(LUA_ERROR);
+ self:RegisterForDrag("LeftButton");
+ self.seen = {};
+ self.order = {};
+ self.count = {};
+ self.messages = {};
+ self.times = {};
+ _ScriptErrorsFrame = self;
+end
+
+function ScriptErrorsFrame_OnShow (self)
+ ScriptErrorsFrame_Update();
+end
+
+function ScriptErrorsFrame_OnError (message, keepHidden)
+ local stack = debugstack(DEBUGLOCALS_LEVEL);
+
+ local messageStack = message..stack;
+
+ if (_ScriptErrorsFrame) then
+ local index = _ScriptErrorsFrame.seen[messageStack];
+ if (index) then
+ _ScriptErrorsFrame.count[index] = _ScriptErrorsFrame.count[index] + 1;
+ _ScriptErrorsFrame.messages[index] = message;
+ _ScriptErrorsFrame.times[index] = date();
+ else
+ tinsert(_ScriptErrorsFrame.order, stack);
+ index = #_ScriptErrorsFrame.order;
+ _ScriptErrorsFrame.count[index] = 1;
+ _ScriptErrorsFrame.messages[index] = message;
+ _ScriptErrorsFrame.times[index] = date();
+ _ScriptErrorsFrame.seen[messageStack] = index;
+ end
+
+ if (not _ScriptErrorsFrame:IsShown() and not keepHidden) then
+ _ScriptErrorsFrame.index = index;
+ _ScriptErrorsFrame:Show();
+ else
+ ScriptErrorsFrame_Update();
+ end
+ end
+end
+
+function ScriptErrorsFrame_Update ()
+ local editBox = ScriptErrorsFrameScrollFrameText;
+ local index = _ScriptErrorsFrame.index;
+ if (not index or not _ScriptErrorsFrame.order[index]) then
+ index = #_ScriptErrorsFrame.order;
+ _ScriptErrorsFrame.index = index;
+ end
+
+ if (index == 0) then
+ editBox:SetText("");
+ ScriptErrorsFrame_UpdateButtons();
+ return;
+ end
+
+ local text = string.format(
+ ERROR_FORMAT,
+ _ScriptErrorsFrame.messages[index],
+ _ScriptErrorsFrame.times[index],
+ _ScriptErrorsFrame.count[index],
+ _ScriptErrorsFrame.order[index]
+ );
+
+ local parent = editBox:GetParent();
+ local prevText = editBox.text;
+ editBox.text = text;
+ if (prevText ~= text) then
+ editBox:SetText(text);
+ editBox:HighlightText(0);
+ editBox:SetCursorPosition(0);
+ else
+ ScrollingEdit_OnTextChanged(editBox, parent);
+ end
+ parent:SetVerticalScroll(0);
+
+ ScriptErrorsFrame_UpdateButtons();
+end
+
+function ScriptErrorsFrame_UpdateButtons ()
+ local index = _ScriptErrorsFrame.index;
+ local numErrors = #_ScriptErrorsFrame.order;
+ if (index == 0) then
+ _ScriptErrorsFrame.next:Disable();
+ _ScriptErrorsFrame.previous:Disable();
+ else
+ if (numErrors == 1) then
+ _ScriptErrorsFrame.next:Disable();
+ _ScriptErrorsFrame.previous:Disable();
+ elseif (index == 1) then
+ _ScriptErrorsFrame.next:Enable();
+ _ScriptErrorsFrame.previous:Disable();
+ elseif (index == numErrors) then
+ _ScriptErrorsFrame.next:Disable();
+ _ScriptErrorsFrame.previous:Enable();
+ else
+ _ScriptErrorsFrame.next:Enable();
+ _ScriptErrorsFrame.previous:Enable();
+ end
+ end
+
+ _ScriptErrorsFrame.indexLabel:SetText(string.format(INDEX_ORDER_FORMAT, index, numErrors));
+end
+
+function ScriptErrorsFrame_DeleteError (index)
+ if (_ScriptErrorsFrame.order[index]) then
+ _ScriptErrorsFrame.seen[_ScriptErrorsFrame.messages[index] .. _ScriptErrorsFrame.order[index]] = nil;
+ tremove(_ScriptErrorsFrame.order, index);
+ tremove(_ScriptErrorsFrame.messages, index);
+ tremove(_ScriptErrorsFrame.times, index);
+ tremove(_ScriptErrorsFrame.count, index);
+ end
+end
+
+function ScriptErrorsFrameButton_OnClick (self)
+ local id = self:GetID();
+
+ if (id == 1) then
+ _ScriptErrorsFrame.index = _ScriptErrorsFrame.index + 1;
+ else
+ _ScriptErrorsFrame.index = _ScriptErrorsFrame.index - 1;
+ end
+
+ ScriptErrorsFrame_Update();
+end
+
+function DebugTooltip_OnLoad(self)
+ self:SetFrameLevel(self:GetFrameLevel() + 2)
+ self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b)
+ self:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b)
+ self.statusBar2 = getglobal(self:GetName().."StatusBar2")
+ self.statusBar2Text = getglobal(self:GetName().."StatusBar2Text")
+end
+
+function FrameStackTooltip_OnDisplaySizeChanged(self)
+ local height = GetScreenHeight()
+ if (height > 768) then
+ self:SetScale(768 / height)
+ else
+ self:SetScale(1)
+ end
+end
+
+function FrameStackTooltip_OnLoad(self)
+ DebugTooltip_OnLoad(self)
+
+ FrameStackTooltip_OnDisplaySizeChanged(self)
+ self:RegisterEvent("DISPLAY_SIZE_CHANGED")
+end
+
+function FrameStackTooltip_OnEvent(self, event, ...)
+ if (event == "DISPLAY_SIZE_CHANGED") then
+ FrameStackTooltip_OnDisplaySizeChanged(self)
+ end
+end
+
+function FrameStackTooltip_Toggle(showHidden)
+ local tooltip = _G["FrameStackTooltip"]
+ if (tooltip:IsVisible()) then
+ tooltip:Hide()
+ FrameStackHighlight:Hide()
+ else
+ tooltip:SetOwner(UIParent, "ANCHOR_NONE")
+ tooltip:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", -CONTAINER_OFFSET_X - 13, CONTAINER_OFFSET_Y)
+ tooltip.default = 1
+ tooltip.showHidden = showHidden
+ UpdateFrameStack(tooltip, showHidden)
+ end
+end
+
+FRAMESTACK_UPDATE_TIME = .1
+local _timeSinceLast = 0
+function FrameStackTooltip_OnUpdate(self, elapsed)
+ _timeSinceLast = _timeSinceLast - elapsed
+ if (_timeSinceLast <= 0) then
+ _timeSinceLast = FRAMESTACK_UPDATE_TIME
+ local highlightFrame = UpdateFrameStack(self, self.showHidden)
+
+ FrameStackHighlight:ClearAllPoints();
+ if (highlightFrame) then
+ FrameStackHighlight:SetPoint("BOTTOMLEFT", highlightFrame);
+ FrameStackHighlight:SetPoint("TOPRIGHT", highlightFrame);
+ FrameStackHighlight:Show();
+ else
+ FrameStackHighlight:Hide();
+ end
+ end
+end
+
+function FrameStackTooltip_OnShow(self)
+ local parent = self:GetParent() or UIParent
+ local ps = parent:GetEffectiveScale()
+ local px, py = parent:GetCenter()
+ px, py = px * ps, py * ps
+
+ local x, y = GetCursorPosition()
+ self:ClearAllPoints()
+
+ if (x > px) then
+ if (y > py) then
+ self:SetPoint("BOTTOMLEFT", parent, "BOTTOMLEFT", 20, 20)
+ else
+ self:SetPoint("TOPLEFT", parent, "TOPLEFT", 20, -20)
+ end
+ else
+ if (y > py) then
+ self:SetPoint("BOTTOMRIGHT", parent, "BOTTOMRIGHT", -20, 20)
+ else
+ self:SetPoint("TOPRIGHT", parent, "TOPRIGHT", -20, -20)
+ end
+ end
+end
+
+FrameStackTooltip_OnEnter = FrameStackTooltip_OnShow
\ No newline at end of file
diff --git a/!DebugTools/Blizzard_DebugTools.xml b/!DebugTools/Blizzard_DebugTools.xml
new file mode 100644
index 0000000..c4479cf
--- /dev/null
+++ b/!DebugTools/Blizzard_DebugTools.xml
@@ -0,0 +1,568 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:RegisterForDrag("LeftButton");
+
+
+ local eventTraceFrame = _G["EventTraceFrame"];
+ eventTraceFrame.moving = true;
+ eventTraceFrame:StartMoving();
+
+
+ local eventTraceFrame = _G["EventTraceFrame"];
+ eventTraceFrame.moving = nil;
+ eventTraceFrame:StopMovingOrSizing();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:SetFrameLevel(self:GetFrameLevel() + 1);
+ self:SetValue(0);
+ self:SetValueStep(1);
+
+
+
+
+
+
+
+
+
+
+ EventTraceFrame_OnLoad(self);
+
+
+ EventTraceFrame_OnShow(self);
+
+
+ EventTraceFrame_OnEvent(self, event, ...);
+
+
+ EventTraceFrame_OnUpdate(self, elapsed);
+
+
+ EventTraceFrame_OnKeyUp(self, key);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ self:RegisterForDrag("LeftButton");
+
+
+ local frame = _G["ScriptErrorsFrame"];
+ frame.moving = true;
+ frame:StartMoving();
+
+
+ local frame = _G["ScriptErrorsFrame"];
+ frame.moving = nil;
+ frame:StopMovingOrSizing();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ScrollingEdit_OnCursorChanged(self);
+
+
+ ScrollingEdit_OnUpdate(self, elapsed, self:GetParent());
+
+
+ self:HighlightText(0);
+
+
+ self:ClearFocus();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ReloadUI();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ScriptErrorsFrameButton_OnClick(self);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ScriptErrorsFrameButton_OnClick(self);
+
+
+
+
+
+
+
+
+
+
+
+
+ HideUIPanel(self:GetParent());
+
+
+
+
+
+
+ ScriptErrorsFrame_OnLoad(self);
+
+
+ ScriptErrorsFrame_OnShow(self);
+
+
+
+
+
+
+
+ FrameStackTooltip_OnLoad(self);
+
+
+ FrameStackTooltip_OnShow(self);
+
+
+ FrameStackTooltip_OnEnter(self);
+
+
+ FrameStackTooltip_OnUpdate(self, elapsed);
+
+
+ FrameStackTooltip_OnEvent(self, event, ...);
+
+
+
+
+
+
+
+ DebugTooltip_OnLoad(self)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/!DebugTools/Compatibility.lua b/!DebugTools/Compatibility.lua
new file mode 100644
index 0000000..0cfee50
--- /dev/null
+++ b/!DebugTools/Compatibility.lua
@@ -0,0 +1,196 @@
+--Cache global variables
+local format, match = string.format, string.match
+local tinsert, tsort, twipe = table.insert, table.sort, table.wipe
+local fmod = math.fmod
+local pairs = pairs
+local tostring = tostring
+--WoW API
+local GetTime = GetTime
+
+DEBUG_FRAMESTACK = "Frame Stack"
+EVENTS_LABEL = "Events"
+RELOADUI = "Reload UI"
+
+local eventList = {}
+
+local function EventHandler_OnEvent()
+ tinsert(eventList, GetTime())
+end
+
+local eventHandler = CreateFrame("Frame", "EventHandler", UIParent)
+eventHandler:SetScript("OnEvent", EventHandler_OnEvent)
+
+function GetCurrentEventID()
+ return #eventList
+end
+
+function GetEventTime(eventID)
+ return eventList[eventID]
+end
+
+function EventHandler_Enable()
+ eventHandler:RegisterAllEvents()
+end
+
+function EventHandler_Disable()
+ eventHandler:UnregisterAllEvents()
+ twipe(eventList)
+end
+
+local strataLevels = {
+ ["UNKNOWN"] = 1,
+ ["BACKGROUND"] = 2,
+ ["LOW"] = 3,
+ ["MEDIUM"] = 4,
+ ["HIGH"] = 5,
+ ["DIALOG"] = 6,
+ ["FULLSCREEN"] = 7,
+ ["FULLSCREEN_DIALOG"] = 8,
+ ["TOOLTIP"] = 9,
+}
+
+local colorSpecs = {
+ "|cff6699ff",
+ "|cff88dddd"
+}
+
+local activeColorSpecs = {
+ "|cffff9966",
+ "|cffdddd88"
+}
+
+local hiddenColorSpecs = {
+ "|cff666666",
+ "|cff888888"
+}
+
+local frameStackStrata = {}
+local frameStackLevels = {}
+local frameStackActive = {}
+local frameStackList = {}
+
+local function FrameStackSort(b, a)
+ local sa = strataLevels[frameStackStrata[a]] or -1
+ local sb = strataLevels[frameStackStrata[b]] or -1
+ if sa < sb then
+ return true
+ elseif sa > sb then
+ return
+ end
+
+ local sa = frameStackLevels[a] or -1
+ local sb = frameStackLevels[b] or -1
+ if sa < sb then
+ return true
+ elseif sa > sb then
+ return
+ end
+
+ return a < b
+end
+
+function UpdateFrameStack(tooltip, showHidden)
+ local x, y = GetCursorPosition()
+
+ for i = 1, #frameStackList do
+ frameStackList[i] = nil
+ end
+
+ for k in pairs(frameStackLevels) do
+ frameStackLevels[k] = nil
+ frameStackStrata[k] = nil
+ frameStackActive[k] = nil
+ end
+
+ local f
+ local nf = EnumerateFrames()
+
+ while nf do
+ f, nf = nf, EnumerateFrames(nf)
+ local es = f:GetEffectiveScale() or 1
+
+ local Fl, Fb, Fr, Ft = f:GetRect()
+ Fl = Fl or -1
+ Fb = Fb or -1
+ Fr = Fl + (Fr or -1)
+ Ft = Fb + (Ft or -1)
+
+ if (x >= Fl * es) and (x <= Fr * es) and (y >= Fb * es) and (y <= Ft * es) then
+ local n = f:GetName()
+ if n and _G[n] == f then
+ -- Name is ok
+ elseif n then
+ n = tostring(f) .. " (" .. n .. ")"
+ else
+ n = tostring(f)
+ end
+
+ local s = f:GetFrameStrata() or "nil"
+ local l = f:GetFrameLevel() or -1
+ local a
+
+ if f:IsVisible() then
+ if f:IsMouseEnabled() then
+ a = activeColorSpecs
+ else
+ a = colorSpecs
+ end
+ elseif showHidden then
+ a = hiddenColorSpecs
+ else
+ a = nil
+ end
+
+ if a then
+ frameStackLevels[n] = l
+ frameStackStrata[n] = s
+ frameStackActive[n] = a
+
+ tinsert(frameStackList, n)
+ end
+ end
+ end
+
+ frameStackList[#frameStackList + 1] = nil
+
+ tsort(frameStackList, FrameStackSort)
+
+ tooltip:ClearLines()
+ tooltip:AddDoubleLine(DEBUG_FRAMESTACK, format("(%.2f,%.2f)", x, y), 1, 1, 1, 1, .82, 0)
+
+ local cs, os, ol = 1, nil, nil
+ local cn = #colorSpecs
+ local highlighted
+ local highlightFrame = GetMouseFocus()
+
+ for _, n in ipairs(frameStackList) do
+ local s, l, a = frameStackStrata[n], frameStackLevels[n], frameStackActive[n]
+ if os ~= s then
+ tooltip:AddLine(s, 1, 1, 1)
+ os = s
+ ol = nil
+ cs = 1
+ end
+
+ if l ~= ol then
+ cs = fmod(cs, cn) + 1
+ ol = l
+ end
+
+ if not highlighted then
+ local frameName = _G[n] or match(n, "%((.+)%)$") or n
+ if frameName and frameName == highlightFrame then
+ tooltip:AddLine("-->" .. (a[cs] or "|cff444444") .. "<" .. l .. "> " .. n .. "|r")
+ highlighted = true
+ else
+ tooltip:AddLine(" " .. (a[cs] or "|cff444444") .. "<" .. l .. "> " .. n .. "|r")
+ end
+ else
+ tooltip:AddLine(" " .. (a[cs] or "|cff444444") .. "<" .. l .. "> " .. n .. "|r")
+ end
+ end
+
+ tooltip:Show()
+
+ return highlightFrame
+end
\ No newline at end of file
diff --git a/!DebugTools/Dump.lua b/!DebugTools/Dump.lua
new file mode 100644
index 0000000..1e5bb75
--- /dev/null
+++ b/!DebugTools/Dump.lua
@@ -0,0 +1,387 @@
+------------------------------------------------------------------------------
+-- Dump.lua
+--
+-- Contributed by Iriel, Esamynn and Kirov from DevTools v1.11
+-- /dump Implementation
+--
+-- Globals: DevTools, SLASH_DEVTOOLSDUMP1, DevTools_Dump, DevTools_RunDump
+-- Globals: DEVTOOLS_MAX_ENTRY_CUTOFF, DEVTOOLS_LONG_STRING_CUTOFF
+-- Globals: DEVTOOLS_DEPTH_CUTOFF, DEVTOOLS_INDENT
+-- Globals: DEVTOOLS_USE_TABLE_CACHE, DEVTOOLS_USE_FUNCTION_CACHE
+-- Globals: DEVTOOLS_USE_USERDATA_CACHE
+---------------------------------------------------------------------------
+local DT = {};
+
+DEVTOOLS_MAX_ENTRY_CUTOFF = 30; -- Maximum table entries shown
+DEVTOOLS_LONG_STRING_CUTOFF = 200; -- Maximum string size shown
+DEVTOOLS_DEPTH_CUTOFF = 10; -- Maximum table depth
+DEVTOOLS_USE_TABLE_CACHE = true; -- Look up table names
+DEVTOOLS_USE_FUNCTION_CACHE = true; -- Look up function names
+DEVTOOLS_USE_USERDATA_CACHE = true; -- Look up userdata names
+DEVTOOLS_INDENT=' '; -- Indentation string
+
+local DEVTOOLS_TYPE_COLOR="|cff88ff88";
+local DEVTOOLS_TABLEREF_COLOR="|cffffcc00";
+local DEVTOOLS_CUTOFF_COLOR="|cffff0000";
+local DEVTOOLS_TABLEKEY_COLOR="|cff88ccff";
+
+local FORMATS = {};
+-- prefix type suffix
+FORMATS["opaqueTypeVal"] = "%s" .. DEVTOOLS_TYPE_COLOR .. "<%s>|r%s";
+-- prefix type name suffix
+FORMATS["opaqueTypeValName"] = "%s" .. DEVTOOLS_TYPE_COLOR .. "<%s %s>|r%s";
+-- type
+FORMATS["opaqueTypeKey"] = "<%s>";
+-- type name
+FORMATS["opaqueTypeKeyName"] = "<%s %s>";
+-- value
+FORMATS["bracketTableKey"] = "[%s]";
+-- prefix value
+FORMATS["tableKeyAssignPrefix"] = DEVTOOLS_TABLEKEY_COLOR .. "%s%s|r=";
+-- prefix cutoff
+FORMATS["tableEntriesSkipped"] = "%s" .. DEVTOOLS_CUTOFF_COLOR .. "|r";
+-- prefix suffix
+FORMATS["tableTooDeep"] = "%s" .. DEVTOOLS_CUTOFF_COLOR .. "
|r%s";
+-- prefix value suffix
+FORMATS["simpleValue"] = "%s%s%s";
+-- prefix tablename suffix
+FORMATS["tableReference"] = "%s" .. DEVTOOLS_TABLEREF_COLOR .. "%s|r%s";
+
+-- Grab a copy various oft-used functions
+local rawget = rawget;
+local type = type;
+local string_len = string.len;
+local string_sub = string.sub;
+local string_gsub = string.gsub;
+local string_format = string.format;
+local string_match = string.match;
+
+local function WriteMessage(msg)
+ DEFAULT_CHAT_FRAME:AddMessage(msg);
+end
+
+local function prepSimple(val, context)
+ local valType = type(val);
+ if (valType == "nil") then
+ return "nil";
+ elseif (valType == "number") then
+ return val;
+ elseif (valType == "boolean") then
+ if (val) then
+ return "true";
+ else
+ return "false";
+ end
+ elseif (valType == "string") then
+ local l = string_len(val);
+ if ((l > DEVTOOLS_LONG_STRING_CUTOFF) and
+ (DEVTOOLS_LONG_STRING_CUTOFF > 0)) then
+ local more = l - DEVTOOLS_LONG_STRING_CUTOFF;
+ val = string_sub(val, 1, DEVTOOLS_LONG_STRING_CUTOFF);
+ return string_gsub(string_format("%q...+%s",val,more),"[|]", "||");
+ else
+ return string_gsub(string_format("%q",val),"[|]", "||");
+ end
+ elseif (valType == "function") then
+ local fName = context:GetFunctionName(val);
+ if (fName) then
+ return string_format(FORMATS.opaqueTypeKeyName, valType, fName);
+ else
+ return string_format(FORMATS.opaqueTypeKey, valType);
+ end
+ return string_format(FORMATS.opaqueTypeKey, valType);
+ elseif (valType == "userdata") then
+ local uName = context:GetUserdataName(val);
+ if (uName) then
+ return string_format(FORMATS.opaqueTypeKeyName, valType, uName);
+ else
+ return string_format(FORMATS.opaqueTypeKey, valType);
+ end
+ elseif (valType == 'table') then
+ local tName = context:GetTableName(val);
+ if (tName) then
+ return string_format(FORMATS.opaqueTypeKeyName, valType, tName);
+ else
+ return string_format(FORMATS.opaqueTypeKey, valType);
+ end
+ end
+ error("Bad type '" .. valType .. "' to prepSimple");
+end
+
+local function prepSimpleKey(val, context)
+ local valType = type(val);
+ if (valType == "string") then
+ local l = string_len(val);
+ if ((l <= DEVTOOLS_LONG_STRING_CUTOFF) or
+ (DEVTOOLS_LONG_STRING_CUTOFF <= 0)) then
+ if (string_match(val, "^[a-zA-Z_][a-zA-Z0-9_]*$")) then
+ return val;
+ end
+ end
+ end
+ return string_format(FORMATS.bracketTableKey, prepSimple(val, context));
+end
+
+local function DevTools_InitFunctionCache(context)
+ local ret = {};
+
+ for _,k in ipairs(DT.functionSymbols) do
+ local v = getglobal(k);
+ if (type(v) == 'function') then
+ ret[v] = '[' .. k .. ']';
+ end
+ end
+
+ for k,v in pairs(getfenv(0)) do
+ if (type(v) == 'function') then
+ if (not ret[v]) then
+ ret[v] = '[' .. k .. ']';
+ end
+ end
+ end
+
+ return ret;
+end
+
+local function DevTools_InitUserdataCache(context)
+ local ret = {};
+
+ for _,k in ipairs(DT.userdataSymbols) do
+ local v = getglobal(k);
+ if (type(v) == 'table') then
+ local u = rawget(v,0);
+ if (type(u) == 'userdata') then
+ ret[u] = k .. '[0]';
+ end
+ end
+ end
+
+ for k,v in pairs(getfenv(0)) do
+ if (type(v) == 'table') then
+ local u = rawget(v, 0);
+ if (type(u) == 'userdata') then
+ if (not ret[u]) then
+ ret[u] = k .. '[0]';
+ end
+ end
+ end
+ end
+
+ return ret;
+end
+
+local function DevTools_Cache_Nil(self, value, newName)
+ return nil;
+end
+
+local function DevTools_Cache_Function(self, value, newName)
+ if (not self.fCache) then
+ self.fCache = DevTools_InitFunctionCache(self);
+ end
+ local name = self.fCache[value];
+ if ((not name) and newName) then
+ self.fCache[value] = newName;
+ end
+ return name;
+end
+
+local function DevTools_Cache_Userdata(self, value, newName)
+ if (not self.uCache) then
+ self.uCache = DevTools_InitUserdataCache(self);
+ end
+ local name = self.uCache[value];
+ if ((not name) and newName) then
+ self.uCache[value] = newName;
+ end
+ return name;
+end
+
+local function DevTools_Cache_Table(self, value, newName)
+ if (not self.tCache) then
+ self.tCache = {};
+ end
+ local name = self.tCache[value];
+ if ((not name) and newName) then
+ self.tCache[value] = newName;
+ end
+ return name;
+end
+
+local function DevTools_Write(self, msg)
+ DEFAULT_CHAT_FRAME:AddMessage(msg);
+end
+
+local DevTools_DumpValue;
+
+local function DevTools_DumpTableContents(val, prefix, firstPrefix, context)
+ local showCount = 0;
+ local oldDepth = context.depth;
+ local oldKey = context.key;
+
+ -- Use this to set the cache name
+ context:GetTableName(val, oldKey or 'value');
+
+ local iter = pairs(val);
+ local nextK, nextV = iter(val, nil);
+
+ while (nextK) do
+ local k,v = nextK, nextV;
+ nextK, nextV = iter(val, k);
+
+ showCount = showCount + 1;
+ if ((showCount <= DEVTOOLS_MAX_ENTRY_CUTOFF) or (DEVTOOLS_MAX_ENTRY_CUTOFF <= 0)) then
+ local prepKey = prepSimpleKey(k, context);
+ if (oldKey == nil) then
+ context.key = prepKey;
+ elseif (string_sub(prepKey, 1, 1) == "[") then
+ context.key = oldKey .. prepKey
+ else
+ context.key = oldKey .. "." .. prepKey
+ end
+ context.depth = oldDepth + 1;
+
+ local rp = string_format(FORMATS.tableKeyAssignPrefix, firstPrefix, prepKey);
+ firstPrefix = prefix;
+ DevTools_DumpValue(v, prefix, rp, (nextK and ",") or '', context);
+ end
+ end
+ local cutoff = showCount - DEVTOOLS_MAX_ENTRY_CUTOFF;
+ if ((cutoff > 0) and (DEVTOOLS_MAX_ENTRY_CUTOFF > 0)) then
+ context:Write(string_format(FORMATS.tableEntriesSkipped,firstPrefix, cutoff));
+ end
+ context.key = oldKey;
+ context.depth = oldDepth;
+ return (showCount > 0)
+end
+
+-- Return the specified value
+function DevTools_DumpValue(val, prefix, firstPrefix, suffix, context)
+ local valType = type(val);
+
+ if (valType == "userdata") then
+ local uName = context:GetUserdataName(val, 'value');
+ if (uName) then
+ context:Write(string_format(FORMATS.opaqueTypeValName, firstPrefix, valType, uName, suffix));
+ else
+ context:Write(string_format(FORMATS.opaqueTypeVal, firstPrefix, valType, suffix));
+ end
+ return;
+ elseif (valType == "function") then
+ local fName = context:GetFunctionName(val, 'value');
+ if (fName) then
+ context:Write(string_format(FORMATS.opaqueTypeValName, firstPrefix, valType, fName, suffix));
+ else
+ context:Write(string_format(FORMATS.opaqueTypeVal, firstPrefix, valType, suffix));
+ end
+ return;
+ elseif (valType ~= "table") then
+ context:Write(string_format(FORMATS.simpleValue, firstPrefix,prepSimple(val, context), suffix));
+ return;
+ end
+
+ local cacheName = context:GetTableName(val);
+ if (cacheName) then
+ context:Write(string_format(FORMATS.tableReference, firstPrefix, cacheName, suffix));
+ return;
+ end
+
+ if ((context.depth >= DEVTOOLS_DEPTH_CUTOFF) and (DEVTOOLS_DEPTH_CUTOFF > 0)) then
+ context:Write(string_format(FORMATS.tableTooDeep, firstPrefix, suffix));
+ return;
+ end
+
+ firstPrefix = firstPrefix .. "{";
+ local oldPrefix = prefix;
+ prefix = prefix .. DEVTOOLS_INDENT;
+
+ context:Write(firstPrefix);
+ firstPrefix = prefix;
+ local anyContents = DevTools_DumpTableContents(val, prefix, firstPrefix, context);
+ context:Write(oldPrefix .. "}" .. suffix);
+end
+
+local function Pick_Cache_Function(func, setting)
+ if (setting) then
+ return func;
+ else
+ return DevTools_Cache_Nil;
+ end
+end
+
+function DevTools_RunDump(value, context)
+ local prefix = "";
+ local firstPrefix = prefix;
+
+ local valType = type(value);
+ if (type(value) == 'table') then
+ local any =
+ DevTools_DumpTableContents(value, prefix, firstPrefix, context);
+ if (context.Result) then
+ return context:Result();
+ end
+ if (not any) then
+ context:Write("empty result");
+ end
+ return;
+ end
+
+ DevTools_DumpValue(value, '', '', '', context);
+ if (context.Result) then
+ return context:Result();
+ end
+end
+
+-- Dump the specified list of value
+function DevTools_Dump(value, startKey)
+ local context = {
+ depth = 0,
+ key = startKey,
+ };
+
+ context.GetTableName = Pick_Cache_Function(DevTools_Cache_Table, DEVTOOLS_USE_TABLE_CACHE);
+ context.GetFunctionName = Pick_Cache_Function(DevTools_Cache_Function, DEVTOOLS_USE_FUNCTION_CACHE);
+ context.GetUserdataName = Pick_Cache_Function(DevTools_Cache_Userdata, DEVTOOLS_USE_USERDATA_CACHE);
+ context.Write = DevTools_Write;
+
+ DevTools_RunDump(value, context);
+end
+
+function DevTools_DumpCommand(msg, editBox)
+ if (string_match(msg,"^[A-Za-z_][A-Za-z0-9_]*$")) then
+ WriteMessage("Dump: " .. msg);
+ local val = _G[msg];
+ local tmp = {};
+ if (val == nil) then
+ local key = string_format(FORMATS.tableKeyAssignPrefix, '', prepSimpleKey(msg, {}));
+ WriteMessage(key .. "nil,");
+ else
+ tmp[msg] = val;
+ end
+ DevTools_Dump(tmp);
+ return;
+ end
+
+ WriteMessage("Dump: value=" .. msg);
+ local func,err = loadstring("return " .. msg);
+ if (not func) then
+ WriteMessage("Dump: ERROR: " .. err);
+ else
+ DevTools_Dump({func()}, "value");
+ end
+end
+
+DT.functionSymbols = {};
+DT.userdataSymbols = {};
+
+local funcSyms = DT.functionSymbols;
+local userSyms = DT.userdataSymbols;
+
+for k,v in pairs(getfenv(0)) do
+ if (type(v) == 'function') then
+ table.insert(funcSyms, k);
+ elseif (type(v) == 'table') then
+ if (type(rawget(v,0)) == 'userdata') then
+ table.insert(userSyms, k);
+ end
+ end
+end
\ No newline at end of file
diff --git a/!DebugTools/media/UI-GearManager-Border.blp b/!DebugTools/media/UI-GearManager-Border.blp
new file mode 100644
index 0000000..0fabca8
Binary files /dev/null and b/!DebugTools/media/UI-GearManager-Border.blp differ
diff --git a/!DebugTools/media/UI-GearManager-Title-Background.blp b/!DebugTools/media/UI-GearManager-Title-Background.blp
new file mode 100644
index 0000000..32e7a7b
Binary files /dev/null and b/!DebugTools/media/UI-GearManager-Title-Background.blp differ