Initial commit: Chatter v1.2.11 (Curse package)

This commit is contained in:
2026-05-22 22:11:46 +02:00
commit 77ee87198c
49 changed files with 9519 additions and 0 deletions
+260
View File
@@ -0,0 +1,260 @@
Chatter = LibStub("AceAddon-3.0"):NewAddon("Chatter", "AceConsole-3.0", "AceHook-3.0") --, "AceHook-3.0", "AceTimer-3.0", "AceConsole-3.0", "AceEvent-3.0", "LibSink-2.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
local AceConfig = LibStub("AceConfig-3.0")
local AceConfigDialog = LibStub("AceConfigDialog-3.0")
local CreateFrame = _G.CreateFrame
local UIParent = _G.UIParent
local optFrame
local options = {
type = "group",
args = {
defaultArgs = {
type = "group",
name = L["Chatter"],
args = {
aceConfig = {
type = "execute",
name = L["Standalone Config"],
desc = L["Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."],
func = function()
InterfaceOptionsFrame:Hide()
AceConfigDialog:SetDefaultSize("Chatter", 500, 550)
AceConfigDialog:Open("Chatter")
end
}
}
},
config = {
type = "execute",
guiHidden = true,
name = L["Configure"],
desc = L["Configure"],
func = Chatter.OpenConfig
},
modules = {
type = "group",
name = L["Modules"],
desc = L["Modules"],
args = {}
}
}
}
local defaults = {
profile = {
modules = {
["Disable Fading"] = false,
["Chat Autolog"] = false,
["Automatic Whisper Windows"] = false,
["Server Positioning"] = false,
}
}
}
--[[
Creating a prototype for a Decorate/UnDecorate function
Adding these in so after everything is loaded we can post decorate/undecorate the popup frames
--]]
local proto = {
Decorate = function(self,chatframe) end,
Popout = function(self,chatframe,srcChatFrame) end,
TempChatFrames = {},
AddTempChat = function(self,name) table.insert(self.TempChatFrames,name) end,
AlwaysDecorate = function(self,chatframe) end,
}
Chatter:SetDefaultModulePrototype(proto)
Chatter:SetDefaultModuleState(false)
local optionFrames = {}
local ACD3 = LibStub("AceConfigDialog-3.0")
function Chatter:OnInitialize()
self.db = LibStub("AceDB-3.0"):New("ChatterDB", defaults, "Default")
LibStub("AceConfigRegistry-3.0"):RegisterOptionsTable("Chatter", options)
LibStub("AceConfigRegistry-3.0"):RegisterOptionsTable("ChatterModules", options.args.modules)
optFrame = ACD3:AddToBlizOptions("Chatter", nil, nil, "defaultArgs")
for k, v in self:IterateModules() do
options.args.modules.args[k:gsub(" ", "_")] = {
type = "group",
name = (v.modName or k),
args = nil
}
local t
if v.GetOptions then
t = v:GetOptions()
t.settingsHeader = {
type = "header",
name = L["Settings"],
order = 12
}
end
t = t or {}
t.toggle = {
type = "toggle",
name = v.toggleLabel or (L["Enable "] .. (v.modName or k)),
width = "double",
desc = v.Info and v:Info() or (L["Enable "] .. (v.modName or k)),
order = 11,
get = function()
return Chatter.db.profile.modules[k] ~= false or false
end,
set = function(info, v)
Chatter.db.profile.modules[k] = v
if v then
Chatter:EnableModule(k)
-- L["Module"]
Chatter:Print(L["Enabled"], k, L["Module"])
else
Chatter:DisableModule(k)
Chatter:Print(L["Disabled"], k, L["Module"])
end
end
}
t.header = {
type = "header",
name = v.modName or k,
order = 9
}
if v.Info then
t.description = {
type = "description",
name = v:Info() .. "\n\n",
order = 10
}
end
options.args.modules.args[k:gsub(" ", "_")].args = t
end
local moduleList = {}
local moduleNames = {}
for k, v in pairs(options.args.modules.args) do
moduleList[v.name] = k
tinsert(moduleNames, v.name)
end
table.sort(moduleNames)
for _, name in ipairs(moduleNames) do
ACD3:AddToBlizOptions("ChatterModules", name, "Chatter", moduleList[name])
end
self:RegisterChatCommand("chatter", "OpenConfig")
self.db.RegisterCallback(self, "OnProfileChanged", "SetUpdateConfig")
self.db.RegisterCallback(self, "OnProfileCopied", "SetUpdateConfig")
self.db.RegisterCallback(self, "OnProfileReset", "SetUpdateConfig")
self:AddMenuHook(self, {
text = L["Chatter Settings"],
func = Chatter.OpenConfig,
notCheckable = 1
})
self:RawHook("FCF_Tab_OnClick", true)
self:RawHook("FCF_OpenTemporaryWindow",true)
end
do
local info = {}
local menuHooks = {}
function Chatter:AddMenuHook(module, hook)
menuHooks[module] = hook
end
function Chatter:RemoveMenuHook(module)
menuHooks[module] = nil
end
function Chatter:FCF_Tab_OnClick(...)
self.hooks.FCF_Tab_OnClick(...)
for module, v in pairs(menuHooks) do
local menu
if type(v) == "table" then
menu = v
else
menu = module[v](module, ...)
end
UIDropDownMenu_AddButton(menu)
end
end
end
function Chatter:FCF_OpenTemporaryWindow(chatType, chatTarget, sourceChatFrame, selectWindow)
local frame = self.hooks.FCF_OpenTemporaryWindow(chatType, chatTarget, sourceChatFrame, selectWindow)
if frame then
for k, v in self:IterateModules() do
if not frame.isDecorated then
v:AddTempChat(frame:GetName())
end
if v:IsEnabled() and not frame.isDecorated then
v:Decorate(frame)
end
if v:IsEnabled() then
v:Popout(frame,sourceChatFrame or DEFAULT_CHAT_FRAME)
end
v:AlwaysDecorate(frame)
end
frame.isDecorated = true
end
FCFDock_ForceReanchoring(GENERAL_CHAT_DOCK)
return frame
end
function Chatter:OpenConfig(input)
if input == "config" or not InterfaceOptionsFrame:IsResizable() then
options.args.defaultArgs.guiHidden = true
InterfaceOptionsFrame:Hide()
AceConfigDialog:SetDefaultSize("Chatter", 500, 550)
AceConfigDialog:Open("Chatter")
else
InterfaceOptionsFrame_OpenToCategory(Chatter.lastConfig)
options.args.defaultArgs.guiHidden = false
InterfaceOptionsFrame_OpenToCategory(optFrame)
end
end
do
local timer, t = nil, 0
local function update()
t = t + arg1
if t > 0.5 then
timer:SetScript("OnUpdate", nil)
Chatter:UpdateConfig()
end
end
function Chatter:SetUpdateConfig()
t = 0
timer = timer or CreateFrame("Frame", nil, UIParent)
timer:SetScript("OnUpdate", update)
end
end
function Chatter:UpdateConfig()
for k, v in self:IterateModules() do
if v:IsEnabled() then
v:Disable()
v:Enable()
end
end
end
function Chatter:OnEnable()
if not self.db.profile.welcomeMessaged then
self:Print(L["Welcome to Chatter! Type /chatter to configure."])
self.db.profile.welcomeMessaged = true
end
for k, v in self:IterateModules() do
if self.db.profile.modules[k] ~= false then
v:Enable()
end
end
if not options.args.Profiles then
options.args.Profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)
self.lastConfig = ACD3:AddToBlizOptions("Chatter", L["Profiles"], "Chatter", "Profiles")
end
end
function Chatter:OnDisable()
end
+32
View File
@@ -0,0 +1,32 @@
## Interface: 30300
## Title: Chatter
## Notes: Lightweight Chat Improvements
## Notes-zhTW: 一個輕量級的聊天增強插件
## Notes-zhCN: 一个轻量级的聊天增强插件
## Author: Antiarc
## OptionalDeps: Ace3, LibSharedMedia-3.0, LibSink-2.0
## X-Category: Chat/Communication
## Version: 1.1
## SavedVariables: ChatterDB
## X-Curse-Packaged-Version: v1.2.11
## X-Curse-Project-Name: Chatter
## X-Curse-Project-ID: chatter
## X-Curse-Repository-ID: wow/chatter/mainline
#@no-lib-strip@
Libs\AceTab-3.0\AceTab-3.0.xml
Libs\LibSink-2.0\lib.xml
#@end-no-lib-strip@
Localization\enUS.lua
Localization\ruRU.lua
Localization\deDE.lua
Localization\frFR.lua
Localization\esES.lua
Localization\zhCN.lua
Localization\zhTW.lua
Localization\koKR.lua
Chatter.lua
modules.xml
+105
View File
@@ -0,0 +1,105 @@
--- AceConfigTab-3.0 provides support for tab-completion to AceConfig tables.
-- Note: This library is not yet finalized.
-- @class file
-- @name AceConfigTab-3.0
-- @release $Id: AceConfigTab-3.0.lua 769 2009-04-04 11:05:08Z nevcairiel $
local MAJOR, MINOR = "AceConfigTab-3.0", 1
local lib = LibStub:NewLibrary(MAJOR, MINOR)
if not lib then return end
local ac = LibStub("AceConsole-3.0")
local function printf(...)
DEFAULT_CHAT_FRAME:AddMessage(string.format(...))
end
-- getChildren(opt, ...)
--
-- Retrieve the next valid group args in an AceConfig table.
--
-- opt - AceConfig options table
-- ... - args following the slash command
--
-- opt will need to be determined by the slash-command
-- The args will be obtained using AceConsole:GetArgs() or something similar on the remainder of the line.
--
-- Returns arg1, arg2, ...
local function getLevel(opt, ...)
-- Walk down the options tree to the last arg in the commandline, or return if it does not follow the tree.
local path = ""
local lastChild
for i = 1, select('#', ...) do
local arg = select(i, ...)
if not arg or type(arg) == 'number' then break end
if opt.plugins then
for k in pairs(opt.plugins) do
if string.lower(k) == string.lower(arg) then
opt = opt.plugins[k]
path = path..arg.." "
lastChild = arg
break
end
end
elseif opt.args then
for k in pairs(opt.args) do
if string.lower(k) == string.lower(arg) then
opt = opt.args[k]
path = path..arg.." "
lastChild = arg
break
end
end
else
break
end
end
return opt, path
end
local function getChildren(opt, ...)
local lastChild, path
opt, path, lastChild = getLevel(opt, ...)
local args = {}
for _, field in ipairs({"args", "plugins"}) do
if type(opt[field]) == 'table' then
for k in pairs(opt[field]) do
if opt[field].type ~= 'header' then
table.insert(args, k)
end
end
end
end
return args, path
end
--LibStub("AceConfig-3.0"):RegisterOptionsTable("ag_UnitFrames", aUF.Options.table)
local function createWordlist(t, cmdline, pos)
local cmd = string.match(cmdline, "(/[^ \t\n]+)")
local argslist = string.sub(cmdline, pos, this:GetCursorPosition())
local opt -- TODO: figure out options table using cmd
opt = LibStub("AceConfigRegistry-3.0"):GetOptionsTable("ag_UnitFrames", "cmd", "AceTab-3.0") -- hardcoded temporarily for testing
if not opt then return end
local args, path = getChildren(opt, ac:GetArgs(argslist, #argslist/2)) -- largest # of args representable by a string of length #argslist, since they must be separated by spaces
for _, v in ipairs(args) do
table.insert(t, path..v)
end
end
local function usage(t, matches, _, cmdline)
local cmd = string.match(cmdline, "(/[^ \t\n]+)")
local argslist = string.sub(cmdline, #cmd, this:GetCursorPosition())
local opt -- TODO: figure out options table using cmd
opt = LibStub("AceConfigRegistry-3.0"):GetOptionsTable("ag_UnitFrames")("cmd", "AceTab-3.0") -- hardcoded temporarily for testing
if not opt then return end
local level = getLevel(opt, ac:GetArgs(argslist, #argslist/2)) -- largest # of args representable by a string of length #argslist, since they must be separated by spaces
local option
for _, m in pairs(matches) do
local tail = string.match(m, "([^ \t\n]+)$")
option = level.plugins and level.plugins[tail] or level.args and level.args[tail]
printf("%s - %s", tail, option.desc)
end
end
LibStub("AceTab-3.0"):RegisterTabCompletion("aguftest", "%/%w+ ", createWordlist, usage)
+443
View File
@@ -0,0 +1,443 @@
--- AceTab-3.0 provides support for tab-completion.
-- Note: This library is not yet finalized.
-- @class file
-- @name AceTab-3.0
-- @release $Id: AceTab-3.0.lua 947 2010-06-29 16:44:48Z nevcairiel $
local ACETAB_MAJOR, ACETAB_MINOR = 'AceTab-3.0', 8
local AceTab, oldminor = LibStub:NewLibrary(ACETAB_MAJOR, ACETAB_MINOR)
if not AceTab then return end -- No upgrade needed
local is335 = GetBuildInfo() >= "3.3.5"
AceTab.registry = AceTab.registry or {}
-- local upvalues
local _G = _G
local pairs = pairs
local ipairs = ipairs
local type = type
local registry = AceTab.registry
local strfind = string.find
local strsub = string.sub
local strlower = string.lower
local strformat = string.format
local strmatch = string.match
local function printf(...)
DEFAULT_CHAT_FRAME:AddMessage(strformat(...))
end
local function getTextBeforeCursor(this, start)
return strsub(this:GetText(), start or 1, this:GetCursorPosition())
end
-- Hook OnTabPressed and OnTextChanged for the frame, give it an empty matches table, and set its curMatch to 0, if we haven't done so already.
local function hookFrame(f)
if f.hookedByAceTab3 then return end
f.hookedByAceTab3 = true
if f == (is335 and ChatEdit_GetActiveWindow() or ChatFrameEditBox) then
local origCTP = ChatEdit_CustomTabPressed
function ChatEdit_CustomTabPressed(...)
if AceTab:OnTabPressed(f) then
return origCTP(...)
else
return true
end
end
else
local origOTP = f:GetScript('OnTabPressed')
if type(origOTP) ~= 'function' then
origOTP = function() end
end
f:SetScript('OnTabPressed', function(...)
if AceTab:OnTabPressed(f) then
return origOTP(...)
end
end)
end
f.at3curMatch = 0
f.at3matches = {}
end
local firstPMLength
local fallbacks, notfallbacks = {}, {} -- classifies completions into those which have preconditions and those which do not. Those without preconditions are only considered if no other completions have matches.
local pmolengths = {} -- holds the number of characters to overwrite according to pmoverwrite and the current prematch
-- ------------------------------------------------------------------------------
-- RegisterTabCompletion( descriptor, prematches, wordlist, usagefunc, listenframes, postfunc, pmoverwrite )
-- See http://www.wowace.com/wiki/AceTab-2.0 for detailed API documentation
--
-- descriptor string Unique identifier for this tab completion set
--
-- prematches string|table|nil String match(es) AFTER which this tab completion will apply.
-- AceTab will ignore tabs NOT preceded by the string(s).
-- If no value is passed, will check all tabs pressed in the specified editframe(s) UNLESS a more-specific tab complete applies.
--
-- wordlist function|table Function that will be passed a table into which it will insert strings corresponding to all possible completions, or an equivalent table.
-- The text in the editbox, the position of the start of the word to be completed, and the uncompleted partial word
-- are passed as second, third, and fourth arguments, to facilitate pre-filtering or conditional formatting, if desired.
--
-- usagefunc function|boolean|nil Usage statement function. Defaults to the wordlist, one per line. A boolean true squelches usage output.
--
-- listenframes string|table|nil EditFrames to monitor. Defaults to ChatFrameEditBox.
--
-- postfunc function|nil Post-processing function. If supplied, matches will be passed through this function after they've been identified as a match.
--
-- pmoverwrite boolean|number|nil Offset the beginning of the completion string in the editbox when making a completion. Passing a boolean true indicates that we want to overwrite
-- the entire prematch string, and passing a number will overwrite that many characters prior to the cursor.
-- This is useful when you want to use the prematch as an indicator character, but ultimately do not want it as part of the text, itself.
--
-- no return
-- ------------------------------------------------------------------------------
function AceTab:RegisterTabCompletion(descriptor, prematches, wordlist, usagefunc, listenframes, postfunc, pmoverwrite)
-- Arg checks
if type(descriptor) ~= 'string' then error("Usage: RegisterTabCompletion(descriptor, prematches, wordlist, usagefunc, listenframes, postfunc, pmoverwrite): 'descriptor' - string expected.", 3) end
if prematches and type(prematches) ~= 'string' and type(prematches) ~= 'table' then error("Usage: RegisterTabCompletion(descriptor, prematches, wordlist, usagefunc, listenframes, postfunc, pmoverwrite): 'prematches' - string, table, or nil expected.", 3) end
if type(wordlist) ~= 'function' and type(wordlist) ~= 'table' then error("Usage: RegisterTabCompletion(descriptor, prematches, wordlist, usagefunc, listenframes, postfunc, pmoverwrite): 'wordlist' - function or table expected.", 3) end
if usagefunc and type(usagefunc) ~= 'function' and type(usagefunc) ~= 'boolean' then error("Usage: RegisterTabCompletion(descriptor, prematches, wordlist, usagefunc, listenframes, postfunc, pmoverwrite): 'usagefunc' - function or boolean expected.", 3) end
if listenframes and type(listenframes) ~= 'string' and type(listenframes) ~= 'table' then error("Usage: RegisterTabCompletion(descriptor, prematches, wordlist, usagefunc, listenframes, postfunc, pmoverwrite): 'listenframes' - string or table expected.", 3) end
if postfunc and type(postfunc) ~= 'function' then error("Usage: RegisterTabCompletion(descriptor, prematches, wordlist, usagefunc, listenframes, postfunc, pmoverwrite): 'postfunc' - function expected.", 3) end
if pmoverwrite and type(pmoverwrite) ~= 'boolean' and type(pmoverwrite) ~= 'number' then error("Usage: RegisterTabCompletion(descriptor, prematches, wordlist, usagefunc, listenframes, postfunc, pmoverwrite): 'pmoverwrite' - boolean or number expected.", 3) end
local pmtable = type(prematches) == 'table' and prematches or {}
-- Mark this group as a fallback group if no value was passed.
if not prematches then
pmtable[1] = ""
fallbacks[descriptor] = true
-- Make prematches into a one-element table if it was passed as a string.
elseif type(prematches) == 'string' then
pmtable[1] = prematches
if prematches == "" then
fallbacks[descriptor] = true
else
notfallbacks[descriptor] = true
end
end
-- Make listenframes into a one-element table if it was not passed a table of frames.
if not listenframes then -- default
if is335 then
listenframes = {}
for i = 1, NUM_CHAT_WINDOWS do
listenframes[i] = _G["ChatFrame"..i.."EditBox"]
end
else
listenframes = { ChatFrameEditBox }
end
elseif type(listenframes) ~= 'table' or type(listenframes[0]) == 'userdata' and type(listenframes.IsObjectType) == 'function' then -- single frame or framename
listenframes = { listenframes }
end
-- Hook each registered listenframe and give it a matches table.
for _, f in pairs(listenframes) do
if type(f) == 'string' then
f = _G[f]
end
if type(f) ~= 'table' or type(f[0]) ~= 'userdata' or type(f.IsObjectType) ~= 'function' then
error(format(ACETAB_MAJOR..": Cannot register frame %q; it does not exist", f:GetName()))
end
if f then
if f:GetObjectType() ~= 'EditBox' then
error(format(ACETAB_MAJOR..": Cannot register frame %q; it is not an EditBox", f:GetName()))
else
hookFrame(f)
end
end
end
-- Everything checks out; register this completion.
if not registry[descriptor] then
registry[descriptor] = { prematches = pmtable, wordlist = wordlist, usagefunc = usagefunc, listenframes = listenframes, postfunc = postfunc, pmoverwrite = pmoverwrite }
end
end
function AceTab:IsTabCompletionRegistered(descriptor)
return registry and registry[descriptor]
end
function AceTab:UnregisterTabCompletion(descriptor)
registry[descriptor] = nil
pmolengths[descriptor] = nil
fallbacks[descriptor] = nil
notfallbacks[descriptor] = nil
end
-- ------------------------------------------------------------------------------
-- gcbs( s1, s2 )
--
-- s1 string First string to be compared
--
-- s2 string Second string to be compared
--
-- returns the greatest common substring beginning s1 and s2
-- ------------------------------------------------------------------------------
local function gcbs(s1, s2)
if not s1 and not s2 then return end
if not s1 then s1 = s2 end
if not s2 then s2 = s1 end
if #s2 < #s1 then
s1, s2 = s2, s1
end
if strfind(strlower(s2), "^"..strlower(s1)) then
return s1
else
return gcbs(strsub(s1, 1, -2), s2)
end
end
local cursor -- Holds cursor position. Set in :OnTabPressed().
-- ------------------------------------------------------------------------------
-- cycleTab()
-- For when a tab press has multiple possible completions, we need to allow the user to press tab repeatedly to cycle through them.
-- If we have multiple possible completions, all tab presses after the first will call this function to cycle through and insert the different possible matches.
-- This function will stop being called after OnTextChanged() is triggered by something other than AceTab (i.e. the user inputs a character).
-- ------------------------------------------------------------------------------
local previousLength, cMatch, matched, postmatch
local function cycleTab(this)
cMatch = 0 -- Counter across all sets. The pseudo-index relevant to this value and corresponding to the current match is held in this.at3curMatch
matched = false
-- Check each completion group registered to this frame.
for desc, compgrp in pairs(this.at3matches) do
-- Loop through the valid completions for this set.
for m, pm in pairs(compgrp) do
cMatch = cMatch + 1
if cMatch == this.at3curMatch then -- we're back to where we left off last time through the combined list
this.at3lastMatch = m
this.at3lastWord = pm
this.at3curMatch = cMatch + 1 -- save the new cMatch index
matched = true
break
end
end
if matched then break end
end
-- If our index is beyond the end of the list, reset the original uncompleted substring and let the cycle start over next time tab is pressed.
if not matched then
this.at3lastMatch = this.at3origMatch
this.at3lastWord = this.at3origWord
this.at3curMatch = 1
end
-- Insert the completion.
this:HighlightText(this.at3matchStart-1, cursor)
this:Insert(this.at3lastWord or '')
this.at3_last_precursor = getTextBeforeCursor(this) or ''
end
local IsSecureCmd = IsSecureCmd
local cands, candUsage = {}, {}
local numMatches = 0
local firstMatch, hasNonFallback, allGCBS, setGCBS, usage
local text_precursor, text_all, text_pmendToCursor
local matches, usagefunc -- convenience locals
-- Fill the this.at3matches[descriptor] tables with matching completion pairs for each entry, based on
-- the partial string preceding the cursor position and using the corresponding registered wordlist.
--
-- The entries of the matches tables are of the format raw_match = formatted_match, where raw_match is the plaintext completion and
-- formatted_match is the match after being formatted/altered/processed by the registered postfunc.
-- If no postfunc exists, then the formatted and raw matches are the same.
local pms, pme, pmt, prematchStart, prematchEnd, text_prematch, entry
local function fillMatches(this, desc, fallback)
entry = registry[desc]
-- See what frames are registered for this completion group. If the frame in which we pressed tab is one of them, then we start building matches.
for _, f in ipairs(entry.listenframes) do
if f == this then
-- Try each precondition string registered for this completion group.
for _, prematch in ipairs(entry.prematches) do
-- Test if our prematch string is satisfied.
-- If it is, then we find its last occurence prior to the cursor, calculate and store its pmoverwrite value (if applicable), and start considering completions.
if fallback then prematch = "%s" end
-- Find the last occurence of the prematch before the cursor.
pms, pme, pmt = nil, 1, ''
text_prematch, prematchEnd, prematchStart = nil, nil, nil
while true do
pms, pme, pmt = strfind(text_precursor, "("..prematch..")", pme)
if pms then
prematchStart, prematchEnd, text_prematch = pms, pme, pmt
pme = pme + 1
else
break
end
end
if not prematchStart and fallback then
prematchStart, prematchEnd, text_prematch = 0, 0, ''
end
if prematchStart then
-- text_pmendToCursor should be the sub-word/phrase to be completed.
text_pmendToCursor = strsub(text_precursor, prematchEnd + 1)
-- How many characters should we eliminate before the completion before writing it in.
pmolengths[desc] = entry.pmoverwrite == true and #text_prematch or entry.pmoverwrite or 0
-- This is where we will insert completions, taking the prematch overwrite into account.
this.at3matchStart = prematchEnd + 1 - (pmolengths[desc] or 0)
-- We're either a non-fallback set or all completions thus far have been fallback sets, and the precondition matches.
-- Create cands from the registered wordlist, filling it with all potential (unfiltered) completion strings.
local wordlist = entry.wordlist
local cands = type(wordlist) == 'table' and wordlist or {}
if type(wordlist) == 'function' then
wordlist(cands, text_all, prematchEnd + 1, text_pmendToCursor)
end
if cands ~= false then
matches = this.at3matches[desc] or {}
for i in pairs(matches) do matches[i] = nil end
-- Check each of the entries in cands to see if it completes the word before the cursor.
-- Finally, increment our match count and set firstMatch, if appropriate.
for _, m in ipairs(cands) do
if strfind(strlower(m), strlower(text_pmendToCursor), 1, 1) == 1 then -- we have a matching completion!
hasNonFallback = not fallback
matches[m] = entry.postfunc and entry.postfunc(m, prematchEnd + 1, text_all) or m
numMatches = numMatches + 1
if numMatches == 1 then
firstMatch = matches[m]
firstPMLength = pmolengths[desc] or 0
end
end
end
this.at3matches[desc] = numMatches > 0 and matches or nil
end
end
end
end
end
end
function AceTab:OnTabPressed(this)
if this:GetText() == '' then return true end
-- allow Blizzard to handle slash commands, themselves
if this == (is335 and ChatEdit_GetActiveWindow() or ChatFrameEditBox) then
local command = this:GetText()
if strfind(command, "^/[%a%d_]+$") then
return true
end
local cmd = strmatch(command, "^/[%a%d_]+")
if cmd and IsSecureCmd(cmd) then
return true
end
end
cursor = this:GetCursorPosition()
text_all = this:GetText()
text_precursor = getTextBeforeCursor(this) or ''
-- If we've already found some matches and haven't done anything since the last tab press, then (continue) cycling matches.
-- Otherwise, reset this frame's matches and proceed to creating our list of possible completions.
this.at3lastMatch = this.at3curMatch > 0 and (this.at3lastMatch or this.at3origWord)
-- Detects if we've made any edits since the last tab press. If not, continue cycling completions.
if text_precursor == this.at3_last_precursor then
return cycleTab(this)
else
for i in pairs(this.at3matches) do this.at3matches[i] = nil end
this.at3curMatch = 0
this.at3origWord = nil
this.at3origMatch = nil
this.at3lastWord = nil
this.at3lastMatch = nil
this.at3_last_precursor = text_precursor
end
numMatches = 0
firstMatch = nil
firstPMLength = 0
hasNonFallback = false
for i in pairs(pmolengths) do pmolengths[i] = nil end
for desc in pairs(notfallbacks) do
fillMatches(this, desc)
end
if not hasNonFallback then
for desc in pairs(fallbacks) do
fillMatches(this, desc, true)
end
end
if not firstMatch then
this.at3_last_precursor = "\0"
return true
end
-- We want to replace the entire word with our completion, so highlight it up to the cursor.
-- If only one match exists, then stick it in there and append a space.
if numMatches == 1 then
-- HighlightText takes the value AFTER which the highlighting starts, so we have to subtract 1 to have it start before the first character.
this:HighlightText(this.at3matchStart-1, cursor)
this:Insert(firstMatch)
this:Insert(" ")
else
-- Otherwise, we want to begin cycling through the valid completions.
-- Beginning a cycle also causes the usage statement to be printed, if one exists.
-- Print usage statements for each possible completion (and gather up the GCBS of all matches while we're walking the tables).
allGCBS = nil
for desc, matches in pairs(this.at3matches) do
-- Don't print usage statements for fallback completion groups if we have 'real' completion groups with matches.
if hasNonFallback and fallbacks[desc] then break end
-- Use the group's description as a heading for its usage statements.
DEFAULT_CHAT_FRAME:AddMessage(desc..":")
usagefunc = registry[desc].usagefunc
if not usagefunc then
-- No special usage processing; just print a list of the (formatted) matches.
for m, fm in pairs(matches) do
DEFAULT_CHAT_FRAME:AddMessage(fm)
allGCBS = gcbs(allGCBS, m)
end
else
-- Print a usage statement based on the corresponding registered usagefunc.
-- candUsage is the table passed to usagefunc to be filled with candidate = usage_statement pairs.
if type(usagefunc) == 'function' then
for i in pairs(candUsage) do candUsage[i] = nil end
-- usagefunc takes the greatest common substring of valid matches as one of its args, so let's find that now.
-- TODO: Make the GCBS function accept a vararg or table, after which we can just pass in the list of matches.
setGCBS = nil
for m in pairs(matches) do
setGCBS = gcbs(setGCBS, m)
end
allGCBS = gcbs(allGCBS, setGCBS)
usage = usagefunc(candUsage, matches, setGCBS, strsub(text_precursor, 1, prematchEnd))
-- If the usagefunc returns a string, then the entire usage statement has been taken care of by usagefunc, and we need only to print it...
if type(usage) == 'string' then
DEFAULT_CHAT_FRAME:AddMessage(usage)
-- ...otherwise, it should have filled candUsage with candidate-usage statement pairs, and we need to print the matching ones.
elseif next(candUsage) and numMatches > 0 then
for m, fm in pairs(matches) do
if candUsage[m] then DEFAULT_CHAT_FRAME:AddMessage(strformat("%s - %s", fm, candUsage[m])) end
end
end
end
end
-- Replace the original string with the greatest common substring of all valid completions.
this.at3curMatch = 1
this.at3origWord = strsub(text_precursor, this.at3matchStart, this.at3matchStart + pmolengths[desc] - 1) .. allGCBS or ""
this.at3origMatch = allGCBS or ""
this.at3lastWord = this.at3origWord
this.at3lastMatch = this.at3origMatch
this:HighlightText(this.at3matchStart-1, cursor)
this:Insert(this.at3origWord)
this.at3_last_precursor = getTextBeforeCursor(this) or ''
end
end
end
+5
View File
@@ -0,0 +1,5 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceTab-3.0.lua"/>
<Script file="AceConfigTab-3.0.lua"/>
</Ui>
+782
View File
@@ -0,0 +1,782 @@
--[[
Name: Sink-2.0
Revision: $Rev: 71 $
Author(s): Rabbit (rabbit.magtheridon@gmail.com), Antiarc (cheal@gmail.com)
Website: http://rabbit.nihilum.eu
Documentation: http://wiki.wowace.com/index.php/Sink-2.0
SVN: http://svn.wowace.com/wowace/trunk/SinkLib/Sink-2.0
Description: Library that handles chat output.
Dependencies: LibStub, SharedMedia-3.0 (optional)
License: GPL v2 or later.
]]
--[[
Copyright (C) 2008 Rabbit
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
]]
-----------------------------------------------------------------------
-- Sink-2.0
local SINK20 = "LibSink-2.0"
local SINK20_MINOR = 90000 + tonumber(("$Revision: 71 $"):match("(%d+)"))
local sink = LibStub:NewLibrary(SINK20, SINK20_MINOR)
if not sink then return end
-- Start upgrade
sink.storageForAddon = sink.storageForAddon or {}
sink.override = sink.override or {}
sink.msbt_registered_fonts = sink.msbt_registered_fonts or {}
sink.registeredScrollAreaFunctions = sink.registeredScrollAreaFunctions or {}
sink.handlers = sink.handlers or {}
sink.stickyAddons = sink.stickyAddons or {
Blizzard = true,
MikSBT = true,
SCT = true,
Parrot = true,
BCF = true,
}
-- Upgrade complete
local L_DEFAULT = "Default"
local L_DEFAULT_DESC = "Route output from this addon through the first available handler, preferring scrolling combat text addons if available."
local L_ROUTE = "Route output from this addon through %s."
local L_SCT = "Scrolling Combat Text"
local L_MSBT = "MikSBT"
local L_BIGWIGS = "BigWigs"
local L_BCF = "BlinkCombatFeedback"
local L_UIERROR = "Blizzard Error Frame"
local L_CHAT = "Chat"
local L_BLIZZARD = "Blizzard FCT"
local L_RW = "Raid Warning"
local L_PARROT = "Parrot"
local L_CHANNEL = "Channel"
local L_OUTPUT = "Output"
local L_OUTPUT_DESC = "Where to route the output from this addon."
local L_SCROLL = "Sub section"
local L_SCROLL_DESC = "Set the sub section where messages should appear.\n\nOnly available for some output sinks."
local L_STICKY = "Sticky"
local L_STICKY_DESC = "Set messages from this addon to appear as sticky.\n\nOnly available for some output sinks."
local L_NONE = "None"
local L_NONE_DESC = "Hide all messages from this addon."
local L_NOTINCHANNEL = " (You tried sending this to the channel %s, but it appears you are not there.)"
local l = GetLocale()
if l == "koKR" then
L_DEFAULT = "기본"
L_DEFAULT_DESC = "처음으로 사용 가능한 트레이너를 통해 이 애드온으로부터 출력을 보냅니다."
L_ROUTE = "%s|1을;를; 통해 이 애드온의 메시지를 출력합니다."
L_SCT = "Scrolling Combat Text"
L_MSBT = "MikSBT"
L_BIGWIGS = "BigWigs"
L_BCF = "블링크의 전투 메세지"
L_UIERROR = "블리자드 오류 창"
L_CHAT = "대화창"
L_BLIZZARD = "블리자드 FCT"
L_RW = "공격대 경보"
L_PARROT = "Parrot"
L_OUTPUT = "출력"
L_OUTPUT_DESC = "어디에 이 애드온의 메시지를 출력할지 선택합니다."
L_SCROLL = "스크롤 영역"
L_SCROLL_DESC = "메시지를 출력할 스크룰 영역을 설정합니다.\n\nParrot, SCT나 MikSBT만 사용 가능합니다."
L_STICKY = "점착"
L_STICKY_DESC = "달라붙는 것처럼 보일 이 애드온의 메시지를 설정합니다.\n\n블리자드 FCT, Parrot, SCT나 MikSBT만 사용 가능합니다."
L_NONE = "없음"
L_NONE_DESC = "이 애드온의 모든 메시지를 숨김니다."
elseif l == "frFR" then
L_DEFAULT = "Par défaut"
L_DEFAULT_DESC = "Transmet la sortie de cet addon via le premier handler disponible, de préférence les textes de combat défilants s'il y en a."
L_ROUTE = "Transmet la sortie de cet addon via %s."
L_SCT = "Scrolling Combat Text"
L_MSBT = "MikSBT"
L_BIGWIGS = "BigWigs"
L_BCF = "BlinkCombatFeedback"
L_UIERROR = "Cadre des erreurs"
L_CHAT = "Fenêtre de discussion"
L_BLIZZARD = "TCF de Blizzard"
L_RW = "Avertissement raid"
L_PARROT = "Parrot"
L_CHANNEL = "Canal"
L_OUTPUT = "Sortie"
L_OUTPUT_DESC = "Destination de la sortie de cet addon."
L_SCROLL = "Sous-section"
L_SCROLL_DESC = "Définit la sous-section où les messages doivent apparaitre.\n\nDisponible uniquement dans certains cas."
L_STICKY = "En évidence"
L_STICKY_DESC = "Fait en sortie que les messages de cet addon apparaissent en évidence.\n\nDisponible uniquement dans certains cas."
L_NONE = "Aucun"
L_NONE_DESC = "Masque tous les messages provenant de cet addon."
elseif l == "deDE" then
L_DEFAULT = "Voreinstellung"
L_DEFAULT_DESC = "Leitet die Ausgabe von diesem Addon zum ersten verfügbaren Ausgabeort, vorzugsweise Scrollende Kampf Text Addons wenn verfügbar."
L_ROUTE = "Schickt die Meldungen dieses Addons an %s."
L_SCT = "Scrolling Combat Text(SCT)"
L_MSBT = "MikSBT"
L_BIGWIGS = "BigWigs"
L_BCF = "BlinkCombatFeedback"
L_UIERROR = "Blizzard's Fehler Fenster"
L_CHAT = "Im Chat"
L_BLIZZARD = "Blizzard's schwebenden Kampftext"
L_RW = "Schlachtzug's Warnung"
L_PARROT = "Parrot"
L_OUTPUT = "Ausgabe"
L_OUTPUT_DESC = "Wohin die Meldungen des Addons gesendet werden soll."
L_SCROLL = "Scroll Bereich"
L_SCROLL_DESC = "Setzt die Scroll Bereich, wo die Meldungen erscheinen sollen.\n\nNur verfügbar für Parrot, SCT oder MikSBT."
L_STICKY = "Stehend"
L_STICKY_DESC = "Läßt Nachrichten von diesem Addon als stehende Nachrichten erscheinen.\n\nNur verfügbar für Blizzard FCT, Parrot, SCT oder MikSBT."
L_NONE = "Nirgends"
L_NONE_DESC = "Versteckt alle Meldungen von diesem Addon."
elseif l == "zhCN" then
L_DEFAULT = "默认"
L_DEFAULT_DESC = "插件的输出方式取决于第一个可用插件,例如有 SCT 插件,则优先使用。"
L_ROUTE = "经由%s显示信息。"
L_SCT = "SCT"
L_MSBT = "MikSBT"
L_BIGWIGS = "BigWigs"
L_BCF = "BlinkCombatFeedback"
L_UIERROR = "Blizzard 错误框体"
L_CHAT = "聊天框体"
L_BLIZZARD = "系统自带滚动战斗信息"
L_RW = "团队警告"
L_PARROT = "Parrot"
L_CHANNEL = "频道"
L_OUTPUT = "输出模式"
L_OUTPUT_DESC = "设置显示位置。"
L_SCROLL = "滚动区域"
L_SCROLL_DESC = "设置滚动信息显示位置。\n\n只有 Parrot、SCT 及 MikSBT 支持。"
L_STICKY = "固定"
L_STICKY_DESC = "设置信息固定显示位置。\n\n只有系统自带滚动战斗信息、Parrot、SCT 及 MikSBT 支持。"
L_NONE = "隐藏"
L_NONE_DESC = "隐藏所有来自插件的信息。"
elseif l == "zhTW" then
L_DEFAULT = "預設"
L_DEFAULT_DESC = "插件輸出經由第一個可使用的處理器顯示,如果有 SCT 的話,則優先使用。"
L_ROUTE = "插件輸出經由%s顯示。"
L_SCT = "SCT"
L_MSBT = "MikSBT"
L_BIGWIGS = "BigWigs"
L_BCF = "BlinkCombatFeedback"
L_UIERROR = "Blizzard 錯誤訊息框架"
L_CHAT = "聊天視窗"
L_BLIZZARD = "Blizzard 浮動戰鬥文字"
L_RW = "團隊警告"
L_PARROT = "Parrot"
L_OUTPUT = "顯示模式"
L_OUTPUT_DESC = "插件輸出經由哪裡顯示。"
L_SCROLL = "滾動區域"
L_SCROLL_DESC = "設定滾動訊息出現位置。\n\n只有 ParrotSCT 及 MikSBT 有支援。"
L_STICKY = "固定"
L_STICKY_DESC = "設定使用固定訊息。\n\n只有 Blizzard 浮動戰鬥文字,ParrotSCT 及 MikSBT 有支援。"
L_NONE = "隱藏"
L_NONE_DESC = "隱藏所有插件輸出。"
elseif l == "ruRU" then
L_DEFAULT = "По умолчанию"
L_DEFAULT_DESC = "Маршрут вывода сообщений данного аддона через первое доступное устройство, предпочитая доступные аддоны прокрутки текста боя."
L_ROUTE = "Маршрут вывода сообщений данного аддона через %s."
L_SCT = "SCT"
L_MSBT = "MikSBT"
L_BIGWIGS = "BigWigs"
L_BCF = "BlinkCombatFeedback"
L_UIERROR = "Фрейм ошибок Blizzard"
L_CHAT = "Чат"
L_BLIZZARD = "Blizzard FCT"
L_RW = "Объявление рейду"
L_PARROT = "Parrot"
L_CHANNEL = "Канал"
L_OUTPUT = "Вывод"
L_OUTPUT_DESC = "Куда выводить сообщения данного аддона."
L_SCROLL = "Область прокрутки"
L_SCROLL_DESC = "Назначить область прокрутки куда должны выводиться сообщения.\n\nДоступно только для Parrotа, SCT или MikSBT."
L_STICKY = "Клейкий"
L_STICKY_DESC = "Сделать сообщения данного аддона клейкими.\n\nДоступно только для Blizzard FCT, Parrot, SCT или MikSBT."
L_NONE = "Нету"
L_NONE_DESC = "Скрыть все сообщения данного аддона."
end
local SML = LibStub("LibSharedMedia-3.0", true)
local _G = getfenv(0)
local function getSticky(addon)
return sink.storageForAddon[addon] and sink.storageForAddon[addon].sink20Sticky or nil
end
-- Thanks to Antiarc and his Soar-1.0 library for most of the 'meat' of the
-- sink-specific functions.
local function parrot(addon, text, r, g, b, font, size, outline, sticky, loc, icon)
local location = sink.storageForAddon[addon] and sink.storageForAddon[addon].sink20ScrollArea or "Notification"
local s = getSticky(addon) or sticky
Parrot:ShowMessage(text, location, s, r, g, b, font, size, outline, icon)
end
local sct_color = {}
local function sct(addon, text, r, g, b, font, size, outline, sticky, _, icon)
sct_color.r, sct_color.g, sct_color.b = r, g, b
local loc = sink.storageForAddon[addon] and sink.storageForAddon[addon].sink20ScrollArea or "Messages"
local location = (loc == "Outgoing" and SCT.FRAME1) or (loc == "Incoming" and SCT.FRAME2) or SCT.MSG
local s = getSticky(addon) or sticky
SCT:DisplayCustomEvent(text, sct_color, s, location, nil, icon)
end
local msbt_outlines = {["NORMAL"] = 1, ["OUTLINE"] = 2, ["THICKOUTLINE"] = 3}
local function msbt(addon, text, r, g, b, font, size, outline, sticky, _, icon)
if font and SML and not sink.msbt_registered_fonts[font] then
MikSBT.RegisterFont(font, SML:Fetch("font", font))
sink.msbt_registered_fonts[font] = true
end
local location = sink.storageForAddon[addon] and sink.storageForAddon[addon].sink20ScrollArea or MikSBT.DISPLAYTYPE_NOTIFICATION
local s = getSticky(addon) or sticky
MikSBT.DisplayMessage(text, location, s, r * 255, g * 255, b * 255, size, font, msbt_outlines[outline], icon)
end
local bcf_outlines = {NORMAL = "", OUTLINE = "OUTLINE", THICKOUTLINE = "THICKOUTLINE"}
local function bcf(addon, text, r, g, b, font, size, outline, sticky, _, icon)
if icon then text = "|T"..icon..":20:20:-5|t"..text end
local loc = sink.storageForAddon[addon] and sink.storageForAddon[addon].sink20ScrollArea or "Sticky"
local s = getSticky(addon) or sticky
BlinkCombatFeedback:DisplayCustomEvent({display = {msg = text, color = ("%02x%02x%02x"):format(r * 255, g * 255, b * 255), scrollArea = loc, scrollType = s and "Sticky" or "up", size = size, outling = bcf_outlines[outline], align = "center", font = font}})
end
local function blizzard(addon, text, r, g, b, font, size, outline, sticky, _, icon)
if icon then text = "|T"..icon..":20:20:-5|t"..text end
if tostring(SHOW_COMBAT_TEXT) ~= "0" then
local s = getSticky(addon) or sticky
CombatText_AddMessage(text, CombatText_StandardScroll, r, g, b, s and "crit" or nil, false)
else
UIErrorsFrame:AddMessage(text, r, g, b, 1.0)
end
end
sink.channelMapping = sink.channelMapping or {
[SAY] = "SAY",
[PARTY] = "PARTY",
[BATTLEGROUND] = "BATTLEGROUND",
[GUILD_CHAT] = "GUILD",
[OFFICER_CHAT] = "OFFICER",
[YELL] = "YELL",
[RAID] = "RAID",
[RAID_WARNING] = "RAID_WARNING",
[GROUP] = "GROUP",
}
sink.frame = sink.frame or CreateFrame("Frame")
sink.frame:RegisterEvent("CHANNEL_UI_UPDATE")
sink.frame:RegisterEvent("PLAYER_ENTERING_WORLD")
do
local newChannels = {}
local function loop(...)
wipe(newChannels)
for i = 1, select("#", ...), 2 do
local id, name = select(i, ...)
newChannels[name] = true
end
for k, v in pairs(sink.channelMapping) do
if v == "CHANNEL" and not newChannels[k] then
sink.channelMapping[k] = nil
end
end
for k in pairs(newChannels) do sink.channelMapping[k] = "CHANNEL" end
end
local function rescanChannels() loop(GetChannelList()) end
sink.frame:SetScript("OnEvent", rescanChannels)
rescanChannels()
end
local function channel(addon, text)
-- Sanitize the text, remove all color codes.
text = text:gsub("(|c%x%x%x%x%x%x%x%x)", ""):gsub("(|r)", "")
local loc = sink.storageForAddon[addon] and sink.storageForAddon[addon].sink20ScrollArea or "SAY"
local chan = sink.channelMapping[loc]
if chan == "GROUP" then
chan = select(2, IsInInstance()) == "pvp" and "BATTLEGROUND" or (UnitInRaid("player") and "RAID" or "PARTY")
if chan == "PARTY" and GetNumPartyMembers() == 0 then chan = "SAY" end
elseif chan == "CHANNEL" then
local id, name = GetChannelName(loc)
if name then
SendChatMessage(text, "CHANNEL", nil, id)
else
print(text .. L_NOTINCHANNEL)
end
return
end
SendChatMessage(text, chan or "SAY")
end
local function chat(addon, text, r, g, b, _, _, _, _, _, icon)
if icon then text = "|T"..icon..":15|t"..text end
DEFAULT_CHAT_FRAME:AddMessage(text, r, g, b)
end
local function uierror(addon, text, r, g, b, _, _, _, _, _, icon)
if icon then text = "|T"..icon..":20:20:-5|t"..text end
UIErrorsFrame:AddMessage(text, r, g, b, 1.0)
end
local rw
do
local white = {r = 1, g = 1, b = 1}
function rw(addon, text, r, g, b, _, _, _, _, _, icon)
if r or g or b then
local c = "|cff" .. string.format("%02x%02x%02x", (r or 0) * 255, (g or 0) * 255, (b or 0) * 255)
text = c .. text .. "|r"
end
if icon then text = "|T"..icon..":20:20:-5|t"..text end
RaidNotice_AddMessage(RaidWarningFrame, text, white)
end
end
local function noop() --[[ noop! ]] end
local handlerPriority = { "Parrot", "SCT", "MikSBT", "BCF" }
-- Thanks to ckk for these
local customHandlersEnabled = {
Parrot = function()
if not _G.Parrot then return end
return _G.Parrot.IsEnabled and _G.Parrot:IsEnabled() or _G.Parrot:IsActive()
end,
SCT = function()
return _G.SCT and _G.SCT:IsEnabled()
end,
BCF = function()
return bcfDB and bcfDB["enable"]
end,
}
-- Default to version 5 or higher now
local msbtVersion = tonumber(string.match(GetAddOnMetadata("MikScrollingBattleText", "Version") or "","^%d+\.%d+")) or 5
local isMSBTFive = math.floor(msbtVersion) > 4 and true or nil
if isMSBTFive then
customHandlersEnabled.MikSBT = function()
return _G.MikSBT and not _G.MikSBT.IsModDisabled()
end
else
customHandlersEnabled.MikSBT = function()
return _G.MikSBT and _G.MSBTProfiles and _G.MSBTProfiles.GetSavedVariables() and not MSBTProfiles.GetSavedVariables().UserDisabled
end
end
local currentHandler = nil
local function getPrioritizedSink()
if currentHandler then
local check = customHandlersEnabled[currentHandler]
if check and check() then
return sink.handlers[currentHandler]
end
end
for i, v in next, handlerPriority do
local check = customHandlersEnabled[v]
if check and check() then
currentHandler = v
return sink.handlers[v]
end
end
if SHOW_COMBAT_TEXT and tostring(SHOW_COMBAT_TEXT) ~= "0" then
return blizzard
end
return chat
end
local function pour(addon, text, r, g, b, ...)
local func = sink.override and sink.handlers[sink.override] or nil
if not func and sink.storageForAddon[addon] and sink.storageForAddon[addon].sink20OutputSink then
local h = sink.storageForAddon[addon].sink20OutputSink
func = sink.handlers[h]
-- If this sink is not available now, find one manually.
if customHandlersEnabled[h] and not customHandlersEnabled[h]() then
func = nil
end
end
if not func then
func = getPrioritizedSink()
end
if not func then func = chat end
func(addon, text, r or 1, g or 1, b or 1, ...)
end
function sink:Pour(textOrAddon, ...)
local t = type(textOrAddon)
if t == "string" then
pour(self, textOrAddon, ...)
elseif t == "number" then
pour(self, tostring(textOrAddon), ...)
elseif t == "table" then
pour(textOrAddon, ...)
else
error("Invalid argument 2 to :Pour, must be either a string or a table.")
end
end
local sinks
do
-- Maybe we want to hide them instead of disable
local function shouldDisableSCT()
return not _G.SCT
end
local function shouldDisableMSBT()
return not _G.MikSBT
end
local function shouldDisableBCF()
return not ( bcfDB and bcfDB["enable"] )
end
local function shouldDisableParrot()
return not _G.Parrot
end
local function shouldDisableFCT()
return not SHOW_COMBAT_TEXT or tostring(SHOW_COMBAT_TEXT) == "0"
end
local sctFrames = {"Incoming", "Outgoing", "Messages"}
local msbtFrames = nil
local tmp = {}
local function getScrollAreasForAddon(addon)
if type(addon) ~= "string" then return nil end
if addon == "Parrot" then
if Parrot.GetScrollAreasChoices then
return Parrot:GetScrollAreasChoices()
else
return Parrot:GetScrollAreasValidate()
end
elseif addon == "MikSBT" then
if isMSBTFive then
if not msbtFrames then
msbtFrames = {}
for key, name in MikSBT.IterateScrollAreas() do
table.insert(msbtFrames, name)
end
end
return msbtFrames
else
return MikSBT.GetScrollAreaList()
end
elseif addon == "BCF" then
if bcfDB then
local bcfAreas = {}
for i = 1, #bcfDB["scrollAreas"] do
bcfAreas[#bcfAreas + 1] = bcfDB["scrollAreas"][i]["name"]
end
return bcfAreas
end
elseif addon == "SCT" then
return sctFrames
elseif addon == "Channel" then
wipe(tmp)
for k in pairs(sink.channelMapping) do
tmp[#tmp + 1] = k
end
return tmp
elseif sink.registeredScrollAreaFunctions[addon] then
return sink.registeredScrollAreaFunctions[addon]()
end
return nil
end
local emptyTable, args, options = {}, {}, {}
sinks = {
Default = {L_DEFAULT, L_DEFAULT_DESC},
SCT = {L_SCT, nil, shouldDisableSCT},
MikSBT = {L_MSBT, nil, shouldDisableMSBT},
BCF = {L_BCF, nil, shouldDisableBCF},
Parrot = {L_PARROT, nil, shouldDisableParrot},
Blizzard = {L_BLIZZARD, nil, shouldDisableFCT},
RaidWarning = {L_RW},
ChatFrame = {L_CHAT},
Channel = {L_CHANNEL},
UIErrorsFrame = {L_UIERROR},
None = {L_NONE, L_NONE_DESC}
}
local function getAce2SinkOptions(key, opts)
local name, desc, hidden = unpack(opts)
args["Ace2"][key] = {
type = "toggle",
name = name,
desc = desc or L_ROUTE:format(name),
isRadio = true,
hidden = hidden
}
end
function sink.GetSinkAce2OptionsDataTable(addon)
options["Ace2"][addon] = options["Ace2"][addon] or {
output = {
type = "group",
name = L_OUTPUT,
desc = L_OUTPUT_DESC,
pass = true,
get = function(key)
if not sink.storageForAddon[addon] then
return "Default"
end
if tostring(key) == "nil" then
-- Means AceConsole wants to list the output option,
-- so we should show which sink is currently used.
return sink.storageForAddon[addon].sink20OutputSink or L_DEFAULT
end
if key == "ScrollArea" then
return sink.storageForAddon[addon].sink20ScrollArea
elseif key == "Sticky" then
return sink.storageForAddon[addon].sink20Sticky
else
if sink.storageForAddon[addon].sink20OutputSink == key then
local sa = getScrollAreasForAddon(key)
options["Ace2"][addon].output.args.ScrollArea.validate = sa or emptyTable
options["Ace2"][addon].output.args.ScrollArea.disabled = not sa
options["Ace2"][addon].output.args.Sticky.disabled = not sink.stickyAddons[key]
end
return sink.storageForAddon[addon].sink20OutputSink and sink.storageForAddon[addon].sink20OutputSink == key or nil
end
end,
set = function(key, value)
if not sink.storageForAddon[addon] then return end
if key == "ScrollArea" then
sink.storageForAddon[addon].sink20ScrollArea = value
elseif key == "Sticky" then
sink.storageForAddon[addon].sink20Sticky = value
elseif value then
local sa = getScrollAreasForAddon(key)
options["Ace2"][addon].output.args.ScrollArea.validate = sa or emptyTable
options["Ace2"][addon].output.args.ScrollArea.disabled = not sa
options["Ace2"][addon].output.args.Sticky.disabled = not sink.stickyAddons[key]
sink.storageForAddon[addon].sink20OutputSink = key
end
end,
args = args["Ace2"],
disabled = function()
return (type(addon.IsActive) == "function" and not addon:IsActive()) or nil
end
}
}
return options["Ace2"][addon]
end
-- Ace3 options data table format
local function getAce3SinkOptions(key, opts)
local name, desc, hidden = unpack(opts)
args["Ace3"][key] = {
type = "toggle",
name = name,
desc = desc or L_ROUTE:format(name),
hidden = hidden
}
end
function sink.GetSinkAce3OptionsDataTable(addon)
if not options["Ace3"][addon] then
options["Ace3"][addon] = {
type = "group",
name = L_OUTPUT,
desc = L_OUTPUT_DESC,
args = args["Ace3"],
get = function(info)
local key = info[#info]
if not sink.storageForAddon[addon] then
return "Default"
end
if tostring(key) == "nil" then
-- Means AceConsole wants to list the output option,
-- so we should show which sink is currently used.
return sink.storageForAddon[addon].sink20OutputSink or L_DEFAULT
end
if key == "ScrollArea" then
return sink.storageForAddon[addon].sink20ScrollArea
elseif key == "Sticky" then
return sink.storageForAddon[addon].sink20Sticky
else
if sink.storageForAddon[addon].sink20OutputSink == key then
local sa = getScrollAreasForAddon(key)
if sa then
for k,v in ipairs(sa) do
sa[k] = nil
sa[v] = v
end
end
options["Ace3"][addon].args.ScrollArea.values = sa or emptyTable
options["Ace3"][addon].args.ScrollArea.disabled = not sa
options["Ace3"][addon].args.Sticky.disabled = not sink.stickyAddons[key]
end
return sink.storageForAddon[addon].sink20OutputSink and sink.storageForAddon[addon].sink20OutputSink == key or nil
end
end,
set = function(info, v)
local key = info[#info]
if not sink.storageForAddon[addon] then return end
if key == "ScrollArea" then
sink.storageForAddon[addon].sink20ScrollArea = v
elseif key == "Sticky" then
sink.storageForAddon[addon].sink20Sticky = v
elseif v then
local sa = getScrollAreasForAddon(key)
if sa then
for k,v in ipairs(sa) do
sa[k] = nil
sa[v] = v
end
end
options["Ace3"][addon].args.ScrollArea.values = sa or emptyTable
options["Ace3"][addon].args.ScrollArea.disabled = not sa
options["Ace3"][addon].args.Sticky.disabled = not sink.stickyAddons[key]
sink.storageForAddon[addon].sink20OutputSink = key
end
end,
disabled = function()
return (type(addon.IsEnabled) == "function" and not addon:IsEnabled()) or nil
end,
}
end
return options["Ace3"][addon]
end
local sinkOptionGenerators = {
["Ace2"] = getAce2SinkOptions,
["Ace3"] = getAce3SinkOptions
}
for generatorName, generator in pairs(sinkOptionGenerators) do
options[generatorName] = options[generatorName] or {}
args[generatorName] = args[generatorName] or {}
for name, opts in pairs(sinks) do
generator(name, opts)
end
end
args["Ace2"].ScrollArea = {
type = "text",
name = L_SCROLL,
desc = L_SCROLL_DESC,
validate = emptyTable,
order = -1,
disabled = true
}
args["Ace2"].Sticky = {
type = "toggle",
name = L_STICKY,
desc = L_STICKY_DESC,
validate = emptyTable,
order = -2,
disabled = true
}
args["Ace3"].ScrollArea = {
type = "select",
name = L_SCROLL,
desc = L_SCROLL_DESC,
values = emptyTable,
order = -1,
disabled = true
}
args["Ace3"].Sticky = {
type = "toggle",
name = L_STICKY,
desc = L_STICKY_DESC,
order = -2,
disabled = true
}
function sink:RegisterSink(shortName, name, desc, func, scrollAreaFunc, hasSticky)
assert(type(shortName) == "string")
assert(type(name) == "string")
assert(type(desc) == "string" or desc == nil)
assert(type(func) == "function" or type(func) == "string")
assert(type(scrollAreas) == "function" or scrollAreas == nil)
assert(type(hasSticky) == "boolean" or hasSticky == nil)
if sinks[shortName] or sink.handlers[shortName] then
error("There's already a sink by the short name %q.", shortName)
end
sinks[shortName] = {name, desc}
-- Save it for library upgrades.
if not sink.registeredSinks then sink.registeredSinks = {} end
sink.registeredSinks[shortName] = sinks[shortName]
if type(func) == "function" then
sink.handlers[shortName] = func
else
sink.handlers[shortName] = function(...)
self[func](self, ...)
end
end
if type(scrollAreaFunc) == "function" then
sink.registeredScrollAreaFunctions[shortName] = scrollAreaFunc
elseif type(scrollAreaFunc) == "string" then
sink.registeredScrollAreaFunctions[shortName] = function(...)
return self[scrollAreaFunc](self, ...)
end
end
sink.stickyAddons[shortName] = hasSticky and true or nil
for k, v in pairs(sinkOptionGenerators) do
v(shortName, sinks[shortName])
end
end
end
function sink.SetSinkStorage(addon, storage)
assert(type(addon) == "table")
assert(type(storage) == "table", "Storage must be a table")
sink.storageForAddon[addon] = storage
end
-- Sets a sink override for -all- addons, librarywide.
function sink:SetSinkOverride(override)
assert(type(override) == "string" or override == nil)
if override and not sink.handlers[override] then
error("There's no %q sink.", override)
end
sink.override = override
end
-- Put this at the bottom, because we need the local functions to exist first.
local handlers = {
Parrot = parrot,
SCT = sct,
MikSBT = msbt,
BCF = bcf,
ChatFrame = chat,
Channel = channel,
UIErrorsFrame = uierror,
Blizzard = blizzard,
RaidWarning = rw,
None = noop,
}
-- Overwrite any handler functions from the old library
for k, v in pairs(handlers) do
sink.handlers[k] = v
end
-----------------------------------------------------------------------
-- Embed handling
sink.embeds = sink.embeds or {}
local mixins = {
"Pour", "RegisterSink", "SetSinkStorage",
"GetSinkAce2OptionsDataTable", "GetSinkAce3OptionsDataTable"
}
function sink:Embed(target)
sink.embeds[target] = true
for _,v in pairs(mixins) do
target[v] = sink[v]
end
return target
end
for addon in pairs(sink.embeds) do
sink:Embed(addon)
end
+7
View File
@@ -0,0 +1,7 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
C:\Projects\WoW\Bin\Interface\FrameXML\UI.xsd">
<script file="LibSink-2.0.lua"/>
</Ui>
+268
View File
@@ -0,0 +1,268 @@
-- THIS CONTENTS OF THIS FILE IS AUTO-GENERATED BY THE WOWACE PACKAGER
-- Please use the Localization App on WoWAce to update this
-- at http://www.wowace.com/projects/chatter/localization/
local AceLocale = LibStub:GetLibrary("AceLocale-3.0")
local L = AceLocale:NewLocale("Chatter", "deDE")
if not L then return end
L["Add space after channels"] = "Fügt Leerstelle hinter Channel-Namen hinzu."
L["Adds timestamps to chat."] = "Fügt dem Chat Zeitstempel hinzu."
L["Add surrounding brackets to own charname in messages."] = "Fügt umschließende Klammern dem eigenen Namen in Nachrichten hinzu."
L["Add Word"] = "Wort hinzufügen"
L["Add word to your highlight list"] = "Fügt Wörter zur Highlight-Liste hinzu."
L["Add word to your invite trigger list"] = "Triggerbegriff zur Gruppeneinladung hinzufügen"
L["Alerts you when someone says a keyword or speaks in a specified channel."] = "Benachrichtigt wenn jemand ein Schlüsselwort sagt oder in einem besimmten Kanal spricht."
-- L["All Edge resizing"] = "All Edge resizing"
L["Allows you to make the chat frames much smaller than usual."] = "Erlaubt Dir die Chatfenster wesentlich kleiner zu machen als bisher möglich."
L["Allows you to type messages longer than normal, and splits message that are too long."] = "Erlaubt Dir das Schreiben längerer Nachrichten und splittet Nachrichten, welche zu lang sind."
-- L["Allows you to use the edge for resizing, instead of just the lower right corner."] = "Allows you to use the edge for resizing, instead of just the lower right corner."
L["alt2"] = "BekanntAls2"
L["alt3"] = "BekanntAls3"
L["Alt-click name to invite"] = "Alt+Klick auf Namen zum Einladen"
L["Alt Linking"] = "Twink Verlinkung"
L["Alt note fallback"] = "Notiz verwerfen."
L["Are you sure you want to delete all your saved class/level data?"] = "Bist du sicher, dass du ALLE deine gespeicherten Klassen/Level Daten löschen willst?"
L["Attach edit box to..."] = "Andocken des Eingabefelds an..."
L["Attach to..."] = "Andocken an..."
L["Automatically turns on chat logging."] = "Automatische Chat Aufzeichnung aktivieren."
L["Automatic Whisper Windows"] = "Automatische Flüsterfenster"
L["Background color"] = "Hintergrundfarbe"
L["Background Inset"] = "Hintergrund Teile"
L["Background texture"] = "Hintergrundtextur"
L["Battleground"] = "Schlachtfeld"
L["Battleground Leader"] = "Schlachtfeldleiter"
L["Border color"] = "Rahmen Farbe"
L["Borders/Background"] = "Rahmen/Hintergrund"
L["Border texture"] = "Rahmen Textur"
L["Bottom"] = "Unten"
L["Button Height"] = "Tastenhöhe"
L["Button's height, and text offset from the frame"] = "Tastenhöhe und Text Abstand vom Fenster."
L["Center"] = "Zentrieren"
L["Channel Colors"] = "Kanal Farben"
L["Channel Names"] = "Kanal Namen"
L["Character to use between the name and level"] = "Buchstabe, der zwischen Namen und Level verwendet werden soll"
L["Character to use for the left bracket"] = "Schriftzeichen für die linke Klammer"
L["Character to use for the right bracket"] = "Schriftzeichen für die rechte Klammer"
L["Chat Autolog"] = "Chat Aufzeichnung"
L["Chat Font"] = "Chat Schriftart"
L["Chat Frame "] = "Chatfenster"
L["Chat Link"] = "Chat Links"
L["Chat Tabs"] = "Chat Karteikarten"
L["Chatter"] = "Chatter"
L["Chatter Settings"] = "Chatter Einstellungen"
L["Choose which chat frames display timestamps"] = "Wähle welche Chatfenster Zeitstempel anzeigen sollen."
L["Class"] = "Klasse"
L["Color border by channel"] = "Färbe Rahmen nach Kanal"
L["Color level by difficulty"] = "Färbe Level nach Schwierigkeit"
L["Color own charname in messages."] = "Färbt deinen eigenen Namen in Nachrichten ein."
L["Color Player Names By..."] = "Färbe Spieler Namen nach..."
L["Color self in messages"] = "Färbe dich in Nachrichten"
L["Color timestamps the same as the channel they appear in."] = "Färbe den Zeitsempel in der gleichen Farbe wie der Kanal eingestellt ist."
L["Combat Log Fix"] = "Kampflog Fix"
L["Configure"] = "Justiere"
L["Copy Chat"] = "Chat Kopieren Taste"
L["Copy text from this frame."] = "Kopiere Text von diesem Fenster"
L["Custom channels"] = "Benutzerdefinierte Kanäle"
L["Custom Channels"] = "Eigene Kanäle"
L["Custom Channel Sounds"] = "Selbstdefinierte Kanal Sounds"
L["Custom color"] = "Selbstdefinierte Farbe"
L["Custom format (advanced)"] = "Eigene Formatierung (erweitert)"
L["Death Knight"] = "Todesritter"
L["Destroys all your saved class/level data"] = "Zerstört alle deine gespeicherten Klassen/Level Daten."
L["Disable Buttons"] = "Tasten Ausblenden"
L["Disabled"] = "Deaktiviert"
L["Disable Fading"] = "Ausblenden Deaktivieren"
L["Disable server side storage of chat frame position and size."] = "Deaktiviere die serverseitige Speicherung der Position und Größe des Chatfensters."
L["Druid"] = "Druide"
L["Dungeon Guide"] = "Dungeonführer"
L["Edge Size"] = "Kanten Größe"
L["Edit Box History"] = "Eingabefeld Verlauf"
L["Edit Box Polish"] = "Eingabefeld"
L["Emote"] = "Emote"
L["Emphasize self in messages"] = "Betone eigenen Namen in Nachrichten"
L["$$EMPTY$$"] = "§§LEER§§"
L["Enable"] = "Aktiviere"
L["Enable "] = "Aktiviere "
L["Enable borders on this frame"] = "Aktiviere Rahmen in diesem Fenster."
L["Enabled"] = "Aktiviert"
L["Enable Scrollback length modification"] = "Aktiviere die Zurückscrollen Modifikation"
-- L["Enables the Tab to flash when you miss a message"] = "Enables the Tab to flash when you miss a message"
L["Enables the /tt command to send a tell to your target."] = "Aktiviert das /tt Kommando um dem Ziel das du gegenwärtig angeklickt hast eine Nachricht zu senden."
L["Enables you to replace channel names with your own names. You can use '%s' to force an empty string."] = "Erlaubt es Dir Channel-Namen zu ändern. Benutze '%s' um einen leeren String zu erzeugen."
L["Enables you to right-click a person's name in chat and set a note on them to be displayed in chat, such as their main character's name. Can also scan guild notes for character names to display, if no note has been manually set."] = "Ermöglicht Dir das Rechtsklicken des Namens einer Person im Chat und fügt eine im Chat angezeigte Notiz hinzu, welche jetzt mitsamt des Charakternamens angezeigt wird. Kann auch nach Gilden-Notizen für Charakternamen scannen um diese anzuzeigen, sofern eine Notiz hinzugefügt wurde."
L["Enables you to set a custom font and font size for your chat frames"] = "Ermöglicht dir beliebige Schriftarten und Schriftgrößen zu verwenden bei deinen Chatfenstern."
-- L["Enable Tab Flashing"] = "Enable Tab Flashing"
L["Enable text justification"] = "Aktiviere die Text Justierung."
L["Enter a custom time format. See http://www.lua.org/pil/22.1.html for a list of valid formatting symbols."] = "Gib eine eigene Zeitstempel Formatierung ein. Besuch http://www.lua.org/pil/22.1.html für eine Liste der gültigen Formatierungssymbole."
L["Exclude level display for max level characters"] = "Zeige das Level bei Stufe 80 Spielern nicht an."
L["Exclude max levels"] = "Max Level Aus"
L["Font"] = "Schriftart"
L["Font Outline"] = "Schrift Umriss"
L["Font outlining"] = "Schrift Umrandung"
L["Font size"] = "Schriftgröße"
L["Free-floating"] = "Frei-schwebend"
L["Free-floating, Locked"] = "Frei-schwebend, Gesperrt"
L["Friends"] = "Freunde"
L["Gives you finer control over the chat frame's background and border colors"] = "Gibt dir eine feinere Einstellungsmöglichkeit über die Chatfenster Hintergründe und Rahmen Farben."
L["Gives you more flexibility in how you invite people to your group."] = "Gibt dir mehr Möglichkeiten wie du Leute in deine(n) Gruppe/Raid einladen kannst."
L["Group"] = "Gruppe"
L["Group Say (/gr)"] = "Gruppe Sagen (/gr)"
L["Guild"] = "Gilde"
L["(|HBNplayer.-|h) whispers:"] = "(|HBNplayer.-|h) flüstert:"
L["HH:MM (12-hour)"] = "HH:MM (12-Stunden)"
L["HH:MM (24-hour)"] = "HH:MM (24-Stunden)"
L["HH:MM:SS (24-hour)"] = "HH:MM:SS (24-Stunden)"
L["HH:MM:SS AM (12-hour)"] = "HH:MM:SS AM (12-Stunden)"
L["Hides chat frame tabs"] = "Versteckt die Karteikarten der Chatfenster."
L["Hides the buttons attached to the chat frame"] = "Versteckt die Tasten die Stadardmäßig zum Chatfenster gehören."
L["Hide Tabs"] = "Verstecke Karteikarten"
L["Highlights"] = "Benachrichtigungen"
L["How many lines to scroll per mouse wheel click"] = "Wieviele Linien soll der Chat bei einem Rastersprung des Mausrades scrollen?"
L["(|Hplayer.-|h) whispers:"] = " (|Hplayer.-|h) flüstert:"
L["Hunter"] = "Jäger"
L["^(.-|h) whispers:"] = "^(.-|h) flüstert:"
L["If no name can be found for an 'alt' rank character, use entire note"] = "Falls kein Name für bekannten Charakter gefunden werden kann, benutze gesamte Notiz."
L["Include level"] = "Level hinzufügen"
L["Include the player's level"] = "Füge dem Namen, den Level des Spielers hinzu."
L["inv"] = "lad"
L["invite"] = "einladen"
L["Invite Links"] = "Einladen Links"
L["Keeps your channel colors by name rather than by number."] = "Sortiert deine Kanal Farben nach Name anstatt nach Nummer."
L["Left"] = "Linksbündig"
L["Left Bracket"] = "Linke Klammer"
L["Lets you alt-click player names to invite them to your party."] = "Lässt dich durch Alt+Klick auf Spielernamen diese automatisch ein Gruppe/Raid einladen."
L["Lets you copy text out of your chat frames."] = "Läst dich aus deinen Chatfenstern Text kopieren."
L["Lets you copy URLs out of chat."] = "Läst dich URL's aus dem Chat kopieren."
L["Lets you customize the position and look of the edit box"] = "Läst dich die Position und das Aussehn des Eingabefelds, deinen eigenen Wünschen nach anpassen."
L["Lets you link items, enchants, spells, talents, achievements and quests in custom channels."] = "Ermöglicht es Gegenstände, Verzauberungen, Zauber, Talente, Erfolge und Quests in benutzerdefinierten Kanälen zu verlinken."
L["Lets you set the justification of text in your chat frames."] = "Läst dich die Bündigkeit der Texte in den Chatfenstern Justieren."
L["Lets you set the scrollback length of your chat frames."] = "Läst dich justieren wieviele Zeilen du in den Chatfenstern zurückscrollen kannst."
L["Lets you use the mousewheel to page up and down chat."] = "Läst dich mit dem Mausrad im Chat rauf und runter scrollen."
L["Level Options"] = "Level Optionen"
L["Link Hover"] = "Links bei Mausüber"
L["LookingForGroup"] = "SucheNachGruppe"
L["Look in guildnotes for character names, unless a note is set manually"] = "Suche in Gilden-Notizen nach Charakternamen, sofern eine Notiz hinzugefügt wurde."
L["Mage"] = "Magier"
L["Makes channels you select sticky."] = "Macht Kanäle die du auswählst stehend. Dadurch wird der Text erst später ausgeblendet." -- Needs review
L["Makes link tooltips show when you hover them in chat."] = "Lässt Tooltips von Links automatisch erscheinen wenn du mit der Maus über Links im Chat schwebst."
L["Makes old text disappear rather than fade out"] = "Läst alten Text verschwinden anstatt ihn auszublenden."
L["Make %s sticky"] = "Macht %s stehend" -- Needs review
L["Message Split"] = "Nachricht aufgeteilt."
L["MM:SS"] = "MM:SS"
L["Module"] = "Module"
L["Modules"] = "Module"
L["Mousewheel Scroll"] = "Mausrad Scrollen"
-- L["Move the Toast X offset to ChatFrame1"] = "Move the Toast X offset to ChatFrame1"
-- L["Move the Toast Y offset, relative to ChatFrame1"] = "Move the Toast Y offset, relative to ChatFrame1"
L["Name"] = "Name"
L["Name color"] = "Namensfarbe"
L["None"] = "Nichts"
L["Officer"] = "Offizier"
L["Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."] = "Öffnet ein eigenes Options Menü. Vielleicht solltest du in Erwägung ziehen |cffffff00BetterBlizzOptions|r zu installieren damit das Blizzard Optionsmenü in der Größe dynamisch anpassbar wird."
L["Options"] = "Optionen"
L["Other Channels"] = "Andere Kanäle"
L["Paladin"] = "Paladin"
L["Party"] = "Gruppe"
L["Per chat frame settings"] = "Einstellungen nach Chatfenster"
L["Play a soundfile when one of your keywords is said."] = "Spiele einen Sound ab wenn eienr deiner Schlüsselwörter gesagt wurde."
L["Play a sound when a message is received in this channel"] = "Spiel einen Sound ab wenn eine Nachricht in diesem Kanal eingeht"
L["Player Names"] = "Spieler Namen"
L["Priest"] = "Priester"
L["Profiles"] = "Profile"
L["Provides a /gr slash command to let you speak in your group (raid, party, or battleground) automatically."] = "Fügt das /gr Slash Kommando hinzu damit du immer (Raid, Gruppe, Schlachtfeld) im Gruppenchat schreiben kannst."
L["Provides options to color player names, add player levels, and add tab completion of player names."] = "Fügt die Möglichkeiten hinzu Spieler Namen einzufärben, Spieler Level anzuzeigen und per Tab Taste die Namen vervollständigen zu lassen."
L["Raid"] = "Schlachtzug"
L["Raid Leader"] = "Schlachtzugsleiter"
L["Raid Warning"] = "Schlachtzugswarnung"
-- L["RealID Conversation"] = "RealID Conversation"
-- L["RealID Polish"] = "RealID Polish"
-- L["RealID Whisper"] = "RealID Whisper"
L["Remembers the history of the editbox across sessions."] = "Merkt sich die Texte des Eingabefeldes zwischen den Sitzungen."
L["Remove a word from your highlight list"] = "Entferne ein Wort aus deiner Höhepunkte Liste"
L["Remove a word from your invite trigger list"] = "Entferne ein Wort zu deiner Einladen Ativierungsliste."
L["Remove this word from your highlights?"] = "Entferne dieses Wort aus deiner Höhepunkte Liste"
L["Remove this word from your trigger list?"] = "Entferne dieses Wort zu deiner Einladen Ativierungsliste."
L["Remove Word"] = "Wort Entfernen"
L["Replace this channel name with..."] = "Ersetze diesen Kanal Namen mit..."
L["Requires the Alt key to be held down to move the cursor in chat"] = "Setzt das halten der Alt Taste vorraus um im Eingabefeld den Courser bewegen zu können."
L["Reroute whole message to SCT"] = "Leite die gesamte Nachricht an SCT"
L["Reroute whole message to SCT instead of just displaying 'who said keyword in channel'"] = "Leite die gesammte Nachricht an SCT weiter anstatt nur zu informieren wer ein Schlüsselwort geschrieben hat."
L["Reset Data"] = "Resette Daten"
L["Resize this border to fit the new combat log"] = "Größe dieses Rahmens anpassen um mit den neuen Kampflog kompatibel zu bleiben."
L["Right"] = "Rechtsbündig"
L["Right Bracket"] = "Rechte Klammer"
L["Rogue"] = "Schurke"
L["Save all /who data"] = "Speichere die gesamten /who-Daten."
L["Save class data from friends between sessions."] = "Speichere Klassen-Daten von Freunden zwischen den Sessions."
L["Save class data from groups between sessions."] = "Speichere Klassen Daten von Gruppen zwischen den Sitzungen."
L["Save class data from guild between sessions."] = "Speichere Klassen Daten aus Gilde zwischen den Sitzungen."
L["Save class data from target/mouseover between sessions."] = "Speichere Klassen Daten vom Ziel/Mausüber zwischen den Sitzungen."
L["Save class data from /who queries between sessions."] = "Speichere Klassen Daten vom /wer Anfragen zwischen den Sitzungen."
L["Save Data"] = "Speichere Daten"
L["Save data between sessions. Will increase memory usage"] = "Speicher Daten zwischen den Sitzungen. Dies wird den Speicherverbrauch erhöhen."
L["Say"] = "Sagen"
L["Scrollback"] = "Zurückscrollen"
L["Scroll lines"] = "Scroll Linien"
L["Select a color for this channel"] = "Wähle eine Farbe für diesen Kanal"
L["Select a method for coloring player names"] = "Wähle eine Methode wie Spielernamen eingefärbt werden."
L["Select the custom color to use for alt names"] = "Wähle eine Farbe die nur bei Twink Namen benutzt wird."
L["Select the font to use for the edit box"] = "Wähle die Schriftart die beim Eingabefeld benutzt wird"
L["Separator"] = "Zerteiler"
L["Server Positioning"] = "Server Positionierung"
L["Set Main"] = "Setze Hauptcharakter"
L["Sets the frame's border color to the color of your currently active channel"] = "Passt die Rahmenfarbe der Farbe an die für das entsprechnde Chatfenster eingestellt ist."
L["Set the coloring mode for alt names"] = "Justiere die Einfärbe Methode für Twink Namen."
L["Settings"] = "Einstellungen"
L["Shaman"] = "Schamane"
L["Show bottom button when scrolled up"] = "Eine 'Nach unten' Taste wird automatisch eingeblendet wenn im Chat nach oben gescrollt wird."
L["Show bottom when scrolled"] = "Zeige 'unten' wenn gescrollt wird"
L["Show copy icon"] = "Kopieren-Symbol anzeigen"
L["Show highlights in your SCT mod"] = "Zeige die Höhepunkte in deinem Scrollendem Kampftext Mod."
L["Show SCT message"] = "Zeige SCT Nachrichten"
-- L["Show Toast Icons"] = "Show Toast Icons"
-- L["Show toast icons in the chat frames"] = "Show toast icons in the chat frames"
L["Sound File"] = "Sound Datei"
L["Sound file to play"] = "Sound Datei zum Abspielen."
L["%s said '%s' in %s"] = "%s sagte '%s' in %s"
L["[%s] %s: %s"] = "[%s] %s: %s"
L["Standalone Config"] = "Eigenes Menü"
L["Sticky Channels"] = "Stehende Kanäle" -- Needs review
L["Target/Mouseover"] = "Ziel/Mausüber"
L["Tell Target (/tt)"] = "Ziel Flüstern (/tt)"
L["Test"] = "Test"
L["Text Justification"] = "Text Justierung"
L["Tile Size"] = "Ziegel Größe"
L["Timestamp color"] = "Zeitstempel Farbe"
L["Timestamp format"] = "Zeitstempel Formatierung"
L["Timestamps"] = "Zeitstempel"
L["Tiny Chat"] = "Kleiner Chat"
L["^To "] = "^Zu "
-- L["Toast X offset"] = "Toast X offset"
-- L["Toast Y offset"] = "Toast Y offset"
-- L["To <Away>(|HBNplayer.-|h):"] = "To <Away>(|HBNplayer.-|h):"
-- L["To <Busy>(|HBNplayer.-|h):"] = "To <Busy>(|HBNplayer.-|h):"
-- L["Toggle the copy icon on the chat frame."] = "Toggle the copy icon on the chat frame."
L["^To (.-|h):"] = "an (.-|h):"
L["To (|HBNplayer.-|h):"] = "Zu (|HBNplayer.-|h):"
L["To (|Hplayer.-|h):"] = "Zu (|Hplayer.-|h):"
L["Top"] = "Oben"
L["Trade -"] = "Handel -"
L["URL Copy"] = "URL Kopieren"
L["Use Alt key for cursor movement"] = "Benutze Alt Taste für Courser Bewegung"
L["Use channel color"] = "Benutze Kanal Farbe"
L["Use custom color"] = "Benutze selbstdefinierte Farbe"
L["Use guildnotes"] = "Verwende Gilden-Notizen."
L["Use PlayerNames coloring"] = "Benutze Spielernamen Farben"
L["Use sound"] = "Benutze Sound"
L["Use Tab Complete"] = "Benutze Tab Vervollständigen"
L["Use tab key to automatically complete character names."] = "Benutze die Tab Taste um Namen automatisch zu vervollständigen."
L["Warlock"] = "Hexenmeister"
L["Warrior"] = "Krieger"
L["Welcome to Chatter! Type /chatter to configure."] = "Willkommen zu Chatter! Tipp /chatter um die Optionen zu Justieren."
L["Whisper"] = "Flüstern"
L["Who"] = "Wer"
L["Who is %s's main?"] = "Wer ist %s's Hauptcharakter?"
L["Will save all data for large /who queries"] = "Wird die gesamten Daten für große /who-Anfragen speichern."
L["Yell"] = "Schreien"
+341
View File
@@ -0,0 +1,341 @@
-- This file is script-generated and should not be manually edited.
-- Localizers may copy this file to edit as necessary.
local AceLocale = LibStub:GetLibrary("AceLocale-3.0")
local L = AceLocale:NewLocale("Chatter", "enUS", true)
if not L then return end
-- ./Chatter.lua
L["Chatter"] = true
L["Standalone Config"] = true
L["Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."] = true
L["Configure"] = true
L["Modules"] = true
L["Settings"] = true
L["Enable "] = true
L["Module"] = true
L["Enabled"] = true
L["Disabled"] = true
L["Chatter Settings"] = true
L["Welcome to Chatter! Type /chatter to configure."] = true
L["Profiles"] = true
-- ./Modules/AllResize
L["Allows you to use the edge for resizing, instead of just the lower right corner."] = true
L["All Edge resizing"] = true
-- ./Modules/AltNames.lua
L["Alt Linking"] = true
L["Use PlayerNames coloring"] = true
L["Use custom color"] = true
L["Use channel color"] = true
L["Use guildnotes"] = true
L["Look in guildnotes for character names, unless a note is set manually"] = true
L["Alt note fallback"] = true
L["If no name can be found for an 'alt' rank character, use entire note"] = true
L["Name color"] = true
L["Set the coloring mode for alt names"] = true
L["Custom color"] = true
L["Select the custom color to use for alt names"] = true
L["Left Bracket"] = true
L["Character to use for the left bracket"] = true
L["Right Bracket"] = true
L["Character to use for the right bracket"] = true
L["Who is %s's main?"] = true
L["Set Main"] = true
L["Enables you to right-click a person's name in chat and set a note on them to be displayed in chat, such as their main character's name. Can also scan guild notes for character names to display, if no note has been manually set."] = true
L["alt2"] = true
L["alt3"] = true
--./Modules/AutoPopup.lua
L["Automatic Whisper Windows"] = true
-- ./Modules/AutoLogChat.lua
L["Chat Autolog"] = true
L["Automatically turns on chat logging."] = true
--./Modules/Bnet.lua
L["RealID Polish"] = true
L["Show Toast Icons"] = true
L["Show toast icons in the chat frames"] = true
L["Toast X offset"] = true
L["Move the Toast X offset to ChatFrame1"] = true
L["Toast Y offset"] = true
L["Move the Toast Y offset, relative to ChatFrame1"] = true
L["Test"] = true
-- ./Modules/Buttons.lua
L["Disable Buttons"] = true
L["Show bottom when scrolled"] = true
L["Show bottom button when scrolled up"] = true
L["Hides the buttons attached to the chat frame"] = true
-- ./Modules/ChannelColors.lua
L["Channel Colors"] = true
L["Keeps your channel colors by name rather than by number."] = true
L["Other Channels"] = true
L["Say"] = true
L["Yell"] = true
L["Guild"] = true
L["Officer"] = true
L["Party"] = true
L["Raid"] = true
L["Raid Leader"] = true
L["Raid Warning"] = true
L["Battleground"] = true
L["Battleground Leader"] = true
L["Whisper"] = true
L["Select a color for this channel"] = true
-- ./Modules/ChannelNames.lua
L["Channel Names"] = true
L["$$EMPTY$$"] = true
L["LookingForGroup"] = true
L["Custom Channels"] = true
L["Add space after channels"] = true
L["Replace this channel name with..."] = true
L["To (|Hplayer.-|h):"] = true
L["(|Hplayer.-|h) whispers:"] = true
L["Enables you to replace channel names with your own names. You can use '%s' to force an empty string."] = true
L["To (|HBNplayer.-|h):"] = true
L["To <Away>(|HBNplayer.-|h):"] = true
L["To <Busy>(|HBNplayer.-|h):"] = true
L["(|HBNplayer.-|h) whispers:"] = true
L["Dungeon Guide"] = true
-- ./Modules/ChatFading.lua
L["Disable Fading"] = true
L["Makes old text disappear rather than fade out"] = true
-- ./Modules/ChatFont.lua
L["Chat Font"] = true
L["Font"] = true
L["Font size"] = true
L["Font Outline"] = true
L["Font outlining"] = true
L["Chat Frame "] = true
L["Enables you to set a custom font and font size for your chat frames"] = true
-- ./Modules/ChatFrameBorders.lua
L["Borders/Background"] = true
L["Enable"] = true
L["Enable borders on this frame"] = true
L["Combat Log Fix"] = true
L["Resize this border to fit the new combat log"] = true
L["Background texture"] = true
L["Border texture"] = true
L["Background color"] = true
L["Border color"] = true
L["Background Inset"] = true
L["Tile Size"] = true
L["Edge Size"] = true
L["Gives you finer control over the chat frame's background and border colors"] = true
-- ./Modules/ChatLink.Lua
L["Chat Link"] = true
L["Lets you link items, enchants, spells, talents, achievements and quests in custom channels."] = true
-- ./Module/chatPosition.lua
L["Disable server side storage of chat frame position and size."] = true
L["Server Positioning"] = true
-- ./Modules/ChatScroll.lua
L["Mousewheel Scroll"] = true
L["Scroll lines"] = true
L["How many lines to scroll per mouse wheel click"] = true
L["Lets you use the mousewheel to page up and down chat."] = true
-- ./Modules/ChatTabs.lua
L["Chat Tabs"] = true
L["Button Height"] = true
L["Button's height, and text offset from the frame"] = true
L["Hide Tabs"] = true
L["Hides chat frame tabs"] = true
L["Enable Tab Flashing"] = true
L["Enables the Tab to flash when you miss a message"] = true
-- ./Modules/ClickInvite.lua
L["Invite Links"] = true
L["Add Word"] = true
L["Add word to your invite trigger list"] = true
L["Remove Word"] = true
L["Remove a word from your invite trigger list"] = true
L["Remove this word from your trigger list?"] = true
L["Alt-click name to invite"] = true
L["Lets you alt-click player names to invite them to your party."] = true
L["invite"] = true
L["inv"] = true
L["Gives you more flexibility in how you invite people to your group."] = true
-- ./Modules/CopyChat.lua
L["Copy Chat"] = true
L["Copy Text"] = true
L["Lets you copy text out of your chat frames."] = true
L["Copy text from this frame."] = true
L["Show copy icon"] = true
L["Toggle the copy icon on the chat frame."] = true
-- ./Modules/DelayGMOTD.lua
-- no localization
-- ./Modules/EditBox.lua
L["Edit Box Polish"] = true
L["Top"] = true
L["Bottom"] = true
L["Free-floating"] = true
L["Free-floating, Locked"] = true
L["Attach to..."] = true
L["Attach edit box to..."] = true
L["Color border by channel"] = true
L["Sets the frame's border color to the color of your currently active channel"] = true
L["Use Alt key for cursor movement"] = true
L["Requires the Alt key to be held down to move the cursor in chat"] = true
L["Select the font to use for the edit box"] = true
L["Height"] = true
L["Select the height of the edit box"] = true
L["Lets you customize the position and look of the edit box"] = true
-- ./Modules/EditBoxHistory.lua
L["Edit Box History"] = true
L["Remembers the history of the editbox across sessions."] = true
-- ./Modules/GroupSay.lua
L["Group Say (/gr)"] = true
L["Provides a /gr slash command to let you speak in your group (raid, party, or battleground) automatically."] = true
-- ./Modules/Highlight.lua
L["Highlights"] = true
L["Options"] = true
L["Use sound"] = true
L["Play a soundfile when one of your keywords is said."] = true
L["Show SCT message"] = true
L["Show highlights in your SCT mod"] = true
L["Reroute whole message to SCT"] = true
L["Reroute whole message to SCT instead of just displaying 'who said keyword in channel'"] = true
L["Sound File"] = true
L["Sound file to play"] = true
L["Add word to your highlight list"] = true
L["Remove a word from your highlight list"] = true
L["Remove this word from your highlights?"] = true
L["Custom Channel Sounds"] = true
L["Play a sound when a message is received in this channel"] = true
L["[%s] %s: %s"] = true
L["%s said '%s' in %s"] = true
L["Alerts you when someone says a keyword or speaks in a specified channel."] = true
L["RealID Whisper"] = true
L["RealID Conversation"] = true
-- ./Modules/Justify.lua
L["Text Justification"] = true
L["Enable text justification"] = true
L["Left"] = true
L["Right"] = true
L["Center"] = true
L["Lets you set the justification of text in your chat frames."] = true
-- ./Modules/LinkHover.lua
L["Link Hover"] = true
L["Makes link tooltips show when you hover them in chat."] = true
-- ./Modules/MacroLink.lua
L["Macro Link"] = true
L["Allows you to link items by ID in chat or macros by using item:1234 syntax."] = true
-- ./Modules/PlayerNames.lua
L["Player Names"] = true
L["Class"] = true
L["Name"] = true
L["None"] = true
L["Druid"] = true
L["Mage"] = true
L["Paladin"] = true
L["Priest"] = true
L["Rogue"] = true
L["Hunter"] = true
L["Shaman"] = true
L["Warlock"] = true
L["Warrior"] = true
L["Death Knight"] = true
L["Provides options to color player names, add player levels, and add tab completion of player names."] = true
L["Save Data"] = true
L["Save data between sessions. Will increase memory usage"] = true
L["Save class data from guild between sessions."] = true
L["Group"] = true
L["Save class data from groups between sessions."] = true
L["Friends"] = true
L["Save class data from friends between sessions."] = true
L["Target/Mouseover"] = true
L["Save class data from target/mouseover between sessions."] = true
L["Who"] = true
L["Save class data from /who queries between sessions."] = true
L["Save all /who data"] = true
L["Will save all data for large /who queries"] = true
L["Reset Data"] = true
L["Destroys all your saved class/level data"] = true
L["Are you sure you want to delete all your saved class/level data?"] = true
L["Separator"] = true
L["Character to use between the name and level"] = true
L["Use Tab Complete"] = true
L["Use tab key to automatically complete character names."] = true
L["Color self in messages"] = true
L["Color own charname in messages."] = true
L["Emphasize self in messages"] = true
L["Add surrounding brackets to own charname in messages."] = true
L["Level Options"] = true
L["Include level"] = true
L["Include the player's level"] = true
L["Exclude max levels"] = true
L["Exclude level display for max level characters"] = true
L["Color level by difficulty"] = true
L["Color Player Names By..."] = true
L["Select a method for coloring player names"] = true
-- ./Modules/Scrollback.lua
L["Scrollback"] = true
L["Enable Scrollback length modification"] = true
L["Lets you set the scrollback length of your chat frames."] = true
-- ./Modules/SplitText.lua
L["Message Split"] = true
L["Allows you to type messages longer than normal, and splits message that are too long."] = true
-- ./Modules/StickyChannels.lua
L["Sticky Channels"] = true
L["Emote"] = true
L["Custom channels"] = true
L["Make %s sticky"] = true
L["Makes channels you select sticky."] = true
-- ./Modules/Telltarget.lua
L["Tell Target (/tt)"] = true
L["Enables the /tt command to send a tell to your target."] = true
-- ./Modules/Timestamps.lua
L["Timestamps"] = true
L["HH:MM:SS AM (12-hour)"] = true
L["HH:MM (12-hour)"] = true
L["HH:MM:SS (24-hour)"] = true
L["HH:MM (24-hour)"] = true
L["MM:SS"] = true
L["Timestamp format"] = true
L["Custom format (advanced)"] = true
L["Enter a custom time format. See http://www.lua.org/pil/22.1.html for a list of valid formatting symbols."] = true
L["Timestamp color"] = true
L["Color timestamps the same as the channel they appear in."] = true
L["Per chat frame settings"] = true
L["Choose which chat frames display timestamps"] = true
L["Adds timestamps to chat."] = true
-- ./Modules/TinyChat.lua
L["Tiny Chat"] = true
L["Allows you to make the chat frames much smaller than usual."] = true
-- ./Modules/UrlCopy.lua
L["URL Copy"] = true
L["Parse Mumble links"] = true
L["Automatically inject your character's name into Mumble links, so you connect with your username prefilled."] = true
L["Parse Teamspeak 3 links"] = true
L["Automatically inject your character's name into Teamspeak 3 links, so you connect with your username prefilled."] = true
L["Lets you copy URLs out of chat."] = true
-- ./Tests/urlMatch.lua
-- no localization
+268
View File
@@ -0,0 +1,268 @@
-- THIS CONTENTS OF THIS FILE IS AUTO-GENERATED BY THE WOWACE PACKAGER
-- Please use the Localization App on WoWAce to update this
-- at http://www.wowace.com/projects/chatter/localization/
local AceLocale = LibStub:GetLibrary("AceLocale-3.0")
local L = AceLocale:NewLocale("Chatter", "esES") or AceLocale:NewLocale("Chatter", "esMX")
if not L then return end
L["Add space after channels"] = "Añadir espacio después de los canales"
L["Adds timestamps to chat."] = "Añadir marcas de tiempo al chat."
L["Add surrounding brackets to own charname in messages."] = "Añadir corchetes alrededor del propio nombre del personaje en los mensajes"
L["Add Word"] = "Añadir Palabra"
L["Add word to your highlight list"] = "Añadir palabra a la lista de resaltados"
-- L["Add word to your invite trigger list"] = "Add word to your invite trigger list"
L["Alerts you when someone says a keyword or speaks in a specified channel."] = "Avisarme cuando alguien diga una palabra clave o hable en un canal específico."
-- L["All Edge resizing"] = "All Edge resizing"
L["Allows you to make the chat frames much smaller than usual."] = "Permitirme crear marcos de chat más pequeños de lo normal."
L["Allows you to type messages longer than normal, and splits message that are too long."] = "Permitirme escribir mensajes más largos de lo normal y recortar mensajes demasiado largos."
-- L["Allows you to use the edge for resizing, instead of just the lower right corner."] = "Allows you to use the edge for resizing, instead of just the lower right corner."
-- L["alt2"] = "alt2"
-- L["alt3"] = "alt3"
L["Alt-click name to invite"] = "Alt-click sobre el nombre para invitar."
-- L["Alt Linking"] = "Alt Linking"
-- L["Alt note fallback"] = "Alt note fallback"
L["Are you sure you want to delete all your saved class/level data?"] = "¿Estás seguro de que quieres borrar todos los datos de clases/niveles salvados?"
L["Attach edit box to..."] = "Colocar caja de texto en..."
L["Attach to..."] = "Colocar en..."
-- L["Automatically turns on chat logging."] = "Automatically turns on chat logging."
-- L["Automatic Whisper Windows"] = "Automatic Whisper Windows"
L["Background color"] = "Color del fondo"
L["Background Inset"] = "Márgen del fondo"
L["Background texture"] = "Textura del fondo"
L["Battleground"] = "CampoDeBatalla"
-- L["Battleground Leader"] = "Battleground Leader"
L["Border color"] = "Color del borde"
L["Borders/Background"] = "Bordes/Fondo"
L["Border texture"] = "Textura del borde"
L["Bottom"] = "Debajo"
-- L["Button Height"] = "Button Height"
-- L["Button's height, and text offset from the frame"] = "Button's height, and text offset from the frame"
L["Center"] = "Centrado"
L["Channel Colors"] = "Color de canales"
L["Channel Names"] = "Nombres de canal"
L["Character to use between the name and level"] = "Carácter a usar entre el nombre y el nivel"
-- L["Character to use for the left bracket"] = "Character to use for the left bracket"
-- L["Character to use for the right bracket"] = "Character to use for the right bracket"
-- L["Chat Autolog"] = "Chat Autolog"
L["Chat Font"] = "Fuente del chat"
L["Chat Frame "] = "Marco del chat "
L["Chat Link"] = "Enlaces en chat"
L["Chat Tabs"] = "Pestañas del chat"
-- L["Chatter"] = "Chatter"
L["Chatter Settings"] = "Configuración de Chatter"
L["Choose which chat frames display timestamps"] = "Elegir en qué marco de chat se muestran las marcas de tiempo"
L["Class"] = "Clase"
L["Color border by channel"] = "Colorear el borde dependiendo del canal"
L["Color level by difficulty"] = "Colorear el nivel por dificultad"
L["Color own charname in messages."] = "Colorear mi nombre en los mensajes."
L["Color Player Names By..."] = "Colorear el nombre de los jugadores por..."
L["Color self in messages"] = "Colorearme en mensajes" -- Needs review
L["Color timestamps the same as the channel they appear in."] = "Colorear las marcas de tiempo segun el canal en el que aparezcan."
L["Combat Log Fix"] = "Mejora del historial de combate."
L["Configure"] = "Configurar"
L["Copy Chat"] = "Copiar chat"
L["Copy text from this frame."] = "Copiar texto de este marco."
L["Custom channels"] = "Canales personalizados"
L["Custom Channels"] = "Canales personalizados"
L["Custom Channel Sounds"] = "Sonidos de canal personalizados"
L["Custom color"] = "Color personalizado"
L["Custom format (advanced)"] = "Formato personalizado (Avanzado)"
L["Death Knight"] = "Caballero de la Muerte"
L["Destroys all your saved class/level data"] = "Destruye todos los datos salvados de clase/nivel."
L["Disable Buttons"] = "Ocultar botones"
L["Disabled"] = "Desactivado"
L["Disable Fading"] = "Desactivar desvanecerse"
-- L["Disable server side storage of chat frame position and size."] = "Disable server side storage of chat frame position and size."
L["Druid"] = "Druida"
L["Dungeon Guide"] = "Guía de Mazmorra"
-- L["Edge Size"] = "Edge Size"
L["Edit Box History"] = "Historial de la caja de texto"
-- L["Edit Box Polish"] = "Edit Box Polish"
L["Emote"] = "Emoción"
L["Emphasize self in messages"] = "Resaltarme en los mensajes"
-- L["$$EMPTY$$"] = "$$EMPTY$$"
L["Enable"] = "Activar"
L["Enable "] = "Activar "
L["Enable borders on this frame"] = "Permitir bordes en este marco"
L["Enabled"] = "Permitido"
L["Enable Scrollback length modification"] = "Permitir modificar la cantidad de lineas desplazadas."
-- L["Enables the Tab to flash when you miss a message"] = "Enables the Tab to flash when you miss a message"
L["Enables the /tt command to send a tell to your target."] = "Activar el comando /tt para enviar un mensaje a tu objetivo."
L["Enables you to replace channel names with your own names. You can use '%s' to force an empty string."] = "Te permite remplazar los nombres de los canales. Puedes usar '%s' para forzar un nombre vacío."
L["Enables you to right-click a person's name in chat and set a note on them to be displayed in chat, such as their main character's name. Can also scan guild notes for character names to display, if no note has been manually set."] = "Te permite hacer click derecho sobre el nombre de una persona en el chat y añadirle una nota para que se muestre en el chat, como por ejemplo el nombre de su personaje principal. También puede buscar nombres en las notas de hermandad, si no se pone uno a mano."
L["Enables you to set a custom font and font size for your chat frames"] = "Te permite elegir una fuente personalizada y un tamaño de fuente para tus marcos de chat."
-- L["Enable Tab Flashing"] = "Enable Tab Flashing"
L["Enable text justification"] = "Permitir texto justificado"
L["Enter a custom time format. See http://www.lua.org/pil/22.1.html for a list of valid formatting symbols."] = "Introduce un formato de tiempo personalizado. Visita http://www.lua.org/pil/22.1.html para ver una lista de símbolos de formato válida."
L["Exclude level display for max level characters"] = "No mostrar el nivel para personajes de nivel máximo."
L["Exclude max levels"] = "Excluir niveles máximos"
L["Font"] = "Fuente"
L["Font Outline"] = "Resaltado de fuente"
L["Font outlining"] = "Resaltando fuente"
L["Font size"] = "Tamaño de fuente"
L["Free-floating"] = "Flotando"
L["Free-floating, Locked"] = "Flotando, Bloqueado"
L["Friends"] = "Amigos"
L["Gives you finer control over the chat frame's background and border colors"] = "Te da un mejor control sobre el fondo y los colores del borde del marco de chat."
L["Gives you more flexibility in how you invite people to your group."] = "Te da más flexibilidad a la hora de invitar gente a tu grupo."
L["Group"] = "Grupo"
L["Group Say (/gr)"] = "Decir grupo (/gr)"
L["Guild"] = "Hermandad"
-- L["(|HBNplayer.-|h) whispers:"] = "(|HBNplayer.-|h) whispers:"
-- L["HH:MM (12-hour)"] = "HH:MM (12-hour)"
-- L["HH:MM (24-hour)"] = "HH:MM (24-hour)"
-- L["HH:MM:SS (24-hour)"] = "HH:MM:SS (24-hour)"
-- L["HH:MM:SS AM (12-hour)"] = "HH:MM:SS AM (12-hour)"
L["Hides chat frame tabs"] = "Ocultar pestañas del marco de chat"
L["Hides the buttons attached to the chat frame"] = "Ocultar los botones del marco de chat"
L["Hide Tabs"] = "Ocultar pestañas"
L["Highlights"] = "Resaltado"
L["How many lines to scroll per mouse wheel click"] = "Cuántas lineas deben desplazarse por click de la rueda del ratón"
-- L["(|Hplayer.-|h) whispers:"] = "(|Hplayer.-|h) whispers:"
L["Hunter"] = "Cazador"
-- L["^(.-|h) whispers:"] = "^(.-|h) whispers:"
-- L["If no name can be found for an 'alt' rank character, use entire note"] = "If no name can be found for an 'alt' rank character, use entire note"
L["Include level"] = "Incluir nivel"
L["Include the player's level"] = "Incluir nivel del jugador"
-- L["inv"] = "inv"
-- L["invite"] = "invite"
L["Invite Links"] = "Enlaces de invitación"
L["Keeps your channel colors by name rather than by number."] = "Mantener el color de tus canales por nombre en lugar de por número."
L["Left"] = "Izquierda"
-- L["Left Bracket"] = "Left Bracket"
L["Lets you alt-click player names to invite them to your party."] = "Te permite invitar a tu grupo a otros jugadores pulsando alt-click sobre su nombre."
L["Lets you copy text out of your chat frames."] = "Te permite copiar texto fuera de tus marcos de chat."
L["Lets you copy URLs out of chat."] = "Te permite copiar URLs fuera del chat."
L["Lets you customize the position and look of the edit box"] = "Te permite personalizar la posición y la apariencia de la caja de texto."
L["Lets you link items, enchants, spells, talents, achievements and quests in custom channels."] = "Te permite enlazar objetos, encantamientos, hechizos, talentos, logros y búsquedas en canales personalizados."
L["Lets you set the justification of text in your chat frames."] = "Te permite usar texto justificado en tus marcos de chat."
L["Lets you set the scrollback length of your chat frames."] = "Te permite configurar la cantidad de lineas desplazadas en tus marcos de chat."
L["Lets you use the mousewheel to page up and down chat."] = "Te permite usar la rueda del ratón para subir y bajar el chat."
L["Level Options"] = "Opciones de nivel"
L["Link Hover"] = "Enlace flotante"
-- L["LookingForGroup"] = "LookingForGroup"
L["Look in guildnotes for character names, unless a note is set manually"] = "Busca en las notas de hermandad nombres de personajes, si no se han puesto a mano."
L["Mage"] = "Mago"
-- L["Makes channels you select sticky."] = "Makes channels you select sticky."
L["Makes link tooltips show when you hover them in chat."] = "Muestra una ventana de información flotante cuando pasas el cursor sobre un enlace del chat."
L["Makes old text disappear rather than fade out"] = "Hace que el texto antiguo desaparezca en lugar de desvanecerse"
-- L["Make %s sticky"] = "Make %s sticky"
L["Message Split"] = "Cortar mensaje"
-- L["MM:SS"] = "MM:SS"
L["Module"] = "Módulo"
L["Modules"] = "Módulos"
L["Mousewheel Scroll"] = "Desplazamiento con la rueda del ratón"
-- L["Move the Toast X offset to ChatFrame1"] = "Move the Toast X offset to ChatFrame1"
-- L["Move the Toast Y offset, relative to ChatFrame1"] = "Move the Toast Y offset, relative to ChatFrame1"
L["Name"] = "Nombre"
L["Name color"] = "Color del nombre"
L["None"] = "Nada"
L["Officer"] = "Oficiales"
-- L["Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."] = "Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."
L["Options"] = "Opciones"
L["Other Channels"] = "Otros canales"
L["Paladin"] = "Paladín"
L["Party"] = "Grupo"
-- L["Per chat frame settings"] = "Per chat frame settings"
L["Play a soundfile when one of your keywords is said."] = "Reproduce un sonido cuando se dice una de tus palabras clave."
L["Play a sound when a message is received in this channel"] = "Reproduce un sonido cuando se recibe un mensaje en este canal"
L["Player Names"] = "Nombres de jugador"
L["Priest"] = "Sacerdote"
L["Profiles"] = "Perfiles"
L["Provides a /gr slash command to let you speak in your group (raid, party, or battleground) automatically."] = "Activa el comando /gr que te permite hablar en tu grupo (banda, grupo o campo de batalla) automáticamente."
-- L["Provides options to color player names, add player levels, and add tab completion of player names."] = "Provides options to color player names, add player levels, and add tab completion of player names."
L["Raid"] = "Banda"
-- L["Raid Leader"] = "Raid Leader"
L["Raid Warning"] = "Aviso de la banda"
-- L["RealID Conversation"] = "RealID Conversation"
-- L["RealID Polish"] = "RealID Polish"
-- L["RealID Whisper"] = "RealID Whisper"
L["Remembers the history of the editbox across sessions."] = "Recordar el historial de la caja de texto entre sesiones."
L["Remove a word from your highlight list"] = "Borrar una palabra de la lista de resaltados"
-- L["Remove a word from your invite trigger list"] = "Remove a word from your invite trigger list"
L["Remove this word from your highlights?"] = "¿Borrar esta palabra de tus resaltados?"
-- L["Remove this word from your trigger list?"] = "Remove this word from your trigger list?"
L["Remove Word"] = "Borrar palabra"
L["Replace this channel name with..."] = "Reemplazar este nombre de chat por..."
L["Requires the Alt key to be held down to move the cursor in chat"] = "Requiere que mantengas pulsado Alt para mover el cursor en el chat."
L["Reroute whole message to SCT"] = "Reenviar el mensaje completo a SCT"
L["Reroute whole message to SCT instead of just displaying 'who said keyword in channel'"] = "Reenviar el mensaje completo a SCT en lugar de mostrar solo 'quien dijo la palabra clave en el canal'"
-- L["Reset Data"] = "Reset Data"
-- L["Resize this border to fit the new combat log"] = "Resize this border to fit the new combat log"
L["Right"] = "Derecha"
-- L["Right Bracket"] = "Right Bracket"
L["Rogue"] = "Pícaro"
-- L["Save all /who data"] = "Save all /who data"
L["Save class data from friends between sessions."] = "Salvar datos de clase de amigos entre sesiones."
L["Save class data from groups between sessions."] = "Salvar datos de clase de grupos entre sesiones."
L["Save class data from guild between sessions."] = "Salvar datos de clase de la hermandad entre sesiones."
-- L["Save class data from target/mouseover between sessions."] = "Save class data from target/mouseover between sessions."
-- L["Save class data from /who queries between sessions."] = "Save class data from /who queries between sessions."
L["Save Data"] = "Salvar datos"
L["Save data between sessions. Will increase memory usage"] = "Salvar datos entre sesiones. Incrementará el uso de memoria"
L["Say"] = "Decir"
-- L["Scrollback"] = "Scrollback"
L["Scroll lines"] = "Lineas de desplazamiento"
L["Select a color for this channel"] = "Selecciona un color para este canal"
L["Select a method for coloring player names"] = "Selecciona un metodo para colorear nombres de jugador"
-- L["Select the custom color to use for alt names"] = "Select the custom color to use for alt names"
L["Select the font to use for the edit box"] = "Selecciona la fuente a usar en la caja de texto"
L["Separator"] = "Separador"
-- L["Server Positioning"] = "Server Positioning"
L["Set Main"] = "Asignar personaje principal"
-- L["Sets the frame's border color to the color of your currently active channel"] = "Sets the frame's border color to the color of your currently active channel"
-- L["Set the coloring mode for alt names"] = "Set the coloring mode for alt names"
L["Settings"] = "Configuración"
L["Shaman"] = "Chamán"
-- L["Show bottom button when scrolled up"] = "Show bottom button when scrolled up"
-- L["Show bottom when scrolled"] = "Show bottom when scrolled"
-- L["Show copy icon"] = "Show copy icon"
-- L["Show highlights in your SCT mod"] = "Show highlights in your SCT mod"
-- L["Show SCT message"] = "Show SCT message"
-- L["Show Toast Icons"] = "Show Toast Icons"
-- L["Show toast icons in the chat frames"] = "Show toast icons in the chat frames"
L["Sound File"] = "Archivo de sonido"
L["Sound file to play"] = "Sonido a reproducir"
L["%s said '%s' in %s"] = "%s dice '%s' en %s"
-- L["[%s] %s: %s"] = "[%s] %s: %s"
L["Standalone Config"] = "Configuración independiente"
-- L["Sticky Channels"] = "Sticky Channels"
-- L["Target/Mouseover"] = "Target/Mouseover"
L["Tell Target (/tt)"] = "Decir al objetivo (/tt)"
-- L["Test"] = "Test"
L["Text Justification"] = "Texto justificado"
-- L["Tile Size"] = "Tile Size"
L["Timestamp color"] = "Color de la marca de tiempo"
L["Timestamp format"] = "Formato de la marca de tiempo"
L["Timestamps"] = "Marca de tiempo"
L["Tiny Chat"] = "Chat pequeño"
-- L["^To "] = "^To "
-- L["Toast X offset"] = "Toast X offset"
-- L["Toast Y offset"] = "Toast Y offset"
-- L["To <Away>(|HBNplayer.-|h):"] = "To <Away>(|HBNplayer.-|h):"
-- L["To <Busy>(|HBNplayer.-|h):"] = "To <Busy>(|HBNplayer.-|h):"
-- L["Toggle the copy icon on the chat frame."] = "Toggle the copy icon on the chat frame."
-- L["^To (.-|h):"] = "^To (.-|h):"
-- L["To (|HBNplayer.-|h):"] = "To (|HBNplayer.-|h):"
-- L["To (|Hplayer.-|h):"] = "To (|Hplayer.-|h):"
-- L["Top"] = "Top"
L["Trade -"] = "Comercio -"
L["URL Copy"] = "Copiar URL"
L["Use Alt key for cursor movement"] = "Usar tecla Alt para mover el cursor"
L["Use channel color"] = "Usar color de canal"
L["Use custom color"] = "Usar color personalizado"
L["Use guildnotes"] = "Usar notas de hermandad"
L["Use PlayerNames coloring"] = "Usar coloreado de nombres de jugador"
L["Use sound"] = "Usar sonido"
L["Use Tab Complete"] = "Usar Tab para completar"
L["Use tab key to automatically complete character names."] = "Usar tecla Tab para completar automáticamente nombres de personaje."
L["Warlock"] = "Brujo"
L["Warrior"] = "Guerrero"
L["Welcome to Chatter! Type /chatter to configure."] = "Bienvenido a Chatter! Escribe /chatter para configurar."
L["Whisper"] = "Susurrar"
L["Who"] = "Quién"
L["Who is %s's main?"] = "¿Quién es el personaje principal de %s?"
-- L["Will save all data for large /who queries"] = "Will save all data for large /who queries"
L["Yell"] = "Gritar"
+268
View File
@@ -0,0 +1,268 @@
-- THIS CONTENTS OF THIS FILE IS AUTO-GENERATED BY THE WOWACE PACKAGER
-- Please use the Localization App on WoWAce to update this
-- at http://www.wowace.com/projects/chatter/localization/
local AceLocale = LibStub:GetLibrary("AceLocale-3.0")
local L = AceLocale:NewLocale("Chatter", "frFR")
if not L then return end
L["Add space after channels"] = "Ajouter un espace après les canaux"
L["Adds timestamps to chat."] = "Vous permet d'ajouter l'heure aux discussions du chat."
L["Add surrounding brackets to own charname in messages."] = "Ajoute des crochets à votre nom dans les messages"
L["Add Word"] = "Ajouter un mot"
L["Add word to your highlight list"] = "Ajouter un mot à votre liste de mot-clés"
L["Add word to your invite trigger list"] = "Ajoute un mot à votre liste de déclenchement de l'invitation"
L["Alerts you when someone says a keyword or speaks in a specified channel."] = "Vous alerte quand quelqu'un dit un mot ou parle dans le canal spécifié."
-- L["All Edge resizing"] = "All Edge resizing"
L["Allows you to make the chat frames much smaller than usual."] = "Vous permet de rendre les fenêtres de chat plus petites que d'habitude."
L["Allows you to type messages longer than normal, and splits message that are too long."] = "Vous permet de taper des messages plus longs que la normale, et fractionne des messages qui sont trop longs."
-- L["Allows you to use the edge for resizing, instead of just the lower right corner."] = "Allows you to use the edge for resizing, instead of just the lower right corner."
L["alt2"] = "alt2"
L["alt3"] = "alt3"
L["Alt-click name to invite"] = "Utiliser Alt-clic"
L["Alt Linking"] = "Noms Secondaires"
-- L["Alt note fallback"] = "Alt note fallback"
L["Are you sure you want to delete all your saved class/level data?"] = "Ete-vous sûr de vouloir effacer toutes les données de classe et de niveau sauvegardées"
L["Attach edit box to..."] = "Attacher la zone de frappe à..."
L["Attach to..."] = "Attachée à..."
L["Automatically turns on chat logging."] = "Vous permet d'enregistrer automatiquement les discussions du chat."
-- L["Automatic Whisper Windows"] = "Automatic Whisper Windows"
L["Background color"] = "Couleur du fond"
L["Background Inset"] = "Fond de l'encart"
L["Background texture"] = "Texture de fond"
L["Battleground"] = "Champ de bataille"
L["Battleground Leader"] = "Chef de bataille"
L["Border color"] = "Couleur de la bordure"
L["Borders/Background"] = "Bordures et Fonds"
L["Border texture"] = "Texture de la bordure"
L["Bottom"] = "Bas"
L["Button Height"] = "Taille du bouton"
L["Button's height, and text offset from the frame"] = "Vous permet de régler la taille du bouton et l'excentrage du texte à partir de la fenêtre."
L["Center"] = "Centre"
L["Channel Colors"] = "Couleurs des Canaux"
L["Channel Names"] = "Noms des canaux"
L["Character to use between the name and level"] = "Caractère à utiliser entre le nom et le niveau"
L["Character to use for the left bracket"] = "Caractère à utiliser pour le crochet gauche"
L["Character to use for the right bracket"] = "Caractère à utiliser pour le crochet droit"
L["Chat Autolog"] = "Enregistrement"
L["Chat Font"] = "Police du Chat"
L["Chat Frame "] = "Fenêtre du chat"
L["Chat Link"] = "Liens du Chat"
L["Chat Tabs"] = "Onglets du Chat"
L["Chatter"] = "Chatter"
L["Chatter Settings"] = "Réglages de Chatter"
-- L["Choose which chat frames display timestamps"] = "Choose which chat frames display timestamps"
L["Class"] = "Classe"
L["Color border by channel"] = "Couleur selon canal"
L["Color level by difficulty"] = "Coloration du niveau selon la difficulté"
L["Color own charname in messages."] = "Colore votre nom dans les messages"
L["Color Player Names By..."] = "Colorer les noms par..."
L["Color self in messages"] = "Colorer votre nom"
L["Color timestamps the same as the channel they appear in."] = "Colore l'affichage de l'heure en fonction de la couleur des canaux."
L["Combat Log Fix"] = "Fix du journal de combat"
L["Configure"] = "Configure"
L["Copy Chat"] = "Copie des Discussions"
L["Copy text from this frame."] = "Copier le texte à partir de ce cadre."
L["Custom channels"] = "Canaux personnalisés"
L["Custom Channels"] = "Canaux personnalisés"
L["Custom Channel Sounds"] = "Sons de canal personnalisés"
L["Custom color"] = "Couleur personnalisée"
L["Custom format (advanced)"] = "Format personnalisé (avancé)"
L["Death Knight"] = "Chevalier de la Mort"
L["Destroys all your saved class/level data"] = "Efface toutes les données de classe et de niveau sauvegardées"
L["Disable Buttons"] = "Cacher les Boutons"
L["Disabled"] = "Désactivé"
L["Disable Fading"] = "Disparition du Texte"
-- L["Disable server side storage of chat frame position and size."] = "Disable server side storage of chat frame position and size."
L["Druid"] = "Druide"
-- L["Dungeon Guide"] = "Dungeon Guide"
L["Edge Size"] = "Taille du bord"
-- L["Edit Box History"] = "Edit Box History"
L["Edit Box Polish"] = "Zone de Frappe"
L["Emote"] = "Emote"
L["Emphasize self in messages"] = "Mettre en évidence"
-- L["$$EMPTY$$"] = "$$EMPTY$$"
L["Enable"] = "Activer"
L["Enable "] = "Activer"
L["Enable borders on this frame"] = "Active les bordures pour cette fenêtre"
L["Enabled"] = "Activé"
L["Enable Scrollback length modification"] = "Active le Scrollback"
-- L["Enables the Tab to flash when you miss a message"] = "Enables the Tab to flash when you miss a message"
L["Enables the /tt command to send a tell to your target."] = "Vous permet d'activer la commande /tt pour chuchoter à la cible."
L["Enables you to replace channel names with your own names. You can use '%s' to force an empty string."] = "Vous permet de remplacer les noms de canaux avec vos propres noms. Vous pouvez utiliser '%s' pour forcer une chaîne vide."
-- L["Enables you to right-click a person's name in chat and set a note on them to be displayed in chat, such as their main character's name. Can also scan guild notes for character names to display, if no note has been manually set."] = "Enables you to right-click a person's name in chat and set a note on them to be displayed in chat, such as their main character's name. Can also scan guild notes for character names to display, if no note has been manually set."
L["Enables you to set a custom font and font size for your chat frames"] = "Vous permet de choisir une police personnalisée pour vos fenêtres de chat."
-- L["Enable Tab Flashing"] = "Enable Tab Flashing"
L["Enable text justification"] = "Activer la justification du texte"
L["Enter a custom time format. See http://www.lua.org/pil/22.1.html for a list of valid formatting symbols."] = "Entrez un format personnalisé. Regardez le site http://www.lua.org/pil/22.1.html pour la liste des symboles de format valides."
L["Exclude level display for max level characters"] = "Exclure l'affichage du niveau aux personnages de niveau max"
L["Exclude max levels"] = "Exclure les niveaux max"
L["Font"] = "Police"
L["Font Outline"] = "Contour de la Police"
L["Font outlining"] = "Description de la Police"
L["Font size"] = "Taille de la Police"
L["Free-floating"] = "Libre"
L["Free-floating, Locked"] = "Libre, Verrouillé"
L["Friends"] = "Amis"
L["Gives you finer control over the chat frame's background and border colors"] = "Vous permet d'activer le contrôle plus fin sur le fond et la couleur de la bordure de la fenêtre du chat."
L["Gives you more flexibility in how you invite people to your group."] = "Vous donne plus de fléxibilité dans la manière d'inviter les gens dans votre groupe."
L["Group"] = "Groupe"
L["Group Say (/gr)"] = "Parler au Groupe (/gr)"
L["Guild"] = "Guilde"
-- L["(|HBNplayer.-|h) whispers:"] = "(|HBNplayer.-|h) whispers:"
L["HH:MM (12-hour)"] = "HH:MM (12H)"
L["HH:MM (24-hour)"] = "HH:MM (24H)"
L["HH:MM:SS (24-hour)"] = "HH:MM:SS (24H)"
L["HH:MM:SS AM (12-hour)"] = "HH:MM:SS AM (12H)"
-- L["Hides chat frame tabs"] = "Hides chat frame tabs"
L["Hides the buttons attached to the chat frame"] = "Vous permet de cacher les boutons attachés à la fenêtre de chat."
L["Hide Tabs"] = "Cacher les onglets"
L["Highlights"] = "Surbrillance"
L["How many lines to scroll per mouse wheel click"] = "Choix du nombre de lignes à faire défiler avec la roulette de la souris"
L["(|Hplayer.-|h) whispers:"] = "(|Hplayer.-|h) chuchoter:"
L["Hunter"] = "Chasseur"
L["^(.-|h) whispers:"] = "^(.-|h) chuchote"
-- L["If no name can be found for an 'alt' rank character, use entire note"] = "If no name can be found for an 'alt' rank character, use entire note"
L["Include level"] = "Inclure le niveau"
L["Include the player's level"] = "Inclut le niveau du joueur"
L["inv"] = "inv"
L["invite"] = "invite"
L["Invite Links"] = "Liens d'Invitation"
L["Keeps your channel colors by name rather than by number."] = "Vous permet de conserver les couleurs du canal en fonction du nom plutôt que du numéro."
L["Left"] = "Gauche"
L["Left Bracket"] = "Crochet gauche"
L["Lets you alt-click player names to invite them to your party."] = "Vous permet de faire un alt-clic sur un nom pour l'inviter dans votre groupe."
L["Lets you copy text out of your chat frames."] = "Vous permet de copier le texte des discussions."
L["Lets you copy URLs out of chat."] = "Vous permet de copier les URL."
L["Lets you customize the position and look of the edit box"] = "Vous permet de choisir la position et l'aspect de la zone de frappe."
-- L["Lets you link items, enchants, spells, talents, achievements and quests in custom channels."] = "Lets you link items, enchants, spells, talents, achievements and quests in custom channels."
L["Lets you set the justification of text in your chat frames."] = "Vous permet de choisir la justification du texte dans vos fenêtres de chat."
L["Lets you set the scrollback length of your chat frames."] = "Vous permet de définir la longueur du Scrollback de vos fenêtres de chat."
L["Lets you use the mousewheel to page up and down chat."] = "Vous permet d'utiliser la roulette de la souris pour remonter ou descendre dans le chat."
L["Level Options"] = "Options des niveaux"
L["Link Hover"] = "Survol des Liens"
L["LookingForGroup"] = "RechercheDeGroupe"
L["Look in guildnotes for character names, unless a note is set manually"] = "Rechercher dans les notes de guilde pour les noms de personnages, sauf si une note est réglée manuellement"
L["Mage"] = "Mage"
L["Makes channels you select sticky."] = "Vous permet de marquer les canaux que vous avez sélectionné comme persistants."
L["Makes link tooltips show when you hover them in chat."] = "Vous permet d'afficher les Tooltips des liens quand vous les survoler."
L["Makes old text disappear rather than fade out"] = "Vous permet d'effacer le texte ancien plutôt que de le faire disparaître progressivement."
L["Make %s sticky"] = "Marquer %s persistant"
-- L["Message Split"] = "Message Split"
L["MM:SS"] = "MM:SS"
L["Module"] = "Module"
L["Modules"] = "Modules"
L["Mousewheel Scroll"] = "Défilement à la Souris"
-- L["Move the Toast X offset to ChatFrame1"] = "Move the Toast X offset to ChatFrame1"
-- L["Move the Toast Y offset, relative to ChatFrame1"] = "Move the Toast Y offset, relative to ChatFrame1"
L["Name"] = "Nom"
L["Name color"] = "Choix de la couleur"
L["None"] = "Aucun"
L["Officer"] = "Officier"
L["Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."] = "Ouvre la fenêtre de configuration. Il est conseillé d'installer l'addon |cffffff00BetterBlizzOptions|r pour redimensionner la fenêtre des options d'interface de Blizzard"
L["Options"] = "Options"
L["Other Channels"] = "Autres canaux"
L["Paladin"] = "Paladin"
L["Party"] = "Groupe"
-- L["Per chat frame settings"] = "Per chat frame settings"
L["Play a soundfile when one of your keywords is said."] = "Jouer un son quand un de vos mot-clés est utilisé."
L["Play a sound when a message is received in this channel"] = "Joue un son quand un message est reçu dans ce canal"
L["Player Names"] = "Noms des Joueurs"
L["Priest"] = "Prêtre"
L["Profiles"] = "Profils"
L["Provides a /gr slash command to let you speak in your group (raid, party, or battleground) automatically."] = "Vous permet d'utiliser la commande /gr pour parler automatiquement dans votre groupe (raid, groupe, ou champ de bataille)."
L["Provides options to color player names, add player levels, and add tab completion of player names."] = "Vous offre des options pour colorer les noms de joueurs, inclure leurs niveaux, et utiliser la touche Tab pour compléter leur noms."
L["Raid"] = "Raid"
L["Raid Leader"] = "Chef de raid"
L["Raid Warning"] = "Raid alerte"
-- L["RealID Conversation"] = "RealID Conversation"
-- L["RealID Polish"] = "RealID Polish"
-- L["RealID Whisper"] = "RealID Whisper"
-- L["Remembers the history of the editbox across sessions."] = "Remembers the history of the editbox across sessions."
L["Remove a word from your highlight list"] = "Supprime un mot de votre liste de mot-clés"
L["Remove a word from your invite trigger list"] = "Supprime un mot de votre liste de déclenchement de l'invitation"
L["Remove this word from your highlights?"] = "Supprimer ce mot de votre liste de mot-clés?"
L["Remove this word from your trigger list?"] = "Supprimer ce mot de votre liste de déclenchement de l'invitation?"
L["Remove Word"] = "Supprimer un mot"
L["Replace this channel name with..."] = "Remplace ce nom de canal par..."
L["Requires the Alt key to be held down to move the cursor in chat"] = "Nécessite que la touche Alt soit enfoncée pour faire bouger le curseur"
L["Reroute whole message to SCT"] = "Rediriger tout vers SCT"
L["Reroute whole message to SCT instead of just displaying 'who said keyword in channel'"] = "Redirige tout le message vers SCT au lieu de simplement afficher que quelqu'un a utilisé un mot-clé dans le canal"
L["Reset Data"] = "Remise à zéro"
L["Resize this border to fit the new combat log"] = "Redimensionner cette bordure pour qu'elle s'adapte au nouveau journal de combat"
L["Right"] = "Droite"
L["Right Bracket"] = "Crochet droit"
L["Rogue"] = "Voleur"
-- L["Save all /who data"] = "Save all /who data"
-- L["Save class data from friends between sessions."] = "Save class data from friends between sessions."
L["Save class data from groups between sessions."] = "Sauvegarder les données de classe des membres du groupe entre les sessions."
L["Save class data from guild between sessions."] = "Sauvegarder les données de classe des membres de la guilde entre les sessions."
L["Save class data from target/mouseover between sessions."] = "Sauvegarder les données de classe des cibles/mouseover entre les sessions."
L["Save class data from /who queries between sessions."] = "Sauvegarder les données de classe des requêtes /who entre les sessions."
L["Save Data"] = "Sauvegarde"
L["Save data between sessions. Will increase memory usage"] = "Sauvegarder les données entre les sessions. Entraîne une augmentation de l'utilisation de la mémoire"
L["Say"] = "Dire"
L["Scrollback"] = "Scrollback"
L["Scroll lines"] = "Nombre de lignes"
L["Select a color for this channel"] = "Choisir une couleur pour ce canal"
L["Select a method for coloring player names"] = "Vous permet de choisir la méthode pour colorer les noms de joueurs."
L["Select the custom color to use for alt names"] = "Choix de la couleur personnalisée à utiliser pour les noms secondaires"
L["Select the font to use for the edit box"] = "Choix de la police à utiliser pour la zone de frappe"
-- L["Separator"] = "Separator"
-- L["Server Positioning"] = "Server Positioning"
L["Set Main"] = "Définir comme personnage principal"
L["Sets the frame's border color to the color of your currently active channel"] = "Règle la couleur du bord de la zone de frappe selon la couleur de votre canal actif"
L["Set the coloring mode for alt names"] = "Choix du mode de coloration pour les noms secondaires"
L["Settings"] = "Réglages"
L["Shaman"] = "Chaman"
L["Show bottom button when scrolled up"] = "Affiche un bouton de retour vers le bas quand vous remontez dans le chat"
L["Show bottom when scrolled"] = "Bouton de retour"
-- L["Show copy icon"] = "Show copy icon"
L["Show highlights in your SCT mod"] = "Affiche les mot-clés dans votre SCT"
L["Show SCT message"] = "Afficher dans SCT"
-- L["Show Toast Icons"] = "Show Toast Icons"
-- L["Show toast icons in the chat frames"] = "Show toast icons in the chat frames"
L["Sound File"] = "Fichier sonore"
L["Sound file to play"] = "Fichier sonore à jouer"
L["%s said '%s' in %s"] = "%s a dit '%s' dans %s"
L["[%s] %s: %s"] = "[%s] %s: %s"
L["Standalone Config"] = "Configuration"
L["Sticky Channels"] = "Canaux Persistants"
L["Target/Mouseover"] = "Cible/Mouseover"
L["Tell Target (/tt)"] = "Chuchoter à la Cible (/tt)"
-- L["Test"] = "Test"
L["Text Justification"] = "Justification du Texte"
L["Tile Size"] = "Taille du titre"
L["Timestamp color"] = "Couleur de l'affichage de l'heure"
L["Timestamp format"] = "Format de l'heure"
L["Timestamps"] = "Affichage de l'Heure"
L["Tiny Chat"] = "Petites Fenêtres"
L["^To "] = ""
-- L["Toast X offset"] = "Toast X offset"
-- L["Toast Y offset"] = "Toast Y offset"
-- L["To <Away>(|HBNplayer.-|h):"] = "To <Away>(|HBNplayer.-|h):"
-- L["To <Busy>(|HBNplayer.-|h):"] = "To <Busy>(|HBNplayer.-|h):"
-- L["Toggle the copy icon on the chat frame."] = "Toggle the copy icon on the chat frame."
L["^To (.-|h):"] = "^To (.-|h):"
-- L["To (|HBNplayer.-|h):"] = "To (|HBNplayer.-|h):"
L["To (|Hplayer.-|h):"] = "pour (|Hplayer.-|h):"
L["Top"] = "Haut"
L["Trade -"] = "Commerce -"
L["URL Copy"] = "Copie d'URL"
L["Use Alt key for cursor movement"] = "Utiliser la touche Alt pour le mouvement du curseur"
L["Use channel color"] = "Couleur de canal"
L["Use custom color"] = "Couleur personnalisée"
-- L["Use guildnotes"] = "Use guildnotes"
L["Use PlayerNames coloring"] = "Couleur des joueurs"
L["Use sound"] = "Utiliser un son"
L["Use Tab Complete"] = "Utiliser la touche Tab"
L["Use tab key to automatically complete character names."] = "Utilisez la touche Tab pour compléter automatiquement le nom des joueurs."
L["Warlock"] = "Démoniste"
L["Warrior"] = "Guerrier"
L["Welcome to Chatter! Type /chatter to configure."] = "Bienvenue dans Chatter! Tapez /chatter pour le configurer"
L["Whisper"] = "Chuchoter"
L["Who"] = "Qui"
L["Who is %s's main?"] = "Quel est le personnage principal de %s?"
L["Will save all data for large /who queries"] = "Permettra de sauver toutes les données de grande envergure ou qui introduisent des questions"
L["Yell"] = "Crier"
+268
View File
@@ -0,0 +1,268 @@
-- THIS CONTENTS OF THIS FILE IS AUTO-GENERATED BY THE WOWACE PACKAGER
-- Please use the Localization App on WoWAce to update this
-- at http://www.wowace.com/projects/chatter/localization/
local AceLocale = LibStub:GetLibrary("AceLocale-3.0")
local L = AceLocale:NewLocale("Chatter", "koKR")
if not L then return end
L["Add space after channels"] = "채널 뒤에 공간 추가"
L["Adds timestamps to chat."] = "대화창에 시간표시를 추가합니다."
L["Add surrounding brackets to own charname in messages."] = "대화내용에서 자기 캐릭터 이름에 괄호를 표시하여 강조합니다."
L["Add Word"] = "단어 추가"
L["Add word to your highlight list"] = "강조 목록에 단어를 추가합니다."
L["Add word to your invite trigger list"] = "초대 가능한 단어를 추가합니다."
L["Alerts you when someone says a keyword or speaks in a specified channel."] = "대화창에 키워드가 나오거나, 지정한 채널에 대화가 올라오면 알립니다."
L["All Edge resizing"] = "모든 테두리 크기 변경"
L["Allows you to make the chat frames much smaller than usual."] = "대화창을 보통보다 훨씬 작게 만들 수 있습니다."
L["Allows you to type messages longer than normal, and splits message that are too long."] = "엄청 긴 메세지를 입력할 수 있습니다. 너무 길면 메세지를 자릅니다."
L["Allows you to use the edge for resizing, instead of just the lower right corner."] = "대화창 오른쪽 아래 표시하지 않고 대화창의 사방 테두리를 드래그하여 크기를 변경합니다." -- Needs review
L["alt2"] = "alt2"
L["alt3"] = "alt3"
L["Alt-click name to invite"] = "Alt-클릭 초대"
L["Alt Linking"] = "플레이어 메모"
L["Alt note fallback"] = "노트 풀백"
L["Are you sure you want to delete all your saved class/level data?"] = "모든 직업/레벨 정보를 삭제하시겠습니까?"
L["Attach edit box to..."] = "입력창 붙임"
L["Attach to..."] = "붙임"
L["Automatically turns on chat logging."] = "대화 내용을 자동으로 저장합니다."
L["Automatic Whisper Windows"] = "자동 귓속말 창"
L["Background color"] = "배경 색상"
L["Background Inset"] = "배경 삽입"
L["Background texture"] = "배경 무늬"
L["Battleground"] = "전장"
L["Battleground Leader"] = "전장 지휘관"
L["Border color"] = "테두리 색상"
L["Borders/Background"] = "테두리/배경"
L["Border texture"] = "테두리 무늬"
L["Bottom"] = "아래"
L["Button Height"] = "버튼 높이"
L["Button's height, and text offset from the frame"] = "버튼 높이 및 글자 위치를 변경합니다."
L["Center"] = "가운데"
L["Channel Colors"] = "채널 색상"
L["Channel Names"] = "채널 이름"
L["Character to use between the name and level"] = "케릭터에 이름과 레벨을 사용"
L["Character to use for the left bracket"] = "왼쪽 괄호로 사용할 글자"
L["Character to use for the right bracket"] = "오른쪽 괄호로 사용할 글자"
L["Chat Autolog"] = "대화 자동 저장"
L["Chat Font"] = "글꼴"
L["Chat Frame "] = "대화창 "
L["Chat Link"] = "사용자 채널 링크"
L["Chat Tabs"] = ""
L["Chatter"] = "Chatter"
L["Chatter Settings"] = "Chatter 설정"
L["Choose which chat frames display timestamps"] = "시간을 표시할 대화창을 선택합니다."
L["Class"] = "직업"
L["Color border by channel"] = "채널 색상 테두리"
L["Color level by difficulty"] = "레벨에 따른 색상"
L["Color own charname in messages."] = "대화내용에서 자기 캐릭터 이름 색상을 변경하여 표시합니다."
L["Color Player Names By..."] = "플레이어 이름 색상"
L["Color self in messages"] = "자기 이름 색상 표시"
L["Color timestamps the same as the channel they appear in."] = "시간표시의 색상을 대화채널의 색상과 동일하게 합니다."
L["Combat Log Fix"] = "전투 로그 수정"
L["Configure"] = "설정"
L["Copy Chat"] = "대화 복사"
L["Copy text from this frame."] = "현재 대화창 내용 복사"
L["Custom channels"] = "사용자 채널"
L["Custom Channels"] = "사용자 채널"
L["Custom Channel Sounds"] = "사용자 채널 소리"
L["Custom color"] = "사용자 색상"
L["Custom format (advanced)"] = "사용자 형식"
L["Death Knight"] = "죽음의 기사"
L["Destroys all your saved class/level data"] = "모든 직업/레벨 정보를 삭제합니다."
L["Disable Buttons"] = "버튼 숨기기"
L["Disabled"] = "미사용중"
L["Disable Fading"] = "사라짐 방지"
L["Disable server side storage of chat frame position and size."] = "대화창 위치 및 크기에 서버를 사용하지 않습니다." -- Needs review
L["Druid"] = "드루이드"
L["Dungeon Guide"] = "던전 길잡이"
L["Edge Size"] = "모서리 크기"
L["Edit Box History"] = "입력창 기록"
L["Edit Box Polish"] = "입력창 설정"
L["Emote"] = "감정 표현"
L["Emphasize self in messages"] = "자기 이름 강조 표시"
L["$$EMPTY$$"] = "$$EMPTY$$"
L["Enable"] = "사용"
L["Enable "] = "사용: "
L["Enable borders on this frame"] = "현재 대화창에 테두리를 표시합니다."
L["Enabled"] = "사용중"
L["Enable Scrollback length modification"] = "지나간 대화 길이 변경"
L["Enables the Tab to flash when you miss a message"] = "대화를 확인하지 않았을 때 탭을 반짝입니다."
L["Enables the /tt command to send a tell to your target."] = "/tt를 입력하여 대상에게 귓속말을 사용합니다."
L["Enables you to replace channel names with your own names. You can use '%s' to force an empty string."] = "자신의 이름을 채널 이름에 대체할 수 있습니다. '%s'을 사용하여 공백을 표시합니다."
L["Enables you to right-click a person's name in chat and set a note on them to be displayed in chat, such as their main character's name. Can also scan guild notes for character names to display, if no note has been manually set."] = "채팅창에 케릭명을 오른클릭하면 채팅창에 노트된것을 마치 주케릭 이름처럼 보여줍니다. 또한, 케릭명의 길드 노트도 찾아 보여줍니다. "
L["Enables you to set a custom font and font size for your chat frames"] = "대화창 글꼴 및 크기를 바꿀 수 있습니다."
L["Enable Tab Flashing"] = "탭 반짝임 사용"
L["Enable text justification"] = "텍스트 정렬 사용"
L["Enter a custom time format. See http://www.lua.org/pil/22.1.html for a list of valid formatting symbols."] = "시간표시 형식을 입력하세요. 사용되는 변수는 http://www.lua.org/pil/22.1.html를 참조하세요."
L["Exclude level display for max level characters"] = "최고 레벨은 표시하지 않습니다."
L["Exclude max levels"] = "최고 레벨 제외"
L["Font"] = "글꼴"
L["Font Outline"] = "글꼴 외곽선"
L["Font outlining"] = "글꼴 외곽선을 사용합니다."
L["Font size"] = "글꼴 크기"
L["Free-floating"] = "자유"
L["Free-floating, Locked"] = "자유(고정)"
L["Friends"] = "친구"
L["Gives you finer control over the chat frame's background and border colors"] = "대화창 배경과 테두리 색상을 상세 설정할 수 있습니다."
L["Gives you more flexibility in how you invite people to your group."] = "플레이어를 초대하는 여러가지 방법을 제공합니다."
L["Group"] = "그룹"
L["Group Say (/gr)"] = "그룹 대화 (/gr)"
L["Guild"] = "길드"
-- L["(|HBNplayer.-|h) whispers:"] = "(|HBNplayer.-|h) whispers:"
L["HH:MM (12-hour)"] = "시:분 (12시간제)"
L["HH:MM (24-hour)"] = "시:분 (24시간제)"
L["HH:MM:SS (24-hour)"] = "시:분:초 (24시간제)"
L["HH:MM:SS AM (12-hour)"] = "시:분:초 오전 (12시간제)"
L["Hides chat frame tabs"] = "대화창 탭을 숨깁니다."
L["Hides the buttons attached to the chat frame"] = "대화창에 붙어 있는 버튼을 숨깁니다."
L["Hide Tabs"] = "탭 숨기기"
L["Highlights"] = "강조"
L["How many lines to scroll per mouse wheel click"] = "마우스 휠로 한 번에 스크롤할 줄 수"
L["(|Hplayer.-|h) whispers:"] = "(|Hplayer.-|h) 님의 귓속말:"
L["Hunter"] = "사냥꾼"
L["^(.-|h) whispers:"] = "^(.-|h)님의 귓속말:"
L["If no name can be found for an 'alt' rank character, use entire note"] = "아무런 이름도 'alt' 랭크된 케릭터가 발견되지 않았다면, 전체 노트를 사용합니다."
L["Include level"] = "레벨 포함"
L["Include the player's level"] = "플레이어 레벨을 포함합니다."
L["inv"] = "ㅅㅅ"
L["invite"] = "초대"
L["Invite Links"] = "초대 링크"
L["Keeps your channel colors by name rather than by number."] = "대화 채널을 숫자 말고 이름으로 표시합니다."
L["Left"] = "왼쪽"
L["Left Bracket"] = "왼쪽 괄호"
L["Lets you alt-click player names to invite them to your party."] = "채널에서 캐릭터 이름에 Alt-클릭하면 해당 유저를 초대합니다."
L["Lets you copy text out of your chat frames."] = "대화창 내용을 복사합니다."
L["Lets you copy URLs out of chat."] = "대화창에서 인터넷 주소를 복사할 수 있습니다."
L["Lets you customize the position and look of the edit box"] = "입력창 위치와 모양을 바꿉니다."
L["Lets you link items, enchants, spells, talents, achievements and quests in custom channels."] = "아이템, 아이템강화, 주문들, 특성들, 업적, 퀘스트를 사용자 채널에 링크 할 수 있습니다."
L["Lets you set the justification of text in your chat frames."] = "대화창 텍스트를 정렬합니다."
L["Lets you set the scrollback length of your chat frames."] = "지나간 대화 최대 길이를 설정할 수 있습니다."
L["Lets you use the mousewheel to page up and down chat."] = "마우스 휠로 대화창을 스크롤할 수 있습니다."
L["Level Options"] = "레벨 설정"
L["Link Hover"] = "링크 바로 표시"
L["LookingForGroup"] = "파티찾기"
L["Look in guildnotes for character names, unless a note is set manually"] = "노트가 수동으로 설정되어 있어도, 길드노트에서 케릭터 이름을 볼 수 있습니다."
L["Mage"] = "마법사"
L["Makes channels you select sticky."] = "선택한 채널을 고정합니다."
L["Makes link tooltips show when you hover them in chat."] = "대화창에 링크가 있을 때 마우스를 대면 바로 링크를 표시합니다."
L["Makes old text disappear rather than fade out"] = "시간이 지나도 대화 내용이 사라지지 않게 합니다."
L["Make %s sticky"] = "%s 채널 고정"
L["Message Split"] = "메세지 자르기"
L["MM:SS"] = "분:초"
L["Module"] = "모듈"
L["Modules"] = "모듈"
L["Mousewheel Scroll"] = "마우스 스크롤"
L["Move the Toast X offset to ChatFrame1"] = "대화창1의 Toast X 위치를 변경합니다." -- Needs review
L["Move the Toast Y offset, relative to ChatFrame1"] = "대화창1의 Toast Y 위치를 변경합니다." -- Needs review
L["Name"] = "이름"
L["Name color"] = "이름 색상"
L["None"] = "없음"
L["Officer"] = "길드 관리자"
L["Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."] = "Chatter 설정창을 엽니다. |cffffff00BetterBlizzOptions|r을 설치하면 Blizzard UI 설정창 크기를 조절할 수 있습니다."
L["Options"] = "옵션"
L["Other Channels"] = "다른 채널"
L["Paladin"] = "성기사"
L["Party"] = "파티"
L["Per chat frame settings"] = "각 대화창 설정"
L["Play a soundfile when one of your keywords is said."] = "대화창에 키워드가 나타나면 소리로 알립니다."
L["Play a sound when a message is received in this channel"] = "이 채널에 메세지가 올라오면 소리를 냅니다."
L["Player Names"] = "플레이어 이름"
L["Priest"] = "사제"
L["Profiles"] = "프로파일"
L["Provides a /gr slash command to let you speak in your group (raid, party, or battleground) automatically."] = "/gr 명령으로 현재 그룹(공격대, 파티 또는 전장)에 자동으로 말을 할 수 있습니다."
L["Provides options to color player names, add player levels, and add tab completion of player names."] = "플레이어 이름 및 레벨에 따른 색상을 표시하고, 탭 키를 이용해 플레이어 이름을 자동으로 입력합니다."
L["Raid"] = "공격대"
L["Raid Leader"] = "공격대장"
L["Raid Warning"] = "공격대 경보"
L["RealID Conversation"] = "실명 ID 대화"
L["RealID Polish"] = "실명ID 알림"
L["RealID Whisper"] = "실명 ID 귓속말"
L["Remembers the history of the editbox across sessions."] = "대화창에 입력한 내용을 기록합니다."
L["Remove a word from your highlight list"] = "강조 목록에서 단어를 삭제합니다."
L["Remove a word from your invite trigger list"] = "초대 가능한 단어를 삭제합니다."
L["Remove this word from your highlights?"] = "강조 목록에서 단어를 삭제하시겠습니까?"
L["Remove this word from your trigger list?"] = "현재 단어를 초대 가능한 단어에서 삭제하시겠습니까?"
L["Remove Word"] = "단어 삭제"
L["Replace this channel name with..."] = "현재 채널 이름을 변경합니다."
L["Requires the Alt key to be held down to move the cursor in chat"] = "Alt 키를 눌러야 입력창에서 커서가 움직입니다."
L["Reroute whole message to SCT"] = "모든 메시지 SCT로 보냄"
L["Reroute whole message to SCT instead of just displaying 'who said keyword in channel'"] = "누가 어느 채널에서 키워드를 말했는지 표시하고, SCT 메시지로도 보냅니다."
L["Reset Data"] = "데이터 초기화"
L["Resize this border to fit the new combat log"] = "새 전투 로그에 맞게 테두리 크기를 바꿉니다."
L["Right"] = "오른쪽"
L["Right Bracket"] = "오른쪽 괄호"
L["Rogue"] = "도적"
L["Save all /who data"] = "모든 /누구 정보 저장"
L["Save class data from friends between sessions."] = "친구의 직업 정보를 저장합니다."
L["Save class data from groups between sessions."] = "그룹(공대/파티) 멤버 직업 정보를 저장합니다."
L["Save class data from guild between sessions."] = "길드 멤버 직업 정보를 저장합니다."
L["Save class data from target/mouseover between sessions."] = "대상 및 마우스 대상 직업 정보를 저장합니다."
L["Save class data from /who queries between sessions."] = "/who(/누구) 결과 직업 정보를 저장합니다."
L["Save Data"] = "정보 저장"
L["Save data between sessions. Will increase memory usage"] = "현재 세션 데이터를 저장합니다. 메모리 사용량이 증가합니다."
L["Say"] = "일반"
L["Scrollback"] = "지나간 대화"
L["Scroll lines"] = "스크롤 줄 수"
L["Select a color for this channel"] = "현재 채널 색상을 선택합니다."
L["Select a method for coloring player names"] = "플레이어 이름 표시 방법을 선택합니다."
L["Select the custom color to use for alt names"] = "플레이어 메모 표시에 쓸 사용자 색상을 지정합니다."
L["Select the font to use for the edit box"] = "입력창에 쓸 폰트를 선택합니다."
L["Separator"] = "분리대"
L["Server Positioning"] = "서버 위치" -- Needs review
L["Set Main"] = "플레이어 메모"
L["Sets the frame's border color to the color of your currently active channel"] = "입력창 테두리를 현재 활성화된 채널 색상으로 바꿉니다."
L["Set the coloring mode for alt names"] = "플레이어 메모 색상 표시 방법을 선택합니다."
L["Settings"] = "설정"
L["Shaman"] = "주술사"
L["Show bottom button when scrolled up"] = "스크롤했을 때 대화창 제일 아래로 가는 버튼을 표시합니다."
L["Show bottom when scrolled"] = "바닥 스크롤 버튼"
L["Show copy icon"] = "아이콘 복사 표시" -- Needs review
L["Show highlights in your SCT mod"] = "강조 내용을 SCT로 보여줍니다."
L["Show SCT message"] = "SCT 메시지 표시"
L["Show Toast Icons"] = "Toast 아이콘 표시" -- Needs review
L["Show toast icons in the chat frames"] = "대화창에 Toast 아이콘을 표시합니다." -- Needs review
L["Sound File"] = "소리 파일"
L["Sound file to play"] = "연주할 소리 파일"
L["%s said '%s' in %s"] = "%1$s|1은;는; %3$s에서 '%2$s'라고 말합니다."
L["[%s] %s: %s"] = "[%s] %s: %s"
L["Standalone Config"] = "독립 설정"
L["Sticky Channels"] = "채널 고정"
L["Target/Mouseover"] = "대상 및 마우스 대상"
L["Tell Target (/tt)"] = "대상 귓말 (/tt)"
L["Test"] = "테스트"
L["Text Justification"] = "텍스트 정렬"
L["Tile Size"] = "타일 크기"
L["Timestamp color"] = "시간표시 색상"
L["Timestamp format"] = "시간표시 형식"
L["Timestamps"] = "시간표시"
L["Tiny Chat"] = "작은 대화창"
L["^To "] = "님에게 귓속말:"
L["Toast X offset"] = "Toast X 기준위치" -- Needs review
L["Toast Y offset"] = "Toast Y 기준위치" -- Needs review
-- L["To <Away>(|HBNplayer.-|h):"] = "To <Away>(|HBNplayer.-|h):"
-- L["To <Busy>(|HBNplayer.-|h):"] = "To <Busy>(|HBNplayer.-|h):"
L["Toggle the copy icon on the chat frame."] = "대화창에 아이콘 복사를 표시합니다." -- Needs review
L["^To (.-|h):"] = "^(.-|h)님에게 귓속말:"
-- L["To (|HBNplayer.-|h):"] = "To (|HBNplayer.-|h):"
L["To (|Hplayer.-|h):"] = "(|Hplayer.-|h) 님에게 귓속말:"
L["Top"] = ""
L["Trade -"] = "거래 -"
L["URL Copy"] = "인터넷 주소"
L["Use Alt key for cursor movement"] = "Alt 키로 커서 움직임"
L["Use channel color"] = "대화 채널 색상 사용"
L["Use custom color"] = "사용자 색상 사용"
L["Use guildnotes"] = "길드노트 사용"
L["Use PlayerNames coloring"] = "'플레이어 이름' 색상 사용"
L["Use sound"] = "소리 사용"
L["Use Tab Complete"] = "탭 키 입력 사용"
L["Use tab key to automatically complete character names."] = "탭 키를 이용해 캐릭터 이름을 자동으로 입력합니다."
L["Warlock"] = "흑마법사"
L["Warrior"] = "전사"
L["Welcome to Chatter! Type /chatter to configure."] = "Chatter 만세! 설정은 /chatter"
L["Whisper"] = "귓속말"
L["Who"] = "누구"
L["Who is %s's main?"] = "(예) %s 메인 캐릭 이름"
L["Will save all data for large /who queries"] = "(결과가 3명 이상일 때) 모든 /누구 정보를 저장합니다."
L["Yell"] = "외치기"
+269
View File
@@ -0,0 +1,269 @@
-- THIS CONTENTS OF THIS FILE IS AUTO-GENERATED BY THE WOWACE PACKAGER
-- Please use the Localization App on WoWAce to update this
-- at http://www.wowace.com/projects/chatter/localization/
-- ruRU Localization file, by StingerSoft.
local AceLocale = LibStub:GetLibrary("AceLocale-3.0")
local L = AceLocale:NewLocale("Chatter", "ruRU")
if not L then return end
L["Add space after channels"] = "Добавить пропуск после каналов"
L["Adds timestamps to chat."] = "Добавить время в чат"
L["Add surrounding brackets to own charname in messages."] = "Добавляет квадратные скобки в начало и конец имени вашего персонажа в сообщениях."
L["Add Word"] = "Добавить слово"
L["Add word to your highlight list"] = "Добавить слово в ваш список выделения"
L["Add word to your invite trigger list"] = "Добавить слово для вашего списка триггеров приглашений"
L["Alerts you when someone says a keyword or speaks in a specified channel."] = "Уведомлять вас когда кто либо скажет ключевое слово в определенный канал."
L["All Edge resizing"] = "Изменять размер, используя границы"
L["Allows you to make the chat frames much smaller than usual."] = "Позволяет вам сделать окно чата намного меньше обычного."
L["Allows you to type messages longer than normal, and splits message that are too long."] = "Позволяет печатать сообщения длиннее чем обычно, разбивая его на части."
L["Allows you to use the edge for resizing, instead of just the lower right corner."] = "Разрешить изменение размера окон чата, используя границы, а не только правый нижний угол."
-- L["alt2"] = "alt2"
-- L["alt3"] = "alt3"
L["Alt-click name to invite"] = "Alt-клик по имени для приглашения"
L["Alt Linking"] = "Ссылка на альтов"
-- L["Alt note fallback"] = "Alt note fallback"
L["Are you sure you want to delete all your saved class/level data?"] = "Вы уверены что вы хотите удалить все сохраненные данные по классу/уровню?"
L["Attach edit box to..."] = "Прикрепить поле ввода к..."
L["Attach to..."] = "Прикрепить к..."
L["Automatically turns on chat logging."] = "Автоматическое включение логирования чата при входе"
L["Automatic Whisper Windows"] = "Автоматическое окно шепота"
L["Background color"] = "Цвет фона"
L["Background Inset"] = "Фон Вкладки"
L["Background texture"] = "Текстура фона"
L["Battleground"] = "Поля сражений"
L["Battleground Leader"] = "Лидер поля сражений"
L["Border color"] = "Цвет края"
L["Borders/Background"] = "Края/Фон"
L["Border texture"] = "Текстура края"
L["Bottom"] = "Снизу"
L["Button Height"] = "Высота кнопки"
L["Button's height, and text offset from the frame"] = "Высота кнопок, и смещение текста из окна"
L["Center"] = "По центру"
L["Channel Colors"] = "Цвета каналов"
L["Channel Names"] = "Имена каналов"
L["Character to use between the name and level"] = "Символ, использующийся между именем и уровнем"
L["Character to use for the left bracket"] = "Символ, используемый в качестве левой скобки"
L["Character to use for the right bracket"] = "Символ, используемый в качестве правой скобки"
L["Chat Autolog"] = "Автологирование чата"
L["Chat Font"] = "Шрифт чата"
L["Chat Frame "] = "Окно чата"
L["Chat Link"] = "Ссылки чата"
L["Chat Tabs"] = "Закладки чата"
L["Chatter"] = "Chatter"
L["Chatter Settings"] = "Настройки Chatterа"
L["Choose which chat frames display timestamps"] = "Выберите в каком окне чата отображать время"
L["Class"] = "Класс"
L["Color border by channel"] = "Цвет краев по каналу"
L["Color level by difficulty"] = "Цвет уровней по трудности"
L["Color own charname in messages."] = "Цвет имени машего персонажа в сообщениях."
L["Color Player Names By..."] = "Цвет имен игроков по..."
L["Color self in messages"] = "Окраска себя в сообщениях"
L["Color timestamps the same as the channel they appear in."] = "Color timestamps the same as the channel they appear in."
L["Combat Log Fix"] = "Фикс Журнала боя"
L["Configure"] = "Настройки"
L["Copy Chat"] = "Копирование чата"
L["Copy text from this frame."] = "Копировать текст из данного окна."
L["Custom channels"] = "Специальные каналы"
L["Custom Channels"] = "Пользовательские каналы"
L["Custom Channel Sounds"] = "Спец звук канала"
L["Custom color"] = "Спец.цвет"
L["Custom format (advanced)"] = "Специальный формат (продвинутый)"
L["Death Knight"] = "Рыцарь смерти"
L["Destroys all your saved class/level data"] = "Удалить все ваши сохраненные данные по классу/уровню"
L["Disable Buttons"] = "Отключить кнопки"
L["Disabled"] = "Отключен"
L["Disable Fading"] = "Отключить затухание"
L["Disable server side storage of chat frame position and size."] = "Отключить сохранение размера и положения окон чата на сервере"
L["Druid"] = "Друид"
-- L["Dungeon Guide"] = "Dungeon Guide"
L["Edge Size"] = "Размер края"
L["Edit Box History"] = "История поля ввода"
L["Edit Box Polish"] = "Отделка поля ввода" -- Needs review
L["Emote"] = "Эмоции"
L["Emphasize self in messages"] = "Подчёркивать себя в сообщениях"
-- L["$$EMPTY$$"] = "$$EMPTY$$"
L["Enable"] = "Включить"
L["Enable "] = "Вкл. "
L["Enable borders on this frame"] = "Включить края в данном окне"
L["Enabled"] = "Включен"
L["Enable Scrollback length modification"] = "Enable Scrollback length modification"
L["Enables the Tab to flash when you miss a message"] = "Включает мигание вкладки при появлении нового сообщения"
L["Enables the /tt command to send a tell to your target."] = "Включает команду /tt для передачи в чат вашу цель"
L["Enables you to replace channel names with your own names. You can use '%s' to force an empty string."] = "Позволяет заменить названия каналов на пользовательские. Чтобы заставить пустую строку, вы можете использовать '%s'."
L["Enables you to right-click a person's name in chat and set a note on them to be displayed in chat, such as their main character's name. Can also scan guild notes for character names to display, if no note has been manually set."] = "Позволяет вам щелкнув правой кнопкой мыши по имени персонажа в чате, установить заметку о нём, которая будет отображаться в чате, например, имя его главного персонажа. Может также сканировать заметки гильдии и отображать найденные там имена персонажей, если они не были установлены вручную."
L["Enables you to set a custom font and font size for your chat frames"] = "Включает возможность настройки шрифта и его размера в ваших окнах чата"
L["Enable Tab Flashing"] = "Включить мигание вкладки"
L["Enable text justification"] = "Выравнивание текста"
L["Enter a custom time format. See http://www.lua.org/pil/22.1.html for a list of valid formatting symbols."] = "Введите специальный формат времени. Просмотрите http://www.lua.org/pil/22.1.html для просмотра списка доступных символов форматирования."
L["Exclude level display for max level characters"] = "Исключить отображение уровня персонажей с макс уровнем"
L["Exclude max levels"] = "Исключать макс уровни"
L["Font"] = "Шрифт"
L["Font Outline"] = "Контур шрифта"
L["Font outlining"] = "Контур шрифта"
L["Font size"] = "Размер шрифта"
L["Free-floating"] = "Свободно-плавучий"
L["Free-floating, Locked"] = "Свободно-плавучий, Зафиксирован"
L["Friends"] = "Друзья"
L["Gives you finer control over the chat frame's background and border colors"] = "Позволяет вам настроить фон окон чата и цвета краев"
L["Gives you more flexibility in how you invite people to your group."] = "Дает вам больше возможностей для принятия людей в вашу группу."
L["Group"] = "Группа"
L["Group Say (/gr)"] = "Сказать в группу (/gr)"
L["Guild"] = "Гильдия"
L["(|HBNplayer.-|h) whispers:"] = "(|HBNplayer.-|h) шепчет:"
L["HH:MM (12-hour)"] = "ЧЧ:ММ (12-часов)"
L["HH:MM (24-hour)"] = "ЧЧ:ММ (24-часа)"
L["HH:MM:SS (24-hour)"] = "ЧЧ:ММ:СС (24-часа)"
L["HH:MM:SS AM (12-hour)"] = "ЧЧ:ММ:СС AM (12-часов)"
L["Hides chat frame tabs"] = "Скрыть закладки окна чата"
L["Hides the buttons attached to the chat frame"] = "Скрыть прикрепленные к окну чата кнопки"
L["Hide Tabs"] = "Скрыть закладки"
L["Highlights"] = "Выделения"
L["How many lines to scroll per mouse wheel click"] = "Сколько строк будет прокручиваться при клике колесика мыши"
L["(|Hplayer.-|h) whispers:"] = "(|Hplayer.-|h) шепчет:"
L["Hunter"] = "Охотник"
L["^(.-|h) whispers:"] = "^(.-|h) шепчет:"
L["If no name can be found for an 'alt' rank character, use entire note"] = "Если не найдено имя персонажа с рангом 'альт', использовать всю заметку."
L["Include level"] = "Включая уровень"
L["Include the player's level"] = "Включая уровень игроков"
L["inv"] = "инв"
L["invite"] = "пригласи"
L["Invite Links"] = "Ссылки приглашений"
L["Keeps your channel colors by name rather than by number."] = "Хранит ваши цвета канала по имени а не по номеру."
L["Left"] = "Влево"
L["Left Bracket"] = "Левая скобка"
L["Lets you alt-click player names to invite them to your party."] = "Позволяет вам alt-кликнув по имени игрока пригласить его в группу."
L["Lets you copy text out of your chat frames."] = "Позволяет вам копировать текст из ваших окон чата."
L["Lets you copy URLs out of chat."] = "Позволяет вам копировать ссылки из чата."
L["Lets you customize the position and look of the edit box"] = "Позволяет вам настроить вид и позицию поля ввода"
L["Lets you link items, enchants, spells, talents, achievements and quests in custom channels."] = "Позволяет вам выводить ссылки на предмет, наложение чар, способности, таланты и т.д. в пользовательский чат."
L["Lets you set the justification of text in your chat frames."] = "Позволяет настроить выравнивание текста в вашем окне чата."
L["Lets you set the scrollback length of your chat frames."] = "Позволяет вам задать длину прокрутки вашего окна чата"
L["Lets you use the mousewheel to page up and down chat."] = "Позволяет вам использовать колесо для прокрутки чата вверх и вниз."
L["Level Options"] = "Настройки уровня"
L["Link Hover"] = "Навод на ссылку"
L["LookingForGroup"] = "Поиск спутников"
L["Look in guildnotes for character names, unless a note is set manually"] = "Просмотреть искать имена персонажей в заметках гильдии, если заметка не задана вручную"
L["Mage"] = "Маг"
L["Makes channels you select sticky."] = "Делает выбранные вами каналы клейкими."
L["Makes link tooltips show when you hover them in chat."] = "Отображение подсказки когда вы наводите на ссылку предмета в чате."
L["Makes old text disappear rather than fade out"] = "Заставляет старый текст исчезнуть быстрее чем затухать"
L["Make %s sticky"] = "Сделать %s клейким"
L["Message Split"] = "Деление сообщения"
L["MM:SS"] = "ММ:СС"
L["Module"] = "Модуль"
L["Modules"] = "Модули"
L["Mousewheel Scroll"] = "Прокручивать колесом-мыши"
L["Move the Toast X offset to ChatFrame1"] = "Смещение значка оповещений по оси X относительно Окна чата1" -- Needs review
L["Move the Toast Y offset, relative to ChatFrame1"] = "Смещение значка оповещений по оси Y относительно Окна чата1" -- Needs review
L["Name"] = "Имя"
L["Name color"] = "Цвет имени"
L["None"] = "Нету"
L["Officer"] = "Офицерский"
L["Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."] = "Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."
L["Options"] = "Настройки"
L["Other Channels"] = "Другие каналы"
L["Paladin"] = "паладин"
L["Party"] = "Группа"
L["Per chat frame settings"] = "Настройки окон чатов"
L["Play a soundfile when one of your keywords is said."] = "Проиграть звуковой файл когда будут сказоны одино из ваших ключевых слов."
L["Play a sound when a message is received in this channel"] = "Проиграть звук когда будет получено сообщений в данном канале"
L["Player Names"] = "Имя игрока"
L["Priest"] = "Жрец"
L["Profiles"] = "Пофиля"
L["Provides a /gr slash command to let you speak in your group (raid, party, or battleground) automatically."] = "Обеспечивает командой /gr для автомотического общения в группе (рейде или поле сражения)"
L["Provides options to color player names, add player levels, and add tab completion of player names."] = "Provides options to color player names, add player levels, and add tab completion of player names."
L["Raid"] = "Рейд"
L["Raid Leader"] = "Лидер рейда"
L["Raid Warning"] = "Объявление рейду"
L["RealID Conversation"] = "Разговор Battle.Net"
L["RealID Polish"] = "Отделка RealID" -- Needs review
L["RealID Whisper"] = "Шепот Battle.Net"
L["Remembers the history of the editbox across sessions."] = "Запоминать историю поля ввода во время сеанса."
L["Remove a word from your highlight list"] = "Удалить слово из вашего списка выделения"
L["Remove a word from your invite trigger list"] = "Удалить слово из вашего списка триггеров приглашений"
L["Remove this word from your highlights?"] = "Удалить данное слово из выделения?"
L["Remove this word from your trigger list?"] = "Удалить данное слово из вашего списка триггеров?"
L["Remove Word"] = "Удалить слово"
L["Replace this channel name with..."] = "Заменить название данного канала на..."
L["Requires the Alt key to be held down to move the cursor in chat"] = "Для перемещения курсора в чате нужно удерживать клавишу Alt"
L["Reroute whole message to SCT"] = "Перенаправлять все сообщение в SCT"
L["Reroute whole message to SCT instead of just displaying 'who said keyword in channel'"] = "Перенаправлять все сообщение в SCT вместо одного отображения 'кто сказал ключевое слово в канал'"
L["Reset Data"] = "Сброс данных"
L["Resize this border to fit the new combat log"] = "Изменить размеры данного края для заполнения нового журнала сражений"
L["Right"] = "Вправо"
L["Right Bracket"] = "Правая скобка"
L["Rogue"] = "Разбойник"
L["Save all /who data"] = "Сохранять все данные /who"
L["Save class data from friends between sessions."] = "Сохранять данные класса друзей между сеансами."
L["Save class data from groups between sessions."] = "Сохранить данные между сеансами по классу из группы."
L["Save class data from guild between sessions."] = "Сохранить данные между сеансами по классу из гильдии."
L["Save class data from target/mouseover between sessions."] = "Сохранить данные между сеансами по классу из Цели/Наведение-мыши."
L["Save class data from /who queries between sessions."] = "Сохранить данные между сеансами по классу из запросов /who"
L["Save Data"] = "Сохранить данные"
L["Save data between sessions. Will increase memory usage"] = "Сохранить данные между сеансами. Увеличение используемый объем памети"
L["Say"] = "Сказать"
L["Scrollback"] = "Прокрутка"
L["Scroll lines"] = "Прокрутка строк"
L["Select a color for this channel"] = "Выберите цвет для данного канала"
L["Select a method for coloring player names"] = "Выберите метод для окрашивания имен игроков"
L["Select the custom color to use for alt names"] = "Выберите спец. цвет для отображения имен альтов"
L["Select the font to use for the edit box"] = "Выберите шрифт для использования в поле ввода"
L["Separator"] = "Разделитель"
L["Server Positioning"] = "Расположение на сервере" -- Needs review
L["Set Main"] = "Назн. основного"
L["Sets the frame's border color to the color of your currently active channel"] = "Установите цвет границ на цвет вашего активнрго канала"
L["Set the coloring mode for alt names"] = "Установите тип окраски для имен альтов"
L["Settings"] = "Настройки"
L["Shaman"] = "Шаман"
L["Show bottom button when scrolled up"] = "Показывать кнопки в нижней части когда прокручивается вверх"
L["Show bottom when scrolled"] = "В нижней части когда прокручивается"
L["Show copy icon"] = "Иконка копировния"
L["Show highlights in your SCT mod"] = "Показать выделение в вашем SCT моде"
L["Show SCT message"] = "Показать сообщения SCT"
L["Show Toast Icons"] = "Показывать оповещения" -- Needs review
L["Show toast icons in the chat frames"] = "Показывать значки оповещений в окне чата" -- Needs review
L["Sound File"] = "Звуковой файл"
L["Sound file to play"] = "Звуковой файл для проигрывания"
L["%s said '%s' in %s"] = "%s сказал '%s' в %s"
L["[%s] %s: %s"] = "[%s] %s: %s"
L["Standalone Config"] = "Меню настроек"
L["Sticky Channels"] = "Клейкие каналы"
L["Target/Mouseover"] = "Цель/Наведение-мыши"
L["Tell Target (/tt)"] = "Сказать о цели (/tt)"
L["Test"] = "Тест"
L["Text Justification"] = "Выравнивание текста"
L["Tile Size"] = "Размер заголовка"
L["Timestamp color"] = "Цвет времени"
L["Timestamp format"] = "Формат времени"
L["Timestamps"] = "Формат времени"
L["Tiny Chat"] = "Маленький чат"
L["^To "] = ""
L["Toast X offset"] = "Смещение по оси X" -- Needs review
L["Toast Y offset"] = "Смещение по оси Y" -- Needs review
L["To <Away>(|HBNplayer.-|h):"] = "Вы шепчете <Отсутствует>(|HBNplayer.-|h):"
L["To <Busy>(|HBNplayer.-|h):"] = "Вы шепчете <Не беспокоить>(|HBNplayer.-|h):"
L["Toggle the copy icon on the chat frame."] = "Переключение отображения на окне чата иконки копирования."
L["^To (.-|h):"] = "^Вы шепчете |3-2((.-|h))"
L["To (|HBNplayer.-|h):"] = "Вы шепчете (|HBNplayer.-|h):"
L["To (|Hplayer.-|h):"] = "Вы шепчете |3-2(|Hplayer.-|h):"
L["Top"] = "Сверху"
L["Trade -"] = "Торговля:"
L["URL Copy"] = "Копирование ссылок"
L["Use Alt key for cursor movement"] = "Используйте клавишу Alt передвижения курсора"
L["Use channel color"] = "Цвет канала"
L["Use custom color"] = "Пользовательский цвет"
L["Use guildnotes"] = "Исп. заметки гильдии"
L["Use PlayerNames coloring"] = "Использовать окраску по именам игрока"
L["Use sound"] = "Использовать звук"
L["Use Tab Complete"] = "Исп. Tab для завершения"
L["Use tab key to automatically complete character names."] = " Использование tab клавиши для автоматического завершения имён персонажей."
L["Warlock"] = "Чернокнижник"
L["Warrior"] = "Воин"
L["Welcome to Chatter! Type /chatter to configure."] = "Добро пожаловать в Chatter! Для настроек введите /chatter"
L["Whisper"] = "Шепот"
L["Who"] = "Кто"
L["Who is %s's main?"] = "Кто основной %s'а?"
L["Will save all data for large /who queries"] = "Будет сохранять все данные больших запросов /who"
L["Yell"] = "Крик"
+268
View File
@@ -0,0 +1,268 @@
-- THIS CONTENTS OF THIS FILE IS AUTO-GENERATED BY THE WOWACE PACKAGER
-- Please use the Localization App on WoWAce to update this
-- at http://www.wowace.com/projects/chatter/localization/
local AceLocale = LibStub:GetLibrary("AceLocale-3.0")
local L = AceLocale:NewLocale("Chatter", "zhCN")
if not L then return end
L["Add space after channels"] = "在频道名后加空格"
L["Adds timestamps to chat."] = "给聊天文字增加时间戳。"
L["Add surrounding brackets to own charname in messages."] = "在消息内为你自己的角色名添加尖括号"
L["Add Word"] = "添加关键词"
L["Add word to your highlight list"] = "添加关键词到你的高亮列表里"
L["Add word to your invite trigger list"] = "添加关键词到你的邀请触发列表"
L["Alerts you when someone says a keyword or speaks in a specified channel."] = "当某人说了一个关键字或者指定的频道有人说话时发出警报。"
-- L["All Edge resizing"] = "All Edge resizing"
L["Allows you to make the chat frames much smaller than usual."] = "允许你弄一个比平常小得多的聊天窗口。"
L["Allows you to type messages longer than normal, and splits message that are too long."] = "允许你输入超长信息,并且自动进行分割。"
-- L["Allows you to use the edge for resizing, instead of just the lower right corner."] = "Allows you to use the edge for resizing, instead of just the lower right corner."
-- L["alt2"] = "alt2"
-- L["alt3"] = "alt3"
L["Alt-click name to invite"] = "Alt+点击姓名邀请玩家"
L["Alt Linking"] = "小号链接"
L["Alt note fallback"] = "依照小号注释"
L["Are you sure you want to delete all your saved class/level data?"] = "你确定要清空这些数据么?"
L["Attach edit box to..."] = "附着输入框到……"
L["Attach to..."] = "附着到……"
L["Automatically turns on chat logging."] = "自动启用游戏自带的聊天日志功能。"
-- L["Automatic Whisper Windows"] = "Automatic Whisper Windows"
L["Background color"] = "背景颜色"
L["Background Inset"] = "背景边距"
L["Background texture"] = "背景贴图"
L["Battleground"] = "战场"
L["Battleground Leader"] = "战场领袖"
L["Border color"] = "边框颜色"
L["Borders/Background"] = "边框/背景"
L["Border texture"] = "边框贴图"
L["Bottom"] = ""
L["Button Height"] = "按钮高度"
L["Button's height, and text offset from the frame"] = "按钮的高度,以及框体文字的偏移量"
L["Center"] = ""
L["Channel Colors"] = "频道颜色"
L["Channel Names"] = "频道名称"
L["Character to use between the name and level"] = "名字和等级之间要使用的角色"
L["Character to use for the left bracket"] = "设定左括号所使用的字符"
L["Character to use for the right bracket"] = "设定右括号所使用的字符"
L["Chat Autolog"] = "聊天日志"
L["Chat Font"] = "聊天字体"
L["Chat Frame "] = "聊天窗口"
L["Chat Link"] = "聊天链接"
L["Chat Tabs"] = "聊天分栏"
L["Chatter"] = "Chatter"
L["Chatter Settings"] = "Chatter设置"
L["Choose which chat frames display timestamps"] = "选择要显示时间戳的聊天窗口"
L["Class"] = "职业"
L["Color border by channel"] = "按频道着色边框"
L["Color level by difficulty"] = "按照等级难度着色等级"
L["Color own charname in messages."] = "在消息内高亮你自己的角色名"
L["Color Player Names By..."] = "用……着色玩家名字"
L["Color self in messages"] = "在消息内高亮自身"
L["Color timestamps the same as the channel they appear in."] = "依据时间戳所在的频道,用频道颜色为其着色。"
L["Combat Log Fix"] = "战斗日志修正"
L["Configure"] = "配置"
L["Copy Chat"] = "聊天复制"
L["Copy text from this frame."] = "从这个窗口复制文本"
L["Custom channels"] = "自定义频道"
L["Custom Channels"] = "自定义频道"
L["Custom Channel Sounds"] = "自定义频道声音"
L["Custom color"] = "自定义颜色"
L["Custom format (advanced)"] = "自定义格式(限高级用户)"
L["Death Knight"] = "死亡骑士"
L["Destroys all your saved class/level data"] = "清空所有你所保存的职业/等级数据"
L["Disable Buttons"] = "禁用按钮"
L["Disabled"] = "已禁用"
L["Disable Fading"] = "禁用淡出"
-- L["Disable server side storage of chat frame position and size."] = "Disable server side storage of chat frame position and size."
L["Druid"] = "德鲁伊"
L["Dungeon Guide"] = "地下城向导"
L["Edge Size"] = "边框块大小"
L["Edit Box History"] = "输入框历史"
L["Edit Box Polish"] = "输入框美化"
L["Emote"] = "表情"
L["Emphasize self in messages"] = "在消息内突出自身"
L["$$EMPTY$$"] = "$$EMPTY$$"
L["Enable"] = "启用"
L["Enable "] = "启用"
L["Enable borders on this frame"] = "为该窗体启用边框"
L["Enabled"] = "已启用"
L["Enable Scrollback length modification"] = "启用回滚长度修改"
-- L["Enables the Tab to flash when you miss a message"] = "Enables the Tab to flash when you miss a message"
L["Enables the /tt command to send a tell to your target."] = "使用/tt命令发送一条密语到当前目标。"
L["Enables you to replace channel names with your own names. You can use '%s' to force an empty string."] = "启用来用你自己的名字来替换频道名字. 你可以使用 '%s' 来强制一个空的字符."
L["Enables you to right-click a person's name in chat and set a note on them to be displayed in chat, such as their main character's name. Can also scan guild notes for character names to display, if no note has been manually set."] = "开启你在聊天中右键点击一个人的名字设置一个显示在聊天框的注释, 如同他们的主号名字. 如果没有手动设置注释, 也可以显示公会注释."
L["Enables you to set a custom font and font size for your chat frames"] = "允许你为你的聊天窗口自定义字体以及字体大小"
-- L["Enable Tab Flashing"] = "Enable Tab Flashing"
L["Enable text justification"] = "启用文本对齐"
L["Enter a custom time format. See http://www.lua.org/pil/22.1.html for a list of valid formatting symbols."] = "自定义时间格式。可以参考 http://www.lua.org/pil/22.1.html 以查看都有哪些格式化符号可以使用。"
L["Exclude level display for max level characters"] = "满级玩家不显示等级"
L["Exclude max levels"] = "排除满级"
L["Font"] = "字体"
L["Font Outline"] = "字体轮廓"
L["Font outlining"] = "字体轮廓"
L["Font size"] = "字体大小"
L["Free-floating"] = "自由浮动"
L["Free-floating, Locked"] = "自由浮动 - 已锁定"
L["Friends"] = "好友"
L["Gives you finer control over the chat frame's background and border colors"] = "使你能更好地控制聊天窗口背景及边框"
L["Gives you more flexibility in how you invite people to your group."] = "提供更灵活多样的邀请其他人加入你队伍的方式"
L["Group"] = "小队"
L["Group Say (/gr)"] = "智能发言(/gr)"
L["Guild"] = "公会"
-- L["(|HBNplayer.-|h) whispers:"] = "(|HBNplayer.-|h) whispers:"
L["HH:MM (12-hour)"] = "时:分 (12小时制)"
L["HH:MM (24-hour)"] = "时:分 (24小时制)"
L["HH:MM:SS (24-hour)"] = "时:分:秒 (24小时制)"
L["HH:MM:SS AM (12-hour)"] = "时:分:秒 上午 (12小时制)"
L["Hides chat frame tabs"] = "隐藏聊天框架的分栏"
L["Hides the buttons attached to the chat frame"] = "隐藏附着在聊天框的按钮"
L["Hide Tabs"] = "隐藏分栏"
L["Highlights"] = "高亮"
L["How many lines to scroll per mouse wheel click"] = "每次滚轮滚动要卷动多少行"
L["(|Hplayer.-|h) whispers:"] = "(|Hplayer.-|h) 密语:"
L["Hunter"] = "猎人"
L["^(.-|h) whispers:"] = "^(.-|h)悄悄地说:"
L["If no name can be found for an 'alt' rank character, use entire note"] = "如果没有找到小号等级角色的名字, 使用整体注释"
L["Include level"] = "包含等级"
L["Include the player's level"] = "包含玩家的等级"
L["inv"] = ""
L["invite"] = "组我"
L["Invite Links"] = "邀请链接"
L["Keeps your channel colors by name rather than by number."] = "以名称为频道着色而不是以数字"
L["Left"] = ""
L["Left Bracket"] = "左括号"
L["Lets you alt-click player names to invite them to your party."] = "使你可以通过Alt+点击玩家的名字来邀请他们加入你的队伍"
L["Lets you copy text out of your chat frames."] = "允许你把文字从聊天框复制出来"
L["Lets you copy URLs out of chat."] = "允许你将网址从聊天框中复制出来。"
L["Lets you customize the position and look of the edit box"] = "允许你自定义输入框的外观和位置"
L["Lets you link items, enchants, spells, talents, achievements and quests in custom channels."] = "让你在自定义频道中链接物品,附魔,法术,天赋,成就和任务."
L["Lets you set the justification of text in your chat frames."] = "允许你设置你的聊天框文字如何对齐。"
L["Lets you set the scrollback length of your chat frames."] = "允许你设置你的聊天框的回滚长度。"
L["Lets you use the mousewheel to page up and down chat."] = "允许你使用鼠标滚轮进行聊天记录翻页"
L["Level Options"] = "等级选项"
L["Link Hover"] = "链接悬停"
L["LookingForGroup"] = "寻求组队"
-- L["Look in guildnotes for character names, unless a note is set manually"] = "Look in guildnotes for character names, unless a note is set manually"
L["Mage"] = "法师"
L["Makes channels you select sticky."] = "使你所选择的频道成为固定的输入频道。"
L["Makes link tooltips show when you hover them in chat."] = "当你将鼠标悬停在链接上时显示其提示信息框"
L["Makes old text disappear rather than fade out"] = "使过期文字立刻消失而不是慢慢淡出"
L["Make %s sticky"] = "固定%s频道"
-- L["Message Split"] = "Message Split"
L["MM:SS"] = "分:秒"
L["Module"] = "模块"
L["Modules"] = "模块"
L["Mousewheel Scroll"] = "鼠标滚轮滚动"
-- L["Move the Toast X offset to ChatFrame1"] = "Move the Toast X offset to ChatFrame1"
-- L["Move the Toast Y offset, relative to ChatFrame1"] = "Move the Toast Y offset, relative to ChatFrame1"
L["Name"] = "名字"
L["Name color"] = "名字颜色"
L["None"] = ""
L["Officer"] = "官员"
L["Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."] = "打开一个独立的配置窗口。你也许希望使用|cffffff00BetterBlizzOptions|r插件使得暴雪的选项窗口可以调整大小。"
L["Options"] = "选项"
L["Other Channels"] = "其他频道"
L["Paladin"] = "圣骑士"
L["Party"] = "小队"
L["Per chat frame settings"] = "聊天窗口独立设置"
L["Play a soundfile when one of your keywords is said."] = "当有人说了你所设定的关键字时播放声音"
L["Play a sound when a message is received in this channel"] = "当这个频道有新消息时播放一个声音"
L["Player Names"] = "玩家名字"
L["Priest"] = "牧师"
L["Profiles"] = "配置文件"
L["Provides a /gr slash command to let you speak in your group (raid, party, or battleground) automatically."] = "允许你使用/gr命令自动依据你当前的队伍情况说在相应的队伍频道(团队,小队或者战场)里。"
L["Provides options to color player names, add player levels, and add tab completion of player names."] = "提供为玩家名字着色的选项,添加玩家的等级,以及Tab自动完成玩家名字输入。"
L["Raid"] = "团队"
L["Raid Leader"] = "团队领袖"
L["Raid Warning"] = "团队警报"
-- L["RealID Conversation"] = "RealID Conversation"
-- L["RealID Polish"] = "RealID Polish"
-- L["RealID Whisper"] = "RealID Whisper"
-- L["Remembers the history of the editbox across sessions."] = "Remembers the history of the editbox across sessions."
L["Remove a word from your highlight list"] = "从你的高亮列表里面移除一个关键词"
L["Remove a word from your invite trigger list"] = "从你的邀请触发列表移除关键词"
L["Remove this word from your highlights?"] = "你确信要移除这个关键词么?"
L["Remove this word from your trigger list?"] = "确定要移除这个关键词?"
L["Remove Word"] = "移除关键词"
L["Replace this channel name with..."] = "将频道名字替换为……"
L["Requires the Alt key to be held down to move the cursor in chat"] = "在文字间移动光标的时候需要按住Alt键"
L["Reroute whole message to SCT"] = "将信息导入SCT"
L["Reroute whole message to SCT instead of just displaying 'who said keyword in channel'"] = "将整条信息导入SCT,而不是仅仅显示‘某某在频道里说了什么什么’"
L["Reset Data"] = "重置数据"
L["Resize this border to fit the new combat log"] = "更改这个边框的大小以包容新的战斗日志"
L["Right"] = ""
L["Right Bracket"] = "右括号"
L["Rogue"] = "潜行者"
L["Save all /who data"] = "保存所有的 /who 数据"
-- L["Save class data from friends between sessions."] = "Save class data from friends between sessions."
L["Save class data from groups between sessions."] = "在多次游戏间保存小队职业数据"
L["Save class data from guild between sessions."] = "在多次游戏间保存公会职业数据"
L["Save class data from target/mouseover between sessions."] = "在多次游戏间保存目标/鼠标悬停的职业数据"
L["Save class data from /who queries between sessions."] = "在多次游戏间保存/who查询的职业数据"
L["Save Data"] = "保存数据"
L["Save data between sessions. Will increase memory usage"] = "在多次游戏间保存数据,将会增加内容使用量"
L["Say"] = ""
L["Scrollback"] = "回滚"
L["Scroll lines"] = "滚动行数"
L["Select a color for this channel"] = "为该频道选择一个颜色"
L["Select a method for coloring player names"] = "选择为玩家名字着色的方式"
L["Select the custom color to use for alt names"] = "为小号名字选择自定义颜色"
L["Select the font to use for the edit box"] = "设置输入框里面的文字字体"
-- L["Separator"] = "Separator"
-- L["Server Positioning"] = "Server Positioning"
L["Set Main"] = "设置大号"
L["Sets the frame's border color to the color of your currently active channel"] = "根据你当前使用的频道来给框体边框上色"
L["Set the coloring mode for alt names"] = "设置小号名字的颜色模式"
L["Settings"] = "设置"
L["Shaman"] = "萨满祭司"
L["Show bottom button when scrolled up"] = "当滚上去时显示底部按钮"
L["Show bottom when scrolled"] = "当滚动时显示底部"
-- L["Show copy icon"] = "Show copy icon"
L["Show highlights in your SCT mod"] = "在SCT插件里显示你的高亮信息"
L["Show SCT message"] = "显示SCT信息"
-- L["Show Toast Icons"] = "Show Toast Icons"
-- L["Show toast icons in the chat frames"] = "Show toast icons in the chat frames"
L["Sound File"] = "声音文件"
L["Sound file to play"] = "要播放的声音文件"
L["%s said '%s' in %s"] = "%s说“%s”(于%s)"
L["[%s] %s: %s"] = "[%s]%s%s"
L["Standalone Config"] = "独立配置"
L["Sticky Channels"] = "固定频道"
L["Target/Mouseover"] = "目标/鼠标悬停"
L["Tell Target (/tt)"] = "密语目标(/tt)"
-- L["Test"] = "Test"
L["Text Justification"] = "文本对齐"
L["Tile Size"] = "背景块大小"
L["Timestamp color"] = "时间戳颜色"
L["Timestamp format"] = "时间戳格式"
L["Timestamps"] = "时间戳"
L["Tiny Chat"] = "迷你窗口"
L["^To "] = "^发送给"
-- L["Toast X offset"] = "Toast X offset"
-- L["Toast Y offset"] = "Toast Y offset"
-- L["To <Away>(|HBNplayer.-|h):"] = "To <Away>(|HBNplayer.-|h):"
-- L["To <Busy>(|HBNplayer.-|h):"] = "To <Busy>(|HBNplayer.-|h):"
-- L["Toggle the copy icon on the chat frame."] = "Toggle the copy icon on the chat frame."
-- L["^To (.-|h):"] = "^To (.-|h):"
-- L["To (|HBNplayer.-|h):"] = "To (|HBNplayer.-|h):"
L["To (|Hplayer.-|h):"] = "到 (|Hplayer.-|h):"
L["Top"] = ""
L["Trade -"] = "交易 -"
L["URL Copy"] = "网址复制"
L["Use Alt key for cursor movement"] = "使用Alt键移动光标"
L["Use channel color"] = "使用频道颜色"
L["Use custom color"] = "使用自定义颜色"
-- L["Use guildnotes"] = "Use guildnotes"
L["Use PlayerNames coloring"] = "使用玩家名字颜色"
L["Use sound"] = "使用声音"
L["Use Tab Complete"] = "Tab键自动完成"
L["Use tab key to automatically complete character names."] = "使用Tab键自动完成玩家名字"
L["Warlock"] = "术士"
L["Warrior"] = "战士"
L["Welcome to Chatter! Type /chatter to configure."] = "欢迎使用Chatter!输入/chatter命令进行设置。"
L["Whisper"] = "密语"
L["Who"] = "查询"
L["Who is %s's main?"] = "谁是%s的大号?"
-- L["Will save all data for large /who queries"] = "Will save all data for large /who queries"
L["Yell"] = "大喊"
+268
View File
@@ -0,0 +1,268 @@
-- THIS CONTENTS OF THIS FILE IS AUTO-GENERATED BY THE WOWACE PACKAGER
-- Please use the Localization App on WoWAce to update this
-- at http://www.wowace.com/projects/chatter/localization/
local AceLocale = LibStub:GetLibrary("AceLocale-3.0")
local L = AceLocale:NewLocale("Chatter", "zhTW")
if not L then return end
L["Add space after channels"] = "頻道後增加空白"
L["Adds timestamps to chat."] = "新增時間標籤。"
L["Add surrounding brackets to own charname in messages."] = "在訊息中自己的角色名稱加上括號"
L["Add Word"] = "新增關鍵字"
L["Add word to your highlight list"] = "新增關鍵字到你的高亮列表裡"
L["Add word to your invite trigger list"] = "新增關鍵字到你的邀請觸發列表"
L["Alerts you when someone says a keyword or speaks in a specified channel."] = "當某人說了一個關鍵字或者指定的頻道有人說話時發出警告。"
L["All Edge resizing"] = "所有邊框重置大小"
L["Allows you to make the chat frames much smaller than usual."] = "允許你弄一個比平常小得多的聊天視窗。"
L["Allows you to type messages longer than normal, and splits message that are too long."] = "允許你輸入比平時更長的訊息,並分割太長的訊息。"
L["Allows you to use the edge for resizing, instead of just the lower right corner."] = "允許你使邊框重置大小,而不只是右下角。"
L["alt2"] = "分身2"
L["alt3"] = "分身3"
L["Alt-click name to invite"] = "使用Alt+左鍵邀請"
L["Alt Linking"] = "分身連結"
L["Alt note fallback"] = "依照分身註記"
L["Are you sure you want to delete all your saved class/level data?"] = "你確定要刪除所有你已儲存的職業/等級資料?"
L["Attach edit box to..."] = "依附輸入框到……"
L["Attach to..."] = "依附到……"
L["Automatically turns on chat logging."] = "自動啟用內建的聊天紀錄功能。"
L["Automatic Whisper Windows"] = "自動悄悄話視窗"
L["Background color"] = "背景顏色"
L["Background Inset"] = "背景邊距"
L["Background texture"] = "背景材質"
L["Battleground"] = "戰場"
L["Battleground Leader"] = "戰場隊長"
L["Border color"] = "邊框顏色"
L["Borders/Background"] = "邊框/背景"
L["Border texture"] = "邊框材質"
L["Bottom"] = ""
L["Button Height"] = "按鈕高度"
L["Button's height, and text offset from the frame"] = "按鈕的高度,以及框架文字的偏移量"
L["Center"] = ""
L["Channel Colors"] = "頻道顏色"
L["Channel Names"] = "頻道名稱"
L["Character to use between the name and level"] = "角色可使用名稱及等級"
L["Character to use for the left bracket"] = "角色使用的左括號"
L["Character to use for the right bracket"] = "角色使用的右括號"
L["Chat Autolog"] = "聊天自動紀錄"
L["Chat Font"] = "聊天字型"
L["Chat Frame "] = "聊天框架"
L["Chat Link"] = "聊天連結"
L["Chat Tabs"] = "聊天標籤"
L["Chatter"] = "Chatter"
L["Chatter Settings"] = "Chatter 設定"
L["Choose which chat frames display timestamps"] = "選擇的聊天框架顯示時間標籤"
L["Class"] = "職業"
L["Color border by channel"] = "依照頻道著色邊框"
L["Color level by difficulty"] = "依照等級差著色等級"
L["Color own charname in messages."] = "在訊息中著色自己的角色名稱"
L["Color Player Names By..."] = "用……著色玩家名字"
L["Color self in messages"] = "自我的訊息著色"
L["Color timestamps the same as the channel they appear in."] = "依照時間標籤所在的頻道,用頻道顏色為其著色。"
L["Combat Log Fix"] = "戰鬥紀錄修正"
L["Configure"] = "設定"
L["Copy Chat"] = "聊天複製"
L["Copy text from this frame."] = "從此聊天框複製文字"
L["Custom channels"] = "自定義頻道"
L["Custom Channels"] = "自定義頻道"
L["Custom Channel Sounds"] = "自定義頻道的音效"
L["Custom color"] = "自定義顏色"
L["Custom format (advanced)"] = "自定義格式(限高級用戶)"
L["Death Knight"] = "死亡騎士"
L["Destroys all your saved class/level data"] = "清空全部你所儲存的職業/等級資料"
L["Disable Buttons"] = "停用按鈕"
L["Disabled"] = "已停用"
L["Disable Fading"] = "停用淡出"
L["Disable server side storage of chat frame position and size."] = "停用伺服器端儲存的聊天框定位與大小。"
L["Druid"] = "德魯伊"
L["Dungeon Guide"] = "地城嚮導"
L["Edge Size"] = "邊框大小"
L["Edit Box History"] = "輸入訊息歷史"
L["Edit Box Polish"] = "輸入框美化"
L["Emote"] = "表情"
L["Emphasize self in messages"] = "在訊息中強調自己"
L["$$EMPTY$$"] = "$$EMPTY$$"
L["Enable"] = "啟用"
L["Enable "] = "啟用"
L["Enable borders on this frame"] = "啟用框架邊框"
L["Enabled"] = "已啟用"
L["Enable Scrollback length modification"] = "啟用捲動長度修改"
L["Enables the Tab to flash when you miss a message"] = "啟用當你錯過訊息時標籤閃爍"
L["Enables the /tt command to send a tell to your target."] = "使用/tt命令發送一條密語到目前目標。"
L["Enables you to replace channel names with your own names. You can use '%s' to force an empty string."] = "允許你用自定義的名稱替換掉預設的頻道名稱。你可以強制使用'%s'一個空的字符串。"
L["Enables you to right-click a person's name in chat and set a note on them to be displayed in chat, such as their main character's name. Can also scan guild notes for character names to display, if no note has been manually set."] = "允許你右鍵點擊一個人的名字,設定一個在聊天視窗中顯示的註記,例如他們的本尊的名字。"
L["Enables you to set a custom font and font size for your chat frames"] = "啟用你為聊天視窗自定字型及大小"
L["Enable Tab Flashing"] = "啟用標籤閃爍"
L["Enable text justification"] = "啟用文字對齊"
L["Enter a custom time format. See http://www.lua.org/pil/22.1.html for a list of valid formatting symbols."] = "自定義時間格式。可以參考 http://www.lua.org/pil/22.1.html 以查看都有哪些格式化符號可以使用。"
L["Exclude level display for max level characters"] = "將最高等級的角色排除在外"
L["Exclude max levels"] = "排除最高等級"
L["Font"] = "字型"
L["Font Outline"] = "字型輪廓線"
L["Font outlining"] = "字型輪廓法"
L["Font size"] = "字型大小"
L["Free-floating"] = "自由浮動"
L["Free-floating, Locked"] = "自由浮動 - 已鎖定"
L["Friends"] = "好友"
L["Gives you finer control over the chat frame's background and border colors"] = "使你能更好地控制聊天框的背景和邊框顏色"
L["Gives you more flexibility in how you invite people to your group."] = "使你更有彈性的邀請別人加入你的團體。"
L["Group"] = "團體"
L["Group Say (/gr)"] = "團體發言(/gr)"
L["Guild"] = "公會"
-- L["(|HBNplayer.-|h) whispers:"] = "(|HBNplayer.-|h) whispers:"
L["HH:MM (12-hour)"] = "時:分 (12小時制)"
L["HH:MM (24-hour)"] = "時:分 (24小時制)"
L["HH:MM:SS (24-hour)"] = "時:分:秒 (24小時制)"
L["HH:MM:SS AM (12-hour)"] = "時:分:秒 上午 (12小時制)"
L["Hides chat frame tabs"] = "隱藏聊天框架標籤"
L["Hides the buttons attached to the chat frame"] = "隱藏依附在聊天框的按鈕"
L["Hide Tabs"] = "隱藏標籤"
L["Highlights"] = "高亮"
L["How many lines to scroll per mouse wheel click"] = "每次滾輪滾動要捲動多少行"
L["(|Hplayer.-|h) whispers:"] = "(|Hplayer.-|h) 悄悄地說:"
L["Hunter"] = "獵人"
L["^(.-|h) whispers:"] = "^(.-|h)悄悄地說:"
L["If no name can be found for an 'alt' rank character, use entire note"] = "若註記中沒有看到'分身'的字眼,則使用完整註記"
L["Include level"] = "包含等級"
L["Include the player's level"] = "包含玩家的等級"
L["inv"] = ""
L["invite"] = "組我"
L["Invite Links"] = "邀請連結"
L["Keeps your channel colors by name rather than by number."] = "為頻道著色的是名稱而不是數字。"
L["Left"] = ""
L["Left Bracket"] = "左括號"
L["Lets you alt-click player names to invite them to your party."] = "讓你可用alt+點擊玩家名稱邀請加入你的隊伍。"
L["Lets you copy text out of your chat frames."] = "讓你可從聊天框中複製訊息。"
L["Lets you copy URLs out of chat."] = "讓你可從聊天框中複製網址。"
L["Lets you customize the position and look of the edit box"] = "讓你自定輸入框的外觀和位置"
L["Lets you link items, enchants, spells, talents, achievements and quests in custom channels."] = "讓你能夠在自定頻道裡連結物品,附魔,法術以及任務。"
L["Lets you set the justification of text in your chat frames."] = "讓你設定你的聊天框文字如何對齊。"
L["Lets you set the scrollback length of your chat frames."] = "讓你設定聊天視窗的捲動長度。"
L["Lets you use the mousewheel to page up and down chat."] = "讓你使用滑鼠滾輪進行聊天記錄中捲動。"
L["Level Options"] = "等級選項"
L["Link Hover"] = "連結懸停"
L["LookingForGroup"] = "尋求組隊"
L["Look in guildnotes for character names, unless a note is set manually"] = "如果不手動設定註記,則查詢公會註記來比對角色名稱"
L["Mage"] = "法師"
L["Makes channels you select sticky."] = "使你所選擇的頻道成為固定的輸入頻道。"
L["Makes link tooltips show when you hover them in chat."] = "當你將滑鼠懸停在連結上時顯示其提示訊息。"
L["Makes old text disappear rather than fade out"] = "使過期訊息立刻消失而不是慢慢淡出"
L["Make %s sticky"] = "固定%s頻道"
L["Message Split"] = "訊息分割"
L["MM:SS"] = "分:秒"
L["Module"] = "模組"
L["Modules"] = "模組"
L["Mousewheel Scroll"] = "滑鼠滾輪滾動"
L["Move the Toast X offset to ChatFrame1"] = "移動祝詞X偏移量到聊天框1"
L["Move the Toast Y offset, relative to ChatFrame1"] = "移動祝詞Y偏移量相對到聊天框1"
L["Name"] = "名字"
L["Name color"] = "名字顏色"
L["None"] = ""
L["Officer"] = "幹部"
L["Open a standalone config window. You might consider installing |cffffff00BetterBlizzOptions|r to make the Blizzard UI options panel resizable."] = "打開一個獨立的設定視窗。你也許希望使用|cffffff00BetterBlizzOptions|r插件使得BZ的選項視窗可以調整大小。"
L["Options"] = "選項"
L["Other Channels"] = "其他頻道"
L["Paladin"] = "聖騎士"
L["Party"] = "隊伍"
L["Per chat frame settings"] = "各聊天框設定"
L["Play a soundfile when one of your keywords is said."] = "當出現你所設定的關鍵字時播放音效"
L["Play a sound when a message is received in this channel"] = "當此頻道有新訊息時播放音效"
L["Player Names"] = "玩家名字"
L["Priest"] = "牧師"
L["Profiles"] = "設定檔"
L["Provides a /gr slash command to let you speak in your group (raid, party, or battleground) automatically."] = "允許你使用/gr命令自動依照你目前的隊伍情況,使用在對應的頻道(團隊,隊伍或者戰場)裡。"
L["Provides options to color player names, add player levels, and add tab completion of player names."] = "為玩家名字著色,新增玩家的等級,以及新增Tab自動完成輸入玩家名字提供選項。"
L["Raid"] = "團隊"
L["Raid Leader"] = "團隊隊長"
L["Raid Warning"] = "團隊警告"
L["RealID Conversation"] = "真實ID對話"
L["RealID Polish"] = "真實ID美化"
L["RealID Whisper"] = "真實ID悄悄話"
L["Remembers the history of the editbox across sessions."] = "本功能會自動記憶您輸入過的訊息。"
L["Remove a word from your highlight list"] = "從你的高亮列表中移除關鍵字"
L["Remove a word from your invite trigger list"] = "從你的邀請觸發列表中移除關鍵字"
L["Remove this word from your highlights?"] = "確定要從你的高亮列表中移除這個關鍵字嗎?"
L["Remove this word from your trigger list?"] = "確定要從你的邀請觸發列表中移除這個關鍵字嗎?"
L["Remove Word"] = "移除關鍵字"
L["Replace this channel name with..."] = "將頻道名稱替換為……"
L["Requires the Alt key to be held down to move the cursor in chat"] = "在文字間移動光標的時候需要按住Alt鍵"
L["Reroute whole message to SCT"] = "將對話顯示至SCT"
L["Reroute whole message to SCT instead of just displaying 'who said keyword in channel'"] = "將'誰在頻道中說了關鍵字'改為顯示整句對話至SCT"
L["Reset Data"] = "重置資料"
L["Resize this border to fit the new combat log"] = "調整此邊框以適應新的戰鬥紀錄"
L["Right"] = ""
L["Right Bracket"] = "右括號"
L["Rogue"] = "盜賊"
L["Save all /who data"] = "儲存所有人物查詢(/who)的資料"
L["Save class data from friends between sessions."] = "從好友對話中儲存職業資料。"
L["Save class data from groups between sessions."] = "從團體對話中儲存職業資料。"
L["Save class data from guild between sessions."] = "從公會對話中儲存職業資料。"
L["Save class data from target/mouseover between sessions."] = "從目標/滑鼠懸停對話中儲存職業資料。"
L["Save class data from /who queries between sessions."] = "在對話中儲存/who查詢的職業資料。"
L["Save Data"] = "儲存資料"
L["Save data between sessions. Will increase memory usage"] = "在對話中儲存資料這將會增加記憶體使用量"
L["Say"] = ""
L["Scrollback"] = "捲動"
L["Scroll lines"] = "滾動行數"
L["Select a color for this channel"] = "為該頻道選擇一個顏色"
L["Select a method for coloring player names"] = "選擇為玩家名字著色的方式"
L["Select the custom color to use for alt names"] = "為分身名字選擇自定義顏色"
L["Select the font to use for the edit box"] = "設置輸入框裡面的文字字型"
L["Separator"] = "分隔線"
L["Server Positioning"] = "伺服器定位中"
L["Set Main"] = "設定本尊"
L["Sets the frame's border color to the color of your currently active channel"] = "依照你當前使用的頻道來給框架邊框上色"
L["Set the coloring mode for alt names"] = "設定分身名字的顏色模式"
L["Settings"] = "設置"
L["Shaman"] = "薩滿"
L["Show bottom button when scrolled up"] = "當滾上去時顯示底部按鈕"
L["Show bottom when scrolled"] = "當滾動時顯示底部"
L["Show copy icon"] = "顯示複製圖示"
L["Show highlights in your SCT mod"] = "在SCT插件裡顯示你的高亮訊息"
L["Show SCT message"] = "顯示SCT訊息"
L["Show Toast Icons"] = "顯示祝詞圖示"
L["Show toast icons in the chat frames"] = "在聊天視窗顯示祝詞圖示"
L["Sound File"] = "音效檔案"
L["Sound file to play"] = "要播放的音效檔案"
L["%s said '%s' in %s"] = "%s說「%s」(於%s)"
L["[%s] %s: %s"] = "[%s] %s: %s"
L["Standalone Config"] = "獨立設定"
L["Sticky Channels"] = "固定頻道"
L["Target/Mouseover"] = "目標/滑鼠懸停"
L["Tell Target (/tt)"] = "密語目標(/tt)"
L["Test"] = "測試"
L["Text Justification"] = "文字對齊"
L["Tile Size"] = "背景塊大小"
L["Timestamp color"] = "時間標籤顏色"
L["Timestamp format"] = "時間標籤格式"
L["Timestamps"] = "時間標籤"
L["Tiny Chat"] = "迷你視窗"
L["^To "] = "^發送給"
L["Toast X offset"] = "祝詞X偏移量"
L["Toast Y offset"] = "祝詞Y偏移量"
-- L["To <Away>(|HBNplayer.-|h):"] = "To <Away>(|HBNplayer.-|h):"
-- L["To <Busy>(|HBNplayer.-|h):"] = "To <Busy>(|HBNplayer.-|h):"
L["Toggle the copy icon on the chat frame."] = "切換聊天框上的複製圖示。"
L["^To (.-|h):"] = "^發送給(.-|h):"
-- L["To (|HBNplayer.-|h):"] = "To (|HBNplayer.-|h):"
L["To (|Hplayer.-|h):"] = "給 (|Hplayer.-|h):"
L["Top"] = ""
L["Trade -"] = "交易 -"
L["URL Copy"] = "網址複製"
L["Use Alt key for cursor movement"] = "使用Alt鍵移動光標"
L["Use channel color"] = "使用頻道顏色"
L["Use custom color"] = "使用自定義顏色"
L["Use guildnotes"] = "使用公會註記"
L["Use PlayerNames coloring"] = "使用玩家名字顏色"
L["Use sound"] = "使用音效"
L["Use Tab Complete"] = "使用Tab鍵自動完成"
L["Use tab key to automatically complete character names."] = "使用Tab鍵自動完成玩家名字。"
L["Warlock"] = "術士"
L["Warrior"] = "戰士"
L["Welcome to Chatter! Type /chatter to configure."] = "歡迎使用Chatter!輸入/chatter命令進行設置。"
L["Whisper"] = "悄悄話"
L["Who"] = "查詢"
L["Who is %s's main?"] = "誰是%s的本尊?"
L["Will save all data for large /who queries"] = "將人物查詢(/who)儲存為大型的資料庫"
L["Yell"] = "大喊"
+135
View File
@@ -0,0 +1,135 @@
local mod = Chatter:NewModule("All Edge resizing","AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["All Edge resizing"]
function mod:Info()
return L["Allows you to use the edge for resizing, instead of just the lower right corner."]
end
local anchorPoints = { "TopLeft", "TopRight", "BottomLeft", "BottomRight", "Top", "Right", "Left", "Bottom" }
function mod:OnInitialize()
end
local function ChatFrame_StartResizing(self)
local chatFrame = self:GetParent()
if chatFrame.isLocked then return end
if chatFrame.isDocked and chatFrame ~= DEFAULT_CHAT_FRAME then return end
chatFrame.resizing = 1
chatFrame:StartSizing(self.anchorPoint)
end
local function ChatFrame_StopResizing(self)
local chatFrame = self:GetParent()
chatFrame:StopMovingOrSizing()
if chatFrame == DEFAULT_CHAT_FRAME then
FCF_DockUpdate()
end
chatFrame.resizing = nil
FCF_SavePositionAndDimensions(chatFrame);
end
function mod:SetChatWindowLocked(index, locked, ...)
local f = _G["ChatFrame" .. index]
for _, v in ipairs(anchorPoints) do
local k = "resize" .. v
if f[k] then
f[k]:EnableMouse(not locked)
end
end
return self.hooks.SetChatWindowLocked(index, locked, ...)
end
function mod:MakeResizers(frame)
local f = frame
if not f.resizeTopLeft then
f.background = _G[("ChatFrame%dBackground"):format(frame:GetID())]
for _, v in ipairs(anchorPoints) do
local k = "resize" .. v
f[k] = CreateFrame("Button", "ChatFrame" .. frame:GetID() .. "Resize" .. v, f)
f[k].anchorPoint = v:upper()
f[k]:SetWidth(16)
f[k]:SetHeight(16)
f[k]:SetScript("OnMouseDown", ChatFrame_StartResizing)
f[k]:SetScript("OnMouseUp", ChatFrame_StopResizing)
LowerFrameLevel(f[k])
end
f.resizeTopLeft:SetPoint("TOPLEFT", f.background, -2, 2)
f.resizeTopRight:SetPoint("TOPRIGHT", f.background, 2, 2)
f.resizeBottomLeft:SetPoint("BOTTOMLEFT", f.background, -2, -3)
f.resizeBottomRight:SetPoint("BOTTOMRIGHT", f.background, 2, -3)
f.resizeTop:SetPoint("LEFT", f.resizeTopLeft, "RIGHT", 0, 0)
f.resizeTop:SetPoint("RIGHT", f.resizeTopRight, "LEFT", 0, 0)
f.resizeRight:SetPoint("TOP", f.resizeTopRight, "BOTTOM", 0, 0)
f.resizeRight:SetPoint("BOTTOM", f.resizeBottomRight, "TOP", 0, 0)
f.resizeBottom:SetPoint("LEFT", f.resizeBottomLeft, "RIGHT", 0, 0)
f.resizeBottom:SetPoint("RIGHT", f.resizeBottomRight, "LEFT", 0, 0)
f.resizeLeft:SetPoint("TOP", f.resizeTopLeft, "BOTTOM", 0, 0)
f.resizeLeft:SetPoint("BOTTOM", f.resizeBottomLeft, "TOP", 0, 0)
else
f.resizeTopLeft:Show()
f.resizeTopRight:Show()
f.resizeBottomLeft:Show()
f.resizeBottomRight:Show()
f.resizeTop:Show()
f.resizeTop:Show()
f.resizeRight:Show()
f.resizeRight:Show()
f.resizeBottom:Show()
f.resizeBottom:Show()
f.resizeLeft:Show()
f.resizeLeft:Show()
end
end
function mod:HideResizers(f)
f.resizeTopLeft:Hide()
f.resizeTopRight:Hide()
f.resizeBottomLeft:Hide()
f.resizeBottomRight:Hide()
f.resizeTop:Hide()
f.resizeTop:Hide()
f.resizeRight:Hide()
f.resizeRight:Hide()
f.resizeBottom:Hide()
f.resizeBottom:Hide()
f.resizeLeft:Hide()
f.resizeLeft:Hide()
end
function mod:OnEnable()
for i = 1, NUM_CHAT_WINDOWS do
local f = _G[("ChatFrame%d"):format(i)]
self:MakeResizers(f)
local b = _G[("ChatFrame%dResizeButton"):format(i)]
b:SetScript("OnShow", b.Hide)
b:Hide()
end
for index,name in ipairs(self.TempChatFrames) do
local f = _G[name]
self:MakeResizers(f)
local b = _G[("ChatFrame%dResizeButton"):format(f:GetID())]
b:SetScript("OnShow", b.Hide)
b:Hide()
end
self:RawHook("SetChatWindowLocked",true)
end
function mod:OnDisable()
for i = 1, NUM_CHAT_WINDOWS do
local f = _G["ChatFrame"..i]
self:HideResizers(f)
local b = _G[("ChatFrame%dResizeButton"):format(f:GetID())]
b:SetScript("OnShow", b.Show)
b:Show()
end
for index,name in ipairs(self.TempChatFrames) do
local f = _G[name]
self:HideResizers(f)
local b = _G[("ChatFrame%dResizeButton"):format(f:GetID())]
b:SetScript("OnShow", b.Show)
b:Show()
end
self:UnhookAll()
end
+352
View File
@@ -0,0 +1,352 @@
local mod = Chatter:NewModule("Alt Linking", "AceHook-3.0", "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Alt Linking"]
local NAMES
local GUILDNOTES
local pairs = _G.pairs
local select = _G.select
local setmetatable = _G.setmetatable
local tinsert = _G.tinsert
local tremove = _G.tremove
local type = _G.type
local unpack = _G.unpack
local strlower= _G.string.lower
local gmatch = _G.string.gmatch
local leftBracket, rightBracket
local defaults = {
realm = {},
profile = {
guildNotes=true,
altNotesFallback=true,
colorMode = "COLOR_MOD",
color = {0.6, 0.6, 0.6},
leftBracket = "[",
rightBracket = "]",
}
}
local colorModes = {
COLOR_MOD = L["Use PlayerNames coloring"],
CUSTOM = L["Use custom color"],
CHANNEL = L["Use channel color"]
}
local customColorNames = setmetatable({}, {
__index = function(t, v)
local r, g, b = unpack(mod.db.profile.color)
t[v] = ("|cff%02x%02x%02x%s|r"):format(r * 255, g * 255, b * 255, v)
return t[v]
end
})
local options
function mod:GetOptions()
options = options or {
guildNotes = {
order=100,
type = "toggle",
name = L["Use guildnotes"],
desc = L["Look in guildnotes for character names, unless a note is set manually"],
get = function()
return mod.db.profile.guildNotes
end,
set = function(info, v)
mod.db.profile.guildNotes = v
mod:EnableGuildNotes(v)
end,
},
altNotesFallback = {
order=101,
type = "toggle",
name = L["Alt note fallback"],
desc = L["If no name can be found for an 'alt' rank character, use entire note"],
disabled = function()
return not mod.db.profile.guildNotes
end,
get = function()
return mod.db.profile.altNotesFallback
end,
set = function(info, v)
mod.db.profile.altNotesFallback = v
mod:ScanGuildNotes()
end,
},
colorMode = {
order=110,
type = "select",
name = L["Name color"],
desc = L["Set the coloring mode for alt names"],
values = colorModes,
get = function()
return mod.db.profile.colorMode
end,
set = function(info, v)
mod.db.profile.colorMode = v
end
},
color = {
order=111,
type = "color",
name = L["Custom color"],
desc = L["Select the custom color to use for alt names"],
get = function()
return unpack(mod.db.profile.color)
end,
set = function(info, r, g, b)
mod.db.profile.color[1] = r
mod.db.profile.color[2] = g
mod.db.profile.color[3] = b
for k, v in pairs(customColorNames) do
customColorNames[k] = nil
end
end,
disabled = function() return mod.db.profile.colorMode ~= "CUSTOM" end
},
leftbracket = {
type = "input",
name = L["Left Bracket"],
desc = L["Character to use for the left bracket"],
get = function() return mod.db.profile.leftBracket end,
set = function(i, v)
mod.db.profile.leftBracket = v
leftBracket = v
end
},
rightbracket = {
type = "input",
name = L["Right Bracket"],
desc = L["Character to use for the right bracket"],
get = function() return mod.db.profile.rightBracket end,
set = function(i, v)
mod.db.profile.rightBracket = v
rightBracket = v
end
},
}
return options
end
local accept = function(self, char)
local editBox = _G[this:GetParent():GetName().."EditBox"]
local main = editBox:GetText()
mod:AddAlt(char, main)
this:GetParent():Hide()
end
StaticPopupDialogs['MENUITEM_SET_MAIN'] = {
text = L["Who is %s's main?"],
button1 = TEXT(ACCEPT),
button2 = TEXT(CANCEL),
hasEditBox = 1,
maxLetters = 128,
exclusive = 0,
OnShow = function()
_G[this:GetName().."EditBox"]:SetFocus()
end,
OnHide = function()
if ( _G[this:GetName().."EditBox"]:IsShown() ) then
_G[this:GetName().."EditBox"]:SetFocus();
end
_G[this:GetName().."EditBox"]:SetText("");
end,
OnAccept = accept,
EditBoxOnEnterPressed = accept,
EditBoxOnEscapePressed = function() this:GetParent():Hide() end,
timeout = 0,
whileDead = 1,
hideOnEscape = 1
}
UnitPopupButtons["SET_MAIN"] = {
text = L["Set Main"],
dist = 0,
func = mod.GetMainName
}
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("AltLinks", defaults)
end
function mod:Decorate(frame)
if not self:IsHooked(frame,"AddMessage") then
self:RawHook(frame, "AddMessage", true)
end
end
function mod:OnEnable()
NAMES = self.db.realm
UnitPopupButtons["SET_MAIN"].func = self.GetMainName
tinsert(UnitPopupMenus["SELF"], #UnitPopupMenus["SELF"] - 1, "SET_MAIN")
tinsert(UnitPopupMenus["PLAYER"], #UnitPopupMenus["PLAYER"] - 1, "SET_MAIN")
tinsert(UnitPopupMenus["FRIEND"], #UnitPopupMenus["FRIEND"] - 1, "SET_MAIN")
tinsert(UnitPopupMenus["PARTY"], #UnitPopupMenus["PARTY"] - 1, "SET_MAIN")
self:SecureHook("UnitPopup_ShowMenu")
leftBracket, rightBracket = self.db.profile.leftBracket, self.db.profile.rightBracket
mod:EnableGuildNotes(mod.db.profile.guildNotes)
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
if cf ~= COMBATLOG then
self:RawHook(cf, "AddMessage", true)
end
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
self:RawHook(cf, "AddMessage", true)
end
end
self.colorMod = Chatter:GetModule("Player Class Colors")
end
local types = {"SELF", "PLAYER", "FRIEND", "PARTY"}
function mod:OnDisable()
for j = 1, #types do
local t = types[j]
for i = 1, #UnitPopupMenus[t] do
if UnitPopupMenus[t][i] == "SET_MAIN" then
tremove(UnitPopupMenus[t], i)
break
end
end
end
mod:EnableGuildNotes(false)
end
function mod.GetMainName()
local alt = UIDROPDOWNMENU_INIT_MENU.name
local popup = StaticPopup_Show("MENUITEM_SET_MAIN", alt)
if popup then
popup.data = alt
local editbox = getglobal(popup:GetName().."EditBox")
editbox:SetText(NAMES[alt] or GUILDNOTES[alt] or "")
editbox:HighlightText()
end
end
function mod:UnitPopup_ShowMenu(dropdownMenu, which, unit, name, userData, ...)
for i=1, UIDROPDOWNMENU_MAXBUTTONS do
local button = _G["DropDownList"..UIDROPDOWNMENU_MENU_LEVEL.."Button"..i];
if button.value == "SET_MAIN" then
button.func = UnitPopupButtons["SET_MAIN"].func
end
end
end
function mod:AddAlt(alt, main)
if #main == 0 then
if GUILDNOTES[alt] then
-- let the user store an empty note, meaning "dont show me this main"
else
main = nil
end
end
NAMES[alt] = main
end
local function pName(msg, name)
if name and #name > 0 then
local alt = NAMES[name] or GUILDNOTES[name]
if alt and alt ~= "" then -- empty notes can be stored to override guildnote data
local mode = mod.db.profile.colorMode
if mode == "CUSTOM" then
alt = customColorNames[alt]
elseif mode == "COLOR_MOD" and mod.colorMod and mod.colorMod:IsEnabled() then
alt = mod.colorMod:ColorName(alt)
end
return ("%s%s%s%s"):format( msg, leftBracket, alt, rightBracket )
end
end
return msg
end
function mod:AddMessage(frame, text, ...)
if text and type(text) == "string" then
--text = text:gsub("(|Hplayer:([^:]+)[:%d+]*|h.-|h)", pName)
text = text:gsub("(|Hplayer:([^:]+).-|h.-|h)", pName)
end
return self.hooks[frame].AddMessage(frame, text, ...)
end
function mod:Info()
return L["Enables you to right-click a person's name in chat and set a note on them to be displayed in chat, such as their main character's name. Can also scan guild notes for character names to display, if no note has been manually set."]
end
function mod:EnableGuildNotes(enable)
GUILDNOTES={}
if enable then
mod:RegisterEvent("GUILD_ROSTER_UPDATE")
if IsInGuild() then
GuildRoster()
end
mod:ScanGuildNotes() -- Unfortunately we can't count on GuildRoster() triggering the event if someone else triggered it recently. So we try once at first straight off the bat.
else
mod:UnregisterEvent("GUILD_ROSTER_UPDATE")
end
end
local doscan=true -- always the first time we start up
function mod:GUILD_ROSTER_UPDATE(event,arg1)
-- arg1 gets set for SOME changes to the guild, but notably not for player notes.. doh (unless you're the one editing them yourself)
-- we force a scan when the guild frame is actually visible (i.e. when we know the player is actually interested in seeing changes)
-- i'd like to be able to not have the guildframe check there, but there's plenty of stupid-ass addons that spam GuildRoster() every 10/15/20 seconds, so ... no.
if arg1 or GuildFrame:IsVisible() or doscan then
doscan=false
mod:ScanGuildNotes()
end
if arg1 then
-- but it appears that when arg1 is set, the player note change isn't available yet; that happens on the next arg1=nil update (about 0.1s later), so catch that one too. ghod this is messy.
doscan=true
end
end
function mod:ScanGuildNotes()
if not IsInGuild() then
return
end
--DBG print("Scanning guildnotes!")
--DBG local n,nFallback=0,0
local names = {} -- ["playername"]="Playername" (note lowercase = uppercase) (yes, this works for 'foreign' letters too in WoW, even though it does not in standard Lua)
GUILDNOTES = {} -- Yes, we do want to zap it, otherwise we end up storing notes for people being promoted/demoted through alt ranks and stuff
-- #1: find all names
for i=1,GetNumGuildMembers(true) do
local name = GetGuildRosterInfo(i)
names[strlower(name or "?")] = name
end
-- #2: scan all words in all guild notes, see if a name is mentioned
for i=1,GetNumGuildMembers(true) do
local name, rank, rankIndex, level, class, zone, note, officernote, online, status = GetGuildRosterInfo(i);
local success
for word in gmatch(strlower(note), "[%a\128-\255]+") do
if names[word] then
GUILDNOTES[name] = names[word]
success = true
--DBG n=n+1
break
end
end
if not success and mod.db.profile.altNotesFallback and note~="" then
-- #3: no joy? then if this is an 'alt' rank, use the entire note
rank=strlower(rank)
if strfind(rank, "alt") or
strfind(rank, L["alt2"]) or
strfind(rank, L["alt3"]) then
GUILDNOTES[name] = note
--DBG print("Fallback: ",note)
--DBG nFallback=nFallback+1
end
end
end
--DBG print("Mapped",n,"names and",nFallback,"fallbacks!")
end
+16
View File
@@ -0,0 +1,16 @@
local mod = Chatter:NewModule("Chat Autolog")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Chat Autolog"]
function mod:OnEnable()
self.isLogging = LoggingChat()
LoggingChat(true)
end
function mod:OnDisable()
LoggingChat(self.isLogging)
end
function mod:Info()
return L["Automatically turns on chat logging."]
end
+84
View File
@@ -0,0 +1,84 @@
local mod = Chatter:NewModule("Automatic Whisper Windows", "AceHook-3.0", "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Automatic Whisper Windows"]
function mod:OnEnable()
self:RegisterEvent("CHAT_MSG_WHISPER","ProcessWhisper")
self:RegisterEvent("CHAT_MSG_WHISPER_INFORM","ProcessWhisper")
self:RegisterEvent("CHAT_MSG_BN_WHISPER_INFORM", "ProcessWhisper")
self:RegisterEvent("CHAT_MSG_BN_WHISPER","ProcessWhisper")
end
function mod:OnDisable()
self:UnregisterEvent("CHAT_MSG_WHISPER")
self:UnregisterEvent("CHAT_MSG_WHISPER_INFORM")
self:UnregisterEvent("CHAT_MSG_BNWHISPER")
self:UnregisterEvent("CHAT_MSG_BNWHISPER_INFORM")
end
function mod:AlwaysDecorate(frame)
if not self:IsEnabled() then
local t = frame.chatType
local a = frame.chatTarget
local accessID = ChatHistory_GetAccessID(t, a)
local chatFrame = nil
for i= 1,NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame"..i]
local i = cf:GetNumMessages(accessID)
if i > 0 then
chatFrame = cf
end
end
if chatFrame then
Chatter.loading = true
for i = 1, chatFrame:GetNumMessages(accessID) do
local text, accessID, lineID, extraData = chatFrame:GetMessageInfo(i, accessID);
local cType, cTarget = ChatHistory_GetChatType(extraData);
local info = ChatTypeInfo[cType];
frame:AddMessage(text, info.r, info.g, info.b, lineID, false, accessID, extraData);
end
Chatter.loading = false
end
end
end
function mod:ProcessWhisper(event,message,sender,language,channelString,target,flags,arg7,arg8,...)
-- Do we have a temp window already for this target
local type = "WHISPER"
if event == "CHAT_MSG_BN_WHISPER" or event == "CHAT_MSG_BN_WHISPER_INFORM" then
type = "BN_WHISPER"
end
if FCFManager_GetNumDedicatedFrames(type, sender) == 0 then
local chatFrame = nil
local foundSrc = false
local accessID = ChatHistory_GetAccessID(type, sender)
for i= 1,NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame"..i]
if not foundSrc then
for i = 1, cf:GetNumMessages(accessID) do
chatFrame = cf
foundSrc = true
end
end
end
if not chatFrame then
return true
end
Chatter.loading = true
local t = FCF_OpenTemporaryWindow(type, sender, chatFrame, true)
-- lets hand copy the shit over
for i = 1, chatFrame:GetNumMessages(accessID) do
local text, accessID, lineID, extraData = chatFrame:GetMessageInfo(i, accessID);
local cType, cTarget = ChatHistory_GetChatType(extraData);
local info = ChatTypeInfo[cType];
t:AddMessage(text, info.r, info.g, info.b, lineID, false, accessID, extraData);
end
Chatter.loading = false
-- was a fix for an issue in the editbox, no longer needed
--for i=1,NUM_CHAT_WINDOWS do
-- local cf = _G["ChatFrame"..i.."EditBox"]
-- cf:Show()
--end
end
end
+131
View File
@@ -0,0 +1,131 @@
-- Strip icons like |TInterface\\FriendsFrame\\UI-Toast-ToastIcons.tga:16:16:0:0:128:64:2:29:34:61
local mod = Chatter:NewModule("BNet", "AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["RealID Polish"]
local defaults = {
profile = {
toastx = 0,
toasty = 0,
showToast = false
}
}
local options
function mod:GetOptions()
options = options or {
showToastIcons = {
order=100,
type = "toggle",
name = L["Show Toast Icons"],
desc = L["Show toast icons in the chat frames"],
get = function()
return mod.db.profile.showToast
end,
set = function(info, v)
mod.db.profile.showToast = v
end,
},
toastWindowXoffset = {
order=101,
type = "range",
min = -4000,
max = 4000,
name = L["Toast X offset"],
desc = L["Move the Toast X offset to ChatFrame1"],
step = 1,
bigStep = 1,
get = function()
return mod.db.profile.toastx
end,
set = function(info, v)
mod.db.profile.toastx = v
mod:UpdateToastOffsets()
end,
},
toastWindowYoffset = {
order=102,
type = "range",
min = -4000,
max = 4000,
name = L["Toast Y offset"],
desc = L["Move the Toast Y offset, relative to ChatFrame1"],
step = 1,
bigStep = 1,
get = function()
return mod.db.profile.toasty
end,
set = function(info, v)
mod.db.profile.toasty = v
mod:UpdateToastOffsets()
end,
},
testToast = {
order=103,
name = L["Test"],
type = "execute",
func = function() BNToastFrame_AddToast(BN_TOAST_TYPE_NEW_INVITE) end,
}
}
return options
end
function mod:UpdateToastOffsets()
if self:IsEnabled() then
local cf = DEFAULT_CHAT_FRAME
local bside = cf.buttonSide
local cfTop = cf.buttonFrame:GetTop() or 0
local bnH = BNToastFrame:GetHeight() or 0
local offscreen = cfTop + bnH + BN_TOAST_TOP_OFFSET + BN_TOAST_TOP_BUFFER > GetScreenHeight();
BN_TOAST_LEFT_OFFSET = 1 + self.db.profile.toastx
if bside == "right" then
BN_TOAST_RIGHT_OFFSET = -1 + self.db.profile.toastx
end
BN_TOAST_TOP_OFFSET = 40 + self.db.profile.toasty
if offscreen then
BN_TOAST_BOTTOM_OFFSET = -12 + self.db.profile.toasty
end
BNToastFrame_UpdateAnchor(true)
end
end
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("RealIdPolish", defaults)
end
function mod:OnDisable()
self:UnhookAll()
BN_TOAST_TOP_OFFSET = 40
BN_TOAST_BOTTOM_OFFSET = -12
BN_TOAST_RIGHT_OFFSET = -1
BN_TOAST_LEFT_OFFSET = 1
BN_TOAST_TOP_BUFFER = 20
BN_TOAST_MAX_LINE_WIDTH = 196
end
function mod:OnEnable()
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
if cf ~= COMBATLOG then
self:RawHook(cf, "AddMessage", true)
end
end
self:Hook("BNToastFrame_Close",true)
self:UpdateToastOffsets()
end
function mod:BNToastFrame_Close()
self:UpdateToastOffsets()
end
function mod:ParseLinks(text)
if not text then return nil end
if mod.db.profile.showToast then return text end
text = gsub(text, "(|TInterface(.*)ToastIcons.tga([:%d]*)|t)", "")
return text
end
function mod:AddMessage(frame, text, ...)
return self.hooks[frame].AddMessage(frame, mod:ParseLinks(text), ...)
end
+234
View File
@@ -0,0 +1,234 @@
local mod = Chatter:NewModule("Disable Buttons", "AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Disable Buttons"]
local fmt = _G.string.format
local function hide(self)
if not self.override then
self:Hide()
end
self.override = nil
end
local options = {
bottomButton = {
type = "toggle",
name = L["Show bottom when scrolled"],
desc = L["Show bottom button when scrolled up"],
width = "double",
get = function()
return mod.db.profile.scrollReminder
end,
set = function(info, v)
mod.db.profile.scrollReminder = v
if v then
mod:EnableBottomButton()
else
mod:DisableBottomButton()
end
end
}
}
local bottomButtons = {}
local defaults = { profile = {} }
local clickFunc = function(self) self:GetParent():ScrollToBottom() end
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("Buttons", defaults)
for i = 1, NUM_CHAT_WINDOWS do
local f = _G["ChatFrame" .. i]
local button = CreateFrame("Button", nil, f)
button:SetNormalTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollEnd-Up]])
button:SetPushedTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollEnd-Down]])
button:SetDisabledTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollEnd-Disabled]])
button:SetHighlightTexture([[Interface\Buttons\UI-Common-MouseHilight]])
button:SetWidth(20)
button:SetHeight(20)
button:SetPoint("TOPRIGHT", f, "TOPRIGHT", 0, 0)
button:SetScript("OnClick", clickFunc)
button:Hide()
f.downButton = button
end
self:SecureHook("FCF_RestorePositionAndDimensions")
end
function mod:Decorate(frame)
local button = CreateFrame("Button", nil, frame)
button:SetNormalTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollEnd-Up]])
button:SetPushedTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollEnd-Down]])
button:SetDisabledTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollEnd-Disabled]])
button:SetHighlightTexture([[Interface\Buttons\UI-Common-MouseHilight]])
button:SetWidth(20)
button:SetHeight(20)
button:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, 0)
button:SetScript("OnClick", clickFunc)
button:Hide()
frame.downButton = button
-- Adjust the menu buttons
self:ApplyFrameChanges(frame)
if(self.db.profile.scrollReminder) then self:ApplyBottomButton(frame) end
end
function mod:FCF_RestorePositionAndDimensions(chatFrame)
if Chatter.db.profile.modules[mod:GetName()] then
chatFrame:SetClampRectInsets(0, 0, 0, 0)
end
end
-- Fix the jump in
for i = 1, NUM_CHAT_WINDOWS do
local f = _G["ChatFrame" .. i]
f:SetClampRectInsets(0, 0, 0, 0)
end
function mod:ApplyFrameChanges(f)
f:SetClampRectInsets(0, 0, 0, 0)
local ff = _G[f:GetName() .. "ButtonFrame"]
ff:Hide()
ff:SetScript("OnShow", hide)
end
function mod:OnEnable()
ChatFrameMenuButton:Hide()
ChatFrameMenuButton:SetScript("OnShow", hide)
FriendsMicroButton:Hide()
FriendsMicroButton:SetScript("OnShow", hide)
for i = 1, NUM_CHAT_WINDOWS do
local f = _G["ChatFrame" .. i]
self:ApplyFrameChanges(f)
end
if(self.db.profile.scrollReminder) then self:EnableBottomButton() end
for index,frame in ipairs(self.TempChatFrames) do
local f = _G[frame]
self:ApplyFrameChanges(f)
end
end
function mod:UnDecorate(frame)
frame:SetClampRectInsets(-35, 35, 26, -50)
-- Reset the postion so if the buttons were offscreen frame goes to where it should be
if frame:IsMovable() then
FCF_RestorePositionAndDimensions(frame)
end
local ff = _G[frame:GetName() .. "ButtonFrame"]
ff:Show()
ff:SetScript("OnShow", nil)
end
function mod:OnDisable()
ChatFrameMenuButton:Show()
ChatFrameMenuButton:SetScript("OnShow", nil)
FriendsMicroButton:Show()
FriendsMicroButton:SetScript("OnShow", nil)
self:DisableBottomButton()
for i = 1, NUM_CHAT_WINDOWS do
local f = _G["ChatFrame" .. i]
self:UnDecorate(f)
end
for index,frame in ipairs(self.TempChatFrames) do
local f = _G[frame]
self:UnDecorate(f)
end
end
function mod:Info()
return L["Hides the buttons attached to the chat frame"]
end
function mod:ApplyBottomButton(frame)
if self:IsHooked(frame,"ScrollUp") then
return nil
end
self:Hook(frame, "ScrollUp", true)
self:Hook(frame, "ScrollToTop", "ScrollUp", true)
self:Hook(frame, "PageUp", "ScrollUp", true)
self:Hook(frame, "ScrollDown", true)
self:Hook(frame, "ScrollToBottom", "ScrollDownForce", true)
self:Hook(frame, "PageDown", "ScrollDown", true)
if frame:GetCurrentScroll() ~= 0 then
frame.downButton:Show()
end
if frame ~= COMBATLOG then
self:Hook(frame, "AddMessage", true)
end
end
function mod:EnableBottomButton()
if self.buttonsEnabled then return end
self.buttonsEnabled = true
for i = 1, NUM_CHAT_WINDOWS do
local f = _G["ChatFrame" .. i]
if f then
self:ApplyBottomButton(f)
end
end
for index,frame in ipairs(self.TempChatFrames) do
local f = _G[frame]
if f then
self:ApplyBottomButton(f)
end
end
end
function mod:UnApplyBottomButton(f)
self:Unhook(f, "ScrollUp")
self:Unhook(f, "ScrollToTop")
self:Unhook(f, "PageUp")
self:Unhook(f, "ScrollDown")
self:Unhook(f, "ScrollToBottom")
self:Unhook(f, "PageDown")
if f ~= COMBATLOG then
self:Unhook(f, "AddMessage")
end
f.downButton:Hide()
end
function mod:DisableBottomButton()
if not self.buttonsEnabled then return end
self.buttonsEnabled = false
for i = 1, NUM_CHAT_WINDOWS do
local f = _G["ChatFrame" .. i]
if f then
self:UnApplyBottomButton(f)
end
end
for index,frame in ipairs(self.TempChatFrames) do
local f = _G[frame]
if f then
self:UnApplyBottomButton(f)
end
end
end
function mod:ScrollUp(frame)
frame.downButton:Show()
frame.downButton:UnlockHighlight()
end
function mod:ScrollDown(frame)
if frame:GetCurrentScroll() == 0 then
frame.downButton:Hide()
frame.downButton:UnlockHighlight()
end
end
function mod:ScrollDownForce(frame)
frame.downButton:Hide()
frame.downButton:UnlockHighlight()
end
function mod:AddMessage(frame, text, ...)
if frame:GetCurrentScroll() > 0 then
frame.downButton:Show()
frame.downButton:LockHighlight()
else
frame.downButton:Hide()
frame.downButton:UnlockHighlight()
end
end
function mod:GetOptions()
return options
end
+114
View File
@@ -0,0 +1,114 @@
local mod = Chatter:NewModule("Channel Colors", "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Channel Colors"]
local GetChannelList = _G.GetChannelList
local GetChannelName = _G.GetChannelName
local GetMessageTypeColor = _G.GetMessageTypeColor
local select = _G.select
local tonumber = _G.tonumber
local type = _G.type
function mod:Info()
return L["Keeps your channel colors by name rather than by number."]
end
local defaults = {
profile = { colors = {} }
}
local options = {
splitter = {
type = "header",
name = L["Other Channels"],
order = 49
}
}
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("ChannelColors", defaults)
end
function mod:OnEnable()
self:RegisterEvent("UPDATE_CHAT_COLOR")
self:RegisterEvent("CHAT_MSG_CHANNEL_NOTICE")
self:AddChannels(GetChannelList())
self:AddChannels(
"SAY", L["Say"],
"YELL", L["Yell"],
"GUILD", L["Guild"],
"OFFICER", L["Officer"],
"PARTY", L["Party"],
"PARTY_LEADER", PARTY_LEADER,
"RAID", L["Raid"],
"RAID_LEADER", L["Raid Leader"],
"RAID_WARNING", L["Raid Warning"],
"BATTLEGROUND", L["Battleground"],
"BATTLEGROUND_LEADER", L["Battleground Leader"],
"WHISPER", L["Whisper"],
"BN_WHISPER", L["RealID Whisper"],
"BN_CONVERSATION", L["RealID Conversation"]
)
end
function mod:AddChannels(...)
for i = 1, select("#", ...), 2 do
local id, name = select(i, ...)
self.db.profile.colors[name] = self.db.profile.colors[name] or {}
if not self.db.profile.colors[name].r then
local r, g, b = GetMessageTypeColor(type(id) == "number" and ("CHANNEL" .. id) or id)
self.db.profile.colors[name].r = r
self.db.profile.colors[name].g = g
self.db.profile.colors[name].b = b
end
if not options[name:gsub(" ", "_")] then
options[name:gsub(" ", "_")] = {
type = "color",
name = name,
desc = L["Select a color for this channel"],
order = type(id) == "number" and (50 + id) or 48,
get = function()
local c = self.db.profile.colors[name]
if c then
return c.r, c.g, c.b
else
return GetMessageTypeColor(type(id) == "number" and ("CHANNEL" .. id) or id)
end
end,
set = function(info, r, g, b)
self.db.profile.colors[name] = self.db.profile.colors[name] or {}
self.db.profile.colors[name].r = r
self.db.profile.colors[name].g = g
self.db.profile.colors[name].b = b
ChangeChatColor(type(id) == "number" and ("CHANNEL" .. id) or id, r, g, b);
end
}
end
end
end
function mod:CHAT_MSG_CHANNEL_NOTICE(evt, notice, _, _, fullname, _, _, channelType, channelNumber, channelName)
if notice == "YOU_JOINED" then
self:AddChannels(GetChannelList())
channelName = channelName:match("^(%w+)")
local c = self.db.profile.colors[channelName]
if c then
ChangeChatColor("CHANNEL" .. channelNumber, c.r, c.g, c.b);
end
end
end
function mod:UPDATE_CHAT_COLOR(evt, chan, r, g, b)
if chan then
local num = tonumber(chan:match("(%d+)$"))
local channelNum = num and select(2, GetChannelName(num))
local name = channelNum and channelNum:match("^(%w+)") or chan
self.db.profile.colors[name] = self.db.profile.colors[name] or {}
self.db.profile.colors[name].r = r
self.db.profile.colors[name].g = g
self.db.profile.colors[name].b = b
end
end
function mod:GetOptions()
return options
end
+199
View File
@@ -0,0 +1,199 @@
local mod = Chatter:NewModule("Channel Names", "AceHook-3.0", "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Channel Names"]
local gsub = _G.string.gsub
local find = _G.string.find
local pairs = _G.pairs
local loadstring = _G.loadstring
local tostring = _G.tostring
local GetChannelList = _G.GetChannelList
local select = _G.select
local empty_tag = L["$$EMPTY$$"];
local defaults = {
profile = {
channels = {
[L["Guild"]] = "[G]",
[L["Officer"]] = "[O]",
[L["Party"]] = "[P]",
[PARTY_LEADER] = "[PL]",
[L["Dungeon Guide"]] = "[DG]",
[L["Raid"]] = "[R]",
[L["Raid Leader"]] = "[RL]",
[L["Raid Warning"]] = "[RW]",
[L["LookingForGroup"]] = "[LFG]",
[L["Battleground"]] = "[BG]",
[L["Battleground Leader"]] = "[BL]",
-- Not localized here intentionally
["Whisper From"] = "[W:From]",
["Whisper To"] = "[W:To]",
["BN Whisper From"] = "[BN:From]",
["BN Whisper To"] = "[BN:To]",
["away BN Whisper To"] = "<Away>[BN:To]",
["busy BN Whisper To"] = "<Busy>[BN:To]"
},
addSpace = true
}
}
local channels
local options = {
splitter = {
type = "header",
name = L["Custom Channels"]
},
addSpace = {
type = "toggle",
name = L["Add space after channels"],
desc = L["Add space after channels"],
get = function() return mod.db.profile.addSpace end,
set = function(info, v) mod.db.profile.addSpace = v end
}
}
local serverChannels = {}
local function excludeChannels(...)
for i = 1, select("#", ...) do
local name = select(i, ...)
serverChannels[name] = true
end
end
local functions = {}
local function addChannel(name)
options[name:gsub(" ", "_")] = {
type = "input",
name = name,
desc = L["Replace this channel name with..."],
order = name:lower() == name and 101 or 98,
get = function()
local v = mod.db.profile.channels[name]
return v == "" and " " or v
end,
set = function(info, v)
mod.db.profile.channels[name] = #v > 0 and v or nil
if v:match("^function%(") then
functions[name] = loadstring("return " .. v)()
else
functions[name] = nil
end
end
}
end
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("ChannelNames", defaults)
self.db.profile.customChannels = nil
for k, _ in pairs(self.db.profile.channels) do
addChannel(k)
end
excludeChannels(EnumerateServerChannels())
for k, v in pairs(serverChannels) do
addChannel(k)
end
self:AddCustomChannels(GetChannelList())
for k, v in pairs(self.db.profile.channels) do
if v:match("^function%(") then
functions[k] = loadstring("return " .. v)()
end
end
end
function mod:AddCustomChannels(...)
for i = 1, select("#", ...), 2 do
local id, name = select(i, ...)
if not serverChannels[name] and not options[name:gsub(" ", "_")] then
options[name:gsub(" ", "_")] = {
type = "input",
name = name,
desc = L["Replace this channel name with..."],
order = id <= 4 and 98 or 101,
get = function()
local v = self.db.profile.channels[name:lower()]
return v == "" and " " or v
end,
set = function(info, v)
self.db.profile.channels[name:lower()] = #v > 0 and v or nil
if v:match("^function%(") then
functions[name:lower()] = loadstring("return " .. v)()
end
end
}
end
end
end
function mod:Decorate(frame)
if not self:IsHooked(frame,"AddMessage") then
self:RawHook(frame, "AddMessage", true)
end
end
function mod:OnEnable()
channels = self.db.profile.channels
self:RegisterEvent("CHAT_MSG_CHANNEL_NOTICE")
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
if cf ~= COMBATLOG then
self:RawHook(cf, "AddMessage", true)
end
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
self:RawHook(cf, "AddMessage", true)
end
end
end
function mod:CHAT_MSG_CHANNEL_NOTICE()
self:AddCustomChannels(GetChannelList())
end
local function replaceChannel(origChannel, msg, num, channel)
local f = functions[channel] or functions[channel:lower()]
local newChannelName = f and f(channel) or channels[channel] or channels[channel:lower()] or msg
if newChannelName == empty_tag then return "" end
return ("|Hchannel:%s|h%s|h%s"):format(origChannel, newChannelName, mod.db.profile.addSpace and " " or "")
end
local function replaceChannelRW(msg, channel)
local f = functions[channel] or functions[channel:lower()]
local newChannelName = f and f(channel) or channels[channel] or channels[channel:lower()] or msg
return newChannelName .. (mod.db.profile.addSpace and " " or "")
end
function mod:AddMessage(frame, text, ...)
if not text then
return self.hooks[frame].AddMessage(frame, text, ...)
end
-- removed the start of check, since blizz timestamps inject themselves in front of the line
if (CHAT_TIMESTAMP_FORMAT) then
text = gsub(text, "|Hchannel:(%S-)|h(%[([%d. ]*)([^%]]+)%])|h ", replaceChannel)
text = gsub(text, "(%[(" .. L["Raid Warning"] .. ")%]) ", replaceChannelRW)
else
text = gsub(text, "^|Hchannel:(%S-)|h(%[([%d. ]*)([^%]]+)%])|h ", replaceChannel)
text = gsub(text, "^(%[(" .. L["Raid Warning"] .. ")%]) ", replaceChannelRW)
end
text = gsub(text, L["To (|Hplayer.-|h):"], mod.db.profile.channels["Whisper To"] .. (mod.db.profile.addSpace and " %1:" or "%1:"))
text = gsub(text, L["(|Hplayer.-|h) whispers:"], mod.db.profile.channels["Whisper From"] .. (mod.db.profile.addSpace and " %1:" or "%1:"))
text = gsub(text, L["To (|HBNplayer.-|h):"], mod.db.profile.channels["BN Whisper To"] .. (mod.db.profile.addSpace and " %1:" or "%1:"))
text = gsub(text, L["To <Away>(|HBNplayer.-|h):"], mod.db.profile.channels["away BN Whisper To"] .. (mod.db.profile.addSpace and " %1:" or "%1:"))
text = gsub(text, L["To <Busy>(|HBNplayer.-|h):"], mod.db.profile.channels["busy BN Whisper To"] .. (mod.db.profile.addSpace and " %1:" or "%1:"))
text = gsub(text, L["(|HBNplayer.-|h) whispers:"], mod.db.profile.channels["BN Whisper From"] .. (mod.db.profile.addSpace and " %1:" or "%1:"))
return self.hooks[frame].AddMessage(frame, text, ...)
end
function mod:GetOptions()
return options
end
function mod:Info()
return L["Enables you to replace channel names with your own names. You can use '%s' to force an empty string."]:format( empty_tag )
end
mod.funcs = functions
+38
View File
@@ -0,0 +1,38 @@
local mod = Chatter:NewModule("Disable Fading")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Disable Fading"]
mod.toggleLabel = L["Disable Fading"]
function mod:Decorate(cf)
cf:SetFading(nil)
end
function mod:OnEnable()
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
cf:SetFading(nil)
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
cf:SetFading(nil)
end
end
end
function mod:OnDisable()
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
cf:SetFading(true)
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
cf:SetFading(true)
end
end
end
function mod:Info()
return L["Makes old text disappear rather than fade out"]
end
+182
View File
@@ -0,0 +1,182 @@
local mod = Chatter:NewModule("Chat Font", "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Chat Font"]
local Media = LibStub("LibSharedMedia-3.0")
local pairs = _G.pairs
local player_entered_world = false
local defaults = {
profile = {
frames = {}
}
}
local outlines = {[""] = "None", ["OUTLINE"] = "Outline", ["THICKOUTLINE"] = "Thick Outline"}
local options = {
font = {
type = "select",
name = L["Font"],
desc = L["Font"],
dialogControl = 'LSM30_Font',
values = Media:HashTable("font"),
get = function() return mod.db.profile.font end,
set = function(info, v)
mod.db.profile.font = v
mod:SetFont(nil, v)
end
},
fontsize = {
type = "range",
name = L["Font size"],
desc = L["Font size"],
min = 4,
max = 30,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.fontsize end,
set = function(info, v)
mod.db.profile.fontsize = v
mod:SetFont(nil, nil, v)
end
},
outline = {
type = "select",
name = L["Font Outline"],
desc = L["Font outlining"],
values = outlines,
get = function() return mod.db.profile.outline or "" end,
set = function(info, v)
mod.db.profile.outline = v
mod:SetFont(nil, nil, nil, v)
end
}
}
function mod:OnInitialize()
for i = 1, NUM_CHAT_WINDOWS do
defaults.profile.frames["FRAME_" .. i] = {}
end
self.db = Chatter.db:RegisterNamespace("ChatFont", defaults)
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
local t = {
type = "group",
name = L["Chat Frame "] .. i,
desc = L["Chat Frame "] .. i,
args = {
fontsize = {
type = "range",
name = L["Font size"],
desc = L["Font size"],
min = 4,
max = 30,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.frames["FRAME_" .. i].fontsize or mod.db.profile.fontsize end,
set = function(info, v)
mod.db.profile.frames["FRAME_" .. i].fontsize = v
mod:SetFont(cf, nil, v)
end
},
font = {
type = "select",
name = L["Font"],
desc = L["Font"],
dialogControl = 'LSM30_Font',
values = Media:HashTable("font"),
get = function() return mod.db.profile.frames["FRAME_" .. i].font or mod.db.profile.font end,
set = function(info, v)
mod.db.profile.frames["FRAME_" .. i].font = v
mod:SetFont(cf, v)
end
},
outline = {
type = "select",
name = L["Font Outline"],
desc = L["Font outlining"],
values = outlines,
get = function() return mod.db.profile.frames["FRAME_" .. i].outline or "" end,
set = function(info, v)
mod.db.profile.frames["FRAME_" .. i].outline = v
mod:SetFont(cf, nil, nil, v)
end
}
}
}
options["frame" .. i] = t
end
end
function mod:LibSharedMedia_Registered()
self:SetFont()
end
function mod:Popout(frame,src)
local fontName, fontHeight, fontFlags = src:GetFont()
frame:SetFont(fontName,fontHeight,fontFlags)
end
function mod:OnEnable()
Media.RegisterCallback(mod, "LibSharedMedia_Registered")
self:LibSharedMedia_Registered()
if not player_entered_world then
self:RegisterEvent("PLAYER_ENTERING_WORLD")
end
end
function mod:PLAYER_ENTERING_WORLD()
self:SetFont()
self:UnregisterAllEvents()
player_entered_world = true
end
function mod:OnDisable()
Media.UnregisterCallback(mod, "LibSharedMedia_Registered")
self:SetFont(nil, "Arial Narrow", 12, "")
end
function mod:SetFont(cf, font, size, outline)
if cf then
self:SetFrameFont(cf, font, size, outline)
else
for i = 1, NUM_CHAT_WINDOWS do
cf = _G["ChatFrame" .. i]
self:SetFrameFont(cf, font, size, outline)
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
self:SetFrameFont(cf, font, size, outline)
end
end
end
end
function mod:SetFrameFont(cf, font, size, outline)
local f = "FRAME_" .. cf:GetName():match("%d+")
local prof = self.db.profile.frames[f]
local profFont = nil
if prof then
profFont = prof.font
else
prof = {}
end
if profFont == "Default" then
profFont = nil
end
local f, s, m = cf:GetFont()
font = Media:Fetch("font", font or profFont or self.db.profile.font or f)
size = size or prof.fontsize or self.db.profile.fontsize or s
outline = outline or prof.outline or self.db.profile.outline or m
cf:SetFont(font, size, outline)
end
function mod:GetOptions()
return options
end
function mod:Info()
return L["Enables you to set a custom font and font size for your chat frames"]
end
+277
View File
@@ -0,0 +1,277 @@
local mod = Chatter:NewModule("Borders/Background")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Borders/Background"]
local Media = LibStub("LibSharedMedia-3.0")
local CreateFrame = _G.CreateFrame
local pairs = _G.pairs
local tinsert = _G.tinsert
local type = _G.type
local options = {
}
local defaults = {
profile = {
frames = {}
}
}
local frame_defaults = {
enable = true,
combatLogFix = false,
background = "Blizzard Tooltip",
border = "Blizzard Tooltip",
inset = 3,
edgeSize = 12,
backgroundColor = { r = 0, g = 0, b = 0, a = 1 },
borderColor = { r = 1, g = 1, b = 1, a = 1 },
}
local function deepcopy(tbl)
local new = {}
for key,value in pairs(tbl) do
new[key] = type(value) == "table" and deepcopy(value) or value -- if it's a table, run deepCopy on it too, so we get a copy and not the original
end
return new
end
local frames = {}
function mod:OnInitialize()
for i = 1, NUM_CHAT_WINDOWS do
defaults.profile.frames["FRAME_" .. i] = deepcopy(frame_defaults)
if _G["ChatFrame" .. i] == COMBATLOG then
defaults.profile.frames["FRAME_" .. i].enable = false
end
end
defaults.profile.frames.FRAME_2.combatLogFix = true
self.db = Chatter.db:RegisterNamespace("ChatFrameBorders", defaults)
Media.RegisterCallback(mod, "LibSharedMedia_Registered")
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
local frame = CreateFrame("Frame", nil, cf, "ChatFrameBorderTemplate")
frame:EnableMouse(false)
cf:SetFrameStrata("LOW")
frame:SetFrameStrata("BACKGROUND")
frame:SetFrameLevel(1)
frame:Hide()
frame.id = "FRAME_" .. i
tinsert(frames, frame)
local t = {
type = "group",
name = L["Chat Frame "] .. i,
desc = L["Chat Frame "] .. i,
args = {
enable = {
type = "toggle",
name = L["Enable"],
desc = L["Enable borders on this frame"],
order = 1,
get = function()
return mod.db.profile.frames[frame.id].enable
end,
set = function(info, v)
mod.db.profile.frames[frame.id].enable = v
if v then
frame:Show()
else
frame:Hide()
end
end
},
combatLogFix = {
type = "toggle",
name = L["Combat Log Fix"],
desc = L["Resize this border to fit the new combat log"],
get = function() return mod.db.profile.frames[frame.id].combatLogFix end,
set = function(info, v)
mod.db.profile.frames[frame.id].combatLogFix = v
mod:SetAnchors(frame, v)
end
},
background = {
type = "select",
name = L["Background texture"],
desc = L["Background texture"],
dialogControl = "LSM30_Background",
values = Media:HashTable("background"),
get = function() return mod.db.profile.frames[frame.id].background end,
set = function(info, v)
mod.db.profile.frames[frame.id].background = v
mod:SetBackdrop(frame)
end
},
border = {
type = "select",
name = L["Border texture"],
desc = L["Border texture"],
dialogControl = "LSM30_Border",
values = Media:HashTable("border"),
get = function() return mod.db.profile.frames[frame.id].border end,
set = function(info, v)
mod.db.profile.frames[frame.id].border = v
mod:SetBackdrop(frame)
end
},
backgroundColor = {
type = "color",
name = L["Background color"],
desc = L["Background color"],
hasAlpha = true,
get = function()
local c = mod.db.profile.frames[frame.id].backgroundColor
return c.r, c.g, c.b, c.a
end,
set = function(info, r, g, b, a)
local c = mod.db.profile.frames[frame.id].backgroundColor
c.r, c.g, c.b, c.a = r, g, b, a
mod:SetBackdrop(frame)
end
},
borderColor = {
type = "color",
name = L["Border color"],
desc = L["Border color"],
hasAlpha = true,
get = function()
local c = mod.db.profile.frames[frame.id].borderColor
return c.r, c.g, c.b, c.a
end,
set = function(info, r, g, b, a)
local c = mod.db.profile.frames[frame.id].borderColor
c.r, c.g, c.b, c.a = r, g, b, a
mod:SetBackdrop(frame)
end
},
inset = {
type = "range",
name = L["Background Inset"],
desc = L["Background Inset"],
min = 1,
max = 64,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.frames[frame.id].inset end,
set = function(info, v)
mod.db.profile.frames[frame.id].inset = v
mod:SetBackdrop(frame)
end
},
tileSize = {
type = "range",
name = L["Tile Size"],
desc = L["Tile Size"],
min = 1,
max = 64,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.frames[frame.id].tileSize end,
set = function(info, v)
mod.db.profile.frames[frame.id].tileSize = v
mod:SetBackdrop(frame)
end
},
edgeSize = {
type = "range",
name = L["Edge Size"],
desc = L["Edge Size"],
min = 1,
max = 64,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.frames[frame.id].edgeSize end,
set = function(info, v)
mod.db.profile.frames[frame.id].edgeSize = v
mod:SetBackdrop(frame)
end
}
}
}
options[frame.id] = t
end
end
function mod:LibSharedMedia_Registered()
mod:SetBackdrops()
end
function mod:Decorate(cf)
local frame = CreateFrame("Frame", nil, cf, "ChatFrameBorderTemplate")
frame:EnableMouse(false)
cf:SetFrameStrata("LOW")
frame:SetFrameStrata("BACKGROUND")
frame:SetFrameLevel(1)
frame:Hide()
frame.id = "FRAME_1"
tinsert(frames, frame)
self:SetBackdrops()
frame:Show()
mod:SetAnchors(frame, self.db.profile.frames["FRAME_1"].combatLogFix)
end
function mod:OnEnable()
self:LibSharedMedia_Registered()
self:SetBackdrops()
for i = 1, #frames do
frames[i]:Show()
mod:SetAnchors(frames[i], self.db.profile.frames["FRAME_" .. i].combatLogFix)
end
Media.RegisterCallback(mod, "LibSharedMedia_Registered")
end
function mod:OnDisable()
for i = 1, #frames do
frames[i]:Hide()
end
end
function mod:SetBackdrops()
for i = 1, #frames do
self:SetBackdrop(frames[i])
end
end
do
function mod:SetBackdrop(frame)
local profile = self.db.profile.frames[frame.id]
frame:SetBackdrop({
bgFile = Media:Fetch("background", profile.background),
edgeFile = Media:Fetch("border", profile.border),
tile = true,
tileSize = profile.tileSize,
edgeSize = profile.edgeSize,
insets = {left = profile.inset, right = profile.inset, top = profile.inset, bottom = profile.inset}
})
local c = profile.backgroundColor
frame:SetBackdropColor(c.r, c.g, c.b, c.a)
local c = profile.borderColor
frame:SetBackdropBorderColor(c.r, c.g, c.b, c.a)
end
end
function mod:GetOptions()
return options
end
function mod:SetAnchors(frame, fix)
local p = frame:GetParent()
frame:ClearAllPoints()
if fix then
frame:SetPoint("TOPLEFT", p, "TOPLEFT", -5, 30)
frame:SetPoint("TOPRIGHT", p, "TOPRIGHT", 5, 30)
frame:SetPoint("BOTTOMLEFT", p, "BOTTOMLEFT", -5, -10)
frame:SetPoint("BOTTOMRIGHT", p, "BOTTOMRIGHT", 5, -10)
else
frame:SetPoint("TOPLEFT", p, "TOPLEFT", -5, 5)
frame:SetPoint("TOPRIGHT", p, "TOPRIGHT", 5, 5)
frame:SetPoint("BOTTOMLEFT", p, "BOTTOMLEFT", -5, -10)
frame:SetPoint("BOTTOMRIGHT", p, "BOTTOMRIGHT", 5, -10)
end
end
function mod:Info()
return L["Gives you finer control over the chat frame's background and border colors"]
end
+39
View File
@@ -0,0 +1,39 @@
<Ui>
<Script file="ChatFrameBorders.lua" />
<Frame name="ChatFrameBorderTemplate" virtual="true" enableMouse="false">
<Backdrop bgFile="Interface\\ChatFrame\\ChatFrameBackground" edgeFile="Interface\Tooltips\UI-Tooltip-Border" tile="true">
<EdgeSize>
<AbsValue val="16"/>
</EdgeSize>
<TileSize>
<AbsValue val="16"/>
</TileSize>
<BackgroundInsets>
<AbsInset left="5" right="5" top="5" bottom="5"/>
</BackgroundInsets>
</Backdrop>
<Anchors>
<Anchor point="TOPLEFT" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="-5" y="7"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="5" y="10"/>
</Offset>
</Anchor>
<Anchor point="BOTTOMLEFT" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="-5" y="-10"/>
</Offset>
</Anchor>
<Anchor point="BOTTOMRIGHT" relativePoint="BOTTOMRIGHT">
<Offset>
<AbsDimension x="5" y="-10"/>
</Offset>
</Anchor>
</Anchors>
</Frame>
</Ui>
+65
View File
@@ -0,0 +1,65 @@
local mod = Chatter:NewModule("ChatLink", "AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Chat Link"]
local gsub = _G.string.gsub
local find = _G.string.find
local GetChannelName = _G.GetChannelName
local EnumerateServerChannels = _G.EnumerateServerChannels
local select = _G.select
local serverChannels = {}
local function excludeChannels(...)
for i = 1, select("#", ...) do
local name = select(i, ...)
serverChannels[name] = true
end
end
function mod:Decorate(frame)
if not self:IsHooked(frame,"AddMessage") then
self:RawHook(frame, "AddMessage", true)
end
end
function mod:OnEnable()
excludeChannels(EnumerateServerChannels())
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
if cf ~= COMBATLOG then
self:RawHook(cf, "AddMessage", true)
end
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
self:RawHook(cf, "AddMessage", true)
end
end
end
function mod:OnDisable()
end
function mod:ParseLinks(text)
if not text then return nil end
text = gsub(text, "{CLINK:item:(%x+):([%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-):([^}]-)}", "|c%1|Hitem:%2|h[%3]|h|r")
text = gsub(text, "{CLINK:talent:(%x+):([%d-]-:[%d-]-):([^}]-)}", "|c%1|Htalent:%2|h[%3]|h|r")
text = gsub(text, "{CLINK:glyph:(%x+):([%d-]-:[%d-]-):([^}]-)}", "|c%1|Hglyph:%2|h[%3]|h|r")
text = gsub(text, "{CLINK:enchant:(%x+):([%d-]-):([^}]-)}", "|c%1|Henchant:%2|h[%3]|h|r")
text = gsub(text, "{CLINK:spell:(%x+):([%d-]-):([^}]-)}", "|c%1|Hspell:%2|h[%3]|h|r")
text = gsub(text, "{CLINK:quest:(%x+):([%d-]-):([%d-]-):([^}]-)}", "|c%1|Hquest:%2:%3|h[%4]|h|r")
text = gsub(text, "{CLINK:(%x+):([%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-:[%d-]-):([^}]-)}", "|c%1|Hitem:%2|h[%3]|h|r")
text = gsub(text, "{CLINK:trade:(%x+):(%-?%d-:%-?%d-:.*:.*):([^}]-)}", "|c%1|Htrade:%2|h[%3]|h|r")
-- {CLINK:achievement:ffffff00:780:00000000001ED5C3:1:12:16:8:4294967295:4294967295:4294967295:4294967295:Explore Redridge Mountains}
text = gsub(text, "{CLINK:achievement:(%x+):(%-?%d-:%-?%x-:%-?%d-:%-?%d-:%-?%d-:%-?%d-:%-?%d-:%-?%d-:%-?%d-:%-?%d-):([^}]-)}", "|c%1|Hachievement:%2|h[%3]|h|r")
return text
end
function mod:AddMessage(frame, text, ...)
return self.hooks[frame].AddMessage(frame, mod:ParseLinks(text), ...)
end
function mod:Info()
return L["Lets you link items, enchants, spells, talents, achievements and quests in custom channels."]
end
+160
View File
@@ -0,0 +1,160 @@
local mod = Chatter:NewModule("Mousewheel Scroll", "AceHook-3.0","AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Mousewheel Scroll"]
local IsShiftKeyDown = _G.IsShiftKeyDown
local IsControlKeyDown = _G.IsControlKeyDown
local scrollFunc = function(self, arg1)
-- prevent itemtooltips to be kept open when using LinkHover.
HideUIPanel(GameTooltip)
if arg1 > 0 then
if IsShiftKeyDown() then
self:ScrollToTop()
elseif IsControlKeyDown() then
self:PageUp()
else
for i = 1, mod.db.profile.scrollLines do
self:ScrollUp()
end
end
elseif arg1 < 0 then
if IsShiftKeyDown() then
self:ScrollToBottom()
elseif IsControlKeyDown() then
self:PageDown()
else
for i = 1, mod.db.profile.scrollLines do
self:ScrollDown()
end
end
end
end
local defaults = { profile = { scrollLines = 1 } }
local options = {
lines = {
type = "range",
name = L["Scroll lines"],
desc = L["How many lines to scroll per mouse wheel click"],
min = 1,
max = 20,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.scrollLines end,
set = function(info, v) mod.db.profile.scrollLines = v end
}
}
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace(self:GetName(), defaults)
self:RegisterEvent("CVAR_UPDATE", "ChangedVars")
self:RawHook("InterfaceOptionsSocialPanelChatMouseScroll_SetScrolling",true)
end
function mod:InterfaceOptionsSocialPanelChatMouseScroll_SetScrolling()
-- We want to intercept this and handle it ourselves
end
function mod:ChangedVars(event,cvar,value)
if cvar == "CHAT_MOUSE_WHEEL_SCROLL" then
if value == "1" then
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G[("%s%d"):format("ChatFrame", i)]
cf:SetScript("OnMouseWheel", FloatingChatFrame_OnMouseScroll)
cf:EnableMouseWheel(true)
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
cf:SetScript("OnMouseWheel", FloatingChatFrame_OnMouseScroll)
cf:EnableMouseWheel(true)
end
end
end
if value == "0" and self:IsEnabled() then
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G[("%s%d"):format("ChatFrame", i)]
cf:SetScript("OnMouseWheel", scrollFunc)
cf:EnableMouseWheel(true)
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
cf:SetScript("OnMouseWheel", scrollFunc)
cf:EnableMouseWheel(true)
end
end
end
end
end
function mod:OnEnable()
if GetCVar("chatMouseScroll") == "1" then
return
end
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G[("%s%d"):format("ChatFrame", i)]
cf:SetScript("OnMouseWheel", scrollFunc)
if not cf:IsMouseWheelEnabled() then
cf:EnableMouseWheel(true)
end
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
cf:SetScript("OnMouseWheel", scrollFunc)
if not cf:IsMouseWheelEnabled() then
cf:EnableMouseWheel(true)
end
end
end
end
function mod:Decorate(frame)
if GetCVar("chatMouseScroll") == "1" then
return
end
frame:SetScript("OnMouseWheel", scrollFunc)
frame:EnableMouseWheel(true)
end
function mod:OnDisable()
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G[("%s%d"):format("ChatFrame", i)]
if GetCVarBool("chatMouseScroll") then
cf:SetScript("OnMouseWheel", FloatingChatFrame_OnMouseScroll)
if not cf:IsMouseWheelEnabled() then
cf:EnableMouseWheel(true)
end
else
cf:SetScript("OnMouseWheel", nil)
if cf:IsMouseWheelEnabled() then
cf:EnableMouseWheel(true)
end
end
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if GetCVarBool("chatMouseScroll") then
cf:SetScript("OnMouseWheel", FloatingChatFrame_OnMouseScroll)
if not cf:IsMouseWheelEnabled() then
cf:EnableMouseWheel(true)
end
else
cf:SetScript("OnMouseWheel", nil)
if cf:IsMouseWheelEnabled() then
cf:EnableMouseWheel(true)
end
end
end
end
function mod:Info()
return L["Lets you use the mousewheel to page up and down chat."]
end
function mod:GetOptions()
return options
end
+304
View File
@@ -0,0 +1,304 @@
local mod = Chatter:NewModule("ChatTabs", "AceHook-3.0", "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
local font = GameFontNormalSmall
mod.modName = L["Chat Tabs"]
local defaults = {
profile = {
height = 29,
tabFlash = true
}
}
local options = {
height = {
order = 101,
type = "range",
name = L["Button Height"],
desc = L["Button's height, and text offset from the frame"],
step = 1,
bigStep = 1,
get = function() return mod.db.profile.height end,
set = function(info, v)
mod.db.profile.height = v
for i = 1, NUM_CHAT_WINDOWS do
local tab = _G["ChatFrame"..i.."Tab"]
tab:SetHeight(v)
end
end,
disabled = function() return not mod:IsEnabled() end
},
hidetabs = {
order = 102,
type = "toggle",
name = L["Hide Tabs"],
desc = L["Hides chat frame tabs"],
get = function() return mod.db.profile.chattabs end,
set = function(info, v) mod.db.profile.chattabs = not mod.db.profile.chattabs; mod:ToggleTabShow() end,
disabled = function() return not mod:IsEnabled() end
},
hideflash = {
order = 103,
type = "toggle",
name = L["Enable Tab Flashing"],
desc = L["Enables the Tab to flash when you miss a message"],
get = function() return mod.db.profile.tabFlash end,
set = function(info, v) mod.db.profile.tabFlash = not mod.db.profile.tabFlash; mod:DecorateTabs() end,
disabled = function() return not mod:IsEnabled() end
}
}
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace(self:GetName(), defaults)
end
local function SetFontSizes()
for i = 1, NUM_CHAT_WINDOWS do
local tab = _G["ChatFrame"..i.."Tab"]
mod:OnLeave(tab)
end
for index,name in ipairs(self.TempChatFrames) do
local tab = _G[name.."Tab"]
mod:OnLeave(tab)
end
end
function mod:Decorate(frame)
local name = "ChatFrame"..frame:GetID();
local tab = _G[name.."Tab"]
tab:SetHeight(mod.db.profile.height)
_G[name.."TabLeft"]:Hide()
_G[name.."TabMiddle"]:Hide()
_G[name.."TabRight"]:Hide()
tab.leftSelectedTexture:SetAlpha(0)
tab.rightSelectedTexture:SetAlpha(0)
tab.middleSelectedTexture:SetAlpha(0)
tab.leftHighlightTexture:SetTexture(nil)
tab.rightHighlightTexture:SetTexture(nil)
tab.middleHighlightTexture:SetTexture([[BUTTONS\CheckButtonGlow]])
tab.middleHighlightTexture:SetWidth(76)
tab.middleHighlightTexture:SetTexCoord(0, 0, 1, 0.5)
tab.leftSelectedTexture:SetAlpha(0)
tab.rightSelectedTexture:SetAlpha(0)
tab.middleSelectedTexture:SetAlpha(0)
tab:EnableMouseWheel(true)
self:HookScript(tab, "OnMouseWheel")
tab:Show()
if (mod.db.profile.chattabs) then
mod:HideTab(tab)
end
end
function mod:DecorateTabs()
CHAT_FRAME_FADE_OUT_TIME = 0.5
CHAT_TAB_HIDE_DELAY = 0
CHAT_FRAME_TAB_SELECTED_MOUSEOVER_ALPHA = 1
CHAT_FRAME_TAB_SELECTED_NOMOUSE_ALPHA = 0
CHAT_FRAME_TAB_ALERTING_MOUSEOVER_ALPHA = 1
if self.db.profile.tabFlash then
CHAT_FRAME_TAB_ALERTING_NOMOUSE_ALPHA = 1
else
CHAT_FRAME_TAB_ALERTING_NOMOUSE_ALPHA = 0
end
CHAT_FRAME_TAB_NORMAL_MOUSEOVER_ALPHA = 1
CHAT_FRAME_TAB_NORMAL_NOMOUSE_ALPHA = 0
end
function mod:UndecorateTabs()
CHAT_FRAME_FADE_OUT_TIME = 2
CHAT_TAB_HIDE_DELAY = 1
CHAT_FRAME_TAB_SELECTED_MOUSEOVER_ALPHA = 1
CHAT_FRAME_TAB_SELECTED_NOMOUSE_ALPHA = 0.4
CHAT_FRAME_TAB_ALERTING_MOUSEOVER_ALPHA = 1
CHAT_FRAME_TAB_ALERTING_NOMOUSE_ALPHA = 1
CHAT_FRAME_TAB_NORMAL_MOUSEOVER_ALPHA = 0.6
CHAT_FRAME_TAB_NORMAL_NOMOUSE_ALPHA = 0.2
end
function mod:OnEnable()
-- self:Hook("FCF_Close", true)
self:DecorateTabs()
for i = 1, NUM_CHAT_WINDOWS do
local chat = _G["ChatFrame"..i]
local tab = _G["ChatFrame"..i.."Tab"]
tab:SetHeight(mod.db.profile.height)
_G["ChatFrame"..i.."TabLeft"]:Hide()
_G["ChatFrame"..i.."TabMiddle"]:Hide()
_G["ChatFrame"..i.."TabRight"]:Hide()
tab.leftSelectedTexture:SetAlpha(0)
tab.rightSelectedTexture:SetAlpha(0)
tab.middleSelectedTexture:SetAlpha(0)
tab.leftHighlightTexture:SetTexture(nil)
tab.rightHighlightTexture:SetTexture(nil)
tab.middleHighlightTexture:SetTexture([[BUTTONS\CheckButtonGlow]])
tab.middleHighlightTexture:SetWidth(76)
tab.middleHighlightTexture:SetTexCoord(0, 0, 1, 0.5)
tab.leftSelectedTexture:SetAlpha(0)
tab.rightSelectedTexture:SetAlpha(0)
tab.middleSelectedTexture:SetAlpha(0)
--[[ TODO: Grum @ 18/10/2008
There seems to be a bug with certain fonts/fontObjects which prevents
tab:GetNormalFontObject() to return anything sensible
The buttons now have font objects. If you change the size on one it will change on
the other tabs as well. However assigning a new font object seems to go wrong with
the default ChatFrame$Tab font-object. This will need further investigation
For now I just disabled all the font-changing mechanics.
--]]
tab:EnableMouseWheel(true)
self:HookScript(tab, "OnMouseWheel")
if (mod.db.profile.chattabs) then
mod:HideTab(tab)
end
tab.noMouseAlpha=0
tab:SetAlpha(0)
end
for index,name in ipairs(self.TempChatFrames) do
local chat = _G[name]
local tab = _G[name.."Tab"]
tab:SetHeight(mod.db.profile.height)
_G[name.."TabLeft"]:Hide()
_G[name.."TabMiddle"]:Hide()
_G[name.."TabRight"]:Hide()
tab.leftSelectedTexture:SetAlpha(0)
tab.rightSelectedTexture:SetAlpha(0)
tab.middleSelectedTexture:SetAlpha(0)
tab.leftHighlightTexture:SetTexture(nil)
tab.rightHighlightTexture:SetTexture(nil)
tab.middleHighlightTexture:SetTexture([[BUTTONS\CheckButtonGlow]])
tab.middleHighlightTexture:SetWidth(76)
tab.middleHighlightTexture:SetTexCoord(0, 0, 1, 0.5)
tab.leftSelectedTexture:SetAlpha(0)
tab.rightSelectedTexture:SetAlpha(0)
tab.middleSelectedTexture:SetAlpha(0)
tab:EnableMouseWheel(true)
if not self:IsHooked(tab,"OnMouseWheel") then
self:HookScript(tab, "OnMouseWheel")
end
if (mod.db.profile.chattabs) then
mod:HideTab(tab)
end
tab.noMouseAlpha=0
tab:SetAlpha(0)
end
end
function mod:OnDisable()
for i = 1, NUM_CHAT_WINDOWS do
local chat = _G["ChatFrame"..i]
local tab = _G["ChatFrame"..i.."Tab"]
tab:SetHeight(32)
_G["ChatFrame"..i.."TabLeft"]:Show()
_G["ChatFrame"..i.."TabMiddle"]:Show()
_G["ChatFrame"..i.."TabRight"]:Show()
tab:EnableMouseWheel(false)
tab:Hide()
tab.noMousealpha=0.2
tab:SetAlpha(0.2)
end
for index,name in ipairs(self.TempChatFrames) do
local chat = _G[name]
local tab = _G[name.."Tab"]
tab:SetHeight(32)
_G[name.."TabLeft"]:Show()
_G[name.."TabMiddle"]:Show()
_G[name.."TabRight"]:Show()
tab:EnableMouseWheel(false)
tab:Hide()
tab.noMousealpha=0.2
tab:SetAlpha(0.2)
end
self:UndecorateTabs()
end
function mod:FCF_Close(f)
_G[f:GetName() .. "Tab"]:Hide()
end
function mod:OnClick(f, button, ...)
if button == "LeftButton" then
SetFontSizes(f)
end
end
function mod:ToggleTabShow()
for i = 1, NUM_CHAT_WINDOWS do
local tab = _G["ChatFrame"..i.."Tab"]
local chat = _G["ChatFrame"..i]
if (mod.db.profile.chattabs) then
tab:SetScript("OnShow", function(...) tab:Hide() end)
else
tab:SetScript("OnShow", function(...) tab:Show() end)
end
tab:Show()
tab:Hide()
if chat.isDocked or chat:IsVisible() then
tab:Show()
end
end
for index,name in ipairs(self.TempChatFrames) do
local tab = _G[name.."Tab"]
local chat = _G[name]
if (mod.db.profile.chattabs) then
tab:SetScript("OnShow", function(...) tab:Hide() end)
else
tab:SetScript("OnShow", function(...) tab:Show() end)
end
tab:Show()
tab:Hide()
if chat.isDocked or chat:IsVisible() then
tab:Show()
end
end
end
function mod:HideTab(tab)
tab:SetScript("OnShow", function(...) tab:Hide() end)
tab:Show()
if tab:IsVisible() then
tab:Hide()
end
end
function mod:OnMouseWheel(frame, dir)
local chat = _G["ChatFrame" .. frame:GetID()]
if not chat.isDocked then return end
local t
for i = 1, #GENERAL_CHAT_DOCK.DOCKED_CHAT_FRAMES do
if GENERAL_CHAT_DOCK.DOCKED_CHAT_FRAMES[i]:IsVisible() then
t = i
break
end
end
if t == 1 and dir > 0 then
t = #GENERAL_CHAT_DOCK.DOCKED_CHAT_FRAMES
elseif t == #GENERAL_CHAT_DOCK.DOCKED_CHAT_FRAMES and dir < 0 then
t = 1
elseif t then
t = t + (dir < 0 and 1 or -1)
end
if t then
_G[GENERAL_CHAT_DOCK.DOCKED_CHAT_FRAMES[t]:GetName() .. "Tab"]:Click()
end
--SetFontSizes()
end
function mod:OnEnter(frame)
local f, s = font:GetFont()
frame:SetFont(f, s + 2)
end
function mod:OnLeave(frame)
local f, s = font:GetFont()
if(_G["ChatFrame" .. frame:GetID()]:IsVisible()) then
frame:SetFont(f, s + 2)
else
frame:SetFont(f, s - 1)
end
end
function mod:GetOptions()
return options
end
+134
View File
@@ -0,0 +1,134 @@
local mod = Chatter:NewModule("Invite Links", "AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Invite Links"]
local gsub = _G.string.gsub
local ipairs = _G.ipairs
local fmt = _G.string.format
local sub = _G.string.sub
local InviteUnit = _G.InviteUnit
local next = _G.next
local type = _G.type
local IsAltKeyDown = _G.IsAltKeyDown
local match = _G.string.match
local options = {
addWord = {
type = "input",
name = L["Add Word"],
desc = L["Add word to your invite trigger list"],
get = function() end,
set = function(info, v)
mod.db.profile.words[v:lower()] = v
end
},
removeWord = {
type = "select",
name = L["Remove Word"],
desc = L["Remove a word from your invite trigger list"],
get = function() end,
set = function(info, v)
mod.db.profile.words[v:lower()] = nil
end,
values = function() return mod.db.profile.words end,
confirm = function(info, v) return (L["Remove this word from your trigger list?"]) end
},
altClick = {
type = "toggle",
name = L["Alt-click name to invite"],
width = "double",
desc = L["Lets you alt-click player names to invite them to your party."],
get = function() return mod.db.profile.altClickToinvite end,
set = function(i, v) mod.db.profile.altClickToinvite = v end
}
}
local defaults = {
profile = {
words = {},
altClickToInvite = true
}
}
local words
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace(self:GetName(), defaults)
end
function mod:Decorate(frame)
self:RawHook(frame, "AddMessage", true)
end
function mod:OnEnable()
words = self.db.profile.words
if not next(words) then
words[L["invite"]] = L["invite"]
words[L["inv"]] = L["inv"]
end
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
if cf ~= COMBATLOG then
self:RawHook(cf, "AddMessage", true)
end
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
self:RawHook(cf, "AddMessage", true)
end
end
self:RawHook(nil, "SetItemRef", true)
end
local style = "|cffffffff|Hinvite:%s|h[%s]|h|r"
local valid_events = {
CHAT_MSG_SAY = true,
CHAT_MSG_CHANNEL = true,
CHAT_MSG_WHISPER = true,
CHAT_MSG_OFFICER = true,
CHAT_MSG_GUILD = true
}
local function addLinks(m, t, p)
if words[t:lower()] and p ~= "_" then
t = fmt(style, arg2, t)
return t .. p
end
return m
end
function mod:AddMessage(frame, text, ...)
if not text then
return self.hooks[frame].AddMessage(frame, text, ...)
end
if valid_events[event] and type(arg2) == "string" then
text = gsub(text, "((%w+)(.?))", addLinks)
end
return self.hooks[frame].AddMessage(frame, text, ...)
end
function mod:SetItemRef(link, text, button)
local linkType = sub(link, 1, 6)
-- Chatter:Print(IsAltKeyDown(), linkType, self.db.profile.altClickToInvite)
if IsAltKeyDown() and linkType == "player" and self.db.profile.altClickToInvite then
local name = match(link, "player:([^:]+)")
InviteUnit(name)
return nil
elseif linkType == "invite" then
local name = sub(link, 8)
InviteUnit(name)
return nil
end
return self.hooks.SetItemRef(link, text, button)
end
function mod:Info()
return L["Gives you more flexibility in how you invite people to your group."]
end
function mod:GetOptions()
return options
end
+228
View File
@@ -0,0 +1,228 @@
local mod = Chatter:NewModule("Chat Copy", "AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Copy Chat"]
local lines = {}
local table_concat = _G.table.concat
local CreateFrame = _G.CreateFrame
local GetSpellInfo = _G.GetSpellInfo
local select = _G.select
local tinsert = _G.tinsert
local tostring = _G.tostring
local PaneBackdrop = {
bgFile = [[Interface\DialogFrame\UI-DialogBox-Background]],
edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]],
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
local InsetBackdrop = {
bgFile = [[Interface\DialogFrame\UI-DialogBox-Background]],
edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]],
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
local tex = select(3, GetSpellInfo(586))
local buttons = {}
local defaults = {
profile = {
copyIcon = false,
}
}
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("CopyChat", defaults)
local frame = CreateFrame("Frame", "ChatterCopyFrame", UIParent)
tinsert(UISpecialFrames, "ChatterCopyFrame")
frame:SetBackdrop(PaneBackdrop)
frame:SetBackdropColor(0,0,0,1)
frame:SetWidth(500)
frame:SetHeight(400)
frame:SetPoint("CENTER", UIParent, "CENTER")
frame:Hide()
frame:SetFrameStrata("DIALOG")
self.frame = frame
local scrollArea = CreateFrame("ScrollFrame", "ChatterCopyScroll", frame, "UIPanelScrollFrameTemplate")
scrollArea:SetPoint("TOPLEFT", frame, "TOPLEFT", 8, -30)
scrollArea:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -30, 8)
local editBox = CreateFrame("EditBox", nil, frame)
editBox:SetMultiLine(true)
editBox:SetMaxLetters(99999)
editBox:EnableMouse(true)
editBox:SetAutoFocus(false)
editBox:SetFontObject(ChatFontNormal)
editBox:SetWidth(400)
editBox:SetHeight(270)
editBox:SetScript("OnEscapePressed", function() frame:Hide() end)
self.editBox = editBox
scrollArea:SetScrollChild(editBox)
local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
close:SetPoint("TOPRIGHT", frame, "TOPRIGHT")
end
local options
function mod:GetOptions()
options = options or {
guildNotes = {
order=100,
type = "toggle",
name = L["Show copy icon"],
desc = L["Toggle the copy icon on the chat frame."],
get = function()
return mod.db.profile.copyIcon
end,
set = function(info, v)
mod.db.profile.copyIcon = v
mod:HideCopyButton(v)
end,
},
}
return options
end
function mod:Decorate(frame)
local button = self:MakeCopyButton(frame)
local tab = _G["ChatFrame" .. frame:GetID()]
self:HookScript(tab, "OnShow")
self:HookScript(tab, "OnHide")
tab.copyButton = button
if self.db.profile.copyIcon then
tab.copyButton:Show()
end
end
function mod:OnEnable()
Chatter:AddMenuHook(self, "Menu")
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
self:MakeCopyButton(cf)
end
for index,f in ipairs(self.TempChatFrames) do
local cf = _G[f]
self:MakeCopyButton(cf)
end
for i = 1, #buttons do
local p = buttons[i]:GetParent()
local tab = _G["ChatFrame" .. p:GetID()]
self:HookScript(tab, "OnShow")
self:HookScript(tab, "OnHide")
tab.copyButton = buttons[i]
if self.db.profile.copyIcon then
tab.copyButton:Show()
else
tab.copyButton:Hide()
end
end
end
function mod:OnDisable()
Chatter:RemoveMenuHook(self)
for i = 1, #buttons do
buttons[i]:Hide()
end
end
function mod:HideCopyButton(val)
if not val then
for i = 1, #buttons do
buttons[i]:Hide()
end
else
for i = 1, #buttons do
buttons[i]:Show()
end
end
end
function mod:MakeCopyButton(frame)
for index,cb in ipairs(buttons) do
if cb:GetParent() == frame then
return nil
end
end
local button = CreateFrame("Button", nil, frame)
button:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 0, -5)
button:SetHeight(10)
button:SetWidth(10)
button:SetNormalTexture(tex)
button:SetHighlightTexture([[Interface\Buttons\ButtonHilight-Square]])
button:SetScript("OnClick", function() mod:Copy(frame) end)
button:SetScript("OnEnter", function(self)
self:SetHeight(28)
self:SetWidth(28)
GameTooltip:SetOwner(self)
GameTooltip:ClearLines()
GameTooltip:AddLine(L["Copy text from this frame."])
GameTooltip:Show()
end)
button:SetScript("OnLeave", function(self)
button:SetHeight(10)
button:SetWidth(10)
GameTooltip:Hide()
end)
button:Hide()
tinsert(buttons, button)
return button
end
local menuButtons = {}
function mod:Menu(chatTab, button)
local frame = _G["ChatFrame" .. chatTab:GetID()]
local info = menuButtons[chatTab:GetID()]
if not info then
info = {}
info.text = L["Copy Text"]
info.func = function() mod:Copy(frame) end
info.notCheckable = 1;
menuButtons[chatTab:GetID()] = info
end
return info
end
function mod:Copy(frame)
local _, size = frame:GetFont()
FCF_SetChatWindowFontSize(frame, frame, 0.01)
local lineCt = self:GetLines(frame:GetRegions())
local text = table_concat(lines, "\n", 1, lineCt)
FCF_SetChatWindowFontSize(frame, frame, size)
self.frame:Show()
self.editBox:SetText(text)
self.editBox:HighlightText(0)
end
function mod:GetLines(...)
local ct = 1
for i = select("#", ...), 1, -1 do
local region = select(i, ...)
if region:GetObjectType() == "FontString" then
lines[ct] = tostring(region:GetText())
ct = ct + 1
end
end
return ct - 1
end
function mod:OnShow(cft)
local cfn = cft:GetName():match("ChatFrame%d")
if cfn and _G[cfn]:IsVisible() and self.db.profile.copyIcon then
cft.copyButton:Show()
end
end
function mod:OnHide(cft)
local cfn = cft:GetName():match("ChatFrame%d")
if cfn and _G[cfn]:IsVisible() then
cft.copyButton:Hide()
end
end
function mod:Info()
return L["Lets you copy text out of your chat frames."]
end
+42
View File
@@ -0,0 +1,42 @@
local frame = CreateFrame("Frame")
LibStub("AceHook-3.0"):Embed(frame)
local strmatch = strmatch
-- GUILD_MOTD_TEMPLATE = "Guild Message of the Day: %s"; -- %s is the guild MOTD
local pattern = GUILD_MOTD_TEMPLATE:
gsub("[-%%+*.()%[%]]", "%%%1"):
gsub("%%%%s", "(.+)")
local gmotdData
function frame:AddMessage(frame, text, ...)
local gmotd
if text then
gmotd = strmatch(text, pattern)
end
if gmotd then
gmotdData={text,...}
self:UnhookAll()
else
return self.hooks[frame].AddMessage(frame, text, ...)
end
end
frame:RawHook(ChatFrame1, "AddMessage", true)
local delay=2.5
frame:SetScript("OnUpdate", function(self, expired)
delay=delay-expired
if delay<0 then
self:Hide()
self:UnhookAll()
if gmotdData then
ChatFrame1:AddMessage(unpack(gmotdData))
gmotdData=nil
end
end
end)
+615
View File
@@ -0,0 +1,615 @@
local mod = Chatter:NewModule("Edit Box Polish", "AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Edit Box Polish"]
local Media = LibStub("LibSharedMedia-3.0")
local backgrounds, borders, fonts = {}, {}, {}
local CreateFrame = _G.CreateFrame
local max = _G.max
local pairs = _G.pairs
local select = _G.select
local VALID_ATTACH_POINTS = {
TOP = L["Top"],
BOTTOM = L["Bottom"],
FREE = L["Free-floating"],
LOCK = L["Free-floating, Locked"]
}
local function updateEditBox(method, ...)
for i = 1, NUM_CHAT_WINDOWS do
local f = _G["ChatFrame" .. i .. "EditBox"]
f[method](f, ...)
end
for index,name in ipairs(mod.TempChatFrames) do
local cf = _G[name.."EditBox"]
if cf then
cf[method](cf,...)
end
end
end
local options = {
background = {
type = "select",
name = L["Background texture"],
desc = L["Background texture"],
values = Media:HashTable("background"),
dialogControl = "LSM30_Background",
get = function() return mod.db.profile.background end,
set = function(info, v)
mod.db.profile.background = v
mod:SetBackdrop()
end
},
border = {
type = "select",
name = L["Border texture"],
desc = L["Border texture"],
dialogControl = "LSM30_Border",
values = Media:HashTable("border"),
get = function() return mod.db.profile.border end,
set = function(info, v)
mod.db.profile.border = v
mod:SetBackdrop()
end
},
backgroundColor = {
type = "color",
name = L["Background color"],
desc = L["Background color"],
hasAlpha = true,
get = function()
local c = mod.db.profile.backgroundColor
return c.r, c.g, c.b, c.a
end,
set = function(info, r, g, b, a)
local c = mod.db.profile.backgroundColor
c.r, c.g, c.b, c.a = r, g, b, a
mod:SetBackdrop()
end
},
borderColor = {
type = "color",
name = L["Border color"],
desc = L["Border color"],
hasAlpha = true,
get = function()
local c = mod.db.profile.borderColor
return c.r, c.g, c.b, c.a
end,
set = function(info, r, g, b, a)
local c = mod.db.profile.borderColor
c.r, c.g, c.b, c.a = r, g, b, a
mod:SetBackdrop()
end
},
inset = {
type = "range",
name = L["Background Inset"],
desc = L["Background Inset"],
min = 1,
max = 64,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.inset end,
set = function(info, v)
mod.db.profile.inset = v
mod:SetBackdrop()
end
},
tileSize = {
type = "range",
name = L["Tile Size"],
desc = L["Tile Size"],
min = 1,
max = 64,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.tileSize end,
set = function(info, v)
mod.db.profile.tileSize = v
mod:SetBackdrop()
end
},
edgeSize = {
type = "range",
name = L["Edge Size"],
desc = L["Edge Size"],
min = 1,
max = 64,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.edgeSize end,
set = function(info, v)
mod.db.profile.edgeSize = v
mod:SetBackdrop()
end
},
attach = {
type = "select",
name = L["Attach to..."],
desc = L["Attach edit box to..."],
get = function() return mod.db.profile.attach end,
values = VALID_ATTACH_POINTS,
set = function(info, v)
mod.db.profile.attach = v
-- we loop in set attach anyways
mod:SetAttach()
end
},
colorByChannel = {
type = "toggle",
name = L["Color border by channel"],
desc = L["Sets the frame's border color to the color of your currently active channel"],
get = function()
return mod.db.profile.colorByChannel
end,
set = function(info, v)
mod.db.profile.colorByChannel = v
if v then
mod:RawHook("ChatEdit_UpdateHeader", "SetBorderByChannel", true)
else
if mod:IsHooked("ChatEdit_UpdateHeader") then
mod:Unhook("ChatEdit_UpdateHeader")
local c = mod.db.profile.borderColor
for _, frame in ipairs(self.frames) do
frame:SetBackdropBorderColor(c.r, c.g, c.b, c.a)
end
end
end
end
},
useAltKey = {
type = "toggle",
name = L["Use Alt key for cursor movement"],
desc = L["Requires the Alt key to be held down to move the cursor in chat"],
get = function()
return mod.db.profile.useAlt
end,
set = function(info, v)
mod.db.profile.useAlt = v
updateEditBox("SetAltArrowKeyMode", v)
end
},
font = {
type = "select",
name = L["Font"],
dialogControl = "LSM30_Font",
desc = L["Select the font to use for the edit box"],
values = Media:HashTable("font"),
get = function() return mod.db.profile.font end,
set = function(i, v)
mod.db.profile.font = v
for i = 1, NUM_CHAT_WINDOWS do
local ff = _G["ChatFrame"..i.."EditBox"]
local _, s, m = ff:GetFont()
ff:SetFont(Media:Fetch("font", v), s, m)
end
end
},
height = {
type = "range",
name = L["Height"],
desc = L["Select the height of the edit box"],
min = 5,
max = 50,
step = 1,
bigStep = 1,
get = function() return mod.db.profile.height end,
set = function(i, v)
mod.db.profile.height = v
mod:UpdateHeight()
end
}
}
local defaults = {
profile = {
background = "Blizzard Tooltip",
border = "Blizzard Tooltip",
hideDialog = true,
backgroundColor = {r = 0, g = 0, b = 0, a = 1},
borderColor = {r = 1, g = 1, b = 1, a = 1},
inset = 3,
edgeSize = 12,
tileSize = 16,
height = 22,
attach = "BOTTOM",
colorByChannel = true,
useAlt = false,
font = (function()
for i = 1, NUM_CHAT_WINDOWS do
local ff = _G["ChatFrame"..i.."EditBox"]
local f = ff:GetFont()
for k,v in pairs(Media:HashTable("font")) do
if v == f then return k end
end
end
end)()
}
}
function mod:LibSharedMedia_Registered(mediaType, key)
--for k, v in pairs(Media:List("background")) do
-- backgrounds[v] = v
--end
--for k, v in pairs(Media:List("border")) do
-- borders[v] = v
--end
--for k, v in pairs(Media:List("font")) do
-- fonts[v] = v
--end
-- If we were missing this media, reset it now
if mediaType == "font" and key == self.db.profile.font then
for _, frame in ipairs(self.frames) do
local f = frame:GetParent()
if f then
local font, s, m = f:GetFont()
f:SetFont(Media:Fetch("font", self.db.profile.font), s, m)
end
end
end
if mediaType == "border" and key == self.db.profile.border then
self:SetBackdrop()
end
if mediaType == "background" and key == self.db.profile.background then
self:SetBackdrop()
end
end
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("EditBox", defaults)
Media.RegisterCallback(mod, "LibSharedMedia_Registered")
self.frames = {}
self:LibSharedMedia_Registered()
for i = 1, NUM_CHAT_WINDOWS do
local parent = _G["ChatFrame"..i.."EditBox"]
local frame = CreateFrame("Frame", nil, parent)
frame:SetFrameStrata("DIALOG")
frame:SetFrameLevel(parent:GetFrameLevel() - 1)
frame:SetAllPoints(parent)
frame:Hide()
parent.lDrag = CreateFrame("Frame", nil, parent)
parent.lDrag:SetWidth(15)
parent.lDrag:SetPoint("TOPLEFT", parent, "TOPLEFT")
parent.lDrag:SetPoint("BOTTOMLEFT", parent, "BOTTOMLEFT")
parent.rDrag = CreateFrame("Frame", nil, parent)
parent.rDrag:SetWidth(15)
parent.rDrag:SetPoint("TOPRIGHT", parent, "TOPRIGHT")
parent.rDrag:SetPoint("BOTTOMRIGHT", parent, "BOTTOMRIGHT")
parent.lDrag.left = true
parent.frame = frame
tinsert(self.frames, frame)
end
end
function mod:Decorate(chatframe)
local parent = _G[chatframe:GetName().."EditBox"]
local frame = CreateFrame("Frame", nil, parent)
frame:SetFrameStrata("DIALOG")
frame:SetFrameLevel(parent:GetFrameLevel() - 1)
frame:SetAllPoints(parent)
parent.lDrag = CreateFrame("Frame", nil, parent)
parent.lDrag:SetWidth(15)
parent.lDrag:SetPoint("TOPLEFT", parent, "TOPLEFT")
parent.lDrag:SetPoint("BOTTOMLEFT", parent, "BOTTOMLEFT")
parent.rDrag = CreateFrame("Frame", nil, parent)
parent.rDrag:SetWidth(15)
parent.rDrag:SetPoint("TOPRIGHT", parent, "TOPRIGHT")
parent.rDrag:SetPoint("BOTTOMRIGHT", parent, "BOTTOMRIGHT")
parent.lDrag.left = true
parent.frame = frame
tinsert(self.frames, frame)
local name = chatframe:GetName()
local f = _G[name.."EditBox"]
_G[name.."EditBoxLeft"]:Hide()
_G[name.."EditBoxRight"]:Hide()
_G[name.."EditBoxMid"]:Hide()
_G[name.."EditBoxFocusLeft"]:SetTexture(nil)
_G[name.."EditBoxFocusRight"]:SetTexture(nil)
_G[name.."EditBoxFocusMid"]:SetTexture(nil)
f:Hide()
frame:Show()
local font, s, m = f:GetFont()
f:SetFont(Media:Fetch("font", self.db.profile.font), s, m)
self:SetAttach(nil, self.db.profile.editX, self.db.profile.editY, self.db.profile.editW)
self:SetBackdrop()
self:UpdateHeight()
end
function mod:OnEnable()
self:LibSharedMedia_Registered()
updateEditBox("SetAltArrowKeyMode", mod.db.profile.useAlt)
for i = 1, NUM_CHAT_WINDOWS do
local f = _G["ChatFrame"..i.."EditBox"]
_G["ChatFrame"..i.."EditBoxLeft"]:Hide()
_G["ChatFrame"..i.."EditBoxRight"]:Hide()
_G["ChatFrame"..i.."EditBoxMid"]:Hide()
_G["ChatFrame"..i.."EditBoxFocusLeft"]:SetTexture(nil)
_G["ChatFrame"..i.."EditBoxFocusRight"]:SetTexture(nil)
_G["ChatFrame"..i.."EditBoxFocusMid"]:SetTexture(nil)
f:Hide()
self.frames[i]:Show()
local font, s, m = f:GetFont()
f:SetFont(Media:Fetch("font", self.db.profile.font), s, m)
self:SetAttach(nil, self.db.profile.editX, self.db.profile.editY, self.db.profile.editW)
end
for index,name in ipairs(self.TempChatFrames) do
local f = _G[name.."EditBox"]
_G[name.."EditBoxLeft"]:Hide()
_G[name.."EditBoxRight"]:Hide()
_G[name.."EditBoxMid"]:Hide()
_G[name.."EditBoxFocusLeft"]:SetTexture(nil)
_G[name.."EditBoxFocusRight"]:SetTexture(nil)
_G[name.."EditBoxFocusMid"]:SetTexture(nil)
f:Hide()
self.frames[NUM_CHAT_WINDOWS+index]:Show()
local font, s, m = f:GetFont()
f:SetFont(Media:Fetch("font", self.db.profile.font), s, m)
self:SetAttach(nil, self.db.profile.editX, self.db.profile.editY, self.db.profile.editW)
end
-- make sure they all show
for index,frame in ipairs(self.frames) do
frame:Show()
end
self:SecureHook("ChatEdit_DeactivateChat")
self:SecureHook("ChatEdit_SetLastActiveWindow")
self:SetBackdrop()
self:UpdateHeight()
if self.db.profile.colorByChannel then
self:RawHook("ChatEdit_UpdateHeader", "SetBorderByChannel", true)
end
self:SecureHook("FCF_Tab_OnClick")
end
function mod:FCF_Tab_OnClick(frame,button)
if self.db.profile.attach == "TOP" and GetCVar("chatStyle") ~= "classic" then
local chatFrame = _G["ChatFrame"..frame:GetID()];
ChatEdit_DeactivateChat(chatFrame.editBox)
end
end
function mod:OnDisable()
for i = 1, NUM_CHAT_WINDOWS do
local f = _G["ChatFrame"..i.."EditBox"]
_G["ChatFrame"..i.."EditBoxLeft"]:Show()
_G["ChatFrame"..i.."EditBoxRight"]:Show()
_G["ChatFrame"..i.."EditBoxMid"]:Show()
f:SetAltArrowKeyMode(true)
f:EnableMouse(true)
f.frame:Hide()
self:SetAttach("BOTTOM")
f:SetFont(Media:Fetch("font", defaults.profile.font), 14)
end
for index,name in ipairs(self.TempChatFrames) do
local f = _G[name.."EditBox"]
_G[name.."EditBoxLeft"]:Show()
_G[name.."EditBoxRight"]:Show()
_G[name.."EditBoxMid"]:Show()
f:SetAltArrowKeyMode(true)
f:EnableMouse(true)
f.frame:Hide()
self:SetAttach("BOTTOM")
f:SetFont(Media:Fetch("font", defaults.profile.font), 14)
end
end
-- changed the Hide to SetAlpha(0), the new ChatSystem OnHide handlers go though some looping
-- when in IM style and Classic style, cause heavy delays on the chat edit box.
function mod:ChatEdit_SetLastActiveWindow(frame)
if self.db.profile.hideDialog and frame:IsShown() then
frame:SetAlpha(0)
else
frame:SetAlpha(1)
end
frame:EnableMouse(true)
end
function mod:ChatEdit_DeactivateChat(frame)
if self.db.profile.hideDialog and frame:IsShown() then
frame:SetAlpha(0)
frame:EnableMouse(false)
end
end
function mod:GetOptions()
return options
end
function mod:SetBackdrop()
for _, frame in ipairs(self.frames) do
frame:SetBackdrop({
bgFile = Media:Fetch("background", self.db.profile.background),
edgeFile = Media:Fetch("border", self.db.profile.border),
tile = true,
tileSize = self.db.profile.tileSize,
edgeSize = self.db.profile.edgeSize,
insets = {left = self.db.profile.inset, right = self.db.profile.inset, top = self.db.profile.inset, bottom = self.db.profile.inset}
})
local c = self.db.profile.backgroundColor
frame:SetBackdropColor(c.r, c.g, c.b, c.a)
local c = self.db.profile.borderColor
frame:SetBackdropBorderColor(c.r, c.g, c.b, c.a)
end
end
function mod:SetBorderByChannel(...)
self.hooks.ChatEdit_UpdateHeader(...)
for index, frame in ipairs(self.frames) do
local f = _G["ChatFrame"..index.."EditBox"]
local attr = f:GetAttribute("chatType")
if attr == "CHANNEL" then
local chan = f:GetAttribute("channelTarget")
if chan == 0 then
local c = self.db.profile.borderColor
frame:SetBackdropBorderColor(c.r, c.g, c.b, c.a)
else
local r, g, b = GetMessageTypeColor("CHANNEL" .. chan)
frame:SetBackdropBorderColor(r, g, b, 1)
end
else
local r, g, b = GetMessageTypeColor(attr)
frame:SetBackdropBorderColor(r, g, b, 1)
end
end
end
do
local function startMoving(self)
self:StartMoving()
end
local function stopMoving(self)
self:StopMovingOrSizing()
mod.db.profile.editX = self:GetLeft()
mod.db.profile.editY = self:GetTop()
mod.db.profile.editW = self:GetRight() - self:GetLeft()
end
local cfHeight
local function constrainHeight(self)
self:GetParent():SetHeight(cfHeight)
end
local function startDragging(self)
cfHeight = self:GetParent():GetHeight()
self:GetParent():StartSizing(not self.left and "TOPRIGHT" or "TOPLEFT")
self:SetScript("OnUpdate", constrainHeight)
end
local function stopDragging(self)
local parent = self:GetParent()
parent:StopMovingOrSizing()
self:SetScript("OnUpdate", nil)
mod.db.profile.editX = parent:GetLeft()
mod.db.profile.editY = parent:GetTop()
mod.db.profile.editW = parent:GetWidth()
end
function mod:SetAttach(val, x, y, w)
for i = 1, NUM_CHAT_WINDOWS do
local frame = _G["ChatFrame" .. i .. "EditBox"]
local val = val or self.db.profile.attach
if not x and val == "FREE" then
if self.db.profile.editX and self.db.profile.editY then
x, y, w = self.db.profile.editX, self.db.profile.editY, self.db.profile.editW
else
x, y, w = frame:GetLeft(), frame:GetTop(), max(frame:GetWidth(), (frame:GetRight() or 0) - (frame:GetLeft() or 0))
end
end
if not w or w < 10 then w = 100 end
frame:ClearAllPoints()
-- Turn off clamping
if val ~= "FREE" then
frame:SetMovable(false)
frame.lDrag:EnableMouse(false)
frame.rDrag:EnableMouse(false)
frame:SetScript("OnMouseDown", nil)
frame:SetScript("OnMouseUp", nil)
frame.lDrag:EnableMouse(false)
frame.rDrag:EnableMouse(false)
frame.lDrag:SetScript("OnMouseDown", nil)
frame.rDrag:SetScript("OnMouseDown", nil)
frame.lDrag:SetScript("OnMouseUp", nil)
frame.rDrag:SetScript("OnMouseUp", nil)
end
if val == "TOP" then
-- When on top we need to prevent left clicking from activating the edit box.
frame:SetPoint("BOTTOMLEFT", frame.chatFrame, "TOPLEFT", 0, 3)
frame:SetPoint("BOTTOMRIGHT", frame.chatFrame, "TOPRIGHT", 0, 3)
elseif val == "BOTTOM" then
frame:SetPoint("TOPLEFT", frame.chatFrame, "BOTTOMLEFT", 0, -8)
frame:SetPoint("TOPRIGHT", frame.chatFrame, "BOTTOMRIGHT", 0, -8)
elseif val == "FREE" then
if i == 1 then
frame:SetFrameLevel(frame:GetFrameLevel()+1)
end
frame:EnableMouse(true)
frame:SetMovable(true)
frame:SetResizable(true)
frame:SetScript("OnMouseDown", startMoving)
frame:SetScript("OnMouseUp", stopMoving)
frame:SetWidth(w)
frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", x, y)
frame:SetMinResize(40, 1)
frame.lDrag:EnableMouse(true)
frame.rDrag:EnableMouse(true)
frame.lDrag:SetScript("OnMouseDown", startDragging)
frame.rDrag:SetScript("OnMouseDown", startDragging)
frame.lDrag:SetScript("OnMouseUp", stopDragging)
frame.rDrag:SetScript("OnMouseUp", stopDragging)
elseif val == "LOCK" then
frame:SetWidth(self.db.profile.editW or w)
frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", self.db.profile.editX or x, self.db.profile.editY or y)
end
end
for index,name in ipairs(self.TempChatFrames) do
local frame = _G[name .. "EditBox"]
local val = val or self.db.profile.attach
if not x and val == "FREE" then
x, y, w = frame:GetLeft(), frame:GetTop(), max(frame:GetWidth(), (frame:GetRight() or 0) - (frame:GetLeft() or 0))
end
if not w or w < 10 then w = 100 end
frame:ClearAllPoints()
if val ~= "FREE" then
frame:SetMovable(false)
frame.lDrag:EnableMouse(false)
frame.rDrag:EnableMouse(false)
frame:SetScript("OnMouseDown", nil)
frame:SetScript("OnMouseUp", nil)
frame.lDrag:EnableMouse(false)
frame.rDrag:EnableMouse(false)
frame.lDrag:SetScript("OnMouseDown", nil)
frame.rDrag:SetScript("OnMouseDown", nil)
frame.lDrag:SetScript("OnMouseUp", nil)
frame.rDrag:SetScript("OnMouseUp", nil)
end
if val == "TOP" then
frame:SetPoint("BOTTOMLEFT", _G[name], "TOPLEFT", 0, 3)
frame:SetPoint("BOTTOMRIGHT", _G[name], "TOPRIGHT", 0, 3)
elseif val == "BOTTOM" then
frame:SetPoint("TOPLEFT", _G[name], "BOTTOMLEFT", 0, -8)
frame:SetPoint("TOPRIGHT", _G[name], "BOTTOMRIGHT", 0, -8)
elseif val == "FREE" then
frame:EnableMouse(true)
frame:SetMovable(true)
frame:SetResizable(true)
frame:SetScript("OnMouseDown", startMoving)
frame:SetScript("OnMouseUp", stopMoving)
frame:SetWidth(w)
frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", x, y)
frame:SetMinResize(40, 1)
frame.lDrag:EnableMouse(true)
frame.rDrag:EnableMouse(true)
frame.lDrag:SetScript("OnMouseDown", startDragging)
frame.rDrag:SetScript("OnMouseDown", startDragging)
frame.lDrag:SetScript("OnMouseUp", stopDragging)
frame.rDrag:SetScript("OnMouseUp", stopDragging)
elseif val == "LOCK" then
frame:SetWidth(self.db.profile.editW or w)
frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", self.db.profile.editX or x, self.db.profile.editY or y)
end
end
end
end
function mod:Info()
return L["Lets you customize the position and look of the edit box"]
end
function mod:UpdateHeight()
for i = 1, NUM_CHAT_WINDOWS do
local ff = _G["ChatFrame"..i.."EditBox"]
ff:SetHeight(mod.db.profile.height)
end
for index,name in ipairs(self.TempChatFrames) do
local ff = _G[name.."EditBox"]
ff:SetHeight(mod.db.profile.height)
end
end
+41
View File
@@ -0,0 +1,41 @@
local mod = Chatter:NewModule("Editbox History", "AceHook-3.0" )
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Edit Box History"]
local history, enabled
local defaults = { realm = { history = { } } }
local editbox = DEFAULT_CHAT_FRAME.editBox
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("Editbox History", defaults)
history = self.db.realm.history
-- Hook adding lines
self:SecureHook( editbox, "AddHistoryLine" )
end
function mod:OnEnable()
-- Keeping state if we're enabled or not
enable = false
for _, line in ipairs( history ) do
editbox:AddHistoryLine( line )
end
enabled = true
end
function mod:AddHistoryLine( object, line )
-- While in 'OnEnable' this code just returns
if not self:IsEnabled() or not enabled then return end
local history = history
tinsert( history, line )
-- clear out the excess values
for i=1, #history - object:GetHistoryLines() do
tremove( history, 1 )
end
end
function mod:Info()
return L["Remembers the history of the editbox across sessions."]
end
+61
View File
@@ -0,0 +1,61 @@
local mod = Chatter:NewModule("Group Say (/gr)", "AceHook-3.0", "AceConsole-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Group Say (/gr)"]
local GetNumPartyMembers = _G.GetNumPartyMembers
local IsInInstance = _G.IsInInstance
local GetNumPartyMembers = _G.GetNumPartyMembers
local GetNumRaidMembers = _G.GetNumRaidMembers
local SendChatMessage = _G.SendChatMessage
function mod:Decorate(frame)
self:HookScript(_G[frame:GetName().."EditBox"], "OnTextChanged")
end
function mod:OnEnable()
for i = 1, 10 do
self:HookScript(_G["ChatFrame" .. i .. "EditBox"], "OnTextChanged")
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name.."EditBox"]
if cf then
self:HookScript(cf, "OnTextChanged")
end
end
if not self.slashCommandRegistered then
self:RegisterChatCommand("gr", "SendChatMessage")
self.slashCommandRegistered = true
end
end
function mod:OnTextChanged(obj)
local text = obj:GetText()
if text:sub(1, 4) == "/gr " then
obj:SetText(self:GetGroupDistribution(true) .. text:sub(5));
ChatEdit_ParseText(obj, 0)
end
self.hooks[obj].OnTextChanged(obj)
end
function mod:SendChatMessage(input)
SendChatMessage(input, self:GetGroupDistribution())
end
function mod:GetGroupDistribution(slash)
local inInstance, kind = IsInInstance()
if inInstance and (kind == "pvp") then
return slash and "/bg " or "BATTLEGROUND"
end
if GetNumRaidMembers() > 0 then
return slash and "/ra " or "RAID"
end
if GetNumPartyMembers() > 0 then
return slash and "/p " or "PARTY"
end
return slash and "/s " or "SAY"
end
function mod:Info()
return L["Provides a /gr slash command to let you speak in your group (raid, party, or battleground) automatically."]
end
+253
View File
@@ -0,0 +1,253 @@
local mod = Chatter:NewModule("Highlights", "AceHook-3.0", "AceEvent-3.0", "LibSink-2.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Highlights"]
local Media = LibStub("LibSharedMedia-3.0")
local PlaySoundFile = _G.PlaySoundFile
local UnitName = _G.UnitName
local pairs = _G.pairs
local select = _G.select
local type = _G.type
local gsub = _G.string.gsub
local ChatFrame_GetMessageEventFilters = _G.ChatFrame_GetMessageEventFilters
local defSound = {["None"] = [[Interface\Quiet.mp3]]}
Media:Register("sound", "Loot Chime", [[Sound\interface\igLootCreature.wav]])
Media:Register("sound", "Whisper Ping", [[Sound\interface\iTellMessage.wav]])
Media:Register("sound", "Magic Click", [[Sound\interface\MagicClick.wav]])
local player = UnitName("player")
local defaults = {
profile = {
words = {
[player:lower()] = player
},
sound = true,
soundFile = "None",
useSink = true,
rerouteMessage = true,
customChannels = {},
sinkOptions = {}
}
}
local options = {
defaultOptions = {
type = "group",
name = L["Options"],
order = 1,
args = {
sound = {
type = "toggle",
name = L["Use sound"],
desc = L["Play a soundfile when one of your keywords is said."],
get = function()
return mod.db.profile.sound
end,
set = function(info, v)
mod.db.profile.sound = v
end
},
sink = {
type = "toggle",
name = L["Show SCT message"],
desc = L["Show highlights in your SCT mod"],
order = 21,
get = function()
return mod.db.profile.useSink
end,
set = function(info, v)
mod.db.profile.useSink = v
end
},
rerouteMessage = {
type = "toggle",
name = L["Reroute whole message to SCT"],
desc = L["Reroute whole message to SCT instead of just displaying 'who said keyword in channel'"],
order = 22,
get = function()
return mod.db.profile.rerouteMessage
end,
set = function(info, v)
mod.db.profile.rerouteMessage = v
end,
disabled = function() return not mod.db.profile.useSink end
},
soundFile = {
type = "select",
name = L["Sound File"],
desc = L["Sound file to play"],
get = function()
return mod.db.profile.soundFile
end,
set = function(info, v)
mod.db.profile.soundFile = v
PlaySoundFile(Media:Fetch("sound", v))
end,
dialogControl = "LSM30_Sound",
values = function () if Media:HashTable("sound") then return Media:HashTable("sound") else return defSound end end,
disabled = function() return not mod.db.profile.sound end
},
addWord = {
type = "input",
name = L["Add Word"],
desc = L["Add word to your highlight list"],
get = function() end,
set = function(info, v)
-- no whitespace only stuff
if v:match("^%s*$") then return end
mod.db.profile.words[v:lower()] = v
end
},
removeWord = {
type = "select",
name = L["Remove Word"],
desc = L["Remove a word from your highlight list"],
get = function() end,
set = function(info, v)
mod.db.profile.words[v:lower()] = nil
end,
values = function() return mod.db.profile.words end,
confirm = function(info, v) return (L["Remove this word from your highlights?"]) end
}
}
},
config = {
type = "group",
name = L["Custom Channel Sounds"],
args = {}
}
}
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("Highlight", defaults)
self:AddCustomChannels(GetChannelList())
self:SetSinkStorage(self.db.profile.sinkOptions)
options.output = self:GetSinkAce3OptionsDataTable()
end
local words
function mod:OnEnable()
words = self.db.profile.words
self:RegisterEvent("CHAT_MSG_SAY", "ParseChat")
self:RegisterEvent("CHAT_MSG_GUILD", "ParseChat")
self:RegisterEvent("CHAT_MSG_BATTLEGROUND", "ParseChat")
self:RegisterEvent("CHAT_MSG_BATTLEGROUND_LEADER", "ParseChat")
self:RegisterEvent("CHAT_MSG_OFFICER", "ParseChat")
self:RegisterEvent("CHAT_MSG_PARTY", "ParseChat")
self:RegisterEvent("CHAT_MSG_RAID_LEADER", "ParseChat")
self:RegisterEvent("CHAT_MSG_RAID", "ParseChat")
self:RegisterEvent("CHAT_MSG_RAID_WARNING", "ParseChat")
self:RegisterEvent("CHAT_MSG_SAY", "ParseChat")
self:RegisterEvent("CHAT_MSG_WHISPER", "ParseChat")
self:RegisterEvent("CHAT_MSG_BN_WHISPER", "ParseChat")
self:RegisterEvent("CHAT_MSG_BN_CONVERSATION", "ParseChat")
self:RegisterEvent("CHAT_MSG_CHANNEL", "ParseChat")
self:RegisterEvent("CHAT_MSG_YELL", "ParseChat")
self:RegisterEvent("CHAT_MSG_CHANNEL_NOTICE")
self:AddCustomChannels(GetChannelList())
self:AddCustomChannels(
"YELL", L["Yell"],
"GUILD", L["Guild"],
"OFFICER", L["Officer"],
"RAID", L["Raid"],
"PARTY", L["Party"],
"RAID_WARNING", L["Raid Warning"],
"SAY", L["Say"],
"BATTLEGROUND", L["Battleground"],
"BATTLEGROUND_LEADER", L["Battleground"],
"WHISPER", L["Whisper"],
"BN_WHISPER", L["RealID Whisper"],
"BN_CONVERSATION", L["RealID Conversation"]
)
end
function mod:CHAT_MSG_CHANNEL_NOTICE(evt, notice)
self:AddCustomChannels(GetChannelList())
end
function mod:AddCustomChannels(...)
-- excludeChannels(EnumerateServerChannels())
for i = 1, select("#", ...), 2 do
local id, name = select(i, ...)
if not options[name:gsub(" ", "_")] then
options.config.args[name:gsub(" ", "_")] = {
type = "select",
name = name,
values = Media:HashTable("sound") or {},
desc = L["Play a sound when a message is received in this channel"],
order = type(id) == "number" and 103 or 102,
get = function() return self.db.profile.customChannels[id] or "None" end,
set = function(info, v)
self.db.profile.customChannels[id] = v
PlaySoundFile(Media:Fetch("sound", v))
end
}
end
end
end
function mod:ParseChat(evt, msg, sender, ...)
if sender == player then return end
local filters = ChatFrame_GetMessageEventFilters(evt)
if filters then
for i, filterFunc in ipairs(filters) do
local filtered, new_message = filterFunc(DEFAULT_CHAT_FRAME, evt, msg, sender, ...)
if filtered then
return
end
msg = new_message or msg
end
end
local msg = msg:lower()
for k, v in pairs(words) do
if msg:find(k) then
self:Highlight(msg, sender, k, select(7, ...), evt)
return
end
end
if evt == "CHAT_MSG_CHANNEL" then
local num = select(6, ...)
local snd = self.db.profile.customChannels[num]
if snd then
PlaySoundFile(Media:Fetch("sound", snd))
return
end
else
local e = evt:gsub("^CHAT_MSG_", "")
local snd = self.db.profile.customChannels[e]
if snd then
PlaySoundFile(Media:Fetch("sound", snd))
return
end
end
end
function mod:Highlight(msg, who, what, where, event)
if not where or #where == 0 then
where = _G[event] or event:gsub("CHAT_MSG_", "")
end
if self.db.profile.sound then
PlaySoundFile(Media:Fetch("sound", self.db.profile.soundFile))
end
if self.db.profile.useSink then
if mod.db.profile.rerouteMessage then
msg = gsub( msg, "|h[^|]+|h(.-)|h", "%1" )
self:Pour((L["[%s] %s: %s"]):format(where, who, msg), 1, 1, 0, nil, 24, "OUTLINE", false)
else
self:Pour((L["%s said '%s' in %s"]):format(who, what, where), 1, 1, 0, nil, 24, "OUTLINE", false)
end
end
end
function mod:Info()
return L["Alerts you when someone says a keyword or speaks in a specified channel."]
end
function mod:GetOptions()
return options
end
-- vim: ts=4 noexpandtab
+56
View File
@@ -0,0 +1,56 @@
local mod = Chatter:NewModule("Justify Text")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Text Justification"]
mod.toggleLabel = L["Enable text justification"]
local defaults = {
profile = {}
}
local VALID_JUSTIFICATIONS = {
LEFT = L["Left"],
RIGHT = L["Right"],
CENTER = L["Center"]
}
local options = {}
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("JustifyText", defaults)
for i = 1, NUM_CHAT_WINDOWS do
local s = "FRAME_" .. i
local f = _G["ChatFrame" .. i]
options[s] = {
type = "select",
name = L["Chat Frame "] .. i,
desc = L["Chat Frame "] .. i,
values = VALID_JUSTIFICATIONS,
get = function() return self.db.profile[s] or "LEFT" end,
set = function(info, v)
self.db.profile[s] = v
f:SetJustifyH(v)
end
}
end
end
function mod:OnEnable()
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
cf:SetJustifyH(self.db.profile["FRAME_" .. i] or "LEFT")
end
end
function mod:OnDisable()
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
cf:SetJustifyH("LEFT")
end
end
function mod:GetOptions()
return options
end
function mod:Info()
return L["Lets you set the justification of text in your chat frames."]
end
+53
View File
@@ -0,0 +1,53 @@
local mod = Chatter:NewModule("Link Hover", "AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Link Hover"]
local strmatch = _G.string.match
local linkTypes = {
item = true,
enchant = true,
spell = true,
quest = true,
-- player = true
}
function mod:Decorate(frame)
self:HookScript(frame, "OnHyperlinkEnter", enter)
self:HookScript(frame, "OnHyperlinkLeave", leave)
end
function mod:OnEnable()
for i = 1, NUM_CHAT_WINDOWS do
local frame = _G["ChatFrame"..i]
self:HookScript(frame, "OnHyperlinkEnter", enter)
self:HookScript(frame, "OnHyperlinkLeave", leave)
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
self:HookScript(cf, "OnHyperlinkEnter", enter)
self:HookScript(cf, "OnHyperlinkLeave", leave)
end
end
end
function mod:OnHyperlinkEnter(f, link)
local t = strmatch(link, "^(.-):")
if linkTypes[t] then
ShowUIPanel(GameTooltip)
GameTooltip:SetOwner(UIParent, "ANCHOR_CURSOR")
GameTooltip:SetHyperlink(link)
GameTooltip:Show()
end
end
function mod:OnHyperlinkLeave(f, link)
local t = strmatch(link, "^(.-):")
if linkTypes[t] then
HideUIPanel(GameTooltip)
end
end
function mod:Info()
return L["Makes link tooltips show when you hover them in chat."]
end
+711
View File
@@ -0,0 +1,711 @@
local mod = Chatter:NewModule("Player Class Colors", "AceHook-3.0", "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
local AceTab = LibStub("AceTab-3.0")
mod.modName = L["Player Names"]
local local_names = {}
local leftBracket, rightBracket, separator
local colorSelfInText, emphasizeSelfInText
local gsub = _G.string.gsub
local strmatch = _G.string.match
local find = _G.string.find
local pairs = _G.pairs
local wipe = _G.wipe
local string_format = _G.string.format
local GetQuestDifficultyColor = _G.GetQuestDifficultyColor
local GetChannelName = _G.GetChannelName
local GetFriendInfo = _G.GetFriendInfo
local GetGuildRosterInfo = _G.GetGuildRosterInfo
local GetGuildRosterSelection = _G.GetGuildRosterSelection
local GetGuildRosterShowOffline = _G.GetGuildRosterShowOffline
local GetNumFriends = _G.GetNumFriends
local GetNumGuildMembers = _G.GetNumGuildMembers
local GetNumPartyMembers = _G.GetNumPartyMembers
local GetNumRaidMembers = _G.GetNumRaidMembers
local GetNumWhoResults = _G.GetNumWhoResults
local GetWhoInfo = _G.GetWhoInfo
local GuildRoster = _G.GuildRoster
local SetGuildRosterSelection = _G.SetGuildRosterSelection
local SetGuildRosterShowOffline = _G.SetGuildRosterShowOffline
local UnitClass = _G.UnitClass
local UnitExists = _G.UnitExists
local UnitIsFriend = _G.UnitIsFriend
local UnitIsPlayer = _G.UnitIsPlayer
local UnitLevel = _G.UnitLevel
local UnitName = _G.UnitName
local floor = _G.math.floor
local select = _G.select
local setmetatable = _G.setmetatable
local sqrt = _G.sqrt
local tinsert = _G.tinsert
local type = _G.type
local player = UnitName("player")
local channels = {
GUILD = {},
PARTY = {},
RAID = {}
}
local colorMethods = {
CLASS = L["Class"],
NAME = L["Name"],
NONE = L["None"],
}
local defaults = {
realm = {
names = {},
levels = {},
},
profile = {
saveData = false,
nameColoring = "CLASS",
leftBracket = "[",
rightBracket = "]",
separator = ":",
useTabComplete = true,
colorSelfInText = true,
emphasizeSelfInText = true,
},
global = {}
}
defaults.global.classes = {}
for _, class in ipairs(CLASS_SORT_ORDER) do
defaults.global.classes[class] = LOCALIZED_CLASS_NAMES_MALE[class]
end
local default_nick_color = { ["r"] = 0.627, ["g"] = 0.627, ["b"] = 0.627 }
local localizedToSystemClass = table.invert(defaults.global.classes)
local tabComplete
do
function tabComplete(t, text, pos)
local word = text:sub(pos)
if #word == 0 then return end
local cf = ChatEdit_GetActiveWindow()
local channel = cf:GetAttribute("chatType")
if channel == "CHANNEL" then
channel = select(2, GetChannelName(cf:GetAttribute("channelTarget"))):lower()
elseif channel == "OFFICER" then
channel = "GUILD"
elseif channel == "RAID_WARNING" or channel == "RAID_LEADER" or channel == "BATTLEGROUND" or channel == "BATTLEGROUND_LEADER" then
channel = "RAID"
end
if channels[channel] then
for k, v in pairs(channels[channel]) do
if k:lower():match("^" .. word:lower()) then
tinsert(t, k)
end
end
end
return t
end
end
local getNameColor
do
local sq2 = sqrt(2)
local pi = _G.math.pi
local cos = _G.math.cos
local fmod = _G.math.fmod
local strbyte = _G.strbyte
local t = {}
-- http://www.tecgraf.puc-rio.br/~mgattass/color/HSVtoRGB.htm
local function HSVtoRGB(h, s, v)
if ( s == 0 ) then
--achromatic=fail
t.r = v
t.g = v
t.b = v
if not t.r then t.r = 0 end
if not t.g then t.g = 0 end
if not t.b then t.b = 0 end
return t.r,t.g,t.b
end
h = h/60
local i = floor(h)
local i1 = v * (1 - s)
local i2 = v * (1 - s * (h - i))
local i3 = v * (1 - s * (1 - (h - i)))
if i == 0 then
-- return v, i3, i1
t.r = v
t.g = i3
t.b = i1
elseif i == 1 then
-- return i2, v, i1
t.r = i2
t.g = v
t.b = i1
elseif i == 2 then
-- return i1, v, i3
t.r = i1
t.g = v
t.b = i3
elseif i == 3 then
-- return i3, i2, v
t.r = i3
t.g = i2
t.b = v
elseif i == 4 then
-- return i3, i1, v
t.r = i3
t.g = i1
t.b = v
elseif i == 5 then
-- return v, i1, i2
t.r = v
t.g = i1
t.b = i2
else
DEFAULT_CHAT_FRAME:AddMessage("Chatter HSVtoRGB failed")
end
if not t.r then t.r = 0 end
if not t.g then t.g = 0 end
if not t.b then t.b = 0 end
return t.r,t.g,t.b
end
function getNameColor(name)
local seed = 5381 --old seed: 5124
local h, s, v = 1, 1, 1
local r, g, b
for i = 1, #name do
seed = 33 * seed + strbyte(name, i) --used to use 29 here
end
-- h = fmod(seed, 255) / 255
h = fmod(seed, 360) --changed the HSVtoRGB to acompany this change
if (h > 220) and (h < 270) then
h = h + 60
end
t.r, t.g, t.b = HSVtoRGB(h, s, v)
return t
end
end
local cache = {};
local function wipeCache()
wipe(cache)
end
local function updateSaveData(v)
if v then
for k, v in pairs(local_names) do
mod.db.realm.names[k] = v
end
end
end
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("PlayerNames", defaults)
for k, v in pairs(self.db.realm.names) do
if type(v) == "string" then
self.db.realm.names[k] = {class = v}
end
end
if self.db.global and self.db.global.names then
self.db.global.names = nil -- get rid of old data
end
end
function mod:Decorate(frame)
if not self:IsHooked(frame,"AddMessage") then
self:RawHook(frame, "AddMessage", true)
end
end
function mod:OnEnable()
self:RegisterEvent("RAID_ROSTER_UPDATE")
self:RegisterEvent("PARTY_MEMBERS_CHANGED")
self:RegisterEvent("WHO_LIST_UPDATE")
self:RegisterEvent("PLAYER_TARGET_CHANGED")
self:RegisterEvent("CHAT_MSG_SYSTEM", "WHO_LIST_UPDATE")
self:RegisterEvent("FRIENDLIST_UPDATE")
self:RegisterEvent("GUILD_ROSTER_UPDATE")
self:RegisterEvent("CHAT_MSG_CHANNEL_JOIN")
self:RegisterEvent("CHAT_MSG_CHANNEL_LEAVE")
self:RegisterEvent("CHAT_MSG_CHANNEL", "CHAT_MSG_CHANNEL_JOIN")
leftBracket, rightBracket, separator = self.db.profile.leftBracket, self.db.profile.rightBracket, self.db.profile.separator
colorSelfInText, emphasizeSelfInText = self.db.profile.colorSelfInText, self.db.profile.emphasizeSelfInText
if IsInGuild() then
GuildRoster()
end
self:RAID_ROSTER_UPDATE()
self:PARTY_MEMBERS_CHANGED()
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
if cf ~= COMBATLOG then
self:RawHook(cf, "AddMessage", true)
end
end
for index,frame in ipairs(self.TempChatFrames) do
local cf = _G[frame]
self:RawHook(cf, "AddMessage", true)
end
if self.db.profile.useTabComplete then
AceTab:RegisterTabCompletion("Chatter", nil, tabComplete)
end
if CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS.RegisterCallback then
CUSTOM_CLASS_COLORS:RegisterCallback(wipeCache)
end
end
function mod:OnDisable()
if AceTab:IsTabCompletionRegistered("Chatter") then
AceTab:UnregisterTabCompletion("Chatter")
end
if CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS.UnregisterCallback then
CUSTOM_CLASS_COLORS:UnregisterCallback(wipeCache)
end
end
function mod:ClearCustomClassColorCache()
end
function mod:AddPlayer(name, class, level, save)
if name and class and class ~= UNKNOWN then
if save or self.db.realm.names[name] then -- if we already have an entry saved from elsewhere, we update it regardless of the requested "save" type - nothing else makes sense
self.db.realm.names[name] = self.db.realm.names[name] or {}
self.db.realm.names[name].class = class
if level and level ~= 0 then
self.db.realm.names[name].level = level
end
else
local_names[name] = local_names[name] or {}
local_names[name].class = class
if level and level ~= 0 then
local_names[name].level = level
end
end
cache[name] = nil
end
end
function mod:FRIENDLIST_UPDATE(evt)
for i = 1, GetNumFriends() do
local name, level, class = GetFriendInfo(i)
if class then
self:AddPlayer(name, localizedToSystemClass[class], level, self.db.profile.saveFriends)
end
end
end
--[[
function mod:GUILD_ROSTER_UPDATE(evt)
local n = GetNumGuildMembers()
if not n or n == 0 then
return
end
local offline = GetGuildRosterShowOffline()
local selection = GetGuildRosterSelection()
self:UnregisterEvent("GUILD_ROSTER_UPDATE")
SetGuildRosterShowOffline(true)
SetGuildRosterSelection(0)
GetGuildRosterInfo(0)
n = GetNumGuildMembers()
for k, v in pairs(channels.GUILD) do
channels.GUILD[k] = nil
end
for i = 1, n do
local name, _, _, level, _, _, _, _, online, _, class = GetGuildRosterInfo(i)
if online then
channels.GUILD[name] = name
end
self:AddPlayer(name, class, level, self.db.profile.saveGuild)
end
SetGuildRosterShowOffline(offline)
SetGuildRosterSelection(selection)
self:RegisterEvent("GUILD_ROSTER_UPDATE")
end
]]
function mod:GUILD_ROSTER_UPDATE(evt)
if not IsInGuild() then return end
wipe( channels.GUILD )
for i = 1, GetNumGuildMembers() do
local name, _, _, level, _, _, _, _, online, _, class = GetGuildRosterInfo(i)
if online then
channels.GUILD[name] = name
end
self:AddPlayer(name, class, level, self.db.profile.saveGuild)
end
end
function mod:RAID_ROSTER_UPDATE(evt)
wipe(channels.RAID)
for i = 1, GetNumRaidMembers() do
local n, _, _, l, _, c = GetRaidRosterInfo(i)
if n and c and l then
channels.RAID[n] = true
self:AddPlayer(n, c, l, self.db.profile.saveParty)
end
end
end
function mod:PARTY_MEMBERS_CHANGED(evt)
wipe(channels.PARTY)
for i = 1, GetNumPartyMembers() do
local n = UnitName("party" .. i)
local _, c = UnitClass("party" .. i)
local l = UnitLevel("party" .. i)
channels.PARTY[n] = true
self:AddPlayer(n, c, l, self.db.profile.saveParty)
end
end
function mod:PLAYER_TARGET_CHANGED(evt)
if not UnitExists("target") or not UnitIsPlayer("target") or not UnitIsFriend("player", "target") then return end
local _, c = UnitClass("target")
local l = UnitLevel("target")
self:AddPlayer(UnitName("target"), c, l, self.db.profile.saveTarget)
end
function mod:UPDATE_MOUSEOVER_UNIT(evt)
if not UnitExists("mouseover") or not UnitIsPlayer("mouseover") or not UnitIsFriend("player", "mouseover") then return end
local _, c = UnitClass("mouseover")
local l = UnitLevel("mouseover")
self:AddPlayer(UnitName("mouseover"), c, l, self.db.profile.saveTarget)
end
function mod:WHO_LIST_UPDATE(evt)
if GetNumWhoResults() <= 3 or self.db.profile.saveAllWho then
for i = 1, GetNumWhoResults() do
local name, _, level, _, _, _, class = GetWhoInfo(i)
if class then
self:AddPlayer(name, class, level, self.db.profile.saveWho)
end
end
end
end
function mod:CHAT_MSG_CHANNEL_JOIN(evt, _, name, _, _, _, _, _, _, chan)
channels[chan:lower()] = channels[chan:lower()] or {}
channels[chan:lower()][name] = true
end
function mod:CHAT_MSG_CHANNEL_LEAVE(evt, _, name, _, _, _, _, _, _, chan)
if not channels[chan:lower()] then return end
channels[chan:lower()][name] = nil
end
local function changeName(msgHeader, name, extra, msgCnt,displayName, msgBody)
if name ~= player then
if emphasizeSelfInText then
msgBody = msgBody:gsub("("..player..")" , "|cffffff00>|r%1|cffffff00<|r"):gsub("("..player:lower()..")" , "|cffffff00>|r%1|cffffff00<|r")
end
if colorSelfInText then
msgBody = msgBody:gsub("("..player..")" , "|cffff0000%1|r"):gsub("("..player:lower()..")" , "|cffff0000%1|r")
end
end
if not strmatch( displayName, "|cff" ) then
displayName = mod:ColorName( name )
end
cache[name] = displayName
local level
local tab = mod.db.realm.names[name] or local_names[name]
if tab then
level = mod.db.profile.includeLevel and tab.level or nil
end
if level and (level ~= 80 or not mod.db.profile.excludeMaxLevel) then
if mod.db.profile.levelByDiff then
local c = GetQuestDifficultyColor(level)
level = ("|cff%02x%02x%02x%s|r"):format(c.r * 255, c.g * 255, c.b * 255, level)
displayName = ("%s%s%s"):format( displayName, separator, level )
else
-- If we already have a color -- steal it and use it to color the level
if strmatch( displayName, "|cff......" ) then
-- This will seriously fuck up the string if there is already more than 1 color ... FIXME
level = gsub(displayName, "((|cff......).-|r)", function (string, color)
return ("%s%s|r"):format( color, level )
end )
end
displayName = ("%s%s%s"):format( displayName, separator, level )
end
end
return ("|Hplayer:%s%s%s|h%s%s%s|h%s"):format(name, extra, msgCnt, leftBracket, displayName, rightBracket, msgBody)
end
function mod:ColorName( name )
local class
local tab = mod.db.realm.names[name] or local_names[name]
if tab then class = tab.class end
-- already known?
if cache[name] then
name = cache[name]
else
local coloring = mod.db.profile.nameColoring
-- not yet colored by blizzy
if coloring ~= "NONE" then
local c = default_nick_color
if coloring == "CLASS" then
c = CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[class] or RAID_CLASS_COLORS[class] or default_nick_color
elseif coloring == "NAME" then
c = getNameColor(name)
end
name = ("|cff%02x%02x%02x%s|r"):format(c.r * 255, c.g * 255, c.b * 255, name )
end
end
return name
end
function mod:AddMessage(frame, text, ...)
if text and type(text) == "string" then
text = text:gsub("(|Hplayer:([^|:]+)([:%d+]*)([^|]*)|h%[([^%]]+)%]|h)(.-)$", changeName)
end
return self.hooks[frame].AddMessage(frame, text, ...)
end
function mod:Info()
return L["Provides options to color player names, add player levels, and add tab completion of player names."]
end
local options
function mod:GetOptions()
if not options then -- save RAM / load time
options = {
save = {
type = "group",
name = L["Save Data"],
desc = L["Save data between sessions. Will increase memory usage"],
args = {
guild = {
type = "toggle",
name = L["Guild"],
desc = L["Save class data from guild between sessions."],
get = function()
return mod.db.profile.saveGuild
end,
set = function(info, v)
mod.db.profile.saveGuild = v
updateSaveData(v)
end
},
group = {
type = "toggle",
name = L["Group"],
desc = L["Save class data from groups between sessions."],
get = function()
return mod.db.profile.saveGroup
end,
set = function(info, v)
mod.db.profile.saveGroup = v
updateSaveData(v)
end
},
friend = {
type = "toggle",
name = L["Friends"],
desc = L["Save class data from friends between sessions."],
get = function()
return mod.db.profile.saveFriends
end,
set = function(info, v)
mod.db.profile.saveFriends = v
updateSaveData(v)
end
},
target = {
type = "toggle",
name = L["Target/Mouseover"],
desc = L["Save class data from target/mouseover between sessions."],
get = function()
return mod.db.profile.saveTarget
end,
set = function(info, v)
mod.db.profile.saveTarget = v
updateSaveData(v)
end
},
who = {
type = "toggle",
name = L["Who"],
desc = L["Save class data from /who queries between sessions."],
order = 104,
get = function()
return mod.db.profile.saveWho
end,
set = function(info, v)
mod.db.profile.saveWho = v
updateSaveData(v)
end
},
saveAllWho = {
type = "toggle",
name = L["Save all /who data"],
desc = L["Will save all data for large /who queries"],
disabled = function() return not mod.db.profile.saveWho end,
order = 105,
get = function()
return mod.db.profile.saveAllWho
end,
set = function(info, v)
mod.db.profile.saveAllWho = v
end
},
resetDB = {
type = "execute",
name = L["Reset Data"],
desc = L["Destroys all your saved class/level data"],
func = function() wipe( mod.db.realm.names ) end,
order = 101,
confirm = function() return L["Are you sure you want to delete all your saved class/level data?"] end
}
}
},
leftbracket = {
type = "input",
name = L["Left Bracket"],
desc = L["Character to use for the left bracket"],
get = function() return mod.db.profile.leftBracket end,
set = function(i, v)
mod.db.profile.leftBracket = v
leftBracket = v
end
},
rightbracket = {
type = "input",
name = L["Right Bracket"],
desc = L["Character to use for the right bracket"],
get = function() return mod.db.profile.rightBracket end,
set = function(i, v)
mod.db.profile.rightBracket = v
rightBracket = v
end
},
separator = {
type = "input",
name = L["Separator"],
desc = L["Character to use between the name and level"],
get = function() return mod.db.profile.separator end,
set = function(i, v)
mod.db.profile.separator = v
separator = v
end
},
useTabComplete = {
type = "toggle",
name = L["Use Tab Complete"],
desc = L["Use tab key to automatically complete character names."],
get = function() return mod.db.profile.useTabComplete end,
set = function(info, v)
mod.db.profile.useTabComplete = v
if v and not AceTab:IsTabCompletionRegistered("Chatter") then
AceTab:RegisterTabCompletion("Chatter", nil, tabComplete)
elseif not v and AceTab:IsTabCompletionRegistered("Chatter") then
AceTab:UnregisterTabCompletion("Chatter")
end
end
},
colorSelfInText = {
type = "toggle",
name = L["Color self in messages"],
desc = L["Color own charname in messages."],
get = function() return mod.db.profile.colorSelfInText end,
set = function(i, v)
mod.db.profile.colorSelfInText = v
colorSelfInText = v
end
},
emphasizeSelfInText = {
type = "toggle",
name = L["Emphasize self in messages"],
desc = L["Add surrounding brackets to own charname in messages."],
width = "double",
get = function() return mod.db.profile.emphasizeSelfInText end,
set = function(i, v)
mod.db.profile.emphasizeSelfInText = v
emphasizeSelfInText = v
end
},
levelHeader = {
type = "header",
name = L["Level Options"],
order = 104
},
includeLevel = {
type = "toggle",
name = L["Include level"],
desc = L["Include the player's level"],
order = 105,
get = function() return mod.db.profile.includeLevel end,
set = function(info, val)
mod.db.profile.includeLevel = val
wipeCache()
end
},
excludeMaxLevel = {
type = "toggle",
name = L["Exclude max levels"],
desc = L["Exclude level display for max level characters"],
order = 105,
get = function() return mod.db.profile.excludeMaxLevel end,
set = function(info, val)
mod.db.profile.excludeMaxLevel = val
wipeCache()
end,
hidden = function() return not mod.db.profile.includeLevel end
},
colorLevelByDifficulty = {
type = "toggle",
name = L["Color level by difficulty"],
desc = L["Color level by difficulty"],
order = 105,
get = function()
return mod.db.profile.levelByDiff
end,
set = function(info, v)
mod.db.profile.levelByDiff = v
wipeCache()
end,
hidden = function() return not mod.db.profile.includeLevel end
},
colorBy = {
type = "select",
name = L["Color Player Names By..."],
desc = L["Select a method for coloring player names"],
values = colorMethods,
get = function() return mod.db.profile.nameColoring end,
set = function(info, val)
mod.db.profile.nameColoring = val
wipeCache()
end
}
}
end
return options
end
+90
View File
@@ -0,0 +1,90 @@
local mod = Chatter:NewModule("Scrollback")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Scrollback"]
mod.toggleLabel = L["Enable Scrollback length modification"]
local defaults = {
profile = {}
}
local options = {}
local cache = setmetatable({}, {__mode='k'})
local function acquire()
local t = next(cache) or {}
cache[t] = nil
return t
end
local function reclaim(t)
for k in pairs(t) do
t[k] = nil
end
cache[t] = true
end
local function setlines(frame, lines)
if frame:GetMaxLines() ~= lines then
local history = acquire()
for regions = frame:GetNumRegions(),1,-1 do
local region = select(regions, frame:GetRegions())
if region:GetObjectType() == "FontString" then
table.insert(history, {region:GetText(), region:GetTextColor() })
end
end
frame:SetMaxLines(lines or 250)
Chatter.loading = true
for k,v in pairs(history) do
frame:AddMessage(unpack(v))
end
Chatter.loading = false
reclaim(history)
end
end
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("Scrollback", defaults)
for i = 1, NUM_CHAT_WINDOWS do
local s = "FRAME_" .. i
local frame = _G["ChatFrame" .. i]
options[s] = {
type = "range",
name = L["Chat Frame "] .. i,
desc = L["Chat Frame "] .. i,
min = 250,
max = 2500,
step = 10,
get = function() return self.db.profile[s] or 250 end,
set = function(info, value)
self.db.profile[s] = value
setlines(frame, value)
end
}
end
end
function mod:OnEnable()
for i = 1, NUM_CHAT_WINDOWS do
setlines(_G["ChatFrame"..i], self.db.profile["FRAME_"..i])
end
end
function mod:OnDisable()
for i = 1, NUM_CHAT_WINDOWS do
setlines(_G["ChatFrame"..i], 250)
end
end
function mod:GetOptions()
return options
end
function mod:Info()
return L["Lets you set the scrollback length of your chat frames."]
end
+74
View File
@@ -0,0 +1,74 @@
local mod = Chatter:NewModule("Server Positioning", "AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Server Positioning"]
local defaults = {
profile = {
windowdata = {
['*'] = {
-- Blizzard defaults
width = 430,
height = 120,
}
}
}
}
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("Server Positioning", defaults)
self.db.RegisterCallback(self, "OnProfileChanged", "UpdateWindowData")
self.db.RegisterCallback(self, "OnProfileCopied", "UpdateWindowData")
self.db.RegisterCallback(self, "OnProfileReset", "UpdateWindowData")
end
function mod:Info()
return L["Disable server side storage of chat frame position and size."]
end
function mod:OnEnable()
self:RawHook('SetChatWindowSavedPosition', true)
self:RawHook('GetChatWindowSavedPosition', true)
self:RawHook('SetChatWindowSavedDimensions', true)
self:RawHook('GetChatWindowSavedDimensions', true)
self:UpdateWindowData()
end
function mod:OnDisable()
self:UnhookAll()
self:UpdateWindowData()
end
function mod:SetChatWindowSavedPosition(id, point, xOffset, yOffset)
local data = self.db.profile.windowdata[id]
data.point, data.xOffset, data.yOffset = point, xOffset, yOffset
end
function mod:GetChatWindowSavedPosition(id)
local data = self.db.profile.windowdata[id]
if not data.point then
data.point, data.xOffset, data.yOffset = self.hooks.GetChatWindowSavedPosition(id)
end
return data.point, data.xOffset, data.yOffset
end
function mod:SetChatWindowSavedDimensions(id, width, height)
local data = self.db.profile.windowdata[id]
data.width, data.height = width, height
end
function mod:GetChatWindowSavedDimensions(id)
local data = self.db.profile.windowdata[id]
if not data.width then
data.width, data.height = self.hooks.GetChatWindowSavedDimensions(id)
end
return data.width, data.height
end
function mod:UpdateWindowData()
for i = 1,NUM_CHAT_WINDOWS do
local frame = _G["ChatFrame"..i]
if frame and type(frame.GetID) == "function" then
FloatingChatFrame_Update(frame:GetID())
end
end
end
+98
View File
@@ -0,0 +1,98 @@
local mod = Chatter:NewModule("Message Splitting", "AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Message Split"]
function mod:Info()
return L["Allows you to type messages longer than normal, and splits message that are too long."]
end
local function ChatEdit_SendText(editBox, addHistory, doParse)
if doParse then
ChatEdit_ParseText(editBox, 1);
end
local type = editBox:GetAttribute("chatType");
local text = editBox:GetText();
if ( strfind(text, "%s*[^%s]+") ) then
if ( type == "WHISPER") then
local target = editBox:GetAttribute("tellTarget");
ChatEdit_SetLastToldTarget(target);
SendChatMessage(text, type, editBox.language, target);
elseif ( type == "CHANNEL") then
SendChatMessage(text, type, editBox.language, editBox:GetAttribute("channelTarget"));
else
SendChatMessage(text, type, editBox.language);
end
if ( addHistory ) then
ChatEdit_AddHistory(editBox);
end
end
end
local MAX = 256
local getChunk
do
local buf = {}
function getChunk(text, start)
local stack = 0
local first = nil
buf = wipe(buf)
if start > #text then return nil end
for i = start, start + MAX - 1 do
local byte = text:sub(i, i)
local bit = text:sub(i, i+1)
if bit == "|c" or bit == "|H" then
first = first or i
stack = stack + 1
elseif (bit == "|r" or bit == "|h") and stack > 0 and first then
stack = stack - 1
if stack == 0 then
tinsert(buf, text:sub(first, i))
first = nil
end
elseif (byte == " " or byte == "") and stack == 0 and first then
tinsert(buf, text:sub(first or 1, i))
first = nil
else
first = first or i
end
end
if #buf == 0 then return nil end
local str = table.concat(buf, "")
return start + #str, str
end
end
function mod:OnEnterPressed(editBox)
local text = editBox:GetText()
if #text <= 255 then
ChatEdit_OnEnterPressed(editBox)
return
end
local first = true
for start, chunk in getChunk, text, 1 do
editBox:SetText(chunk)
ChatEdit_SendText(editBox, true, first);
first = false
end
local type = editBox:GetAttribute("chatType");
if ( ChatTypeInfo[type].sticky == 1 ) then
editBox:SetAttribute("stickyType", type);
end
ChatEdit_OnEscapePressed(editBox);
end
function mod:OnEnable()
ChatFrameEditBox:SetMaxLetters(2048)
ChatFrameEditBox:SetMaxBytes(2048)
self:RawHookScript(ChatFrameEditBox, "OnEnterPressed")
end
function mod:OnDisable()
ChatFrameEditBox:SetMaxLetters(256)
ChatFrameEditBox:SetMaxBytes(256)
end
+59
View File
@@ -0,0 +1,59 @@
local mod = Chatter:NewModule("Sticky Channels")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Sticky Channels"]
local pairs = _G.pairs
local channels = {
SAY = L["Say"],
EMOTE = L["Emote"],
YELL = L["Yell"],
OFFICER = L["Officer"],
RAID_WARNING = L["Raid Warning"],
WHISPER = L["Whisper"],
BN_WHISPER = L["RealID Whisper"],
CHANNEL = L["Custom channels"]
}
local options = {}
local defaults = {profile = {}}
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("StickyChannels", defaults)
for k, v in pairs(channels) do
defaults.profile[k] = true
options[k] = {
type = "toggle",
name = v,
desc = (L["Make %s sticky"]):format(v),
get = function() return mod.db.profile[k] end,
set = function(info, v)
mod.db.profile[k] = v
ChatTypeInfo[k].sticky = v and 1 or 0
end
}
end
end
function mod:OnEnable()
for k, v in pairs(channels) do
ChatTypeInfo[k].sticky = self.db.profile[k] and 1 or 0
end
end
function mod:OnDisable()
ChatTypeInfo.EMOTE.sticky = 0
ChatTypeInfo.YELL.sticky = 0
ChatTypeInfo.OFFICER.sticky = 0
ChatTypeInfo.RAID_WARNING.sticky = 0
ChatTypeInfo.WHISPER.sticky = 0
ChatTypeInfo.CHANNEL.sticky = 0
ChatTypeInfo.BN_WHISPER.sticky = 0
end
function mod:GetOptions()
return options
end
function mod:Info()
return L["Makes channels you select sticky."]
end
+55
View File
@@ -0,0 +1,55 @@
local mod = Chatter:NewModule("Tell Target (/tt)", "AceHook-3.0", "AceEvent-3.0", "AceConsole-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Tell Target (/tt)"]
local UnitIsPlayer = _G.UnitIsPlayer
local UnitCanAssist = _G.UnitCanAssist
local UnitIsCharmed = _G.UnitIsCharmed
local SendChatMessage = _G.SendChatMessage
local UnitIsSameServer = _G.UnitIsSameServer
local UnitName = _G.UnitName
local gsub = _G.string.gsub
function mod:OnEnable()
-- self:SecureHook("ChatEdit_ParseText")
for i = 1, 10 do
self:HookScript(_G["ChatFrame" .. i .. "EditBox"], "OnTextChanged")
end
if not self.slashCommandRegistered then
self:RegisterChatCommand("tt", "SendChatMessage")
self.slashCommandRegistered = true
end
end
function mod:OnTextChanged(obj)
local text = obj:GetText()
if text:sub(1, 4) == "/tt " then
self:TellTarget(obj.chatFrame, text:sub(5))
end
self.hooks[obj].OnTextChanged(obj)
end
function mod:TellTarget(frame, msg)
local unitname, realm
if UnitIsPlayer("target") and (UnitIsFriend("player", "target") or UnitIsCharmed("target")) then
unitname, realm = UnitName("target")
if unitname then unitname = gsub(unitname, " ", "") end
if unitname and not UnitIsSameServer("player", "target") then
unitname = unitname .. "-" .. gsub(realm, " ", "")
end
end
ChatFrame_SendTell((unitname or "InvalidTarget"), frame)
_G[frame:GetName() .. "EditBox"]:SetText(msg)
end
function mod:Info()
return L["Enables the /tt command to send a tell to your target."]
end
function mod:SendChatMessage(input)
if UnitIsPlayer("target") and (UnitCanAssist("player", "target") or UnitIsCharmed("target"))then
SendChatMessage(input, "WHISPER", nil, UnitName("target"))
end
end
+153
View File
@@ -0,0 +1,153 @@
local mod = Chatter:NewModule("Timestamps", "AceHook-3.0","AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Timestamps"]
local date = _G.date
local SELECTED_FORMAT
local COLOR
local FORMATS = {
["%I:%M:%S %p"] = L["HH:MM:SS AM (12-hour)"],
["%I:%M:S"] = L["HH:MM (12-hour)"],
["%X"] = L["HH:MM:SS (24-hour)"],
["%I:%M"] = L["HH:MM (12-hour)"],
["%H:%M"] = L["HH:MM (24-hour)"],
["%M:%S"] = L["MM:SS"],
}
local CHATFRAMES = {
["Frame1"] = L["Chat Frame "].."1",
["Frame3"] = L["Chat Frame "].."3",
["Frame4"] = L["Chat Frame "].."4",
["Frame5"] = L["Chat Frame "].."5",
["Frame6"] = L["Chat Frame "].."6",
["Frame7"] = L["Chat Frame "].."7",
["Frame8"] = L["Chat Frame "].."8",
["Frame9"] = L["Chat Frame "].."9",
["Frame10"] = L["Chat Frame "].."10",
["Frame11"] = L["Chat Frame "].."11",
["Frame12"] = L["Chat Frame "].."12",
["Frame13"] = L["Chat Frame "].."13",
["Frame14"] = L["Chat Frame "].."14",
["Frame15"] = L["Chat Frame "].."15",
["Frame16"] = L["Chat Frame "].."16",
["Frame17"] = L["Chat Frame "].."17",
["Frame18"] = L["Chat Frame "].."18",
}
local defaults = {
profile = { format = "%X", color = { r = 0.45, g = 0.45, b = 0.45 }, frames = {["Frame1"] = true, ["Frame3"] = true, ["Frame4"] = true, ["Frame5"] = true, ["Frame6"] = true, ["Frame7"] = true} }
}
local options = {
format = {
type = "select",
name = L["Timestamp format"],
desc = L["Timestamp format"],
values = FORMATS,
get = function() return mod.db.profile.format end,
set = function(info, v)
mod.db.profile.format = v
SELECTED_FORMAT = ("[" .. v .. "]")
end
},
customFormat = {
type = "input",
name = L["Custom format (advanced)"],
desc = L["Enter a custom time format. See http://www.lua.org/pil/22.1.html for a list of valid formatting symbols."],
get = function() return mod.db.profile.customFormat end,
set = function(info, v)
if #v == 0 then v = nil end
mod.db.profile.customFormat = v
SELECTED_FORMAT = v
end,
order = 101
},
color = {
type = "color",
name = L["Timestamp color"],
desc = L["Timestamp color"],
get = function()
local c = mod.db.profile.color
return c.r, c.g, c.b
end,
set = function(info, r, g, b, a)
local c = mod.db.profile.color
c.r, c.g, c.b = r, g, b
COLOR = ("%02x%02x%02x"):format(r * 255, g * 255, b * 255)
end,
disabled = function() return mod.db.profile.colorByChannel end
},
useChannelColor = {
type = "toggle",
name = L["Use channel color"],
desc = L["Color timestamps the same as the channel they appear in."],
get = function()
return mod.db.profile.colorByChannel
end,
set = function(info, v)
mod.db.profile.colorByChannel = v
end
},
frames = {
type = "multiselect",
name = L["Per chat frame settings"],
desc = L["Choose which chat frames display timestamps"],
values = CHATFRAMES,
get = function(info, k) return mod.db.profile.frames[k] end,
set = function(info, k, v) mod.db.profile.frames[k] = v end,
},
}
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("Timestamps", defaults)
end
function mod:Decorate(frame)
if not self:IsHooked(frame,"AddMessage") then
self:RawHook(frame, "AddMessage", true)
end
end
function mod:OnEnable()
SELECTED_FORMAT = mod.db.profile.customFormat or ("[" .. self.db.profile.format .. "]")
local c = self.db.profile.color
COLOR = ("%02x%02x%02x"):format(c.r * 255, c.g * 255, c.b * 255)
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
if cf ~= COMBATLOG then
self:RawHook(cf, "AddMessage", true)
end
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
self:RawHook(cf, "AddMessage", true)
end
end
end
function mod:AddMessage(frame, text, ...)
local id = frame:GetID()
if id and self.db.profile.frames["Frame"..id] and not(CHAT_TIMESTAMP_FORMAT) then
if not Chatter.loading then
if not text then
return self.hooks[frame].AddMessage(frame, text, ...)
end
if self.db.profile.colorByChannel then
text = date(SELECTED_FORMAT) .. text
else
text = "|cff"..COLOR..date(SELECTED_FORMAT).."|r".. text
end
end
return self.hooks[frame].AddMessage(frame, text, ...)
end
return self.hooks[frame].AddMessage(frame, text, ...)
end
function mod:Info()
return L["Adds timestamps to chat."]
end
function mod:GetOptions()
return options
end
+42
View File
@@ -0,0 +1,42 @@
local mod = Chatter:NewModule("Tiny Chat")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["Tiny Chat"]
function mod:Info()
return L["Allows you to make the chat frames much smaller than usual."]
end
function mod:Decorate(frame)
frame:SetMinResize(50, 20)
frame:SetMaxResize(5000, 5000)
end
function mod:OnEnable()
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
cf:SetMinResize(50, 20)
cf:SetMaxResize(5000, 5000)
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
cf:SetMinResize(50, 20)
cf:SetMaxResize(5000, 5000)
end
end
end
function mod:OnDisable()
for i = 1, NUM_CHAT_WINDOWS do
local cf = _G["ChatFrame" .. i]
cf:SetMinResize(296, 75)
cf:SetMaxResize(608, 400)
end
for index,name in ipairs(self.TempChatFrames) do
local cf = _G[name]
if cf then
cf:SetMinResize(296, 75)
cf:SetMaxResize(608, 400)
end
end
end
+535
View File
@@ -0,0 +1,535 @@
local mod = Chatter:NewModule("URL Copy", "AceHook-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Chatter")
mod.modName = L["URL Copy"]
local gsub = _G.string.gsub
local ipairs = _G.ipairs
local pairs = _G.pairs
local fmt = _G.string.format
local sub = _G.string.sub
local tlds
local style = "|cffffffff|Hurl:%s|h[%s]|h|r"
local function Link(link, ...)
if link == nil then
return ""
end
return mod:RegisterMatch(fmt(style, link, link))
end
local function Link_TLD(link, tld, ...)
if link == nil or tld == nil then
return ""
end
if tlds[tld:upper()] then
return mod:RegisterMatch(fmt(style, link, link))
else
return mod:RegisterMatch(link)
end
end
local patterns = {
-- X://Y url
{ pattern = "^(%a[%w%.+-]+://%S+)", matchfunc=Link},
{ pattern = "%f[%S](%a[%w%.+-]+://%S+)", matchfunc=Link},
-- www.X.Y url
{ pattern = "^(www%.[-%w_%%]+%.%S+)", matchfunc=Link},
{ pattern = "%f[%S](www%.[-%w_%%]+%.%S+)", matchfunc=Link},
-- "W X"@Y.Z email (this is seriously a valid email)
--{ pattern = '^(%"[^%"]+%"@[-%w_%%%.]+%.(%a%a+))', matchfunc=Link_TLD},
--{ pattern = '%f[%S](%"[^%"]+%"@[-%w_%%%.]+%.(%a%a+))', matchfunc=Link_TLD},
-- X@Y.Z email
{ pattern = "(%S+@[-%w_%%%.]+%.(%a%a+))", matchfunc=Link_TLD},
-- XXX.YYY.ZZZ.WWW:VVVV/UUUUU IPv4 address with port and path
{ pattern = "^([0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d:[0-6]?%d?%d?%d?%d/%S+)", matchfunc=Link},
{ pattern = "%f[%S]([0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d:[0-6]?%d?%d?%d?%d/%S+)", matchfunc=Link},
-- XXX.YYY.ZZZ.WWW:VVVV IPv4 address with port (IP of ts server for example)
{ pattern = "^([0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d:[0-6]?%d?%d?%d?%d)%f[%D]", matchfunc=Link},
{ pattern = "%f[%S]([0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d:[0-6]?%d?%d?%d?%d)%f[%D]", matchfunc=Link},
-- XXX.YYY.ZZZ.WWW/VVVVV IPv4 address with path
{ pattern = "^([0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%/%S+)", matchfunc=Link},
{ pattern = "%f[%S]([0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%/%S+)", matchfunc=Link},
-- XXX.YYY.ZZZ.WWW IPv4 address
{ pattern = "^([0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%)%f[%D]", matchfunc=Link},
{ pattern = "%f[%S]([0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%.[0-2]?%d?%d%)%f[%D]", matchfunc=Link},
-- X.Y.Z:WWWW/VVVVV url with port and path
{ pattern = "^([-%w_%%%.]+[-%w_%%]%.(%a%a+):[0-6]?%d?%d?%d?%d/%S+)", matchfunc=Link_TLD},
{ pattern = "%f[%S]([-%w_%%%.]+[-%w_%%]%.(%a%a+):[0-6]?%d?%d?%d?%d/%S+)", matchfunc=Link_TLD},
-- X.Y.Z:WWWW url with port (ts server for example)
{ pattern = "^([-%w_%%%.]+[-%w_%%]%.(%a%a+):[0-6]?%d?%d?%d?%d)%f[%D]", matchfunc=Link_TLD},
{ pattern = "%f[%S]([-%w_%%%.]+[-%w_%%]%.(%a%a+):[0-6]?%d?%d?%d?%d)%f[%D]", matchfunc=Link_TLD},
-- X.Y.Z/WWWWW url with path
{ pattern = "^([-%w_%%%.]+[-%w_%%]%.(%a%a+)/%S+)", matchfunc=Link_TLD},
{ pattern = "%f[%S]([-%w_%%%.]+[-%w_%%]%.(%a%a+)/%S+)", matchfunc=Link_TLD},
-- X.Y.Z url
{ pattern = "^([-%w_%%%.]+[-%w_%%]%.(%a%a+))", matchfunc=Link_TLD},
{ pattern = "%f[%S]([-%w_%%%.]+[-%w_%%]%.(%a%a+))", matchfunc=Link_TLD},
}
local options = {
mangleMumble = {
type = "toggle",
name = L["Parse Mumble links"],
desc = L["Automatically inject your character's name into Mumble links, so you connect with your username prefilled."],
get = function() return mod.db.profile.mangleMumble end,
set = function(info, v) mod.db.profile.mangleMumble = v end
},
mangleTeamspeak = {
type = "toggle",
name = L["Parse Teamspeak 3 links"],
desc = L["Automatically inject your character's name into Teamspeak 3 links, so you connect with your username prefilled."],
get = function() return mod.db.profile.mangleTeamspeak end,
set = function(info, v) mod.db.profile.mangleTeamspeak = v end
}
}
do
local defaults = {
profile = {
mangleMumble = true,
mangleTeamspeak = true
}
}
local events = {
"CHAT_MSG_BATTLEGROUND", "CHAT_MSG_BATTLEGROUND_LEADER",
"CHAT_MSG_CHANNEL", "CHAT_MSG_EMOTE",
"CHAT_MSG_GUILD", "CHAT_MSG_OFFICER",
"CHAT_MSG_PARTY", "CHAT_MSG_RAID",
"CHAT_MSG_RAID_LEADER", "CHAT_MSG_RAID_WARNING", "CHAT_MSG_PARTY_LEADER",
"CHAT_MSG_SAY", "CHAT_MSG_WHISPER","CHAT_MSG_BN_WHISPER",
"CHAT_MSG_WHISPER_INFORM", "CHAT_MSG_YELL", "CHAT_MSG_BN_WHISPER_INFORM","CHAT_MSG_BN_CONVERSATION"
}
function mod:OnInitialize()
self.db = Chatter.db:RegisterNamespace("UrlCopy", defaults)
end
function mod:OnEnable()
for _,event in ipairs(events) do
ChatFrame_AddMessageEventFilter(event, self.filterFunc)
end
self:RawHook("SetItemRef", true)
end
function mod:OnDisable()
for _,event in ipairs(events) do
ChatFrame_RemoveMessageEventFilter(event, self.filterFunc)
end
end
end
do
local tokennum, matchTable = 1, {}
mod.filterFunc = function(frame, event, msg, ...)
if not msg then return false, msg, ... end
for i, v in ipairs(patterns) do
msg = gsub(msg, v.pattern, v.matchfunc)
end
for k,v in pairs(matchTable) do
msg = gsub(msg, k, v)
matchTable[k] = nil
end
return false, msg, ...
end
function mod:RegisterMatch(text)
local token = "\255\254\253"..tokennum.."\253\254\255"
matchTable[token] = gsub(text, "%%", "%%%%")
tokennum = tokennum + 1
return token
end
end
--[[ Popup Box ]]--
local currentLink
StaticPopupDialogs["ChatterUrlCopyDialog"] = {
text = "URL - Ctrl-C to copy",
button2 = CLOSE,
hasEditBox = 1,
hasWideEditBox = 1,
OnShow = function()
local editBox = _G[this:GetName().."WideEditBox"]
if editBox then
editBox:SetText(currentLink)
editBox:SetFocus()
editBox:HighlightText(0)
end
local button = _G[this:GetName().."Button2"]
if button then
button:ClearAllPoints()
button:SetWidth(200)
button:SetPoint("CENTER", editBox, "CENTER", 0, -30)
end
end,
EditBoxOnEscapePressed = function() this:GetParent():Hide() end,
timeout = 0,
whileDead = 1,
hideOnEscape = 1,
maxLetters=1024, -- this otherwise gets cached from other dialogs which caps it at 10..20..30...
}
local mangleLinkForVoiceChat
do
--[[
mumble://192.168.1.102:50008?version=1.2.0
mumble://foo:bar@192.168.1.102:50008?version=1.2.0
mumble://:bar@192.168.1.102:50008?version=1.2.0
]]--
-- Messes with Mumble links to inject our own username. Nifty magical!
local function injectCharacterNameForMumble(scheme, connstr)
local pre, post = strsplit("@", connstr, 2)
local new
if post then
local user, password = strsplit(":", pre, 2)
if password then
new = UnitName("player") .. ":" .. password
else
new = UnitName("player")
end
new = new .. "@" .. post
else
new = UnitName("player") .. "@" .. pre
end
return scheme .. new
end
local buff = {}
local function addTS3Nickname(...)
wipe(buff)
for i = 1, select("#", ...) do
local chunk = select(i, ...)
local key, val = strsplit("=", chunk, 2)
if val then
if strlower(key) ~= "nickname" then
tinsert(buff, chunk)
end
end
end
if not gotName then
local nick = "nickname=" .. UnitName("player")
tinsert(buff, nick)
end
return table.concat(buff, "&")
end
--[[
ts3server://ts3.hoster.com
ts3server://ts3.hoster.com?
ts3server://ts3.hoster.com?port=9987&
ts3server://ts3.hoster.com?port=9987&nickname=UserNickname&password=serverPassword
]]--
local function injectCharacterNameForTeamspeak(scheme, connstr)
local url, query = strsplit("?", connstr, 2)
if query then
query = addTS3Nickname(strsplit("&", query))
else
query = "nickname=" .. UnitName("player")
end
return scheme .. url .. "?" .. query
end
function mangleLinkForVoiceChat(text)
if mod.db.profile.mangleMumble then
text = text:gsub("^(mumble://)([^/?]+)", injectCharacterNameForMumble)
end
if mod.db.profile.mangleTeamspeak then
text = text:gsub("^(ts3server://)(.+)", injectCharacterNameForTeamspeak)
end
return text
end
end
function mod:SetItemRef(link, text, button)
if sub(link, 1, 3) == "url" then
currentLink = sub(link, 5)
currentLink = mangleLinkForVoiceChat(currentLink)
StaticPopup_Show("ChatterUrlCopyDialog")
return
end
return self.hooks.SetItemRef(link, text, button)
end
function mod:Info()
return L["Lets you copy URLs out of chat."]
end
function mod:GetOptions()
return options
end
tlds = {
ONION = true,
-- Copied from http://data.iana.org/TLD/tlds-alpha-by-domain.txt
-- Version 2008041301, Last Updated Mon Apr 21 08:07:00 2008 UTC
AC = true,
AD = true,
AE = true,
AERO = true,
AF = true,
AG = true,
AI = true,
AL = true,
AM = true,
AN = true,
AO = true,
AQ = true,
AR = true,
ARPA = true,
AS = true,
ASIA = true,
AT = true,
AU = true,
AW = true,
AX = true,
AZ = true,
BA = true,
BB = true,
BD = true,
BE = true,
BF = true,
BG = true,
BH = true,
BI = true,
BIZ = true,
BJ = true,
BM = true,
BN = true,
BO = true,
BR = true,
BS = true,
BT = true,
BV = true,
BW = true,
BY = true,
BZ = true,
CA = true,
CAT = true,
CC = true,
CD = true,
CF = true,
CG = true,
CH = true,
CI = true,
CK = true,
CL = true,
CM = true,
CN = true,
CO = true,
COM = true,
COOP = true,
CR = true,
CU = true,
CV = true,
CX = true,
CY = true,
CZ = true,
DE = true,
DJ = true,
DK = true,
DM = true,
DO = true,
DZ = true,
EC = true,
EDU = true,
EE = true,
EG = true,
ER = true,
ES = true,
ET = true,
EU = true,
FI = true,
FJ = true,
FK = true,
FM = true,
FO = true,
FR = true,
GA = true,
GB = true,
GD = true,
GE = true,
GF = true,
GG = true,
GH = true,
GI = true,
GL = true,
GM = true,
GN = true,
GOV = true,
GP = true,
GQ = true,
GR = true,
GS = true,
GT = true,
GU = true,
GW = true,
GY = true,
HK = true,
HM = true,
HN = true,
HR = true,
HT = true,
HU = true,
ID = true,
IE = true,
IL = true,
IM = true,
IN = true,
INFO = true,
INT = true,
IO = true,
IQ = true,
IR = true,
IS = true,
IT = true,
JE = true,
JM = true,
JO = true,
JOBS = true,
JP = true,
KE = true,
KG = true,
KH = true,
KI = true,
KM = true,
KN = true,
KP = true,
KR = true,
KW = true,
KY = true,
KZ = true,
LA = true,
LB = true,
LC = true,
LI = true,
LK = true,
LR = true,
LS = true,
LT = true,
LU = true,
LV = true,
LY = true,
MA = true,
MC = true,
MD = true,
ME = true,
MG = true,
MH = true,
MIL = true,
MK = true,
ML = true,
MM = true,
MN = true,
MO = true,
MOBI = true,
MP = true,
MQ = true,
MR = true,
MS = true,
MT = true,
MU = true,
MUSEUM = true,
MV = true,
MW = true,
MX = true,
MY = true,
MZ = true,
NA = true,
NAME = true,
NC = true,
NE = true,
NET = true,
NF = true,
NG = true,
NI = true,
NL = true,
NO = true,
NP = true,
NR = true,
NU = true,
NZ = true,
OM = true,
ORG = true,
PA = true,
PE = true,
PF = true,
PG = true,
PH = true,
PK = true,
PL = true,
PM = true,
PN = true,
PR = true,
PRO = true,
PS = true,
PT = true,
PW = true,
PY = true,
QA = true,
RE = true,
RO = true,
RS = true,
RU = true,
RW = true,
SA = true,
SB = true,
SC = true,
SD = true,
SE = true,
SG = true,
SH = true,
SI = true,
SJ = true,
SK = true,
SL = true,
SM = true,
SN = true,
SO = true,
SR = true,
ST = true,
SU = true,
SV = true,
SY = true,
SZ = true,
TC = true,
TD = true,
TEL = true,
TF = true,
TG = true,
TH = true,
TJ = true,
TK = true,
TL = true,
TM = true,
TN = true,
TO = true,
TP = true,
TR = true,
TRAVEL = true,
TT = true,
TV = true,
TW = true,
TZ = true,
UA = true,
UG = true,
UK = true,
UM = true,
US = true,
UY = true,
UZ = true,
VA = true,
VC = true,
VE = true,
VG = true,
VI = true,
VN = true,
VU = true,
WF = true,
WS = true,
YE = true,
YT = true,
YU = true,
ZA = true,
ZM = true,
ZW = true,
}
+37
View File
@@ -0,0 +1,37 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="Modules\Buttons.lua" />
<Script file="Modules\ChannelNames.lua" />
<Script file="Modules\ChatScroll.lua" />
<Script file="Modules\PlayerNames.lua" />
<Script file="Modules\StickyChannels.lua" />
<Script file="Modules\UrlCopy.lua" />
<!-- <Script file="Modules\ChatLink.lua" /> //-->
<Script file="Modules\EditBox.lua" />
<Script file="Modules\ChatFont.lua" />
<Script file="Modules\CopyChat.lua" />
<Script file="Modules\Timestamps.lua" />
<Script file="Modules\ClickInvite.lua" />
<Script file="Modules\TellTarget.lua" />
<Script file="Modules\Highlight.lua" />
<Script file="Modules\ChatFading.lua" />
<Script file="Modules\Justify.lua" />
<Script file="Modules\AutoLogChat.lua" />
<Script file="Modules\AltNames.lua" />
<Script file="Modules\TinyChat.lua" />
<Script file="Modules\GroupSay.lua" />
<Script file="Modules\ChannelColors.lua" />
<Script file="Modules\ChatTabs.lua" />
<Script file="Modules\LinkHover.lua" />
<Script file="Modules\Scrollback.lua" />
<Script file="Modules\EditBoxHistory.lua" />
<Script file="Modules\DelayGMOTD.lua" />
<Script file="Modules\AutoPopup.lua" />
<Script file="Modules\BNet.lua" />
<Script file="Modules\ServerStorage.lua" />
<Script file="Modules\AllResize.lua" />
<Include file="Modules\ChatFrameBorders.xml" />
<!-- <Include file="Modules\SplitText.lua" /> //-->
<!-- <Script file="Modules\ChannelBindings.lua" /> //-->
</Ui>