From de47e71b29add383243bc5adb20e77f2462db00f Mon Sep 17 00:00:00 2001 From: RedAces Date: Sun, 2 Aug 2026 18:49:44 +0200 Subject: [PATCH 1/4] Add the ability to disable each pull timer (set it to zero) Add checkboxes to disable the "role check", "convert to raid" and "disband" buttons --- EllesmereUIQoL/EUI_QoL_RaidTools_Options.lua | 33 +++- EllesmereUIQoL/EllesmereUIQoL_RaidTools.lua | 159 +++++++++++++++---- 2 files changed, 156 insertions(+), 36 deletions(-) diff --git a/EllesmereUIQoL/EUI_QoL_RaidTools_Options.lua b/EllesmereUIQoL/EUI_QoL_RaidTools_Options.lua index 4727de4a..2b69d06f 100644 --- a/EllesmereUIQoL/EUI_QoL_RaidTools_Options.lua +++ b/EllesmereUIQoL/EUI_QoL_RaidTools_Options.lua @@ -274,12 +274,43 @@ initFrame:SetScript("OnEvent", function(self) { type = "label", text = "" } ); y = y - h + -- GROUP BUTTONS + -- + -- One switch per optional action. Ready Check has none: it is the + -- reason the panel exists. Turning a button off closes the gap it + -- leaves -- the survivors re-flow across the rows. + _, h = W:SectionHeader(parent, "GROUP BUTTONS", y); y = y - h + + local function ButtonToggle(key, text, tooltip) + return { type = "toggle", text = text, tooltip = tooltip, + disabled = Disabled, + getValue = function() return Cfg(key) ~= false end, + setValue = function(v) + Set(key, v) + Refresh() + end } + end + + _, h = W:DualRow(parent, y, + ButtonToggle("showRoleCheck", "Show Role Check", + "Shows the Role Check button. Turn it off and the remaining buttons close the gap."), + ButtonToggle("showConvert", "Show Convert to Raid", + "Shows the Convert to Raid button, which reads Convert to Party while you are in a raid.") + ); y = y - h + _, h = W:DualRow(parent, y, + ButtonToggle("showDisband", "Show Disband", + "Shows the Disband button. It always asks before disbanding, but hiding it puts it out of misclick range for good."), + { type = "spacer" } + ); y = y - h + -- PULL TIMER _, h = W:SectionHeader(parent, "PULL TIMER", y); y = y - h local PULL_LABELS = { "First Timer", "Second Timer", "Third Timer" } + local PULL_TIP = "Countdown length of this pull button, in seconds. Set it to 0 to hide the button; with all three at 0 the whole pull row disappears, Stop included." local function PullSlider(i) - return { type="slider", text=PULL_LABELS[i], min=1, max=60, step=1, + return { type="slider", text=PULL_LABELS[i], min=0, max=60, step=1, + tooltip=PULL_TIP, disabled=Disabled, getValue=function() return PullGet(i) end, setValue=function(v) PullSet(i, v) end } diff --git a/EllesmereUIQoL/EllesmereUIQoL_RaidTools.lua b/EllesmereUIQoL/EllesmereUIQoL_RaidTools.lua index 8d28d72b..f477c161 100644 --- a/EllesmereUIQoL/EllesmereUIQoL_RaidTools.lua +++ b/EllesmereUIQoL/EllesmereUIQoL_RaidTools.lua @@ -6,6 +6,12 @@ -- placeable mid-combat) -- shown either as one combined window (default) or -- as two independently positioned windows. -- +-- Which Group & Pull buttons exist is a SETTING, not a build fact: Role +-- Check, Convert and Disband each have a switch, and a pull slot set to 0 +-- seconds drops out. Buttons are still created once, at build; the layout +-- pass (LayoutGroupContent) re-flows the survivors across the rows and is the +-- only writer of the content height the shells are sized from. +-- -- SHOW MODE (p.mode) replaces the old shared-visibility system outright: -- -- "never" -- the default. NOTHING exists: no frames, no events, no @@ -223,7 +229,9 @@ local sections = {} -- key -> shell frame local shellTitle = {} -- key -> title fontstring local groupHolder, markersHolder -- plain content holders (see header) local iconBtn -- collapsed-state square -local GROUP_CONTENT_H, MARKERS_CONTENT_H -- computed at build +-- Markers are fixed at build; the Group & Pull height follows the settings and +-- is re-computed by LayoutGroupContent on every Apply. +local GROUP_CONTENT_H, MARKERS_CONTENT_H local Apply -- forward: the event handler closes over it -- ONE representation of each secure decision, run from both paths. @@ -371,8 +379,12 @@ end local groupButtons = {} -- plain buttons, enable-gated on assist local markerButtons = {} -- secure buttons, dimmed on assist -local pullButtons = {} -- fixed set of 3; durations are re-labelled live -local convertButton +local pullButtons = {} -- fixed set of 3; only the ones above 0s show +-- Individually hideable content. Every one of these is created at build and +-- kept for the lifetime of the session; the layout pass decides which of them +-- reach the screen. Ready Check is the one action button with no switch -- a +-- raid panel without it has no reason to exist. +local readyButton, roleButton, convertButton, disbandButton, stopButton -- Both marker rows draw Blizzard's own raid target sheet -- the texture the -- rest of the suite already uses for markers, in nameplates and raid frames. @@ -412,7 +424,17 @@ local DB_DEFAULTS = { -- a security constraint -- the pull buttons are plain, only the marker -- buttons are secure. Growing the count later means growing the panel, -- nothing more. + -- + -- 0 means "no button": the slot drops out of the row and the survivors + -- share the width. All three at 0 takes the row away entirely, Stop + -- included (see LayoutGroupContent). pullTimes = { PULL_DEFAULTS[1], PULL_DEFAULTS[2], PULL_DEFAULTS[3] }, + -- Per-button switches for the three optional actions. Ready Check has + -- none on purpose. Same flow rule as the pull slots: a hidden button + -- leaves no hole, the rest close up. + showRoleCheck = true, + showConvert = true, + showDisband = true, -- Per-section: pos[key] = { point, relPoint, x, y } pos = {}, }, @@ -578,15 +600,23 @@ local function IsLeader() return UnitIsGroupLeader("player") end --- Durations are the only pull-timer setting that can change at runtime: the --- button count is fixed at build, so re-labelling is all it takes. -local function RefreshPullTimes() +-- An optional button's switch, defaulting to shown for an unset profile. +local function ButtonShown(key) + local p = P() + return not p or p[key] ~= false +end + +-- The pull durations worth a button, in slot order. 0 (and anything below it) +-- means the user turned that slot off. +local function VisiblePullTimes() local times = (P() and P().pullTimes) or {} - for i, b in ipairs(pullButtons) do - local secs = times[i] or PULL_DEFAULTS[i] - b.secs = secs - b._lbl:SetText(tostring(secs)) + local out = {} + for i = 1, PULL_SLOTS do + local secs = times[i] + if secs == nil then secs = PULL_DEFAULTS[i] end + if secs and secs > 0 then out[#out + 1] = secs end end + return out end -- GROUP_ROSTER_UPDATE is one of the chattiest events in a raid -- it bursts on @@ -788,51 +818,108 @@ local function MakeShell(key) return f end +-- Where the Group & Pull content actually lands. Re-run on every Apply, and +-- the ONLY writer of GROUP_CONTENT_H -- which button is on screen is a +-- setting, so positions, widths and the holder height all follow the profile +-- rather than the build. +-- +-- Everything it touches is a plain frame, and Apply is out-of-combat only, so +-- this is an ordinary re-point with no lockdown story. It must run BEFORE +-- ApplyLayout, which sizes the shells from GROUP_CONTENT_H. +local function LayoutGroupContent() + if not groupHolder then return end + local f = groupHolder + + -- Row plan first, geometry second: collect what is actually shown, two + -- action buttons per row in the fixed order below, so a hidden button + -- closes the gap instead of leaving a hole. A row that ends up with a + -- single button takes the full width. + local rows, pair = {}, {} + local function Add(b) + pair[#pair + 1] = b + if #pair == 2 then rows[#rows + 1] = pair; pair = {} end + end + Add(readyButton) + if ButtonShown("showRoleCheck") then Add(roleButton) end + if ButtonShown("showConvert") then Add(convertButton) end + if ButtonShown("showDisband") then Add(disbandButton) end + if #pair > 0 then rows[#rows + 1] = pair end + + -- Pull row: the slots left above 0, sharing the row with Stop. The + -- duration lives on the button (the click closure reads it back), so the + -- surviving durations simply move onto the leading buttons. + -- + -- All three at 0 drops the row entirely, Stop included: a Stop button + -- alone is a pull-timer row with no pull timer. + local times = VisiblePullTimes() + if #times > 0 then + local pull = {} + for i, secs in ipairs(times) do + local b = pullButtons[i] + b.secs = secs + b._lbl:SetText(tostring(secs)) + pull[i] = b + end + pull[#pull + 1] = stopButton + rows[#rows + 1] = pull + end + + -- Hide first, show what the plan placed: anything the switches dropped + -- stops at this line. + for _, b in ipairs(groupButtons) do b:Hide() end + + local y = 0 + for _, row in ipairs(rows) do + local n = #row + local w = (PANEL_W - PAD * 2 - ROW_GAP * (n - 1)) / n + for i, b in ipairs(row) do + b:SetWidth(w) + b:ClearAllPoints() + b:SetPoint("TOPLEFT", f, "TOPLEFT", PAD + (w + ROW_GAP) * (i - 1), y) + b:Show() + end + y = y - ROW_H - ROW_GAP + end + y = y + ROW_GAP -- the last row's trailing gap is not content + + GROUP_CONTENT_H = -y + f:SetHeight(GROUP_CONTENT_H) +end + -- Group & Pull content, in its own plain holder so one-window mode can treat --- it uniformly with the markers holder. +-- it uniformly with the markers holder. Creation only -- the buttons are born +-- unplaced at full-row width, and LayoutGroupContent puts them where the +-- settings say (MakeGroupButton runs labels through L itself). local function BuildGroupContent() groupHolder = CreateFrame("Frame", nil, sections.Group) groupHolder:SetWidth(PANEL_W) fontOwners[#fontOwners + 1] = groupHolder local f = groupHolder - local y = 0 + local full = PANEL_W - PAD * 2 - -- MakeGroupButton runs labels through L itself. - local half = (PANEL_W - PAD * 2 - ROW_GAP) / 2 - local ready = MakeGroupButton(f, "Ready Check", half, function() DoReadyCheck() end) - ready:SetPoint("TOPLEFT", f, "TOPLEFT", PAD, y) + readyButton = MakeGroupButton(f, "Ready Check", full, function() DoReadyCheck() end) + roleButton = MakeGroupButton(f, "Role Check", full, function() InitiateRolePoll() end) - local role = MakeGroupButton(f, "Role Check", half, function() InitiateRolePoll() end) - role:SetPoint("TOPLEFT", f, "TOPLEFT", PAD + half + ROW_GAP, y) - y = y - ROW_H - ROW_GAP - - convertButton = MakeGroupButton(f, "Convert to Raid", half, function() + convertButton = MakeGroupButton(f, "Convert to Raid", full, function() if IsInRaid() then C_PartyInfo.ConvertToParty() else C_PartyInfo.ConvertToRaid() end end, true) - convertButton:SetPoint("TOPLEFT", f, "TOPLEFT", PAD, y) - local disband = MakeGroupButton(f, "Disband", half, function() + disbandButton = MakeGroupButton(f, "Disband", full, function() ConfirmDisband() end, true) - disband:SetPoint("TOPLEFT", f, "TOPLEFT", PAD + half + ROW_GAP, y) - y = y - ROW_H - ROW_GAP - -- Pull timer row: three durations + Stop, sharing the holder's width. - local w = (PANEL_W - PAD * 2 - PULL_SLOTS * ROW_GAP) / (PULL_SLOTS + 1) for i = 1, PULL_SLOTS do -- The pull duration lives on the button and changes at runtime, so -- the click reads it through the closure. local b - b = MakeGroupButton(f, "", w, function() StartPull(b.secs) end) - b:SetPoint("TOPLEFT", f, "TOPLEFT", PAD + (w + ROW_GAP) * (i - 1), y) + b = MakeGroupButton(f, "", full, function() StartPull(b.secs) end) pullButtons[i] = b end - local cancel = MakeGroupButton(f, "Stop", w, StopPull) - cancel:SetPoint("TOPLEFT", f, "TOPLEFT", PAD + (w + ROW_GAP) * PULL_SLOTS, y) - y = y - ROW_H + stopButton = MakeGroupButton(f, "Stop", full, StopPull) - GROUP_CONTENT_H = -y - f:SetHeight(GROUP_CONTENT_H) + -- A height right away: BuildAll has callers (the slash command, unlock + -- mode) that reach the shells without going through Apply. + LayoutGroupContent() end -- Row order matches how they are used: unit markers first, ground markers @@ -1340,6 +1427,9 @@ function Apply() EnsureEvents() RegisterUnlock() BuildAll() + -- Before ApplyLayout: it sizes the shells from GROUP_CONTENT_H, which the + -- hidden buttons and the 0-second pull slots move. + LayoutGroupContent() ApplyLayout() -- One Window Scale for everything the feature draws. local scale = WindowScale() @@ -1350,7 +1440,6 @@ function Apply() ApplyVisibility() ApplyToggleKeybind() ApplyFonts() - RefreshPullTimes() RefreshPermissions(true) end _G._EUI_RaidTools_Apply = Apply From 593a5543abe01f771296f1457a496faceb82244a Mon Sep 17 00:00:00 2001 From: RedAces Date: Sun, 2 Aug 2026 19:33:14 +0200 Subject: [PATCH 2/4] Dont display the raid tools window in a raid if you dont have raid assist or are the raid leader # Conflicts: # Locales/_keys.txt --- EllesmereUIQoL/EUI_QoL_RaidTools_Options.lua | 2 +- EllesmereUIQoL/EllesmereUIQoL_RaidTools.lua | 70 ++++++++++++++++++-- Locales/_keys.txt | 3 +- 3 files changed, 68 insertions(+), 7 deletions(-) diff --git a/EllesmereUIQoL/EUI_QoL_RaidTools_Options.lua b/EllesmereUIQoL/EUI_QoL_RaidTools_Options.lua index 2b69d06f..c1957b1c 100644 --- a/EllesmereUIQoL/EUI_QoL_RaidTools_Options.lua +++ b/EllesmereUIQoL/EUI_QoL_RaidTools_Options.lua @@ -91,7 +91,7 @@ initFrame:SetScript("OnEvent", function(self) local kbRow kbRow, h = W:DualRow(parent, y, { type = "dropdown", text = "Show Raid Tools", - tooltip = "A raid control panel with ready check, pull timer and raid markers.", + tooltip = "A raid control panel with ready check, pull timer and raid markers. In a raid it only shows while you are the leader or an assistant, since none of its buttons work without that; in a party it always shows.", values = { never = "Never", raid = "In Raid Group", group = "In Any Group", always = "Always" }, order = { "never", "raid", "group", "always" }, diff --git a/EllesmereUIQoL/EllesmereUIQoL_RaidTools.lua b/EllesmereUIQoL/EllesmereUIQoL_RaidTools.lua index f477c161..4fe9ddcb 100644 --- a/EllesmereUIQoL/EllesmereUIQoL_RaidTools.lua +++ b/EllesmereUIQoL/EllesmereUIQoL_RaidTools.lua @@ -21,6 +21,12 @@ -- "always" -- always shown (no driver; the visible attribute just stays -- true). -- +-- On top of the mode sits ONE unconditional gate: in a raid without leader or +-- assist the whole feature is off the screen, because the server refuses +-- every button on it there. It is raid-only (a party has no assistants) and +-- Lua-side, since no macro conditional can express it -- see AssistSuppressed +-- and RefreshAssistGate. +-- -- The Toggle Raid Tools keybind works in every active mode, and what it -- toggles follows Default to Collapsed When Shown: with it ON the key rocks -- between the collapsed icon and the full windows (the icon is the minimized @@ -224,6 +230,7 @@ end local db local applyPending -- true when combat blocked an Apply() local previewOn = false -- Raid Tools settings page is in front (see ApplyVisibility) +local lastSuppressed -- assist gate verdict currently ON SCREEN (see AssistSuppressed) local toggleButton -- keybind target; also the out-of-combat path local sections = {} -- key -> shell frame local shellTitle = {} -- key -> title fontstring @@ -600,6 +607,24 @@ local function IsLeader() return UnitIsGroupLeader("player") end +-- In a RAID, every control on the panel needs leader or assist: ready check, +-- role check, the countdown, convert, disband and the marker buttons are all +-- refused by the server without it. So the feature steps off the screen there +-- instead of sitting around fully dimmed. +-- +-- Raid only, deliberately. A party has no assistants -- UnitIsGroupAssistant +-- is false for everyone in one -- so the same test would hide the panel from +-- every non-leader in a 5-man, where marking is open to all of them. +-- +-- There is no macro conditional for leader/assist, so NO state driver can +-- express this: the gate is Lua's, it lands on the enabled attribute, and a +-- promotion mid-combat is picked up on PLAYER_REGEN_ENABLED like every other +-- Lua-side change (see the combat model in the header). +local function AssistSuppressed() + if previewOn then return false end -- configuring the thing beats hiding it + return IsInRaid() and not HasAssist() +end + -- An optional button's switch, defaulting to shown for an unset profile. local function ButtonShown(key) local p = P() @@ -1210,10 +1235,14 @@ local function ApplyVisibility() -- Which SHELLS may show, straight from Show as: the Group shell is the -- window everywhere except Markers-only; the Markers shell exists only in -- Two Windows and Markers-only. + -- + -- The assist gate rides on top of that and takes ALL of them, icon + -- included -- a raid without assist is a raid where nothing here works. local showAs = ShowAs() + local suppressed = AssistSuppressed() local shellOn = { - Group = showAs ~= "markers", - Markers = showAs == "two" or showAs == "markers", + Group = showAs ~= "markers" and not suppressed, + Markers = (showAs == "two" or showAs == "markers") and not suppressed, } -- One seed for every show (see header): Default to Collapsed When Shown. -- With the toggle off the seed is "expanded" and the icon never shows. @@ -1249,13 +1278,18 @@ local function ApplyVisibility() end -- The icon represents the whole feature; every Show as choice shows - -- something, so it is simply on while the mode is active. - iconBtn:SetAttribute("enabled", true) + -- something, so it is on while the mode is active and the assist gate is + -- open. With it shut the keybind and the slash command go quiet too -- + -- both run the secure snippets, and those refuse a disabled frame. + iconBtn:SetAttribute("enabled", not suppressed) iconBtn:SetAttribute("visible", visNow) iconBtn:SetAttribute("override", "") iconBtn:SetAttribute("startexpanded", startExpanded) iconBtn:SetAttribute("expanded", expandedNow) + -- What is now ON SCREEN, for the roster handler to compare against. + lastSuppressed = suppressed + -- Run the snippets rather than re-deciding in Lua: attributes are set -- first so "apply" sees them. if SecureHandlerExecute then @@ -1275,7 +1309,10 @@ local function ApplyToggleKeybind() ClearOverrideBindings(toggleButton) local p = P() local k = p and p.toggleKey - if k and k ~= "" and Mode() ~= "never" then + -- The gate takes the binding with it rather than leaving a key that eats + -- its own keypress: the snippet would refuse a disabled frame, and an + -- override binding swallows whatever the key does otherwise. + if k and k ~= "" and Mode() ~= "never" and not AssistSuppressed() then SetOverrideBindingClick(toggleButton, false, k, "EllesmereUIRaidToolsToggle") end end @@ -1287,6 +1324,19 @@ end -- no bindings, no unlock rows. Apply() is the single entry point. ------------------------------------------------------------------------------- +-- The assist gate is Lua's, so a promotion, a demotion or a raid you join +-- without assist has to bring Apply back around -- no state driver will do it +-- for us. Compared against what ApplyVisibility last put on screen, because +-- GROUP_ROSTER_UPDATE bursts and Apply is not free. +-- +-- In combat Apply parks itself behind applyPending, which leaves lastSuppressed +-- untouched: the next roster event re-enters here and parks again, and +-- PLAYER_REGEN_ENABLED finishes the job. That is the module's standard +-- deferral, not an omission. +local function RefreshAssistGate() + if AssistSuppressed() ~= lastSuppressed then Apply() end +end + -- Events live only while the feature is active (or while a combat-deferred -- Apply is pending, since PLAYER_REGEN_ENABLED is what completes it). The -- frame itself is created on first need and reused. @@ -1305,6 +1355,7 @@ local function EnsureEvents() end if Mode() == "never" then return end RefreshPermissions() + RefreshAssistGate() end) end ev:RegisterEvent("GROUP_ROSTER_UPDATE") @@ -1337,6 +1388,9 @@ local function RegisterUnlock() noResize = true, getFrame = function() if Mode() == "never" then return nil end + -- Nothing to move while the assist gate has the whole feature + -- off the screen -- same opt-out as the modes below. + if AssistSuppressed() then return nil end -- Offer exactly the shells the Show as choice puts on screen: -- One Window / Only Group & Pull = the Group element alone, -- Two Windows = both, Only Markers = the Markers element alone. @@ -1481,6 +1535,12 @@ SlashCmdList["EUIRAIDTOOLS"] = function() EllesmereUI.Print("|cff0cd29fEllesmereUI:|r " .. EllesmereUI.L("Raid Tools cannot be toggled by slash command in combat -- use the keybind.")) return end + -- The snippet would refuse anyway (enabled is false while the gate is + -- shut); saying so beats a slash command that looks broken. + if AssistSuppressed() then + EllesmereUI.Print("|cff0cd29fEllesmereUI:|r " .. EllesmereUI.L("Raid Tools is hidden in a raid without leader or assist -- none of its buttons work there.")) + return + end BuildAll() ToggleOutOfCombat() end diff --git a/Locales/_keys.txt b/Locales/_keys.txt index 1a5ad812..2ec24f68 100644 --- a/Locales/_keys.txt +++ b/Locales/_keys.txt @@ -394,7 +394,7 @@ No buffs assigned. Right click a button in the preview to assign buffs. No death recap available No excluded debuffs. No patch notes yet. -No spec macros for +No spec macros for No spells yet. Add spell IDs above. No talent No talent reminders configured @@ -455,6 +455,7 @@ REAGENTS Racial Raid Tools cannot be toggled by slash command in combat -- use the keybind. Raid Tools is disabled in the EllesmereUI options. +Raid Tools is hidden in a raid without leader or assist -- none of its buttons work there. Raids Raise Strata Re-sync From e29d6c44eff7778755a6c1bf4a75955d858a85b3 Mon Sep 17 00:00:00 2001 From: RedAces Date: Sun, 2 Aug 2026 20:57:05 +0200 Subject: [PATCH 3/4] add german translations for the raid tools --- Locales/deDE.lua | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/Locales/deDE.lua b/Locales/deDE.lua index f7e47d0f..91815bc1 100644 --- a/Locales/deDE.lua +++ b/Locales/deDE.lua @@ -617,7 +617,7 @@ L["Automatically duplicates the raid's tanks into the Extra Frames group. Shares L["Automatically enables the 'Current Expansion Only' filter whenever you open the Auction House."] = "Aktiviert automatisch den Filter „Nur aktuelle Erweiterung“, wenn das Auktionshaus geöffnet wird." L["Automatically inserts your key into the Font of Power."] = "Setzt Euren Schlüsselstein automatisch in den Born der Macht ein." L["Automatically opens and closes the Upgrade Calculator when the Character Sheet is opened or closed."] = "Öffnet und schließt den Aufwertungsrechner automatisch, wenn das Charakterfenster geöffnet oder geschlossen wird." -L["Automatically opens bags, boxes and parcels in your inventory when they are added to your bags."] = "Öffnet Beutel, Kisten und Pakete automatisch, sobald sie Eurem Inventar hinzugefügt werden." +L["Automatically opens bags, boxes and parcels in your inventory when they are added to your bags.\n\nContainers received from the mailbox are held until you close the mailbox, so opening them cannot collide with mail still delivering items."] = "Öffnet Beutel, Kisten und Pakete automatisch, sobald sie Eurem Inventar hinzugefügt werden.\n\nBehälter aus der Post werden zurückgehalten, bis Ihr den Briefkasten schließt, damit das Öffnen nicht mit noch eintreffenden Sendungen kollidiert." L["Automatically opens the Upgrade Calculator when the Crest Upgrade NPC window is opened."] = "Öffnet den Aufwertungsrechner automatisch, wenn das Fenster des Wappen-Aufwertungs-NPCs geöffnet wird." L["Automatically refreshes the Premade Groups list every few seconds while you are browsing, so newly posted groups appear without clicking Refresh."] = "Aktualisiert die Liste der organisierten Gruppen während des Durchstöberns alle paar Sekunden automatisch, sodass neu erstellte Gruppen ohne Klicken auf „Aktualisieren“ erscheinen." L["Automatically removes cosmetic transforms when they are applied to you, such as profession gear, holiday costumes, toys and consumables. Use the cog to pick exactly which transforms are removed. Transforms applied during combat are removed when combat ends."] = "Entfernt automatisch kosmetische Verwandlungen, wenn sie auf dich angewendet werden, wie z. B. Berufsausrüstung, Feiertagskostüme, Spielzeuge und Verbrauchsgüter. Verwende das Zahnrad, um genau auszuwählen, welche Verwandlungen entfernt werden. Während des Kampfs angewendete Verwandlungen werden nach Kampfende entfernt." @@ -5206,3 +5206,45 @@ L["Edit Box Font"] = "Schriftart des Eingabefelds" L["Edit Box Font Size"] = "Schriftgröße des Eingabefelds" L["Separate Sidebar"] = "Separate Seitenleiste" L["Separates the sidebar from the chat panel and gives it its own background and border."] = "Trennt die Seitenleiste vom Chatfenster und gibt ihr einen eigenen Hintergrund und Rahmen." + +-- QoL: Raid Tools (options page, panel buttons and chat messages) +L["Show Raid Tools"] = "Raid-Tools anzeigen" +L["A raid control panel with ready check, pull timer and raid markers. In a raid it only shows while you are the leader or an assistant, since none of its buttons work without that; in a party it always shows."] = "Ein Kontrollfeld für Schlachtzüge mit Bereitschaftsprüfung, Pull-Timer und Schlachtzugsmarkierungen. Im Schlachtzug wird es nur angezeigt, solange Ihr Anführer oder Assistent seid, da ohne diese Rechte keine seiner Schaltflächen funktioniert; in einer Gruppe wird es immer angezeigt." +L["Toggle Raid Tools"] = "Raid-Tools umschalten" +L["Toggles the Raid Tools panels, in or out of combat.\n\nLeft-click to set a keybind.\nRight-click to unbind."] = "Blendet die Raid-Tools-Fenster ein und aus, im Kampf wie außerhalb.\n\nLinksklick, um eine Taste zu belegen.\nRechtsklick, um die Belegung zu entfernen." +L["Default to Collapsed When Shown"] = "Standardmäßig eingeklappt anzeigen" +L["Shows start as a small icon, and the keybind switches between the icon and the full windows. Turn off to show full windows and make the keybind hide and show them."] = "Die Anzeige beginnt als kleines Symbol, und die Tastenbelegung wechselt zwischen Symbol und vollständigen Fenstern. Ausgeschaltet erscheinen sofort die vollständigen Fenster, und die Tastenbelegung blendet sie aus und wieder ein." +L["Show as"] = "Anzeigen als" +L["One Window combines everything into a single element; the Only choices show just that part."] = "'Ein Fenster' fasst alles in einem einzigen Element zusammen; die 'Nur'-Optionen zeigen ausschließlich diesen Teil." +L["One Window"] = "Ein Fenster" +L["Two Windows"] = "Zwei Fenster" +L["Only Group & Pull"] = "Nur Gruppe & Pull" +L["Only Markers"] = "Nur Markierungen" + +L["GROUP BUTTONS"] = "GRUPPENSCHALTFLÄCHEN" +L["Show Role Check"] = "Rollenüberprüfung anzeigen" +L["Shows the Role Check button. Turn it off and the remaining buttons close the gap."] = "Zeigt die Schaltfläche 'Rollenüberprüfung'. Ist sie ausgeschaltet, rücken die übrigen Schaltflächen nach." +L["Show Convert to Raid"] = "'In Schlachtzug umwandeln' anzeigen" +L["Shows the Convert to Raid button, which reads Convert to Party while you are in a raid."] = "Zeigt die Schaltfläche 'In Schlachtzug umwandeln', die im Schlachtzug 'In Gruppe umwandeln' heißt." +L["Show Disband"] = "'Auflösen' anzeigen" +L["Shows the Disband button. It always asks before disbanding, but hiding it puts it out of misclick range for good."] = "Zeigt die Schaltfläche 'Auflösen'. Sie fragt immer nach, bevor die Gruppe aufgelöst wird -- ausgeblendet ist sie jedoch endgültig außer Reichweite von Fehlklicks." + +L["PULL TIMER"] = "PULL-TIMER" +L["Countdown length of this pull button, in seconds. Set it to 0 to hide the button; with all three at 0 the whole pull row disappears, Stop included."] = "Countdown-Dauer dieser Pull-Schaltfläche in Sekunden. Auf 0 gesetzt wird die Schaltfläche ausgeblendet; stehen alle drei auf 0, verschwindet die gesamte Pull-Zeile samt 'Stopp'." +L["First Timer"] = "Erster Timer" +L["Second Timer"] = "Zweiter Timer" +L["Third Timer"] = "Dritter Timer" + +L["Group & Pull"] = "Gruppe & Pull" +L["Markers"] = "Markierungen" +L["Role Check"] = "Rollenüberprüfung" +L["Convert to Raid"] = "In Schlachtzug umwandeln" +L["Convert to Party"] = "In Gruppe umwandeln" +L["Disband"] = "Auflösen" +L["Disband the group?"] = "Die Gruppe wirklich auflösen?" +L["Stop"] = "Stopp" + +L["In-game countdown unavailable in combat; the boss mod pull timer still started."] = "Der spielinterne Countdown ist im Kampf nicht verfügbar; der Pull-Timer des Boss-Mods wurde dennoch gestartet." +L["Raid Tools is disabled in the EllesmereUI options."] = "Die Raid-Tools sind in den EllesmereUI-Optionen deaktiviert." +L["Raid Tools cannot be toggled by slash command in combat -- use the keybind."] = "Die Raid-Tools lassen sich im Kampf nicht per Chatbefehl umschalten -- nutzt dafür die Tastenbelegung." +L["Raid Tools is hidden in a raid without leader or assist -- none of its buttons work there."] = "Die Raid-Tools werden im Schlachtzug ohne Anführer- oder Assistentenrechte ausgeblendet -- dort funktioniert keine ihrer Schaltflächen." From ac4ab08fab4f07abce1b7589e282a7c87ea76d26 Mon Sep 17 00:00:00 2001 From: RedAces Date: Mon, 3 Aug 2026 19:19:18 +0200 Subject: [PATCH 4/4] regenerate keys 2 --- Locales/_keys.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Locales/_keys.txt b/Locales/_keys.txt index 2ec24f68..70d9f8ae 100644 --- a/Locales/_keys.txt +++ b/Locales/_keys.txt @@ -1,6 +1,6 @@ # Auto-generated by .tools/extract-locale-keys.sh -- do not edit by hand. # Canonical list of translatable English keys passed as string literals -# (666 unique). Regenerate after wrapping new strings. Keys passed as +# (667 unique). Regenerate after wrapping new strings. Keys passed as # variables are not listed here -- use the in-game /euiloc harvester for # the complete runtime set. (Raid) @@ -394,7 +394,7 @@ No buffs assigned. Right click a button in the preview to assign buffs. No death recap available No excluded debuffs. No patch notes yet. -No spec macros for +No spec macros for No spells yet. Add spell IDs above. No talent No talent reminders configured