From 95657fc38704f462e934177de53827d5abb22d51 Mon Sep 17 00:00:00 2001 From: catlinux Date: Thu, 20 Aug 2026 16:53:31 +0200 Subject: [PATCH] Add Spanish translation and update references --- Locales/Locales.lua | 15 + Locales/esES.lua | 2178 +++++++++++++++++++++++++ PBM/IPTiersColor.lua | 116 +- PBM/PBM_BotSettings.lua | 72 +- PBM/PBM_BottomTabs.lua | 14 +- PBM/PBM_CharSheet.lua | 162 +- PBM/PBM_ClassTabs.lua | 48 +- PBM/PBM_Commands.lua | 6 +- PBM/PBM_Constants.lua | 91 +- PBM/PBM_Core.lua | 6 +- PBM/PBM_DeathKnight.lua | 70 +- PBM/PBM_Druid.lua | 128 +- PBM/PBM_Engine.lua | 6 +- PBM/PBM_ExportImport.lua | 12 +- PBM/PBM_GroupView.lua | 66 +- PBM/PBM_Hunter.lua | 116 +- PBM/PBM_Inspect.lua | 14 +- PBM/PBM_Item.lua | 2 +- PBM/PBM_Mage.lua | 132 +- PBM/PBM_Minimap.lua | 10 +- PBM/PBM_MultibotPanel.lua | 18 +- PBM/PBM_Needs.lua | 48 +- PBM/PBM_Notes.lua | 4 +- PBM/PBM_Overview.lua | 92 +- PBM/PBM_Paladin.lua | 214 +-- PBM/PBM_Priest.lua | 104 +- PBM/PBM_Raid.lua | 253 +-- PBM/PBM_Rogue.lua | 98 +- PBM/PBM_Shaman.lua | 78 +- PBM/PBM_Sort.lua | 8 +- PBM/PBM_Spec.lua | 12 +- PBM/PBM_StratList.lua | 55 +- PBM/PBM_Tab_IndividualProgression.lua | 207 +-- PBM/PBM_Tab_LevelSync.lua | 142 +- PBM/PBM_Tab_Notes.lua | 6 +- PBM/PBM_Tab_Playerbots.lua | 144 +- PBM/PBM_TopTabs.lua | 20 +- PBM/PBM_TrackerCore.lua | 1119 ++++++------- PBM/PBM_Warlock.lua | 241 +-- PBM/PBM_Warrior.lua | 46 +- PBM/PBM_Windows.lua | 174 +- PlayerBotManager.toc | 6 +- 42 files changed, 4283 insertions(+), 2070 deletions(-) create mode 100644 Locales/Locales.lua create mode 100644 Locales/esES.lua diff --git a/Locales/Locales.lua b/Locales/Locales.lua new file mode 100644 index 0000000..728712f --- /dev/null +++ b/Locales/Locales.lua @@ -0,0 +1,15 @@ +local addonName, PBM = ... + +-- Taula global de localització per a l'addon +PBM.L = PBM.L or {} +local L = PBM.L + +-- Metataula per retornar la clau original si no hi ha traducció +setmetatable(L, { + __index = function(t, key) + return key + end +}) + +-- Alias global per accedir-hi fàcilment des de qualsevol fitxer +PBM_L = L \ No newline at end of file diff --git a/Locales/esES.lua b/Locales/esES.lua new file mode 100644 index 0000000..5c40aad --- /dev/null +++ b/Locales/esES.lua @@ -0,0 +1,2178 @@ +-- ============================================================ +-- Locales/esES.lua | Traducción al español para PBM +-- ============================================================ +local _, addon = ... +addon.L = addon.L or {} +local PBM_L = addon.L + +-- Detectar si el cliente está en español (esES / esMX) +if GetLocale() ~= "esES" and GetLocale() ~= "esMX" then + -- Si el cliente no está en español, el sistema usará las claves por defecto en inglés +end + +-- ============================================================ +-- TRADUCCIONES +-- ============================================================ + +-- ============================================================ +-- IPTiersColor.lua +-- ============================================================ +-- Full tier names +PBM_L["T0 — Molten Core / Onyxia"] = "T0 — Núcleo de Magma / Onyxia" +PBM_L["T1 — Molten Core / Onyxia"] = "T1 — Núcleo de Magma / Onyxia" +PBM_L["T2 — Blackwing Lair"] = "T2 — Guarida de Ala Negra" +PBM_L["T3 — Ahn'Qiraj War Effort"] = "T3 — Esfuerzo de Guerra de Ahn'Qiraj" +PBM_L["T4 — AQ War"] = "T4 — Guerra de AQ" +PBM_L["T5 — Ahn'Qiraj"] = "T5 — Ahn'Qiraj" +PBM_L["T6 — Naxxramas 40"] = "T6 — Naxxramas 40" +PBM_L["T7 — Pre-TBC"] = "T7 — Pre-TBC" +PBM_L["T8 — Karazhan / Gruul's Lair / Magtheridon's Lair"] = "T8 — Karazhan / Guarida de Gruul / Guarida de Magtheridon" +PBM_L["T9 — Serpentshrine Cavern / Tempest Keep"] = "T9 — Caverna Santuario Serpiente / El Castillo de la Tempestad" +PBM_L["T10 — Hyjal Summit / Black Temple"] = "T10 — Cima del Monte Hyjal / Templo Oscuro" +PBM_L["T11 — Zul'Aman (Optional)"] = "T11 — Zul'Aman (Opcional)" +PBM_L["T12 — Sunwell Plateau"] = "T12 — Meseta del Pozo del Sol" +PBM_L["T13 — Naxx / Eye of Eternity / Obsidian Sanctum"] = "T13 — Naxx / Ojo de la Eternidad / El Sagrario Obsidiana" +PBM_L["T14 — Ulduar"] = "T14 — Ulduar" +PBM_L["T15 — Trial of the Crusader"] = "T15 — Prueba del Cruzado" +PBM_L["T16 — Icecrown Citadel"] = "T16 — Ciudadela de la Corona de Hielo" +PBM_L["T17 — Ruby Sanctum"] = "T17 — El Sagrario Rubí" +PBM_L["T18 — Tiers Complete"] = "T18 — Niveles completados" + +-- Short tier names +PBM_L["None"] = "Ninguno" +PBM_L["T1 - Molten Core"] = "T1 - Núcleo de Magma" +PBM_L["T2 - Blackwing Lair"] = "T2 - Guarida de Ala Negra" +PBM_L["T3 - Ahn'Qiraj War Effort"] = "T3 - Esfuerzo de Guerra de AQ" +PBM_L["T4 - AQ War"] = "T4 - Guerra de AQ" +PBM_L["T5 - Ahn'Qiraj"] = "T5 - Ahn'Qiraj" +PBM_L["T6 - Naxxramas 40"] = "T6 - Naxxramas 40" +PBM_L["T7 - Pre-TBC"] = "T7 - Pre-TBC" +PBM_L["T8 - Karazhan, Gruul's, Mag's"] = "T8 - Karazhan, Gruul, Magtheridon" +PBM_L["T9 - Serpentshrine / TK"] = "T9 - Santuario Serpiente / TK" +PBM_L["T10 - Hyjal / Black Temple"] = "T10 - Hyjal / Templo Oscuro" +PBM_L["T11 - Zul'Aman (Optional)"] = "T11 - Zul'Aman (Opcional)" +PBM_L["T12 - Sunwell Plateau"] = "T12 - Meseta del Pozo del Sol" +PBM_L["T13 - Naxx/EoE/OS"] = "T13 - Naxx/Ojo/Sagrario Obsidiana" +PBM_L["T14 - Ulduar"] = "T14 - Ulduar" +PBM_L["T15 - Trial of the Crusader"] = "T15 - Prueba del Cruzado" +PBM_L["T16 - Icecrown Citadel"] = "T16 - Ciudadela Corona de Hielo" +PBM_L["T17 - Ruby Sanctum"] = "T17 - Sagrario Rubí" +PBM_L["T18 - Complete"] = "T18 - Completado" + +-- Raid lists per tier +PBM_L["Molten Core"] = "Núcleo de Magma" +PBM_L["Onyxia's Lair"] = "Guarida de Onyxia" +PBM_L["Blackwing Lair"] = "Guarida de Ala Negra" +PBM_L["Ahn'Qiraj War Effort"] = "Esfuerzo de Guerra de Ahn'Qiraj" +PBM_L["AQ War"] = "Guerra de AQ" +PBM_L["Ahn'Qiraj"] = "Ahn'Qiraj" +PBM_L["Ruins of Ahn'Qiraj"] = "Ruinas de Ahn'Qiraj" +PBM_L["Naxxramas 40"] = "Naxxramas 40" +PBM_L["Pre-TBC"] = "Pre-TBC" +PBM_L["Karazhan"] = "Karazhan" +PBM_L["Gruul's Lair"] = "Guarida de Gruul" +PBM_L["Magtheridon's Lair"] = "Guarida de Magtheridon" +PBM_L["Serpentshrine Cavern"] = "Caverna Santuario Serpiente" +PBM_L["Tempest Keep"] = "El Castillo de la Tempestad" +PBM_L["Mount Hyjal"] = "Monte Hyjal" +PBM_L["Black Temple"] = "Templo Oscuro" +PBM_L["Zul'Aman (Optional)"] = "Zul'Aman (Opcional)" +PBM_L["Sunwell Plateau"] = "Meseta del Pozo del Sol" +PBM_L["Naxxramas"] = "Naxxramas" +PBM_L["Eye of Eternity"] = "El Ojo de la Eternidad" +PBM_L["Obsidian Sanctum"] = "El Sagrario Obsidiana" +PBM_L["Ulduar"] = "Ulduar" +PBM_L["Trial of the Crusader"] = "Prueba del Cruzado" +PBM_L["Icecrown Citadel"] = "Ciudadela de la Corona de Hielo" +PBM_L["Ruby Sanctum"] = "El Sagrario Rubí" + +-- ============================================================ +-- PBM_BotSettings.lua +-- ============================================================ +-- Header & Column Labels +PBM_L["Bot Settings"] = "Ajustes de Bots" +PBM_L["Add RndBot"] = "Añadir Bot Aleatorio" +PBM_L["Bot Controls"] = "Controles de Bot" + +-- Class Names +PBM_L["Death Knight"] = "Caballero de la Muerte" +PBM_L["Druid"] = "Druida" +PBM_L["Hunter"] = "Cazador" +PBM_L["Mage"] = "Mago" +PBM_L["Paladin"] = "Paladín" +PBM_L["Priest"] = "Sacerdote" +PBM_L["Rogue"] = "Pícaro" +PBM_L["Shaman"] = "Chamán" +PBM_L["Warlock"] = "Brujo" +PBM_L["Warrior"] = "Guerrero" + +-- Class Tooltip Template (%s will be replaced by class name) +PBM_L["Summon a random %s RndBot."] = "Invoca un bot aleatorio de clase %s." + +-- Bot Controls UI Labels & Tooltips +PBM_L["Selfbot"] = "Selfbot" +PBM_L["Switches Selfbot mode on and off.\nLeft-click to toggle."] = "Activa y desactiva el modo Selfbot.\nClic izquierdo para alternar." + +PBM_L["GameMaster Switch"] = "Interruptor de GameMaster" +PBM_L["GameMaster"] = "GameMaster" +PBM_L["Enable or disable GameMaster control.\nRequires GM rights."] = "Activa o desactiva el control de GameMaster.\nRequiere permisos de GM." + +PBM_L["RTSC"] = "RTSC" +PBM_L["Enable or disable RTSC.\nLeft-click to toggle."] = "Activa o desactiva RTSC.\nClic izquierdo para alternar." + +PBM_L["Auto Release"] = "Liberación Automática" +PBM_L["Toggle automatic spirit release on bot death."] = "Alterna la liberación automática de espíritu al morir el bot." + +PBM_L["Auto Stats"] = "Estadísticas Automáticas" +PBM_L["Toggle automatic stats broadcast to group."] = "Alterna la difusión automática de estadísticas al grupo." + +PBM_L["Reset Bot AI"] = "Reiniciar IA de Bot" +PBM_L["Reset AI for targeted bot or entire group."] = "Reinicia la IA para el bot seleccionado o para todo el grupo." + +PBM_L["Reset Action"] = "Reiniciar Acción" +PBM_L["Reset actions for targeted bot or entire group."] = "Reinicia las acciones para el bot seleccionado o para todo el grupo." + +-- ============================================================ +-- PBM_BottomTabs.lua +-- ============================================================ +PBM_L["Playerbots"] = "Bots de Jugador" +PBM_L["LevelSync"] = "Sincronización de Nivel" +PBM_L["Notes"] = "Notas" + +-- ============================================================ +-- PBM_CharSheet.lua +-- ============================================================ +-- Spec/Templates Button & Tooltips +PBM_L["Templates"] = "Plantillas" +PBM_L["Set Talents"] = "Establecer Talentos" +PBM_L["Select a talent template for this Bot"] = "Selecciona una plantilla de talentos para este Bot" + +-- Buttons & Controls +PBM_L["Refresh"] = "Refrescar" +PBM_L["Strategies"] = "Estrategias" +PBM_L["Open Talents"] = "Abrir Talentos" +PBM_L["Open Inventory"] = "Abrir Inventario" +PBM_L["Open Spellbook"] = "Abrir Libro de Hechizos" +PBM_L["Opens Window Behind Tracker"] = "Abre la ventana detrás del Rastreador" + +-- Tooltips: Food, Loot, Gather, PvP +PBM_L["Food and Drink"] = "Comida y Bebida" +PBM_L["Eat and drink after combat"] = "Comer y beber tras el combate" +PBM_L["Bot eats food and drinks water to restore"] = "El bot come y bebe para restaurar" +PBM_L["health"] = "salud" +PBM_L["mana"] = "maná" +PBM_L["between fights."] = "entre combates." + +PBM_L["Loot"] = "Botín" +PBM_L["Auto loot bodies"] = "Despojar cuerpos automáticamente" +PBM_L["Bot loots killed enemies automatically."] = "El bot despoja a los enemigos muertos automáticamente." + +PBM_L["Gather"] = "Recolectar" +PBM_L["Gather resource nodes"] = "Recolectar nodos de recursos" +PBM_L["Bot harvests nearby resource nodes."] = "El bot recolecta los nodos de recursos cercanos." + +PBM_L["PvP"] = "PvP" +PBM_L["Activates player targeting."] = "Activa el marcado de jugadores." +PBM_L["Rotations are unchanged."] = "Las rotaciones no cambian." + +-- Stats & Tooltips Labels +PBM_L["Bag"] = "Bolsa" +PBM_L["Durability"] = "Durabilidad" + +-- Reset Buttons & Tooltips +PBM_L["Reset"] = "Reiniciar" +PBM_L["CO"] = "CO" +PBM_L["NC"] = "NC" +PBM_L["Reset CO Strategies"] = "Reiniciar Estrategias CO" +PBM_L["Resets combat strategies to defaults."] = "Reinicia las estrategias de combate a los valores por defecto." +PBM_L["Non-combat strategies are preserved."] = "Se conservan las estrategias fuera de combate." +PBM_L["Reset NC Strategies"] = "Reiniciar Estrategias NC" +PBM_L["Resets non-combat strategies to defaults."] = "Reinicia las estrategias fuera de combate a los valores por defecto." +PBM_L["Combat strategies are preserved."] = "Se conservan las estrategias de combate." + +-- Notes +PBM_L["Note: For quick setup, use the Templates menu in the top-left corner of each character tab. This will automatically configure both talents and strategies for you."] = "Nota: Para una configuración rápida, usa el menú Plantillas en la esquina superior izquierda de cada pestaña. Esto configurará automáticamente los talentos y estrategias." +PBM_L["Note: The Strategy List on the right is what the bot actually uses. The center buttons are for changes/visual reference. Confirm the list reflects your setup."] = "Nota: La lista de estrategias a la derecha es la que realmente usa el bot. Los botones centrales son para cambios/referencia visual. Confirma que la lista refleja tu configuración." +PBM_L["Note: During raid encounters, strategies are based on spec and are automatically overwritten. To change bot behavior, use a different template or spec."] = "Nota: En encuentros de banda, las estrategias se basan en la especialización y se sobrescriben automáticamente. Para cambiar el comportamiento, usa otra plantilla o especialización." +PBM_L["** Strategies are subject to change."] = "** Las estrategias están sujetas a cambios." + +-- PBM_ClassTab.lua +PBM_L["Drag to reorder"] = "Arrastrar para reordenar" +PBM_L["No spec spec set"] = "Sin especialización" -- Para la comprobación de spec vacío +PBM_L["No spec set"] = "Sin especialización" +PBM_L["+ Add to Raid"] = "+ Añadir a Banda" +PBM_L["Adds to the Raid tab."] = "Añade a la pestaña de Banda." +PBM_L["Left-click to add to raid."] = "Clic izquierdo para añadir a banda." +PBM_L["Right-click to remove."] = "Clic derecho para eliminar." +PBM_L["> Invite to Group"] = "> Invitar al Grupo" +PBM_L["Left-click to invite to group."] = "Clic izquierdo para invitar al grupo." +PBM_L["Remove Character"] = "Eliminar personaje" +PBM_L["Removes from tracker."] = "Elimina del rastreador." +PBM_L["Prof."] = "Prof." +PBM_L["Need"] = "Necesita" +PBM_L["removed from raid slot"] = "eliminado de la casilla de banda" +PBM_L["is already in the Raid."] = "ya está en la Banda." +PBM_L["Raid"] = "Banda" +PBM_L["is full"] = "está llena" +PBM_L["Added"] = "Añadido" +PBM_L["to Raid slot"] = "a la casilla de banda" +PBM_L["added to raid slot"] = "añadido a la casilla de banda" +PBM_L["Removed"] = "Eliminado" +PBM_L["from bots."] = "de los bots." +PBM_L["Inviting"] = "Invitando a" +PBM_L["to group..."] = "al grupo..." +PBM_L["Invited"] = "Invitado" +PBM_L["Ignored Spell List"] = "Lista de hechizos ignorados" + +-- ============================================================ +-- PBM_Commands.lua +-- ============================================================ +PBM_L["Not in a group."] = "No estás en un grupo." +PBM_L["No bot name specified."] = "No se ha especificado ningún nombre de bot." + +-- ============================================================ +-- PBM_Constants.lua +-- ============================================================ +PBM_L["Head"] = "Cabeza" +PBM_L["Neck"] = "Cuello" +PBM_L["Shldr"] = "Hombro" +PBM_L["Back"] = "Espalda" +PBM_L["Chest"] = "Pecho" +PBM_L["Wrist"] = "Muñeca" +PBM_L["Hands"] = "Manos" +PBM_L["Waist"] = "Cintura" +PBM_L["Legs"] = "Piernas" +PBM_L["Feet"] = "Pies" +PBM_L["Ring1"] = "Anillo 1" +PBM_L["Ring2"] = "Anillo 2" +PBM_L["Trnk1"] = "Abalorio 1" +PBM_L["Trnk2"] = "Abalorio 2" +PBM_L["MH"] = "M. Ppal." +PBM_L["OH"] = "M. Sec." +PBM_L["Rngd"] = "A distancia" +PBM_L["Shoulders"] = "Hombreras" +PBM_L["Wrists"] = "Muñequeras" +PBM_L["Ring"] = "Anillo" +PBM_L["Trinket"] = "Abalorio" +PBM_L["Main Hand"] = "Mano principal" +PBM_L["Off Hand"] = "Mano secundaria" +PBM_L["Ranged"] = "A distancia" +PBM_L["Alchemy"] = "Alquimia" +PBM_L["Blacksmithing"] = "Herrería" +PBM_L["Jewelcrafting"] = "Joyería" +PBM_L["Enchanting"] = "Encantamiento" +PBM_L["Engineering"] = "Ingeniería" +PBM_L["Leatherworking"] = "Peletería" +PBM_L["Tailoring"] = "Sastrería" +PBM_L["Inscription"] = "Inscripción" +PBM_L["Herbalism"] = "Botánica" +PBM_L["Mining"] = "Minería" +PBM_L["Skinning"] = "Desuello" +PBM_L["Cooking"] = "Cocina" +PBM_L["Fishing"] = "Pesca" +PBM_L["Death Knight"] = "Caballero de la Muerte" +PBM_L["Druid"] = "Druida" +PBM_L["Hunter"] = "Cazador" +PBM_L["Mage"] = "Mago" +PBM_L["Paladin"] = "Paladín" +PBM_L["Priest"] = "Sacerdote" +PBM_L["Rogue"] = "Pícaro" +PBM_L["Shaman"] = "Chamán" +PBM_L["Warlock"] = "Brujo" +PBM_L["Warrior"] = "Guerrero" +PBM_L["Group"] = "Grupo" +PBM_L["Raid"] = "Banda" +PBM_L["Overview"] = "General" +PBM_L["Tank"] = "Tanque" +PBM_L["Healer"] = "Sanador" +PBM_L["DPS"] = "DPS" +PBM_L["GS"] = "GS" +PBM_L["iLvL"] = "iLvl" +PBM_L["Name"] = "Nombre" +PBM_L["Spec"] = "Rama" +PBM_L["Role"] = "Función" + +-- ============================================================ +-- PBM_Core.lua +-- ============================================================ +PBM_L["Strategies:"] = "Estrategias:" + +-- Death Knight Panel Strings +PBM_L["DK_BLOOD"] = "Sangre" +PBM_L["DK_FROST"] = "Escarcha" +PBM_L["DK_UNHOLY"] = "Profano" +PBM_L["DK_AOE"] = "AoE" +PBM_L["DK_ASSIST"] = "Asistencia" + +-- ============================================================ +-- PBM_DK.lua +-- ============================================================ +PBM_L["Blood |cffffcc00PvE|r"] = "Sangre |cffffcc00PvE|r" +PBM_L["Frost |cffffcc00PvE|r"] = "Escarcha |cffffcc00PvE|r" +PBM_L["Unholy |cffffcc00PvE|r"] = "Profano |cffffcc00PvE|r" +PBM_L["Double Aura Blood |cffffcc00PvE|r"] = "Sangre Doble Aura |cffffcc00PvE|r" +PBM_L["Blood |cffff4444PvP|r"] = "Sangre |cffff4444PvP|r" +PBM_L["Frost |cffff4444PvP|r"] = "Escarcha |cffff4444PvP|r" +PBM_L["Unholy |cffff4444PvP|r"] = "Profano |cffff4444PvP|r" +PBM_L["Death Knight"] = "Caballero de la Muerte" +PBM_L["Blood"] = "Sangre" +PBM_L["Frost"] = "Escarcha" +PBM_L["Unholy"] = "Profano" +PBM_L["Blood tank specialization"] = "Especialización de tanque Sangre" +PBM_L["Mutually exclusive with Frost, Unholy."] = "Mutuamente excluyente con Escarcha, Profano." +PBM_L["Frost DPS specialization"] = "Especialización de DPS Escarcha" +PBM_L["Mutually exclusive with Blood, Unholy."] = "Mutuamente excluyente con Sangre, Profano." +PBM_L["Unholy DPS specialization"] = "Especialización de DPS Profano" +PBM_L["Mutually exclusive with Blood, Frost."] = "Mutuamente excluyente con Sangre, Escarcha." +PBM_L["AoE"] = "Área" +PBM_L["Frost AoE"] = "Escarcha Área" +PBM_L["Frost AoE rotation"] = "Rotación de área Escarcha" +PBM_L["Unholy AoE"] = "Profano Área" +PBM_L["Unholy AoE rotation"] = "Rotación de área Profano" +PBM_L["Assist"] = "Asistencia" +PBM_L["Tank Assist"] = "Asistir al Tanque" +PBM_L["Tank target focus"] = "Foco en el objetivo del tanque" +PBM_L["Bot attacks the tank's current target."] = "El bot ataca al objetivo actual del tanque." +PBM_L["DPS Assist"] = "Asistir al DPS" +PBM_L["Assists the main assist target"] = "Asiste al objetivo principal de asistencia" +PBM_L["Bot focuses DPS on the DPS assist target."] = "El bot centra su DPS en el objetivo de asistencia a DPS." +PBM_L["DPS AoE"] = "DPS Área" +PBM_L["Cross-role AoE mode"] = "Modo de área entre funciones" + +-- ============================================================ +-- PBM_Druid.lua +-- ============================================================ +PBM_L["Balance |cffffcc00PvE|r"] = "Equilibrio |cffffcc00PvE|r" +PBM_L["Bear |cffffcc00PvE|r"] = "Oso |cffffcc00PvE|r" +PBM_L["Restoration |cffffcc00PvE|r"] = "Restauración |cffffcc00PvE|r" +PBM_L["Cat |cffffcc00PvE|r"] = "Gato |cffffcc00PvE|r" +PBM_L["Balance |cffff4444PvP|r"] = "Equilibrio |cffff4444PvP|r" +PBM_L["Cat |cffff4444PvP|r"] = "Gato |cffff4444PvP|r" +PBM_L["Restoration |cffff4444PvP|r"] = "Restauración |cffff4444PvP|r" + +PBM_L["Bear"] = "Oso" +PBM_L["Cat"] = "Gato" +PBM_L["Balance"] = "Equilibrio" +PBM_L["Restoration"] = "Restauración" +PBM_L["Healing"] = "Sanación" +PBM_L["Hybrid"] = "Híbrido" +PBM_L["AoE"] = "AoE" +PBM_L["Charge"] = "Carga" +PBM_L["Assist"] = "Asistencia" +PBM_L["Buff"] = "Buff" +PBM_L["CC"] = "CC" + +PBM_L["|cffffcc00Bear|r |cff999999- |r|cffFF7D0Abear|r |cffee4433CO|r"] = "|cffffcc00Oso|r |cff999999- |r|cffFF7D0Abear|r |cffee4433CO|r" +PBM_L["|cffffcc00Dire Bear Form|r"] = "|cffffcc00Forma de oso temible|r" +PBM_L["|cffFF4444Mutually exclusive with Cat, Balance, Heal, Off-Heal.|r"] = "|cffFF4444Mutuamente excluyente con Gato, Equilibrio, Sanación y Sanación secundaria.|r" + +PBM_L["|cffffcc00Cat|r |cff999999- |r|cffFF7D0Acat|r |cffee4433CO|r"] = "|cffffcc00Gato|r |cff999999- |r|cffFF7D0Acat|r |cffee4433CO|r" +PBM_L["|cffffcc00Feral Cat melee DPS|r"] = "|cffffcc00DPS cuerpo a cuerpo Feral Gato|r" + +PBM_L["|cffffcc00Balance|r |cff999999- |r|cffFF7D0Abalance|r |cffee4433CO|r"] = "|cffffcc00Equilibrio|r |cff999999- |r|cffFF7D0Abalance|r |cffee4433CO|r" +PBM_L["|cffffcc00Moonkin Form — Balance caster DPS|r"] = "|cffffcc00Forma de lechúcico lunar — DPS a distancia Equilibrio|r" + +PBM_L["|cffffcc00Restoration|r |cff999999- |r|cffFF7D0Aresto|r |cffee4433CO|r"] = "|cffffcc00Restauración|r |cff999999- |r|cffFF7D0Aresto|r |cffee4433CO|r" +PBM_L["|cffffcc00Tree of Life — Restoration healer|r"] = "|cffffcc00Árbol de la vida — Sanador Restauración|r" +PBM_L["|cffFF4444Mutually exclusive with Bear, Cat, Balance, Off-Heal.|r"] = "|cffFF4444Mutuamente excluyente con Oso, Gato, Equilibrio y Sanación secundaria.|r" + +PBM_L["|cffffcc00Tranquility|r |cff999999- |r|cffFF7D0Atranquility|r |cffee4433CO|r"] = "|cffffcc00Tranquilidad|r |cff999999- |r|cffFF7D0Atranquility|r |cffee4433CO|r" +PBM_L["Auto-loaded on Resto,"] = "Cargado automáticamente en Resto," +PBM_L["Heals ALL nearby party members."] = "Sana a TODOS los miembros cercanos del grupo." + +PBM_L["|cffffcc00Blanketing|r |cff999999- |r|cffFF7D0Ablanketing|r |cffee4433CO|r"] = "|cffffcc00Cobertura de HoT|r |cff999999- |r|cffFF7D0Ablanketing|r |cffee4433CO|r" +PBM_L["pre-HoT party with Wild Growth"] = "Aplica HoT previo al grupo con Crecimiento salvaje" +PBM_L["+ Rejuvenation regardless of HP."] = "+ Rejuvenecimiento sin importar la salud." + +PBM_L["|cffffcc00Healer DPS|r |cff999999- |r|cffFF7D0Ahealer dps|r |cffee4433CO|r"] = "|cffffcc00DPS de Sanador|r |cff999999- |r|cffFF7D0Ahealer dps|r |cffee4433CO|r" +PBM_L["|cffffcc00Healer contributes DPS between heals|r"] = "|cffffcc00El sanador aporta DPS entre curaciones|r" + +PBM_L["|cffffcc00Off-Heal|r |cff999999- |r|cffFF7D0Aoffheal|r |cffee4433CO|r"] = "|cffffcc00Sanación secundaria|r |cff999999- |r|cffFF7D0Aoffheal|r |cffee4433CO|r" +PBM_L["|cffffcc00Cat DPS primary, heals when party drops low|r"] = "|cffffcc00Gato DPS principal, sana cuando el grupo baja de salud|r" + +PBM_L["|cffffcc00AoE|r |cff999999- |r|cffFF7D0Aaoe|r |cffee4433CO|r"] = "|cffffcc00AoE|r |cff999999- |r|cffFF7D0Aaoe|r |cffee4433CO|r" +PBM_L["Shared AoE strategy across all druid specs."] = "Estrategia AoE compartida en todas las especializaciones de druda." + +PBM_L["|cffffcc00Feral Charge|r |cff999999- |r|cffFF7D0Aferal charge|r |cffee4433CO|r"] = "|cffffcc00Carga feral|r |cff999999- |r|cffFF7D0Aferal charge|r |cffee4433CO|r" +PBM_L["Cat & Bear, for encounters when"] = "Gato y Oso, para encuentros donde" +PBM_L["charging in is unfavorable."] = "cargar hacia dentro no sea favorable." + +PBM_L["|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r"] = "|cffffcc00Asistencia al Tanque|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r" +PBM_L["|cffffcc00Tank target focus|r"] = "|cffffcc00Foco en el objetivo del tanque|r" +PBM_L["Bot attacks the tank's current target."] = "El bot ataca al objetivo actual del tanque." + +PBM_L["|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r"] = "|cffffcc00Asistencia a DPS|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r" +PBM_L["|cffffcc00Focus single-target DPS on assist target|r"] = "|cffffcc00Enfoca el DPS monobjetivo en el objetivo de asistencia|r" +PBM_L["Bot attacks the group DPS focus target."] = "El bot ataca al objetivo del foco de DPS del grupo." + +PBM_L["|cffffcc00DPS AoE|r |cff999999- |r|cffFF7D0Adps aoe|r |cffee4433CO|r"] = "|cffffcc00DPS AoE|r |cff999999- |r|cffFF7D0Adps aoe|r |cffee4433CO|r" +PBM_L["|cffffcc00Cross-role AoE mode|r"] = "|cffffcc00Modo AoE multirrol|r" + +PBM_L["|cffffcc00Buff|r |cff999999- |r|cffffff00buff|r |cffff8000NC|r"] = "|cffffcc00Buff|r |cff999999- |r|cffffff00buff|r |cffff8000NC|r" +PBM_L["|cffffcc00Group stats buff|r"] = "|cffffcc00Beneficio de estadísticas de grupo|r" +PBM_L["|cffFF7D0AMark of the Wild|r on all party members."] = "|cffFF7D0AMarca de lo Salvaje|r en todos los miembros del grupo." +PBM_L["Upgrades to |cffFF7D0AGift of the Wild|r when |cffffcc00Wild Thornroot|r"] = "Pasa a |cffFF7D0ARegalo de lo Salvaje|r cuando hay |cffffcc00Raíz de espina salvaje|r" +PBM_L["is in the bot's bags."] = "en las bolsas del bot." + +PBM_L["|cffffcc00CC|r |cff999999- |r|cffff8000cc|r |cffffcc00CO|r"] = "|cffffcc00CC|r |cff999999- |r|cffff8000cc|r |cffffcc00CO|r" +PBM_L["|cffffcc00Crowd control|r"] = "|cffffcc00Control de masas|r" +PBM_L["Cyclones, Hibernates, or Roots extra targets in combat."] = "Lanza Ciclón, Hiberner o Enredar a objetivos extra en combate." +PBM_L["Re-applies when the effect breaks."] = "Se vuelve a aplicar cuando se rompe el efecto." + +-- ============================================================ +-- PBM_Engine.lua +-- ============================================================ +PBM_L["NAME"] = "NOMBRE" + +-- ============================================================ +-- LBT_ExportImport.lua +-- ============================================================ +PBM_L["Nothing to import — paste text first."] = "Nada que importar — pega el texto primero." +PBM_L["Not a valid Lichborne export string."] = "No es una cadena de exportación de Lichborne válida." +PBM_L["Parse error: "] = "Error de procesamiento: " +PBM_L["unknown"] = "desconocido" +PBM_L["Load error: "] = "Error de carga: " +PBM_L["Invalid data format."] = "Formato de datos no válido." + +-- ============================================================ +-- LBT_GearScore.lua +-- ============================================================ +-- No hay cadenas de texto visibles para el usuario en este archivo. + +-- ============================================================ +-- PBM_GroupView.lua +-- ============================================================ +PBM_L["Click to sort"] = "Haz clic para ordenar" +PBM_L["Spec"] = "Espec" +PBM_L["Name"] = "Nombre" +PBM_L["iLvL"] = "iLvL" +PBM_L["GS"] = "GS" +PBM_L["Prof"] = "Prof" +PBM_L["Refresh"] = "Refrescar" +PBM_L["Refresh Group"] = "Refrescar grupo" +PBM_L["Rebuild the member list from your current group."] = "Reconstruye la lista de miembros de tu grupo actual." +PBM_L["Drag to reorder"] = "Arrastra para reordenar" +PBM_L["+ Add to Raid"] = "+ Añadir a la banda" +PBM_L["Adds character to the Raid tab."] = "Añade el personaje a la pestaña Banda." +PBM_L["Left-click to add to raid."] = "Clic izquierdo para añadir a la banda." +PBM_L["Right-click to remove."] = "Clic derecho para eliminar." +PBM_L["> Invite to Group"] = "> Invitar al grupo" +PBM_L["Left-click to invite."] = "Clic izquierdo para invitar." +PBM_L["Remove Character"] = "Eliminar personaje" +PBM_L["Removes from tracker."] = "Elimina del rastreador." +PBM_L["Avg iLvL:"] = "iLvL medio:" +PBM_L["Avg GS:"] = "GS medio:" +PBM_L["Current-group average "] = "Promedio del grupo actual de " +PBM_L["gear score"] = "puntuación de equipo" +PBM_L["item level"] = "nivel de objeto" +PBM_L[" for this class."] = " para esta clase." +PBM_L["Click to switch to this tab."] = "Haz clic para cambiar a esta pestaña." +PBM_L["Group iLvL"] = "iLvL del grupo" +PBM_L["Group GS"] = "GS del grupo" +PBM_L["Group iLvL:"] = "iLvL del grupo:" +PBM_L["Group GS:"] = "GS del grupo:" +PBM_L["Average "] = "Promedio de " +PBM_L[" across your current group."] = " en tu grupo actual." +PBM_L[" removed from raid slot "] = " eliminado de la casilla de banda " +PBM_L[" added to raid slot "] = " añadido a la casilla de banda " +PBM_L["Raid roster is full."] = "La plantilla de la banda está llena." +PBM_L[" Removed "] = " Eliminado " +PBM_L[" from bots."] = " de los bots." +PBM_L["Invited "] = "Invitado " +PBM_L[" to group."] = " al grupo." + +-- ============================================================ +-- PBM_Hunter.lua +-- ============================================================ +PBM_L["Beast Mastery |cffffcc00PvE|r"] = "Dominio de bestias |cffffcc00PvE|r" +PBM_L["Marksmanship |cffffcc00PvE|r"] = "Puntería |cffffcc00PvE|r" +PBM_L["Survival |cffffcc00PvE|r"] = "Supervivencia |cffffcc00PvE|r" +PBM_L["Beast Mastery |cffff4444PvP|r"] = "Dominio de bestias |cffff4444PvP|r" +PBM_L["Marksmanship |cffff4444PvP|r"] = "Puntería |cffff4444PvP|r" +PBM_L["Survival |cffff4444PvP|r"] = "Supervivencia |cffff4444PvP|r" +PBM_L["Beast Mastery"] = "Dominio de bestias" +PBM_L["Marksmanship"] = "Puntería" +PBM_L["Survival"] = "Supervivencia" +PBM_L["Combat"] = "Combate" +PBM_L["Assist"] = "Asistencia" +PBM_L["Aspects"] = "Aspectos" +PBM_L["CO"] = "CO" +PBM_L["NC"] = "NC" +PBM_L["|cffffcc00Beast Mastery|r |cff999999- |r|cffABD473bm|r |cffee4433CO|r"] = "|cffffcc00Dominio de bestias|r |cff999999- |r|cffABD473bm|r |cffee4433CO|r" +PBM_L["|cffffcc00Beast Mastery specialization|r"] = "|cffffcc00Especialización Dominio de bestias|r" +PBM_L["|cffFF4444Mutually exclusive with Marksmanship, Survival.|r"] = "|cffFF4444Mutuamente excluyente con Puntería, Supervivencia.|r" +PBM_L["|cffffcc00Marksmanship|r |cff999999- |r|cffABD473mm|r |cffee4433CO|r"] = "|cffffcc00Puntería|r |cff999999- |r|cffABD473mm|r |cffee4433CO|r" +PBM_L["|cffffcc00Marksmanship specialization|r"] = "|cffffcc00Especialización Puntería|r" +PBM_L["|cffFF4444Mutually exclusive with Beast Mastery, Survival.|r"] = "|cffFF4444Mutuamente excluyente con Dominio de bestias, Supervivencia.|r" +PBM_L["|cffffcc00Survival|r |cff999999- |r|cffABD473surv|r |cffee4433CO|r"] = "|cffffcc00Supervivencia|r |cff999999- |r|cffABD473surv|r |cffee4433CO|r" +PBM_L["|cffffcc00Survival specialization|r"] = "|cffffcc00Especialización Supervivencia|r" +PBM_L["|cffFF4444Mutually exclusive with Beast Mastery, Marksmanship.|r"] = "|cffFF4444Mutuamente excluyente con Dominio de bestias, Puntería.|r" +PBM_L["|cffffcc00Trap Weave|r |cff999999- |r|cffABD473trap weave|r |cffee4433CO|r"] = "|cffffcc00Trampas cuerpo a cuerpo|r |cff999999- |r|cffABD473trap weave|r |cffee4433CO|r" +PBM_L["|cffffcc00Melee trap rotation|r"] = "|cffffcc00Rotación de trampas a melé|r" +PBM_L["|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r"] = "|cffffcc00Asistir a tanque|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r" +PBM_L["|cffffcc00Tank target focus|r"] = "|cffffcc00Enfoque en el objetivo del tanque|r" +PBM_L["|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r"] = "|cffffcc00Asistir a DPS|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r" +PBM_L["|cffffcc00Assists the main assist target|r"] = "|cffffcc00Asiste al objetivo de asistencia principal|r" +PBM_L["Attacks the assist leader's target."] = "Ataca al objetivo del líder de asistencia." +PBM_L["|cffffcc00DPS AoE|r |cff999999- |r|cffABD473aoe|r |cffee4433CO|r"] = "|cffffcc00DPS en área|r |cff999999- |r|cffABD473aoe|r |cffee4433CO|r" +PBM_L["|cffffcc00Cross-role AoE mode|r"] = "|cffffcc00Modo Área (AoE) para cualquier rol|r" +PBM_L["|cffffcc00Dragonhawk|r |cff999999- |r|cffffff00bdps|r |cffff8000CO|r"] = "|cffffcc00Dracoleón|r |cff999999- |r|cffffff00bdps|r |cffff8000CO|r" +PBM_L["|cffffcc00Aspect of the Dragonhawk|r"] = "|cffffcc00Aspecto del dracoleón|r" +PBM_L["Increases ranged |cffFF9900attack power|r"] = "Aumenta el |cffFF9900poder de ataque a distancia|r" +PBM_L["and |cffFF9900dodge rating.|r"] = "y el |cffFF9900índice de esquiva.|r" +PBM_L["|cffffcc00Pack|r |cff999999- |r|cffffff00bspeed|r |cffff8000CO|r"] = "|cffffcc00Manada|r |cff999999- |r|cffffff00bspeed|r |cffff8000CO|r" +PBM_L["|cffffcc00Aspect of the Pack|r"] = "|cffffcc00Aspecto de la manada|r" +PBM_L["Increases group |cffFF9900movement speed|r"] = "Aumenta la |cffFF9900velocidad de movimiento|r del grupo" +PBM_L["while in combat."] = "mientras está en combate." +PBM_L["|cffffcc00Wild|r |cff999999- |r|cffffff00rnature|r |cffff8000CO|r"] = "|cffffcc00Naturaleza|r |cff999999- |r|cffffff00rnature|r |cffff8000CO|r" +PBM_L["|cffffcc00Aspect of the Wild|r"] = "|cffffcc00Aspecto de la Naturaleza|r" +PBM_L["Increases group |cff1EFF00Nature resistance|r"] = "Aumenta la |cff1EFF00resistencia a la Naturaleza|r del grupo" +PBM_L["|cffffcc00Dragonhawk|r |cff999999- |r|cffffff00bdps|r |cffff8000NC|r"] = "|cffffcc00Dracoleón|r |cff999999- |r|cffffff00bdps|r |cffff8000NC|r" +PBM_L["Default out-of-combat aspect."] = "Aspecto predeterminado fuera de combate." +PBM_L["Maintains ranged |cffFF9900attack power|r"] = "Mantiene el |cffFF9900poder de ataque a distancia|r" +PBM_L["|cffffcc00Cheetah|r |cff999999- |r|cffffff00bspeed|r |cffff8000NC|r"] = "|cffffcc00Guepardo|r |cff999999- |r|cffffff00bspeed|r |cffff8000NC|r" +PBM_L["|cffffcc00Aspect of the Cheetah|r"] = "|cffffcc00Aspecto del guepardo|r" +PBM_L["Increases |cffFF9900movement speed|r when"] = "Aumenta la |cffFF9900velocidad de movimiento|r cuando" +PBM_L["not in combat."] = "no se está en combate." +PBM_L["|cffffcc00Wild|r |cff999999- |r|cffffff00rnature|r |cffff8000NC|r"] = "|cffffcc00Naturaleza|r |cff999999- |r|cffffff00rnature|r |cffff8000NC|r" +PBM_L["Provides group |cff1EFF00Nature resistance|r"] = "Proporciona |cff1EFF00resistencia a la Naturaleza|r al grupo" +PBM_L["between encounters."] = "entre encuentros." + +-- ============================================================ +-- LBT_Inspect.lua +-- ============================================================ +PBM_L["Some items not cached — using available data."] = "Algunos objetos no están en caché: usando datos disponibles." +PBM_L["added!"] = "¡añadido!" +PBM_L["slots"] = "ranuras" +PBM_L["pts"] = "pts" +PBM_L["No gear data returned. Target may be out of range."] = "No se devolvieron datos de equipo. El objetivo puede estar fuera de alcance." +PBM_L["FAILED — no gear data returned."] = "ERROR: no se devolvieron datos de equipo." + +-- ============================================================ +-- PBM_AddItem.lua (o fitxer d'inventari corresponent) +-- ============================================================ +PBM_L["Catecher"] = "Capturador" + +-- ============================================================ +-- PBM_Mage.lua +-- ============================================================ +PBM_L["Arcane"] = "Arcano" +PBM_L["Fire"] = "Fuego" +PBM_L["Frost"] = "Escarcha" +PBM_L["Frostfire"] = "Pirofrío" +PBM_L["Arcane mage DPS"] = "Mago DPS Arcano" +PBM_L["Mutually exclusive with Fire, Frost, Frostfire."] = "Mutuamente exclusivo con Fuego, Escarcha, Pirofrío." +PBM_L["Fire mage DPS"] = "Mago DPS Fuego" +PBM_L["Mutually exclusive with Arcane, Frost, Frostfire."] = "Mutuamente exclusivo con Arcano, Escarcha, Pirofrío." +PBM_L["Frost mage DPS"] = "Mago DPS Escarcha" +PBM_L["Mutually exclusive with Arcane, Fire, Frostfire."] = "Mutuamente exclusivo con Arcano, Fuego, Pirofrío." +PBM_L["Frostfire mage DPS"] = "Mago DPS Pirofrío" +PBM_L["Mutually exclusive with Arcane, Fire, Frost."] = "Mutuamente exclusivo con Arcano, Fuego, Escarcha." +PBM_L["AoE"] = "Área" +PBM_L["AoE rotation modifier"] = "Modificador de rotación en área" +PBM_L["Spec-aware — adapts to the active talent tree."] = "Según especialización — se adapta a la rama activa." +PBM_L["Firestarter"] = "Pirotécnico" +PBM_L["Melee range opener"] = "Inicio a rango de melé" +PBM_L["Runs to melee range to use |cff5599EEDragon's Breath|r"] = "Corre a rango de melé para usar |cff5599EEOnto de dragón|r" +PBM_L["and |cff5599EEBlast Wave|r as openers."] = "y |cff5599EEOnda expansiva|r como inicios." +PBM_L["Buffs (Self)"] = "Beneficios (Propios)" +PBM_L["Mage Armor"] = "Armadura de mago" +PBM_L["Mana regen armor"] = "Armadura de regeneración de maná" +PBM_L["Increases |cff1EFF00resistance|r to magic debuffs."] = "Aumenta la |cff1EFF00resistencia|r a perjuicios mágicos." +PBM_L["|cff3A8FC4Mana|r regeneration continues while casting."] = "La regeneración de |cff3A8FC4maná|r continua mientras lanzas hechizos." +PBM_L["Best for survivability and mana-intensive fights."] = "Ideal para supervivencia y combates intensos en maná." +PBM_L["|cffFF4444Mutually exclusive with Molten Armor.|r"] = "|cffFF4444Mutuamente exclusivo con Armadura Arrabio.|r" +PBM_L["Molten Armor"] = "Armadura Arrabio" +PBM_L["Crit DPS armor"] = "Armadura de DPS crítico" +PBM_L["Causes |cffFF4444fire damage|r when hit."] = "Causa |cffFF4444daño de fuego|r al recibir golpes." +PBM_L["Increases |cffFF9900crit chance|r by your |cff1EFF00Spirit|r."] = "Aumenta la |cffFF9900probabilidad de crítico|r según tu |cff1EFF00Espíritu|r." +PBM_L["Best for pure DPS output."] = "Ideal para máximo rendimiento de DPS." +PBM_L["|cffFF4444Mutually exclusive with Mage Armor.|r"] = "|cffFF4444Mutuamente exclusivo con Armadura de mago.|r" +PBM_L["Assist"] = "Asistir" +PBM_L["Tank Assist"] = "Asistir Tanque" +PBM_L["Tank target focus"] = "Enfoque en el objetivo del tanque" +PBM_L["Bot attacks the tank's current target."] = "El bot ataca al objetivo actual del tanque." +PBM_L["DPS Assist"] = "Asistir DPS" +PBM_L["DPS target focus"] = "Enfoque en el objetivo del DPS" +PBM_L["Bot attacks the main DPS focus target."] = "El bot ataca al objetivo principal de DPS." +PBM_L["DPS AoE"] = "DPS Área" +PBM_L["Cross-role AoE mode"] = "Modo Área multi-rol" +PBM_L["Bot switches to |cffffcc00AoE|r rotation."] = "El bot cambia a rotación de |cffffcc00Área|r." +PBM_L["Buff"] = "Beneficio" +PBM_L["Group Intellect buff"] = "Beneficio de intelecto para el grupo" +PBM_L["|cff5599EEArcane Intellect|r on all party members."] = "|cff5599EEIntelecto Arcano|r en todos los miembros del grupo." +PBM_L["Increases |cffffcc00Intellect|r for 30 min."] = "Aumenta el |cffffcc00Intelecto|r durante 30 min." +PBM_L["CC"] = "CC" +PBM_L["Crowd control"] = "Control de masas" +PBM_L["Sheeps (|cff5599EEPolymorph|r) extra targets in combat."] = "Transforma en oveja (|cff5599EEPolimorfia|r) a objetivos extra en combate." +PBM_L["Re-applies when the effect breaks."] = "Reaplica la habilidad cuando el efecto se rompe." + + +-- ============================================================ +-- PBM_Minimap.lua +-- ============================================================ +PBM_L["Playerbot Manager"] = "Playerbot Manager" +PBM_L["Left-Click to Toggle"] = "Clic izquierdo para alternar" +PBM_L["Drag to Reposition"] = "Arrastra para reposicionar" + +-- ============================================================ +-- PBM_MultibotPanel.lua +-- ============================================================ +PBM_L["Yes"] = "Sí" +PBM_L["Cancel"] = "Cancelar" +PBM_L["Talent"] = "Talento" +PBM_L["Open Talents"] = "Abrir Talentos" +PBM_L["Inv."] = "Inv." +PBM_L["Open Inventory"] = "Abrir Inventario" +PBM_L["Spells"] = "Hechizos" +PBM_L["Open Spellbook"] = "Abrir Libro de Hechizos" + +-- ============================================================ +-- LBT_Needs.lua +-- ============================================================ +PBM_L["Tanque"] = "Tanque" +PBM_L["Sanador"] = "Sanador" +PBM_L["DPS"] = "DPS" +PBM_L["AoE"] = "AoE" +PBM_L["|cffff6666 (clic derecho para eliminar)|r"] = "|cffff6666 (clic derecho para eliminar)|r" +PBM_L["|cff66ff66 clic para marcar|r"] = "|cff66ff66 clic para marcar|r" +PBM_L["|cffff6666 (clic para quitar)|r"] = "|cffff6666 (clic para quitar)|r" +PBM_L["|cff66ff66 clic para añadir|r"] = "|cff66ff66 clic para añadir|r" +PBM_L["Necesidades: "] = "Necesidades: " +PBM_L["Necesidades"] = "Necesidades" +PBM_L["Profs: "] = "Profs: " +PBM_L["Rol"] = "Rol" +PBM_L["Necesidades:"] = "Necesidades:" +PBM_L["Prof / Rol:"] = "Prof / Rol:" +PBM_L["Nada marcado"] = "Nada marcado" +PBM_L["|cff888888Clic para editar (máx 2) Clic derecho borra todo|r"] = "|cff888888Clic para editar (máx 2) Clic derecho borra todo|r" +PBM_L["|cff888888Clic para editar · Clic derecho borra todo|r"] = "|cff888888Clic para editar · Clic derecho borra todo|r" + +-- ============================================================ +-- PBM_Notes.lua +-- ============================================================ +PBM_L["CHARACTER NOT AVAILABLE: "] = "PERSONAJE NO DISPONIBLE: " + +-- ============================================================ +-- PBM_Overview.lua +-- ============================================================ +PBM_L["Page %s v"] = "Página %s v" +PBM_L["Page 1 v"] = "Página 1 v" +PBM_L["Page %d"] = "Página %d" +PBM_L["Overview"] = "General" +PBM_L["Role"] = "Función" +PBM_L["Tank"] = "Tanque" +PBM_L["Healer"] = "Sanador" +PBM_L["DPS"] = "DPS" +PBM_L["AoE"] = "AoE" +PBM_L["No role set"] = "Sin función establecida" +PBM_L["|cff888888Click to set · Right-click to clear|r"] = "|cff888888Clic para asignar · Clic derecho para limpiar|r" +PBM_L["Empty"] = "Vacío" +PBM_L["|cffC69B3APBM:|r Removed "] = "|cffC69B3APBM:|r Eliminado " +PBM_L[" from bots."] = " de los bots." +PBM_L["Invited "] = "Invitado " +PBM_L[" to group."] = " al grupo." +PBM_L[" removed from raid slot "] = " eliminado del hueco de banda " +PBM_L[" is already in the Raid."] = " ya está en la banda." +PBM_L[" added to raid slot "] = " añadido al hueco de banda " +PBM_L["Raid is full!"] = "¡La banda está llena!" +PBM_L[" removed from tracker."] = " eliminado del rastreador." +PBM_L["Click to sort"] = "Clic para ordenar" +PBM_L["#"] = "#" +PBM_L["Spec"] = "Rama" +PBM_L["Name"] = "Nombre" +PBM_L["iLvL"] = "iLvL" +PBM_L["GS"] = "GS" +PBM_L["+"] = "+" +PBM_L["|cff44ff44+ Add to Raid|r"] = "|cff44ff44+ Añadir a banda|r" +PBM_L["Adds to the Raid tab."] = "Añade a la pestaña de Banda." +PBM_L["|cff44ff44Left-click to add to raid.|r"] = "|cff44ff44Clic izquierdo para añadir a la banda.|r" +PBM_L["|cffff2020Right-click to remove.|r"] = "|cffff2020Clic derecho para eliminar.|r" +PBM_L["|cff44eeff> Invite to Group|r"] = "|cff44eeff> Invitar al grupo|r" +PBM_L["|cff44ff44Left-click to invite to group.|r"] = "|cff44ff44Clic izquierdo para invitar al grupo.|r" +PBM_L["Delete Character"] = "Eliminar personaje" +PBM_L["Removes from tracker."] = "Elimina del rastreador." +PBM_L["|cffC69B3ACount:|r"] = "|cffC69B3ATotal:|r" + +-- ============================================================ +-- PBM_Paladin.lua +-- ============================================================ +PBM_L["Holy |cffffcc00PvE|r"] = "Sagrado |cffffcc00PvE|r" +PBM_L["Protection |cffffcc00PvE|r"] = "Protección |cffffcc00PvE|r" +PBM_L["Retribution |cffffcc00PvE|r"] = "Reprensión |cffffcc00PvE|r" +PBM_L["Holy |cffff4444PvP|r"] = "Sagrado |cffff4444PvP|r" +PBM_L["Protection |cffff4444PvP|r"] = "Protección |cffff4444PvP|r" +PBM_L["Retribution |cffff4444PvP|r"] = "Reprensión |cffff4444PvP|r" +PBM_L["Holy Pala"] = "Paladín Sagrado" +PBM_L["Protection"] = "Protección" +PBM_L["Retribution"] = "Reprensión" + +PBM_L["Holy"] = "Sagrado" +PBM_L["Auras"] = "Auras" +PBM_L["CO"] = "CO" +PBM_L["NC"] = "NC" +PBM_L["Heal DPS"] = "Sanar DPS" +PBM_L["Off-Heal"] = "Sanador Secundario" +PBM_L["Blessings"] = "Bendiciones" +PBM_L["Assist"] = "Asistencia" + +PBM_L["Heal"] = "Sanar" +PBM_L["Holy healer"] = "Sanador Sagrado" +PBM_L["Holy healer that DPS fills"] = "Sanador Sagrado que apoya con DPS" +PBM_L["Allows the healer to deal damage when healing is not needed."] = "Permite al sanador realizar daño cuando no se necesita sanación." +PBM_L["Retribution DPS with emergency heals"] = "DPS Reprensión con sanaciones de emergencia" +PBM_L["Switches to |cffF58CBAFlash of Light|r when party members drop low."] = "Cambia a |cffF58CBADestello de Luz|r cuando la salud de los miembros del grupo baja." +PBM_L["Tank"] = "Tanque" +PBM_L["Protection tank"] = "Tanque Protección" +PBM_L["Tank Assist"] = "Asistir Tanque" +PBM_L["Assists the main tank"] = "Asiste al tanque principal" +PBM_L["Focuses attacks on the tank's target."] = "Enfoca sus ataques en el objetivo del tanque." +PBM_L["Retribution DPS"] = "DPS Reprensión" +PBM_L["DPS Assist"] = "Asistir DPS" +PBM_L["Assists the DPS group"] = "Asiste al grupo de DPS" +PBM_L["Focuses attacks on the DPS leader's target."] = "Enfoca sus ataques en el objetivo del líder de DPS." +PBM_L["DPS AoE"] = "DPS en Área" +PBM_L["Cross-role AoE mode"] = "Modo de daño en área multirrol" + +PBM_L["Crusader Aura"] = "Aura de cruzado" +PBM_L["Movement speed aura"] = "Aura de velocidad de movimiento" +PBM_L["Increases mounted speed for all"] = "Aumenta la velocidad de montura para todos" +PBM_L["party members within 30 yards."] = "los miembros del grupo a menos de 30 metros." + +PBM_L["Devotion Aura"] = "Aura de devoción" +PBM_L["Armor aura"] = "Aura de armadura" +PBM_L["Increases |cffffcc00armor|r for all party"] = "Aumenta la |cffffcc00armadura|r para todos los" +PBM_L["members within 30 yards."] = "miembros del grupo a menos de 30 metros." + +PBM_L["Concentration Aura"] = "Aura de concentración" +PBM_L["Pushback resistance aura"] = "Aura de resistencia a interrupciones" +PBM_L["Reduces spell pushback by 35% for"] = "Reduce el retraso de lanzamientos un 35% para" + +PBM_L["Retribution Aura"] = "Aura de reprensión" +PBM_L["Holy retaliation aura"] = "Aura de represalia sagrada" +PBM_L["Deals |cffffcc00Holy|r damage to attackers."] = "Inflige daño |cffffcc00Sagrado|r a los atacantes." + +PBM_L["Fire Resistance Aura"] = "Aura de resistencia al Fuego" +PBM_L["Fire resistance aura"] = "Aura de resistencia al Fuego" +PBM_L["Increases |cffFF4444Fire resistance|r for all"] = "Aumenta la |cffFF4444resistencia al Fuego|r para todos" + +PBM_L["Frost Resistance Aura"] = "Aura de resistencia a la Escarcha" +PBM_L["Frost resistance aura"] = "Aura de resistencia a la Escarcha" +PBM_L["Increases |cff3A8FC4Frost resistance|r for all"] = "Aumenta la |cff3A8FC4resistencia a la Escarcha|r para todos" + +PBM_L["Shadow Resistance Aura"] = "Aura de resistencia a las Sombras" +PBM_L["Shadow resistance aura"] = "Aura de resistencia a las Sombras" +PBM_L["Increases |cff9966CCShadow resistance|r for all"] = "Aumenta la |cff9966CCresistencia a las Sombras|r para todos" + +PBM_L["Kings"] = "Reyes" +PBM_L["Blessing of Kings"] = "Bendición de reyes" +PBM_L["Increases all |cffFF9900stats|r by 10% for all"] = "Aumenta todas las |cffFF9900estadísticas|r un 10% para todos" +PBM_L["party members."] = "los miembros del grupo." + +PBM_L["Sanctuary"] = "Santuario" +PBM_L["Blessing of Sanctuary"] = "Bendición de santuario" +PBM_L["Damage reduction + mana on block."] = "Reducción de daño + mana al bloquear." +PBM_L["Applies to all party members."] = "Se aplica a todos los miembros del grupo." + +PBM_L["Wisdom"] = "Sabiduría" +PBM_L["Blessing of Wisdom"] = "Bendición de sabiduría" +PBM_L["Increases |cff3A8FC4mana regeneration|r for all"] = "Aumenta la |cff3A8FC4regeneración de mamá|r para todos" + +PBM_L["Might"] = "Poder" +PBM_L["Blessing of Might"] = "Bendición de poder" +PBM_L["Increases |cffFF9900attack power|r for all"] = "Aumenta el |cffFF9900poder de ataque|r para todos" + +-- ============================================================ +-- PBM_Priest.lua +-- ============================================================ +PBM_L["Discipline |cffffcc00PvE|r"] = "Disciplina |cffffcc00PvE|r" +PBM_L["Holy |cffffcc00PvE|r"] = "Sagrado |cffffcc00PvE|r" +PBM_L["Shadow |cffffcc00PvE|r"] = "Sombra |cffffcc00PvE|r" +PBM_L["Discipline |cffff4444PvP|r"] = "Disciplina |cffff4444PvP|r" +PBM_L["Holy |cffff4444PvP|r"] = "Sagrado |cffff4444PvP|r" +PBM_L["Shadow |cffff4444PvP|r"] = "Sombra |cffff4444PvP|r" +PBM_L["Healing"] = "Sanación" +PBM_L["DPS"] = "DPS" +PBM_L["|cffffcc00Heal|r |cff999999- |r|cffFFFFFFheal|r |cffee4433CO|r"] = "|cffffcc00Sanar|r |cff999999- |r|cffFFFFFFheal|r |cffee4433CO|r" +PBM_L["|cffffcc00Discipline healing|r"] = "|cffffcc00Sanación Disciplina|r" +PBM_L["|cffFF4444Mutually exclusive with Holy Heal, Holy DPS, Shadow.|r"] = "|cffFF4444Mutualmente exclusivo con Sanar Sagrado, DPS Sagrado, Sombra.|r" +PBM_L["|cffffcc00Holy Heal|r |cff999999- |r|cffFFFFFFholy heal|r |cffee4433CO|r"] = "|cffffcc00Sanar Sagrado|r |cff999999- |r|cffFFFFFFholy heal|r |cffee4433CO|r" +PBM_L["|cffffcc00Holy healing specialization|r"] = "|cffffcc00Especialización sanación Sagrado|r" +PBM_L["|cffFF4444Mutually exclusive with Discipline, Holy DPS, Shadow.|r"] = "|cffFF4444Mutualmente exclusivo con Disciplina, DPS Sagrado, Sombra.|r" +PBM_L["|cffffcc00Holy DPS|r |cff999999- |r|cffFFFFFFholy|r |cffee4433CO|r"] = "|cffffcc00DPS Sagrado|r |cff999999- |r|cffFFFFFFholy|r |cffee4433CO|r" +PBM_L["|cffffcc00Holy DPS specialization|r"] = "|cffffcc00Especialización DPS Sagrado|r" +PBM_L["|cffFF4444Mutually exclusive with Discipline, Holy Heal, Shadow.|r"] = "|cffFF4444Mutualmente exclusivo con Disciplina, Sanar Sagrado, Sombra.|r" +PBM_L["|cffffcc00Shadow|r |cff999999- |r|cffFFFFFFshadow|r |cffee4433CO|r"] = "|cffffcc00Sombra|r |cff999999- |r|cffFFFFFFshadow|r |cffee4433CO|r" +PBM_L["|cffffcc00Shadow DPS specialization|r"] = "|cffffcc00Especialización DPS Sombra|r" +PBM_L["|cffFF4444Mutually exclusive with Discipline, Holy Heal, Holy DPS.|r"] = "|cffFF4444Mutualmente exclusivo con Disciplina, Sanar Sagrado, DPS Sagrado.|r" +PBM_L["|cffffcc00Healer DPS|r |cff999999- |r|cffFFFFFFhealer dps|r |cffee4433CO|r"] = "|cffffcc00Sanador DPS|r |cff999999- |r|cffFFFFFFhealer dps|r |cffee4433CO|r" +PBM_L["|cffffcc00Healer that fills with DPS|r"] = "|cffffcc00Sanador que apoya con DPS|r" +PBM_L["Priest heals when needed, then fills with"] = "El Sacerdote sana cuando es necesario, luego apoya con" +PBM_L["|cffFFFFFFShadow Word: Pain|r and |cffFFFFFFMind Blast|r between heals."] = "|cffFFFFFFPalabra de Sombra: dolor|r y |cffFFFFFFExplosión mental|r entre curas." +PBM_L["AoE"] = "AoE" +PBM_L["|cffffcc00DPS AoE|r |cff999999- |r|cffFFFFFFshadow aoe|r |cffee4433CO|r"] = "|cffffcc00DPS AoE|r |cff999999- |r|cffFFFFFFshadow aoe|r |cffee4433CO|r" +PBM_L["|cffffcc00AoE shadow rotation|r"] = "|cffffcc00Rotación de Sombra AoE|r" +PBM_L["|cffffcc00Shadow AoE|r |cff999999- |r|cffFFFFFFshadow aoe|r |cffee4433CO|r"] = "|cffffcc00Sombra AoE|r |cff999999- |r|cffFFFFFFshadow aoe|r |cffee4433CO|r" +PBM_L["|cffffcc00Shadow AoE rotation|r"] = "|cffffcc00Rotación Sombra AoE|r" +PBM_L["Debuff"] = "Perjuicio" +PBM_L["|cffffcc00DPS Debuff|r |cff999999- |r|cffFFFFFFshadow debuff|r |cffee4433CO|r"] = "|cffffcc00Perjuicio DPS|r |cff999999- |r|cffFFFFFFshadow debuff|r |cffee4433CO|r" +PBM_L["|cffffcc00Target debuff rotation|r"] = "|cffffcc00Rotación de perjuicios al objetivo|r" +PBM_L["|cffffcc00Shadow Debuff|r |cff999999- |r|cffFFFFFFshadow debuff|r |cffee4433CO|r"] = "|cffffcc00Perjuicio Sombra|r |cff999999- |r|cffFFFFFFshadow debuff|r |cffee4433CO|r" +PBM_L["|cffffcc00Shadow debuff rotation|r"] = "|cffffcc00Rotación de perjuicios de Sombra|r" +PBM_L["Assist"] = "Asistencia" +PBM_L["|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r"] = "|cffffcc00Asistir Tanque|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r" +PBM_L["|cffffcc00Tank target focus|r"] = "|cffffcc00Foco en el objetivo del tanque|r" +PBM_L["Bot attacks the tank's current target."] = "El bot ataca al objetivo actual del tanque." +PBM_L["Buff"] = "Beneficio" +PBM_L["|cffffcc00Buff|r |cff999999- |r|cffffff00buff|r |cffff8000NC|r"] = "|cffffcc00Beneficio|r |cff999999- |r|cffffff00buff|r |cffff8000NC|r" +PBM_L["|cffffcc00Group stat buffs|r"] = "|cffffcc00Beneficios de estadísticas de grupo|r" +PBM_L["|cffFFFFFFPower Word: Fortitude, Divine Spirit,|r"] = "|cffFFFFFFPalabra de poder: entereza, Espíritu divino,|r" +PBM_L["|cffFFFFFFShadow Protection|r."] = "|cffFFFFFFProtección contra la Sombra|r." +PBM_L["|cffffcc00Shadow Resistance|r |cff999999- |r|cffFFFFFFrshadow|r |cffee4433NC|r"] = "|cffffcc00Resistencia a la Sombra|r |cff999999- |r|cffFFFFFFrshadow|r |cffee4433NC|r" +PBM_L["|cffffcc00Shadow resistance buff|r"] = "|cffffcc00Beneficio de resistencia a la Sombra|r" +PBM_L["Applies |cffFFFFFFShadow Protection|r to the group."] = "Aplica |cffFFFFFFProtección contra la Sombra|r al grupo." +PBM_L["CC"] = "CC" +PBM_L["|cffffcc00CC|r |cff999999- |r|cffff8000cc|r |cffffcc00CO|r"] = "|cffffcc00CC|r |cff999999- |r|cffff8000cc|r |cffffcc00CO|r" +PBM_L["|cffffcc00Crowd control|r"] = "|cffffcc00Control de masas|r" +PBM_L["Shackles (|cffFFFFFFShackle Undead|r) undead targets in combat."] = "Encadena (|cffFFFFFFEncadenar no-muerto|r) objetivos no-muertos en combate." +PBM_L["Re-applies when the effect breaks."] = "Reaplica cuando el efecto se rompe." + +-- ============================================================ +-- PBM_Raid.lua +-- ============================================================ +PBM_L["Role"] = "Función" +PBM_L["(max 2)"] = "(máx 2)" +PBM_L["Tank"] = "Tanque" +PBM_L["Healer"] = "Sanador" +PBM_L["DPS"] = "DPS" +PBM_L["AoE"] = "AoE" +PBM_L["Click to set role · Right-click removes"] = "Clic para asignar función · Clic derecho para eliminar" +PBM_L["Empty"] = "Vacío" +PBM_L["Invite Raid"] = "Invitar a banda" +PBM_L["Invite Group"] = "Invitar a grupo" +PBM_L["N/A (5-Man)"] = "N/D (5 Jugadores)" +PBM_L["Molten Core"] = "Núcleo de Magma" +PBM_L["Onyxia's Lair"] = "Guarida de Onyxia" +PBM_L["Blackwing Lair"] = "Guarida de Ala Negra" +PBM_L["Zul'Gurub"] = "Zul'Gurub" +PBM_L["Ruins of Ahn'Qiraj"] = "Ruinas de Ahn'Qiraj" +PBM_L["Ahn'Qiraj 40"] = "Ahn'Qiraj 40" +PBM_L["Naxxramas (Classic)"] = "Naxxramas (Classic)" +PBM_L["Dark Portal Opening"] = "Apertura del Portal Oscuro" +PBM_L["Karazhan"] = "Karazhan" +PBM_L["Gruul's Lair"] = "Guarida de Gruul" +PBM_L["Magtheridon's Lair"] = "Guarida de Magtheridon" +PBM_L["Serpentshrine Cavern"] = "Caverna Santuario Serpiente" +PBM_L["Tempest Keep"] = "El Castillo de la Tempestad" +PBM_L["Mount Hyjal"] = "Monte Hyjal" +PBM_L["Black Temple"] = "Templo Oscuro" +PBM_L["Zul'Aman"] = "Zul'Aman" +PBM_L["Sunwell Plateau"] = "Meseta del La fuente del sol" +PBM_L["Naxxramas 10"] = "Naxxramas 10" +PBM_L["Naxxramas 25"] = "Naxxramas 25" +PBM_L["Eye of Eternity 10"] = "El Ojo de la Eternidad 10" +PBM_L["Eye of Eternity 25"] = "El Ojo de la Eternidad 25" +PBM_L["Obsidian Sanctum 10"] = "Sagrario de Obsidiana 10" +PBM_L["Obsidian Sanctum 25"] = "Sagrario de Obsidiana 25" +PBM_L["Ulduar 10"] = "Ulduar 10" +PBM_L["Ulduar 25"] = "Ulduar 25" +PBM_L["Trial of the Crusader 10"] = "Prueba del Cruzado 10" +PBM_L["Trial of the Crusader 25"] = "Prueba del Cruzado 25" +PBM_L["Trial of the Grand Crusader 10"] = "Prueba del Gran Cruzado 10" +PBM_L["Trial of the Grand Crusader 25"] = "Prueba del Gran Cruzado 25" +PBM_L["Icecrown Citadel 10"] = "Ciudadela de la Corona de Hielo 10" +PBM_L["Icecrown Citadel 25"] = "Ciudadela de la Corona de Hielo 25" +PBM_L["Icecrown Citadel 10 Heroic"] = "Ciudadela de la Corona de Hielo 10 Heroico" +PBM_L["Icecrown Citadel 25 Heroic"] = "Ciudadela de la Corona de Hielo 25 Heroico" +PBM_L["Ruby Sanctum 10"] = "Sagrario Rubí 10" +PBM_L["Ruby Sanctum 25"] = "Sagrario Rubí 25" +PBM_L["N/A"] = "N/D" +PBM_L["Raid:"] = "Banda:" +PBM_L["5-Man"] = "5 jugadors" +PBM_L["Clear All"] = "Vaciar todo" +PBM_L["Clear All Raid Rosters"] = "Vaciar todas las listas de banda" +PBM_L["Wipes every raid group across all tiers."] = "Borra todos los grupos de banda de todas las tiers." +PBM_L["Character data is NOT affected."] = "Los datos de los personajes NO se ven afectados." +PBM_L["Wipe All Raid Rosters?\n\nClears every tier, raid, and group roster.\n|cff33ff66Character data is NOT affected.|r\n|cffff4444This cannot be undone.|r"] = "¿Vaciar todas las listas de banda?\n\nLimpia los grupos de cada tier, banda y grupo.\n|cff33ff66Los datos de los personajes NO se ven afectados.|r\n|cffff4444Esto no se puede deshacer.|r" +PBM_L["Yes, Wipe All"] = "Sí, vaciar todo" +PBM_L["Playerbot Manager:"] = "Playerbot Manager:" +PBM_L["All raid rosters cleared."] = "Todas las listas de banda han sido vaciadas." +PBM_L["Copy"] = "Copiar" +PBM_L["Copy Roster"] = "Copiar lista" +PBM_L["Copies the current roster to clipboard."] = "Copia la lista actual al portapapeles." +PBM_L["Paste"] = "Pegar" +PBM_L["Paste Roster"] = "Pegar lista" +PBM_L["Clipboard: "] = "Portapapeles: " +PBM_L["Yes, Paste"] = "Sí, pegar" +PBM_L["Roster copied to clipboard: "] = "Lista copiada al portapapeles: " +PBM_L["Roster copied!"] = "¡Lista copiada!" +PBM_L["Copy %s roster to %s?"] = "¿Copiar lista de %s a %s?" +PBM_L["Clear"] = "Vaciar" +PBM_L["Clear this Raid"] = "Vaciar esta banda" +PBM_L["(All Groups)"] = "(Todos los grupos)" +PBM_L["Removes all characters from "] = "Elimina todos los personajes de " +PBM_L["across |cffd4af37A, B, and C|r."] = "en |cffd4af37A, B y C|r." +PBM_L["Clear |cffd4af37%s|r?\n\nClears Groups A, B, and C.\n|cffff4444Cannot be undone.|r"] = "¿Vaciar |cffd4af37%s|r?\n\nVacia los Grupos A, B y C.\n|cffff4444No se puede deshacer.|r" +PBM_L["Yes, Clear"] = "Sí, vaciar" +PBM_L["Click 1: Death Knight first (A-Z classes)\nClick 2: Warrior first (Z-A classes)\nSpec within class always A-Z"] = "Clic 1: Creador de la muerte primero (clases A-Z)\nClic 2: Guerrero primero (clases Z-A)\nEspecialización dentro de la clase siempre A-Z" +PBM_L["Drag to reorder"] = "Arrastra para reordenar" +PBM_L["Remove from Raid"] = "Quitar de la banda" +PBM_L["Clears this slot in the raid roster."] = "Limpia esta casilla en la lista de la banda." +PBM_L["|cffFF8C00Character remains in the tracker.|r"] = "|cffFF8C00El personaje permanece en el registrador.|r" +PBM_L["|cff44eeff> Invite to Group|r"] = "|cff44eeff> Invitar al grupo|r" +PBM_L["|cff44ff44Left-click to invite to group.|r"] = "|cff44ff44Clic izquierdo para invitar al grupo.|r" +PBM_L["|cffff2020Right-click to remove.|r"] = "|cffff2020Clic derecho para expulsar.|r" +PBM_L["|cffC69B3APBM:|r Removed "] = "|cffC69B3APBM:|r Eliminado " +PBM_L[" from bots."] = " de los bots." +PBM_L["|cffd4af37Invited "] = "|cffd4af37Invitado " +PBM_L[" to group.|r"] = " al grupo.|r" +PBM_L["Count:"] = "Cantidad:" +PBM_L["Invite Raid"] = "Invitar banda" +PBM_L[" players in this roster"] = " jugadores en esta lista" +PBM_L["Does not work for rndbots."] = "No funciona para rndbots." +PBM_L["|cffC69B3APBM:|r No players in this roster."] = "|cffC69B3APBM:|r No hay jugadores en esta lista." +PBM_L["|cffC69B3APBM:|r Starting invite for "] = "|cffC69B3APBM:|r Iniciando invitación para " +PBM_L[" players..."] = " jugadores..." +PBM_L["|cffff9900Logging out all bots..."] = "|cffff9900Cerrando sesión de todos los bots..." +PBM_L["|cffC69B3APBM:|r Bots removed, leaving party..."] = "|cffC69B3APBM:|r Bots eliminados, abandonando grupo..." +PBM_L["|cffff9900Leaving party, then inviting..."] = "|cffff9900Abandonando grupo, luego invitando..." +PBM_L["|cffC69B3APBM:|r Bots cleared, starting invites..."] = "|cffC69B3APBM:|r Bots limpiados, iniciando invitaciones..." +PBM_L["|cffff9900Inviting "] = "|cffff9900Invitando " +PBM_L["|cffC69B3APBM:|r Inviting "] = "|cffC69B3APBM:|r Invitando " +PBM_L["|cffC69B3APBM:|r Initial invites sent, verifying..."] = "|cffC69B3APBM:|r Invitaciones iniciales enviadas, verificando..." +PBM_L["|cffC69B3APBM:|r |cff44ff44All "] = "|cffC69B3APBM:|r |cff44ff44Todos los " +PBM_L[" players confirmed in group!|r"] = " jugadores confirmados en el grupo!|r" +PBM_L["|cff44ff44All "] = "|cff44ff44Todos los " +PBM_L[" players confirmed.|r"] = " jugadores confirmados.|r" +PBM_L["|cffC69B3APBM:|r |cffff9900"] = "|cffC69B3APBM:|r |cffff9900" +PBM_L[" missed — re-inviting...|r"] = " no entraron — re-invitando...|r" +PBM_L["|cffC69B3APBM:|r |cff44ff44Re-invite pass complete.|r"] = "|cffC69B3APBM:|r |cff44ff44Ronda de re-invitación completada.|r" +PBM_L["|cff44ff44Invite complete (re-invite pass done).|r"] = "|cff44ff44Invitación completada (ronda de re-invitación hecha).|r" +PBM_L["|cffC69B3APBM:|r Removing "] = "|cffC69B3APBM:|r Eliminando " +PBM_L["|r before re-invite..."] = "|r antes de re-invitar..." +PBM_L["|cffC69B3APBM:|r Re-inviting "] = "|cffC69B3APBM:|r Re-invitando " +PBM_L["Invite Group"] = "Invitar grupo" +PBM_L["Invite Group (5-Man)"] = "Invitar grupo (5 jug.)" +PBM_L[" players in T0 5-Man roster"] = " jugadores en la lista T0 (5 jug.)" +PBM_L["|cffC69B3APBM:|r No players in T0 5-Man roster."] = "|cffC69B3APBM:|r No hay jugadores en la lista T0 (5 jug.)." +PBM_L["|cffC69B3APBM:|r Starting group invite for "] = "|cffC69B3APBM:|r Iniciando invitación de grupo para " +PBM_L["|cffC69B3APBM:|r Starting group invites..."] = "|cffC69B3APBM:|r Iniciando invitaciones de grupo..." +PBM_L["|cff44ff44All "] = "|cff44ff44Todos los " +PBM_L[" players confirmed in group.|r"] = " jugadores confirmados en el grupo.|r" +PBM_L["Stop Invite"] = "Detener invitación" +PBM_L["Cancels the running invite script."] = "Cancela el script de invitación en ejecución." +PBM_L["|cffC69B3APBM:|r |cffff4444Invite stopped.|r"] = "|cffC69B3APBM:|r |cffff4444Invitación detenida.|r" +PBM_L["|cffff4444Invite stopped."] = "|cffff4444Invitación detenida." + +-- ============================================================ +-- PBM_Rogue.lua +-- ============================================================ +PBM_L["Assassination |cffffcc00PvE|r"] = "Asesinato |cffffcc00PvE|r" +PBM_L["Combat |cffffcc00PvE|r"] = "Combate |cffffcc00PvE|r" +PBM_L["Subtlety |cffffcc00PvE|r"] = "Sutileza |cffffcc00PvE|r" +PBM_L["Assassination |cffff4444PvP|r"] = "Asesinato |cffff4444PvP|r" +PBM_L["Combat |cffff4444PvP|r"] = "Combate |cffff4444PvP|r" +PBM_L["Subtlety |cffff4444PvP|r"] = "Sutileza |cffff4444PvP|r" +PBM_L["Assassination"] = "Asesinato" +PBM_L["Combat"] = "Combate" +PBM_L["Subtlety"] = "Sutileza" +PBM_L["DPS"] = "DPS" +PBM_L["Stealth"] = "Sigilo" +PBM_L["Assist"] = "Asistencia" +PBM_L["|cffffcc00Assassination|r |cff999999- |r|cffFFF569melee|r |cffee4433CO|r"] = "|cffffcc00Asesinato|r |cff999999- |r|cffFFF569cuerpo a cuerpo|r |cffee4433CO|r" +PBM_L["|cffffcc00Assassination DoT specialization|r"] = "|cffffcc00Especialización de daño en el tiempo (DoT) de Asesinato|r" +PBM_L["|cffFF4444Mutually exclusive with Combat, Subtlety.|r"] = "|cffFF4444Mutuamente excluyente con Combate, Sutileza.|r" +PBM_L["|cffffcc00Combat|r |cff999999- |r|cffFFF569dps|r |cffee4433CO|r"] = "|cffffcc00Combate|r |cff999999- |r|cffFFF569dps|r |cffee4433CO|r" +PBM_L["|cffffcc00Combat sustained DPS|r"] = "|cffffcc00DPS sostenido de Combate|r" +PBM_L["|cffFF4444Mutually exclusive with Assassination, Subtlety.|r"] = "|cffFF4444Mutuamente excluyente con Asesinato, Sutileza.|r" +PBM_L["|cffffcc00Subtlety|r |cff999999- |r|cffFFF569melee|r |cffee4433CO|r"] = "|cffffcc00Sutileza|r |cff999999- |r|cffFFF569cuerpo a cuerpo|r |cffee4433CO|r" +PBM_L["|cffffcc00Subtlety burst from Stealth|r"] = "|cffffcc00Daño explosivo de Sutileza desde Sigilo|r" +PBM_L["|cffFF4444Mutually exclusive with Assassination, Combat.|r"] = "|cffFF4444Mutuamente excluyente con Asesinato, Combate.|r" +PBM_L["|cffffcc00Dps|r |cff999999- |r|cffFFF569dps|r |cffee4433CO|r"] = "|cffffcc00Dps|r |cff999999- |r|cffFFF569dps|r |cffee4433CO|r" +PBM_L["|cffffcc00Single-target DPS mode|r"] = "|cffffcc00Modo DPS a un solo objetivo|r" +PBM_L["Uses the standard Combat rotation"] = "Usa la rotación estándar de Combate" +PBM_L["on the current target."] = "en el objetivo actual." +PBM_L["|cffffcc00Melee|r |cff999999- |r|cffFFF569melee|r |cffee4433CO|r"] = "|cffffcc00Cuerpo a cuerpo|r |cff999999- |r|cffFFF569cuerpo a cuerpo|r |cffee4433CO|r" +PBM_L["|cffffcc00Melee DPS mode|r"] = "|cffffcc00Modo DPS cuerpo a cuerpo|r" +PBM_L["Core melee attack mode for"] = "Modo de ataque cuerpo a cuerpo principal para" +PBM_L["Assassination and Subtlety."] = "Asesinato y Sutileza." +PBM_L["|cffffcc00Boost|r |cff999999- |r|cffFFF569boost|r |cffee4433CO|r"] = "|cffffcc00Impulso|r |cff999999- |r|cffFFF569impulso|r |cffee4433CO|r" +PBM_L["|cffffcc00Offensive cooldown burst|r"] = "|cffffcc00Explosión de facultades ofensivas|r" +PBM_L["Works alongside all DPS modes."] = "Funciona junto a todos los modos de DPS." +PBM_L["|cffffcc00Stealth|r |cff999999- |r|cffFFF569stealth|r |cffee4433CO|r"] = "|cffffcc00Sigilo|r |cff999999- |r|cffFFF569sigilo|r |cffee4433CO|r" +PBM_L["|cffffcc00Activates Stealth mode|r"] = "|cffffcc00Activa el modo Sigilo|r" +PBM_L["Enters |cffffcc00Stealth|r between fights when possible."] = "Entra en |cffffcc00Sigilo|r entre combates cuando sea posible." +PBM_L["|cffffcc00Stealthed|r |cff999999- |r|cffFFF569stealthed|r |cffee4433CO|r"] = "|cffffcc00En sigilo|r |cff999999- |r|cffFFF569en sigilo|r |cffee4433CO|r" +PBM_L["|cffffcc00In-combat stealth behavior|r"] = "|cffffcc00Comportamiento de sigilo en combate|r" +PBM_L["Approaches targets in |cffffcc00Stealth|r."] = "Se aproxima a los objetivos en |cffffcc00Sigilo|r." +PBM_L["May pause DPS to re-stealth."] = "Puede pausar el DPS para volver a entrar en sigilo." +PBM_L["|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r"] = "|cffffcc00Asistir Tanque|r |cff999999- |r|cffff8000asistir tanque|r |cffffcc00CO|r" +PBM_L["|cffffcc00Tank target focus|r"] = "|cffffcc00Enfoque en el objetivo del tanque|r" +PBM_L["Attacks the main tank's current target."] = "Ataca al objetivo actual del tanque principal." +PBM_L["|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r"] = "|cffffcc00Asistir DPS|r |cff999999- |r|cffff8000asistir dps|r |cffffcc00CO|r" +PBM_L["|cffffcc00Assists the main assist target|r"] = "|cffffcc00Asiste al objetivo del asistente principal|r" +PBM_L["Attacks the assist leader's target."] = "Ataca al objetivo del líder de asistencia." +PBM_L["|cffffcc00DPS AoE|r |cff999999- |r|cffFFF569aoe|r |cffee4433CO|r"] = "|cffffcc00DPS Área|r |cff999999- |r|cffFFF569área|r |cffee4433CO|r" +PBM_L["|cffffcc00Cross-role AoE mode|r"] = "|cffffcc00Modo de área multirrol|r" +PBM_L["Switches to |cffffcc00AoE|r attacks on multiple targets."] = "Cambia a ataques en |cffffcc00Área|r con múltiples objetivos." + +-- ============================================================ +-- PBM_Shaman.lua +-- ============================================================ +PBM_L["Elemental |cffffcc00PvE|r"] = "Elemental |cffffcc00PvE|r" +PBM_L["Enhancement |cffffcc00PvE|r"] = "Mejora |cffffcc00PvE|r" +PBM_L["Restoration |cffffcc00PvE|r"] = "Restauración |cffffcc00PvE|r" +PBM_L["Elemental |cffff4444PvP|r"] = "Elemental |cffff4444PvP|r" +PBM_L["Enhancement |cffff4444PvP|r"] = "Mejora |cffff4444PvP|r" +PBM_L["Restoration |cffff4444PvP|r"] = "Restauración |cffff4444PvP|r" +PBM_L["Elemental"] = "Elemental" +PBM_L["Enhancement"] = "Mejora" +PBM_L["Restoration"] = "Restauración" +PBM_L["Elemental caster DPS"] = "DPI a distancia Elemental" +PBM_L["Mutually exclusive with Enhancement, Restoration."] = "Mutuamente exclusivo con Mejora y Restauración." +PBM_L["Enhancement melee DPS"] = "DPS cuerpo a cuerpo Mejora" +PBM_L["Mutually exclusive with Elemental, Restoration."] = "Mutuamente exclusivo con Elemental y Restauración." +PBM_L["Restoration healing specialization"] = "Especialización de sanación Restauración" +PBM_L["Mutually exclusive with Elemental, Enhancement."] = "Mutuamente exclusivo con Elemental y Mejora." +PBM_L["AoE"] = "Área (AoE)" +PBM_L["Healer DPS"] = "Sanador DPS" +PBM_L["AoE rotation"] = "Rotación de daño en área" +PBM_L["Healer that fills with DPS"] = "Sanador que apoya con daño" +PBM_L["Assist"] = "Asistencia" +PBM_L["Tank Assist"] = "Asistir al Tanque" +PBM_L["Tank target focus"] = "Foco en el objetivo del tanque" +PBM_L["Bot attacks whatever the main tank is targeting."] = "El bot ataca a lo que tenga como objetivo el tanque principal." +PBM_L["DPS Assist"] = "Asistir a DPS" +PBM_L["Assists the main assist target"] = "Asiste al objetivo de asistencia principal" +PBM_L["Bot attacks the group DPS focus target."] = "El bot ataca al objetivo principal asignado al grupo." +PBM_L["DPS AoE"] = "DPS en Área" +PBM_L["Cross-role AoE mode"] = "Modo de área multirrol" +PBM_L["Switches to AoE rotation on multiple targets."] = "Cambia a la rotación de área ante múltiples objetivos." +PBM_L["Cure"] = "Curar" +PBM_L["Cure debuffs on group members"] = "Curar perjuicios en miembros del grupo" +PBM_L["Cleanses poison, disease, and curses."] = "Limpia venenos, enfermedades y maldiciones." + +-- ============================================================ +-- LBT_Sort.lua +-- ============================================================ +PBM_L["Invite Raid"] = "Invitar Banda" +PBM_L["Invite Group"] = "Invitar Grupo" +PBM_L["Sort v"] = "Ordenar v" + +-- ============================================================ +-- LBT_Spec.lua +-- ============================================================ +PBM_L["Unknown class: "] = "Clase desconocida: " +PBM_L[": FAILED — could not read talent data."] = ": FALLÓ — no se pudieron leer los datos de talentos." +PBM_L["Talent data unavailable. Try standing closer."] = "Datos de talentos no disponibles. Intenta acercarte más." +PBM_L[" — Specialization: "] = " — Especialización: " +PBM_L[" pts)"] = " pts)" + +-- ============================================================ +-- LBT_StratList.lua +-- ============================================================ +PBM_L["Death Knight"] = "Caballero de la Muerte" +PBM_L["Druid"] = "Druida" +PBM_L["Hunter"] = "Cazador" +PBM_L["Mage"] = "Mago" +PBM_L["Paladin"] = "Paladín" +PBM_L["Priest"] = "Sacerdote" +PBM_L["Rogue"] = "Pícaro" +PBM_L["Shaman"] = "Chamán" +PBM_L["Warlock"] = "Brujo" +PBM_L["Warrior"] = "Guerrero" +PBM_L["Elemental"] = "Elemental" +PBM_L["Enhancement"] = "Mejora" +PBM_L["Restoration"] = "Restauración" + +-- ============================================================ +-- PBM_IPProgression.lua +-- ============================================================ +PBM_L["What is Individual Progression?"] = "Qué es Progresión Individual?" +PBM_L["Each character advances through"] = "Cada personaje avanza a través de" +PBM_L["WoW's raid tiers chronologically."] = "los tiers de banda de WoW cronológicamente." +PBM_L["Content is |cff69CCF0gated|r \226\128\148 clear each"] = "El contenido está |cff69CCF0bloqueado|r \226\128\148 completa cada" +PBM_L["tier before the next one opens."] = "tier antes de que se abra el siguiente." +PBM_L["|cffFF8C00Each tier unlocks new raids,|r"] = "|cffFF8C00Cada tier desbloquea nuevas bandas,|r" +PBM_L["|cffFF8C00and/or expansions.|r"] = "|cffFF8C00y/o expansiones.|r" + +PBM_L["How to Advance Your Tier"] = "Cómo Avanzar tu Tier" +PBM_L["|cffd4af371.|r Defeat the |cff69CCF0final boss|r or the"] = "|cffd4af371.|r Derrota al |cff69CCF0jefe final|r o la" +PBM_L[" |cff69CCF0final quest|r listed in the table."] = " |cff69CCF0misión final|r indicada en la tabla." +PBM_L["|cffd4af372.|r Tier advances automatically on"] = "|cffd4af372.|r El tier avanza automáticamente al" +PBM_L[" final boss / quest completion."] = " completar el jefe final / misión." +PBM_L["|cffFF8C00Altbots follow their own progression tier.|r"] = "|cffFF8C00Los Altbots siguen su propio tier de progresión.|r" +PBM_L["|cffFF8C00Rndbots follow the group leader's tier.|r"] = "|cffFF8C00Los Rndbots siguen el tier del líder de grupo.|r" + +PBM_L["Commands"] = "Comandos" +PBM_L["Check Tier: |cffd4af37.ip get /|r"] = "Ver Tier: |cffd4af37.ip get /|r" +PBM_L["Check PvP: |cffd4af37.ip pvp /|r"] = "Ver PvP: |cffd4af37.ip pvp /|r" +PBM_L["Sync Bots: |cffd4af37.ip setbot (Tier)|r"] = "Sinc Bots: |cffd4af37.ip setbot (Tier)|r" +PBM_L["Sync Bots: |cffd4af37.ip setrep (Reputation)|r"] = "Sinc Bots: |cffd4af37.ip setrep (Reputación)|r" +PBM_L["Attune: |cffd4af37.ip attune onyxia/blacktemple|r"] = "Sintonía: |cffd4af37.ip attune onyxia/blacktemple|r" +PBM_L["|cffff4444GM (Required):|r |cffd4af37.ip set (Change tier)|r"] = "|cffff4444MJ (Requerido):|r |cffd4af37.ip set (Cambiar tier)|r" +PBM_L["|cffff4444GM (Required):|r |cffd4af37.ip tele (Teleport)|r"] = "|cffff4444MJ (Requerido):|r |cffd4af37.ip tele (Teletransporte)|r" + +PBM_L["Tiers: "] = "Tiers: " +PBM_L["Level Cap: |cffd4af37"] = "Límite de Nivel: |cffd4af37" +PBM_L["Classic World of Warcraft"] = "World of Warcraft Classic" +PBM_L["The Burning Crusade"] = "The Burning Crusade" +PBM_L["Wrath of the Lich King"] = "Wrath of the Lich King" + +PBM_L["Tier"] = "Tier" +PBM_L["Raid / Event"] = "Banda / Evento" +PBM_L["LvL"] = "NvL" +PBM_L["Final Boss / Quest"] = "Jefe Final / Misión" +PBM_L["Unlocks"] = "Desbloqueos" + +PBM_L["CLASSIC"] = "CLASSIC" +PBM_L["THE BURNING CRUSADE"] = "THE BURNING CRUSADE" +PBM_L["WRATH OF THE LICH KING"] = "WRATH OF THE LICH KING" + +PBM_L["Starting Tier"] = "Tier Inicial" +PBM_L["Ragnaros & Onyxia"] = "Ragnaros y Onyxia" +PBM_L["Default starting tier (no unlock required)"] = "Tier inicial por defecto (no requiere desbloqueo)" +PBM_L["All players start at this tier by default. Level is capped to 60.\n \nTier 0 and Tier 1 are available simultaneously, as was the case for the original Vanilla release.\n \nFinal bosses: |cffFFD900Ragnaros|r and |cffFFD900Onyxia|r."] = "Todos los jugadores comienzan en este tier por defecto. El nivel está limitado a 60.\n \nEl Tier 0 y el Tier 1 están disponibles simultáneamente, como en la versión original de Vanilla.\n \nJefes finales: |cffFFD900Ragnaros|r y |cffFFD900Onyxia|r." + +PBM_L["Molten Core / Onyxia's Lair"] = "Núcleo de Magma / Guarida de Onyxia" + +PBM_L["Blackwing Lair"] = "Guarida de Ala Negra" +PBM_L["Nefarian"] = "Nefarian" +PBM_L["BWL access (Onyxia Scale Cloak required)"] = "Acceso a BWL (requiere Capa de escamas de Onyxia)" +PBM_L["Blackwing Lair is now available. Players can enter without having defeated |cffFFD900Onyxia|r, but will not survive Shadowflame without the Onyxia Scale Cloak.\n \nThis tier has a natural RPG-style progression requirement.\n \nFinal boss: |cffFFD900Nefarian|r.\n \n|cffFF8C00Altbots and Rndbots do not require the Onyxia Scale Cloak. The effect is applied automatically.|r"] = "La Guarida de Ala Negra ya está disponible. Los jugadores pueden entrar sin haber derrotado a |cffFFD900Onyxia|r, pero no sobrevivirán a Llama de las Sombras sin la Capa de escamas de Onyxia.\n \nEste tier tiene un requisito de progresión natural estilo RPG.\n \nJefe final: |cffFFD900Nefarian|r.\n \n|cffFF8C00Los Altbots y Rndbots no requieren la Capa de escamas de Onyxia. El efecto se aplica automáticamente.|r" + +PBM_L["Ahn'Qiraj War Effort"] = "Esfuerzo de Guerra de Ahn'Qiraj" +PBM_L["Bang a Gong!"] = "¡Toca el gong!" +PBM_L["AQ war effort unlocked; Zul'Gurub (optional) opens"] = "Esfuerzo de guerra de AQ desbloqueado; se abre Zul'Gurub (opcional)" +PBM_L["This phase includes the Scarab Lord quest chain and the AQ war effort. Every player must complete each resource turn-in quest at least once.\n \nZul'Gurub becomes available during this tier.\n \nFinal quest: |cffFFD900Bang a Gong!|r\n \n|cffFF8C00Zul'Gurub is optional and can be configured to open at an earlier tier.|r"] = "Esta fase incluye la cadena de misiones del Señor del Escarabajo y el esfuerzo de guerra de AQ. Cada jugador debe completar las misiones de entrega de recursos al menos una vez.\n \nZul'Gurub pasa a estar disponible durante este tier.\n \nMisión final: |cffFFD900¡Toca el gong!|r\n \n|cffFF8C00Zul'Gurub es opcional y se puede configurar para abrirse en un tier anterior.|r" + +PBM_L["Ahn'Qiraj War"] = "Guerra de Ahn'Qiraj" +PBM_L["Chaos and Destruction"] = "Caos y destrucción" +PBM_L["AQ20 and AQ40 become available"] = "AQ20 y AQ40 pasan a estar disponibles" +PBM_L["The AQ conflict is active and both AQ20 and AQ40 are accessible. Quest NPCs for AQ equipment are not available until after the war effort ends.\n \nFinal quest: |cffFFD900Chaos and Destruction|r.\n \n|cffFF8C00The Scarab Gate does not stay open during the war. AQ War enemies will block the gate when it is closed. Click the gong to re-open it. Once the war is fully completed, the gate stays open permanently.|r"] = "El conflicto de AQ está activo y tanto AQ20 como AQ40 son accesibles. Los PNJ de misiones para equipo de AQ no están disponibles hasta después de que termine el esfuerzo de guerra.\n \nMisión final: |cffFFD900Caos y destrucción|r.\n \n|cffFF8C00La Puerta del Escarabajo no permanece abierta durante la guerra. Los enemigos de la Guerra de AQ bloquearán la puerta cuando se cierre. Haz clic en el gong para reabrirla. Una vez completada la guerra, la puerta permanece abierta permanentemente.|r" + +PBM_L["Ahn'Qiraj"] = "Ahn'Qiraj" +PBM_L["C'Thun"] = "C'Thun" +PBM_L["Catch-up gearing quests in Silithus"] = "Misiones de equipo de puesta al día en Silithus" +PBM_L["Completing AQ40 is required to advance to the next tier. Catch-up gearing quests and upgrades are available through AQ20.\n \nFinal boss: |cffFFD900C'Thun|r"] = "Es necesario completar AQ40 para avanzar al siguiente tier. Las misiones de equipo de puesta al día y mejoras están disponibles a través de AQ20.\n \nJefe final: |cffFFD900C'Thun|r" + +PBM_L["Naxxramas 40"] = "Naxxramas 40" +PBM_L["Kel'Thuzad"] = "Kel'Thuzad" +PBM_L["Scourge Invasion; Light's Hope attunement"] = "Invasión de la Plaga; sintonía en Esperanza de la Luz" +PBM_L["The Light's Hope Chapel and its associated quests unlock, enabling the Naxxramas attunement. Once attuned, players can enter through the Naxxramas teleport in the Eastern Plaguelands.\n \nThe Scourge Invasion is also active during this tier.\n \nFinal boss: |cffFFD900Kel'Thuzad|r\n \n|cffFF8C00The crystal teleporter is located in the Eastern Plaguelands, inside the Ziggurat that hosts the Naxxramas meeting stone.|r"] = "La Capilla de la Esperanza de la Luz y sus misiones asociadas se desbloquean, permitiendo la sintonía de Naxxramas. Una vez sintonizados, los jugadores pueden entrar a través del teletransporte de Naxxramas en las Tierras de la Peste del Este.\n \nLa Invasión de la Plaga también está activa durante este tier.\n \nJefe final: |cffFFD900Kel'Thuzad|r\n \n|cffFF8C00El cristal teletransportador se encuentra en las Tierras de la Peste del Este, dentro del Zigurat que alberga la roca de encuentro de Naxxramas.|r" + +PBM_L["Pre-TBC"] = "Pre-TBC" +PBM_L["Into the Breach"] = "En la brecha" +PBM_L["Dark Portal defense scenario"] = "Escenario de defensa del Portal Oscuro" +PBM_L["A brief phase where enemies are emerging from the Dark Portal, requiring players to mount a defense.\n \nFinal quest: |cffFFD900Into the Breach|r"] = "Una breve fase donde los enemigos emergen del Portal Oscuro, requiriendo que los jugadores organicen una defensa.\n \nMisión final: |cffFFD900En la brecha|r" + +PBM_L["Karazhan / Gruul's Lair / Magtheridon's Lair"] = "Karazhan / Guarida de Gruul / Guarida de Magtheridon" +PBM_L["Prince Malchezaar"] = "Príncipe Malchezaar" +PBM_L["Dark Portal opens; level cap raised to 70"] = "Se abre el Portal Oscuro; límite de nivel elevado a 70" +PBM_L["Players may enter the Dark Portal and level to 70.\n \nFinal boss: |cffFFD900Prince Malchezaar|r\n \n|cffFF8C00Attunements will be necessary to enter TBC raids, which will require completing TBC heroics.|r"] = "Los jugadores pueden cruzar el Portal Oscuro y subir al nivel 70.\n \nJefe final: |cffFFD900Príncipe Malchezaar|r\n \n|cffFF8C00Serán necesarias sintonías para entrar en las bandas de TBC, lo que requerirá completar heroicas de TBC.|r" + +PBM_L["Serpentshrine Cavern / Tempest Keep"] = "Caverna Santuario Serpiente / El Castillo de la Tempestad" +PBM_L["Kael'thas Sunstrider"] = "Kael'thas Caminante del Sol" +PBM_L["Hyjal Summit / Black Temple - Attunements required"] = "La Cima de Hyjal / Templo Oscuro - Requiere sintonías" +PBM_L["Players complete attunements for the next tier of TBC raids, progressing through Serpentshrine Cavern and Tempest Keep.\n \nFinal boss: |cffFFD900Kael'thas Sunstrider|r"] = "Los jugadores completan las sintonías para el siguiente tier de bandas de TBC, progresando a través de la Caverna Santuario Serpiente y El Castillo de la Tempestad.\n \nJefe final: |cffFFD900Kael'thas Caminante del Sol|r" + +PBM_L["Hyjal Summit / Black Temple"] = "La Cima de Hyjal / Templo Oscuro" +PBM_L["Illidan Stormrage"] = "Illidan Tempestira" +PBM_L["Completing this tier unlocks Sunwell Plateau"] = "Completar este tier desbloquea la Meseta del La Fuente del Sol" +PBM_L["Hyjal Summit and Black Temple are now accessible. Completing this tier unlocks Sunwell Plateau.\n \nFinal boss: |cffFFD900Illidan Stormrage|r\n \n|cffFF8C00You may enter Black Temple without fully completing Hyjal.|r"] = "La Cima de Hyjal y el Templo Oscuro ya son accesibles. Completar este tier desbloquea la Meseta del La Fuente del Sol.\n \nJefe final: |cffFFD900Illidan Tempestira|r\n \n|cffFF8C00Puedes entrar al Templo Oscuro sin completar Hyjal por completo.|r" + +PBM_L["Zul'Aman (Optional)"] = "Zul'Aman (Opcional)" +PBM_L["Zul'jin"] = "Zul'jin" +PBM_L["Optional \226\128\148 Ghostlands raid; can be configured earlier"] = "Opcional \226\128\148 Banda de Tierras Fantasma; se puede configurar antes" +PBM_L["An optional raid located in the Ghostlands.\n \nFinal boss: |cffFFD900Zul'jin|r\n \n|cffFF8C00Can be configured to open earlier; by default unlocks after Black Temple.|r"] = "Una banda opcional ubicada en las Tierras Fantasma.\n \nJefe final: |cffFFD900Zul'jin|r\n \n|cffFF8C00Se puede configurar para abrirse antes; por defecto se desbloquea después del Templo Oscuro.|r" + +PBM_L["Sunwell Plateau"] = "Meseta de la Fuente del Sol" +PBM_L["Kil'jaeden"] = "Kil'jaeden" +PBM_L["Isle of Quel'Danas; final TBC raid content"] = "Isla de Quel'Danas; contenido final de bandas de TBC" +PBM_L["The Isle of Quel'Danas unlocks, enabling its questlines and access to Sunwell Plateau.\n \nFinal boss: |cffFFD900Kil'jaeden|r\n \n|cffFF8C00Unlocks daily quests and areas as their reputation with the Shattered Sun Offensive increases.|r"] = "Se desbloquea la Isla de Quel'Danas, permitiendo sus cadenas de misiones y el acceso a la Meseta de la Fuente del Sol.\n \nJefe final: |cffFFD900Kil'jaeden|r\n \n|cffFF8C00Desbloquea misiones diarias y zonas a medida que aumenta la reputación con el Ofensiva del Sol Devastado.|r" + +PBM_L["Naxxramas / Eye of Eternity / Obsidian Sanctum"] = "Naxxramas / El Ojo de la Eternidad / El Sagrario Obsidiana" +PBM_L["Kel'Thuzad (80)"] = "Kel'Thuzad (80)" +PBM_L["Northrend opens; level cap raised to 80"] = "Se abre Rasganorte; límite de nivel elevado a 80" +PBM_L["Players enter Northrend and may level to 80. Three raids are available: Naxxramas, Eye of Eternity, and Obsidian Sanctum.\n \nFinal boss: |cffFFD900Kel'Thuzad|r (level 80)"] = "Los jugadores entran en Rasganorte y pueden subir al nivel 80. Hay tres bandas disponibles: Naxxramas, El Ojo de la Eternidad y El Sagrario Obsidiana.\n \nJefe final: |cffFFD900Kel'Thuzad|r (nivel 80)" + +PBM_L["Ulduar"] = "Ulduar" +PBM_L["Yogg-Saron"] = "Yogg-Saron" +PBM_L["Ulduar access with associated quest chain"] = "Acceso a Ulduar con cadena de misiones asociada" +PBM_L["Players are now able to enter and complete Ulduar, along with its associated quest chain.\n \nFinal boss: |cffFFD900Yogg-Saron|r"] = "Los jugadores ahora pueden entrar y completar Ulduar, junto con su cadena de misiones asociada.\n \nJefe final: |cffFFD900Yogg-Saron|r" + +PBM_L["Trial of the Crusader"] = "Prueba del Cruzado" +PBM_L["Anub'arak"] = "Anub'arak" +PBM_L["Argent Tournament and associated content"] = "Torneo Argenta y contenido asociado" +PBM_L["The Argent Tournament and all related content unlock alongside Trial of the Crusader.\n \nFinal boss: |cffFFD900Anub'arak|r"] = "El Torneo Argenta y todo el contenido relacionado se desbloquean junto con la Prueba del Cruzado.\n \nJefe final: |cffFFD900Anub'arak|r" + +PBM_L["Icecrown Citadel"] = "Ciudadela de la Corona de Hielo" +PBM_L["The Lich King"] = "El Rey Exánime" +PBM_L["Final WotLK raid tier"] = "Tier final de bandas de WotLK" +PBM_L["Players can finally enter Icecrown Citadel and challenge the Lich King.\n \nFinal boss: |cffFFD900The Lich King|r"] = "Los jugadores finalmente pueden entrar en la Ciudadela de la Corona de Hielo y desafiar al Rey Exánime.\n \nJefe final: |cffFFD900El Rey Exánime|r" + +PBM_L["Ruby Sanctum"] = "Sagrario Rubí" +PBM_L["Halion"] = "Halion" +PBM_L["Bonus endgame content"] = "Contenido adicional de endgame" +PBM_L["Ruby Sanctum is the only content unlocked in this tier, considered bonus endgame content.\n \nFinal boss: |cffFFD900Halion|r"] = "El Sagrario Rubí es el único contenido desbloqueado en este tier, considerado contenido adicional de endgame.\n \nJefe final: |cffFFD900Halion|r" + +PBM_L["** This tab requires |cffd4af37mod-individual-progression|r. Source: |cff69CCF0github.com/ZhengPeiRu21/mod-individual-progression|r"] = "** Esta pestaña requiere |cffd4af37mod-individual-progression|r. Fuente: |cff69CCF0github.com/ZhengPeiRu21/mod-individual-progression|r" +PBM_L["|cffff4444** Information is subject to change as mod-individual-progression is updated.|r"] = "|cffff4444** La información está sujeta a cambios a medida que mod-individual-progression se actualice.|r" + +-- ============================================================ +-- PBM_LevelSync.lua +-- ============================================================ +PBM_L["— empty —"] = "— vacío —" +PBM_L["Character"] = "Personaje" +PBM_L["Tier"] = "Tierra" +PBM_L["Refresh"] = "Refrescar" +PBM_L["Accounts: —"] = "Cuentas: —" +PBM_L["Characters: —"] = "Personajes: —" +PBM_L["Level Sync: —"] = "Sinc. nivel: —" +PBM_L["IP Sync: —"] = "Sinc. IP: —" +PBM_L["Commands"] = "Comandos" +PBM_L["Notes"] = "Notas" +PBM_L["Setup:"] = "Configuración:" +PBM_L["HOW TO USE LEVELSYNC"] = "CÓMO USAR LEVELSYNC" +PBM_L["1. Set a |cffFF8C00security key|r for your account:"] = "1. Establece una |cffFF8C00clave de seguridad|r para tu cuenta:" +PBM_L[" |cffd4af37.levelsync setkey |r"] = " |cffd4af37.levelsync setkey |r" +PBM_L[" You need this key to add your accounts to the sync group."] = " Necesitas esta clave para añadir tus cuentas al grupo de sincronización." +PBM_L[" |cffff4444Keep it private \226\128\148 it's the \"password\" for linking.|r"] = " |cffff4444Manténla en privado \226\128\148 es la \"contraseña\" para vincular.|r" +PBM_L["2. Link other accounts or characters into your |cff66ccffsync|r group:"] = "2. Vincula otras cuentas o personajes a tu grupo de |cff66ccffsincronización|r:" +PBM_L[" |cffd4af37.levelsync addaccount |r"] = " |cffd4af37.levelsync addaccount |r" +PBM_L[" |cffd4af37.levelsync addchar |r"] = " |cffd4af37.levelsync addchar |r" +PBM_L[" The key is |cffff4444NOT|r required if you're adding your own account."] = " La clave |cffff4444NO|r es necesaria si añades tu propia cuenta." +PBM_L["3. |cff66ccffLevel Sync|r and |cff66ccffIP Sync|r are |cffFF8C00toggle only|r. To toggle:"] = "3. |cff66ccffSinc. nivel|r y |cff66ccffSinc. IP|r son |cffFF8C00solo conmutables|r. Para alternar:" +PBM_L[" |cffd4af37.levelsync level on|r"] = " |cffd4af37.levelsync level on|r" +PBM_L[" |cffd4af37.levelsync IP on|r"] = " |cffd4af37.levelsync IP on|r" +PBM_L[" |cff44dd44Available|r indicates syncs are available."] = " |cff44dd44Available|r indica que las sincronizaciones están disponibles." +PBM_L[" |cffdd4444Disabled|r indicates syncs are disabled."] = " |cffdd4444Disabled|r indica que las sincronizaciones están desactivadas." +PBM_L[" A |cffFF8C0010 second cooldown|r is applied after each sync."] = " Se aplica un |cffFF8C00tiempo de recarga de 10 segundos|r tras cada sincronización." +PBM_L["4. Use |cff66ccffpool gold|r to drain your level sync group members'"] = "4. Usa |cff66ccffpool gold|r para vaciar los monederos de los miembros" +PBM_L[" wallets into yours:"] = " del grupo en el tuyo:" +PBM_L[" |cffd4af37.levelsync money|r"] = " |cffd4af37.levelsync money|r" +PBM_L["Set your account security key"] = "Establece tu clave de seguridad de la cuenta" +PBM_L["Link all characters from another account"] = "Vincula todos los personajes de otra cuenta" +PBM_L["Link a single character into your group"] = "Vincula un solo personaje a tu grupo" +PBM_L["Remove one character from your group"] = "Elimina un personaje de tu grupo" +PBM_L["Remove all characters of an account"] = "Elimina todos los personajes de una cuenta" +PBM_L["Remove an account by its account number"] = "Elimina una cuenta por su número de cuenta" +PBM_L["Pool all group money to the caller"] = "Reúne todo el dinero del grupo en el personaje actual" +PBM_L["Disband your sync group"] = "Disuelve tu grupo de sincronización" +PBM_L["Disband all groups tied to your account"] = "Disuelve todos los grupos vinculados a tu cuenta" +PBM_L["List all characters on an account"] = "Muestra todos los personajes de una cuenta" +PBM_L["Show full group summary and all members"] = "Muestra el resumen completo del grupo y miembros" +PBM_L["Toggle level synchronization for the group"] = "Alterna la sincronización de nivel para el grupo" +PBM_L["Toggle progression (IP tier) sync for the group"] = "Alterna la sincronización de progresión (Tier IP) para el grupo" +PBM_L["Resets all instances for target (requires server auth)"] = "Reinicia todas las estancias del objetivo (requiere permisos de servidor)" +PBM_L["|cffd4af37UPWARD ONLY|r \226\128\148 Levels, XP, and IP tier are never lowered. Sub-max members get pulled up."] = "|cffd4af37SOLO HACIA ARRIBA|r \226\128\148 Niveles, PE y Tier IP nunca bajan. Los miembros de nivel inferior son elevados." +PBM_L["|cffd4af37SESSION SYNC|r \226\128\148 Syncs must be explicitly triggered via toggle \226\128\148 they do not fire automatically."] = "|cffd4af37SINC. POR SESIÓN|r \226\128\148 Las sincronizaciones deben activarse manualmente; no se ejecutan automáticamente." +PBM_L["|cffd4af37IP TIER|r \226\128\148 Tier syncs must be triggered manually via the IP toggle."] = "|cffd4af37TIER IP|r \226\128\148 La sincronización de Tier debe activarse manualmente con la opción IP." +PBM_L["|cffd4af37COOLDOWN|r \226\128\148 10-sec shared cooldown covers level, IP, and money commands."] = "|cffd4af37RECARGA|r \226\128\148 Recarga compartida de 10 s para comandos de nivel, IP y dinero." +PBM_L["|cffd4af37SECURITY KEY|r \226\128\148 Controls who can link to your account. Keep it private."] = "|cffd4af37CLAVE DE SEGURIDAD|r \226\128\148 Controla quién se vincula a tu cuenta. Manténla en privado." +PBM_L["|cffd4af37DEATH KNIGHTS|r \226\128\148 DK's can't pull up sub-55 levels/IP. Configurable server-side."] = "|cffd4af37CABALLEROS DE LA MUERTE|r \226\128\148 Los DK no pueden subir niveles/IP por debajo del 55. Configurable en el servidor." +PBM_L["|cffd4af37MONEY POOL|r \226\128\148 Toggle money pooling on/off. Pools group gold onto the caller."] = "|cffd4af37FONDO DE DINERO|r \226\128\148 Activa/desactiva la recolección de dinero. Reúne el oro del grupo en el ejecutor." +PBM_L["|cffd4af37GROUP LIMIT|r \226\128\148 Default cap is 6 accounts per group (up to 10 server-side)."] = "|cffd4af37LÍMITE DE GRUPO|r \226\128\148 Límite por defecto de 6 cuentas por grupo (hasta 10 en el servidor)." +PBM_L["|cffd4af37UNBIND ALL|r \226\128\148 Uses the GM command to reset target instances. (Automated in the Playerbots tab)"] = "|cffd4af37DESVINCULAR TODO|r \226\128\148 Usa el comando GM para reiniciar estancias del objetivo. (Automatizado en la pestaña Playerbots)" +PBM_L["** This tab requires |cffd4af37mod-levelsync|r on your server. Latest release at |cff66ccffgithub.com/Lichborne-AC/mod-levelsync|r"] = "** Esta pestaña requiere |cffd4af37mod-levelsync|r en tu servidor. Última versión en |cff66ccffgithub.com/Lichborne-AC/mod-levelsync|r" +PBM_L["No LevelSync data to export. Click |cffd4af37Refresh|r first."] = "No hay datos de LevelSync para exportar. Haz clic en |cffd4af37Refrescar|r primero." +PBM_L["Are you sure you want to export LevelSync data?\n\nThis copies each synced character's |cffd4af37name, class, level, and IP tier|r into the PBM tracker."] = "¿Estás seguro de que quieres exportar los datos de LevelSync?\n\nEsto copiará el |cffd4af37nombre, clase, nivel y Tier IP|r de cada personaje sincronizado al rastreador de PBM." +PBM_L["Export LevelSync Data"] = "Exportar datos de LevelSync" +PBM_L["Copies name, class, level, and IP tier of every"] = "Copia el nombre, clase, nivel y Tier IP de cada" +PBM_L["synced character into the PBM tracker."] = "personaje sincronizado al rastreador de PBM." +PBM_L["Exported LevelSync: |cff44ff44%s added|r, |cffd4af37%s updated|r"] = "LevelSync exportado: |cff44ff44%s añadido(s)|r, |cffd4af37%s actualizado(s)|r" +PBM_L[", |cffff6666%s skipped (unknown class)|r"] = ", |cffff6666%s omitido(s) (clase desconocida)|r" +PBM_L["Accounts: |cffd4af37%s/%s|r"] = "Cuentas: |cffd4af37%s/%s|r" +PBM_L["Characters: |cffd4af37%s|r"] = "Personajes: |cffd4af37%s|r" +PBM_L["Level Sync: "] = "Sinc. nivel: " +PBM_L["IP Sync: "] = "Sinc. IP: " +PBM_L["Account "] = "Cuenta " + +-- ============================================================ +-- PBM_Notes.lua +-- ============================================================ +PBM_L["Column Title..."] = "Título de columna..." +PBM_L["Click here to add a note..."] = "Haz clic aquí para añadir una nota..." + +-- ============================================================ +-- PBM_TAB_Playerbots.lua +-- ============================================================ +PBM_L["Add RndBot"] = "Añadir RndBot" +PBM_L["Death Knight"] = "Caballero de la Muerte" +PBM_L["Druid"] = "Druida" +PBM_L["Hunter"] = "Cazador" +PBM_L["Mage"] = "Mago" +PBM_L["Paladin"] = "Paladín" +PBM_L["Priest"] = "Sacerdote" +PBM_L["Rogue"] = "Pícaro" +PBM_L["Shaman"] = "Chamán" +PBM_L["Warlock"] = "Brujo" +PBM_L["Warrior"] = "Guerrero" +PBM_L["Summon a random %s RndBot."] = "Invoca un RndBot %s aleatorio." +PBM_L["Bot Commands"] = "Comandos de Bot" +PBM_L["Login altbot(s)"] = "Iniciar sesión de bot(s) alternativo(s)" +PBM_L["Login entire account"] = "Iniciar sesión con la cuenta entera" +PBM_L["Learn spells, enchant, repair"] = "Aprender hechizos, encantar, reparar" +PBM_L["Auto-equip best gear"] = "Equipar automáticamente el mejor equipo" +PBM_L["Account Linking"] = "Vincular Cuentas" +PBM_L["Set account security key"] = "Establecer clave de seguridad de la cuenta" +PBM_L["Link account by key"] = "Vincular cuenta mediante clave" +PBM_L["List linked accounts"] = "Listar cuentas vinculadas" +PBM_L["Unlink account"] = "Desvincular cuenta" +PBM_L["Reset Instances"] = "Reiniciar Estancias" +PBM_L["Send |cffFF8C00.playerbots bot refresh=raid *|r\nfor your current group/raid?"] = "¿Enviar |cffFF8C00.playerbots bot refresh=raid *|r\npara tu grupo/banda actual?" +PBM_L["Yes, Reset All"] = "Sí, Reiniciar Todo" +PBM_L["Cancel"] = "Cancelar" +PBM_L["Resets instances for entire group using"] = "Reinicia estancias para todo el grupo usando" +PBM_L["Requires AiPlayerbot.ResetInstanceIdForAltBots = 1"] = "Requiere AiPlayerbot.ResetInstanceIdForAltBots = 1" +PBM_L["Reset Instances for group"] = "Reiniciar Estancias para el grupo" +PBM_L["Universal Strategies"] = "Estrategias Universales" +PBM_L["Abort the pull if extra mobs are detected near the target"] = "Cancela el puleo si se detectan enemigos extra cerca del objetivo" +PBM_L["Proactively engages nearby threats"] = "Entra en combate proactivamente con amenazas cercanas" +PBM_L["Reposition to avoid AoE damage patterns"] = "Se reposiciona para evitar patrones de daño en área (AoE)" +PBM_L["Activate offensive cooldowns (class-specific)"] = "Activa tiempos de recarga ofensivos (específico de clase)" +PBM_L["Apply class-specific party buffs to the group out of combat"] = "Aplica beneficios de grupo específicos de clase fuera de combate" +PBM_L["Skip long casts when target is about to die"] = "Omite lanzamientos largos cuando el objetivo está a punto de morir" +PBM_L["Respond to party chat commands"] = "Responde a comandos de chat de grupo" +PBM_L["Cleanse party debuffs (class-appropriate ability)"] = "Limpia perjuicios del grupo (habilidad apropiada de clase)" +PBM_L["Revert to base default rotation"] = "Vuelve a la rotación predeterminada base" +PBM_L["Generic DPS rotation (spec inferred from talents)"] = "Rotación DPS genérica (rama inferida por talentos)" +PBM_L["Bot switches to AoE rotation (area attacks)"] = "El bot cambia a rotación AoE (ataques en área)" +PBM_L["Bot attacks the group DPS focus target (coordinates kill order)"] = "El bot ataca al objetivo foco del grupo (coordina orden de matanza)" +PBM_L["Auto-accept or decline duel requests"] = "Acepta o rechaza automáticamente peticiones de duelo" +PBM_L["Play social emotes"] = "Realiza emociones sociales (emotes)" +PBM_L["Retreat when critical HP or outnumbered"] = "Se retira cuando tiene salud crítica o está superado en número" +PBM_L["Follow master"] = "Sigue al maestro" +PBM_L["Auto-eat and drink to recover health and mana between pulls"] = "Come y bebe automáticamente para recuperar salud y maná entre combates" +PBM_L["Maintain positional formation with group"] = "Mantiene la formación posicional con el grupo" +PBM_L["Harvest herbs, ore, or skinning nodes while moving"] = "Recolecta hierbas, menas o nodos de desuello al moverse" +PBM_L["Auto-attack nearby mobs, manage food/drink"] = "Ataca automáticamente a monstruos cercanos, gestiona comida/bebida" +PBM_L["Hold position as a guard"] = "Mantiene la posición como guardia" +PBM_L["Bot takes healer role (must be healer-capable class)"] = "El bot asume el rol de sanador (debe ser clase capaz de sanar)" +PBM_L["Healer bot also attacks between heals"] = "El bot sanador también ataca entre sanaciones" +PBM_L["Runs the bot away the instant it has aggro — keeps melee mobs perpetually chasing"] = "El bot huye en el instante en que gana amenaza — mantiene a los monstruos cuerpo a cuerpo persiguiéndolo" +PBM_L["Auto-loot corpses and containers"] = "Despoja automáticamente cadáveres y contenedores" +PBM_L["Use a mount when traveling"] = "Usa una montura al viajar" +PBM_L["DPS bot assists with emergency heals (Paladin only)"] = "El bot DPS ayuda con curas de emergencia (Solo Paladín)" +PBM_L["Bot does nothing (fully passive)"] = "El bot no hace nada (totalmente pasivo)" +PBM_L["Auto-use health and mana potions / healthstones"] = "Usa automáticamente pociones de salud/maná o piedras de salud" +PBM_L["Class-specific opening attack — tank-only initiation"] = "Ataque de apertura específico de clase — iniciación solo para tanques" +PBM_L["Anchor at pull spot — bot opens then returns instead of running into melee"] = "Ancla en el punto de inicio — el bot inicia y luego regresa en vez de ir al cuerpo a cuerpo" +PBM_L["Enable attacking hostile players (player-targeting toggle ONLY — rotation unchanged)"] = "Permite atacar a jugadores hostiles (SOLO selección de objetivos — rotación sin cambios)" +PBM_L["Use racial abilities — EMFH, War Stomp, Berserking, etc."] = "Usa habilidades raciales — Sálvese quien pueda, Pisotón de guerra, Rabiar, etc." +PBM_L["Suppress expensive casts when mana is low"] = "Suprime lanzamientos costosos cuando el maná está bajo" +PBM_L["Hold at current spot; return to saved stay position if drifted"] = "Se mantiene en el lugar actual; regresa a la posición guardada si se desplaza" +PBM_L["Bot attacks the tank's current target"] = "El bot ataca al objetivo actual del tanque" +PBM_L["Tank rotates to face the current target each combat tick"] = "El tanque se gira para encarar al objetivo actual en cada pulso de combate" +PBM_L["Suppress actions when threat >80% (prevents pulling aggro)"] = "Suprime acciones cuando la amenaza es >80% (evita ganar la amenaza del objetivo)" +PBM_L["** Information and strategies are subject to change as mod-playerbots is updated."] = "** La información y estrategias están sujetas a cambios según se actualice mod-playerbots." + +-- ============================================================ +-- PBM_TopTabs.lua +-- ============================================================ +PBM_L["Playerbots"] = "Playerbots" +PBM_L["Ind. Prog."] = "Ind. Prog." +PBM_L["LevelSync"] = "LevelSync" +PBM_L["Notes"] = "Notas" +PBM_L["Group"] = "Grupo" +PBM_L["Individual Progression"] = "Progresión Individual" + +-- ============================================================ +-- PBM_Warlock.lua +-- ============================================================ +PBM_L["Affliction"] = "Aflicción" +PBM_L["Demonology"] = "Demonología" +PBM_L["Destruction"] = "Destrucción" +PBM_L["Combat"] = "Combate" +PBM_L["AoE"] = "AoE" +PBM_L["Meta Melee"] = "Meta Melee" +PBM_L["Tank"] = "Tanque" +PBM_L["Curses"] = "Maldiciones" +PBM_L["Curse of Agony"] = "Maldición de agonía" +PBM_L["Curse of the Elements"] = "Maldición de los Elementos" +PBM_L["Curse of Exhaustion"] = "Maldición de agotamiento" +PBM_L["Curse of Doom"] = "Maldición de apocalipsis" +PBM_L["Curse of Weakness"] = "Maldición de debilidad" +PBM_L["Curse of Tongues"] = "Maldición de las Lenguas" +PBM_L["Stones"] = "Piedras" +PBM_L["Spellstone"] = "Piedra de hechizo" +PBM_L["Firestone"] = "Piedra de fuego" +PBM_L["CC"] = "CC" +PBM_L["Pets"] = "Mascotas" +PBM_L["Imp"] = "Imbo" +PBM_L["Voidwalker"] = "Abisario" +PBM_L["Succubus"] = "Súcubo" +PBM_L["Felhunter"] = "Manteo del Caos" +PBM_L["Felguard"] = "Guardia del Caos" +PBM_L["Soulstone"] = "Piedra de alma" +PBM_L["SS Self"] = "SS Propio" +PBM_L["SS Master"] = "SS Líder" +PBM_L["SS Tank"] = "SS Tanque" +PBM_L["SS Healer"] = "SS Sanador" +PBM_L["Assist"] = "Asistencia" +PBM_L["Tank Assist"] = "Asistir Tanque" +PBM_L["DPS Assist"] = "Asistir DPS" +PBM_L["DPS AoE"] = "DPS AoE" + +PBM_L["Affliction DoT specialization"] = "Especialización en DoTs de Aflicción" +PBM_L["Demonology burst specialization"] = "Especialización en burst de Demonología" +PBM_L["Destruction fire specialization"] = "Especialización en fuego de Destrucción" +PBM_L["Mutually exclusive with Demonology, Destruction."] = "Mutuamente excluyente con Demonología, Destrucción." +PBM_L["Mutually exclusive with Affliction, Destruction."] = "Mutuamente excluyente con Aflicción, Destrucción." +PBM_L["Mutually exclusive with Affliction, Demonology."] = "Mutuamente excluyente con Aflicción, Demonología." + +PBM_L["Warlock AoE rotation"] = "Rotación AoE de Brujo" +PBM_L["Demonology melee mode"] = "Modo melé de Demonología" +PBM_L["While |cff8787EDImmolation Aura|r is active,"] = "Mientras |cff8787EDAura de inmolación|r está activa," +PBM_L["closes to melee and uses |cff8787EDDemon Charge|r."] = "se acerca a melé y usa |cff8787EDCarga demoníaca|r." +PBM_L["No effect without |cffffcc00Metamorphosis|r active."] = "Sin efecto sin |cffffcc00Metamorfosis|r activa." +PBM_L["Warlock tank role"] = "Rol de tanque de Brujo" + +PBM_L["Shadow DoT curse"] = "Maldición de DoT de sombras" +PBM_L["Stacking shadow damage over 24 seconds."] = "Daño de sombras acumulativo durante 24 segundos." +PBM_L["Only one curse active at a time."] = "Solo una maldición activa a la vez." + +PBM_L["Spell damage amplifier"] = "Amplificador de daño con hechizos" +PBM_L["Increases Fire, Frost, Arcane, Shadow damage taken."] = "Aumenta el daño de Fuego, Escarcha, Arcano y Sombras recibido." + +PBM_L["Movement speed slow curse"] = "Maldición de reducción de velocidad de movimiento" +PBM_L["Reduces target movement speed by 30%."] = "Reduce la velocidad de movimiento del objetivo un 30%." + +PBM_L["Heavy delayed-hit curse"] = "Maldición de golpe pesado diferido" +PBM_L["Massive shadow damage after 60 seconds."] = "Daño masivo de sombras tras 60 segundos." +PBM_L["Best on long boss fights."] = "Mejor en combates largos contra jefes." + +PBM_L["Attack power reduction curse"] = "Maldición de reducción de poder de ataque" +PBM_L["Reduces target attack power by 478."] = "Reduce el poder de ataque del objetivo en 478." + +PBM_L["Spellcasting slow curse"] = "Maldición de ralentización de lanzamiento de hechizos" +PBM_L["Reduces target casting speed by 50%."] = "Reduce la velocidad de lanzamiento del objetivo un 50%." +PBM_L["Best against caster targets."] = "Mejor contra objetivos taumaturgos." + +PBM_L["Apply Spellstone"] = "Aplicar Piedra de hechizo" +PBM_L["Max |cff3A8FC4mana|r, spell |cffFF9900crit|r, dispels one magic effect."] = "Aumenta |cff3A8FC4maná|r máx, |cffFF9900crítico|r de hechizos, disipa un efecto mágico." +PBM_L["Only one stone active at a time."] = "Solo una piedra activa a la vez." + +PBM_L["Apply Firestone"] = "Aplicar Piedra de fuego" +PBM_L["Adds |cffFF4444fire damage|r procs to weapon."] = "Añade activaciones de |cffFF4444daño de fuego|r al arma." + +PBM_L["Crowd control"] = "Control de masas" +PBM_L["Fears or Banishes extra targets in combat."] = "Aplica Miedo o Desterrar a objetivos extra en combate." +PBM_L["Re-applies when the effect breaks."] = "Reaplica cuando el efecto se rompe." + +PBM_L["Summon Imp"] = "Invocación de Imp" +PBM_L["Ranged fire damage, Firebolt spam."] = "Daño de fuego a distancia, spam de Descarga de Fuego." +PBM_L["Only one pet active at a time."] = "Solo una mascota activa a la vez." + +PBM_L["Summon Voidwalker"] = "Invocación de Abisario" +PBM_L["Tanking pet — taunts and absorbs damage."] = "Mascota tanque — provoca y absorbe daño." + +PBM_L["Summon Succubus"] = "Invocación de Súcubo" +PBM_L["DPS pet — |cff8787EDLash of Pain, Seduction|r CC."] = "Mascota DPS — CC con |cff8787EDLátigo de dolor, Seducción|r." + +PBM_L["Summon Felhunter"] = "Invocación de Manteo del Caos" +PBM_L["|cff8787EDSpell Lock|r interrupts enemy casters."] = "|cff8787EDBloqueo de hechizo|r interrumpe a lanzadores enemigos." +PBM_L["|cff8787EDDevour Magic|r purges buffs, cleanses allies."] = "|cff8787EDDevorar magia|r purga beneficios y limpia aliados." + +PBM_L["Summon Felguard"] = "Invocación de Guardia del Caos" +PBM_L["Melee DPS pet, empowered by |cffffcc00Demonic Empowerment|r."] = "Mascota DPS cuerpo a cuerpo, potenciada por |cffffcc00Empoderamiento demoníaco|r." + +PBM_L["Soulstone self"] = "Piedra de alma en sí mismo" +PBM_L["Bot places |cff8787EDSoulstone|r on itself."] = "El bot se aplica |cff8787EDPiedra de alma|r a sí mismo." +PBM_L["Only one Soulstone target at a time."] = "Solo un objetivo de Piedra de alma a la vez." + +PBM_L["Soulstone the group leader"] = "Piedra de alma en el líder de grupo" +PBM_L["Bot places |cff8787EDSoulstone|r on the group leader."] = "El bot aplica |cff8787EDPiedra de alma|r al líder del grupo." + +PBM_L["Soulstone the main tank"] = "Piedra de alma en el tanque principal" +PBM_L["Bot places |cff8787EDSoulstone|r on the tank."] = "El bot aplica |cff8787EDPiedra de alma|r al tanque." + +PBM_L["Soulstone the main healer"] = "Piedra de alma en el sanador principal" +PBM_L["Bot places |cff8787EDSoulstone|r on the healer."] = "El bot aplica |cff8787EDPiedra de alma|r al sanador." + +PBM_L["Tank target focus"] = "Foco en objetivo del tanque" +PBM_L["Bot attacks the tank's current target."] = "El bot ataca al objetivo actual del tanque." + +PBM_L["DPS target focus"] = "Foco en objetivo DPS" +PBM_L["Bot attacks the group's coordinated DPS target."] = "El bot ataca al objetivo DPS coordinado del grupo." + +PBM_L["Cross-role AoE mode"] = "Modo AoE multirrol" +PBM_L["Switches to AoE rotation on multiple targets."] = "Cambia a rotación AoE con múltiples objetivos." + +-- ============================================================ +-- PBM_Warrior.lua +-- ============================================================ +PBM_L["Arms"] = "Armas" +PBM_L["Fury"] = "Furia" +PBM_L["Protection"] = "Protección" +PBM_L["AoE"] = "AoE" +PBM_L["Assist"] = "Asistencia" +PBM_L["Arms DPS"] = "DPS Armas" +PBM_L["Fury DPS"] = "DPS Furia" +PBM_L["Protection tank"] = "Tanque Protección" +PBM_L["Mutually exclusive with Fury, Protection."] = "Mutuamente excluyente con Furia, Protección." +PBM_L["Mutually exclusive with Arms, Protection."] = "Mutuamente excluyente con Armas, Protección." +PBM_L["Mutually exclusive with Arms, Fury."] = "Mutuamente excluyente con Armas, Furia." +PBM_L["DPS AoE"] = "DPS AoE" +PBM_L["Cross-role AoE mode"] = "Modo AoE multirrol" +PBM_L["Tank Assist"] = "Asistir a Tanque" +PBM_L["Tank target focus"] = "Foco en objetivo del tanque" +PBM_L["Bot attacks the tank's current target."] = "El bot ataca al objetivo actual del tanque." +PBM_L["DPS Assist"] = "Asistir a DPS" +PBM_L["DPS target focus"] = "Foco en objetivo del DPS" +PBM_L["Bot attacks the group DPS focus target."] = "El bot ataca al objetivo foco del DPS del grupo." + +-- ============================================================ +-- PBM_Windows.lua +-- ============================================================ +PBM_L["Talent Points: "] = "Puntos de talento: " +PBM_L["Talents: NAME"] = "Talentos: NAME" +PBM_L["Apply"] = "Aplicar" +PBM_L["Copy Target"] = "Copiar objetivo" +PBM_L["Blood"] = "Sangre" +PBM_L["Frost"] = "Escarcha" +PBM_L["Unholy"] = "Profano" +PBM_L["Balance"] = "Equilibrio" +PBM_L["Feral"] = "Feral" +PBM_L["Restoration"] = "Restauración" +PBM_L["Beast"] = "Bestias" +PBM_L["Marks"] = "Puntería" +PBM_L["Survival"] = "Supervivencia" +PBM_L["Arcane"] = "Arcano" +PBM_L["Fire"] = "Fuego" +PBM_L["Holy"] = "Sagrado" +PBM_L["Protection"] = "Protección" +PBM_L["Retribution"] = "Retribución" +PBM_L["Discipline"] = "Disciplina" +PBM_L["Shadow"] = "Sombra" +PBM_L["Assassination"] = "Asesinato" +PBM_L["Combat"] = "Combate" +PBM_L["Subtlety"] = "Sutileza" +PBM_L["Elemental"] = "Elemental" +PBM_L["Enhancement"] = "Mejora" +PBM_L["Affliction"] = "Aflicción" +PBM_L["Demonology"] = "Demonología" +PBM_L["Destruction"] = "Destrucción" +PBM_L["Arms"] = "Armas" +PBM_L["Fury"] = "Furia" +PBM_L["Inventory: NAME"] = "Inventario: NAME" +PBM_L["Spellbook: NAME"] = "Libro de hechizos: NAME" +PBM_L["No target selected"] = "Ningún objetivo seleccionado" +PBM_L["No action selected"] = "Ninguna acción seleccionada" +PBM_L["Cannot sell Hearthstone!"] = "¡No se puede vender la Piedra de hogar!" +PBM_L["Cannot destroy a key!"] = "¡No se puede destruir una llave!" +PBM_L["Are you sure you want to destroy %s?"] = "¿Seguro que quieres destruir %s?" +PBM_L["Glyphs for"] = "Glifos para" +PBM_L["Move Talent Window"] = "Mover ventana de talentos" +PBM_L["Move Inventory Window"] = "Mover ventana de inventario" +PBM_L["Move Spellbook Window"] = "Mover ventana de libro de hechizos" +PBM_L["Move Stats Window"] = "Mover ventana de estadísticas" +PBM_L["Sell selected item"] = "Vender objeto seleccionado" +PBM_L["Sell all grey items"] = "Vender todos los objetos grises" +PBM_L["Sell all vendor items"] = "Vender todos los objetos comerciables" +PBM_L["Equip item"] = "Equipar objeto" +PBM_L["Use item"] = "Usar objeto" +PBM_L["Trade item to you"] = "Comerciar objeto contigo" +PBM_L["Destroy item"] = "Destruir objeto" +PBM_L["Open all containers"] = "Abrir todos los contenedores" +PBM_L["Inventory"] = "Inventario" +PBM_L["Spellbook"] = "Libro de hechizos" +PBM_L["Rank"] = "Rango" +PBM_L["Title"] = "Título" +PBM_L["Waiting for glyphs…"] = "Esperando glifos…" +PBM_L["Apply Glyphs"] = "Aplicar glifos" +PBM_L["Talents"] = "Talentos" +PBM_L["Glyphs"] = "Glifos" +PBM_L["The Classes do not match."] = "Las clases no coinciden." +PBM_L["The Levels do not match."] = "Los niveles no coinciden." +PBM_L["No build found for class "] = "¡No se encontró una rama para la clase " +PBM_L["No arrow schem found for class "] = "¡No se encontró esquema de flechas para la clase " +PBM_L[" is not in your group."] = " no está en tu grupo." +PBM_L[" must be level 10+ for talents."] = " debe ser de nivel 10+ para los talentos." +PBM_L[" is too far away to inspect."] = " está demasiado lejos para ser inspeccionado." +PBM_L["Cannot inspect — PBM gear/spec scan in progress."] = "No se puede inspeccionar: escaneo de equipo/especialización de PBM en curso." +PBM_L["Cannot inspect — PBM group scan in progress."] = "No se puede inspeccionar: escaneo de grupo de PBM en curso." +PBM_L["Already waiting for "] = "Ya se está esperando a " +PBM_L[" data."] = " datos." + +-- ============================================================ +-- LBT_TrackerCore.lua +-- ============================================================ +PBM_L["Click to sort"] = "Haz clic para ordenar" +PBM_L["Spec"] = "Especialización" +PBM_L["Name"] = "Nombre" +PBM_L["iLvL"] = "iLvL" +PBM_L["GS"] = "GS" +PBM_L["Prof"] = "Prof" +PBM_L["Avg iLvL:"] = "iLvL Medio:" +PBM_L["Average item level of all tracked %ss."] = "Nivel medio de objeto de todos los %ss rastreados." +PBM_L["Current: |cffd4af37%s|r"] = "Actual: |cffd4af37%s|r" +PBM_L["No gear data yet."] = "Aún no hay datos de equipo." +PBM_L["Click to switch to this tab."] = "Haz clic para cambiar a esta pestaña." +PBM_L["Roster iLvL:"] = "iLvL Banda:" +PBM_L["Roster Avg iLvL"] = "iLvL Medio de la Plantilla" +PBM_L["Average item level across your"] = "Nivel medio de objeto de toda" +PBM_L["entire tracked roster."] = "tu plantilla rastreada." +PBM_L["Filters:"] = "Filtros:" +PBM_L["Help:"] = "Ayuda:" +PBM_L["Menu:"] = "Menú:" +PBM_L["+ Add Target"] = "+ Añadir Objetivo" +PBM_L["Adds target to tracker."] = "Añade el objetivo al rastreador." +PBM_L["No player targeted."] = "No hay ningún jugador en objetivo." +PBM_L["Unknown class: %s"] = "Clase desconocida: %s" +PBM_L["PBM:"] = "PBM:" +PBM_L["Added %s|r (%s)"] = "Añadido %s|r (%s)" +PBM_L["%s|r added to Overview tab."] = "%s|r añadido a la pestaña General." +PBM_L["%s|r already in tracker. Level updated."] = "%s|r ya está en el rastreador. Nivel actualizado." +PBM_L["+ Add Group"] = "+ Añadir Grupo" +PBM_L["Adds group to tracker."] = "Añade el grupo al rastreador." +PBM_L["Not in a group, or no other members found."] = "No estás en un grupo o no se encontraron otros miembros." +PBM_L["Levels updated."] = "Niveles actualizados." +PBM_L["Added %d new, skipped %d duplicates.%s"] = "Añadidos %d nuevos, omitidos %d duplicados.%s" +PBM_L["Group scan complete. Added: %d, Skipped: %d%s"] = "Escaneo de grupo completado. Añadidos: %d, Omitidos: %d%s" +PBM_L[". Levels updated."] = ". Niveles actualizados." +PBM_L["+ Add Target Gear"] = "+ Añadir Equipo Objetivo" +PBM_L["Adds target's gear."] = "Añade el equipo del objetivo." +PBM_L["Unknown class for %s"] = "Clase desconocida para %s" +PBM_L["Added %s|r to tracker."] = "Añadido %s|r al rastreador." +PBM_L["Updating Gear for %s|r..."] = "Actualizando equipo para %s|r..." +PBM_L["GS scan timed out."] = "Tiempo de espera agotado para el escaneo de GS." +PBM_L["Target GS scan timed out."] = "Tiempo de espera agotado para el escaneo de GS del objetivo." +PBM_L["+ Add Target Spec"] = "+ Añadir Espec. Objetivo" +PBM_L["Adds targets spec."] = "Añade la especialización del objetivo." +PBM_L["Adding Specialization for %s|r..."] = "Añadiendo especialización para %s|r..." +PBM_L["Specialization scan timed out."] = "Tiempo de espera agotado para el escaneo de especialización." +PBM_L["Target Specialization scan timed out."] = "Tiempo de espera agotado para el escaneo de especialización del objetivo." +PBM_L["+ Add Group Gear"] = "+ Añadir Equipo Grupo" +PBM_L["Adds members gear."] = "Añade el equipo de los miembros." +PBM_L["Not in a group."] = "No estás en un grupo." +PBM_L["Adding group members first..."] = "Añadiendo miembros del grupo primero..." +PBM_L["No group members found."] = "No se encontraron miembros del grupo." +PBM_L["Added %d new, skipped %d duplicates%s\nInspecting %d players (~%ds)..."] = "Añadidos %d nuevos, omitidos %d duplicados%s\nInspeccionando a %d jugadores (~%ds)..." +PBM_L["Group synced (+%d, skipped %d%s).\nStarting GS scan for %d players."] = "Grupo sincronizado (+%d, omitidos %d%s).\nIniciando escaneo de GS para %d jugadores." +PBM_L["Group GS update complete!"] = "¡Actualización de GS del grupo completada!" +PBM_L["Group GS update complete."] = "Actualización de GS del grupo completada." +PBM_L["Skipping %s (not tracked)"] = "Omitiendo %s (no rastreado)" +PBM_L["Updating Gear for |cffffff88%s|r... (%d/%d)"] = "Actualizando equipo para |cffffff88%s|r... (%d/%d)" +PBM_L["+ Add Group Spec"] = "+ Añadir Espec. Grupo" +PBM_L["Adds members spec."] = "Añade la especialización de los miembros." +PBM_L["Reading Specialization for %d players (~%ds)..."] = "Leyendo especialización de %d jugadores (~%ds)..." +PBM_L["Group synced (+%d, skipped %d%s).\nStarting Specialization scan for %d players."] = "Grupo sincronizado (+%d, omitidos %d%s).\nIniciando escaneo de especialización para %d jugadores." +PBM_L["Group Specialization update complete!"] = "¡Actualización de especialización del grupo completada!" +PBM_L["Group Specialization update complete."] = "Actualización de especialización del grupo completada." +PBM_L["Reading Specialization |cffffff88%s|r... (%d/%d)"] = "Leyendo especialización |cffffff88%s|r... (%d/%d)" +PBM_L["|cffd4af37Stop Scan|r"] = "|cffd4af37Detener escaneo|r" +PBM_L["Stop Scan"] = "Detener escaneo" +PBM_L["Cancels the running Gear or Spec scan."] = "Cancela el escaneo de equipo o especialización en curso." +PBM_L["|cffff4444Scan stopped.|r"] = "|cffff4444Escaneo detenido.|r" +PBM_L["|cffC69B3APBM:|r |cffff4444Scan stopped.|r"] = "|cffC69B3APBM:|r |cffff4444Escaneo detenido.|r" +PBM_L["|cffC69B3AAvg GS:|r"] = "|cffC69B3AGS medio:|r" +PBM_L["Average gear score of all tracked %ss."] = "Puntuación de equipo media de todos los %s rastreados." +PBM_L["Current: |cffd4af37%d|r"] = "Actual: |cffd4af37%d|r" +PBM_L["No gear data yet."] = "Sin datos de equipo aún." +PBM_L["Click to switch to this tab."] = "Haz clic para cambiar a esta pestaña." +PBM_L["|cffC69B3ARoster GS:|r |cff555555--|r"] = "|cffC69B3AGS plantilla:|r |cff555555--|r" +PBM_L["Roster Avg GS"] = "GS medio de la plantilla" +PBM_L["Average gear score across your"] = "Puntuación de equipo media de" +PBM_L["entire tracked roster."] = "toda tu plantilla rastreada." +PBM_L["|cffd4af37+ Full Group Scan|r"] = "|cffd4af37+ Escaneo de grupo|r" +PBM_L["Full Group Scan"] = "Escaneo completo de grupo" +PBM_L["Long scan is used for first time setup"] = "El escaneo largo se usa en la configuración inicial" +PBM_L["or reconfiguration of raid. Performs"] = "o reconfiguración de banda. Realiza" +PBM_L["gear and spec scan. Allow 6s per"] = "escaneo de equipo y rama. Calcula 6s por" +PBM_L["character."] = "personaje." +PBM_L["|cffff4444Not in a group.|r"] = "|cffff4444No estás en un grupo.|r" +PBM_L["Adding group members..."] = "Añadiendo miembros del grupo..." +PBM_L["|cffff4444No group members found.|r"] = "|cffff4444No se encontraron miembros del grupo.|r" +PBM_L[". Levels updated."] = ". Niveles actualizados." +PBM_L["|cffff9900Added %d new, skipped %d duplicates%s\nFull scan: %d players (~%ds)...|r"] = "|cffff9900Añadidos %d nuevos, omitidos %d duplicados%s\nEscaneo completo: %d jugadores (~%ds)...|r" +PBM_L["|cffC69B3APBM:|r Full Group Scan started (+%d, skipped %d%s).\nGS phase: %d players."] = "|cffC69B3APBM:|r Escaneo completo de grupo iniciado (+%d, omitidos %d%s).\nFase GS: %d jugadores." +PBM_L["|cffff9900GS done. Starting Specialization scan (%d players)...|r"] = "|cffff9900GS finalizado. Iniciando escaneo de especialización (%d jugadores)...|r" +PBM_L["|cffC69B3APBM:|r GS phase complete. Starting Specialization phase."] = "|cffC69B3APBM:|r Fase de GS completada. Iniciando fase de especialización." +PBM_L["|cff44ff44Full Group Scan complete!|r"] = "|cff44ff44¡Escaneo completo de grupo finalizado!|r" +PBM_L["|cffC69B3APBM:|r |cff44ff44Full Group Scan complete.|r"] = "|cffC69B3APBM:|r |cff44ff44Escaneo completo de grupo finalizado.|r" +PBM_L["|cff44ff44Full Group Scan complete!|r |cffd4af37Fetching strategies: %d members...|r"] = "|cff44ff44¡Escaneo completo de grupo finalizado!|r |cffd4af37Obteniendo estrategias: %d miembros...|r" +PBM_L["|cffC69B3APBM:|r Skipping %s (not tracked)"] = "|cffC69B3APBM:|r Omitiendo %s (no rastreado)" +PBM_L["Specialization scan |cffffff88%s|r... (%d/%d)"] = "Escaneo de especialización |cffffff88%s|r... (%d/%d)" +PBM_L["Updating Gear for |cffffff88%s|r... (%d/%d)"] = "Actualizando equipo de |cffffff88%s|r... (%d/%d)" +PBM_L["|cffd4af37Log in All Bots|r"] = "|cffd4af37Conectar todos los bots|r" +PBM_L["Log in All Bots"] = "Conectar todos los bots" +PBM_L[".playerbots bot add *"] = ".playerbots bot add *" +PBM_L["|cffd4af37Log Out All Bots|r"] = "|cffd4af37Desconectar todos los bots|r" +PBM_L["Log Out All Bots"] = "Desconectar todos los bots" +PBM_L[".playerbots bot remove *"] = ".playerbots bot remove *" +PBM_L["|cffd4af37Remove Orphaned Bots|r"] = "|cffd4af37Eliminar bots huérfanos|r" +PBM_L["Remove Orphaned Bots"] = "Eliminar bots huérfanos" +PBM_L["Logs out all bots in your Overview tab"] = "Desconecta todos los bots de tu pestaña General" +PBM_L["that are not currently in your"] = "que no estén actualmente en tu" +PBM_L["group or raid."] = "grupo o banda." +PBM_L["|cffC69B3APBM:|r No orphaned bots found."] = "|cffC69B3APBM:|r No se encontraron bots huérfanos." +PBM_L["|cffff4444No orphaned bots found.|r"] = "|cffff4444No se encontraron bots huérfanos.|r" +PBM_L["|cffC69B3APBM:|r Logging out %d orphaned bots..."] = "|cffC69B3APBM:|r Desconectando %d bots huérfanos..." +PBM_L["|cffff9900Logging out %d orphaned bots..."] = "|cffff9900Desconectando %d bots huérfanos..." +PBM_L["|cffC69B3APBM:|r |cff44ff44All %d orphaned bots logged out.|r"] = "|cffC69B3APBM:|r |cff44ff44Todos los %d bots huérfanos se han desconectado.|r" +PBM_L["|cff44ff44Orphaned bots logged out (%d).|r"] = "|cff44ff44Bots huérfanos desconectados (%d).|r" +PBM_L["|cffd4af37+ Add IP Tiers|r"] = "|cffd4af37+ Añadir niveles IP|r" +PBM_L["+ Add IP Tiers"] = "+ Añadir niveles IP" +PBM_L["Adds Individual Progression Tiers."] = "Añade niveles de Progresión Individual." +PBM_L["To display tiers, enable |cffd4af37Show IP Tiers|r in the filter bar."] = "Para mostrar niveles, activa |cffd4af37Mostrar niveles IP|r en la barra de filtros." +PBM_L["Tier is shown in the number column next to each character."] = "El nivel se muestra en la columna de número junto a cada personaje." +PBM_L["Requires |cffFF8C00mod-Individual-Progression|r"] = "Requiere |cffFF8C00mod-Individual-Progression|r" +PBM_L["Adding group members first..."] = "Añadiendo primero miembros del grupo..." +PBM_L["|cffff4444Could not determine any targets.|r"] = "|cffff4444No se pudo determinar ningún objetivo.|r" +PBM_L["|cffd4af37Added %d new, skipped %d. Querying IP tiers...|r"] = "|cffd4af37Añadidos %d nuevos, omitidos %d. Consultando niveles IP...|r" +PBM_L["|cff44ff44IP Tier query complete (%d members).|r"] = "|cff44ff44Consulta de nivel IP completada (%d miembros).|r" +PBM_L["|cffd4af37Querying IP: |r%s (%d/%d)"] = "|cffd4af37Consultando IP: |r%s (%d/%d)" +PBM_L["|cffd4af37Disband Group|r"] = "|cffd4af37Disolver grupo|r" +PBM_L["Disband Group"] = "Disolver grupo" +PBM_L["Removes all bots and leaves the group."] = "Elimina todos los bots y abandona el grupo." +PBM_L["Disband Group?\n\nRemoves all bots and leaves the group.\n|cffff4444This cannot be undone.|r"] = "¿Disolver grupo?\n\nElimina todos los bots y abandona el grupo.\n|cffff4444Esto no se puede deshacer.|r" +PBM_L["Yes, Disband"] = "Sí, disolver" +PBM_L["Cancel"] = "Cancelar" +PBM_L["|cffC69B3APBM:|r |cffd4af37Disbanding group...|r"] = "|cffC69B3APBM:|r |cffd4af37Disolviendo grupo...|r" +PBM_L["|cffC69B3APBM:|r |cffd4af37Group disbanded.|r"] = "|cffC69B3APBM:|r |cffd4af37Grupo disuelto.|r" +PBM_L["|cffd4af37+ Add Target Strategies|r"] = "|cffd4af37+ Estrategias de objetivo|r" +PBM_L["+ Add Target Strategies"] = "+ Añadir estrategias de objetivo" +PBM_L["Adds target to tracker, then uses"] = "Añade el objetivo al rastreador y usa" +PBM_L["co / nc to acquire strategies."] = "co / nc para obtener estrategias." +PBM_L["|cffd4af37Resyncing strategies: %s...|r"] = "|cffd4af37Resincronizando estrategias: %s...|r" +PBM_L["|cffd4af37+ Add Group Strategies|r"] = "|cffd4af37+ Estrategias de grupo|r" +PBM_L["+ Add Group Strategies"] = "+ Añadir estrategias de grupo" +PBM_L["Adds group to tracker, then uses"] = "Añade el grupo al rastreador y usa" +PBM_L["|cffd4af37Added %d, resyncing strategies: %d members...|r"] = "|cffd4af37Añadidos %d, resincronizando estrategias: %d miembros...|r" +PBM_L["Output Log"] = "Registro de salida" +PBM_L["Scroll up/down with the mouse wheel."] = "Desplaza hacia arriba/abajo con la rueda del ratón." +PBM_L["Debug Mode"] = "Modo depuración" +PBM_L["Currently: |cff44ff44ON|r"] = "Actualmente: |cff44ff44ACTIVADO|r" +PBM_L["Currently: |cffff4444OFF|r"] = "Actualmente: |cffff4444DESACTIVADO|r" +PBM_L["|cff44ff44[PBM.DBG] Debug mode ON — inspect logging active.|r"] = "|cff44ff44[PBM.DBG] Modo depuración ACTIVADO — registro de inspección activo.|r" +PBM_L["|cffaaaaaa[PBM.DBG] Debug mode OFF.|r"] = "|cffaaaaaa[PBM.DBG] Modo depuración DESACTIVADO.|r" +PBM_L["Output Box Size"] = "Tamaño de caja de salida" +PBM_L["Click to collapse the output box."] = "Haz clic para contraer la caja de salida." +PBM_L["Click to expand the output box upward."] = "Haz clic para expandir la caja de salida hacia arriba." +-- ============================================================ +-- PBM_CharSheet.lua (Fragment 3) +-- ============================================================ +PBM_L["Export Tracker Data"] = "Exportar datos del rastreador" +PBM_L["Saves all tracker data to a text string."] = "Guarda todos los datos del rastreador en una cadena de texto." +PBM_L["Warning: Opening this window may"] = "Advertencia: Abrir esta ventana puede" +PBM_L["take several minutes."] = "tardar varios minutos." +PBM_L["Exports characters, raid rosters, and role data."] = "Exporta personajes, listas de banda y datos de función." +PBM_L["Gear data is excluded — a fresh scan is needed."] = "Se excluye el equipo — se requiere un nuevo escaneo." +PBM_L["On Account A:"] = "En la Cuenta A:" +PBM_L["1. Click >> to open the export window."] = "1. Haz clic en >> para abrir la ventana de exportación." +PBM_L["2. Click 'Select All' to highlight the text."] = "2. Haz clic en 'Seleccionar todo' para resaltar el texto." +PBM_L["3. Press Ctrl+C to copy."] = "3. Presiona Ctrl+C para copiar." +PBM_L["On Account B:"] = "En la Cuenta B:" +PBM_L["4. Log in and open Lichborne."] = "4. Inicia sesión y abre Lichborne." +PBM_L["5. Click << to open the import window."] = "5. Haz clic en << para abrir la ventana de importación." +PBM_L["6. Click Select, press Ctrl+V to paste."] = "6. Haz clic en Seleccionar, presiona Ctrl+V para pegar." +PBM_L["7. Click Import to apply the data."] = "7. Haz clic en Importar para aplicar los datos." +PBM_L["Import Tracker Data"] = "Importar datos del rastreador" +PBM_L["Loads tracker data from a copied export string."] = "Carga datos del rastreador desde una cadena exportada." +PBM_L["5. Click << to open this import window."] = "5. Haz clic en << para abrir esta ventana de importación." +PBM_L["Select All"] = "Seleccionar todo" +PBM_L["Push Select All then Ctrl+C to copy"] = "Pulsa Seleccionar todo y luego Ctrl+C para copiar" +PBM_L["Close"] = "Cerrar" +PBM_L["Export ready — click Select All, then press Ctrl+C."] = "Exportación lista — haz clic en Seleccionar todo y presiona Ctrl+C." +PBM_L["WARNING: Paste may take several minutes — do not close WoW!"] = "ADVERTENCIA: Pegar puede tardar varios minutos — ¡no cierres WoW!" +PBM_L["Select"] = "Seleccionar" +PBM_L["Click Select, press Ctrl+V to paste, then click Import."] = "Haz clic en Seleccionar, presiona Ctrl+V para pegar, luego clic en Importar." +PBM_L["Import"] = "Importar" +PBM_L["Yes, Replace Data"] = "Sí, reemplazar datos" +PBM_L["No, Go Back"] = "No, volver atrás" +PBM_L["Replace ALL tracker data? This cannot be undone."] = "¿Reemplazar TODOS los datos del rastreador? Esto no se puede deshacer." +PBM_L["Import complete — tracker data loaded."] = "Importación completada — datos cargados." +PBM_L["Error: "] = "Error: " +PBM_L["unknown"] = "desconocido" +PBM_L["SETTING UP YOUR TRACKER"] = "CONFIGURACIÓN DEL RASTREADOR" +PBM_L["For First Time Use"] = "Para el primer uso" +PBM_L["1. Add your PlayerBots to the group."] = "1. Añade tus PlayerBots al grupo." +PBM_L["2. Click |cff4488FF+Full Group Scan|r to |cffC69B3Aadd bots,|r gear score"] = "2. Haz clic en |cff4488FF+Escaneo completo|r para |cffC69B3Aañadir bots,|r índice de equipo" +PBM_L[" |cffC69B3A(GS)|r, |cffC69B3AiLvL|r, |cffC69B3Agear,|r |cffC69B3Aspecialization,|r and"] = " |cffC69B3A(GS)|r, |cffC69B3AiLvL|r, |cffC69B3Aequipo,|r |cffC69B3Aespecialización|r y" +PBM_L[" |cffC69B3APlayerbot Strategies|r to the tracker."] = " |cffC69B3AEstrategias de Playerbot|r al rastreador." +PBM_L[" Allow 4-5 minutes for a complete scan."] = " Permite de 4 a 5 minutos para un escaneo completo." +PBM_L["TIP: Use |cffC69B3A.playerbot bot addaccount |r to"] = "CONSEJO: Usa |cffC69B3A.playerbot bot addaccount |r para" +PBM_L[" quickly add bots for first time set up."] = " añadir bots rápidamente en la primera configuración." +PBM_L["TIP: |cffC69B3A+Add Target|r buttons are used for |cffC69B3ASingle|r scans."] = "CONSEJO: Los botones |cffC69B3A+Añadir objetivo|r son para escaneos |cffC69B3AIndividuales|r." +PBM_L["TIP: |cffC69B3A+Add Group|r buttons are used for |cffC69B3AGroup|r scans."] = "CONSEJO: Los botones |cffC69B3A+Añadir grupo|r son para escaneos de |cffC69B3AGrupo|r." +PBM_L["TIP: |cffC69B3ARemove Orphaned Bots|r removes bots currently not"] = "CONSEJO: |cffC69B3AEliminar bots huérfanos|r elimina bots que no están" +PBM_L[" in your group. (.playerbot bot remove)"] = " en tu grupo actualmente. (.playerbot bot remove)" +PBM_L["TIP: |cffC69B3ADisband Group|r removes PlayerBots before"] = "CONSEJO: |cffC69B3ADisolver grupo|r elimina los PlayerBots antes" +PBM_L[" disbanding the group."] = " de disolver el grupo." +PBM_L["TIP: |cffC69B3AStop Scan|r stops the current scan."] = "CONSEJO: |cffC69B3ADetener escaneo|r detiene el escaneo actual." +PBM_L["Note:"] = "Nota:" +PBM_L["All |cffC69B3AScans|r add characters to the tracker before"] = "Todos los |cffC69B3AEscaneos|r añaden personajes al rastreador antes" +PBM_L[" executing, to prevent corruption."] = " de ejecutarse, para evitar corrupción." +PBM_L["RAID TAB"] = "PESTAÑA DE BANDA" +PBM_L["Allows you to plan raid configurations,"] = "Te permite planificar configuraciones de banda," +PBM_L["invite groups, and select roles for your"] = "invitar grupos y seleccionar funciones para tu" +PBM_L["PlayerBot team."] = "equipo de PlayerBots." +PBM_L["For Groups:"] = "Para grupos:" +PBM_L["1. Select the |cff4488ffTO 5-Man Dungeons|r tab."] = "1. Selecciona la pestaña |cff4488ffA mazmorras de 5|r." +PBM_L["2. Add characters via the Class or Overview tabs."] = "2. Añade personajes mediante las pestañas de Clase o Resumen." +PBM_L["3. Click |cff4488ffINVITE GROUP|r at the bottom of"] = "3. Haz clic en |cff4488ffINVITAR AL GRUPO|r en la parte inferior" +PBM_L[" the tracker to log in your PlayerBots."] = " del rastreador para conectar a tus PlayerBots." +PBM_L["For Raids:"] = "Para bandas:" +PBM_L["1. Pick a Tier and Raid from the dropdowns"] = "1. Elige un Tier y Banda en los menús desplegables" +PBM_L[" in the raid table header."] = " de la cabecera de la tabla de banda." +PBM_L["3. Click |cffFF6600INVITE RAID|r at the bottom of"] = "3. Haz clic en |cffFF6600INVITAR A BANDA|r en la parte inferior" +PBM_L["TIP: |cffC69B3AInvite Group|r always invites your 5-Man team,"] = "CONSEJO: |cffC69B3AInvitar al grupo|r siempre invita a tu equipo de 5," +PBM_L[" regardless of which raid tab is active."] = " independientemente de qué pestaña de banda esté activa." +PBM_L["TIP: |cffC69B3AInvite Raid|r always invites from the"] = "CONSEJO: |cffC69B3AInvitar a banda|r siempre invita desde la" +PBM_L[" currently selected raid."] = " banda seleccionada actualmente." +PBM_L["TIP: You can have multiple raid configurations"] = "CONSEJO: Puedes tener múltiples configuraciones de banda" +PBM_L[" for each raid. Use the dropdown menu located"] = " para cada banda. Usa el menú desplegable ubicado" +PBM_L[" in the header (|cffC69B3AA, B, C|r)."] = " en la cabecera (|cffC69B3AA, B, C|r)." +PBM_L["TIP: Use |cffC69B3ACopy|r to duplicate your selected config"] = "CONSEJO: Usa |cffC69B3ACopiar|r para duplicar la configuración seleccionada" +PBM_L[" into another raid category (see header)."] = " en otra categoría de banda (ver cabecera)." +PBM_L["TIP: Use |cffC69B3AClear|r (next to Copy) to reset your"] = "CONSEJO: Usa |cffC69B3ALimpiar|r (junto a Copiar) para reiniciar tu" +PBM_L[" current selected raid."] = " banda seleccionada actual." +PBM_L["TIP: Raid configurations are saved after reloads."] = "CONSEJO: Las configuraciones de banda se guardan tras recargar." +PBM_L[" You must manually clear them."] = " Debes limpiarlas manualmente." +PBM_L["TIP: Assign |cffC69B3ARoles|r (Tank, Healer, DPS)"] = "CONSEJO: Asigna |cffC69B3AFunciones|r (Tanque, Sanador, DPS)" +PBM_L[" by clicking the Roles Column. Write"] = " haciendo clic en la columna Funciones. Escribe" +PBM_L[" notes to help keep organized."] = " notas para mantener la organización." +PBM_L["All Raids have a unique table that work"] = "Todas las bandas tienen una tabla única que funciona" +PBM_L[" |cffC69B3Aindependently|r of each other."] = " de forma |cffC69B3Aindependiente|r unas de otras." +PBM_L["CLASS TABS"] = "PESTAÑAS DE CLASE" +PBM_L["Each class has its own dedicated tab."] = "Cada clase tiene su propia pestaña dedicada." +PBM_L["1. Scan to add gear score (|cffC69B3AGS|r), |cffC69B3AiLvL|r and gear."] = "1. Escanea para añadir índice de equipo (|cffC69B3AGS|r), |cffC69B3AiLvL|r y equipo." +PBM_L["2. Hover on a gear slot to view the equipped item."] = "2. Pasa el cursor sobre la casilla de equipo para ver el objeto equipado." +PBM_L["3. The |cffC69B3AiLvL|r and |cffC69B3AGS|r is calculated after a scan"] = "3. El |cffC69B3AiLvL|r y el |cffC69B3AGS|r se calculan tras un escaneo" +PBM_L[" (not manual edits)"] = " (no con ediciones manuales)" +PBM_L["4. After a gear upgrade, it is suggested to use"] = "4. Tras mejorar equipo, se sugiere usar" +PBM_L[" |cff4488FF+Add Target Gear|r to update the row. OR"] = " |cff4488FF+Añadir equipo de objetivo|r para actualizar la fila. O" +PBM_L[" |cff4488FF+Add Group Gear|r at the end of the raid."] = " |cff4488FF+Añadir equipo de grupo|r al final de la banda." +PBM_L[" Gear only updates after a scan, not on equip."] = " El equipo solo se actualiza tras un escaneo, no al equiparlo." +PBM_L["TIP: Click any column header to |cffC69B3ASort|r."] = "CONSEJO: Haz clic en la cabecera de columna para |cffC69B3AOrdenar|r." +PBM_L["TIP: Use the |cffC69B3AProf|r cell to track a character's"] = "CONSEJO: Usa la celda |cffC69B3AProf|r para rastrear la profesión," +PBM_L[" profession, gear needs, or role."] = " necesidades de equipo o función de un personaje." +PBM_L["TIP: You can change the spec by clicking the icon."] = "CONSEJO: Puedes cambiar la especialización haciendo clic en el icono." +PBM_L["TIP: Click |cff00cc00[+]|r on a PlayerBot row to add to the"] = "CONSEJO: Haz clic en |cff00cc00[+]|r en una fila de PlayerBot para añadir a la" +PBM_L[" |cffC69B3ARaid Tab|r. Right-click |cffFF6600[+]|r to remove."] = " |cffC69B3APestaña de banda|r. Clic derecho en |cffFF6600[+]|r para quitar." +PBM_L["TIP: Click |cff00cc00[>]|r to invite PlayerBot to your"] = "CONSEJO: Haz clic en |cff00cc00[>]|r para invitar al PlayerBot a tu" +PBM_L[" |cffC69B3AGroup|r. Right-click |cff00cc00[>]|r to remove."] = " |cffC69B3AGrupo|r. Clic derecho en |cff00cc00[>]|r para expulsar." +PBM_L["TIP: Use |cff66CCFFDelete Character|r |cffff3333[x]|r to remove"] = "CONSEJO: Usa |cff66CCFFEliminar personaje|r |cffff3333[x]|r para quitar" +PBM_L[" PlayerBots from your tracker."] = " PlayerBots de tu rastreador." +PBM_L["Some |cff00cc00|r gear may"] = "Algún equipo con |cff00cc00|r puede" +PBM_L[" not display correctly."] = " no mostrarse correctamente." +PBM_L["Some items may display with a 0 Gear Score."] = "Algunos objetos pueden mostrarse con un GS de 0." +PBM_L[" Such as PvP gear."] = " Como por ejemplo el equipo JcJ." +PBM_L["SETTING UP PLAYERBOTS"] = "CONFIGURACIÓN DE PLAYERBOTS" +PBM_L["Linking Accounts"] = "Vincular cuentas" +PBM_L["Linking sets you as the |cffFF8C00owner|r of bots on other accounts."] = "Vincularte te establece como el |cffFF8C00propietario|r de los bots de otras cuentas." +PBM_L["Requires:"] = "Requiere:" +PBM_L["Altbots"] = "Altbots" +PBM_L["Characters you create on your account (or a linked"] = "Personajes que creas en tu cuenta (o cuenta vinculada)" +PBM_L["account) that you log in as bots. You control them,"] = "que conectas como bots. Los controlas," +PBM_L["party with them, and they persist."] = "formas grupo con ellos y persisten." +PBM_L["They follow their own IP progression tier."] = "Siguen su propio tier de progresión IP." +PBM_L["Rndbots"] = "Rndbots" +PBM_L["Server-generated bots that populate the world"] = "Bots generados por el servidor que pueblan el mundo" +PBM_L["automatically. No manual setup needed."] = "automáticamente. No requieren configuración manual." +PBM_L["They follow the group leader's IP tier."] = "Siguen el tier IP del líder del grupo." +PBM_L["GitHub:"] = "GitHub:" +PBM_L["OVERVIEW TAB"] = "PESTAÑA DE RESUMEN" +PBM_L["Provides an overview of all current PlayerBots"] = "Proporciona un resumen de todos los PlayerBots actuales" +PBM_L["you have in your tracker."] = "que tienes en tu rastreador." +PBM_L[" selected raid. (in |cffC69B3ARaid Tab|r)"] = " banda seleccionada. (en la |cffC69B3APestaña de banda|r)" +PBM_L[" Right-click |cffFF6600[+]|r to remove from raid."] = " Clic derecho en |cffFF6600[+]|r para quitar de la banda." +PBM_L["2. Click |cff00cc00[>]|r to invite a PlayerBot to your |cffC69B3AGroup|r."] = "2. Haz clic en |cff00cc00[>]|r para invitar un PlayerBot a tu |cffC69B3AGrupo|r." +PBM_L[" Right-click to remove from your |cffC69B3AGroup|r."] = " Clic derecho para expulsar de tu |cffC69B3AGrupo|r." +PBM_L["3. If you have more than 60 characters, use the"] = "3. Si tienes más de 60 personajes, usa el menú" +PBM_L[" |cffC69B3APage|r dropdown in the header to view overflow."] = " desplegable de |cffC69B3APágina|r en la cabecera para ver el resto." +PBM_L["TIP: Use Delete Character |cffff3333[x]|r to remove"] = "CONSEJO: Usa Eliminar personaje |cffff3333[x]|r para quitar" +PBM_L["CLASS STRATEGIES"] = "ESTRATEGIAS DE CLASE" +PBM_L["Strategies control what your PlayerBots do in combat."] = "Las estrategias controlan qué hacen tus PlayerBots en combate." +PBM_L["Each bot can have its own unique strategy loadout."] = "Cada bot puede tener su propia configuración de estrategias." +PBM_L["HOW TO OPEN THE STRATEGIES MENU"] = "CÓMO ABRIR EL MENÚ DE ESTRATEGIAS" +PBM_L["1. Go to any |cffC69B3AClass Tab|r (Warrior, Priest, etc.)"] = "1. Ve a cualquier |cffC69B3APestaña de clase|r (Guerrero, Sacerdote, etc.)" +PBM_L["2. Click on a |cffC69B3Acharacter's name|r in the table."] = "2. Haz clic en el |cffC69B3Anombre de un personaje|r en la tabla." +PBM_L["3. This opens that bot's |cffC69B3AStrategies Menu|r."] = "3. Esto abre el |cffC69B3AMenú de estrategias|r de ese bot." +PBM_L["4. Toggle individual strategies on/off from there."] = "4. Activa o desactiva estrategias individuales desde allí." +PBM_L["HOW STRATEGIES WORK"] = "CÓMO FUNCIONAN LAS ESTRATEGIAS" +PBM_L["Strategies are behavior modifiers — they tell the bot"] = "Las estrategias son modificadores de conducta — le dicen al bot" +PBM_L["which spells to cast, when to use cooldowns, how to"] = "qué hechizos lanzar, cuándo usar facultades, cómo" +PBM_L["position, and what role to fill during combat."] = "posicionarse y qué función desempeñar durante el combate." +PBM_L["Strategies stack — multiple can be active at once."] = "Las estrategias se acumulan — varias pueden estar activas a la vez." +PBM_L["USING TEMPLATES |cffC69B3A(Recommended)|r"] = "USO DE PLANTILLAS |cffC69B3A(Recomendado)|r" +PBM_L["Instead of toggling strategies one by one, use"] = "En lugar de activar estrategias una a una, usa" +PBM_L["|cffC69B3ATemplates|r — pre-built strategy sets optimized"] = "|cffC69B3APlantillas|r — conjuntos predeterminados optimizados" +PBM_L["for each spec and role."] = "para cada especialización y función." +PBM_L["Templates are found in each |cffC69B3AClass Tab|r — click |cffC69B3A?|r"] = "Las plantillas están en cada |cffC69B3APestaña de clase|r — clic en |cffC69B3A?|r" +PBM_L["or the |cffC69B3ASpec icon|r in the top-left of the tab."] = "o en el |cffC69B3Aicono de rama|r en la esquina superior izquierda." +PBM_L["TIP: Always set strategies via a |cffC69B3ATemplate|r first,"] = "CONSEJO: Establece siempre las estrategias mediante una |cffC69B3APlantilla|r primero," +PBM_L[" then fine-tune individual strategies if needed."] = " luego ajusta las estrategias individuales si es necesario." +PBM_L["TIP: Bots retain their strategies between sessions."] = "CONSEJO: Los bots conservan sus estrategias entre sesiones." +PBM_L["TIP: |cffC69B3ACO|r is Combat Strategies."] = "CONSEJO: |cffC69B3ACO|r son Estrategias de Combate." +PBM_L["TIP: |cffC69B3ANC|r is Non-Combat Strategies."] = "CONSEJO: |cffC69B3ANC|r son Estrategias Fuera de Combate." +PBM_L["LEVELSYNC"] = "LEVELSYNC" +PBM_L["This was added for my personal server to give players"] = "Esto se añadió para mi servidor personal para permitir" +PBM_L["the ability to run a full raid without leveling 40+"] = "hacer una banda completa sin subir de nivel a 40+" +PBM_L["characters. It is designed for |cffFF8C00large altbot setups|r."] = "personajes. Diseñado para |cffFF8C00configuraciones grandes de altbots|r." +PBM_L["LevelSync is a shortcut to set your characters'"] = "LevelSync es un atajo para definir los niveles e IP" +PBM_L["IP levels and tiers automatically across accounts."] = "de tus personajes automáticamente entre cuentas." +PBM_L["Level sync and IP sync are not recommended for all players."] = "Level sync e IP sync no se recomiendan para todos los jugadores." +PBM_L["Use at your own risk. Double check entries before toggles."] = "Úsalo bajo tu propio riesgo. Revisa las entradas antes de alternar." +PBM_L["Toggle Only"] = "Solo alternar" +PBM_L["LevelSync must first be enabled by the server, then"] = "LevelSync debe ser habilitado primero por el servidor, luego" +PBM_L["toggled by the player. It will not fire until both"] = "alternado por el jugador. No se activará hasta cumplir ambos" +PBM_L["conditions are met. Syncs do not run automatically"] = "requisitos. Las sincronizaciones no se ejecutan solas" +PBM_L["— you must enter the toggle command to fire each sync."] = "— debes introducir el comando de alternancia para ejecutarlas." +PBM_L["Pool Gold"] = "Reunir oro" +PBM_L["Collects all gold from every member of your level"] = "Recolecta todo el oro de cada miembro de tu grupo" +PBM_L["sync group and transfers it to the caller."] = "de sincronización y lo transfiere al emisor." +PBM_L["To learn how to use LevelSync, see the"] = "Para aprender a usar LevelSync, consulta la" +PBM_L["|cffd4af37LevelSync Tab|r in this addon."] = "|cffd4af37Pestaña LevelSync|r en este addon." +PBM_L["Recent Changes"] = "Cambios recientes" +PBM_L["Show/Hide"] = "Mostrar/Ocultar" +PBM_L["Data"] = "Datos" +PBM_L["Links"] = "Enlaces" +PBM_L["Credits"] = "Créditos" +PBM_L["Clear All Data"] = "Borrar todos los datos" +PBM_L["This permanently deletes ALL tracked characters,\ngear data, raid rosters, and the Overview list.\n|cffff4444This cannot be undone.|r"] = "Esto elimina permanentemente TODOS los personajes rastreados,\ndatos de equipo, listas de banda y la lista de Resumen.\n|cffff4444Esto no se puede deshacer.|r" +PBM_L["Yes, Clear All"] = "Sí, borrar todo" +PBM_L["Cancel"] = "Cancelar" +PBM_L["All data wiped."] = "Todos los datos han sido borrados." +PBM_L["Data Management"] = "Gestión de datos" +PBM_L["Export Data"] = "Exportar datos" +PBM_L["Export all tracked character and raid data to a string. Click Select All, then Ctrl+C to copy."] = "Exporta todos los datos de personajes y bandas a una cadena. Clic en Seleccionar todo y luego Ctrl+C." +PBM_L["Import Data"] = "Importar datos" +PBM_L["Load tracker data from a previously exported string. Paste the export string and click Import."] = "Carga datos del rastreador desde una cadena exportada. Pega la cadena y haz clic en Importar." +PBM_L["|cffff6666Permanently deletes ALL tracked characters, gear data,\nraid rosters, and the Overview list. This cannot be undone.|r"] = "|cffff6666Elimina permanentemente TODOS los personajes rastreados, datos\nde equipo, listas de banda y Resumen. No se puede deshacer.|r" +PBM_L["Select All"] = "Seleccionar todo" +PBM_L["Ctrl+C to copy"] = "Ctrl+C para copiar" +PBM_L["PlayerBot Manager:"] = "PlayerBot Manager:" +PBM_L["mod-playerbots:"] = "mod-playerbots:" +PBM_L["mod-levelsync:"] = "mod-levelsync:" +PBM_L["mod-individual-progression:"] = "mod-individual-progression:" +PBM_L["Multibot:"] = "Multibot:" +PBM_L["Recent Changes"] = "Cambios recientes" +PBM_L["Release v1.4"] = "Lanzamiento v1.4" +PBM_L["July 3, 2026"] = "3 de julio de 2026" +PBM_L["Reorder Rows"] = "Reordenar filas" +PBM_L["Drag to reorder"] = "Arrastrar para reordenar" +PBM_L["grab the"] = "agarra el" +PBM_L["handle at the left of a"] = "tirador a la izquierda de una" +PBM_L["row and drag. Works in"] = "fila y arrastra. Funciona en pestañas" +PBM_L["Class"] = "Clase" +PBM_L["Raid"] = "Banda" +PBM_L["and"] = "y" +PBM_L["Group"] = "Grupo" +PBM_L["tabs"] = "" +PBM_L["Manual order is saved and clears the active column sort"] = "El orden manual se guarda y limpia la ordenación activa por columna" +PBM_L["LevelSync"] = "LevelSync" +PBM_L["New"] = "Nuevo" +PBM_L["Export"] = "Exportar" +PBM_L["button (bottom-right) — copies synced"] = "botón (abajo a la derecha) — copia los personajes" +PBM_L["characters"] = "sincronizados" +PBM_L["(name, class, level, IP tier)"] = "(nombre, clase, nivel, nivel IP)" +PBM_L["into the tracker"] = "en el rastreador" +PBM_L["Individual Progression"] = "Progresión Individual" +PBM_L[".ip attune onyxia/blacktemple"] = "comando .ip attune onyxia/blacktemple" +PBM_L["command added"] = "añadido a la lista de comandos" +PBM_L["to the Commands list"] = "" +PBM_L["Class Tabs"] = "Pestañas de Clase" +PBM_L["Gear cells now"] = "Las casillas de equipo ahora se" +PBM_L["highlight on hover"] = "resaltan al pasar el cursor" +PBM_L["matching the"] = "coincidiendo con la pestaña" +PBM_L["tab"] = "Grupo" +PBM_L["CC"] = "Control de Masas" +PBM_L["Added"] = "Añadido botón de" +PBM_L["button to character sheet — toggles the"] = "a la ficha de personaje — alterna la estrategia" +PBM_L["strategy for"] = "para" +PBM_L["Mage"] = "Mago" +PBM_L["Priest"] = "Sacerdote" +PBM_L["Warlock"] = "Brujo" +PBM_L["Druid"] = "Druida" +PBM_L["Polymorph"] = "Polimorfia" +PBM_L["Shackle Undead"] = "Encadenar no-muerto" +PBM_L["Fear"] = "Miedo" +PBM_L["Banish"] = "Desterrar" +PBM_L["Cyclone"] = "Ciclón" +PBM_L["Hibernate"] = "Hibernar" +PBM_L["Entangling Roots"] = "Raíces enredadoras" +PBM_L["Invite Raid"] = "Invitar a Banda" +PBM_L["Removed the 6th-member"] = "Eliminada la solución alternativa del 6º miembro" +PBM_L["pause/re-add"] = "pausa/volver a añadir" +PBM_L["workaround —"] = "—" +PBM_L["party->raid conversion is now handled server-side by"] = "la conversión grupo->banda ahora se maneja en el servidor por" +PBM_L["mod-playerbots"] = "mod-playerbots" +PBM_L["PR #2502"] = "PR #2502" +PBM_L["Release v1.3"] = "Lanzamiento v1.3" +PBM_L["June 5, 2026"] = "5 de junio de 2026" +PBM_L["Hunter"] = "Cazador" +PBM_L["Removed"] = "Eliminado el botón" +PBM_L["button from character sheet (CO)"] = "de la ficha de personaje (CO)" +PBM_L["debuff"] = "perjuicio" +PBM_L["aspect from character sheet (CO + NC)"] = "aspecto de la ficha de personaje (CO + NC)" +PBM_L["Paladin"] = "Paladín" +PBM_L["Blessings renamed"] = "Bendiciones renombradas" +PBM_L["PR #2432"] = "PR #2432" +PBM_L["(Blessing of Kings)"] = "(Bendición de reyes)" +PBM_L["(Blessing of Sanctuary)"] = "(Bendición de santuario)" +PBM_L["(Blessing of Wisdom)"] = "(Bendición de sabiduría)" +PBM_L["(Blessing of Might)"] = "(Bendición de poder)" +PBM_L["Rogue"] = "Pícaro" +PBM_L["Melee"] = "Cuerpo a cuerpo" +PBM_L["button — DPS column: DPS / Melee / Boost"] = "botón — columna DPS: DPS / Melee / Boost" +PBM_L["Combat section split into"] = "Sección Combate dividida en columnas" +PBM_L["and"] = "y" +PBM_L["Stealth"] = "Sigilo" +PBM_L["columns"] = "" +PBM_L["Playerbots Tab"] = "Pestaña Playerbots" +PBM_L["Reset Instances now uses"] = "Reiniciar Instancias ahora usa" +PBM_L[".playerbots bot refresh=raid *"] = ".playerbots bot refresh=raid *" +PBM_L["Removed GM Reset Instances button"] = "Eliminado el botón GM Reiniciar Instancias" +PBM_L["Bug Fixes"] = "Corrección de errores" +PBM_L["Fixed:"] = "Corregido:" +PBM_L["offheal strategy showing up red in notes"] = "estrategia offheal aparecía en rojo en las notas" +PBM_L["UI"] = "Interfaz" +PBM_L["Group tab added — shows current group members"] = "Añadida pestaña Grupo — muestra los miembros del grupo actual" +PBM_L["Character sheet: bag colors now correspond to how full the inventory is"] = "Ficha de personaje: los colores de las bolsas dependen de lo lleno que esté el inventario" +PBM_L["Filters"] = "Filtros" +PBM_L["New filter: removes generated notes in the"] = "Nuevo filtro: elimina las notas generadas en la pestaña" +PBM_L["tab — allows for manual entry"] = "— permite entrada manual" +PBM_L["New filter: removes generated roles in the"] = "Nuevo filtro: elimina los roles generados en la pestaña" +PBM_L["Overview"] = "General" +PBM_L["tab —"] = "—" +PBM_L["allows for manual entry"] = "permite entrada manual" +PBM_L["New filter: Show/Hide new"] = "Nuevo filtro: Mostrar/Ocultar nueva pestaña" +PBM_L["New filter: Show/Hide"] = "Nuevo filtro: Mostrar/Ocultar respuestas de" +PBM_L["Strategy"] = "Estrategia" +PBM_L["responses in output box"] = "en la caja de salida" +PBM_L["+Add Target/Group Strategies"] = "+Añadir Estrategias de Objetivo/Grupo" +PBM_L["buttons"] = "botones" +PBM_L["New filter: Show/Hide Who response (when opening character menus)"] = "Nuevo filtro: Mostrar/Ocultar respuesta de Quién (al abrir menús de personaje)" +PBM_L["Hide Group Members"] = "Ocultar miembros de grupo" +PBM_L["— hides chars in your party"] = "— oculta personajes en tu grupo" +PBM_L["New toggles: name-click char sheet —"] = "Nuevos botones: clic en nombre para ficha — pestañas" +PBM_L["Class tabs"] = "Clase" +PBM_L["Buttons"] = "Botones" +PBM_L["\"Does not work for rndbots.\""] = "\"No funciona para rndbots.\"" +PBM_L["note in Invite Group & Raid buttons"] = "nota en botones de Invitar a Grupo y Banda" +PBM_L["Templates"] = "Plantillas" +PBM_L["DK:"] = "DK:" +PBM_L["Dbl Aura Blood PvE"] = "Doble Aura Sangre PvE" +PBM_L["(43-26-2) added — spec \"double aura blood pve\""] = "(43-26-2) añadido — rama \"double aura blood pve\"" +PBM_L["Release v1.2"] = "Lanzamiento v1.2" +PBM_L["May 30, 2026"] = "30 de mayo de 2026" +PBM_L["Fixed: Invite Raid no longer kicks and reinvites members in partial groups"] = "Corregido: Invitar a Banda ya no expulsa ni vuelve a invitar miembros en grupos parciales" +PBM_L["Stop Scan now stops"] = "Detener Escaneo ahora detiene" +PBM_L["+Add IP Tiers"] = "+Añadir Niveles IP" +PBM_L["mid-run"] = "a mitad de ejecución" +PBM_L["Clear All no longer resets Raid tier/raid selection"] = "Borrar Todo ya no reinicia la selección de Nivel/Banda" +PBM_L["Show/Hide menu added: toggle tab and button visibility per bot row"] = "Menú Mostrar/Ocultar añadido: alterna la visibilidad de pestañas y botones por fila de bot" +PBM_L["Needs column restored — shares the Prof. column"] = "Restaurada la columna Necesidades — comparte la columna Profesión" +PBM_L["(use either)"] = "(usa cualquiera)" +PBM_L["Raid tab: note color brightened for readability"] = "Pestaña Banda: color de nota aclarado para mejorar la lectura" +PBM_L["Tracker section header renamed:"] = "Renombrada la cabecera del rastreador:" +PBM_L["Admin:"] = "Admin:" +PBM_L["Menu:"] = "Menú:" +PBM_L["Character sheet: name on its own line in class color"] = "Ficha de personaje: nombre en su propia línea en color de clase" +PBM_L["PvP tooltip: moved above button, wording cleaned up"] = "Tooltip PvP: movido encima del botón, texto limpiado" +PBM_L["Several AoE icons updated to Blizzard"] = "Varios iconos de Área actualizados a los de Blizzard" +PBM_L["(spell_frost_icestorm)"] = "(spell_frost_icestorm)" +PBM_L["Reset Instances: tooltips updated"] = "Reiniciar Instancias: tooltips actualizados" +PBM_L["Class Menus"] = "Menús de Clase" +PBM_L["Removed ability rotation lines from all 10 class spec tooltips"] = "Eliminadas líneas de rotación de facultades de las 10 ramas de clase" +PBM_L["Due to time restraints and constantly evolving Playerbot strategies."] = "Debido a restricciones de tiempo y la constante evolución de estrategias." +PBM_L["removed DPS toggle button, Combat row shrunk to 3 icons"] = "eliminado botón DPS, fila de Combate reducida a 3 iconos" +PBM_L["&"] = "y" +PBM_L["increased vertical row spacing"] = "incrementado espacio vertical de filas" +PBM_L["(15 px gap)"] = "(separación de 15 px)" +PBM_L["Caster AoE + Melee AoE merged into single"] = "Área Caster + Área Melee fusionados en un único botón" +PBM_L["AoE"] = "Área" +PBM_L["Totem section removed — use"] = "Sección Tótems eliminada — usa" +PBM_L["for totem functions"] = "para funciones de tótems" +PBM_L["added"] = "añadidas estrategias de" +PBM_L["Tranquility"] = "Tranquilidad" +PBM_L["Blanketing"] = "Manta de curación" +PBM_L["Feral Charge"] = "Carga feral" +PBM_L["strategies"] = "" +PBM_L["Buttons disabled while"] = "Botones desactivados mientras" +PBM_L["is running"] = "se está ejecutando" +PBM_L["Credits"] = "Créditos" +PBM_L["Special thanks to:"] = "Agradecimientos especiales a:" +PBM_L["Portions of PBM's character menu code were derived from Wishmaster117's Multibot."] = "Partes del código del menú de personajes de PBM derivan de Multibot de Wishmaster117." +PBM_L["Thank you for the work."] = "Gracias por el trabajo." +PBM_L["Questions & Support:"] = "Preguntas y Soporte:" +PBM_L["Discord:"] = "Discord:" +PBM_L["Show/Hide"] = "Mostrar/Ocultar" +PBM_L["Ind. Prog. Tab"] = "Pestaña Prog. Ind." +PBM_L["LevelSync Tab"] = "Pestaña LevelSync" +PBM_L["Notes Tab"] = "Pestaña Notas" +PBM_L["Group Tab"] = "Pestaña Grupo" +PBM_L["Hidden"] = "Oculto" +PBM_L["Visible"] = "Visible" +PBM_L["+Add IP Tiers (button)"] = "+Añadir Niveles IP (botón)" +PBM_L["+Add Strategy Buttons"] = "+Añadir Botones de Estrategia" +PBM_L["Hides +Add Target/Group Strategies buttons"] = "Oculta los botones +Añadir Estrategias Objetivo/Grupo" +PBM_L["and expands the remaining buttons to fill the gap."] = "y expande los botones restantes para llenar el hueco." +PBM_L["Strategy Whispers"] = "Susurros de Estrategia" +PBM_L["Filters bot strategy replies from the"] = "Filtra las respuestas de estrategia de los bots en la" +PBM_L["PBM output box when you open a bot menu."] = "caja de salida de PBM cuando abres un menú de bot." +PBM_L["Filtered messages:"] = "Mensajes filtrados:" +PBM_L["[Bot] whispers: Strategies: tank, heal ..."] = "[Bot] susurra: Estrategias: tank, heal ..." +PBM_L["Who Commands"] = "Comandos Quién" +PBM_L["Filters the bot query commands and their"] = "Filtra los comandos de consulta de bots y sus" +PBM_L["responses from your chat window."] = "respuestas de tu ventana de chat." +PBM_L["Filtered outgoing:"] = "Salientes filtrados:" +PBM_L["To [Bot]: co ? / nc ? / stats / who / ss ?"] = "A [Bot]: co ? / nc ? / stats / who / ss ?" +PBM_L["Filtered incoming:"] = "Entrantes filtrados:" +PBM_L["[Bot] whispers: stats, bag, durability line"] = "[Bot] susurra: línea de stats, bolsa, durabilidad" +PBM_L["[Bot] whispers: race/class/level/GS line"] = "[Bot] susurra: línea de raza/clase/nivel/GS" +PBM_L["[Bot] whispers: Ignored spell list ..."] = "[Bot] susurra: Lista de hechizos ignorados ..." +PBM_L["\"who\" is sent automatically when opening"] = "\"who\" se envía automáticamente al abrir" +PBM_L["a character's strategy menu."] = "el menú de estrategia de un personaje." +PBM_L["Talent Whispers"] = "Susurros de Talentos" +PBM_L["Filters the talents exchange triggered by the"] = "Filtra el intercambio de talentos activado por el" +PBM_L["Templates menu (same for all 10 classes)."] = "menú de Plantillas (igual para las 10 clases)." +PBM_L["To [Bot]: talents / talents spec list ..."] = "A [Bot]: talents / talents spec list ..." +PBM_L["[Bot] whispers: My current talent spec is ..."] = "[Bot] susurra: Mi especialización actual es ..." +PBM_L["[Bot] whispers: numbered spec list, Total N specs"] = "[Bot] susurra: lista numerada de specs, Total N specs" +PBM_L["On"] = "Activado" +PBM_L["Off"] = "Desactivado" +PBM_L["Role Filter"] = "Filtro de Rol" +PBM_L["Hides strategy roles in the Raid tab."] = "Oculta los roles de estrategia en la pestaña Banda." +PBM_L["Allows manual role assignment per slot."] = "Permite asignación manual de rol por casilla." +PBM_L["Notes Filter"] = "Filtro de Notas" +PBM_L["Hides strategy notes in the Raid tab."] = "Oculta las notas de estrategia en la pestaña Banda." +PBM_L["Enables manual note entry per slot."] = "Permite la entrada manual de notas por casilla." +PBM_L["Group Tab: Char Sheet"] = "Pestaña Grupo: Ficha" +PBM_L["Enable or disable clicking a name in the"] = "Activa o desactiva hacer clic en un nombre en la" +PBM_L["Group tab to open their character sheet."] = "pestaña Grupo para abrir su ficha de personaje." +PBM_L["Class Tabs: Char Sheet"] = "Pestañas de Clase: Ficha" +PBM_L["Enable or disable clicking a name in any"] = "Activa o desactiva hacer clic en un nombre en" +PBM_L["class tab to open their character sheet."] = "cualquier pestaña de clase para abrir su ficha." +PBM_L["Close"] = "Cerrar" +PBM_L["Open the Playerbot Manager menu."] = "Abre el menú de Playerbot Manager." +PBM_L["Party Filter"] = "Filtro de Grupo" +PBM_L["Hides characters |cffFF8C00not|r in your group/raid."] = "Oculta personajes que |cffFF8C00no|r están en tu grupo/banda." +PBM_L["Raid Tab Filter"] = "Filtro Pestaña Banda" +PBM_L["Shows characters that have been added to the raid tab."] = "Muestra personajes añadidos a la pestaña de banda." +PBM_L["Hides characters in your current group."] = "Oculta personajes que están en tu grupo actual." +PBM_L["Show Level"] = "Mostrar Nivel" +PBM_L["Replaces row numbers with character level"] = "Reemplaza el número de fila por el nivel del personaje" +PBM_L["Show IP Tiers"] = "Mostrar Niveles IP" +PBM_L["Replaces row numbers with IP tier (1-18)"] = "Reemplaza el número de fila por el nivel IP (1-18)" +PBM_L["Individual Progression Tiers"] = "Niveles de Progresión Individual" +PBM_L["Show or hide the tier key bar."] = "Muestra u oculta la barra de leyenda de niveles." +PBM_L["Tiers:"] = "Niveles:" +PBM_L["Level 60 Raids"] = "Bandas de Nivel 60" +PBM_L["Level 70 Raids"] = "Bandas de Nivel 70" +PBM_L["Level 80 Raids"] = "Bandas de Nivel 80" +PBM_L["Playerbot Manager"] = "Playerbot Manager" +PBM_L["- v1.4"] = "- v1.4" +PBM_L["⚠ Wipe Entire Database?"] = "⚠ ¿Borrar Toda la Base de Datos?" +PBM_L["This permanently deletes ALL tracked characters,\ngear data, raid rosters, and the Overview list."] = "Esto elimina permanentemente TODOS los personajes rastreados,\ndatos de equipo, listas de banda y la lista General." +PBM_L["Yes, wipe it all"] = "Sí, borrarlo todo" +PBM_L["Keep my data"] = "Mantener mis datos" +PBM_L["PBM:"] = "PBM:" +PBM_L["All data wiped."] = "Todos los datos han sido borrados." +PBM_L["Clear All Data"] = "Borrar Todos los Datos" +PBM_L["Deletes ALL characters, gear data,"] = "Elimina TODOS los personajes, datos de equipo," +PBM_L["raid rosters, and the Overview list."] = "listas de banda y la lista General." +PBM_L["Does not clear LevelSync data."] = "No borra los datos de LevelSync." +PBM_L["This cannot be undone."] = "Esto no se puede deshacer." \ No newline at end of file diff --git a/PBM/IPTiersColor.lua b/PBM/IPTiersColor.lua index c694b5d..600b134 100644 --- a/PBM/IPTiersColor.lua +++ b/PBM/IPTiersColor.lua @@ -46,70 +46,70 @@ PBM.TIER_KEY_COLORS = { -- ── Full tier names (dropdowns, tooltips) ───────────────────── PBM.TIER_LABELS = { - [0] = "T0 — Molten Core / Onyxia", - [1] = "T1 — Molten Core / Onyxia", - [2] = "T2 — Blackwing Lair", - [3] = "T3 — Ahn'Qiraj War Effort", - [4] = "T4 — AQ War", - [5] = "T5 — Ahn'Qiraj", - [6] = "T6 — Naxxramas 40", - [7] = "T7 — Pre-TBC", - [8] = "T8 — Karazhan / Gruul's Lair / Magtheridon's Lair", - [9] = "T9 — Serpentshrine Cavern / Tempest Keep", - [10] = "T10 — Hyjal Summit / Black Temple", - [11] = "T11 — Zul'Aman (Optional)", - [12] = "T12 — Sunwell Plateau", - [13] = "T13 — Naxx / Eye of Eternity / Obsidian Sanctum", - [14] = "T14 — Ulduar", - [15] = "T15 — Trial of the Crusader", - [16] = "T16 — Icecrown Citadel", - [17] = "T17 — Ruby Sanctum", - [18] = "T18 — Tiers Complete", + [0] = PBM_L["T0 — Molten Core / Onyxia"], + [1] = PBM_L["T1 — Molten Core / Onyxia"], + [2] = PBM_L["T2 — Blackwing Lair"], + [3] = PBM_L["T3 — Ahn'Qiraj War Effort"], + [4] = PBM_L["T4 — AQ War"], + [5] = PBM_L["T5 — Ahn'Qiraj"], + [6] = PBM_L["T6 — Naxxramas 40"], + [7] = PBM_L["T7 — Pre-TBC"], + [8] = PBM_L["T8 — Karazhan / Gruul's Lair / Magtheridon's Lair"], + [9] = PBM_L["T9 — Serpentshrine Cavern / Tempest Keep"], + [10] = PBM_L["T10 — Hyjal Summit / Black Temple"], + [11] = PBM_L["T11 — Zul'Aman (Optional)"], + [12] = PBM_L["T12 — Sunwell Plateau"], + [13] = PBM_L["T13 — Naxx / Eye of Eternity / Obsidian Sanctum"], + [14] = PBM_L["T14 — Ulduar"], + [15] = PBM_L["T15 — Trial of the Crusader"], + [16] = PBM_L["T16 — Icecrown Citadel"], + [17] = PBM_L["T17 — Ruby Sanctum"], + [18] = PBM_L["T18 — Tiers Complete"], } -- ── Short tier names (LevelSync grid, numLbl column) ───────── -- T0 stays "None" because the server uses 0 to mean no tier achieved. PBM.TIER_SHORT = { - [0] = "None", - [1] = "T1 - Molten Core", - [2] = "T2 - Blackwing Lair", - [3] = "T3 - Ahn'Qiraj War Effort", - [4] = "T4 - AQ War", - [5] = "T5 - Ahn'Qiraj", - [6] = "T6 - Naxxramas 40", - [7] = "T7 - Pre-TBC", - [8] = "T8 - Karazhan, Gruul's, Mag's", - [9] = "T9 - Serpentshrine / TK", - [10] = "T10 - Hyjal / Black Temple", - [11] = "T11 - Zul'Aman (Optional)", - [12] = "T12 - Sunwell Plateau", - [13] = "T13 - Naxx/EoE/OS", - [14] = "T14 - Ulduar", - [15] = "T15 - Trial of the Crusader", - [16] = "T16 - Icecrown Citadel", - [17] = "T17 - Ruby Sanctum", - [18] = "T18 - Complete", + [0] = PBM_L["None"], + [1] = PBM_L["T1 - Molten Core"], + [2] = PBM_L["T2 - Blackwing Lair"], + [3] = PBM_L["T3 - Ahn'Qiraj War Effort"], + [4] = PBM_L["T4 - AQ War"], + [5] = PBM_L["T5 - Ahn'Qiraj"], + [6] = PBM_L["T6 - Naxxramas 40"], + [7] = PBM_L["T7 - Pre-TBC"], + [8] = PBM_L["T8 - Karazhan, Gruul's, Mag's"], + [9] = PBM_L["T9 - Serpentshrine / TK"], + [10] = PBM_L["T10 - Hyjal / Black Temple"], + [11] = PBM_L["T11 - Zul'Aman (Optional)"], + [12] = PBM_L["T12 - Sunwell Plateau"], + [13] = PBM_L["T13 - Naxx/EoE/OS"], + [14] = PBM_L["T14 - Ulduar"], + [15] = PBM_L["T15 - Trial of the Crusader"], + [16] = PBM_L["T16 - Icecrown Citadel"], + [17] = PBM_L["T17 - Ruby Sanctum"], + [18] = PBM_L["T18 - Complete"], } -- ── Raid lists per tier (tooltip key hover) ─────────────────── PBM.TIER_TOOLTIP_RAIDS = { - [0] = {"Molten Core", "Onyxia's Lair"}, - [1] = {"Molten Core", "Onyxia's Lair"}, - [2] = {"Blackwing Lair"}, - [3] = {"Ahn'Qiraj War Effort"}, - [4] = {"AQ War"}, - [5] = {"Ahn'Qiraj", "Ruins of Ahn'Qiraj"}, - [6] = {"Naxxramas 40"}, - [7] = {"Pre-TBC"}, - [8] = {"Karazhan", "Gruul's Lair", "Magtheridon's Lair"}, - [9] = {"Serpentshrine Cavern", "Tempest Keep"}, - [10] = {"Mount Hyjal", "Black Temple"}, - [11] = {"Zul'Aman (Optional)"}, - [12] = {"Sunwell Plateau"}, - [13] = {"Naxxramas", "Eye of Eternity", "Obsidian Sanctum"}, - [14] = {"Ulduar"}, - [15] = {"Trial of the Crusader"}, - [16] = {"Icecrown Citadel"}, - [17] = {"Ruby Sanctum"}, - [18] = {"Tiers Complete"}, -} + [0] = {PBM_L["Molten Core"], PBM_L["Onyxia's Lair"]}, + [1] = {PBM_L["Molten Core"], PBM_L["Onyxia's Lair"]}, + [2] = {PBM_L["Blackwing Lair"]}, + [3] = {PBM_L["Ahn'Qiraj War Effort"]}, + [4] = {PBM_L["AQ War"]}, + [5] = {PBM_L["Ahn'Qiraj"], PBM_L["Ruins of Ahn'Qiraj"]}, + [6] = {PBM_L["Naxxramas 40"]}, + [7] = {PBM_L["Pre-TBC"]}, + [8] = {PBM_L["Karazhan"], PBM_L["Gruul's Lair"], PBM_L["Magtheridon's Lair"]}, + [9] = {PBM_L["Serpentshrine Cavern"], PBM_L["Tempest Keep"]}, + [10] = {PBM_L["Mount Hyjal"], PBM_L["Black Temple"]}, + [11] = {PBM_L["Zul'Aman (Optional)"]}, + [12] = {PBM_L["Sunwell Plateau"]}, + [13] = {PBM_L["Naxxramas"], PBM_L["Eye of Eternity"], PBM_L["Obsidian Sanctum"]}, + [14] = {PBM_L["Ulduar"]}, + [15] = {PBM_L["Trial of the Crusader"]}, + [16] = {PBM_L["Icecrown Citadel"]}, + [17] = {PBM_L["Ruby Sanctum"]}, + [18] = {PBM_L["Tiers Complete"]}, +} \ No newline at end of file diff --git a/PBM/PBM_BotSettings.lua b/PBM/PBM_BotSettings.lua index 41c77a5..f33a877 100644 --- a/PBM/PBM_BotSettings.lua +++ b/PBM/PBM_BotSettings.lua @@ -126,7 +126,7 @@ function PBM.BuildBotSettingsFrame(parent, fl) hdrTitle:SetPoint("TOPRIGHT", hdr, "TOPRIGHT", 0, 0) hdrTitle:SetHeight(24) hdrTitle:SetJustifyH("CENTER"); hdrTitle:SetJustifyV("MIDDLE") - hdrTitle:SetText("|cff7799ffBot Settings|r") + hdrTitle:SetText("|cff7799ff" .. PBM_L["Bot Settings"] .. "|r") local BL = fl + 12 -- base frame level for content local ROW_START = 52 -- top padding below header @@ -136,20 +136,20 @@ function PBM.BuildBotSettingsFrame(parent, fl) -- ============================================================ local COL1_X = 35 - MakeLabel(f, "Add RndBot", COL1_X, ROW_START, BL) + MakeLabel(f, PBM_L["Add RndBot"], COL1_X, ROW_START, BL) MakeDivider(f, COL1_X, ROW_START + 16, 220, BL) local CLASS_DEFS = { - { name = "Death Knight", cmd = "dk", hex = "C41F3B", icon = ADDON_PATH .. "addclass_deathknight.blp" }, - { name = "Druid", cmd = "druid", hex = "FF7D0A", icon = ADDON_PATH .. "addclass_druid.blp" }, - { name = "Hunter", cmd = "hunter", hex = "ABD473", icon = ADDON_PATH .. "addclass_hunter.blp" }, - { name = "Mage", cmd = "mage", hex = "3FC7EB", icon = ADDON_PATH .. "addclass_mage.blp" }, - { name = "Paladin", cmd = "paladin", hex = "F58CBA", icon = ADDON_PATH .. "addclass_paladin.blp" }, - { name = "Priest", cmd = "priest", hex = "FFFFFF", icon = ADDON_PATH .. "addclass_priest.blp" }, - { name = "Rogue", cmd = "rogue", hex = "FFF569", icon = ADDON_PATH .. "addclass_rogue.blp" }, - { name = "Shaman", cmd = "shaman", hex = "0070DE", icon = ADDON_PATH .. "addclass_shaman.blp" }, - { name = "Warlock", cmd = "warlock", hex = "8787ED", icon = ADDON_PATH .. "addclass_warlock.blp" }, - { name = "Warrior", cmd = "warrior", hex = "C79C3B", icon = ADDON_PATH .. "addclass_warrior.blp" }, + { name = PBM_L["Death Knight"], cmd = "dk", hex = "C41F3B", icon = ADDON_PATH .. "addclass_deathknight.blp" }, + { name = PBM_L["Druid"], cmd = "druid", hex = "FF7D0A", icon = ADDON_PATH .. "addclass_druid.blp" }, + { name = PBM_L["Hunter"], cmd = "hunter", hex = "ABD473", icon = ADDON_PATH .. "addclass_hunter.blp" }, + { name = PBM_L["Mage"], cmd = "mage", hex = "3FC7EB", icon = ADDON_PATH .. "addclass_mage.blp" }, + { name = PBM_L["Paladin"], cmd = "paladin", hex = "F58CBA", icon = ADDON_PATH .. "addclass_paladin.blp" }, + { name = PBM_L["Priest"], cmd = "priest", hex = "FFFFFF", icon = ADDON_PATH .. "addclass_priest.blp" }, + { name = PBM_L["Rogue"], cmd = "rogue", hex = "FFF569", icon = ADDON_PATH .. "addclass_rogue.blp" }, + { name = PBM_L["Shaman"], cmd = "shaman", hex = "0070DE", icon = ADDON_PATH .. "addclass_shaman.blp" }, + { name = PBM_L["Warlock"], cmd = "warlock", hex = "8787ED", icon = ADDON_PATH .. "addclass_warlock.blp" }, + { name = PBM_L["Warrior"], cmd = "warrior", hex = "C79C3B", icon = ADDON_PATH .. "addclass_warrior.blp" }, } local classRowY = ROW_START + 24 @@ -158,7 +158,7 @@ function PBM.BuildBotSettingsFrame(parent, fl) local classBtn = MakeIconBtn(f, COL1_X, classRowY, cd.icon, cd.name, - "Summon a random " .. cd.name .. " RndBot.", BL) + string.format(PBM_L["Summon a random %s RndBot."], cd.name), BL) local capturedCmd = cd.cmd classBtn:SetScript("OnClick", function() @@ -177,7 +177,7 @@ function PBM.BuildBotSettingsFrame(parent, fl) -- ============================================================ local COL2_X = 296 - MakeLabel(f, "Bot Controls", COL2_X, ROW_START, BL) + MakeLabel(f, PBM_L["Bot Controls"], COL2_X, ROW_START, BL) MakeDivider(f, COL2_X, ROW_START + 16, 220, BL) local rowY = ROW_START + 24 @@ -185,104 +185,104 @@ function PBM.BuildBotSettingsFrame(parent, fl) -- ── Selfbot ────────────────────────────────────────────── local selfbotBtn = MakeIconBtn(f, COL2_X, rowY, ICON_PATH .. "inv_misc_head_clockworkgnome_01", - "Selfbot", - "Switches Selfbot mode on and off.\nLeft-click to toggle.", BL) + PBM_L["Selfbot"], + PBM_L["Switches Selfbot mode on and off.\nLeft-click to toggle."], BL) WireToggle(selfbotBtn, function() PBM.ActionToGroup("selfbot on") end, function() PBM.ActionToGroup("selfbot off") end) local selfLabel = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") selfLabel:SetPoint("LEFT", selfbotBtn, "RIGHT", 6, 0) - selfLabel:SetText("|cffccccccSelfbot|r") + selfLabel:SetText("|cffcccccc" .. PBM_L["Selfbot"] .. "|r") rowY = rowY + STEP -- ── GameMaster Toggle ───────────────────────────────────── local gmBtn = MakeIconBtn(f, COL2_X, rowY, ICON_PATH .. "mail_gmicon", - "GameMaster Switch", - "Enable or disable GameMaster control.\nRequires GM rights.", BL) + PBM_L["GameMaster Switch"], + PBM_L["Enable or disable GameMaster control.\nRequires GM rights."], BL) WireToggle(gmBtn, function() PBM.ActionToGroup("gm on") end, function() PBM.ActionToGroup("gm off") end) local gmLabel = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") gmLabel:SetPoint("LEFT", gmBtn, "RIGHT", 6, 0) - gmLabel:SetText("|cffccccccGameMaster|r") + gmLabel:SetText("|cffcccccc" .. PBM_L["GameMaster"] .. "|r") rowY = rowY + STEP -- ── RTSC Toggle ─────────────────────────────────────────── local rtscBtn = MakeIconBtn(f, COL2_X, rowY, ICON_PATH .. "ability_hunter_markedfordeath", - "RTSC", - "Enable or disable RTSC.\nLeft-click to toggle.", BL) + PBM_L["RTSC"], + PBM_L["Enable or disable RTSC.\nLeft-click to toggle."], BL) WireToggle(rtscBtn, function() PBM.ActionToGroup("rtsc") end, function() PBM.ActionToGroup("rtsc reset") end) local rtscLabel = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") rtscLabel:SetPoint("LEFT", rtscBtn, "RIGHT", 6, 0) - rtscLabel:SetText("|cffccccccRTSC|r") + rtscLabel:SetText("|cffcccccc" .. PBM_L["RTSC"] .. "|r") rowY = rowY + STEP -- ── Auto Release ────────────────────────────────────────── local releaseBtn = MakeIconBtn(f, COL2_X, rowY, ICON_PATH .. "achievement_bg_xkills_avgraveyard", - "Auto Release", - "Toggle automatic spirit release on bot death.", BL) + PBM_L["Auto Release"], + PBM_L["Toggle automatic spirit release on bot death."], BL) WireToggle(releaseBtn, function() PBM.ActionToGroup("release") end, function() PBM.ActionToGroup("no release") end) local relLabel = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") relLabel:SetPoint("LEFT", releaseBtn, "RIGHT", 6, 0) - relLabel:SetText("|cffccccccAuto Release|r") + relLabel:SetText("|cffcccccc" .. PBM_L["Auto Release"] .. "|r") rowY = rowY + STEP -- ── Auto Stats ──────────────────────────────────────────── local statsBtn = MakeIconBtn(f, COL2_X, rowY, ICON_PATH .. "inv_scroll_08", - "Auto Stats", - "Toggle automatic stats broadcast to group.", BL) + PBM_L["Auto Stats"], + PBM_L["Toggle automatic stats broadcast to group."], BL) WireToggle(statsBtn, function() PBM.ActionToGroup("stats on") end, function() PBM.ActionToGroup("stats off") end) local statsLabel = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") statsLabel:SetPoint("LEFT", statsBtn, "RIGHT", 6, 0) - statsLabel:SetText("|cffccccccAuto Stats|r") + statsLabel:SetText("|cffcccccc" .. PBM_L["Auto Stats"] .. "|r") rowY = rowY + STEP -- ── Reset Bot AI ────────────────────────────────────────── local resetAIBtn = MakeIconBtn(f, COL2_X, rowY, ICON_PATH .. "inv_misc_tournaments_symbol_gnome", - "Reset Bot AI", - "Reset AI for targeted bot or entire group.", BL) + PBM_L["Reset Bot AI"], + PBM_L["Reset AI for targeted bot or entire group."], BL) resetAIBtn:SetScript("OnClick", function() PBM.ActionToTargetOrGroup("reset botAI") end) local resetAILabel = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") resetAILabel:SetPoint("LEFT", resetAIBtn, "RIGHT", 6, 0) - resetAILabel:SetText("|cffccccccReset Bot AI|r") + resetAILabel:SetText("|cffcccccc" .. PBM_L["Reset Bot AI"] .. "|r") rowY = rowY + STEP -- ── Reset Action ────────────────────────────────────────── local resetActBtn = MakeIconBtn(f, COL2_X, rowY, ICON_PATH .. "inv_helmet_02", - "Reset Action", - "Reset actions for targeted bot or entire group.", BL) + PBM_L["Reset Action"], + PBM_L["Reset actions for targeted bot or entire group."], BL) resetActBtn:SetScript("OnClick", function() PBM.ActionToTargetOrGroup("reset") end) local resetActLabel = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") resetActLabel:SetPoint("LEFT", resetActBtn, "RIGHT", 6, 0) - resetActLabel:SetText("|cffccccccReset Action|r") + resetActLabel:SetText("|cffcccccc" .. PBM_L["Reset Action"] .. "|r") -end +end \ No newline at end of file diff --git a/PBM/PBM_BottomTabs.lua b/PBM/PBM_BottomTabs.lua index d26f5cb..5d96712 100644 --- a/PBM/PBM_BottomTabs.lua +++ b/PBM/PBM_BottomTabs.lua @@ -22,9 +22,9 @@ local BD_CELL = { -- ── Tab definitions (colors match LT exactly) ───────────────── local BOTTOM_TABS = { - { id="Playerbots", label="Playerbots", r=PERI_R, g=PERI_G, b=PERI_B }, - { id="LevelSync", label="LevelSync", r=GOLD_R, g=GOLD_G, b=GOLD_B }, - { id="Notes", label="Notes", r=GOLD_R, g=GOLD_G, b=GOLD_B }, + { id="Playerbots", label=PBM_L["Playerbots"], r=PERI_R, g=PERI_G, b=PERI_B }, + { id="LevelSync", label=PBM_L["LevelSync"], r=GOLD_R, g=GOLD_G, b=GOLD_B }, + { id="Notes", label=PBM_L["Notes"], r=GOLD_R, g=GOLD_G, b=GOLD_B }, } -- ── Tab button layout (title bar row, right of Clear buttons) ─ @@ -175,17 +175,17 @@ function PBM.BuildBottomTabs(parent, fl) } -- ── Playerbots panel ───────────────────────────────────── - local pbPanel = MakeContentFrame("PBMTabPanel_Playerbots", parent, fl, "Playerbots", false) + local pbPanel = MakeContentFrame("PBMTabPanel_Playerbots", parent, fl, PBM_L["Playerbots"], false) PBM.State.bottomTabPanels["Playerbots"] = pbPanel PBM.BuildPlayerbotsPanel(pbPanel, ctx) -- ── LevelSync panel (gold header, full height) ──────────── - local lsPanel = MakeContentFrame("PBMTabPanel_LevelSync", parent, fl, "LevelSync", true, GOLD_R, GOLD_G, GOLD_B) + local lsPanel = MakeContentFrame("PBMTabPanel_LevelSync", parent, fl, PBM_L["LevelSync"], true, GOLD_R, GOLD_G, GOLD_B) PBM.State.bottomTabPanels["LevelSync"] = lsPanel PBM.BuildLevelSyncPanel(lsPanel, ctx) -- ── Notes panel (gold header) ───────────────────────────── - local notesPanel = MakeContentFrame("PBMTabPanel_Notes", parent, fl, "Notes", false, GOLD_R, GOLD_G, GOLD_B) + local notesPanel = MakeContentFrame("PBMTabPanel_Notes", parent, fl, PBM_L["Notes"], false, GOLD_R, GOLD_G, GOLD_B) PBM.State.bottomTabPanels["Notes"] = notesPanel PBM.BuildNotesPanel(notesPanel, ctx) @@ -226,4 +226,4 @@ function PBM.BuildBottomTabs(parent, fl) end PBM.UpdateBottomTabHighlights() -end +end \ No newline at end of file diff --git a/PBM/PBM_CharSheet.lua b/PBM/PBM_CharSheet.lua index 9b85f30..b4ee59f 100644 --- a/PBM/PBM_CharSheet.lua +++ b/PBM/PBM_CharSheet.lua @@ -2,29 +2,29 @@ PBM = PBM or {} -- ───────────────────────────────────────────────────────────────────────────── -- PBM_CharSheet.lua --- Shared character-sheet overlay used by all 10 class menus. +-- Superposició de la fitxa de personatge compartida utilitzada pels 10 menús de classe. -- -- PBM.CreateCharSheet(config) → menu, catcher --- Builds the full overlay frame and populates every shared component. --- Each class file calls this once, then adds its own strategy tree on top. +-- Construeix el marc de superposició complet i omple tots els components compartits. +-- Cada fitxer de classe ho crida una vegada, i després afegeix el seu propi arbre d'estratègia a sobre. -- -- config = { --- menuName = "LichborneDruidMenu", -- global frame name (required by ClassTabs) +-- menuName = "LichborneDruidMenu", -- nom del marc global (requerit per ClassTabs) -- catcherName = "LichborneDruidCatcher", --- className = "Druid", -- passed to InstallTieredStratDisplay --- classHex = "FF7D0A", -- class color (no leading #) --- leftExt = 5, -- pixels the overlay extends left of iLvl col +-- className = "Druid", -- passat a InstallTieredStratDisplay +-- classHex = "FF7D0A", -- color de classe (sense # inicial) +-- leftExt = 5, -- píxels que la superposició s'estén a l'esquerra de la col. iLvl -- overlayW = number, -- overlayH = number, -- talentSpecs = { {label, spec, wowSpec, icon}, ... }, --- hideCallback = fn, -- called on ESC / click-away +-- hideCallback = fn, -- cridat en prémer ESC / fer clic fora -- } -- -- PBM.HideCharSheet(menu, catcher) -- PBM.ShowCharSheet(menu, catcher, row, leftExt) -- ───────────────────────────────────────────────────────────────────────────── --- ── Timer helper ───────────────────────────────────────────────────────────── +-- ── Auxiliar de temporitzador ──────────────────────────────────────────────── local function PBM_TimerAfter(delay, callback) if C_Timer and C_Timer.After then return C_Timer.After(delay, callback) @@ -40,7 +40,7 @@ local function PBM_TimerAfter(delay, callback) end) end --- ── Shared backdrop templates ───────────────────────────────────────────────── +-- ── Plantilles de fons compartides ─────────────────────────────────────────── local OVERLAY_BD = { bgFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", @@ -54,7 +54,7 @@ local HDR_CELL_BD = { insets = {left=1, right=1, top=1, bottom=1}, } --- ── Icon sizes ──────────────────────────────────────────────────────────────── +-- ── Mides de les icones ────────────────────────────────────────────────────── local ICON_SIZE = 26 local ICON_GAP = 4 @@ -72,7 +72,7 @@ function PBM.CreateCharSheet(config) local talentSpecs = config.talentSpecs or {} local hideCallback = config.hideCallback - -- ── Catcher (click-away) ───────────────────────────────────────────────── + -- ── Catcher (captura de clics a fora) ──────────────────────────────────── local catcher = CreateFrame("Button", catcherName, UIParent) catcher:SetAllPoints(UIParent) catcher:SetFrameStrata("HIGH") @@ -81,7 +81,7 @@ function PBM.CreateCharSheet(config) catcher:SetScript("OnMouseDown", hideCallback) catcher:Hide() - -- ── Overlay panel ──────────────────────────────────────────────────────── + -- ── Panell de superposició ──────────────────────────────────────────────── local menu = CreateFrame("Frame", menuName, UIParent) menu:SetFrameStrata("TOOLTIP") menu:EnableMouse(true) @@ -107,7 +107,7 @@ function PBM.CreateCharSheet(config) if catcher then catcher:Hide() end end) - -- ── Header row (gear bar) ──────────────────────────────────────────────── + -- ── Fila de la capçalera (barra d'equipament) ──────────────────────────── local HDR_H = PBM.ROW_HEIGHT local hdr = {} @@ -169,7 +169,7 @@ function PBM.CreateCharSheet(config) PBM.InstallGearTooltips(menu, hdr) menu.hdr = hdr - -- ── Spec icon (Templates button) ───────────────────────────────────────── + -- ── Icona d'especialització (botó de Plantilles) ───────────────────────── local SPEC_BTN_SIZE = 39 local specBtn = CreateFrame("Button", nil, menu) specBtn:SetSize(SPEC_BTN_SIZE, SPEC_BTN_SIZE) @@ -185,9 +185,9 @@ function PBM.CreateCharSheet(config) specLabel:SetFont("Fonts\\FRIZQT__.TTF", 7) specLabel:SetPoint("BOTTOM", specBtn, "TOP", 0, 2) specLabel:SetTextColor(1, 0.82, 0) - specLabel:SetText("Templates") + specLabel:SetText("Plantilles") - -- ── Talent spec dropdown ────────────────────────────────────────────────── + -- ── Desplegable d'especialització de talents ───────────────────────────── local talentsMenu = CreateFrame("Frame", nil, menu) talentsMenu:SetFrameStrata("TOOLTIP") talentsMenu:SetFrameLevel(menu:GetFrameLevel() + 10) @@ -252,13 +252,13 @@ function PBM.CreateCharSheet(config) specBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT") GameTooltip:SetFrameLevel(menu:GetFrameLevel() + 20) - GameTooltip:AddLine("Set Talents", 1, 0.82, 0) - GameTooltip:AddLine("Select a talent template for this Bot", 1, 1, 1) + GameTooltip:AddLine("Establir Talents", 1, 0.82, 0) + GameTooltip:AddLine("Selecciona una plantilla de talents per a aquest Bot", 1, 1, 1) GameTooltip:Show() end) specBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) - -- ── Who-info labels ─────────────────────────────────────────────────────── + -- ── Etiquetes d'informació general (Who) ────────────────────────────────── local whoLine1 = menu:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") whoLine1:SetPoint("TOPLEFT", specBtn, "TOPRIGHT", 8, 0) whoLine1:SetTextColor(1, 1, 1) @@ -275,7 +275,7 @@ function PBM.CreateCharSheet(config) menu.whoLine2 = whoLine2 menu.whoLine3 = whoLine3 - -- ── Stat labels ─────────────────────────────────────────────────────────── + -- ── Etiquetes d'estadístiques ────────────────────────────────────────────── local statLine1 = menu:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") statLine1:SetPoint("TOPLEFT", specBtn, "BOTTOMLEFT", 0, -6) statLine1:SetTextColor(1, 1, 1) @@ -292,7 +292,7 @@ function PBM.CreateCharSheet(config) menu.statLine2 = statLine2 menu.statLine3 = statLine3 - -- ── Refresh button (right of stat lines, centered vertically) ──────────── + -- ── Botó d'actualització (A la dreta de les línies d'estats, centrat verticalment) local refreshBtn = CreateFrame("Button", nil, menu) refreshBtn:SetSize(58, 18) refreshBtn:SetPoint("TOPLEFT", specBtn, "BOTTOMRIGHT", 52, -16) @@ -310,7 +310,7 @@ function PBM.CreateCharSheet(config) refreshLbl:SetTextColor(0.78, 0.61, 0.23, 1) refreshLbl:SetAllPoints() refreshLbl:SetJustifyH("CENTER") - refreshLbl:SetText("Refresh") + refreshLbl:SetText("Actualitza") refreshBtn:SetScript("OnClick", function() if menu.clearStratDisplay then menu.clearStratDisplay() end local botName = menu.botName or "" @@ -323,20 +323,20 @@ function PBM.CreateCharSheet(config) end end) - -- ── Strategies label ────────────────────────────────────────────────────── + -- ── Etiqueta d'estratègies ──────────────────────────────────────────────── local strategyLabel = menu:CreateFontString(nil, "OVERLAY") strategyLabel:SetFont("Fonts\\FRIZQT__.TTF", 24, "OUTLINE") strategyLabel:SetTextColor(0.78, 0.61, 0.23, 1) - strategyLabel:SetText("Strategies") + strategyLabel:SetText("Estratègies") strategyLabel:SetPoint("TOP", menu, "TOP", 0, -(HDR_H + 30)) strategyLabel:SetWidth(overlayW - 60) strategyLabel:SetJustifyH("CENTER") - -- ── Strat list (right column) ───────────────────────────────────────────── + -- ── Llista d'estratègies (columna dreta) ────────────────────────────────── PBM.InstallTieredStratDisplay(menu, className) - -- ── 6-button vertical bar ───────────────────────────────────────────────── - -- Talent / Inventory / Spellbook (activate) + Food / Loot / Gather (toggle NC) + -- ── Barra vertical de 6 botons ──────────────────────────────────────────── + -- Talents / Inventari / Llibre d'hechizos (activar) + Menjar / Botí / Recol·lectar (commutar NC) local function MakeLeftBtn(anchorFrame, anchorPoint, ox, oy, iconPath) local btn = CreateFrame("Button", nil, menu) btn:SetSize(ICON_SIZE, ICON_SIZE) @@ -359,12 +359,12 @@ function PBM.CreateCharSheet(config) if btn.icon then btn.icon:SetDesaturated(true) end end - -- Row 1: Talent (activate) + -- Fila 1: Talents (activar) local talentBtn = MakeLeftBtn(statLine3, "BOTTOMLEFT", 20, -15, "Ability_Marksmanship") talentBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT") - GameTooltip:AddLine("Open Talents", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Opens Window Behind Tracker", 1, 0.2, 0.2) + GameTooltip:AddLine("Obrir Talents", 0.78, 0.61, 0.23) + GameTooltip:AddLine("Obre la finestra darrere del Tracker", 1, 0.2, 0.2) GameTooltip:Show() end) talentBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -373,12 +373,12 @@ function PBM.CreateCharSheet(config) if PBM.OpenTalentWindow then PBM.OpenTalentWindow(bot) end end) - -- Row 2: Inventory (activate) + -- Fila 2: Inventari (activar) local invBtn = MakeLeftBtn(talentBtn, "BOTTOMLEFT", 0, -ICON_GAP, "INV_Misc_Bag_08") invBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT") - GameTooltip:AddLine("Open Inventory", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Opens Window Behind Tracker", 1, 0.2, 0.2) + GameTooltip:AddLine("Obrir Inventari", 0.78, 0.61, 0.23) + GameTooltip:AddLine("Obre la finestra darrere del Tracker", 1, 0.2, 0.2) GameTooltip:Show() end) invBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -387,12 +387,12 @@ function PBM.CreateCharSheet(config) if PBM.OpenInventoryWindow then PBM.OpenInventoryWindow(bot) end end) - -- Row 3: Spellbook (activate) + -- Fila 3: Llibre de conjurs (activar) local spellBtn = MakeLeftBtn(invBtn, "BOTTOMLEFT", 0, -ICON_GAP, "INV_Misc_Book_09") spellBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT") - GameTooltip:AddLine("Open Spellbook", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Opens Window Behind Tracker", 1, 0.2, 0.2) + GameTooltip:AddLine("Obrir Llibre de conjurs", 0.78, 0.61, 0.23) + GameTooltip:AddLine("Obre la finestra darrere del Tracker", 1, 0.2, 0.2) GameTooltip:Show() end) spellBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -401,17 +401,17 @@ function PBM.CreateCharSheet(config) if PBM.OpenSpellbookWindow then PBM.OpenSpellbookWindow(bot) end end) - -- Row 4: Food and Drink (toggle NC) + -- Fila 4: Menjar i Beure (commutar NC) local treeFoodBtn = MakeLeftBtn(spellBtn, "BOTTOMLEFT", 0, -ICON_GAP, "INV_Drink_24_SealWhey") IconOff(treeFoodBtn) treeFoodBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT") GameTooltip:SetFrameLevel(menu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Food and Drink|r |cff999999- |r|cffC79C3Bfood|r |cff00cc00NC|r", 1, 0.82, 0) - GameTooltip:AddLine("|cffffcc00Eat and drink after combat|r", 1, 1, 1) - GameTooltip:AddLine("Bot eats food and drinks water to restore", 1, 1, 1) - GameTooltip:AddLine("|cffffcc00health|r and |cff3A8FC4mana|r between fights.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00Menjar i Beure|r |cff999999- |r|cffC79C3Bfood|r |cff00cc00NC|r", 1, 0.82, 0) + GameTooltip:AddLine("|cffffcc00Menjar i beure després del combat|r", 1, 1, 1) + GameTooltip:AddLine("El Bot menja i beu aigua per a restaurar", 1, 1, 1) + GameTooltip:AddLine("|cffffcc00salut|r i |cff3A8FC4manà|r entre combats.", 1, 1, 1) GameTooltip:Show() end) treeFoodBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -426,16 +426,16 @@ function PBM.CreateCharSheet(config) end) menu.treeFoodBtn = treeFoodBtn - -- Row 5: Loot (toggle NC) + -- Fila 5: Botí / Saqueig (commutar NC) local treeLootBtn = MakeLeftBtn(treeFoodBtn, "BOTTOMLEFT", 0, -ICON_GAP, "INV_Misc_Coin_16") IconOff(treeLootBtn) treeLootBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT") GameTooltip:SetFrameLevel(menu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Loot|r |cff999999- |r|cffC79C3Bloot|r |cff00cc00NC|r", 1, 0.82, 0) - GameTooltip:AddLine("|cffffcc00Auto loot bodies|r", 1, 1, 1) - GameTooltip:AddLine("Bot loots killed enemies automatically.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00Botí|r |cff999999- |r|cffC79C3Bloot|r |cff00cc00NC|r", 1, 0.82, 0) + GameTooltip:AddLine("|cffffcc00Saquejar cossos automàticament|r", 1, 1, 1) + GameTooltip:AddLine("El Bot es queda el botí dels enemics morts automàticament.", 1, 1, 1) GameTooltip:Show() end) treeLootBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -450,16 +450,16 @@ function PBM.CreateCharSheet(config) end) menu.treeLootBtn = treeLootBtn - -- Row 6: Gather (toggle NC) +-- Fila 6: Recol·lectar (commutar NC) local treeGatherBtn = MakeLeftBtn(treeLootBtn, "BOTTOMLEFT", 0, -ICON_GAP, "Trade_Mining") IconOff(treeGatherBtn) treeGatherBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT") GameTooltip:SetFrameLevel(menu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Gather|r |cff999999- |r|cffC79C3Bgather|r |cff00cc00NC|r", 1, 0.82, 0) - GameTooltip:AddLine("|cffffcc00Gather resource nodes|r", 1, 1, 1) - GameTooltip:AddLine("Bot harvests nearby resource nodes.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00Recol·lectar|r |cff999999- |r|cffC79C3Bgather|r |cff00cc00NC|r", 1, 0.82, 0) + GameTooltip:AddLine("|cffffcc00Recol·lectar nodes de recursos|r", 1, 1, 1) + GameTooltip:AddLine("El Bot recol·lecta els nodes de recursos propers.", 1, 1, 1) GameTooltip:Show() end) treeGatherBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -474,9 +474,9 @@ function PBM.CreateCharSheet(config) end) menu.treeGatherBtn = treeGatherBtn - -- ── PvP toggle (universal — appears in all class menus) ────────────────── - local PVP_HDR_W = ICON_SIZE + 8 -- 34px header centers the 26px button - local pvpHdrOffX = 72 -- pixels right of talentBtn's left edge + -- ── Commutador de PvP (universal — apareix a tots els menús de classe) ── + local PVP_HDR_W = ICON_SIZE + 8 -- La capçalera de 34px centra el botó de 26px + local pvpHdrOffX = 72 -- Píxels a la dreta de la vora esquerra de talentBtn do local pvpBox = CreateFrame("Frame", nil, menu) @@ -487,7 +487,7 @@ function PBM.CreateCharSheet(config) pvpBox:SetBackdropBorderColor(0.78, 0.61, 0.23, 0.9) local fs = pvpBox:CreateFontString(nil, "OVERLAY") fs:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") - fs:SetTextColor(0.93, 0.27, 0.20, 1) -- red (ee4433) + fs:SetTextColor(0.93, 0.27, 0.20, 1) -- vermell (ee4433) fs:SetAllPoints() fs:SetJustifyH("CENTER") fs:SetText("PvP") @@ -510,8 +510,8 @@ function PBM.CreateCharSheet(config) GameTooltip:SetFrameLevel(menu:GetFrameLevel() + 20) GameTooltip:ClearLines() GameTooltip:SetText("|cffffff00PvP|r |cff999999- |r|cffee4433PvP|r |cffffcc00NC|r") - GameTooltip:AddLine("Activates player targeting.", 1, 1, 1) - GameTooltip:AddLine("Rotations are unchanged.", 1, 1, 1) + GameTooltip:AddLine("Activa la selecció de jugadors com a objectiu.", 1, 1, 1) + GameTooltip:AddLine("Les rotacions no canvien.", 1, 1, 1) GameTooltip:Show() end) treePvpBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -526,7 +526,7 @@ function PBM.CreateCharSheet(config) end) menu.treePvpBtn = treePvpBtn - -- ── Base resetSharedIcons (class file extends this for tree buttons) ─────── + -- ── Base resetSharedIcons (el fitxer de classe ho estén per als botons de l'arbre) ─ menu.resetSharedIcons = function() IconOff(treeFoodBtn) IconOff(treeLootBtn) @@ -534,7 +534,7 @@ function PBM.CreateCharSheet(config) IconOff(treePvpBtn) end - -- ── Base onStrategyUpdate (handles NC food/loot/gather + CO pvp state) ────── + -- ── Base onStrategyUpdate (gestiona NC food/loot/gather + estat de CO pvp) ─ local _baseSU = menu.onStrategyUpdate menu.onStrategyUpdate = function(stratType, activeSet) if _baseSU then _baseSU(stratType, activeSet) end @@ -550,7 +550,7 @@ function PBM.CreateCharSheet(config) -- ── onWhoResponse ───────────────────────────────────────────────────────── menu.onWhoResponse = function(sender, msg) - local race = msg:match("([%a ]+) %[") + local race = msg:match("([%a ]+) %[" ) local spec = msg:match("%] ([%a ]+) %(") local talents = msg:match("%((%d+/%d+/%d+)%)") local class = msg:match("%d+/%d+/%d+%) (%a+) %(%d+ lvl%)") @@ -570,11 +570,11 @@ function PBM.CreateCharSheet(config) menu.statLine1:SetText(gold and ("|cffFFD100" .. gold .. "g|r") or "") if bag then local used, total = bag:match("(%d+)/(%d+)") - -- Use the exact color the playerbot applied to the bag count in its whisper. - -- rawMsg still has the |cAARRGGBB code immediately before the "N/N" value. + -- Utilitza el color exacte que el playerbot ha aplicat al recompte de la bossa en el seu xat privat. + -- rawMsg encara té el codi |cAARRGGBB immediatament abans del valor "N/N". local bagHex = rawMsg and rawMsg:match("|c(%x%x%x%x%x%x%x%x)%d+/%d+") local colorTag = bagHex and ("|c" .. bagHex) or "|cffFFFFFF" - menu.statLine2:SetText(colorTag .. used .. "/" .. total .. "|r|cffFFFFFF Bag|r") + menu.statLine2:SetText(colorTag .. used .. "/" .. total .. "|r|cffFFFFFF Bossa|r") else menu.statLine2:SetText("") end @@ -582,17 +582,17 @@ function PBM.CreateCharSheet(config) local t = (tonumber(dur) or 0) / 100 local r = math.floor(math.min(1, t * 2) * 255) local g = math.floor(math.min(1, (1 - t) * 2) * 255) - menu.statLine3:SetText("|cff" .. string.format("%02x%02x00", r, g) .. dur .. "% Durability|r") + menu.statLine3:SetText("|cff" .. string.format("%02x%02x00", r, g) .. dur .. "% Durabilitat|r") else menu.statLine3:SetText("") end end - -- ── Bottom notes (left-aligned, right of Ignored Spell List, single line) ── + -- ── Notes inferiors (alineades a l'esquerra, a la dreta de Ignored Spell List, línia única) ── local noteFont = "Fonts\\FRIZQT__.TTF" local noteSize = 9 local noteColor = { 0.70, 0.70, 0.70, 1 } - local noteX = 138 -- clears the 115px ignored-spell-list (at x=15) + gap + local noteX = 138 -- Deixa espai per a la llista d'hechizos ignorats de 115px (a x=15) + espaiat local note2 = menu:CreateFontString(nil, "OVERLAY") note2:SetFont(noteFont, noteSize, "OUTLINE") @@ -600,7 +600,7 @@ function PBM.CreateCharSheet(config) note2:SetWordWrap(false) note2:SetJustifyH("LEFT") note2:SetPoint("BOTTOMLEFT", menu, "BOTTOMLEFT", noteX, 8) - note2:SetText("|cffFFD100Note:|r During raid encounters, strategies are based on spec and are automatically overwritten. To change bot behavior, use a different template or spec.") + note2:SetText("|cffFFD100Nota:|r Durant els trobades de banda, les estratègies es basen en l'especialització i es sobreescriuen automàticament. Per canviar el comportament del bot, utilitza una altra plantilla o especialització.") local note1 = menu:CreateFontString(nil, "OVERLAY") note1:SetFont(noteFont, noteSize, "OUTLINE") @@ -608,7 +608,7 @@ function PBM.CreateCharSheet(config) note1:SetWordWrap(false) note1:SetJustifyH("LEFT") note1:SetPoint("BOTTOMLEFT", note2, "TOPLEFT", 0, 4) - note1:SetText("|cffFFD100Note:|r The Strategy List on the right is what the bot actually uses. The center buttons are for changes/visual reference. Confirm the list reflects your setup.") + note1:SetText("|cffFFD100Nota:|r La llista d'estratègies de la dreta és la que utilitza realment el bot. Els botons centrals són per a canvis/referència visual. Confirma que la llista reflecteix la teva configuració.") local note0 = menu:CreateFontString(nil, "OVERLAY") note0:SetFont(noteFont, noteSize, "OUTLINE") @@ -616,16 +616,16 @@ function PBM.CreateCharSheet(config) note0:SetWordWrap(false) note0:SetJustifyH("LEFT") note0:SetPoint("BOTTOMLEFT", note1, "TOPLEFT", 0, 4) - note0:SetText("|cffFFD100Note:|r For quick setup, use the Templates menu in the top-left corner of each character tab. This will automatically configure both talents and strategies for you.") + note0:SetText("|cffFFD100Nota:|r Per a una configuració ràpida, utilitza el menú Plantilles a la cantonada superior esquerra de cada pestanya de personatge. Això configurarà automàticament tant els talents com les estratègies per a tu.") local stratNoteLabel = menu:CreateFontString(nil, "OVERLAY") stratNoteLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") - stratNoteLabel:SetText("|cffff4444** Strategies are subject to change.|r") + stratNoteLabel:SetText("|cffff4444** Les estratègies estan subjectes a canvis.|r") stratNoteLabel:SetPoint("BOTTOMLEFT", menu, "BOTTOMLEFT", 8, 52) stratNoteLabel:SetPoint("BOTTOMRIGHT", menu, "BOTTOMRIGHT", -8, 52) stratNoteLabel:SetJustifyH("CENTER") - -- ── CO ! / NC ! Reset buttons (above notes) ────────────────────────────── + -- ── Botons de reinici de CO ! / NC ! (a sobre de les notes) ─────────────── local RESET_BOX_BD = { bgFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", @@ -635,7 +635,7 @@ function PBM.CreateCharSheet(config) local resetBtnW = 26 local resetBtnH = 18 local resetBtnGap = 4 - local resetTotalW = resetBtnW * 2 + resetBtnGap -- 34px, matches PVP_HDR_W + local resetTotalW = resetBtnW * 2 + resetBtnGap -- 34px, coincideix amb PVP_HDR_W local coResetBtn = CreateFrame("Button", nil, menu) coResetBtn:SetSize(resetBtnW, resetBtnH) @@ -657,9 +657,9 @@ function PBM.CreateCharSheet(config) GameTooltip:SetOwner(self, "ANCHOR_LEFT") GameTooltip:SetFrameLevel(menu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffFFD100Reset CO Strategies|r") - GameTooltip:AddLine("Resets combat strategies to defaults.", 1, 1, 1) - GameTooltip:AddLine("Non-combat strategies are preserved.", 1, 1, 1) + GameTooltip:SetText("|cffFFD100Reiniciar estratègies de CO|r") + GameTooltip:AddLine("Restableix les estratègies de combat als valors per defecte.", 1, 1, 1) + GameTooltip:AddLine("Les estratègies de fora de combat es mantenen.", 1, 1, 1) GameTooltip:Show() end) coResetBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -684,9 +684,9 @@ function PBM.CreateCharSheet(config) GameTooltip:SetOwner(self, "ANCHOR_LEFT") GameTooltip:SetFrameLevel(menu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffFFD100Reset NC Strategies|r") - GameTooltip:AddLine("Resets non-combat strategies to defaults.", 1, 1, 1) - GameTooltip:AddLine("Combat strategies are preserved.", 1, 1, 1) + GameTooltip:SetText("|cffFFD100Reiniciar estratègies de NC|r") + GameTooltip:AddLine("Restableix les estratègies de fora de combat als valors per defecte.", 1, 1, 1) + GameTooltip:AddLine("Les estratègies de combat es mantenen.", 1, 1, 1) GameTooltip:Show() end) ncResetBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -756,19 +756,19 @@ function PBM.ShowCharSheet(menu, catcher, row, leftExt) if menu.talentsMenu then menu.talentsMenu:Hide() end - -- Update spec icon from row data + -- Actualitza la icona d'especialització a partir de les dades de la fila local specName = rowData and rowData.spec or "" local specIcon = PBM.SPEC_ICONS and PBM.SPEC_ICONS[specName] if menu.specBtn then menu.specBtn.icon:SetTexture(specIcon or "Interface\\Icons\\INV_Misc_QuestionMark") end - -- Refresh prof cell + -- Actualitza la cel·la de professió if menu.profCell then PBM.RefreshProfCell(menu.profCell, menu.botName or "") end - -- Populate gear bar from row data + -- Omple la barra d'equipament a partir de les dades de la fila if menu.hdr and rowData then local h = menu.hdr local gsval = rowData.gs or 0 @@ -789,7 +789,7 @@ function PBM.ShowCharSheet(menu, catcher, row, leftExt) menu._gearLinks = rowData.ilvlLink end - -- Clear strategy display and re-query + -- Neteja la visualització d'estratègies i torna a consultar if menu.clearStratDisplay then menu.clearStratDisplay() end local botName = menu.botName diff --git a/PBM/PBM_ClassTabs.lua b/PBM/PBM_ClassTabs.lua index 759e033..0c1eabb 100644 --- a/PBM/PBM_ClassTabs.lua +++ b/PBM/PBM_ClassTabs.lua @@ -420,7 +420,7 @@ function PBM.BuildRows(parent, yStart) if d and d.name and d.name ~= "" then dragTex:SetVertexColor(0.9, 0.7, 0.1, 1.0) GameTooltip:SetOwner(dragBtn, "ANCHOR_RIGHT") - GameTooltip:AddLine("Drag to reorder", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Drag to reorder"], 1, 1, 1) GameTooltip:Show() end end @@ -458,7 +458,7 @@ function PBM.BuildRows(parent, yStart) if row.dbIndex and LichborneTrackerDB.rows[row.dbIndex] then local spec = LichborneTrackerDB.rows[row.dbIndex].spec or "" GameTooltip:SetOwner(specBtn, "ANCHOR_RIGHT") - GameTooltip:AddLine(spec ~= "" and spec or "No spec set", 1, 1, 1) + GameTooltip:AddLine(spec ~= "" and spec or PBM_L["No spec set"], 1, 1, 1) GameTooltip:Show() end end) @@ -572,10 +572,10 @@ function PBM.BuildRows(parent, yStart) arb:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") arb:SetScript("OnEnter", function() GameTooltip:SetOwner(arb, "ANCHOR_RIGHT") - GameTooltip:AddLine("|cff44ff44+ Add to Raid|r", 1, 1, 1) - GameTooltip:AddLine("Adds to the Raid tab.", 0.7, 0.7, 0.7) - GameTooltip:AddLine("|cff44ff44Left-click to add to raid.|r", 1, 1, 1) - GameTooltip:AddLine("|cffff2020Right-click to remove.|r", 1, 1, 1) + GameTooltip:AddLine("|cff44ff44" .. PBM_L["+ Add to Raid"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Adds to the Raid tab."], 0.7, 0.7, 0.7) + GameTooltip:AddLine("|cff44ff44" .. PBM_L["Left-click to add to raid."] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffff2020" .. PBM_L["Right-click to remove."] .. "|r", 1, 1, 1) GameTooltip:Show() end) arb:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -592,9 +592,9 @@ function PBM.BuildRows(parent, yStart) agb:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") agb:SetScript("OnEnter", function() GameTooltip:SetOwner(agb, "ANCHOR_RIGHT") - GameTooltip:AddLine("|cff44eeff> Invite to Group|r", 1, 1, 1) - GameTooltip:AddLine("|cff44ff44Left-click to invite to group.|r", 1, 1, 1) - GameTooltip:AddLine("|cffff2020Right-click to remove.|r", 1, 1, 1) + GameTooltip:AddLine("|cff44eeff" .. PBM_L["> Invite to Group"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cff44ff44" .. PBM_L["Left-click to invite to group."] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffff2020" .. PBM_L["Right-click to remove."] .. "|r", 1, 1, 1) GameTooltip:Show() end) agb:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -610,8 +610,8 @@ function PBM.BuildRows(parent, yStart) db:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") db:SetScript("OnEnter", function() GameTooltip:SetOwner(db, "ANCHOR_RIGHT") - GameTooltip:AddLine("Remove Character", 1, 0.3, 0.3) - GameTooltip:AddLine("Removes from tracker.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Remove Character"], 1, 0.3, 0.3) + GameTooltip:AddLine(PBM_L["Removes from tracker."], 0.8, 0.8, 0.8) GameTooltip:Show() end) db:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -673,7 +673,7 @@ function PBM.SetNeedsCellMode(mode) end if PBM.State.needsProfHdrLabel then PBM.State.needsProfHdrLabel:SetText( - mode == "prof" and "|cffd4af37Prof.|r" or "|cffd4af37Need|r") + mode == "prof" and "|cffd4af37" .. PBM_L["Prof."] .. "|r" or "|cffd4af37" .. PBM_L["Need"] .. "|r") end end @@ -837,7 +837,7 @@ function PBM.RefreshRows() roster[ri] = {name="", cls="", spec="", gs=0, realGs=0, role="", notes=""} row.addRaidBtn:SetText("|cff44ff44+|r") if LichborneAddStatus then - LichborneAddStatus:SetText(hex..srcData.name.."|r removed from raid slot "..slot..".") + LichborneAddStatus:SetText(hex..srcData.name.."|r " .. PBM_L["removed from raid slot"] .. " "..slot..".") end if LichborneRaidFrame then PBM.RefreshRaidRows() end PBM.RefreshRows() @@ -855,9 +855,9 @@ function PBM.RefreshRows() local c2 = PBM.CLASS_COLORS[srcData.cls] local hex2 = c2 and string.format("|cff%02x%02x%02x", math.floor(c2.r*255), math.floor(c2.g*255), math.floor(c2.b*255)) or "|cffffffff" if LichborneAddStatus then - LichborneAddStatus:SetText(hex2..srcData.name.."|r is already in the Raid.") + LichborneAddStatus:SetText(hex2..srcData.name.."|r " .. PBM_L["is already in the Raid."]) end - LichborneOutput("|cffC69B3APBM:|r "..hex2..srcData.name.."|r is already in the Raid.", 1, 0.5, 0.5) + LichborneOutput("|cffC69B3APBM:|r "..hex2..srcData.name.."|r " .. PBM_L["is already in the Raid."], 1, 0.5, 0.5) return end end @@ -870,8 +870,8 @@ function PBM.RefreshRows() end end if not slot then - local raidLabel = LichborneTrackerDB.raidName or "Raid" - LichborneOutput("|cffC69B3APBM:|r "..raidLabel.." is full ("..maxSlots.."/"..maxSlots..").", 1, 0.5, 0.5) + local raidLabel = LichborneTrackerDB.raidName or PBM_L["Raid"] + LichborneOutput("|cffC69B3APBM:|r "..raidLabel.." " .. PBM_L["is full"] .. " ("..maxSlots.."/"..maxSlots..").", 1, 0.5, 0.5) return end roster[slot] = { @@ -883,9 +883,9 @@ function PBM.RefreshRows() role = "", notes = "", } - LichborneOutput("|cffC69B3APBM:|r Added "..hex..srcData.name.."|r to Raid slot "..slot..".", 1, 0.85, 0) + LichborneOutput("|cffC69B3APBM:|r " .. PBM_L["Added"] .. " "..hex..srcData.name.."|r " .. PBM_L["to Raid slot"] .. " "..slot..".", 1, 0.85, 0) if LichborneAddStatus then - LichborneAddStatus:SetText(hex..srcData.name.."|r added to raid slot "..slot..".") + LichborneAddStatus:SetText(hex..srcData.name.."|r " .. PBM_L["added to raid slot"] .. " "..slot..".") end -- Color + orange after successful add row.addRaidBtn:SetText("|cffb25b00+|r") @@ -904,13 +904,13 @@ function PBM.RefreshRows() if btn == "RightButton" then UninviteUnit(srcData.name) SendChatMessage(".playerbots bot remove "..srcData.name, "SAY") - LichborneOutput("|cffC69B3APBM:|r Removed "..hex..srcData.name.."|r from bots.", 1, 0.85, 0) + LichborneOutput("|cffC69B3APBM:|r " .. PBM_L["Removed"] .. " "..hex..srcData.name.."|r " .. PBM_L["from bots."], 1, 0.85, 0) return end SendChatMessage(".playerbots bot add "..srcData.name, "SAY") - LichborneOutput("|cffC69B3APBM:|r Inviting "..hex..srcData.name.."|r to group...", 1, 0.85, 0) + LichborneOutput("|cffC69B3APBM:|r " .. PBM_L["Inviting"] .. " "..hex..srcData.name.."|r " .. PBM_L["to group..."], 1, 0.85, 0) if LichborneAddStatus then - LichborneAddStatus:SetText("Invited "..hex..srcData.name.."|r to group.") + LichborneAddStatus:SetText(PBM_L["Invited"] .. " "..hex..srcData.name.."|r " .. PBM_L["to group..."]) end end) end @@ -1050,7 +1050,7 @@ function PBM.BuildIgnoredSpellTable() local hdr = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") hdr:SetPoint("TOP", f, "TOP", 0, -6) - hdr:SetText("|cffd4af37Ignored Spell List|r") + hdr:SetText("|cffd4af37" .. PBM_L["Ignored Spell List"] .. "|r") for i = 1, NUM_IGNORE_ROWS do local fs = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") @@ -1087,4 +1087,4 @@ function PBM.RefreshIgnoredSpellTable() local spell = spells[offset + i] PBM.State.ignoredSpellRows[i]:SetText(spell or "") end -end +end \ No newline at end of file diff --git a/PBM/PBM_Commands.lua b/PBM/PBM_Commands.lua index 25af3e4..c9e4c41 100644 --- a/PBM/PBM_Commands.lua +++ b/PBM/PBM_Commands.lua @@ -13,14 +13,14 @@ function PBM.SendToGroup(cmd) elseif GetNumPartyMembers() > 0 then SendChatMessage(cmd, "PARTY") else - DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r Not in a group.") + DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. PBM_L["Not in a group."]) end end -- Whisper a command to a specific bot by name. function PBM.SendToBot(cmd, name) if not name or name == "" then - DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r No bot name specified.") + DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. PBM_L["No bot name specified."]) return end -- Track CO/NC type so unsolicited Strategies replies route correctly @@ -57,4 +57,4 @@ end -- role: "tank" | "healer" | "dps" | "melee" | "ranged" | "groupN" function PBM.SendToRole(role, cmd) PBM.SendToGroup("@" .. role .. " " .. cmd) -end +end \ No newline at end of file diff --git a/PBM/PBM_Constants.lua b/PBM/PBM_Constants.lua index 216cbaa..a71f1dc 100644 --- a/PBM/PBM_Constants.lua +++ b/PBM/PBM_Constants.lua @@ -1,5 +1,5 @@ -- ============================================================ --- LBT_Constants.lua | Pure data — no logic, no UI, no state +-- PBM_Constants.lua | Pure data — no logic, no UI, no state -- ============================================================ PBM = PBM or {} @@ -7,7 +7,12 @@ PBM.MAX_RAID_SLOTS = 40 PBM.ROW_HEIGHT = 24 PBM.GEAR_SLOTS = 17 PBM.MAX_ROWS = 18 -PBM.SLOT_ABBR = {"Head","Neck","Shldr","Back","Chest","Wrist","Hands","Waist","Legs","Feet","Ring1","Ring2","Trnk1","Trnk2","MH","OH","Rngd"} +PBM.SLOT_ABBR = { + PBM_L["Head"], PBM_L["Neck"], PBM_L["Shldr"], PBM_L["Back"], + PBM_L["Chest"], PBM_L["Wrist"], PBM_L["Hands"], PBM_L["Waist"], + PBM_L["Legs"], PBM_L["Feet"], PBM_L["Ring1"], PBM_L["Ring2"], + PBM_L["Trnk1"], PBM_L["Trnk2"], PBM_L["MH"], PBM_L["OH"], PBM_L["Rngd"] +} PBM.GS_SCALE = 1.8618 PBM.GS_ITEM_TYPES = { @@ -53,21 +58,21 @@ PBM.GS_FORMULA = { -- ── Needs ───────────────────────────────────────────────────── PBM.NEEDS_SLOTS = { - { key="head", icon="Interface\\Icons\\INV_Helmet_03", label="Head" }, - { key="neck", icon="Interface\\Icons\\INV_Jewelry_Necklace_07", label="Neck" }, - { key="shoulder",icon="Interface\\Icons\\INV_Shoulder_22", label="Shoulders" }, - { key="back", icon="Interface\\Icons\\INV_Misc_Cape_07", label="Back" }, - { key="chest", icon="Interface\\Icons\\INV_Chest_Cloth_04", label="Chest" }, - { key="wrist", icon="Interface\\Icons\\INV_Bracer_07", label="Wrists" }, - { key="hands", icon="Interface\\Icons\\INV_Gauntlets_04", label="Hands" }, - { key="waist", icon="Interface\\Icons\\INV_Belt_13", label="Waist" }, - { key="legs", icon="Interface\\Icons\\INV_Pants_06", label="Legs" }, - { key="feet", icon="Interface\\Icons\\INV_Boots_05", label="Feet" }, - { key="ring", icon="Interface\\Icons\\INV_Jewelry_Ring_02", label="Ring" }, - { key="trinket", icon="Interface\\Icons\\INV_Misc_Rune_06", label="Trinket" }, - { key="mh", icon="Interface\\Icons\\INV_Sword_27", label="Main Hand" }, - { key="oh", icon="Interface\\Icons\\INV_Shield_06", label="Off Hand" }, - { key="ranged", icon="Interface\\Icons\\INV_Weapon_Bow_07", label="Ranged" }, + { key="head", icon="Interface\\Icons\\INV_Helmet_03", label=PBM_L["Head"] }, + { key="neck", icon="Interface\\Icons\\INV_Jewelry_Necklace_07", label=PBM_L["Neck"] }, + { key="shoulder",icon="Interface\\Icons\\INV_Shoulder_22", label=PBM_L["Shoulders"] }, + { key="back", icon="Interface\\Icons\\INV_Misc_Cape_07", label=PBM_L["Back"] }, + { key="chest", icon="Interface\\Icons\\INV_Chest_Cloth_04", label=PBM_L["Chest"] }, + { key="wrist", icon="Interface\\Icons\\INV_Bracer_07", label=PBM_L["Wrists"] }, + { key="hands", icon="Interface\\Icons\\INV_Gauntlets_04", label=PBM_L["Hands"] }, + { key="waist", icon="Interface\\Icons\\INV_Belt_13", label=PBM_L["Waist"] }, + { key="legs", icon="Interface\\Icons\\INV_Pants_06", label=PBM_L["Legs"] }, + { key="feet", icon="Interface\\Icons\\INV_Boots_05", label=PBM_L["Feet"] }, + { key="ring", icon="Interface\\Icons\\INV_Jewelry_Ring_02", label=PBM_L["Ring"] }, + { key="trinket", icon="Interface\\Icons\\INV_Misc_Rune_06", label=PBM_L["Trinket"] }, + { key="mh", icon="Interface\\Icons\\INV_Sword_27", label=PBM_L["Main Hand"] }, + { key="oh", icon="Interface\\Icons\\INV_Shield_06", label=PBM_L["Off Hand"] }, + { key="ranged", icon="Interface\\Icons\\INV_Weapon_Bow_07", label=PBM_L["Ranged"] }, } PBM.NEEDS_ICON_SIZE = 18 PBM.MAX_NEEDS = 2 @@ -75,20 +80,20 @@ PBM.MAX_NEEDS = 2 -- ── Profession Slots ──────────────────────────────────────────── PBM.PROF_SLOTS = { -- Row 1 (crafting professions) - { key="alchemy", icon="Interface\\Icons\\Trade_Alchemy", label="Alchemy" }, - { key="blacksmithing", icon="Interface\\Icons\\Trade_BlackSmithing", label="Blacksmithing" }, - { key="jewelcrafting", icon="Interface\\Icons\\INV_Misc_Gem_01", label="Jewelcrafting" }, - { key="enchanting", icon="Interface\\Icons\\Trade_Engraving", label="Enchanting" }, - { key="engineering", icon="Interface\\Icons\\Trade_Engineering", label="Engineering" }, - { key="leatherworking", icon="Interface\\Icons\\Trade_LeatherWorking", label="Leatherworking" }, - { key="tailoring", icon="Interface\\Icons\\Trade_Tailoring", label="Tailoring" }, + { key="alchemy", icon="Interface\\Icons\\Trade_Alchemy", label=PBM_L["Alchemy"] }, + { key="blacksmithing", icon="Interface\\Icons\\Trade_BlackSmithing", label=PBM_L["Blacksmithing"] }, + { key="jewelcrafting", icon="Interface\\Icons\\INV_Misc_Gem_01", label=PBM_L["Jewelcrafting"] }, + { key="enchanting", icon="Interface\\Icons\\Trade_Engraving", label=PBM_L["Enchanting"] }, + { key="engineering", icon="Interface\\Icons\\Trade_Engineering", label=PBM_L["Engineering"] }, + { key="leatherworking", icon="Interface\\Icons\\Trade_LeatherWorking", label=PBM_L["Leatherworking"] }, + { key="tailoring", icon="Interface\\Icons\\Trade_Tailoring", label=PBM_L["Tailoring"] }, -- Row 2 (gathering / secondary professions) - { key="inscription", icon="Interface\\Icons\\INV_Inscription_Tradeskill01", label="Inscription" }, - { key="herbalism", icon="Interface\\Icons\\Trade_Herbalism", label="Herbalism" }, - { key="mining", icon="Interface\\Icons\\Trade_Mining", label="Mining" }, - { key="skinning", icon="Interface\\Icons\\INV_Misc_Pelt_Wolf_01", label="Skinning" }, - { key="cooking", icon="Interface\\Icons\\INV_Misc_Food_15", label="Cooking" }, - { key="fishing", icon="Interface\\Icons\\Trade_Fishing", label="Fishing" }, + { key="inscription", icon="Interface\\Icons\\INV_Inscription_Tradeskill01", label=PBM_L["Inscription"] }, + { key="herbalism", icon="Interface\\Icons\\Trade_Herbalism", label=PBM_L["Herbalism"] }, + { key="mining", icon="Interface\\Icons\\Trade_Mining", label=PBM_L["Mining"] }, + { key="skinning", icon="Interface\\Icons\\INV_Misc_Pelt_Wolf_01", label=PBM_L["Skinning"] }, + { key="cooking", icon="Interface\\Icons\\INV_Misc_Food_15", label=PBM_L["Cooking"] }, + { key="fishing", icon="Interface\\Icons\\Trade_Fishing", label=PBM_L["Fishing"] }, } PBM.MAX_PROFS = 2 PBM.MAX_CHAR_ROLES = 2 @@ -167,13 +172,13 @@ PBM.CLASS_COLORS = { PBM.CLASS_TABS = {"Death Knight","Druid","Hunter","Mage","Paladin","Priest","Rogue","Shaman","Warlock","Warrior","Raid","Overview"} -- Overrides TAB_LABELS for the tab buttons only (avg bars etc still use TAB_LABELS) PBM.TAB_BUTTON_LABELS = { - ["Death Knight"] = "Death Knight", + ["Death Knight"] = PBM_L["Death Knight"], } PBM.TAB_LABELS = { - ["Death Knight"]="DK",["Druid"]="Druid",["Hunter"]="Hunter",["Mage"]="Mage", - ["Paladin"]="Paladin",["Priest"]="Priest",["Rogue"]="Rogue",["Shaman"]="Shaman", - ["Warlock"]="Warlock",["Warrior"]="Warrior",["Group"]="Group",["Raid"]="Raid",["Overview"]="Overview", + ["Death Knight"]="DK",["Druid"]=PBM_L["Druid"],["Hunter"]=PBM_L["Hunter"],["Mage"]=PBM_L["Mage"], + ["Paladin"]=PBM_L["Paladin"],["Priest"]=PBM_L["Priest"],["Rogue"]=PBM_L["Rogue"],["Shaman"]=PBM_L["Shaman"], + ["Warlock"]=PBM_L["Warlock"],["Warrior"]=PBM_L["Warrior"],["Group"]=PBM_L["Group"],["Raid"]=PBM_L["Raid"],["Overview"]=PBM_L["Overview"], } -- Tier tables moved to IPTiersColor.lua (single source of truth). @@ -181,9 +186,9 @@ PBM.TAB_LABELS = { -- and TIER_TOOLTIP_RAIDS are all defined there. PBM.ROLE_DEFS = { - {key="TNK", label="Tank", color={r=0.00,g=0.44,b=0.87}, icon="Interface\\Icons\\Ability_Warrior_DefensiveStance"}, -- Rare blue - {key="HLR", label="Healer", color={r=0.12,g=1.00,b=0.00}, icon="Interface\\Icons\\Spell_ChargePositive"}, -- Uncommon green - {key="DPS", label="DPS", color={r=1.00,g=0.50,b=0.00}, icon="Interface\\Icons\\Ability_DualWield"}, -- Legendary orange + {key="TNK", label=PBM_L["Tank"], color={r=0.00,g=0.44,b=0.87}, icon="Interface\\Icons\\Ability_Warrior_DefensiveStance"}, -- Rare blue + {key="HLR", label=PBM_L["Healer"], color={r=0.12,g=1.00,b=0.00}, icon="Interface\\Icons\\Spell_ChargePositive"}, -- Uncommon green + {key="DPS", label=PBM_L["DPS"], color={r=1.00,g=0.50,b=0.00}, icon="Interface\\Icons\\Ability_DualWield"}, -- Legendary orange } PBM.ROLE_BY_KEY = {} for _, rd in ipairs(PBM.ROLE_DEFS) do PBM.ROLE_BY_KEY[rd.key] = rd end @@ -240,11 +245,11 @@ PBM.QUALITY_COLORS = { -- Sort PBM.SORT_GOLD = "|cffd4af37" PBM.SORT_OPTS = { - {key="gs", label="GS", numeric=true}, - {key="ilvl", label="iLvL", numeric=true}, - {key="name", label="Name", numeric=false}, - {key="spec", label="Spec", numeric=false}, - {key="role", label="Role", numeric=false}, + {key="gs", label=PBM_L["GS"], numeric=true}, + {key="ilvl", label=PBM_L["iLvL"], numeric=true}, + {key="name", label=PBM_L["Name"], numeric=false}, + {key="spec", label=PBM_L["Spec"], numeric=false}, + {key="role", label=PBM_L["Role"], numeric=false}, } -- Overview layout @@ -265,4 +270,4 @@ PBM.ROLE_ORDER_HLR = {HLR=1, TNK=2, DPS=3} PBM.MAX_SPEC_RETRIES = 6 -- Bottom tab IDs in display order (used by visibility toggles) -PBM.BOTTOM_TAB_IDS = {"Playerbots", "IndividualProgression", "LevelSync", "Notes"} +PBM.BOTTOM_TAB_IDS = {"Playerbots", "IndividualProgression", "LevelSync", "Notes"} \ No newline at end of file diff --git a/PBM/PBM_Core.lua b/PBM/PBM_Core.lua index be94454..f2a3ae1 100644 --- a/PBM/PBM_Core.lua +++ b/PBM/PBM_Core.lua @@ -409,7 +409,7 @@ local function ColorizeStrategies(msg, cls) parts[#parts + 1] = "|cff" .. color .. name .. "|r" end end - return "|cffd4af37Strategies:|r " .. table.concat(parts, "|cff666666, |r") + return "|cffd4af37" .. PBM_L["Strategies:"] .. "|r " .. table.concat(parts, "|cff666666, |r") end -- Map lowercased spec names from bot login messages to PBM spec names @@ -644,7 +644,7 @@ function PBM.CreateModuleFrame(name, key, width, height) titleStr:SetTextColor(0.9, 0.9, 0.9, 1) -- Close button - local closeBtn = CreateFrame("Button", nil, header) + closeBtn = CreateFrame("Button", nil, header) closeBtn:SetSize(14, 14) closeBtn:SetPoint("RIGHT", header, "RIGHT", -2, 0) closeBtn:SetNormalTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Up") @@ -682,4 +682,4 @@ function PBM.MakeSectionLabel(parent, text, x, y) lbl:SetText(text) lbl:SetTextColor(0.55, 0.55, 0.55, 1) return lbl -end +end \ No newline at end of file diff --git a/PBM/PBM_DeathKnight.lua b/PBM/PBM_DeathKnight.lua index 0acfeb8..4f2280e 100644 --- a/PBM/PBM_DeathKnight.lua +++ b/PBM/PBM_DeathKnight.lua @@ -21,13 +21,13 @@ local function PBM_TimerAfter(delay, func) end local DK_TALENT_SPECS = { - { label="Blood |cffffcc00PvE|r", spec="blood pve", wowSpec="Blood", icon="Interface\\Icons\\Spell_DeathKnight_BloodPresence" }, - { label="Frost |cffffcc00PvE|r", spec="frost pve", wowSpec="Frost DK", icon="Interface\\Icons\\Spell_DeathKnight_FrostPresence" }, - { label="Unholy |cffffcc00PvE|r", spec="unholy pve", wowSpec="Unholy", icon="Interface\\Icons\\Spell_DeathKnight_UnholyPresence" }, - { label="Double Aura Blood |cffffcc00PvE|r", spec="double aura blood pve", wowSpec="Blood", icon="Interface\\Icons\\Spell_DeathKnight_BloodPresence" }, - { label="Blood |cffff4444PvP|r", spec="blood pvp", wowSpec="Blood", icon="Interface\\Icons\\Spell_DeathKnight_BloodPresence" }, - { label="Frost |cffff4444PvP|r", spec="frost pvp", wowSpec="Frost DK", icon="Interface\\Icons\\Spell_DeathKnight_FrostPresence" }, - { label="Unholy |cffff4444PvP|r", spec="unholy pvp", wowSpec="Unholy", icon="Interface\\Icons\\Spell_DeathKnight_UnholyPresence" }, + { label=PBM_L["Blood |cffffcc00PvE|r"], spec="blood pve", wowSpec="Blood", icon="Interface\\Icons\\Spell_DeathKnight_BloodPresence" }, + { label=PBM_L["Frost |cffffcc00PvE|r"], spec="frost pve", wowSpec="Frost DK", icon="Interface\\Icons\\Spell_DeathKnight_FrostPresence" }, + { label=PBM_L["Unholy |cffffcc00PvE|r"], spec="unholy pve", wowSpec="Unholy", icon="Interface\\Icons\\Spell_DeathKnight_UnholyPresence" }, + { label=PBM_L["Double Aura Blood |cffffcc00PvE|r"], spec="double aura blood pve", wowSpec="Blood", icon="Interface\\Icons\\Spell_DeathKnight_BloodPresence" }, + { label=PBM_L["Blood |cffff4444PvP|r"], spec="blood pvp", wowSpec="Blood", icon="Interface\\Icons\\Spell_DeathKnight_BloodPresence" }, + { label=PBM_L["Frost |cffff4444PvP|r"], spec="frost pvp", wowSpec="Frost DK", icon="Interface\\Icons\\Spell_DeathKnight_FrostPresence" }, + { label=PBM_L["Unholy |cffff4444PvP|r"], spec="unholy pvp", wowSpec="Unholy", icon="Interface\\Icons\\Spell_DeathKnight_UnholyPresence" }, } local LichborneDKMenu @@ -52,7 +52,7 @@ function PBM.OpenDKMenu(row) LichborneDKMenu, LichborneDKCatcher = PBM.CreateCharSheet({ menuName = "LichborneDKMenu", catcherName = "LichborneDKCatcher", - className = "Death Knight", + className = PBM_L["Death Knight"], classHex = "C41F3B", leftExt = DK_LEFT_EXT, overlayW = DK_OVL_W, @@ -88,7 +88,7 @@ function PBM.OpenDKMenu(row) local bloodSpecLabel = bloodSpecBox:CreateFontString(nil, "OVERLAY") bloodSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") bloodSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - bloodSpecLabel:SetText("Blood") + bloodSpecLabel:SetText(PBM_L["Blood"]) bloodSpecLabel:SetPoint("LEFT", bloodSpecBox, "LEFT", 18, 0) bloodSpecLabel:SetPoint("RIGHT", bloodSpecBox, "RIGHT", -2, 0) bloodSpecLabel:SetJustifyH("CENTER") @@ -104,9 +104,9 @@ function PBM.OpenDKMenu(row) treeBloodBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDKMenu:GetFrameLevel() + 20) - GameTooltip:SetText("|cffffcc00Blood|r |cff999999- |r|cffC41F3Bblood|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Blood tank specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Frost, Unholy.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Blood"] .. "|r |cff999999- |r|cffC41F3Bblood|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Blood tank specialization"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Frost, Unholy."] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeBloodBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -128,7 +128,7 @@ function PBM.OpenDKMenu(row) local frostSpecLabel = frostSpecBox:CreateFontString(nil, "OVERLAY") frostSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") frostSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - frostSpecLabel:SetText("Frost") + frostSpecLabel:SetText(PBM_L["Frost"]) frostSpecLabel:SetPoint("LEFT", frostSpecBox, "LEFT", 18, 0) frostSpecLabel:SetPoint("RIGHT", frostSpecBox, "RIGHT", -2, 0) frostSpecLabel:SetJustifyH("CENTER") @@ -144,9 +144,9 @@ function PBM.OpenDKMenu(row) treeFrostBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDKMenu:GetFrameLevel() + 20) - GameTooltip:SetText("|cffffcc00Frost|r |cff999999- |r|cffC41F3Bfrost|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Frost DPS specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Blood, Unholy.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Frost"] .. "|r |cff999999- |r|cffC41F3Bfrost|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Frost DPS specialization"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Blood, Unholy."] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeFrostBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -168,7 +168,7 @@ function PBM.OpenDKMenu(row) local unholySpecLabel = unholySpecBox:CreateFontString(nil, "OVERLAY") unholySpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") unholySpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - unholySpecLabel:SetText("Unholy") + unholySpecLabel:SetText(PBM_L["Unholy"]) unholySpecLabel:SetPoint("LEFT", unholySpecBox, "LEFT", 18, 0) unholySpecLabel:SetPoint("RIGHT", unholySpecBox, "RIGHT", -2, 0) unholySpecLabel:SetJustifyH("CENTER") @@ -184,9 +184,9 @@ function PBM.OpenDKMenu(row) treeUnholyBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDKMenu:GetFrameLevel() + 20) - GameTooltip:SetText("|cffffcc00Unholy|r |cff999999- |r|cffC41F3Bunholy|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Unholy DPS specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Blood, Frost.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Unholy"] .. "|r |cff999999- |r|cffC41F3Bunholy|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Unholy DPS specialization"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Blood, Frost."] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeUnholyBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -204,7 +204,7 @@ function PBM.OpenDKMenu(row) local aoeSpecLabel = aoeSpecBox:CreateFontString(nil, "OVERLAY") aoeSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") aoeSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - aoeSpecLabel:SetText("AoE") + aoeSpecLabel:SetText(PBM_L["AoE"]) aoeSpecLabel:SetAllPoints() aoeSpecLabel:SetJustifyH("CENTER") @@ -219,8 +219,8 @@ function PBM.OpenDKMenu(row) treeAoeFrostBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDKMenu:GetFrameLevel() + 20) - GameTooltip:SetText("|cffffcc00Frost AoE|r |cff999999- |r|cffC41F3Bfrost aoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Frost AoE rotation|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Frost AoE"] .. "|r |cff999999- |r|cffC41F3Bfrost aoe|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Frost AoE rotation"] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeAoeFrostBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -239,8 +239,8 @@ function PBM.OpenDKMenu(row) treeAoeUnholyBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDKMenu:GetFrameLevel() + 20) - GameTooltip:SetText("|cffffcc00Unholy AoE|r |cff999999- |r|cffC41F3Bunholy aoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Unholy AoE rotation|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Unholy AoE"] .. "|r |cff999999- |r|cffC41F3Bunholy aoe|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Unholy AoE rotation"] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeAoeUnholyBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -258,7 +258,7 @@ function PBM.OpenDKMenu(row) local assistSpecLabel = assistSpecBox:CreateFontString(nil, "OVERLAY") assistSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") assistSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - assistSpecLabel:SetText("Assist") + assistSpecLabel:SetText(PBM_L["Assist"]) assistSpecLabel:SetAllPoints() assistSpecLabel:SetJustifyH("CENTER") @@ -273,9 +273,9 @@ function PBM.OpenDKMenu(row) treeTankAssistBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDKMenu:GetFrameLevel() + 20) - GameTooltip:SetText("|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Tank target focus|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks the tank's current target.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Tank Assist"] .. "|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Tank target focus"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks the tank's current target."], 1, 1, 1) GameTooltip:Show() end) treeTankAssistBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -294,9 +294,9 @@ function PBM.OpenDKMenu(row) treeDpsAssistBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDKMenu:GetFrameLevel() + 20) - GameTooltip:SetText("|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Assists the main assist target|r", 1, 1, 1) - GameTooltip:AddLine("Bot focuses DPS on the DPS assist target.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["DPS Assist"] .. "|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Assists the main assist target"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot focuses DPS on the DPS assist target."], 1, 1, 1) GameTooltip:Show() end) treeDpsAssistBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -315,8 +315,8 @@ function PBM.OpenDKMenu(row) treeDpsAoeBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDKMenu:GetFrameLevel() + 20) - GameTooltip:SetText("|cffffcc00DPS AoE|r |cff999999- |r|cffff8000dps aoe|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Cross-role AoE mode|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["DPS AoE"] .. "|r |cff999999- |r|cffff8000dps aoe|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Cross-role AoE mode"] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeDpsAoeBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -484,4 +484,4 @@ function PBM.OpenDKMenu(row) HideAllDK(); return end PBM.ShowCharSheet(LichborneDKMenu, LichborneDKCatcher, row, DK_LEFT_EXT) -end +end \ No newline at end of file diff --git a/PBM/PBM_Druid.lua b/PBM/PBM_Druid.lua index dff58e5..cad00f2 100644 --- a/PBM/PBM_Druid.lua +++ b/PBM/PBM_Druid.lua @@ -5,13 +5,13 @@ PBM = PBM or {} -- ───────────────────────────────────────────────────────────────────────────── local DRUID_TALENT_SPECS = { - { label="Balance |cffffcc00PvE|r", spec="balance pve", wowSpec="Balance", icon="Interface\\Icons\\Spell_Nature_StarFall" }, - { label="Bear |cffffcc00PvE|r", spec="bear pve", wowSpec="Feral", icon="Interface\\Icons\\Ability_Racial_BearForm" }, - { label="Restoration |cffffcc00PvE|r", spec="resto pve", wowSpec="Restoration", icon="Interface\\Icons\\Spell_Nature_HealingTouch" }, - { label="Cat |cffffcc00PvE|r", spec="cat pve", wowSpec="Feral", icon="Interface\\Icons\\Ability_Druid_CatForm" }, - { label="Balance |cffff4444PvP|r", spec="balance pvp", wowSpec="Balance", icon="Interface\\Icons\\Spell_Nature_StarFall" }, - { label="Cat |cffff4444PvP|r", spec="cat pvp", wowSpec="Feral", icon="Interface\\Icons\\Ability_Druid_CatForm" }, - { label="Restoration |cffff4444PvP|r", spec="resto pvp", wowSpec="Restoration", icon="Interface\\Icons\\Spell_Nature_HealingTouch" }, + { label=PBM_L["Balance |cffffcc00PvE|r"], spec="balance pve", wowSpec="Balance", icon="Interface\\Icons\\Spell_Nature_StarFall" }, + { label=PBM_L["Bear |cffffcc00PvE|r"], spec="bear pve", wowSpec="Feral", icon="Interface\\Icons\\Ability_Racial_BearForm" }, + { label=PBM_L["Restoration |cffffcc00PvE|r"], spec="resto pve", wowSpec="Restoration", icon="Interface\\Icons\\Spell_Nature_HealingTouch" }, + { label=PBM_L["Cat |cffffcc00PvE|r"], spec="cat pve", wowSpec="Feral", icon="Interface\\Icons\\Ability_Druid_CatForm" }, + { label=PBM_L["Balance |cffff4444PvP|r"], spec="balance pvp", wowSpec="Balance", icon="Interface\\Icons\\Spell_Nature_StarFall" }, + { label=PBM_L["Cat |cffff4444PvP|r"], spec="cat pvp", wowSpec="Feral", icon="Interface\\Icons\\Ability_Druid_CatForm" }, + { label=PBM_L["Restoration |cffff4444PvP|r"], spec="resto pvp", wowSpec="Restoration", icon="Interface\\Icons\\Spell_Nature_HealingTouch" }, } local EXT_ICON_SIZE = 26 @@ -102,13 +102,13 @@ function PBM.OpenDruidMenu(row) -- ── ROW 1 — Spec columns: Bear | Cat | Balance | Restoration ─ local bearSpecBox = MakeSpecBox(LichborneDruidMenu, - TREE_X, TREE_TOP_Y - 16, 70, "Bear", "Interface\\Icons\\Ability_Racial_BearForm") + TREE_X, TREE_TOP_Y - 16, 70, PBM_L["Bear"], "Interface\\Icons\\Ability_Racial_BearForm") local catSpecBox = MakeSpecBox(LichborneDruidMenu, - TREE_X + 74, TREE_TOP_Y - 16, 70, "Cat", "Interface\\Icons\\Ability_Druid_CatForm") + TREE_X + 74, TREE_TOP_Y - 16, 70, PBM_L["Cat"], "Interface\\Icons\\Ability_Druid_CatForm") local balSpecBox = MakeSpecBox(LichborneDruidMenu, - TREE_X + 148, TREE_TOP_Y - 16, 70, "Balance", "Interface\\Icons\\Spell_Nature_StarFall") + TREE_X + 148, TREE_TOP_Y - 16, 70, PBM_L["Balance"], "Interface\\Icons\\Spell_Nature_StarFall") local restoSpecBox = MakeSpecBox(LichborneDruidMenu, - TREE_X + 222, TREE_TOP_Y - 16, 70, "Restoration", "Interface\\Icons\\Spell_Nature_HealingTouch") + TREE_X + 222, TREE_TOP_Y - 16, 70, PBM_L["Restoration"], "Interface\\Icons\\Spell_Nature_HealingTouch") local treeBearBtn = MakeTreeBtn(LichborneDruidMenu, bearSpecBox, "BOTTOMLEFT", 22, -4, "Interface\\Icons\\Ability_Racial_BearForm") local treeCatBtn = MakeTreeBtn(LichborneDruidMenu, catSpecBox, "BOTTOMLEFT", 22, -4, "Interface\\Icons\\Ability_Druid_CatForm") @@ -119,9 +119,9 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Bear|r |cff999999- |r|cffFF7D0Abear|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Dire Bear Form|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Cat, Balance, Heal, Off-Heal.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Bear|r |cff999999- |r|cffFF7D0Abear|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Dire Bear Form|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Cat, Balance, Heal, Off-Heal.|r"], 1, 1, 1) GameTooltip:Show() end) treeBearBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -130,9 +130,9 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Cat|r |cff999999- |r|cffFF7D0Acat|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Feral Cat melee DPS|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Bear, Balance, Heal, Off-Heal.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Cat|r |cff999999- |r|cffFF7D0Acat|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Feral Cat melee DPS|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Bear, Balance, Heal, Off-Heal.|r"], 1, 1, 1) GameTooltip:Show() end) treeCatBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -141,9 +141,9 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Balance|r |cff999999- |r|cffFF7D0Abalance|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Moonkin Form — Balance caster DPS|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Bear, Cat, Heal, Off-Heal.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Balance|r |cff999999- |r|cffFF7D0Abalance|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Moonkin Form — Balance caster DPS|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Bear, Cat, Heal, Off-Heal.|r"], 1, 1, 1) GameTooltip:Show() end) treeCasterBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -152,9 +152,9 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Restoration|r |cff999999- |r|cffFF7D0Aresto|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Tree of Life — Restoration healer|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Bear, Cat, Balance, Off-Heal.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Restoration|r |cff999999- |r|cffFF7D0Aresto|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Tree of Life — Restoration healer|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Bear, Cat, Balance, Off-Heal.|r"], 1, 1, 1) GameTooltip:Show() end) treeHealBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -165,7 +165,7 @@ function PBM.OpenDruidMenu(row) LichborneDruidMenu.treeHealBtn = treeHealBtn -- ── ROW 2 — Healing (left) + Hybrid modifier (right) ────────── - local healingSpecBox = MakeSpecBox(LichborneDruidMenu, TREE_X, TREE_TOP_Y - 16, 60, "Healing", nil) + local healingSpecBox = MakeSpecBox(LichborneDruidMenu, TREE_X, TREE_TOP_Y - 16, 60, PBM_L["Healing"], nil) healingSpecBox:ClearAllPoints() healingSpecBox:SetPoint("TOPLEFT", bearSpecBox, "BOTTOMLEFT", 79, -45) @@ -175,9 +175,9 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Tranquility|r |cff999999- |r|cffFF7D0Atranquility|r |cffee4433CO|r") - GameTooltip:AddLine("Auto-loaded on Resto,", 1, 1, 1) - GameTooltip:AddLine("Heals ALL nearby party members.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Tranquility|r |cff999999- |r|cffFF7D0Atranquility|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["Auto-loaded on Resto,"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Heals ALL nearby party members."], 1, 1, 1) GameTooltip:Show() end) treeTranqBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -189,15 +189,15 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Blanketing|r |cff999999- |r|cffFF7D0Ablanketing|r |cffee4433CO|r") - GameTooltip:AddLine("pre-HoT party with Wild Growth", 1, 1, 1) - GameTooltip:AddLine("+ Rejuvenation regardless of HP.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Blanketing|r |cff999999- |r|cffFF7D0Ablanketing|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["pre-HoT party with Wild Growth"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["+ Rejuvenation regardless of HP."], 1, 1, 1) GameTooltip:Show() end) treeBlankBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) LichborneDruidMenu.treeBlankBtn = treeBlankBtn - local hybridSpecBox = MakeSpecBox(LichborneDruidMenu, 0, 0, 60, "Hybrid", nil) + local hybridSpecBox = MakeSpecBox(LichborneDruidMenu, 0, 0, 60, PBM_L["Hybrid"], nil) hybridSpecBox:ClearAllPoints() hybridSpecBox:SetPoint("TOPLEFT", restoSpecBox, "BOTTOMLEFT", -69, -45) @@ -207,8 +207,8 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Healer DPS|r |cff999999- |r|cffFF7D0Ahealer dps|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Healer contributes DPS between heals|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Healer DPS|r |cff999999- |r|cffFF7D0Ahealer dps|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Healer contributes DPS between heals|r"], 1, 1, 1) GameTooltip:Show() end) treeHealerDpsBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -220,16 +220,16 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Off-Heal|r |cff999999- |r|cffFF7D0Aoffheal|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Cat DPS primary, heals when party drops low|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Bear, Cat, Balance, Heal.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Off-Heal|r |cff999999- |r|cffFF7D0Aoffheal|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Cat DPS primary, heals when party drops low|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Bear, Cat, Balance, Heal.|r"], 1, 1, 1) GameTooltip:Show() end) treeOffhealBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) LichborneDruidMenu.treeOffhealBtn = treeOffhealBtn -- ── ROW 3 — AoE + Charge ───────────────────────────────────── - local aoeSpecBox = MakeSpecBox(LichborneDruidMenu, 0, 0, 34, "AoE", nil) + local aoeSpecBox = MakeSpecBox(LichborneDruidMenu, 0, 0, 34, PBM_L["AoE"], nil) aoeSpecBox:ClearAllPoints() aoeSpecBox:SetPoint("TOPLEFT", healingSpecBox, "BOTTOMLEFT", 31, -45) @@ -239,14 +239,14 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00AoE|r |cff999999- |r|cffFF7D0Aaoe|r |cffee4433CO|r") - GameTooltip:AddLine("Shared AoE strategy across all druid specs.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00AoE|r |cff999999- |r|cffFF7D0Aaoe|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["Shared AoE strategy across all druid specs."], 1, 1, 1) GameTooltip:Show() end) treeAoeBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) LichborneDruidMenu.treeAoeBtn = treeAoeBtn - local chargeSpecBox = MakeSpecBox(LichborneDruidMenu, 0, 0, 50, "Charge", nil) + local chargeSpecBox = MakeSpecBox(LichborneDruidMenu, 0, 0, 50, PBM_L["Charge"], nil) chargeSpecBox:ClearAllPoints() chargeSpecBox:SetPoint("TOPLEFT", aoeSpecBox, "TOPRIGHT", 4, 0) @@ -256,16 +256,16 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Feral Charge|r |cff999999- |r|cffFF7D0Aferal charge|r |cffee4433CO|r") - GameTooltip:AddLine("Cat & Bear, for encounters when", 1, 1, 1) - GameTooltip:AddLine("charging in is unfavorable.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Feral Charge|r |cff999999- |r|cffFF7D0Aferal charge|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["Cat & Bear, for encounters when"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["charging in is unfavorable."], 1, 1, 1) GameTooltip:Show() end) treeChargeBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) LichborneDruidMenu.treeChargeBtn = treeChargeBtn -- ── ROW 4 — Assist ──────────────────────────────────────────── - local assistSpecBox = MakeSpecBox(LichborneDruidMenu, 0, 0, 90, "Assist", nil) + local assistSpecBox = MakeSpecBox(LichborneDruidMenu, 0, 0, 90, PBM_L["Assist"], nil) assistSpecBox:ClearAllPoints() -- Center assistSpecBox within the tree (TREE_TOTAL_W=292, box=90px → left offset=101) -- aoeSpecBox left = TREE_X+110, so delta = 101-110 = -9 @@ -277,9 +277,9 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Tank target focus|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks the tank's current target.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Tank target focus|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks the tank's current target."], 1, 1, 1) GameTooltip:Show() end) treeTankAssistBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -291,9 +291,9 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Focus single-target DPS on assist target|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks the group DPS focus target.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Focus single-target DPS on assist target|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks the group DPS focus target."], 1, 1, 1) GameTooltip:Show() end) treeDpsAssistBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -305,8 +305,8 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00DPS AoE|r |cff999999- |r|cffFF7D0Adps aoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Cross-role AoE mode|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00DPS AoE|r |cff999999- |r|cffFF7D0Adps aoe|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Cross-role AoE mode|r"], 1, 1, 1) GameTooltip:Show() end) treeDpsAoeBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -325,7 +325,7 @@ function PBM.OpenDruidMenu(row) buffSideHdrFs:SetTextColor(0.78, 0.61, 0.23, 1) buffSideHdrFs:SetAllPoints() buffSideHdrFs:SetJustifyH("CENTER") - buffSideHdrFs:SetText("Buff") + buffSideHdrFs:SetText(PBM_L["Buff"]) local treeSideBuffBtn = MakeTreeBtn(LichborneDruidMenu, buffSideHdrBox, "BOTTOMLEFT", 4, -1, "Interface\\Icons\\spell_nature_regeneration") @@ -333,11 +333,11 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Buff|r |cff999999- |r|cffffff00buff|r |cffff8000NC|r") - GameTooltip:AddLine("|cffffcc00Group stats buff|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF7D0AMark of the Wild|r on all party members.", 1, 1, 1) - GameTooltip:AddLine("Upgrades to |cffFF7D0AGift of the Wild|r when |cffffcc00Wild Thornroot|r", 1, 1, 1) - GameTooltip:AddLine("is in the bot's bags.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Buff|r |cff999999- |r|cffffff00buff|r |cffff8000NC|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Group stats buff|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF7D0AMark of the Wild|r on all party members."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Upgrades to |cffFF7D0AGift of the Wild|r when |cffffcc00Wild Thornroot|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["is in the bot's bags."], 1, 1, 1) GameTooltip:Show() end) treeSideBuffBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -355,7 +355,7 @@ function PBM.OpenDruidMenu(row) ccSideHdrFs:SetTextColor(0.78, 0.61, 0.23, 1) ccSideHdrFs:SetAllPoints() ccSideHdrFs:SetJustifyH("CENTER") - ccSideHdrFs:SetText("CC") + ccSideHdrFs:SetText(PBM_L["CC"]) local treeCCBtn = MakeTreeBtn(LichborneDruidMenu, ccSideHdrBox, "BOTTOMLEFT", 4, -1, "Interface\\Icons\\Spell_Nature_EarthBind") @@ -363,10 +363,10 @@ function PBM.OpenDruidMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneDruidMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00CC|r |cff999999- |r|cffff8000cc|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Crowd control|r", 1, 1, 1) - GameTooltip:AddLine("Cyclones, Hibernates, or Roots extra targets in combat.", 1, 1, 1) - GameTooltip:AddLine("Re-applies when the effect breaks.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00CC|r |cff999999- |r|cffff8000cc|r |cffffcc00CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Crowd control|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Cyclones, Hibernates, or Roots extra targets in combat."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Re-applies when the effect breaks."], 1, 1, 1) GameTooltip:Show() end) treeCCBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -616,4 +616,4 @@ function PBM.OpenDruidMenu(row) end PBM.ShowCharSheet(LichborneDruidMenu, LichborneDruidCatcher, row, DRUID_LEFT_EXT) -end +end \ No newline at end of file diff --git a/PBM/PBM_Engine.lua b/PBM/PBM_Engine.lua index 63b2c08..b384924 100644 --- a/PBM/PBM_Engine.lua +++ b/PBM/PBM_Engine.lua @@ -330,9 +330,9 @@ PBM.toTip = function(pClass, pLevel, pName) local tTip = pClass .. " - " if(pLevel ~= nil) then tTip = tTip .. pLevel .. " - " end tTip = tTip .. pName .. PBM.tips.unit.button - tTip = PBM.doReplace(tTip, "NAME", pName) - tTip = PBM.doReplace(tTip, "NAME", pName) - tTip = PBM.doReplace(tTip, "NAME", pName) + tTip = PBM.doReplace(tTip, PBM_L["NAME"], pName) + tTip = PBM.doReplace(tTip, PBM_L["NAME"], pName) + tTip = PBM.doReplace(tTip, PBM_L["NAME"], pName) return tTip end diff --git a/PBM/PBM_ExportImport.lua b/PBM/PBM_ExportImport.lua index d68bd19..8410978 100644 --- a/PBM/PBM_ExportImport.lua +++ b/PBM/PBM_ExportImport.lua @@ -76,7 +76,7 @@ function PBM.LB_ExportDB() end function PBM.LB_ImportDB(str) - if not str or str == "" then return nil, "Nothing to import — paste text first." end + if not str or str == "" then return nil, PBM_L["Nothing to import — paste text first."] end str = str:match("^%s*(.-)%s*$") local data if str:find(PBM.EXPORT_PREFIX, 1, true) then @@ -87,13 +87,13 @@ function PBM.LB_ImportDB(str) elseif str:find(PBM.EXPORT_PREFIX_V1, 1, true) then data = str:sub(#PBM.EXPORT_PREFIX_V1 + 1) else - return nil, "Not a valid Lichborne export string." + return nil, PBM_L["Not a valid Lichborne export string."] end local fn, err = loadstring("return " .. data) - if not fn then return nil, "Parse error: " .. (err or "unknown") end + if not fn then return nil, PBM_L["Parse error: "] .. (err or PBM_L["unknown"]) end local ok, result = pcall(fn) - if not ok then return nil, "Load error: " .. tostring(result) end - if type(result) ~= "table" then return nil, "Invalid data format." end + if not ok then return nil, PBM_L["Load error: "] .. tostring(result) end + if type(result) ~= "table" then return nil, PBM_L["Invalid data format."] end -- V2 legacy: restore pipe placeholders in any ilvlLink strings if str:find(PBM.EXPORT_PREFIX_V2, 1, true) and result.rows then for _, row in pairs(result.rows) do @@ -107,4 +107,4 @@ function PBM.LB_ImportDB(str) end end return result, nil -end +end \ No newline at end of file diff --git a/PBM/PBM_GroupView.lua b/PBM/PBM_GroupView.lua index ad17d46..19fec8d 100644 --- a/PBM/PBM_GroupView.lua +++ b/PBM/PBM_GroupView.lua @@ -232,7 +232,7 @@ function PBM.RefreshGroupViewRows() if roster[ri] and roster[ri].name and roster[ri].name:lower() == srcData.name:lower() then roster[ri] = {name="", cls="", spec="", gs=0, realGs=0, role="", notes=""} rf.addRaidBtn:SetText("|cff44ff44+|r") - if LichborneAddStatus then LichborneAddStatus:SetText(hex..srcData.name.."|r removed from raid slot "..ri..".") end + if LichborneAddStatus then LichborneAddStatus:SetText(hex..srcData.name.."|r" .. PBM_L[" removed from raid slot "] .. ri..".") end if LichborneRaidFrame then PBM.RefreshRaidRows() end return end @@ -243,14 +243,14 @@ function PBM.RefreshGroupViewRows() for ri = 1, PBM.MAX_RAID_SLOTS do if not roster2[ri] or roster2[ri].name == "" then roster2[ri] = {name=srcData.name, cls=srcData.cls or "", spec=srcData.spec or "", gs=srcData.gs or 0, realGs=srcData.realGs or 0, role="", notes=""} - LichborneOutput("|cffC69B3APBM:|r Added "..hex..srcData.name.."|r to Raid slot "..ri..".", 1, 0.85, 0) - if LichborneAddStatus then LichborneAddStatus:SetText(hex..srcData.name.."|r added to raid slot "..ri..".") end + LichborneOutput("|cffC69B3APBM:|r Added "..hex..srcData.name.."|r" .. PBM_L[" added to raid slot "] .. ri..".", 1, 0.85, 0) + if LichborneAddStatus then LichborneAddStatus:SetText(hex..srcData.name.."|r" .. PBM_L[" added to raid slot "] .. ri..".") end rf.addRaidBtn:SetText("|cffb25b00+|r") if LichborneRaidFrame then PBM.RefreshRaidRows() end return end end - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff6666Raid roster is full.|r") end + if LichborneAddStatus then LichborneAddStatus:SetText("|cffff6666" .. PBM_L["Raid roster is full."] .. "|r") end end) rf.addRaidBtn:RegisterForClicks("LeftButtonUp", "RightButtonUp") else @@ -286,11 +286,11 @@ function PBM.RefreshGroupViewRows() if btn == "RightButton" then UninviteUnit(d.name) SendChatMessage(".playerbots bot remove "..d.name, "SAY") - LichborneOutput("|cffC69B3APBM:|r Removed "..hex..d.name.."|r from bots.", 1, 0.85, 0) + LichborneOutput("|cffC69B3APBM:|r" .. PBM_L[" Removed "] ..hex..d.name.."|r" .. PBM_L[" from bots."], 1, 0.85, 0) return end SendChatMessage(".playerbots bot add "..d.name, "SAY") - if LichborneAddStatus then LichborneAddStatus:SetText("Invited "..hex..d.name.."|r to group.") end + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["Invited "] ..hex..d.name.."|r" .. PBM_L[" to group."]) end end) -- x Delete click — removes character from tracker (mirrors class tabs) @@ -368,7 +368,7 @@ function PBM.BuildGroupView(parent, fl) PBM.State.gvSortHdrs[key] = { lbl = lbl, fs = fs } btn:SetScript("OnEnter", function() GameTooltip:SetOwner(btn, "ANCHOR_RIGHT") - GameTooltip:AddLine("Click to sort", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Click to sort"], 1, 1, 1) GameTooltip:Show() end) btn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -387,11 +387,11 @@ function PBM.BuildGroupView(parent, fl) end H("#", GV_NUM_OFF, GV_NUM_W) - SH("Spec", GV_SPEC_OFF, GV_NAME_OFF - GV_SPEC_OFF, "cls", false) - SH("Name", GV_NAME_OFF, GV_NAME_W, "name", false) - SH("iLvL", GV_ILVL_OFF, GV_ILVL_W, "ilvl", true) - SH("GS", GV_GS_OFF, GV_GS_W, "gs", true) - H("Prof", GV_PROF_OFF, GV_PROF_W) + SH(PBM_L["Spec"], GV_SPEC_OFF, GV_NAME_OFF - GV_SPEC_OFF, "cls", false) + SH(PBM_L["Name"], GV_NAME_OFF, GV_NAME_W, "name", false) + SH(PBM_L["iLvL"], GV_ILVL_OFF, GV_ILVL_W, "ilvl", true) + SH(PBM_L["GS"], GV_GS_OFF, GV_GS_W, "gs", true) + H(PBM_L["Prof"], GV_PROF_OFF, GV_PROF_W) for g = 1, PBM.GEAR_SLOTS do SH(PBM.SLOT_ABBR[g] or tostring(g), GV_GEAR_OFF + (g-1)*GV_GEAR_STEP, GV_GEAR_BSIZ, "gear_"..g, true) end @@ -407,11 +407,11 @@ function PBM.BuildGroupView(parent, fl) refreshBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") local refreshLbl = refreshBtn:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") refreshLbl:SetAllPoints(refreshBtn); refreshLbl:SetJustifyH("CENTER"); refreshLbl:SetJustifyV("MIDDLE") - refreshLbl:SetText("|cffd4af37Refresh|r") + refreshLbl:SetText("|cffd4af37" .. PBM_L["Refresh"] .. "|r") refreshBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(refreshBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Refresh Group", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Rebuild the member list from your current group.", 0.7, 0.7, 0.7) + GameTooltip:AddLine(PBM_L["Refresh Group"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Rebuild the member list from your current group."], 0.7, 0.7, 0.7) GameTooltip:Show() end) refreshBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -467,7 +467,7 @@ function PBM.BuildGroupView(parent, fl) if not gvDragSource and rf.charName then dragTex:SetVertexColor(0.9,0.7,0.1,1.0) GameTooltip:SetOwner(dragBtn,"ANCHOR_RIGHT") - GameTooltip:AddLine("Drag to reorder",1,1,1) + GameTooltip:AddLine(PBM_L["Drag to reorder"],1,1,1) GameTooltip:Show() end end) @@ -598,10 +598,10 @@ function PBM.BuildGroupView(parent, fl) arb:RegisterForClicks("LeftButtonUp","RightButtonUp") arb:SetScript("OnEnter", function() GameTooltip:SetOwner(arb, "ANCHOR_RIGHT") - GameTooltip:AddLine("|cff44ff44+ Add to Raid|r",1,1,1) - GameTooltip:AddLine("Adds character to the Raid tab.", 0.7, 0.7, 0.7) - GameTooltip:AddLine("|cff44ff44Left-click to add to raid.|r",1,1,1) - GameTooltip:AddLine("|cffff2020Right-click to remove.|r",1,1,1) + GameTooltip:AddLine("|cff44ff44" .. PBM_L["+ Add to Raid"] .. "|r",1,1,1) + GameTooltip:AddLine(PBM_L["Adds character to the Raid tab."], 0.7, 0.7, 0.7) + GameTooltip:AddLine("|cff44ff44" .. PBM_L["Left-click to add to raid."] .. "|r",1,1,1) + GameTooltip:AddLine("|cffff2020" .. PBM_L["Right-click to remove."] .. "|r",1,1,1) GameTooltip:Show() end) arb:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -616,9 +616,9 @@ function PBM.BuildGroupView(parent, fl) agb:RegisterForClicks("LeftButtonUp","RightButtonUp") agb:SetScript("OnEnter", function() GameTooltip:SetOwner(agb, "ANCHOR_RIGHT") - GameTooltip:AddLine("|cff44eeff> Invite to Group|r",1,1,1) - GameTooltip:AddLine("|cff44ff44Left-click to invite.|r",1,1,1) - GameTooltip:AddLine("|cffff2020Right-click to remove.|r",1,1,1) + GameTooltip:AddLine("|cff44eeff" .. PBM_L["> Invite to Group"] .. "|r",1,1,1) + GameTooltip:AddLine("|cff44ff44" .. PBM_L["Left-click to invite."] .. "|r",1,1,1) + GameTooltip:AddLine("|cffff2020" .. PBM_L["Right-click to remove."] .. "|r",1,1,1) GameTooltip:Show() end) agb:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -632,8 +632,8 @@ function PBM.BuildGroupView(parent, fl) db:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") db:SetScript("OnEnter", function() GameTooltip:SetOwner(db, "ANCHOR_RIGHT") - GameTooltip:AddLine("Remove Character", 1, 0.3, 0.3) - GameTooltip:AddLine("Removes from tracker.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Remove Character"], 1, 0.3, 0.3) + GameTooltip:AddLine(PBM_L["Removes from tracker."], 0.8, 0.8, 0.8) GameTooltip:Show() end) db:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -746,8 +746,8 @@ function PBM.BuildGroupView(parent, fl) sw:SetScript("OnEnter", function() GameTooltip:SetOwner(sw, "ANCHOR_TOP") GameTooltip:AddLine(PBM.TAB_LABELS[capCls], c.r, c.g, c.b) - GameTooltip:AddLine("Current-group average "..(mode == "gs" and "gear score" or "item level").." for this class.", 1,1,1) - GameTooltip:AddLine("Click to switch to this tab.", 0.5,0.5,0.5) + GameTooltip:AddLine(PBM_L["Current-group average "] .. (mode == "gs" and PBM_L["gear score"] or PBM_L["item level"]) .. PBM_L[" for this class."], 1,1,1) + GameTooltip:AddLine(PBM_L["Click to switch to this tab."], 0.5,0.5,0.5) GameTooltip:Show() end) sw:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -771,7 +771,7 @@ function PBM.BuildGroupView(parent, fl) block:SetScript("OnEnter", function() GameTooltip:SetOwner(block, "ANCHOR_TOP") GameTooltip:AddLine(blockLabelText, 0.78, 0.61, 0.23) - GameTooltip:AddLine("Average "..(mode == "gs" and "gear score" or "item level").." across your current group.", 1,1,1) + GameTooltip:AddLine(PBM_L["Average "] .. (mode == "gs" and PBM_L["gear score"] or PBM_L["item level"]) .. PBM_L[" across your current group."], 1,1,1) GameTooltip:Show() end) block:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -779,8 +779,8 @@ function PBM.BuildGroupView(parent, fl) end -- 20 rows end at yStart - 20*RH = -20 - 440 = -460; bars sit flush below with 2px gap between them. - PBM.State.gvGroupIlvlLabel = BuildAvgBar(-460, "Avg iLvL:", "ilvl", PBM.State.gvAvgSwatches, "Group iLvL") - PBM.State.gvGroupGsLabel = BuildAvgBar(-486, "Avg GS:", "gs", PBM.State.gvGsSwatches, "Group GS") + PBM.State.gvGroupIlvlLabel = BuildAvgBar(-460, PBM_L["Avg iLvL:"], "ilvl", PBM.State.gvAvgSwatches, PBM_L["Group iLvL"]) + PBM.State.gvGroupGsLabel = BuildAvgBar(-486, PBM_L["Avg GS:"], "gs", PBM.State.gvGsSwatches, PBM_L["Group GS"]) end -- ── Current-group averages (computed from the built member list) ─ @@ -825,11 +825,11 @@ function PBM.UpdateGroupSummary() end if PBM.State.gvGroupIlvlLabel then local v = GroupAvg("gs") - PBM.State.gvGroupIlvlLabel:SetText("|cffC69B3AGroup iLvL:|r "..(v > 0 and "|cffff8000"..v.."|r" or "|cff555555--|r")) + PBM.State.gvGroupIlvlLabel:SetText("|cffC69B3A" .. PBM_L["Group iLvL:"] .. "|r "..(v > 0 and "|cffff8000"..v.."|r" or "|cff555555--|r")) end if PBM.State.gvGroupGsLabel then local v = GroupAvg("realGs") - PBM.State.gvGroupGsLabel:SetText("|cffC69B3AGroup GS:|r "..(v > 0 and "|cffff8000"..v.."|r" or "|cff555555--|r")) + PBM.State.gvGroupGsLabel:SetText("|cffC69B3A" .. PBM_L["Group GS:"] .. "|r "..(v > 0 and "|cffff8000"..v.."|r" or "|cff555555--|r")) end end @@ -839,4 +839,4 @@ function PBM.OpenGroupView() PBM.State.gvScrollOffset = 0 if PBM.State.UpdateGVSortHeaders then PBM.State.UpdateGVSortHeaders() end PBM.RefreshGroupViewRows() -end +end \ No newline at end of file diff --git a/PBM/PBM_Hunter.lua b/PBM/PBM_Hunter.lua index 5fb45a8..bf0ff68 100644 --- a/PBM/PBM_Hunter.lua +++ b/PBM/PBM_Hunter.lua @@ -2,12 +2,12 @@ PBM = PBM or {} -- Talent spec templates for the Set Talents menu local HUNTER_TALENT_SPECS = { - { label="Beast Mastery |cffffcc00PvE|r", spec="bm pve", wowSpec="Beast Mastery", icon="Interface\\Icons\\Ability_Hunter_BeastTaming" }, - { label="Marksmanship |cffffcc00PvE|r", spec="mm pve", wowSpec="Marksmanship", icon="Interface\\Icons\\Ability_Marksmanship" }, - { label="Survival |cffffcc00PvE|r", spec="surv pve", wowSpec="Survival", icon="Interface\\Icons\\Ability_Hunter_SwiftStrike" }, - { label="Beast Mastery |cffff4444PvP|r", spec="bm pvp", wowSpec="Beast Mastery", icon="Interface\\Icons\\Ability_Hunter_BeastTaming" }, - { label="Marksmanship |cffff4444PvP|r", spec="mm pvp", wowSpec="Marksmanship", icon="Interface\\Icons\\Ability_Marksmanship" }, - { label="Survival |cffff4444PvP|r", spec="surv pvp", wowSpec="Survival", icon="Interface\\Icons\\Ability_Hunter_SwiftStrike" }, + { label=PBM_L["Beast Mastery |cffffcc00PvE|r"], spec="bm pve", wowSpec="Beast Mastery", icon="Interface\\Icons\\Ability_Hunter_BeastTaming" }, + { label=PBM_L["Marksmanship |cffffcc00PvE|r"], spec="mm pve", wowSpec="Marksmanship", icon="Interface\\Icons\\Ability_Marksmanship" }, + { label=PBM_L["Survival |cffffcc00PvE|r"], spec="surv pve", wowSpec="Survival", icon="Interface\\Icons\\Ability_Hunter_SwiftStrike" }, + { label=PBM_L["Beast Mastery |cffff4444PvP|r"], spec="bm pvp", wowSpec="Beast Mastery", icon="Interface\\Icons\\Ability_Hunter_BeastTaming" }, + { label=PBM_L["Marksmanship |cffff4444PvP|r"], spec="mm pvp", wowSpec="Marksmanship", icon="Interface\\Icons\\Ability_Marksmanship" }, + { label=PBM_L["Survival |cffff4444PvP|r"], spec="surv pvp", wowSpec="Survival", icon="Interface\\Icons\\Ability_Hunter_SwiftStrike" }, } -- ───────────────────────────────────────────────────────────────────────────── @@ -159,128 +159,128 @@ function PBM.OpenHunterMenu(row) end -- ── Row 1: Specs ───────────────────────────────────────────── - MakeSpecBox(col1X, specBoxY, SPEC_COL_W, "Beast Mastery", "Interface\\Icons\\Ability_Hunter_BeastTaming") - MakeSpecBox(col2X, specBoxY, SPEC_COL_W, "Marksmanship", "Interface\\Icons\\Ability_Marksmanship") - MakeSpecBox(col3X, specBoxY, SPEC_COL_W, "Survival", "Interface\\Icons\\Ability_Hunter_SwiftStrike") + MakeSpecBox(col1X, specBoxY, SPEC_COL_W, PBM_L["Beast Mastery"], "Interface\\Icons\\Ability_Hunter_BeastTaming") + MakeSpecBox(col2X, specBoxY, SPEC_COL_W, PBM_L["Marksmanship"], "Interface\\Icons\\Ability_Marksmanship") + MakeSpecBox(col3X, specBoxY, SPEC_COL_W, PBM_L["Survival"], "Interface\\Icons\\Ability_Hunter_SwiftStrike") local treeBmBtn = MakeTreeBtn(col1X + ICON_OFF, specIconY, "Interface\\Icons\\Ability_Hunter_BeastTaming", function() - GameTooltip:SetText("|cffffcc00Beast Mastery|r |cff999999- |r|cffABD473bm|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Beast Mastery specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Marksmanship, Survival.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Beast Mastery|r |cff999999- |r|cffABD473bm|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Beast Mastery specialization|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Marksmanship, Survival.|r"], 1, 1, 1) end) LichborneHunterMenu.treeBmBtn = treeBmBtn local treeMmBtn = MakeTreeBtn(col2X + ICON_OFF, specIconY, "Interface\\Icons\\Ability_Marksmanship", function() - GameTooltip:SetText("|cffffcc00Marksmanship|r |cff999999- |r|cffABD473mm|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Marksmanship specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Beast Mastery, Survival.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Marksmanship|r |cff999999- |r|cffABD473mm|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Marksmanship specialization|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Beast Mastery, Survival.|r"], 1, 1, 1) end) LichborneHunterMenu.treeMmBtn = treeMmBtn local treeSurvBtn = MakeTreeBtn(col3X + ICON_OFF, specIconY, "Interface\\Icons\\Ability_Hunter_SwiftStrike", function() - GameTooltip:SetText("|cffffcc00Survival|r |cff999999- |r|cffABD473surv|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Survival specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Beast Mastery, Marksmanship.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Survival|r |cff999999- |r|cffABD473surv|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Survival specialization|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Beast Mastery, Marksmanship.|r"], 1, 1, 1) end) LichborneHunterMenu.treeSurvBtn = treeSurvBtn -- ── Combat header (2-button wide, Trap Weave centred) ──────── - MakeWideBox(combatHdrX, combatHdrY, combatBtnW, "Combat") + MakeWideBox(combatHdrX, combatHdrY, combatBtnW, PBM_L["Combat"]) local treeTrapWeaveBtn = MakeTreeBtn(trapX, combatIconY, "Interface\\Icons\\ability_ensnare", function() - GameTooltip:SetText("|cffffcc00Trap Weave|r |cff999999- |r|cffABD473trap weave|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Melee trap rotation|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Trap Weave|r |cff999999- |r|cffABD473trap weave|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Melee trap rotation|r"], 1, 1, 1) end) LichborneHunterMenu.treeTrapWeaveBtn = treeTrapWeaveBtn -- ── Assist header (3-button wide, centred under Marksmanship) ─ - MakeWideBox(assistHdrX, assistHdrY, assistBtnW, "Assist") + MakeWideBox(assistHdrX, assistHdrY, assistBtnW, PBM_L["Assist"]) local treeTankAssistBtn = MakeTreeBtn(assistHdrX, assistIconY, "Interface\\Icons\\inv_shield_02", function() - GameTooltip:SetText("|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Tank target focus|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Tank target focus|r"], 1, 1, 1) end) LichborneHunterMenu.treeTankAssistBtn = treeTankAssistBtn local treeDpsAssistBtn = MakeTreeBtn(assistHdrX + 30, assistIconY, "Interface\\Icons\\Ability_Warrior_Challange", function() - GameTooltip:SetText("|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Assists the main assist target|r", 1, 1, 1) - GameTooltip:AddLine("Attacks the assist leader's target.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Assists the main assist target|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Attacks the assist leader's target."], 1, 1, 1) end) LichborneHunterMenu.treeDpsAssistBtn = treeDpsAssistBtn local treeDpsAoeBtn = MakeTreeBtn(assistHdrX + 60, assistIconY, "Interface\\Icons\\Spell_Shadow_RainOfFire", function() - GameTooltip:SetText("|cffffcc00DPS AoE|r |cff999999- |r|cffABD473aoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Cross-role AoE mode|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00DPS AoE|r |cff999999- |r|cffABD473aoe|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Cross-role AoE mode|r"], 1, 1, 1) end) LichborneHunterMenu.treeDpsAoeBtn = treeDpsAoeBtn -- ── Aspects: master header + CO/NC sub-headers ────────────── - MakeWideBox(coX, aspectsHdrY, aspectColTotalW, "Aspects") - MakeSpecBox(coX, coNcHdrY, EXT_ICON_SIZE, "CO") + MakeWideBox(coX, aspectsHdrY, aspectColTotalW, PBM_L["Aspects"]) + MakeSpecBox(coX, coNcHdrY, EXT_ICON_SIZE, PBM_L["CO"]) local treeCADragonhawkBtn = MakeTreeBtn(coX, aspectIcon1Y, "Interface\\Icons\\Ability_Hunter_Pet_DragonHawk", function() - GameTooltip:SetText("|cffffcc00Dragonhawk|r |cff999999- |r|cffffff00bdps|r |cffff8000CO|r") - GameTooltip:AddLine("|cffffcc00Aspect of the Dragonhawk|r", 1, 1, 1) - GameTooltip:AddLine("Increases ranged |cffFF9900attack power|r", 1, 1, 1) - GameTooltip:AddLine("and |cffFF9900dodge rating.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Dragonhawk|r |cff999999- |r|cffffff00bdps|r |cffff8000CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Aspect of the Dragonhawk|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Increases ranged |cffFF9900attack power|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["and |cffFF9900dodge rating.|r"], 1, 1, 1) end) LichborneHunterMenu.treeCADragonhawkBtn = treeCADragonhawkBtn local treeCAPackBtn = MakeTreeBtn(coX, aspectIcon2Y, "Interface\\Icons\\Ability_Mount_WhiteTiger", function() - GameTooltip:SetText("|cffffcc00Pack|r |cff999999- |r|cffffff00bspeed|r |cffff8000CO|r") - GameTooltip:AddLine("|cffffcc00Aspect of the Pack|r", 1, 1, 1) - GameTooltip:AddLine("Increases group |cffFF9900movement speed|r", 1, 1, 1) - GameTooltip:AddLine("while in combat.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Pack|r |cff999999- |r|cffffff00bspeed|r |cffff8000CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Aspect of the Pack|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Increases group |cffFF9900movement speed|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["while in combat."], 1, 1, 1) end) LichborneHunterMenu.treeCAPackBtn = treeCAPackBtn local treeCAWildBtn = MakeTreeBtn(coX, aspectIcon3Y, "Interface\\Icons\\Spell_Nature_ProtectionformNature", function() - GameTooltip:SetText("|cffffcc00Wild|r |cff999999- |r|cffffff00rnature|r |cffff8000CO|r") - GameTooltip:AddLine("|cffffcc00Aspect of the Wild|r", 1, 1, 1) - GameTooltip:AddLine("Increases group |cff1EFF00Nature resistance|r", 1, 1, 1) - GameTooltip:AddLine("while in combat.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Wild|r |cff999999- |r|cffffff00rnature|r |cffff8000CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Aspect of the Wild|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Increases group |cff1EFF00Nature resistance|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["while in combat."], 1, 1, 1) end) LichborneHunterMenu.treeCAWildBtn = treeCAWildBtn -- ── NC aspect column ───────────────────────────────────────── - MakeSpecBox(ncX, coNcHdrY, EXT_ICON_SIZE, "NC") + MakeSpecBox(ncX, coNcHdrY, EXT_ICON_SIZE, PBM_L["NC"]) local treeNCADragonhawkBtn = MakeTreeBtn(ncX, aspectIcon1Y, "Interface\\Icons\\Ability_Hunter_Pet_DragonHawk", function() - GameTooltip:SetText("|cffffcc00Dragonhawk|r |cff999999- |r|cffffff00bdps|r |cffff8000NC|r") - GameTooltip:AddLine("|cffffcc00Aspect of the Dragonhawk|r", 1, 1, 1) - GameTooltip:AddLine("Default out-of-combat aspect.", 1, 1, 1) - GameTooltip:AddLine("Maintains ranged |cffFF9900attack power|r", 1, 1, 1) - GameTooltip:AddLine("and |cffFF9900dodge rating.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Dragonhawk|r |cff999999- |r|cffffff00bdps|r |cffff8000NC|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Aspect of the Dragonhawk|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Default out-of-combat aspect."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Maintains ranged |cffFF9900attack power|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["and |cffFF9900dodge rating.|r"], 1, 1, 1) end) LichborneHunterMenu.treeNCADragonhawkBtn = treeNCADragonhawkBtn local treeNCACheetahBtn = MakeTreeBtn(ncX, aspectIcon2Y, "Interface\\Icons\\Ability_Mount_WhiteTiger", function() - GameTooltip:SetText("|cffffcc00Cheetah|r |cff999999- |r|cffffff00bspeed|r |cffff8000NC|r") - GameTooltip:AddLine("|cffffcc00Aspect of the Cheetah|r", 1, 1, 1) - GameTooltip:AddLine("Increases |cffFF9900movement speed|r when", 1, 1, 1) - GameTooltip:AddLine("not in combat.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Cheetah|r |cff999999- |r|cffffff00bspeed|r |cffff8000NC|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Aspect of the Cheetah|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Increases |cffFF9900movement speed|r when"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["not in combat."], 1, 1, 1) end) LichborneHunterMenu.treeNCACheetahBtn = treeNCACheetahBtn local treeNCAWildBtn = MakeTreeBtn(ncX, aspectIcon3Y, "Interface\\Icons\\Spell_Nature_ProtectionformNature", function() - GameTooltip:SetText("|cffffcc00Wild|r |cff999999- |r|cffffff00rnature|r |cffff8000NC|r") - GameTooltip:AddLine("|cffffcc00Aspect of the Wild|r", 1, 1, 1) - GameTooltip:AddLine("Provides group |cff1EFF00Nature resistance|r", 1, 1, 1) - GameTooltip:AddLine("between encounters.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Wild|r |cff999999- |r|cffffff00rnature|r |cffff8000NC|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Aspect of the Wild|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Provides group |cff1EFF00Nature resistance|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["between encounters."], 1, 1, 1) end) LichborneHunterMenu.treeNCAWildBtn = treeNCAWildBtn @@ -457,4 +457,4 @@ function PBM.OpenHunterMenu(row) end PBM.ShowCharSheet(LichborneHunterMenu, LichborneHunterCatcher, row, HUNTER_LEFT_EXT) -end +end \ No newline at end of file diff --git a/PBM/PBM_Inspect.lua b/PBM/PBM_Inspect.lua index 4c501ab..d959682 100644 --- a/PBM/PBM_Inspect.lua +++ b/PBM/PBM_Inspect.lua @@ -117,7 +117,7 @@ local function CalcGS() -- Exhausted cache retries — proceed with whatever data we have PBM.DBG("|cffff4444Cache retries exhausted for |r|cffffff88"..rowName.."|r — proceeding with "..cachedCount.." cached slots") if LichborneAddStatus then - LichborneAddStatus:SetText("|cffff4444Some items not cached — using available data.|r") + LichborneAddStatus:SetText("|cffff4444" .. PBM_L["Some items not cached — using available data."] .. "|r") end PBM.State.LichborneCacheRetries = 0 end @@ -177,9 +177,9 @@ local function CalcGS() local c = PBM.CLASS_COLORS[cls] local hex = c and string.format("|cff%02x%02x%02x", math.floor(c.r * 255), math.floor(c.g * 255), math.floor(c.b * 255)) or "|cffffffff" if LichborneAddStatus then - LichborneAddStatus:SetText(hex..name.."|r ("..cls..") - iLvl |cffffff00"..ilvl.."|r, GS |cffffff00"..realGs.."|r added!") + LichborneAddStatus:SetText(hex..name.."|r ("..cls..") - iLvl |cffffff00"..ilvl.."|r, GS |cffffff00"..realGs.."|r " .. PBM_L["added!"]) end - LichborneOutput(hex..name.."|r: iLvl |cffffff00"..ilvl.."|r GS |cffffff00"..realGs.."|r ("..count.." slots)", 1, 0.85, 0) + LichborneOutput(hex..name.."|r: iLvl |cffffff00"..ilvl.."|r GS |cffffff00"..realGs.."|r ("..count.." " .. PBM_L["slots"] .. ")", 1, 0.85, 0) PBM.DBG("|cff44ff44SUCCESS|r |cffffff88"..rowName.."|r iLvl="..ilvl.." GS="..realGs.." slots="..count) local targetName = UnitName("target") @@ -196,7 +196,7 @@ local function CalcGS() end if bestPoints > 0 then rowData.spec = specNames[bestTab] or rowData.spec - LichborneOutput(hex..name.."|r: |cffffff00"..specNames[bestTab].."|r ("..bestPoints.." pts)", 1, 0.85, 0) + LichborneOutput(hex..name.."|r: |cffffff00"..specNames[bestTab].."|r ("..bestPoints.." " .. PBM_L["pts"] .. ")", 1, 0.85, 0) end end end @@ -231,9 +231,9 @@ local function CalcGS() end end if LichborneAddStatus then - LichborneAddStatus:SetText("|cffff4444No gear data returned. Target may be out of range.|r") + LichborneAddStatus:SetText("|cffff4444" .. PBM_L["No gear data returned. Target may be out of range."] .. "|r") end - LichborneOutput("|cffff4444"..rowName..":|r |cffff4444FAILED — no gear data returned.|r", 1, 0.5, 0) + LichborneOutput("|cffff4444"..rowName..":|r |cffff4444" .. PBM_L["FAILED — no gear data returned."] .. "|r", 1, 0.5, 0) end PBM.DBG("CalcGS elapsed: |cffffff88"..string.format("%.3f", GetTime()-gsStartTime).."s|r") @@ -269,4 +269,4 @@ inspectFrame:SetScript("OnEvent", function(_, event, guid) PBM.State.inspectWait = 0 PBM.State.LichborneInspectRetries = 0 -- fresh INSPECT_READY means fresh data incoming CalcGS() -end) +end) \ No newline at end of file diff --git a/PBM/PBM_Item.lua b/PBM/PBM_Item.lua index 396d234..97895ca 100644 --- a/PBM/PBM_Item.lua +++ b/PBM/PBM_Item.lua @@ -13,7 +13,7 @@ PBM.addItem = function(pFrame, pInfo) if(tRare == nil) then tRare = 4 end -- for Security local tButton = pFrame.addButton(tName, tX, tY, tIcon, tLink) - pFrame.catButton("Catecher", 270, -490, 308, 524) + pFrame.catButton(PBM_L["Catecher"], 270, -490, 308, 524) tButton.item = {} tButton.item.id = tID diff --git a/PBM/PBM_Mage.lua b/PBM/PBM_Mage.lua index e145551..573f7ca 100644 --- a/PBM/PBM_Mage.lua +++ b/PBM/PBM_Mage.lua @@ -18,13 +18,13 @@ end -- Talent spec templates for the Set Talents menu local MAGE_TALENT_SPECS = { - { label="Arcane |cffffcc00PvE|r", spec="arcane pve", wowSpec="Arcane", icon="Interface\\Icons\\Spell_Holy_MagicalSentry" }, - { label="Fire |cffffcc00PvE|r", spec="fire pve", wowSpec="Fire", icon="Interface\\Icons\\Spell_Fire_FireBolt02" }, - { label="Frost |cffffcc00PvE|r", spec="frost pve", wowSpec="Frost", icon="Interface\\Icons\\Spell_Frost_FrostBolt02" }, - { label="Frostfire |cffffcc00PvE|r", spec="frostfire pve",wowSpec="Fire", icon="Interface\\Icons\\Ability_Mage_FrostFireBolt" }, - { label="Arcane |cffff4444PvP|r", spec="arcane pvp", wowSpec="Arcane", icon="Interface\\Icons\\Spell_Holy_MagicalSentry" }, - { label="Fire |cffff4444PvP|r", spec="fire pvp", wowSpec="Fire", icon="Interface\\Icons\\Spell_Fire_FireBolt02" }, - { label="Frost |cffff4444PvP|r", spec="frost pvp", wowSpec="Frost", icon="Interface\\Icons\\Spell_Frost_FrostBolt02" }, + { label=PBM_L["Arcane"] .. " |cffffcc00PvE|r", spec="arcane pve", wowSpec="Arcane", icon="Interface\\Icons\\Spell_Holy_MagicalSentry" }, + { label=PBM_L["Fire"] .. " |cffffcc00PvE|r", spec="fire pve", wowSpec="Fire", icon="Interface\\Icons\\Spell_Fire_FireBolt02" }, + { label=PBM_L["Frost"] .. " |cffffcc00PvE|r", spec="frost pve", wowSpec="Frost", icon="Interface\\Icons\\Spell_Frost_FrostBolt02" }, + { label=PBM_L["Frostfire"] .. " |cffffcc00PvE|r", spec="frostfire pve",wowSpec="Fire", icon="Interface\\Icons\\Ability_Mage_FrostFireBolt" }, + { label=PBM_L["Arcane"] .. " |cffff4444PvP|r", spec="arcane pvp", wowSpec="Arcane", icon="Interface\\Icons\\Spell_Holy_MagicalSentry" }, + { label=PBM_L["Fire"] .. " |cffff4444PvP|r", spec="fire pvp", wowSpec="Fire", icon="Interface\\Icons\\Spell_Fire_FireBolt02" }, + { label=PBM_L["Frost"] .. " |cffff4444PvP|r", spec="frost pvp", wowSpec="Frost", icon="Interface\\Icons\\Spell_Frost_FrostBolt02" }, } -- ───────────────────────────────────────────────────────────────────────────── @@ -87,7 +87,7 @@ function PBM.OpenMageMenu(row) local arcaneSpecLabel = arcaneSpecBox:CreateFontString(nil, "OVERLAY") arcaneSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") arcaneSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - arcaneSpecLabel:SetText("Arcane") + arcaneSpecLabel:SetText(PBM_L["Arcane"]) arcaneSpecLabel:SetPoint("LEFT", arcaneSpecBox, "LEFT", 18, 0) arcaneSpecLabel:SetPoint("RIGHT", arcaneSpecBox, "RIGHT", -2, 0) arcaneSpecLabel:SetJustifyH("CENTER") @@ -104,9 +104,9 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Arcane|r |cff999999- |r|cff69CCF0arcane|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Arcane mage DPS|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Fire, Frost, Frostfire.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Arcane"] .. "|r |cff999999- |r|cff69CCF0arcane|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Arcane mage DPS"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Fire, Frost, Frostfire."] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeArcaneBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -133,7 +133,7 @@ function PBM.OpenMageMenu(row) local fireSpecLabel = fireSpecBox:CreateFontString(nil, "OVERLAY") fireSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") fireSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - fireSpecLabel:SetText("Fire") + fireSpecLabel:SetText(PBM_L["Fire"]) fireSpecLabel:SetPoint("LEFT", fireSpecBox, "LEFT", 18, 0) fireSpecLabel:SetPoint("RIGHT", fireSpecBox, "RIGHT", -2, 0) fireSpecLabel:SetJustifyH("CENTER") @@ -150,9 +150,9 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Fire|r |cff999999- |r|cff69CCF0fire|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Fire mage DPS|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Arcane, Frost, Frostfire.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Fire"] .. "|r |cff999999- |r|cff69CCF0fire|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Fire mage DPS"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Arcane, Frost, Frostfire."] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeFireBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -179,7 +179,7 @@ function PBM.OpenMageMenu(row) local frostSpecLabel = frostSpecBox:CreateFontString(nil, "OVERLAY") frostSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") frostSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - frostSpecLabel:SetText("Frost") + frostSpecLabel:SetText(PBM_L["Frost"]) frostSpecLabel:SetPoint("LEFT", frostSpecBox, "LEFT", 18, 0) frostSpecLabel:SetPoint("RIGHT", frostSpecBox, "RIGHT", -2, 0) frostSpecLabel:SetJustifyH("CENTER") @@ -196,9 +196,9 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Frost|r |cff999999- |r|cff69CCF0frost|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Frost mage DPS|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Arcane, Fire, Frostfire.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Frost"] .. "|r |cff999999- |r|cff69CCF0frost|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Frost mage DPS"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Arcane, Fire, Frostfire."] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeFrostBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -225,7 +225,7 @@ function PBM.OpenMageMenu(row) local frostfireSpecLabel = frostfireSpecBox:CreateFontString(nil, "OVERLAY") frostfireSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") frostfireSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - frostfireSpecLabel:SetText("Frostfire") + frostfireSpecLabel:SetText(PBM_L["Frostfire"]) frostfireSpecLabel:SetPoint("LEFT", frostfireSpecBox, "LEFT", 18, 0) frostfireSpecLabel:SetPoint("RIGHT", frostfireSpecBox, "RIGHT", -2, 0) frostfireSpecLabel:SetJustifyH("CENTER") @@ -242,9 +242,9 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Frostfire|r |cff999999- |r|cff69CCF0frostfire|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Frostfire mage DPS|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Arcane, Fire, Frost.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Frostfire"] .. "|r |cff999999- |r|cff69CCF0frostfire|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Frostfire mage DPS"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Arcane, Fire, Frost."] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeFrostFireBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -268,7 +268,7 @@ function PBM.OpenMageMenu(row) local aoeSpecLabel = aoeSpecBox:CreateFontString(nil, "OVERLAY") aoeSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") aoeSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - aoeSpecLabel:SetText("AoE") + aoeSpecLabel:SetText(PBM_L["AoE"]) aoeSpecLabel:SetAllPoints() aoeSpecLabel:SetJustifyH("CENTER") @@ -284,9 +284,9 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00AoE|r |cff999999- |r|cff69CCF0aoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00AoE rotation modifier|r", 1, 1, 1) - GameTooltip:AddLine("Spec-aware — adapts to the active talent tree.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["AoE"] .. "|r |cff999999- |r|cff69CCF0aoe|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["AoE rotation modifier"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Spec-aware — adapts to the active talent tree."], 1, 1, 1) GameTooltip:Show() end) treeAoeBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -309,7 +309,7 @@ function PBM.OpenMageMenu(row) local firestarterSpecLabel = firestarterSpecBox:CreateFontString(nil, "OVERLAY") firestarterSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") firestarterSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - firestarterSpecLabel:SetText("Firestarter") + firestarterSpecLabel:SetText(PBM_L["Firestarter"]) firestarterSpecLabel:SetAllPoints() firestarterSpecLabel:SetJustifyH("CENTER") @@ -325,10 +325,10 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Firestarter|r |cff999999- |r|cff69CCF0firestarter|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Melee range opener|r", 1, 1, 1) - GameTooltip:AddLine("Runs to melee range to use |cff5599EEDragon's Breath|r", 1, 1, 1) - GameTooltip:AddLine("and |cff5599EEBlast Wave|r as openers.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Firestarter"] .. "|r |cff999999- |r|cff69CCF0firestarter|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Melee range opener"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Runs to melee range to use |cff5599EEDragon's Breath|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["and |cff5599EEBlast Wave|r as openers."], 1, 1, 1) GameTooltip:Show() end) treeFirestarterBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -351,7 +351,7 @@ function PBM.OpenMageMenu(row) local buffsSpecLabel = buffsSpecBox:CreateFontString(nil, "OVERLAY") buffsSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") buffsSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - buffsSpecLabel:SetText("Buffs (Self)") + buffsSpecLabel:SetText(PBM_L["Buffs (Self)"]) buffsSpecLabel:SetAllPoints() buffsSpecLabel:SetJustifyH("CENTER") @@ -367,12 +367,12 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Mage Armor|r |cff999999- |r|cffffff00bmana|r |cffff8000NC|r") - GameTooltip:AddLine("|cffffcc00Mana regen armor|r", 1, 1, 1) - GameTooltip:AddLine("Increases |cff1EFF00resistance|r to magic debuffs.", 1, 1, 1) - GameTooltip:AddLine("|cff3A8FC4Mana|r regeneration continues while casting.", 1, 1, 1) - GameTooltip:AddLine("Best for survivability and mana-intensive fights.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Molten Armor.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Mage Armor"] .. "|r |cff999999- |r|cffffff00bmana|r |cffff8000NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Mana regen armor"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Increases |cff1EFF00resistance|r to magic debuffs."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cff3A8FC4Mana|r regeneration continues while casting."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Best for survivability and mana-intensive fights."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Molten Armor.|r"], 1, 1, 1) GameTooltip:Show() end) treeMageArmorBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -392,12 +392,12 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Molten Armor|r |cff999999- |r|cffffff00bdps|r |cffff8000NC|r") - GameTooltip:AddLine("|cffffcc00Crit DPS armor|r", 1, 1, 1) - GameTooltip:AddLine("Causes |cffFF4444fire damage|r when hit.", 1, 1, 1) - GameTooltip:AddLine("Increases |cffFF9900crit chance|r by your |cff1EFF00Spirit|r.", 1, 1, 1) - GameTooltip:AddLine("Best for pure DPS output.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Mage Armor.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Molten Armor"] .. "|r |cff999999- |r|cffffff00bdps|r |cffff8000NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Crit DPS armor"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Causes |cffFF4444fire damage|r when hit."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Increases |cffFF9900crit chance|r by your |cff1EFF00Spirit|r."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Best for pure DPS output."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Mage Armor.|r"], 1, 1, 1) GameTooltip:Show() end) treeMoltenArmorBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -420,7 +420,7 @@ function PBM.OpenMageMenu(row) local assistSpecLabel = assistSpecBox:CreateFontString(nil, "OVERLAY") assistSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") assistSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - assistSpecLabel:SetText("Assist") + assistSpecLabel:SetText(PBM_L["Assist"]) assistSpecLabel:SetAllPoints() assistSpecLabel:SetJustifyH("CENTER") @@ -436,9 +436,9 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Tank target focus|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks the tank's current target.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Tank Assist"] .. "|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Tank target focus"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks the tank's current target."], 1, 1, 1) GameTooltip:Show() end) treeTankAssistBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -458,9 +458,9 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00DPS target focus|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks the main DPS focus target.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["DPS Assist"] .. "|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["DPS target focus"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks the main DPS focus target."], 1, 1, 1) GameTooltip:Show() end) treeDpsAssistBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -480,9 +480,9 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00DPS AoE|r |cff999999- |r|cff69CCF0aoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Cross-role AoE mode|r", 1, 1, 1) - GameTooltip:AddLine("Bot switches to |cffffcc00AoE|r rotation.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["DPS AoE"] .. "|r |cff999999- |r|cff69CCF0aoe|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Cross-role AoE mode"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot switches to |cffffcc00AoE|r rotation."], 1, 1, 1) GameTooltip:Show() end) treeDpsAoeBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -508,7 +508,7 @@ function PBM.OpenMageMenu(row) buffSideHdrLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") buffSideHdrLabel:SetTextColor(0.78, 0.61, 0.23, 1) buffSideHdrLabel:SetAllPoints(); buffSideHdrLabel:SetJustifyH("CENTER") - buffSideHdrLabel:SetText("Buff") + buffSideHdrLabel:SetText(PBM_L["Buff"]) local treeSideBuffBtn = CreateFrame("Button", nil, LichborneMageMenu) treeSideBuffBtn:SetSize(EXT_ICON_SIZE, EXT_ICON_SIZE) @@ -523,10 +523,10 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Buff|r |cff999999- |r|cffffff00buff|r |cffff8000NC|r") - GameTooltip:AddLine("|cffffcc00Group Intellect buff|r", 1, 1, 1) - GameTooltip:AddLine("|cff5599EEArcane Intellect|r on all party members.", 1, 1, 1) - GameTooltip:AddLine("Increases |cffffcc00Intellect|r for 30 min.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Buff"] .. "|r |cff999999- |r|cffffff00buff|r |cffff8000NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Group Intellect buff"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cff5599EEArcane Intellect|r on all party members."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Increases |cffffcc00Intellect|r for 30 min."], 1, 1, 1) GameTooltip:Show() end) treeSideBuffBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -551,7 +551,7 @@ function PBM.OpenMageMenu(row) ccSideHdrLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") ccSideHdrLabel:SetTextColor(0.78, 0.61, 0.23, 1) ccSideHdrLabel:SetAllPoints(); ccSideHdrLabel:SetJustifyH("CENTER") - ccSideHdrLabel:SetText("CC") + ccSideHdrLabel:SetText(PBM_L["CC"]) local treeCCBtn = CreateFrame("Button", nil, LichborneMageMenu) treeCCBtn:SetSize(EXT_ICON_SIZE, EXT_ICON_SIZE) @@ -566,10 +566,10 @@ function PBM.OpenMageMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneMageMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00CC|r |cff999999- |r|cffff8000cc|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Crowd control|r", 1, 1, 1) - GameTooltip:AddLine("Sheeps (|cff5599EEPolymorph|r) extra targets in combat.", 1, 1, 1) - GameTooltip:AddLine("Re-applies when the effect breaks.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["CC"] .. "|r |cff999999- |r|cffff8000cc|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Crowd control"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Sheeps (|cff5599EEPolymorph|r) extra targets in combat."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Re-applies when the effect breaks."], 1, 1, 1) GameTooltip:Show() end) treeCCBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -834,4 +834,4 @@ function PBM.OpenMageMenu(row) HideAllMage(); return end PBM.ShowCharSheet(LichborneMageMenu, LichborneMageCatcher, row, MAGE_LEFT_EXT) -end +end \ No newline at end of file diff --git a/PBM/PBM_Minimap.lua b/PBM/PBM_Minimap.lua index 3c330e9..feadac4 100644 --- a/PBM/PBM_Minimap.lua +++ b/PBM/PBM_Minimap.lua @@ -8,7 +8,7 @@ local dbicon = LibStub("LibDBIcon-1.0", true) local miniButton = LibStub("LibDataBroker-1.1"):NewDataObject("PlayerBotManager", { type = "launcher", - text = "Playerbot Manager", + text = PBM_L["Playerbot Manager"], icon = "Interface\\Icons\\INV_Misc_Book_11", OnClick = function(self, btn) if LichborneTrackerFrame and LichborneTrackerFrame:IsShown() then @@ -19,9 +19,9 @@ local miniButton = LibStub("LibDataBroker-1.1"):NewDataObject("PlayerBotManager" end, OnTooltipShow = function(tooltip) if not tooltip or not tooltip.AddLine then return end - tooltip:AddLine("|cffC69B3APlayerbot Manager|r") - tooltip:AddLine("Left-Click to Toggle", 1, 1, 1) - tooltip:AddLine("Drag to Reposition", 0.7, 0.7, 0.7) + tooltip:AddLine("|cffC69B3A" .. PBM_L["Playerbot Manager"] .. "|r") + tooltip:AddLine(PBM_L["Left-Click to Toggle"], 1, 1, 1) + tooltip:AddLine(PBM_L["Drag to Reposition"], 0.7, 0.7, 0.7) end, }) @@ -35,4 +35,4 @@ _minimapFrame:SetScript("OnEvent", function() if dbicon then dbicon:Register("PlayerBotManager", miniButton, LichborneMinimapIconDB) end -end) +end) \ No newline at end of file diff --git a/PBM/PBM_MultibotPanel.lua b/PBM/PBM_MultibotPanel.lua index 2593b63..24a34e6 100644 --- a/PBM/PBM_MultibotPanel.lua +++ b/PBM/PBM_MultibotPanel.lua @@ -61,7 +61,7 @@ local function ShowConfirm(titleText, bodyText, onYes) yBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") local yLbl = yBtn:CreateFontString(nil, "OVERLAY", "GameFontNormal") yLbl:SetAllPoints(yBtn); yLbl:SetJustifyH("CENTER") - yLbl:SetText("Yes") + yLbl:SetText(PBM_L["Yes"]) yLbl:SetTextColor(1, 1, 1) confirmFrame._yBtn = yBtn @@ -76,7 +76,7 @@ local function ShowConfirm(titleText, bodyText, onYes) nBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") local nLbl = nBtn:CreateFontString(nil, "OVERLAY", "GameFontNormal") nLbl:SetAllPoints(nBtn); nLbl:SetJustifyH("CENTER") - nLbl:SetText("Cancel") + nLbl:SetText(PBM_L["Cancel"]) nLbl:SetTextColor(1, 1, 1) nBtn:SetScript("OnClick", function() confirmFrame:Hide() end) end @@ -100,19 +100,19 @@ end local BUTTONS = { -- ── submenu ───────────────────────────────────────────── { - name = "Talent", icon = "Ability_Marksmanship", btype = "activate", - tipTitle = "Open Talents", + name = PBM_L["Talent"], icon = "Ability_Marksmanship", btype = "activate", + tipTitle = PBM_L["Open Talents"], cmd = function(bot) PBM.OpenTalentWindow(bot) end, }, -- ── activate ──────────────────────────────────────────── { - name = "Inv.", icon = "INV_Misc_Bag_08", btype = "activate", - tipTitle = "Open Inventory", + name = PBM_L["Inv."], icon = "INV_Misc_Bag_08", btype = "activate", + tipTitle = PBM_L["Open Inventory"], cmd = function(bot) PBM.OpenInventoryWindow(bot) end, }, { - name = "Spells", icon = "INV_Misc_Book_09", btype = "activate", - tipTitle = "Open Spellbook", + name = PBM_L["Spells"], icon = "INV_Misc_Book_09", btype = "activate", + tipTitle = PBM_L["Open Spellbook"], cmd = function(bot) PBM.OpenSpellbookWindow(bot) end, }, } @@ -323,4 +323,4 @@ function PBM.AddMultibotButtons(overlay) end overlay._lastMultibotBtn = prevBtn -end +end \ No newline at end of file diff --git a/PBM/PBM_Needs.lua b/PBM/PBM_Needs.lua index 74bcd65..33dee29 100644 --- a/PBM/PBM_Needs.lua +++ b/PBM/PBM_Needs.lua @@ -16,10 +16,10 @@ PBM.State.profSelectSeq = 0 -- Role slots for the prof picker (T/H/D/A — stored in LichborneTrackerDB.charRoles) local ROLE_PICKER_SLOTS = { - { key="T", label="Tank", icon="Interface\\Icons\\Ability_Warrior_DefensiveStance", color={r=0.20,g=0.60,b=1.00} }, - { key="H", label="Healer", icon="Interface\\Icons\\Spell_ChargePositive", color={r=0.20,g=1.00,b=0.40} }, - { key="D", label="DPS", icon="Interface\\Icons\\Ability_DualWield", color={r=1.00,g=0.40,b=0.20} }, - { key="A", label="AoE", icon="Interface\\Icons\\Spell_Shadow_RainOfFire", color={r=0.58,g=0.51,b=0.79} }, + { key="T", label=PBM_L["Tanque"], icon="Interface\\Icons\\Ability_Warrior_DefensiveStance", color={r=0.20,g=0.60,b=1.00} }, + { key="H", label=PBM_L["Sanador"], icon="Interface\\Icons\\Spell_ChargePositive", color={r=0.20,g=1.00,b=0.40} }, + { key="D", label=PBM_L["DPS"], icon="Interface\\Icons\\Ability_DualWield", color={r=1.00,g=0.40,b=0.20} }, + { key="A", label=PBM_L["AoE"], icon="Interface\\Icons\\Spell_Shadow_RainOfFire", color={r=0.58,g=0.51,b=0.79} }, } function PBM.GetNeeds(charName) @@ -124,13 +124,13 @@ function PBM.BuildPickerIfNeeded() btn:SetScript("OnEnter",function() if pf.title then local owned = PBM.State.needsPickerOwner and PBM.GetNeeds(PBM.State.needsPickerOwner)[slot.key] - local hint = owned and "|cffff6666 (right-click to remove)|r" or "|cff66ff66 click to mark|r" + local hint = owned and PBM_L["|cffff6666 (clic derecho para eliminar)|r"] or PBM_L["|cff66ff66 clic para marcar|r"] pf.title:SetText("|cffC69B3A"..slot.label.."|r"..hint) end end) btn:SetScript("OnLeave",function() if pf.title and PBM.State.needsPickerOwner then - pf.title:SetText("|cffC69B3ANeeds: |r|cffffff00"..PBM.State.needsPickerOwner.."|r") + pf.title:SetText("|cffC69B3A" .. PBM_L["Necesidades: "] .. "|r|cffffff00"..PBM.State.needsPickerOwner.."|r") end end) btn:SetScript("OnClick",function(_, mouseButton) @@ -178,7 +178,7 @@ function PBM.OpenNeedsPicker(anchorFrame, charName) if not charName or charName=="" then return end PBM.BuildPickerIfNeeded() PBM.State.needsPickerOwner=charName - PBM.State.needsPicker.title:SetText("|cffC69B3ANeeds: |r|cffffff00"..charName.."|r") + PBM.State.needsPicker.title:SetText("|cffC69B3A" .. PBM_L["Necesidades: "] .. "|r|cffffff00"..charName.."|r") local needs3=PBM.GetNeeds(charName) local count3=0; for _ in pairs(needs3) do count3=count3+1 end for _,sb in ipairs(PBM.State.needsPicker.slotBtns) do @@ -232,14 +232,14 @@ function PBM.MakeNeedsCell(parent, xOff, rowH, getCharName, hovTex, overrideW) local cname=getCharName() if cname and cname~="" then GameTooltip:SetOwner(cf,"ANCHOR_RIGHT") - GameTooltip:AddLine("|cffC69B3ANeeds:|r "..cname,1,1,1) + GameTooltip:AddLine("|cffC69B3A" .. PBM_L["Necesidades:"] .. "|r "..cname,1,1,1) local needs4=PBM.GetNeeds(cname) local any=false for _,slot in ipairs(PBM.NEEDS_SLOTS) do if needs4[slot.key] then GameTooltip:AddLine(" "..slot.label,1,0.6,0.2); any=true end end - if not any then GameTooltip:AddLine(" Nothing marked",0.5,0.5,0.5) end - GameTooltip:AddLine("|cff888888Click to edit (max 2) Right-click clears all|r",0.6,0.6,0.6) + if not any then GameTooltip:AddLine(" " .. PBM_L["Nada marcado"],0.5,0.5,0.5) end + GameTooltip:AddLine(PBM_L["|cff888888Clic para editar (máx 2) Clic derecho borra todo|r"],0.6,0.6,0.6) GameTooltip:Show() end end) @@ -403,13 +403,13 @@ function PBM.BuildProfPickerIfNeeded() btn:SetScript("OnEnter",function() if pf.title then local owned = PBM.State.profPickerOwner and PBM.GetProfs(PBM.State.profPickerOwner)[slot.key] - local hint = owned and "|cffff6666 (right-click to remove)|r" or "|cff66ff66 click to mark|r" + local hint = owned and PBM_L["|cffff6666 (clic derecho para eliminar)|r"] or PBM_L["|cff66ff66 clic para marcar|r"] pf.title:SetText("|cffC69B3A"..slot.label.."|r"..hint) end end) btn:SetScript("OnLeave",function() if pf.title and PBM.State.profPickerOwner then - pf.title:SetText("|cffC69B3AProfs: |r|cffffff00"..PBM.State.profPickerOwner.."|r") + pf.title:SetText("|cffC69B3A" .. PBM_L["Profs: "] .. "|r|cffffff00"..PBM.State.profPickerOwner.."|r") end end) btn:SetScript("OnClick",function(_, mouseButton) @@ -477,7 +477,7 @@ function PBM.BuildProfPickerIfNeeded() local needsHdrLbl = pf:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") needsHdrLbl:SetPoint("TOPLEFT",pf,"TOPLEFT",6, sepY - 2) - needsHdrLbl:SetText("|cffC69B3ANeeds|r") + needsHdrLbl:SetText("|cffC69B3A" .. PBM_L["Necesidades"] .. "|r") -- ── Needs buttons ───────────────────────────────────────────────────────── local needsBaseY = -(PROF_H + PAD + NEEDS_HDR_H + PAD) @@ -502,13 +502,13 @@ function PBM.BuildProfPickerIfNeeded() btn:SetScript("OnEnter",function() if pf.title then local owned = PBM.State.profPickerOwner and PBM.GetNeeds(PBM.State.profPickerOwner)[slot.key] - local hint = owned and "|cffff6666 (right-click to remove)|r" or "|cff66ff66 click to mark|r" + local hint = owned and PBM_L["|cffff6666 (clic derecho para eliminar)|r"] or PBM_L["|cff66ff66 clic para marcar|r"] pf.title:SetText("|cffC69B3A"..slot.label.."|r"..hint) end end) btn:SetScript("OnLeave",function() if pf.title and PBM.State.profPickerOwner then - pf.title:SetText("|cffC69B3AProfs: |r|cffffff00"..PBM.State.profPickerOwner.."|r") + pf.title:SetText("|cffC69B3A" .. PBM_L["Profs: "] .. "|r|cffffff00"..PBM.State.profPickerOwner.."|r") end end) btn:SetScript("OnClick",function(_, mouseButton) @@ -572,7 +572,7 @@ function PBM.BuildProfPickerIfNeeded() local roleHdrLbl = pf:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") roleHdrLbl:SetPoint("TOPLEFT",pf,"TOPLEFT",6, needsBottomY - PAD) - roleHdrLbl:SetText("|cffC69B3ARole|r") + roleHdrLbl:SetText("|cffC69B3A" .. PBM_L["Rol"] .. "|r") -- Store role section frames so OpenProfPicker can hide them when hideRole=true pf.roleSectionFrames = { roleSep, roleHdrLbl } @@ -602,13 +602,13 @@ function PBM.BuildProfPickerIfNeeded() btn:SetScript("OnEnter",function() if pf.title then local owned = PBM.State.profPickerOwner and PBM.GetCharRoles(PBM.State.profPickerOwner)[slot.key] - local hint = owned and "|cffff6666 (click to remove)|r" or "|cff66ff66 click to add|r" + local hint = owned and PBM_L["|cffff6666 (clic para quitar)|r"] or PBM_L["|cff66ff66 clic para añadir|r"] pf.title:SetText("|cffC69B3A"..slot.label.."|r"..hint) end end) btn:SetScript("OnLeave",function() if pf.title and PBM.State.profPickerOwner then - pf.title:SetText("|cffC69B3AProfs: |r|cffffff00"..PBM.State.profPickerOwner.."|r") + pf.title:SetText("|cffC69B3A" .. PBM_L["Profs: "] .. "|r|cffffff00"..PBM.State.profPickerOwner.."|r") end end) btn:SetScript("OnClick",function(_, mouseButton) @@ -686,7 +686,7 @@ function PBM.OpenProfPicker(anchorFrame, charName, hideRole) if not charName or charName=="" then return end PBM.BuildProfPickerIfNeeded() PBM.State.profPickerOwner=charName - PBM.State.profPicker.title:SetText("|cffC69B3AProfs: |r|cffffff00"..charName.."|r") + PBM.State.profPicker.title:SetText("|cffC69B3A" .. PBM_L["Profs: "] .. "|r|cffffff00"..charName.."|r") -- Show or hide the Role section if PBM.State.profPicker.roleSectionFrames then for _, f in ipairs(PBM.State.profPicker.roleSectionFrames) do @@ -781,11 +781,11 @@ function PBM.MakeProfCell(parent, xOff, rowH, getCharName, hovTex, overrideW) local cname=getCharName() if cname and cname~="" then GameTooltip:SetOwner(cf,"ANCHOR_RIGHT") - GameTooltip:AddLine("|cffC69B3AProf / Role:|r "..cname,1,1,1) + GameTooltip:AddLine("|cffC69B3A" .. PBM_L["Prof / Rol:"] .. "|r "..cname,1,1,1) local any=false -- Roles local roles4=PBM.GetCharRoles(cname) - local roleLabels={T="Tank",H="Healer",D="DPS",A="AoE"} + local roleLabels={T=PBM_L["Tanque"],H=PBM_L["Sanador"],D=PBM_L["DPS"],A=PBM_L["AoE"]} local roleColors={T={0.20,0.60,1.00},H={0.20,1.00,0.40},D={1.00,0.40,0.20},A={0.58,0.51,0.79}} for _,slot in ipairs(ROLE_PICKER_SLOTS) do if roles4[slot.key] then @@ -798,8 +798,8 @@ function PBM.MakeProfCell(parent, xOff, rowH, getCharName, hovTex, overrideW) for _,slot in ipairs(PBM.PROF_SLOTS) do if profs4[slot.key] then GameTooltip:AddLine(" "..slot.label,1,0.6,0.2); any=true end end - if not any then GameTooltip:AddLine(" Nothing marked",0.5,0.5,0.5) end - GameTooltip:AddLine("|cff888888Click to edit · Right-click clears all|r",0.6,0.6,0.6) + if not any then GameTooltip:AddLine(" " .. PBM_L["Nada marcado"],0.5,0.5,0.5) end + GameTooltip:AddLine(PBM_L["|cff888888Clic para editar · Clic derecho borra todo|r"],0.6,0.6,0.6) GameTooltip:Show() end end) @@ -810,4 +810,4 @@ function PBM.MakeProfCell(parent, xOff, rowH, getCharName, hovTex, overrideW) end) PBM.State.profCellFrames[#PBM.State.profCellFrames+1]={frame=cf,getCharName=getCharName} return cf -end +end \ No newline at end of file diff --git a/PBM/PBM_Notes.lua b/PBM/PBM_Notes.lua index 35b8607..73b98eb 100644 --- a/PBM/PBM_Notes.lua +++ b/PBM/PBM_Notes.lua @@ -212,7 +212,7 @@ end function PBM.ComputeBotNotes(name, coSet, ncSet) local cls = PBM.GetBotClass(name) if not cls then - LichborneOutput("|cffff4444CHARACTER NOT AVAILABLE: " .. name .. "|r") + LichborneOutput("|cffff4444" .. PBM_L["CHARACTER NOT AVAILABLE: "] .. name .. "|r") return nil, {} end @@ -306,4 +306,4 @@ function PBM.ApplyBotNotes(name, coSet, ncSet) -- Refresh UI if visible if PBM.RefreshRaidRows then PBM.RefreshRaidRows() end if PBM.RefreshOverviewRows then PBM.RefreshOverviewRows() end -end +end \ No newline at end of file diff --git a/PBM/PBM_Overview.lua b/PBM/PBM_Overview.lua index 1bfb57b..8d48a37 100644 --- a/PBM/PBM_Overview.lua +++ b/PBM/PBM_Overview.lua @@ -31,7 +31,7 @@ PBM.RefreshOverviewRows = function() local g = LichborneTrackerDB.allGroup or "A" if LichborneAllPageLbl then local pageNum = ({A="1",B="2",C="3"})[g] or g - LichborneAllPageLbl:SetText("|cffd4af37Page "..pageNum.." v|r") + LichborneAllPageLbl:SetText(string.format("|cffd4af37"..PBM_L["Page %s v"].."|r", pageNum)) end -- Overflow sync: rebuild all three groups from class tabs sequentially @@ -327,9 +327,9 @@ PBM.RefreshOverviewRows = function() local charName = data.name rf.roleArea:SetScript("OnEnter", function() GameTooltip:SetOwner(rf.roleArea, "ANCHOR_RIGHT") - GameTooltip:AddLine("Role", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Role"], 1, 1, 1) local fr2 = PBM.GetFilterRolesByName(charName) or {} - local roleLabels = {T="Tank",H="Healer",D="DPS",A="AoE"} + local roleLabels = {T=PBM_L["Tank"],H=PBM_L["Healer"],D=PBM_L["DPS"],A=PBM_L["AoE"]} local roleColors = {T={0.20,0.60,1.00},H={0.20,1.00,0.40},D={1.00,0.40,0.20},A={0.58,0.51,0.79}} local any = false for _, k in ipairs({"T","H","D","A"}) do @@ -340,8 +340,8 @@ PBM.RefreshOverviewRows = function() any = true end end - if not any then GameTooltip:AddLine("No role set", 0.5,0.5,0.5) end - GameTooltip:AddLine("|cff888888Click to set · Right-click to clear|r", 0.6,0.6,0.6) + if not any then GameTooltip:AddLine(PBM_L["No role set"], 0.5,0.5,0.5) end + GameTooltip:AddLine(PBM_L["|cff888888Click to set · Right-click to clear|r"], 0.6,0.6,0.6) GameTooltip:Show() end) rf.roleArea:SetScript("OnClick", function(self, btn) @@ -360,10 +360,10 @@ PBM.RefreshOverviewRows = function() -- Filter off: restore static tooltip, remove click rf.roleArea:SetScript("OnEnter", function() GameTooltip:SetOwner(rf.roleArea, "ANCHOR_RIGHT") - GameTooltip:AddLine("Role", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Role"], 1, 1, 1) if hasData then local roles = PBM.GetSortedVisRoles(data.name) - local roleLabels = {T="Tank",H="Healer",D="DPS",A="AoE"} + local roleLabels = {T=PBM_L["Tank"],H=PBM_L["Healer"],D=PBM_L["DPS"],A=PBM_L["AoE"]} local roleColors = {T={0.20,0.60,1.00},H={0.20,1.00,0.40},D={1.00,0.40,0.20},A={0.58,0.51,0.79}} for _, k in ipairs(roles) do local ic = PBM.NOTES_ROLE_ICONS and PBM.NOTES_ROLE_ICONS[k] or "" @@ -442,14 +442,14 @@ PBM.RefreshOverviewRows = function() local c = cls ~= "" and PBM.CLASS_COLORS[cls] GameTooltip:SetOwner(specFrame, "ANCHOR_RIGHT") if spec ~= "" then - GameTooltip:AddLine(spec, 1, 1, 1) + GameTooltip:AddLine(PBM_L[spec] or spec, 1, 1, 1) end if cls ~= "" then - if c then GameTooltip:AddLine(cls, c.r, c.g, c.b) - else GameTooltip:AddLine(cls, 0.8, 0.8, 0.9) end + if c then GameTooltip:AddLine(PBM_L[cls] or cls, c.r, c.g, c.b) + else GameTooltip:AddLine(PBM_L[cls] or cls, 0.8, 0.8, 0.9) end end if spec == "" and cls == "" then - GameTooltip:AddLine("Empty", 0.4, 0.4, 0.4) + GameTooltip:AddLine(PBM_L["Empty"], 0.4, 0.4, 0.4) end GameTooltip:Show() end) @@ -467,11 +467,11 @@ PBM.RefreshOverviewRows = function() if btn == "RightButton" then UninviteUnit(d.name) SendChatMessage(".playerbots bot remove "..d.name, "SAY") - LichborneOutput("|cffC69B3APBM:|r Removed "..hex..d.name.."|r from bots.", 1, 0.85, 0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r Removed "]..hex..d.name.."|r"..PBM_L[" from bots."], 1, 0.85, 0) return end SendChatMessage(".playerbots bot add "..d.name, "SAY") - if LichborneAddStatus then LichborneAddStatus:SetText("Invited "..hex..d.name.."|r to group.") end + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["Invited "]..hex..d.name.."|r"..PBM_L[" to group."]) end end) end -- Add to Raid btn @@ -496,7 +496,7 @@ PBM.RefreshOverviewRows = function() roster[ri] = {name="", cls="", spec="", gs=0, realGs=0, role="", notes=""} rf.addRaidBtn:SetText("|cff44ff44+|r") if LichborneAddStatus then - LichborneAddStatus:SetText(hex..d.name.."|r removed from raid slot "..slot..".") + LichborneAddStatus:SetText(hex..d.name.."|r"..PBM_L[" removed from raid slot "]..slot..".") end if LichborneRaidFrame then PBM.RefreshRaidRows() end PBM.RefreshOverviewRows() @@ -509,20 +509,20 @@ PBM.RefreshOverviewRows = function() local roster, raidSize = PBM.GetCurrentRoster() for ri = 1, raidSize do if roster[ri] and roster[ri].name and roster[ri].name:lower() == d.name:lower() then - if LichborneAddStatus then LichborneAddStatus:SetText(hex..d.name.."|r is already in the Raid.") end; return + if LichborneAddStatus then LichborneAddStatus:SetText(hex..d.name.."|r"..PBM_L[" is already in the Raid."]) end; return end end for ri = 1, raidSize do if not roster[ri] or roster[ri].name == "" then roster[ri] = {name=d.name, cls=d.cls or "",spec=d.spec or "",gs=d.gs or 0, realGs=d.realGs or 0, role="", notes=""} - if LichborneAddStatus then LichborneAddStatus:SetText(hex..d.name.."|r added to raid slot "..ri..".") end + if LichborneAddStatus then LichborneAddStatus:SetText(hex..d.name.."|r"..PBM_L[" added to raid slot "]..ri..".") end -- Color + orange after successful add rf.addRaidBtn:SetText("|cffb25b00+|r") if LichborneRaidFrame then PBM.RefreshRaidRows() end return end end - if LichborneAddStatus then LichborneAddStatus:SetText("Raid is full!") end + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["Raid is full!"]) end end) end -- Wire delete button @@ -533,7 +533,7 @@ PBM.RefreshOverviewRows = function() local charName = d.name PBM.RemoveCharacterReferences(charName) if LichborneAddStatus then - LichborneAddStatus:SetText("|cffff6666"..charName.."|r removed from tracker.") + LichborneAddStatus:SetText("|cffff6666"..charName.."|r"..PBM_L[" removed from tracker."]) end PBM.RefreshRows() PBM.RefreshOverviewRows() @@ -557,7 +557,7 @@ PBM.RefreshOverviewRows = function() if c then local n = allCounts[cls] or 0 local hex = string.format("|cff%02x%02x%02x",math.floor(c.r*255),math.floor(c.g*255),math.floor(c.b*255)) - lbl:SetText(hex..(PBM.TAB_LABELS[cls])..": |cffd4af37"..n.."|r") + lbl:SetText(hex..(PBM.TAB_LABELS[cls] or cls)..": |cffd4af37"..n.."|r") local sw = lbl:GetParent() if sw and sw.bg then if n > 0 then sw.bg:SetTexture(c.r*0.25,c.g*0.25,c.b*0.30,1) @@ -593,7 +593,7 @@ function PBM.BuildOverviewFrame(parent, fl) local allTitle = allHdr:CreateFontString(nil,"OVERLAY","GameFontNormal") allTitle:SetPoint("TOPLEFT",allHdr,"TOPLEFT",0,0); allTitle:SetPoint("TOPRIGHT",allHdr,"TOPRIGHT",0,0) allTitle:SetHeight(24); allTitle:SetJustifyH("CENTER"); allTitle:SetJustifyV("MIDDLE") - allTitle:SetText("|cffd4af37Overview|r") + allTitle:SetText("|cffd4af37"..PBM_L["Overview"].."|r") -- Sort / Clear buttons local function MakeHdrBtn(lbl, br, bg2, bb, xOff, w) @@ -617,7 +617,7 @@ function PBM.BuildOverviewFrame(parent, fl) overviewPageBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") local allPageLbl = overviewPageBtn:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") allPageLbl:SetAllPoints(overviewPageBtn); allPageLbl:SetJustifyH("CENTER"); allPageLbl:SetJustifyV("MIDDLE") - allPageLbl:SetText("|cffd4af37Page 1 v|r") + allPageLbl:SetText("|cffd4af37"..PBM_L["Page 1 v"].."|r") LichborneAllPageLbl = allPageLbl LichborneAllPagePrev = nil LichborneAllPageNext = nil @@ -658,7 +658,7 @@ function PBM.BuildOverviewFrame(parent, fl) local g = LichborneTrackerDB.allGroup or "A" if LichborneAllPageLbl then local pageNum = ({A="1",B="2",C="3"})[g] or g - LichborneAllPageLbl:SetText("|cffd4af37Page "..pageNum.." v|r") + LichborneAllPageLbl:SetText(string.format("|cffd4af37"..PBM_L["Page %s v"].."|r", pageNum)) end if LichborneAllPagePrev then LichborneAllPagePrev:SetAlpha(g ~= "A" and 1.0 or 0.35) end if LichborneAllPageNext then LichborneAllPageNext:SetAlpha(g ~= "C" and 1.0 or 0.35) end @@ -677,7 +677,7 @@ function PBM.BuildOverviewFrame(parent, fl) mb:SetBackdrop({bgFile="Interface\\ChatFrame\\ChatFrameBackground",edgeFile="Interface\\Tooltips\\UI-Tooltip-Border",tile=true,tileSize=16,edgeSize=8,insets={left=1,right=1,top=1,bottom=1}}) mb:SetBackdropColor(0.05,0.08,0.20,1); mb:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local mblbl=mb:CreateFontString(nil,"OVERLAY","GameFontNormal"); mblbl:SetAllPoints(mb); mblbl:SetJustifyH("CENTER") - mblbl:SetText("|cffd4af37Page "..gi.."|r") + mblbl:SetText(string.format("|cffd4af37"..PBM_L["Page %d"].."|r", gi)) local cap=gname mb:SetScript("OnClick",function() LichborneTrackerDB.allGroup=cap; UpdateOverviewGroupDD(); overviewGroupMenu:Hide(); PBM.RefreshOverviewRows() @@ -727,7 +727,7 @@ function PBM.BuildOverviewFrame(parent, fl) entry.fsList[#entry.fsList+1] = fs btn:SetScript("OnEnter",function() GameTooltip:SetOwner(btn,"ANCHOR_RIGHT") - GameTooltip:AddLine("Click to sort",1,1,1) + GameTooltip:AddLine(PBM_L["Click to sort"],1,1,1) GameTooltip:Show() end) btn:SetScript("OnLeave",function() GameTooltip:Hide() end) @@ -742,15 +742,15 @@ function PBM.BuildOverviewFrame(parent, fl) PBM.RefreshOverviewRows() end) end - H("#",0,14) - ASH("Spec",14,48,"spec",false) - ASH("Name",60,128,"name",false) - ASH("iLvL",189,38,"ilvl",true) - ASH("GS",227,38,"gs",true) - ASH("Role",268,36,"role",false) - ASH("+",308,18,"inraid",false) + H(PBM_L["#"],0,14) + ASH(PBM_L["Spec"],14,48,"spec",false) + ASH(PBM_L["Name"],60,128,"name",false) + ASH(PBM_L["iLvL"],189,38,"ilvl",true) + ASH(PBM_L["GS"],227,38,"gs",true) + ASH(PBM_L["Role"],268,36,"role",false) + ASH(PBM_L["+"],308,18,"inraid",false) else - H("Spec",16,44); H("Name",62,126); H("iLvL",192,36); H("GS",230,36); H("Role",268,36) + H(PBM_L["Spec"],16,44); H(PBM_L["Name"],62,126); H(PBM_L["iLvL"],192,36); H(PBM_L["GS"],230,36); H(PBM_L["Role"],268,36) end end @@ -820,8 +820,8 @@ function PBM.BuildOverviewFrame(parent, fl) roleArea:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") roleArea:SetScript("OnEnter", function() GameTooltip:SetOwner(roleArea, "ANCHOR_RIGHT") - GameTooltip:AddLine("Role",1,1,1) - local roleLabels = { T={"Tank",0.20,0.60,1.00}, H={"Healer",0.20,1.00,0.40}, D={"DPS",1.00,0.40,0.20}, A={"AoE",0.58,0.51,0.79} } + GameTooltip:AddLine(PBM_L["Role"],1,1,1) + local roleLabels = { T={PBM_L["Tank"],0.20,0.60,1.00}, H={PBM_L["Healer"],0.20,1.00,0.40}, D={PBM_L["DPS"],1.00,0.40,0.20}, A={PBM_L["AoE"],0.58,0.51,0.79} } for _, k in ipairs({"T","H","D","A"}) do local v = roleLabels[k] local icon = PBM.NOTES_ROLE_ICONS and PBM.NOTES_ROLE_ICONS[k] or "" @@ -853,10 +853,10 @@ function PBM.BuildOverviewFrame(parent, fl) local tierStr = tier > 0 and ("T"..tier) or "T0" local grp = LichborneTrackerDB.raidGroup or "A" GameTooltip:SetOwner(ar,"ANCHOR_RIGHT") - GameTooltip:AddLine("|cff44ff44+ Add to Raid|r", 1, 1, 1) - GameTooltip:AddLine("Adds to the Raid tab.", 0.7, 0.7, 0.7) - GameTooltip:AddLine("|cff44ff44Left-click to add to raid.|r", 1, 1, 1) - GameTooltip:AddLine("|cffff2020Right-click to remove.|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cff44ff44+ Add to Raid|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Adds to the Raid tab."], 0.7, 0.7, 0.7) + GameTooltip:AddLine(PBM_L["|cff44ff44Left-click to add to raid.|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffff2020Right-click to remove.|r"], 1, 1, 1) GameTooltip:Show() end) ar:SetScript("OnLeave",function() GameTooltip:Hide() end) @@ -869,9 +869,9 @@ function PBM.BuildOverviewFrame(parent, fl) ag:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") ag:SetScript("OnEnter",function() GameTooltip:SetOwner(ag,"ANCHOR_RIGHT") - GameTooltip:AddLine("|cff44eeff> Invite to Group|r",1,1,1) - GameTooltip:AddLine("|cff44ff44Left-click to invite to group.|r",1,1,1) - GameTooltip:AddLine("|cffff2020Right-click to remove.|r",1,1,1) + GameTooltip:AddLine(PBM_L["|cff44eeff> Invite to Group|r"],1,1,1) + GameTooltip:AddLine(PBM_L["|cff44ff44Left-click to invite to group.|r"],1,1,1) + GameTooltip:AddLine(PBM_L["|cffff2020Right-click to remove.|r"],1,1,1) GameTooltip:Show() end) ag:SetScript("OnLeave",function() GameTooltip:Hide() end) @@ -883,8 +883,8 @@ function PBM.BuildOverviewFrame(parent, fl) dx:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") dx:SetScript("OnEnter",function() GameTooltip:SetOwner(dx,"ANCHOR_RIGHT") - GameTooltip:AddLine("Delete Character",1,0.3,0.3) - GameTooltip:AddLine("Removes from tracker.",0.8,0.8,0.8) + GameTooltip:AddLine(PBM_L["Delete Character"],1,0.3,0.3) + GameTooltip:AddLine(PBM_L["Removes from tracker."],0.8,0.8,0.8) GameTooltip:Show() end) dx:SetScript("OnLeave",function() GameTooltip:Hide() end) @@ -912,7 +912,7 @@ function PBM.BuildOverviewFrame(parent, fl) allCB:SetPoint("TOPLEFT",PBM.State.LichborneOverviewFrame,"TOPLEFT",0,cbY) allCB:SetSize(ALL_NCOLS*ALL_COL_W,24); allCB:SetFrameLevel(fl+11) local acbBg=allCB:CreateTexture(nil,"BACKGROUND"); acbBg:SetAllPoints(allCB); acbBg:SetTexture(0.05,0.07,0.13,1) - local acT=allCB:CreateFontString(nil,"OVERLAY","GameFontNormalSmall"); acT:SetPoint("LEFT",allCB,"LEFT",4,0); acT:SetText("|cffC69B3ACount:|r"); acT:SetWidth(44) + local acT=allCB:CreateFontString(nil,"OVERLAY","GameFontNormalSmall"); acT:SetPoint("LEFT",allCB,"LEFT",4,0); acT:SetText(PBM_L["|cffC69B3ACount:|r"]); acT:SetWidth(44) PBM.State.LichborneAllCountLabels={} local acW=(ALL_NCOLS*ALL_COL_W-50)/10 for ci,cls in ipairs(PBM.CLASS_TABS) do @@ -923,6 +923,6 @@ function PBM.BuildOverviewFrame(parent, fl) local sbg=sw:CreateTexture(nil,"BACKGROUND"); sbg:SetAllPoints(sw); sbg:SetTexture(0.08,0.10,0.18,1); sw.bg=sbg local hex=string.format("|cff%02x%02x%02x",math.floor(c.r*255),math.floor(c.g*255),math.floor(c.b*255)) local sl=sw:CreateFontString(nil,"OVERLAY","GameFontNormalSmall"); sl:SetAllPoints(sw); sl:SetJustifyH("CENTER"); sl:SetJustifyV("MIDDLE") - sl:SetText(hex..(PBM.TAB_LABELS[cls])..": "..hex.."0|r"); sw.lbl=sl; PBM.State.LichborneAllCountLabels[cls]=sl + sl:SetText(hex..(PBM.TAB_LABELS[cls] or cls)..": "..hex.."0|r"); sw.lbl=sl; PBM.State.LichborneAllCountLabels[cls]=sl end -end +end \ No newline at end of file diff --git a/PBM/PBM_Paladin.lua b/PBM/PBM_Paladin.lua index 58dacb4..116f697 100644 --- a/PBM/PBM_Paladin.lua +++ b/PBM/PBM_Paladin.lua @@ -2,12 +2,12 @@ PBM = PBM or {} -- Talent spec templates for the Set Talents menu local PALADIN_TALENT_SPECS = { - { label="Holy |cffffcc00PvE|r", spec="holy pve", wowSpec="Holy Pala", icon="Interface\\Icons\\Spell_Holy_HolyBolt" }, - { label="Protection |cffffcc00PvE|r", spec="prot pve", wowSpec="Protection", icon="Interface\\Icons\\Ability_Paladin_ShieldoftheTemplar" }, - { label="Retribution |cffffcc00PvE|r", spec="ret pve", wowSpec="Retribution", icon="Interface\\Icons\\Spell_Holy_AuraofLight" }, - { label="Holy |cffff4444PvP|r", spec="holy pvp", wowSpec="Holy Pala", icon="Interface\\Icons\\Spell_Holy_HolyBolt" }, - { label="Protection |cffff4444PvP|r", spec="prot pvp", wowSpec="Protection", icon="Interface\\Icons\\Ability_Paladin_ShieldoftheTemplar" }, - { label="Retribution |cffff4444PvP|r", spec="ret pvp", wowSpec="Retribution", icon="Interface\\Icons\\Spell_Holy_AuraofLight" }, + { label=PBM_L["Holy |cffffcc00PvE|r"], spec="holy pve", wowSpec=PBM_L["Holy Pala"], icon="Interface\\Icons\\Spell_Holy_HolyBolt" }, + { label=PBM_L["Protection |cffffcc00PvE|r"], spec="prot pve", wowSpec=PBM_L["Protection"], icon="Interface\\Icons\\Ability_Paladin_ShieldoftheTemplar" }, + { label=PBM_L["Retribution |cffffcc00PvE|r"], spec="ret pve", wowSpec=PBM_L["Retribution"], icon="Interface\\Icons\\Spell_Holy_AuraofLight" }, + { label=PBM_L["Holy |cffff4444PvP|r"], spec="holy pvp", wowSpec=PBM_L["Holy Pala"], icon="Interface\\Icons\\Spell_Holy_HolyBolt" }, + { label=PBM_L["Protection |cffff4444PvP|r"], spec="prot pvp", wowSpec=PBM_L["Protection"], icon="Interface\\Icons\\Ability_Paladin_ShieldoftheTemplar" }, + { label=PBM_L["Retribution |cffff4444PvP|r"], spec="ret pvp", wowSpec=PBM_L["Retribution"], icon="Interface\\Icons\\Spell_Holy_AuraofLight" }, } -- ───────────────────────────────────────────────────────────────────────────── @@ -127,15 +127,15 @@ function PBM.OpenPaladinMenu(row) local assistIconY = assistHdrY - 18 - 4 -- ── Row 1: Spec headers + CO/NC headers (same Y) ────────── - MakeSpecBox(LichbornePaladinMenu, col1X, specBoxY, COL_W, "Holy", "Interface\\Icons\\Spell_Holy_HolyBolt") - MakeSpecBox(LichbornePaladinMenu, col2X, specBoxY, COL_W, "Protection", "Interface\\Icons\\Ability_Paladin_ShieldoftheTemplar") - MakeSpecBox(LichbornePaladinMenu, col3X, specBoxY, COL_W, "Retribution", "Interface\\Icons\\Spell_Holy_AuraofLight") + MakeSpecBox(LichbornePaladinMenu, col1X, specBoxY, COL_W, PBM_L["Holy"], "Interface\\Icons\\Spell_Holy_HolyBolt") + MakeSpecBox(LichbornePaladinMenu, col2X, specBoxY, COL_W, PBM_L["Protection"], "Interface\\Icons\\Ability_Paladin_ShieldoftheTemplar") + MakeSpecBox(LichbornePaladinMenu, col3X, specBoxY, COL_W, PBM_L["Retribution"], "Interface\\Icons\\Spell_Holy_AuraofLight") local aurasHdrW = EXT_ICON_SIZE + BTN_GAP + EXT_ICON_SIZE -- 56px (CO + gap + NC) local coNcHdrY = specBoxY - 18 - 3 -- CO/NC headers one step below Auras local coNcIconY = coNcHdrY - 18 - 4 -- first aura button below CO/NC headers - MakeSpecBox(LichbornePaladinMenu, coX, specBoxY, aurasHdrW, "Auras") - MakeSpecBox(LichbornePaladinMenu, coX, coNcHdrY, EXT_ICON_SIZE, "CO") - MakeSpecBox(LichbornePaladinMenu, ncX, coNcHdrY, EXT_ICON_SIZE, "NC") + MakeSpecBox(LichbornePaladinMenu, coX, specBoxY, aurasHdrW, PBM_L["Auras"]) + MakeSpecBox(LichbornePaladinMenu, coX, coNcHdrY, EXT_ICON_SIZE, PBM_L["CO"]) + MakeSpecBox(LichbornePaladinMenu, ncX, coNcHdrY, EXT_ICON_SIZE, PBM_L["NC"]) local tHeal = MakeTreeBtn(col1X + singleOff, specIconY, "Interface\\Icons\\Spell_Holy_HolyBolt") local tTank = MakeTreeBtn(col2X + singleOff, specIconY, "Interface\\Icons\\Ability_Paladin_ShieldoftheTemplar") @@ -160,14 +160,14 @@ function PBM.OpenPaladinMenu(row) local tNcShadow = MakeTreeBtn(ncX, coRow(7), "Interface\\Icons\\Spell_Shadow_SealOfKings") -- ── DPS/Off-Healer section (split headers) ─────────────────── - MakeSpecBox(LichbornePaladinMenu, healerDpsHdrX, dohHdrY, dohW, "Heal DPS") - MakeSpecBox(LichbornePaladinMenu, offHealHdrX, dohHdrY, dohW, "Off-Heal") + MakeSpecBox(LichbornePaladinMenu, healerDpsHdrX, dohHdrY, dohW, PBM_L["Heal DPS"]) + MakeSpecBox(LichbornePaladinMenu, offHealHdrX, dohHdrY, dohW, PBM_L["Off-Heal"]) local tHealerDps = MakeTreeBtn(healerDpsBtnX, dohIconY, "Interface\\Icons\\INV_Alchemy_Elixir_02") local tOffHeal = MakeTreeBtn(offHealBtnX, dohIconY, "Interface\\Icons\\Spell_Holy_FlashHeal") -- ── Blessings section ────────────────────────────────────── - MakeSpecBox(LichbornePaladinMenu, blessHdrX, blessHdrY, blessW, "Blessings") + MakeSpecBox(LichbornePaladinMenu, blessHdrX, blessHdrY, blessW, PBM_L["Blessings"]) local tBstats = MakeTreeBtn(blessHdrX, blessIconY, "Interface\\Icons\\Spell_Magic_MageArmor") local tBhealth = MakeTreeBtn(blessHdrX + EXT_ICON_SIZE + BTN_GAP, blessIconY, "Interface\\Icons\\Spell_Holy_HealingAura") @@ -175,7 +175,7 @@ function PBM.OpenPaladinMenu(row) local tBdps = MakeTreeBtn(blessHdrX + 3*(EXT_ICON_SIZE + BTN_GAP), blessIconY, "Interface\\Icons\\INV_Hammer_01") -- ── Assist section ───────────────────────────────────────── - MakeSpecBox(LichbornePaladinMenu, assistHdrX, assistHdrY, assistW, "Assist") + MakeSpecBox(LichbornePaladinMenu, assistHdrX, assistHdrY, assistW, PBM_L["Assist"]) local tTankAssist = MakeTreeBtn(assistHdrX, assistIconY, "Interface\\Icons\\inv_shield_02") local tDpsAssist = MakeTreeBtn(assistHdrX + EXT_ICON_SIZE + BTN_GAP, assistIconY, "Interface\\Icons\\Ability_Warrior_Challange") @@ -195,174 +195,174 @@ function PBM.OpenPaladinMenu(row) local function TL() GameTooltip:Hide() end tHeal:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Heal|r |cff999999- |r|cffF58CBAheal|r |cffee4433CO|r", - "|cffffcc00Holy healer|r") + "|cffffcc00" .. PBM_L["Heal"] .. "|r |cff999999- |r|cffF58CBAheal|r |cffee4433CO|r", + "|cffffcc00" .. PBM_L["Holy healer"] .. "|r") end); tHeal:SetScript("OnLeave", TL) tHealerDps:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Heal DPS|r |cff999999- |r|cffF58CBAhealer dps|r |cffee4433CO|r", - "|cffffcc00Holy healer that DPS fills|r", - "Allows the healer to deal damage when healing is not needed.") + "|cffffcc00" .. PBM_L["Heal DPS"] .. "|r |cff999999- |r|cffF58CBAhealer dps|r |cffee4433CO|r", + "|cffffcc00" .. PBM_L["Holy healer that DPS fills"] .. "|r", + PBM_L["Allows the healer to deal damage when healing is not needed."]) end); tHealerDps:SetScript("OnLeave", TL) tOffHeal:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Off-Heal|r |cff999999- |r|cffF58CBAoffheal|r |cffee4433CO|r", - "|cffffcc00Retribution DPS with emergency heals|r", - "Switches to |cffF58CBAFlash of Light|r when party members drop low.") + "|cffffcc00" .. PBM_L["Off-Heal"] .. "|r |cff999999- |r|cffF58CBAoffheal|r |cffee4433CO|r", + "|cffffcc00" .. PBM_L["Retribution DPS with emergency heals"] .. "|r", + PBM_L["Switches to |cffF58CBAFlash of Light|r when party members drop low."]) end); tOffHeal:SetScript("OnLeave", TL) tTank:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Tank|r |cff999999- |r|cffF58CBAtank|r |cffee4433CO|r", - "|cffffcc00Protection tank|r") + "|cffffcc00" .. PBM_L["Tank"] .. "|r |cff999999- |r|cffF58CBAtank|r |cffee4433CO|r", + "|cffffcc00" .. PBM_L["Protection tank"] .. "|r") end); tTank:SetScript("OnLeave", TL) tTankAssist:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r", - "|cffffcc00Assists the main tank|r", - "Focuses attacks on the tank's target.") + "|cffffcc00" .. PBM_L["Tank Assist"] .. "|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r", + "|cffffcc00" .. PBM_L["Assists the main tank"] .. "|r", + PBM_L["Focuses attacks on the tank's target."]) end); tTankAssist:SetScript("OnLeave", TL) tDps:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Retribution|r |cff999999- |r|cffF58CBAdps|r |cffee4433CO|r", - "|cffffcc00Retribution DPS|r") + "|cffffcc00" .. PBM_L["Retribution"] .. "|r |cff999999- |r|cffF58CBAdps|r |cffee4433CO|r", + "|cffffcc00" .. PBM_L["Retribution DPS"] .. "|r") end); tDps:SetScript("OnLeave", TL) tDpsAssist:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r", - "|cffffcc00Assists the DPS group|r", - "Focuses attacks on the DPS leader's target.") + "|cffffcc00" .. PBM_L["DPS Assist"] .. "|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r", + "|cffffcc00" .. PBM_L["Assists the DPS group"] .. "|r", + PBM_L["Focuses attacks on the DPS leader's target."]) end); tDpsAssist:SetScript("OnLeave", TL) tDpsAoe:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00DPS AoE|r |cff999999- |r|cffff8000dps aoe|r |cffffcc00CO|r", - "|cffffcc00Cross-role AoE mode|r") + "|cffffcc00" .. PBM_L["DPS AoE"] .. "|r |cff999999- |r|cffff8000dps aoe|r |cffffcc00CO|r", + "|cffffcc00" .. PBM_L["Cross-role AoE mode"] .. "|r") end); tDpsAoe:SetScript("OnLeave", TL) -- CO aura tooltips tCoSpeed:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Crusader Aura|r |cff999999- |r|cffffff00bspeed|r |cffff8000CO|r", - "|cffffcc00Movement speed aura|r", - "Increases mounted speed for all", - "party members within 30 yards.") + "|cffffcc00" .. PBM_L["Crusader Aura"] .. "|r |cff999999- |r|cffffff00bspeed|r |cffff8000CO|r", + "|cffffcc00" .. PBM_L["Movement speed aura"] .. "|r", + PBM_L["Increases mounted speed for all"], + PBM_L["party members within 30 yards."]) end); tCoSpeed:SetScript("OnLeave", TL) tCoArmor:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Devotion Aura|r |cff999999- |r|cffffff00barmor|r |cffff8000CO|r", - "|cffffcc00Armor aura|r", - "Increases |cffffcc00armor|r for all party", - "members within 30 yards.") + "|cffffcc00" .. PBM_L["Devotion Aura"] .. "|r |cff999999- |r|cffffff00barmor|r |cffff8000CO|r", + "|cffffcc00" .. PBM_L["Armor aura"] .. "|r", + PBM_L["Increases |cffffcc00armor|r for all party"], + PBM_L["members within 30 yards."]) end); tCoArmor:SetScript("OnLeave", TL) tCoCast:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Concentration Aura|r |cff999999- |r|cffffff00bcast|r |cffff8000CO|r", - "|cffffcc00Pushback resistance aura|r", - "Reduces spell pushback by 35% for", - "all party members within 30 yards.") + "|cffffcc00" .. PBM_L["Concentration Aura"] .. "|r |cff999999- |r|cffffff00bcast|r |cffff8000CO|r", + "|cffffcc00" .. PBM_L["Pushback resistance aura"] .. "|r", + PBM_L["Reduces spell pushback by 35% for"], + PBM_L["party members within 30 yards."]) end); tCoCast:SetScript("OnLeave", TL) tCoBaoe:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Retribution Aura|r |cff999999- |r|cffffff00baoe|r |cffff8000CO|r", - "|cffffcc00Holy retaliation aura|r", - "Deals |cffffcc00Holy|r damage to attackers.") + "|cffffcc00" .. PBM_L["Retribution Aura"] .. "|r |cff999999- |r|cffffff00baoe|r |cffff8000CO|r", + "|cffffcc00" .. PBM_L["Holy retaliation aura"] .. "|r", + PBM_L["Deals |cffffcc00Holy|r damage to attackers."]) end); tCoBaoe:SetScript("OnLeave", TL) tCoFire:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Fire Resistance Aura|r |cff999999- |r|cffffff00rfire|r |cffff8000CO|r", - "|cffffcc00Fire resistance aura|r", - "Increases |cffFF4444Fire resistance|r for all", - "party members within 30 yards.") + "|cffffcc00" .. PBM_L["Fire Resistance Aura"] .. "|r |cff999999- |r|cffffff00rfire|r |cffff8000CO|r", + "|cffffcc00" .. PBM_L["Fire resistance aura"] .. "|r", + PBM_L["Increases |cffFF4444Fire resistance|r for all"], + PBM_L["party members within 30 yards."]) end); tCoFire:SetScript("OnLeave", TL) tCoFrost:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Frost Resistance Aura|r |cff999999- |r|cffffff00rfrost|r |cffff8000CO|r", - "|cffffcc00Frost resistance aura|r", - "Increases |cff3A8FC4Frost resistance|r for all", - "party members within 30 yards.") + "|cffffcc00" .. PBM_L["Frost Resistance Aura"] .. "|r |cff999999- |r|cffffff00rfrost|r |cffff8000CO|r", + "|cffffcc00" .. PBM_L["Frost resistance aura"] .. "|r", + PBM_L["Increases |cff3A8FC4Frost resistance|r for all"], + PBM_L["party members within 30 yards."]) end); tCoFrost:SetScript("OnLeave", TL) tCoShadow:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Shadow Resistance Aura|r |cff999999- |r|cffffff00rshadow|r |cffff8000CO|r", - "|cffffcc00Shadow resistance aura|r", - "Increases |cff9966CCShadow resistance|r for all", - "party members within 30 yards.") + "|cffffcc00" .. PBM_L["Shadow Resistance Aura"] .. "|r |cff999999- |r|cffffff00rshadow|r |cffff8000CO|r", + "|cffffcc00" .. PBM_L["Shadow resistance aura"] .. "|r", + PBM_L["Increases |cff9966CCShadow resistance|r for all"], + PBM_L["party members within 30 yards."]) end); tCoShadow:SetScript("OnLeave", TL) -- NC aura tooltips tNcSpeed:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Crusader Aura|r |cff999999- |r|cffffff00bspeed|r |cffff8000NC|r", - "|cffffcc00Movement speed aura|r", - "Increases mounted speed for all", - "party members within 30 yards.") + "|cffffcc00" .. PBM_L["Crusader Aura"] .. "|r |cff999999- |r|cffffff00bspeed|r |cffff8000NC|r", + "|cffffcc00" .. PBM_L["Movement speed aura"] .. "|r", + PBM_L["Increases mounted speed for all"], + PBM_L["party members within 30 yards."]) end); tNcSpeed:SetScript("OnLeave", TL) tNcArmor:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Devotion Aura|r |cff999999- |r|cffffff00barmor|r |cffff8000NC|r", - "|cffffcc00Armor aura|r", - "Increases |cffffcc00armor|r for all party", - "members within 30 yards.") + "|cffffcc00" .. PBM_L["Devotion Aura"] .. "|r |cff999999- |r|cffffff00barmor|r |cffff8000NC|r", + "|cffffcc00" .. PBM_L["Armor aura"] .. "|r", + PBM_L["Increases |cffffcc00armor|r for all party"], + PBM_L["members within 30 yards."]) end); tNcArmor:SetScript("OnLeave", TL) tNcCast:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Concentration Aura|r |cff999999- |r|cffffff00bcast|r |cffff8000NC|r", - "|cffffcc00Pushback resistance aura|r", - "Reduces spell pushback by 35% for", - "all party members within 30 yards.") + "|cffffcc00" .. PBM_L["Concentration Aura"] .. "|r |cff999999- |r|cffffff00bcast|r |cffff8000NC|r", + "|cffffcc00" .. PBM_L["Pushback resistance aura"] .. "|r", + PBM_L["Reduces spell pushback by 35% for"], + PBM_L["party members within 30 yards."]) end); tNcCast:SetScript("OnLeave", TL) tNcBaoe:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Retribution Aura|r |cff999999- |r|cffffff00baoe|r |cffff8000NC|r", - "|cffffcc00Holy retaliation aura|r", - "Deals |cffffcc00Holy|r damage to attackers.") + "|cffffcc00" .. PBM_L["Retribution Aura"] .. "|r |cff999999- |r|cffffff00baoe|r |cffff8000NC|r", + "|cffffcc00" .. PBM_L["Holy retaliation aura"] .. "|r", + PBM_L["Deals |cffffcc00Holy|r damage to attackers."]) end); tNcBaoe:SetScript("OnLeave", TL) tNcFire:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Fire Resistance Aura|r |cff999999- |r|cffffff00rfire|r |cffff8000NC|r", - "|cffffcc00Fire resistance aura|r", - "Increases |cffFF4444Fire resistance|r for all", - "party members within 30 yards.") + "|cffffcc00" .. PBM_L["Fire Resistance Aura"] .. "|r |cff999999- |r|cffffff00rfire|r |cffff8000NC|r", + "|cffffcc00" .. PBM_L["Fire resistance aura"] .. "|r", + PBM_L["Increases |cffFF4444Fire resistance|r for all"], + PBM_L["party members within 30 yards."]) end); tNcFire:SetScript("OnLeave", TL) tNcFrost:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Frost Resistance Aura|r |cff999999- |r|cffffff00rfrost|r |cffff8000NC|r", - "|cffffcc00Frost resistance aura|r", - "Increases |cff3A8FC4Frost resistance|r for all", - "party members within 30 yards.") + "|cffffcc00" .. PBM_L["Frost Resistance Aura"] .. "|r |cff999999- |r|cffffff00rfrost|r |cffff8000NC|r", + "|cffffcc00" .. PBM_L["Frost resistance aura"] .. "|r", + PBM_L["Increases |cff3A8FC4Frost resistance|r for all"], + PBM_L["party members within 30 yards."]) end); tNcFrost:SetScript("OnLeave", TL) tNcShadow:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Shadow Resistance Aura|r |cff999999- |r|cffffff00rshadow|r |cffff8000NC|r", - "|cffffcc00Shadow resistance aura|r", - "Increases |cff9966CCShadow resistance|r for all", - "party members within 30 yards.") + "|cffffcc00" .. PBM_L["Shadow Resistance Aura"] .. "|r |cff999999- |r|cffffff00rshadow|r |cffff8000NC|r", + "|cffffcc00" .. PBM_L["Shadow resistance aura"] .. "|r", + PBM_L["Increases |cff9966CCShadow resistance|r for all"], + PBM_L["party members within 30 yards."]) end); tNcShadow:SetScript("OnLeave", TL) -- Blessing tooltips tBstats:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Kings|r |cff999999- |r|cffffff00bkings|r |cffff8000NC|r", - "|cffffcc00Blessing of Kings|r", - "Increases all |cffFF9900stats|r by 10% for all", - "party members.") + "|cffffcc00" .. PBM_L["Kings"] .. "|r |cff999999- |r|cffffff00bkings|r |cffff8000NC|r", + "|cffffcc00" .. PBM_L["Blessing of Kings"] .. "|r", + PBM_L["Increases all |cffFF9900stats|r by 10% for all"], + PBM_L["party members."]) end); tBstats:SetScript("OnLeave", TL) tBhealth:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Sanctuary|r |cff999999- |r|cffffff00bsanc|r |cffff8000NC|r", - "|cffffcc00Blessing of Sanctuary|r", - "Damage reduction + mana on block.", - "Applies to all party members.") + "|cffffcc00" .. PBM_L["Sanctuary"] .. "|r |cff999999- |r|cffffff00bsanc|r |cffff8000NC|r", + "|cffffcc00" .. PBM_L["Blessing of Sanctuary"] .. "|r", + PBM_L["Damage reduction + mana on block."], + PBM_L["Applies to all party members."]) end); tBhealth:SetScript("OnLeave", TL) tBmana:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Wisdom|r |cff999999- |r|cffffff00bwisdom|r |cffff8000NC|r", - "|cffffcc00Blessing of Wisdom|r", - "Increases |cff3A8FC4mana regeneration|r for all", - "party members.") + "|cffffcc00" .. PBM_L["Wisdom"] .. "|r |cff999999- |r|cffffff00bwisdom|r |cffff8000NC|r", + "|cffffcc00" .. PBM_L["Blessing of Wisdom"] .. "|r", + PBM_L["Increases |cff3A8FC4mana regeneration|r for all"], + PBM_L["party members."]) end); tBmana:SetScript("OnLeave", TL) tBdps:SetScript("OnEnter", function(s) TT(s, - "|cffffcc00Might|r |cff999999- |r|cffffff00bmight|r |cffff8000NC|r", - "|cffffcc00Blessing of Might|r", - "Increases |cffFF9900attack power|r for all", - "party members.") + "|cffffcc00" .. PBM_L["Might"] .. "|r |cff999999- |r|cffffff00bmight|r |cffff8000NC|r", + "|cffffcc00" .. PBM_L["Blessing of Might"] .. "|r", + PBM_L["Increases |cffFF9900attack power|r for all"], + PBM_L["party members."]) end); tBdps:SetScript("OnLeave", TL) -- ── Toggle wire block ──────────────────────────────────────── @@ -628,4 +628,4 @@ function PBM.OpenPaladinMenu(row) HideAllPaladin(); return end PBM.ShowCharSheet(LichbornePaladinMenu, LichbornePaladinCatcher, row, PALADIN_LEFT_EXT) -end +end \ No newline at end of file diff --git a/PBM/PBM_Priest.lua b/PBM/PBM_Priest.lua index b1a2570..abc97e3 100644 --- a/PBM/PBM_Priest.lua +++ b/PBM/PBM_Priest.lua @@ -18,12 +18,12 @@ end -- Talent spec templates for the Set Talents menu local PRIEST_TALENT_SPECS = { - { label="Discipline |cffffcc00PvE|r", spec="disc pve", wowSpec="Discipline", icon="Interface\\Icons\\Spell_Holy_WordFortitude" }, - { label="Holy |cffffcc00PvE|r", spec="holy pve", wowSpec="Holy Priest", icon="Interface\\Icons\\Spell_Holy_GuardianSpirit" }, - { label="Shadow |cffffcc00PvE|r", spec="shadow pve", wowSpec="Shadow", icon="Interface\\Icons\\Spell_Shadow_ShadowWordPain" }, - { label="Discipline |cffff4444PvP|r", spec="disc pvp", wowSpec="Discipline", icon="Interface\\Icons\\Spell_Holy_WordFortitude" }, - { label="Holy |cffff4444PvP|r", spec="holy pvp", wowSpec="Holy Priest", icon="Interface\\Icons\\Spell_Holy_GuardianSpirit" }, - { label="Shadow |cffff4444PvP|r", spec="shadow pvp", wowSpec="Shadow", icon="Interface\\Icons\\Spell_Shadow_ShadowWordPain" }, + { label=PBM_L["Discipline |cffffcc00PvE|r"], spec="disc pve", wowSpec="Discipline", icon="Interface\\Icons\\Spell_Holy_WordFortitude" }, + { label=PBM_L["Holy |cffffcc00PvE|r"], spec="holy pve", wowSpec="Holy Priest", icon="Interface\\Icons\\Spell_Holy_GuardianSpirit" }, + { label=PBM_L["Shadow |cffffcc00PvE|r"], spec="shadow pve", wowSpec="Shadow", icon="Interface\\Icons\\Spell_Shadow_ShadowWordPain" }, + { label=PBM_L["Discipline |cffff4444PvP|r"], spec="disc pvp", wowSpec="Discipline", icon="Interface\\Icons\\Spell_Holy_WordFortitude" }, + { label=PBM_L["Holy |cffff4444PvP|r"], spec="holy pvp", wowSpec="Holy Priest", icon="Interface\\Icons\\Spell_Holy_GuardianSpirit" }, + { label=PBM_L["Shadow |cffff4444PvP|r"], spec="shadow pvp", wowSpec="Shadow", icon="Interface\\Icons\\Spell_Shadow_ShadowWordPain" }, } -- ───────────────────────────────────────────────────────────────────────────── @@ -91,7 +91,7 @@ function PBM.OpenPriestMenu(row) local healingSpecLabel = healingSpecBox:CreateFontString(nil, "OVERLAY") healingSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") healingSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - healingSpecLabel:SetText("Healing") + healingSpecLabel:SetText(PBM_L["Healing"]) healingSpecLabel:SetPoint("LEFT", healingSpecBox, "LEFT", 34, 0) healingSpecLabel:SetPoint("RIGHT", healingSpecBox, "RIGHT", -2, 0) healingSpecLabel:SetJustifyH("CENTER") @@ -119,7 +119,7 @@ function PBM.OpenPriestMenu(row) local dpsSpecLabel = dpsSpecBox:CreateFontString(nil, "OVERLAY") dpsSpecLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") dpsSpecLabel:SetTextColor(0.78, 0.61, 0.23, 1) - dpsSpecLabel:SetText("DPS") + dpsSpecLabel:SetText(PBM_L["DPS"]) dpsSpecLabel:SetPoint("LEFT", dpsSpecBox, "LEFT", 34, 0) dpsSpecLabel:SetPoint("RIGHT", dpsSpecBox, "RIGHT", -2, 0) dpsSpecLabel:SetJustifyH("CENTER") @@ -138,9 +138,9 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Heal|r |cff999999- |r|cffFFFFFFheal|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Discipline healing|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Holy Heal, Holy DPS, Shadow.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Heal|r |cff999999- |r|cffFFFFFFheal|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Discipline healing|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Holy Heal, Holy DPS, Shadow.|r"], 1, 1, 1) GameTooltip:Show() end) treeHealBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -160,9 +160,9 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Holy Heal|r |cff999999- |r|cffFFFFFFholy heal|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Holy healing specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Discipline, Holy DPS, Shadow.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Holy Heal|r |cff999999- |r|cffFFFFFFholy heal|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Holy healing specialization|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Discipline, Holy DPS, Shadow.|r"], 1, 1, 1) GameTooltip:Show() end) treeHolyHealBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -183,9 +183,9 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Holy DPS|r |cff999999- |r|cffFFFFFFholy|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Holy DPS specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Discipline, Holy Heal, Shadow.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Holy DPS|r |cff999999- |r|cffFFFFFFholy|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Holy DPS specialization|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Discipline, Holy Heal, Shadow.|r"], 1, 1, 1) GameTooltip:Show() end) treeHolyDpsBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -205,9 +205,9 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Shadow|r |cff999999- |r|cffFFFFFFshadow|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Shadow DPS specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Discipline, Holy Heal, Holy DPS.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Shadow|r |cff999999- |r|cffFFFFFFshadow|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Shadow DPS specialization|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Discipline, Holy Heal, Holy DPS.|r"], 1, 1, 1) GameTooltip:Show() end) treeShadowDpsBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -229,10 +229,10 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Healer DPS|r |cff999999- |r|cffFFFFFFhealer dps|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Healer that fills with DPS|r", 1, 1, 1) - GameTooltip:AddLine("Priest heals when needed, then fills with", 1, 1, 1) - GameTooltip:AddLine("|cffFFFFFFShadow Word: Pain|r and |cffFFFFFFMind Blast|r between heals.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Healer DPS|r |cff999999- |r|cffFFFFFFhealer dps|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Healer that fills with DPS|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Priest heals when needed, then fills with"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFFFFFFShadow Word: Pain|r and |cffFFFFFFMind Blast|r between heals."], 1, 1, 1) GameTooltip:Show() end) treeHealerDpsBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -255,7 +255,7 @@ function PBM.OpenPriestMenu(row) local aoeLabel = aoeHeader:CreateFontString(nil, "OVERLAY") aoeLabel:SetFont("Fonts\\FRIZQT__.TTF", 8, "OUTLINE") aoeLabel:SetTextColor(0.78, 0.61, 0.23, 1) - aoeLabel:SetText("AoE") + aoeLabel:SetText(PBM_L["AoE"]) aoeLabel:SetAllPoints() aoeLabel:SetJustifyH("CENTER") @@ -271,8 +271,8 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00DPS AoE|r |cff999999- |r|cffFFFFFFshadow aoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00AoE shadow rotation|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00DPS AoE|r |cff999999- |r|cffFFFFFFshadow aoe|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00AoE shadow rotation|r"], 1, 1, 1) GameTooltip:Show() end) treeDpsAoeBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -292,8 +292,8 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Shadow AoE|r |cff999999- |r|cffFFFFFFshadow aoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Shadow AoE rotation|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Shadow AoE|r |cff999999- |r|cffFFFFFFshadow aoe|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Shadow AoE rotation|r"], 1, 1, 1) GameTooltip:Show() end) treeShadowAoeBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -318,7 +318,7 @@ function PBM.OpenPriestMenu(row) local debuffLabel = debuffHeader:CreateFontString(nil, "OVERLAY") debuffLabel:SetFont("Fonts\\FRIZQT__.TTF", 8, "OUTLINE") debuffLabel:SetTextColor(0.78, 0.61, 0.23, 1) - debuffLabel:SetText("Debuff") + debuffLabel:SetText(PBM_L["Debuff"]) debuffLabel:SetAllPoints() debuffLabel:SetJustifyH("CENTER") @@ -334,8 +334,8 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00DPS Debuff|r |cff999999- |r|cffFFFFFFshadow debuff|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Target debuff rotation|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00DPS Debuff|r |cff999999- |r|cffFFFFFFshadow debuff|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Target debuff rotation|r"], 1, 1, 1) GameTooltip:Show() end) treeDpsDebuffBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -355,8 +355,8 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Shadow Debuff|r |cff999999- |r|cffFFFFFFshadow debuff|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Shadow debuff rotation|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Shadow Debuff|r |cff999999- |r|cffFFFFFFshadow debuff|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Shadow debuff rotation|r"], 1, 1, 1) GameTooltip:Show() end) treeShadowDebuffBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -379,7 +379,7 @@ function PBM.OpenPriestMenu(row) local assistLabel = assistHeader:CreateFontString(nil, "OVERLAY") assistLabel:SetFont("Fonts\\FRIZQT__.TTF", 8, "OUTLINE") assistLabel:SetTextColor(0.78, 0.61, 0.23, 1) - assistLabel:SetText("Assist") + assistLabel:SetText(PBM_L["Assist"]) assistLabel:SetAllPoints() assistLabel:SetJustifyH("CENTER") @@ -395,9 +395,9 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Tank target focus|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks the tank's current target.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Tank target focus|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks the tank's current target."], 1, 1, 1) GameTooltip:Show() end) treeTankAssistBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -422,7 +422,7 @@ function PBM.OpenPriestMenu(row) buffSideHdrLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") buffSideHdrLabel:SetTextColor(0.78, 0.61, 0.23, 1) buffSideHdrLabel:SetAllPoints(); buffSideHdrLabel:SetJustifyH("CENTER") - buffSideHdrLabel:SetText("Buff") + buffSideHdrLabel:SetText(PBM_L["Buff"]) local treeSideBuffBtn = CreateFrame("Button", nil, LichbornePriestMenu) treeSideBuffBtn:SetSize(EXT_ICON_SIZE, EXT_ICON_SIZE) @@ -436,10 +436,10 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Buff|r |cff999999- |r|cffffff00buff|r |cffff8000NC|r") - GameTooltip:AddLine("|cffffcc00Group stat buffs|r", 1, 1, 1) - GameTooltip:AddLine("|cffFFFFFFPower Word: Fortitude, Divine Spirit,|r", 1, 1, 1) - GameTooltip:AddLine("|cffFFFFFFShadow Protection|r.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Buff|r |cff999999- |r|cffffff00buff|r |cffff8000NC|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Group stat buffs|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFFFFFFPower Word: Fortitude, Divine Spirit,|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFFFFFFShadow Protection|r."], 1, 1, 1) GameTooltip:Show() end) treeSideBuffBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -459,9 +459,9 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Shadow Resistance|r |cff999999- |r|cffFFFFFFrshadow|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Shadow resistance buff|r", 1, 1, 1) - GameTooltip:AddLine("Applies |cffFFFFFFShadow Protection|r to the group.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Shadow Resistance|r |cff999999- |r|cffFFFFFFrshadow|r |cffee4433NC|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Shadow resistance buff|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Applies |cffFFFFFFShadow Protection|r to the group."], 1, 1, 1) GameTooltip:Show() end) treeSideResBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -486,7 +486,7 @@ function PBM.OpenPriestMenu(row) ccSideHdrLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") ccSideHdrLabel:SetTextColor(0.78, 0.61, 0.23, 1) ccSideHdrLabel:SetAllPoints(); ccSideHdrLabel:SetJustifyH("CENTER") - ccSideHdrLabel:SetText("CC") + ccSideHdrLabel:SetText(PBM_L["CC"]) local treeCCBtn = CreateFrame("Button", nil, LichbornePriestMenu) treeCCBtn:SetSize(EXT_ICON_SIZE, EXT_ICON_SIZE) @@ -501,10 +501,10 @@ function PBM.OpenPriestMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichbornePriestMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00CC|r |cff999999- |r|cffff8000cc|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Crowd control|r", 1, 1, 1) - GameTooltip:AddLine("Shackles (|cffFFFFFFShackle Undead|r) undead targets in combat.", 1, 1, 1) - GameTooltip:AddLine("Re-applies when the effect breaks.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00CC|r |cff999999- |r|cffff8000cc|r |cffffcc00CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Crowd control|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Shackles (|cffFFFFFFShackle Undead|r) undead targets in combat."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Re-applies when the effect breaks."], 1, 1, 1) GameTooltip:Show() end) treeCCBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -757,4 +757,4 @@ function PBM.OpenPriestMenu(row) HideAllPriest(); return end PBM.ShowCharSheet(LichbornePriestMenu, LichbornePriestCatcher, row, PRIEST_LEFT_EXT) -end +end \ No newline at end of file diff --git a/PBM/PBM_Raid.lua b/PBM/PBM_Raid.lua index f41e463..e0e3d93 100644 --- a/PBM/PBM_Raid.lua +++ b/PBM/PBM_Raid.lua @@ -16,10 +16,10 @@ PBM.State.LichborneRosterGsLabel = PBM.State.LichborneRosterGsLabel or nil -- ── Shared constants for the filter role picker ─────────────────────────── local FROLE_SLOTS = { - { key="T", label="Tank", icon="Interface\\Icons\\Ability_Warrior_DefensiveStance", color={r=0.20,g=0.60,b=1.00} }, - { key="H", label="Healer", icon="Interface\\Icons\\Spell_ChargePositive", color={r=0.20,g=1.00,b=0.40} }, - { key="D", label="DPS", icon="Interface\\Icons\\Ability_DualWield", color={r=1.00,g=0.40,b=0.20} }, - { key="A", label="AoE", icon="Interface\\Icons\\Spell_Shadow_RainOfFire", color={r=0.58,g=0.51,b=0.79} }, + { key="T", label=PBM_L["Tank"], icon="Interface\\Icons\\Ability_Warrior_DefensiveStance", color={r=0.20,g=0.60,b=1.00} }, + { key="H", label=PBM_L["Healer"], icon="Interface\\Icons\\Spell_ChargePositive", color={r=0.20,g=1.00,b=0.40} }, + { key="D", label=PBM_L["DPS"], icon="Interface\\Icons\\Ability_DualWield", color={r=1.00,g=0.40,b=0.20} }, + { key="A", label=PBM_L["AoE"], icon="Interface\\Icons\\Spell_Shadow_RainOfFire", color={r=0.58,g=0.51,b=0.79} }, } local FROLE_ICON = { T=FROLE_SLOTS[1].icon, H=FROLE_SLOTS[2].icon, D=FROLE_SLOTS[3].icon, A=FROLE_SLOTS[4].icon } local FROLE_COLOR = { T=FROLE_SLOTS[1].color, H=FROLE_SLOTS[2].color, D=FROLE_SLOTS[3].color, A=FROLE_SLOTS[4].color } @@ -57,7 +57,7 @@ local function BuildRaidFilterRolePicker() pf:Hide() local ttl = pf:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") ttl:SetPoint("TOPLEFT",pf,"TOPLEFT",6,-5) - ttl:SetText("|cffC69B3ARole|r |cff888888(max 2)|r") + ttl:SetText("|cffC69B3A"..PBM_L["Role"].."|r |cff888888"..PBM_L["(max 2)"].."|r") pf.btns = {} for si, slot in ipairs(FROLE_SLOTS) do local col = si - 1 @@ -244,7 +244,7 @@ function PBM.RefreshRaidRows() end rf.roleBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(rf.roleBtn, "ANCHOR_RIGHT") - GameTooltip:AddLine("Role", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Role"], 1, 1, 1) local r2, _ = PBM.GetCurrentRoster() local d2 = r2[idx] local fr2 = d2 and d2.filterRoles or {} @@ -254,7 +254,7 @@ function PBM.RefreshRaidRows() GameTooltip:AddLine("|T"..slot.icon..":14:14|t "..slot.label,sc.r,sc.g,sc.b) end end - GameTooltip:AddLine("|cff888888Click to set role · Right-click removes|r", 0.6,0.6,0.6) + GameTooltip:AddLine("|cff888888"..PBM_L["Click to set role · Right-click removes"].."|r", 0.6,0.6,0.6) GameTooltip:Show() end) rf.roleBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -313,9 +313,9 @@ function PBM.RefreshRaidRows() GameTooltip:SetOwner(rf.roleBtn, "ANCHOR_RIGHT") local botNE3 = LichborneTrackerDB.botNotes and d2 and d2.name and d2.name ~= "" and LichborneTrackerDB.botNotes[d2.name:lower()] - GameTooltip:AddLine("Role", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Role"], 1, 1, 1) if botNE3 and botNE3.roles and #botNE3.roles > 0 then - local roleLabels = { T="Tank", H="Healer", D="DPS", A="AoE" } + local roleLabels = { T=PBM_L["Tank"], H=PBM_L["Healer"], D=PBM_L["DPS"], A=PBM_L["AoE"] } local isTankTip = false for _, r in ipairs(botNE3.roles) do if r == "T" then isTankTip = true; break end end local roleOrder = isTankTip and { T=1, A=2, D=3, H=4 } or { T=1, H=2, D=3, A=4 } @@ -426,7 +426,7 @@ function PBM.RefreshRaidRows() if c then GameTooltip:AddLine(cls, c.r, c.g, c.b) else GameTooltip:AddLine(cls, 0.8, 0.8, 0.9) end end - if spec == "" and cls == "" then GameTooltip:AddLine("Empty", 0.4, 0.4, 0.4) end + if spec == "" and cls == "" then GameTooltip:AddLine(PBM_L["Empty"], 0.4, 0.4, 0.4) end GameTooltip:Show() end) rf.specBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -436,7 +436,7 @@ function PBM.RefreshRaidRows() if rf.delBtn then local idx = i rf.delBtn:SetScript("OnClick", function() -local r5, _ = PBM.GetCurrentRoster(); r5[idx] = {name="", cls="", spec="", gs=0, realGs=0, role="", notes=""} + local r5, _ = PBM.GetCurrentRoster(); r5[idx] = {name="", cls="", spec="", gs=0, realGs=0, role="", notes=""} PBM.RefreshRaidRows() end) end @@ -534,14 +534,14 @@ function PBM.UpdateInviteButtons() LichborneInviteRaidBtn:Show() LichborneInviteRaidBtn:SetBackdropColor(0.30, 0.15, 0.01, 1) if LichborneInviteRaidBtn.lbl then - LichborneInviteRaidBtn.lbl:SetText("|cffd4af37Invite Raid|r") + LichborneInviteRaidBtn.lbl:SetText("|cffd4af37"..PBM_L["Invite Raid"].."|r") end end if _G["LichborneInviteGroupBtn"] then local grpBtn = _G["LichborneInviteGroupBtn"] grpBtn:Show() grpBtn:SetBackdropColor(0.035, 0.14, 0.245, 1) - if grpBtn.lbl then grpBtn.lbl:SetText("|cffd4af37Invite Group|r") end + if grpBtn.lbl then grpBtn.lbl:SetText("|cffd4af37"..PBM_L["Invite Group"].."|r") end end -- Stop Invite overlay: covers both invite buttons when an invite is active if _G["LichborneStopInviteBtn"] then @@ -573,29 +573,29 @@ function PBM.BuildRaidFrame(parent, fl) -- Tier bar across top with dropdown -- Raid definitions: tier -> list of {name, size} local RAID_DEFS = { - [0] = {{"N/A (5-Man)",5}}, - [1] = {{"Molten Core",40},{"Onyxia's Lair",40}}, - [2] = {{"Blackwing Lair",40}}, - [3] = {{"Zul'Gurub",20}}, - [4] = {{"Ruins of Ahn'Qiraj",20}}, - [5] = {{"Ahn'Qiraj 40",40}}, - [6] = {{"Naxxramas (Classic)",40}}, - [7] = {{"Dark Portal Opening",40}}, - [8] = {{"Karazhan",10},{"Gruul's Lair",25},{"Magtheridon's Lair",25}}, - [9] = {{"Serpentshrine Cavern",25},{"Tempest Keep",25}}, - [10] = {{"Mount Hyjal",25},{"Black Temple",25}}, - [11] = {{"Zul'Aman",10}}, - [12] = {{"Sunwell Plateau",25}}, - [13] = {{"Naxxramas 10",10},{"Naxxramas 25",25},{"Eye of Eternity 10",10},{"Eye of Eternity 25",25},{"Obsidian Sanctum 10",10},{"Obsidian Sanctum 25",25}}, - [14] = {{"Ulduar 10",10},{"Ulduar 25",25}}, - [15] = {{"Trial of the Crusader 10",10},{"Trial of the Crusader 25",25},{"Trial of the Grand Crusader 10",10},{"Trial of the Grand Crusader 25",25}}, - [16] = {{"Icecrown Citadel 10",10},{"Icecrown Citadel 25",25},{"Icecrown Citadel 10 Heroic",10},{"Icecrown Citadel 25 Heroic",25}}, - [17] = {{"Ruby Sanctum 10",10},{"Ruby Sanctum 25",25}}, - [18] = {{"N/A",40}}, + [0] = {{PBM_L["N/A (5-Man)"],5}}, + [1] = {{PBM_L["Molten Core"],40},{PBM_L["Onyxia's Lair"],40}}, + [2] = {{PBM_L["Blackwing Lair"],40}}, + [3] = {{PBM_L["Zul'Gurub"],20}}, + [4] = {{PBM_L["Ruins of Ahn'Qiraj"],20}}, + [5] = {{PBM_L["Ahn'Qiraj 40"],40}}, + [6] = {{PBM_L["Naxxramas (Classic)"],40}}, + [7] = {{PBM_L["Dark Portal Opening"],40}}, + [8] = {{PBM_L["Karazhan"],10},{PBM_L["Gruul's Lair"],25},{PBM_L["Magtheridon's Lair"],25}}, + [9] = {{PBM_L["Serpentshrine Cavern"],25},{PBM_L["Tempest Keep"],25}}, + [10] = {{PBM_L["Mount Hyjal"],25},{PBM_L["Black Temple"],25}}, + [11] = {{PBM_L["Zul'Aman"],10}}, + [12] = {{PBM_L["Sunwell Plateau"],25}}, + [13] = {{PBM_L["Naxxramas 10"],10},{PBM_L["Naxxramas 25"],25},{PBM_L["Eye of Eternity 10"],10},{PBM_L["Eye of Eternity 25"],25},{PBM_L["Obsidian Sanctum 10"],10},{PBM_L["Obsidian Sanctum 25"],25}}, + [14] = {{PBM_L["Ulduar 10"],10},{PBM_L["Ulduar 25"],25}}, + [15] = {{PBM_L["Trial of the Crusader 10"],10},{PBM_L["Trial of the Crusader 25"],25},{PBM_L["Trial of the Grand Crusader 10"],10},{PBM_L["Trial of the Grand Crusader 25"],25}}, + [16] = {{PBM_L["Icecrown Citadel 10"],10},{PBM_L["Icecrown Citadel 25"],25},{PBM_L["Icecrown Citadel 10 Heroic"],10},{PBM_L["Icecrown Citadel 25 Heroic"],25}}, + [17] = {{PBM_L["Ruby Sanctum 10"],10},{PBM_L["Ruby Sanctum 25"],25}}, + [18] = {{PBM_L["N/A"],40}}, } -- Init raid selection state - if not LichborneTrackerDB.raidName then LichborneTrackerDB.raidName = "N/A (5-Man)" end + if not LichborneTrackerDB.raidName then LichborneTrackerDB.raidName = PBM_L["N/A (5-Man)"] end if not LichborneTrackerDB.raidSize then LichborneTrackerDB.raidSize = 5 end local tierBar = CreateFrame("Frame", nil, LichborneRaidFrame) @@ -630,7 +630,7 @@ function PBM.BuildRaidFrame(parent, fl) -- ── Tier label + dropdown ────────────────────────────────── local tierLbl = tierBar:CreateFontString(nil,"OVERLAY","GameFontNormal") tierLbl:SetPoint("LEFT",tierBar,"LEFT",6,0) - tierLbl:SetText("|cffC69B3ATier:|r") + tierLbl:SetText("|cffC69B3A" .. (PBM_L["Tier:"] or "Tier:") .. "|r") local tierDD = MakeDD("LichborneRaidTierDrop", 300) tierDD:SetPoint("LEFT",tierLbl,"RIGHT",6,0) @@ -658,7 +658,7 @@ function PBM.BuildRaidFrame(parent, fl) -- Raid-tab-only label override: T0 = "5-Man" instead of shared table value local function RaidTierLabel(t) - if t == 0 then return "T0 — 5-Man" end + if t == 0 then return "T0 — " .. (PBM_L["5-Man"] or "5-Man") end return PBM.TIER_LABELS[t] or ("T"..t) end @@ -677,7 +677,7 @@ function PBM.BuildRaidFrame(parent, fl) -- Raid label local raidLbl = tierBar:CreateFontString(nil,"OVERLAY","GameFontNormal") raidLbl:SetPoint("LEFT",tierDD,"RIGHT",14,0) - raidLbl:SetText("|cffC69B3ARaid:|r") + raidLbl:SetText("|cffC69B3A" .. (PBM_L["Raid:"] or "Raid:") .. "|r") raidDD:SetPoint("LEFT",raidLbl,"RIGHT",6,0) -- Tier dropdown menu @@ -737,7 +737,7 @@ function PBM.BuildRaidFrame(parent, fl) local ck=PBM.TIER_COLORS[t] or PBM.TIER_COLORS[1]; local c=ck; mbbg:SetTexture(c.r*0.25,c.g*0.25,c.b*0.25,1) mb:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local mblbl=mb:CreateFontString(nil,"OVERLAY","GameFontNormalSmall"); mblbl:SetAllPoints(mb); mblbl:SetJustifyH("CENTER") - mblbl:SetText("|cffffffff"..rd[1].."|r |cffaaaaaa("..rd[2].." players)|r") + mblbl:SetText("|cffffffff"..rd[1].."|r |cffaaaaaa("..rd[2].." " .. (PBM_L["players"] or "players") .. ")|r") local capturedName = rd[1] local capturedSize = rd[2] mb:SetScript("OnClick",function() @@ -768,7 +768,7 @@ function PBM.BuildRaidFrame(parent, fl) -- ── Group dropdown (A / B / C) ───────────────────────── local groupLbl = tierBar:CreateFontString(nil,"OVERLAY","GameFontNormal") groupLbl:SetPoint("LEFT",raidDD,"RIGHT",14,0) - groupLbl:SetText("|cffC69B3AGroup:|r") + groupLbl:SetText("|cffC69B3A" .. (PBM_L["Group:"] or "Group:") .. "|r") local groupDD = MakeDD("LichborneRaidGroupDrop", 70) groupDD:SetPoint("LEFT",groupLbl,"RIGHT",6,0) @@ -822,12 +822,12 @@ function PBM.BuildRaidFrame(parent, fl) clearAllRaidsBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local clearAllRaidsLbl = clearAllRaidsBtn:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") clearAllRaidsLbl:SetAllPoints(clearAllRaidsBtn); clearAllRaidsLbl:SetJustifyH("CENTER"); clearAllRaidsLbl:SetJustifyV("MIDDLE") - clearAllRaidsLbl:SetText("|cffd4af37Clear All|r") + clearAllRaidsLbl:SetText("|cffd4af37" .. (PBM_L["Clear All"] or "Clear All") .. "|r") clearAllRaidsBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(clearAllRaidsBtn, "ANCHOR_BOTTOM") - GameTooltip:AddLine("Clear All Raid Rosters", 1, 0.15, 0.15) - GameTooltip:AddLine("Wipes every raid group across all tiers.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("Character data is NOT affected.", 0.2, 1.0, 0.4) + GameTooltip:AddLine(PBM_L["Clear All Raid Rosters"] or "Clear All Raid Rosters", 1, 0.15, 0.15) + GameTooltip:AddLine(PBM_L["Wipes every raid group across all tiers."] or "Wipes every raid group across all tiers.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Character data is NOT affected."] or "Character data is NOT affected.", 0.2, 1.0, 0.4) GameTooltip:Show() end) clearAllRaidsBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -835,13 +835,13 @@ function PBM.BuildRaidFrame(parent, fl) -- Clear ALL raids confirm popup (standard WoW dialog) if not StaticPopupDialogs["PBM_CLEAR_ALL_RAIDS"] then StaticPopupDialogs["PBM_CLEAR_ALL_RAIDS"] = { - text = "Wipe All Raid Rosters?\n\nClears every tier, raid, and group roster.\n|cff33ff66Character data is NOT affected.|r\n|cffff4444This cannot be undone.|r", - button1 = "Yes, Wipe All", - button2 = "Cancel", + text = PBM_L["Wipe All Raid Rosters?\n\nClears every tier, raid, and group roster.\n|cff33ff66Character data is NOT affected.|r\n|cffff4444This cannot be undone.|r"] or "Wipe All Raid Rosters?\n\nClears every tier, raid, and group roster.\n|cff33ff66Character data is NOT affected.|r\n|cffff4444This cannot be undone.|r", + button1 = PBM_L["Yes, Wipe All"] or "Yes, Wipe All", + button2 = PBM_L["Cancel"] or "Cancel", OnAccept = function() LichborneTrackerDB.raidRosters = {} LichborneTrackerDB.botNotes = {} - LichborneOutput("|cffC69B3APlayerbot Manager:|r |cffff9900All raid rosters cleared.|r", 1, 0.7, 0) + LichborneOutput("|cffC69B3A" .. (PBM_L["Playerbot Manager:"] or "Playerbot Manager:") .. "|r |cffff9900" .. (PBM_L["All raid rosters cleared."] or "All raid rosters cleared.") .. "|r", 1, 0.7, 0) if PBM.State.raidRowFrames and #PBM.State.raidRowFrames > 0 then PBM.RefreshRaidRows() end if PBM.State.LichborneOverviewFrame then PBM.RefreshOverviewRows() end end, @@ -861,11 +861,11 @@ function PBM.BuildRaidFrame(parent, fl) copyBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local copyLbl = copyBtn:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") copyLbl:SetAllPoints(copyBtn); copyLbl:SetJustifyH("CENTER"); copyLbl:SetJustifyV("MIDDLE") - copyLbl:SetText("|cffd4af37Copy|r") + copyLbl:SetText("|cffd4af37" .. (PBM_L["Copy"] or "Copy") .. "|r") copyBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(copyBtn,"ANCHOR_BOTTOM") - GameTooltip:AddLine("|cffd4af37Copy Roster|r",1,1,1) - GameTooltip:AddLine("Copies the current roster to clipboard.",0.8,0.8,0.8) + GameTooltip:AddLine("|cffd4af37" .. (PBM_L["Copy Roster"] or "Copy Roster") .. "|r",1,1,1) + GameTooltip:AddLine(PBM_L["Copies the current roster to clipboard."] or "Copies the current roster to clipboard.",0.8,0.8,0.8) GameTooltip:Show() end) copyBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -878,12 +878,12 @@ function PBM.BuildRaidFrame(parent, fl) pasteBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local pasteLbl = pasteBtn:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") pasteLbl:SetAllPoints(pasteBtn); pasteLbl:SetJustifyH("CENTER"); pasteLbl:SetJustifyV("MIDDLE") - pasteLbl:SetText("|cffd4af37Paste|r") + pasteLbl:SetText("|cffd4af37" .. (PBM_L["Paste"] or "Paste") .. "|r") pasteBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(pasteBtn,"ANCHOR_BOTTOM") - GameTooltip:AddLine("|cffd4af37Paste Roster|r",1,1,1) + GameTooltip:AddLine("|cffd4af37" .. (PBM_L["Paste Roster"] or "Paste Roster") .. "|r",1,1,1) if clipboardLabel then - GameTooltip:AddLine("Clipboard: "..clipboardLabel,0.8,0.8,0.8) + GameTooltip:AddLine((PBM_L["Clipboard: "] or "Clipboard: ") .. clipboardLabel,0.8,0.8,0.8) end GameTooltip:Show() end) @@ -912,7 +912,7 @@ function PBM.BuildRaidFrame(parent, fl) pasteYes:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local pasteYesLbl = pasteYes:CreateFontString(nil,"OVERLAY","GameFontNormal") pasteYesLbl:SetAllPoints(pasteYes); pasteYesLbl:SetJustifyH("CENTER") - pasteYesLbl:SetText("|cffd4af37Yes, Paste|r") + pasteYesLbl:SetText("|cffd4af37" .. (PBM_L["Yes, Paste"] or "Yes, Paste") .. "|r") local pasteNo = CreateFrame("Button",nil,pasteConfirm) pasteNo:SetSize(120,22); pasteNo:SetPoint("BOTTOMRIGHT",pasteConfirm,"BOTTOMRIGHT",-16,10) @@ -921,7 +921,7 @@ function PBM.BuildRaidFrame(parent, fl) pasteNo:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local pasteNoLbl = pasteNo:CreateFontString(nil,"OVERLAY","GameFontNormal") pasteNoLbl:SetAllPoints(pasteNo); pasteNoLbl:SetJustifyH("CENTER") - pasteNoLbl:SetText("|cffd4af37Cancel|r") + pasteNoLbl:SetText("|cffd4af37" .. (PBM_L["Cancel"] or "Cancel") .. "|r") pasteNo:SetScript("OnClick", function() pasteConfirm:Hide() end) copyBtn:SetScript("OnClick", function() @@ -946,7 +946,7 @@ function PBM.BuildRaidFrame(parent, fl) clipboardLabel = "T"..t.." "..name.." ("..grp..")" pasteBtn:Show() if LichborneAddStatus then - LichborneAddStatus:SetText("|cffd4af37Roster copied to clipboard: "..clipboardLabel.."|r") + LichborneAddStatus:SetText("|cffd4af37" .. (PBM_L["Roster copied to clipboard: "] or "Roster copied to clipboard: ") .. clipboardLabel .. "|r") end end) @@ -977,7 +977,7 @@ function PBM.BuildRaidFrame(parent, fl) pasteBtn:Hide() PBM.RefreshRaidRows() if LichborneAddStatus then - LichborneAddStatus:SetText("|cffd4af37Roster copied!|r") + LichborneAddStatus:SetText("|cffd4af37" .. (PBM_L["Roster copied!"] or "Roster copied!") .. "|r") end end) @@ -987,7 +987,7 @@ function PBM.BuildRaidFrame(parent, fl) local name = LichborneTrackerDB.raidName or "?" local grp = LichborneTrackerDB.raidGroup or "A" local destLabel = "T"..t.." "..name.." ("..grp..")" - pasteConfirmText:SetText("|cffd4af37Copy "..clipboardLabel.." roster to "..destLabel.."?|r") + pasteConfirmText:SetText(string.format("|cffd4af37" .. (PBM_L["Copy %s roster to %s?"] or "Copy %s roster to %s?") .. "|r", clipboardLabel, destLabel)) pasteConfirm:SetPoint("CENTER",UIParent,"CENTER",0,0) pasteConfirm:Show() end) @@ -1003,13 +1003,13 @@ function PBM.BuildRaidFrame(parent, fl) clearBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local clearLbl = clearBtn:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") clearLbl:SetAllPoints(clearBtn); clearLbl:SetJustifyH("CENTER"); clearLbl:SetJustifyV("MIDDLE") - clearLbl:SetText("|cffd4af37Clear|r") + clearLbl:SetText("|cffd4af37" .. (PBM_L["Clear"] or "Clear") .. "|r") clearBtn:SetScript("OnEnter",function() local raidName = LichborneTrackerDB and LichborneTrackerDB.raidName or "N/A (5-Man)" GameTooltip:SetOwner(clearBtn,"ANCHOR_BOTTOM") - GameTooltip:AddLine("|cffff4444Clear this Raid|r |cffd4af37(All Groups)|r",1,1,1) - GameTooltip:AddLine("Removes all characters from "..raidName,0.8,0.8,0.8) - GameTooltip:AddLine("across |cffd4af37A, B, and C|r.",0.8,0.8,0.8) + GameTooltip:AddLine("|cffff4444" .. (PBM_L["Clear this Raid"] or "Clear this Raid") .. "|r |cffd4af37" .. (PBM_L["(All Groups)"] or "(All Groups)") .. "|r",1,1,1) + GameTooltip:AddLine((PBM_L["Removes all characters from "] or "Removes all characters from ") .. raidName,0.8,0.8,0.8) + GameTooltip:AddLine(PBM_L["across |cffd4af37A, B, and C|r."] or "across |cffd4af37A, B, and C|r.",0.8,0.8,0.8) GameTooltip:Show() end) clearBtn:SetScript("OnLeave",function() GameTooltip:Hide() end) @@ -1021,9 +1021,9 @@ function PBM.BuildRaidFrame(parent, fl) -- Confirm popup for Clear (single raid, standard WoW dialog) if not StaticPopupDialogs["PBM_CLEAR_RAID"] then StaticPopupDialogs["PBM_CLEAR_RAID"] = { - text = "Clear |cffd4af37%s|r?\n\nClears Groups A, B, and C.\n|cffff4444Cannot be undone.|r", - button1 = "Yes, Clear", - button2 = "Cancel", + text = PBM_L["Clear |cffd4af37%s|r?\n\nClears Groups A, B, and C.\n|cffff4444Cannot be undone.|r"] or "Clear |cffd4af37%s|r?\n\nClears Groups A, B, and C.\n|cffff4444Cannot be undone.|r", + button1 = PBM_L["Yes, Clear"] or "Yes, Clear", + button2 = PBM_L["Cancel"] or "Cancel", OnAccept = function() local raidName = LichborneTrackerDB and LichborneTrackerDB.raidName or "N/A (5-Man)" if not LichborneTrackerDB.raidRosters then LichborneTrackerDB.raidRosters = {} end @@ -1055,7 +1055,7 @@ function PBM.BuildRaidFrame(parent, fl) local function RH(lbl,x,w) local fs=hdrRow:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") fs:SetPoint("LEFT",hdrRow,"LEFT",x,0); fs:SetWidth(w); fs:SetJustifyH("CENTER") - fs:SetText("|cffd4af37"..lbl.."|r") + fs:SetText("|cffd4af37" .. (PBM_L[lbl] or lbl) .. "|r") end local function RSH(lbl,x,w,key,isNumeric,tipExtra) local btn = CreateFrame("Button",nil,hdrRow) @@ -1064,12 +1064,13 @@ function PBM.BuildRaidFrame(parent, fl) btn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local fs=btn:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") fs:SetAllPoints(btn); fs:SetJustifyH("CENTER"); fs:SetJustifyV("MIDDLE") - fs:SetText("|cffd4af37"..lbl.."|r") - PBM.State.raidSortHdrs[key] = {lbl=lbl, fs=fs} + local localizedLbl = PBM_L[lbl] or lbl + fs:SetText("|cffd4af37"..localizedLbl.."|r") + PBM.State.raidSortHdrs[key] = {lbl=localizedLbl, fs=fs} btn:SetScript("OnEnter",function() GameTooltip:SetOwner(btn,"ANCHOR_BOTTOM") - GameTooltip:AddLine("Click to sort",1,1,1) - if tipExtra then GameTooltip:AddLine(tipExtra,0.8,0.8,0.8) end + GameTooltip:AddLine(PBM_L["Click to sort"] or "Click to sort",1,1,1) + if tipExtra then GameTooltip:AddLine(PBM_L[tipExtra] or tipExtra,0.8,0.8,0.8) end GameTooltip:Show() end) btn:SetScript("OnLeave",function() GameTooltip:Hide() end) @@ -1155,7 +1156,7 @@ function PBM.BuildRaidFrame(parent, fl) if d and d.name and d.name ~= "" then dragTex:SetVertexColor(0.9,0.7,0.1,1.0) GameTooltip:SetOwner(dragBtn,"ANCHOR_RIGHT") - GameTooltip:AddLine("Drag to reorder",1,1,1) + GameTooltip:AddLine(PBM_L["Drag to reorder"] or "Drag to reorder",1,1,1) GameTooltip:Show() end end @@ -1283,9 +1284,9 @@ function PBM.BuildRaidFrame(parent, fl) db:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") db:SetScript("OnEnter", function() GameTooltip:SetOwner(db, "ANCHOR_RIGHT") - GameTooltip:AddLine("Remove from Raid", 1, 0.3, 0.3) - GameTooltip:AddLine("Clears this slot in the raid roster.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("|cffFF8C00Character remains in the tracker.|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Remove from Raid"], 1, 0.3, 0.3) + GameTooltip:AddLine(PBM_L["Clears this slot in the raid roster."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["|cffFF8C00Character remains in the tracker.|r"], 1, 1, 1) GameTooltip:Show() end) db:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -1299,9 +1300,9 @@ function PBM.BuildRaidFrame(parent, fl) invb:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") invb:SetScript("OnEnter", function() GameTooltip:SetOwner(invb, "ANCHOR_RIGHT") - GameTooltip:AddLine("|cff44eeff> Invite to Group|r", 1,1,1) - GameTooltip:AddLine("|cff44ff44Left-click to invite to group.|r", 1,1,1) - GameTooltip:AddLine("|cffff2020Right-click to remove.|r", 1,1,1) + GameTooltip:AddLine(PBM_L["|cff44eeff> Invite to Group|r"], 1,1,1) + GameTooltip:AddLine(PBM_L["|cff44ff44Left-click to invite to group.|r"], 1,1,1) + GameTooltip:AddLine(PBM_L["|cffff2020Right-click to remove.|r"], 1,1,1) GameTooltip:Show() end) invb:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -1313,12 +1314,12 @@ function PBM.BuildRaidFrame(parent, fl) if btn == "RightButton" then UninviteUnit(d.name) SendChatMessage(".playerbots bot remove "..d.name, "SAY") - LichborneOutput("|cffC69B3APBM:|r Removed "..d.name.." from bots.", 1, 0.85, 0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r Removed "]..d.name..PBM_L[" from bots."], 1, 0.85, 0) return end SendChatMessage(".playerbots bot add "..d.name, "SAY") if LichborneAddStatus then - LichborneAddStatus:SetText("|cffd4af37Invited "..d.name.." to group.|r") + LichborneAddStatus:SetText(PBM_L["|cffd4af37Invited "]..d.name..PBM_L[" to group.|r"]) end end end) @@ -1436,7 +1437,7 @@ function PBM.BuildRaidFrame(parent, fl) rcbBg:SetAllPoints(raidCountBar); rcbBg:SetTexture(0.05, 0.07, 0.13, 1) local rcTitle = raidCountBar:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") rcTitle:SetPoint("LEFT", raidCountBar, "LEFT", 4, 0) - rcTitle:SetText("|cffC69B3ACount:|r"); rcTitle:SetWidth(44) + rcTitle:SetText("|cffC69B3A"..PBM_L["Count:"].."|r"); rcTitle:SetWidth(44) PBM.State.LichborneRaidCountLabels = {} local rcW = (1086 - 50) / 10 local rcIdx = 0 @@ -1477,16 +1478,16 @@ function PBM.BuildRaidFrame(parent, fl) inviteBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local inviteLbl = inviteBtn:CreateFontString(nil,"OVERLAY","GameFontNormal") inviteLbl:SetAllPoints(inviteBtn); inviteLbl:SetJustifyH("CENTER"); inviteLbl:SetJustifyV("MIDDLE") - inviteLbl:SetText("|cffd4af37Invite Raid|r") + inviteLbl:SetText("|cffd4af37"..PBM_L["Invite Raid"].."|r") inviteBtn.lbl = inviteLbl inviteBtn:SetScript("OnEnter",function() local roster, size = PBM.GetCurrentRoster() local count = 0 for i=1,size do if roster[i] and roster[i].name and roster[i].name ~= "" then count=count+1 end end GameTooltip:SetOwner(inviteBtn,"ANCHOR_TOP") - GameTooltip:AddLine("Invite Raid",0.78,0.61,0.23) - GameTooltip:AddLine(count.." players in this roster",0.8,0.8,0.8) - GameTooltip:AddLine("Does not work for rndbots.",1,0.4,0) + GameTooltip:AddLine(PBM_L["Invite Raid"],0.78,0.61,0.23) + GameTooltip:AddLine(count..PBM_L[" players in this roster"],0.8,0.8,0.8) + GameTooltip:AddLine(PBM_L["Does not work for rndbots."],1,0.4,0) GameTooltip:Show() end) inviteBtn:SetScript("OnLeave",function() GameTooltip:Hide() end) @@ -1506,7 +1507,7 @@ function PBM.BuildRaidFrame(parent, fl) end end if #names == 0 then - LichborneOutput("|cffC69B3APBM:|r No players in this roster.",1,0.5,0.5) + LichborneOutput(PBM_L["|cffC69B3APBM:|r No players in this roster."],1,0.5,0.5) return end local function GetClassHex(name) @@ -1518,8 +1519,8 @@ function PBM.BuildRaidFrame(parent, fl) local totalCount = #names + 1 -- +1 for self PBM.SetInviteActive(true) - LichborneOutput("|cffC69B3APBM:|r Starting invite for "..totalCount.." players...",1,0.85,0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff9900Logging out all bots...") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r Starting invite for "]..totalCount..PBM_L[" players..."],1,0.85,0) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cffff9900Logging out all bots..."]) end -- Always kick everyone and start fresh so we get a clean group/raid. SendChatMessage(".playerbots bot remove *", "SAY") @@ -1540,21 +1541,21 @@ function PBM.BuildRaidFrame(parent, fl) waitTime = 0 LeaveParty() phase = "leave_wait" - LichborneOutput("|cffC69B3APBM:|r Bots removed, leaving party...",1,0.85,0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff9900Leaving party, then inviting...") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r Bots removed, leaving party..."],1,0.85,0) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cffff9900Leaving party, then inviting..."]) end elseif phase == "leave_wait" then if waitTime < 1.0 then return end waitTime = 0 phase = "first" - LichborneOutput("|cffC69B3APBM:|r Bots cleared, starting invites...",1,0.85,0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff9900Inviting "..totalCount.." players...") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r Bots cleared, starting invites..."],1,0.85,0) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cffff9900Inviting "]..totalCount..PBM_L[" players..."]) end elseif phase == "first" then if waitTime < 0.5 then return end local firstName = names[1] SendChatMessage(".playerbots bot add "..firstName, "SAY") - LichborneOutput("|cffC69B3APBM:|r Inviting "..GetClassHex(firstName)..firstName.."|r...",1,0.85,0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r Inviting "]..GetClassHex(firstName)..firstName.."|r...",1,0.85,0) inviteIndex = 2 waitTime = 0 phase = "rest" @@ -1565,12 +1566,12 @@ function PBM.BuildRaidFrame(parent, fl) if inviteIndex > #names then phase = "verify_wait" waitTime = 0 - LichborneOutput("|cffC69B3APBM:|r Initial invites sent, verifying...",1,0.85,0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r Initial invites sent, verifying..."],1,0.85,0) return end local pname = names[inviteIndex] SendChatMessage(".playerbots bot add "..pname, "SAY") - LichborneOutput("|cffC69B3APBM:|r Inviting "..GetClassHex(pname)..pname.."|r...",1,0.85,0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r Inviting "]..GetClassHex(pname)..pname.."|r...",1,0.85,0) inviteIndex = inviteIndex + 1 elseif phase == "verify_wait" then @@ -1598,15 +1599,15 @@ function PBM.BuildRaidFrame(parent, fl) end end if #missing == 0 then - LichborneOutput("|cffC69B3APBM:|r |cff44ff44All "..totalCount.." players confirmed in group!|r",1,0.85,0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cff44ff44All "..totalCount.." players confirmed.|r") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r |cff44ff44All "]..totalCount..PBM_L[" players confirmed in group!|r"],1,0.85,0) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cff44ff44All "]..totalCount..PBM_L[" players confirmed.|r"]) end inviteFrame:SetScript("OnUpdate",nil) PBM.State.activeInviteFrame = nil PBM.SetInviteActive(false) PBM.UpdateInviteButtons() return end - LichborneOutput("|cffC69B3APBM:|r |cffff9900"..#missing.." missed — re-inviting...|r",1,0.85,0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r |cffff9900"]..#missing..PBM_L[" missed — re-inviting...|r"],1,0.85,0) names = missing inviteIndex = 1 phase = "reinvite" @@ -1615,8 +1616,8 @@ function PBM.BuildRaidFrame(parent, fl) elseif phase == "reinvite" then if reinviteSubPhase == "remove" then if inviteIndex > #names then - LichborneOutput("|cffC69B3APBM:|r |cff44ff44Re-invite pass complete.|r",1,0.85,0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cff44ff44Invite complete (re-invite pass done).|r") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r |cff44ff44Re-invite pass complete.|r"],1,0.85,0) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cff44ff44Invite complete (re-invite pass done).|r"]) end inviteFrame:SetScript("OnUpdate",nil) PBM.State.activeInviteFrame = nil PBM.SetInviteActive(false) @@ -1625,7 +1626,7 @@ function PBM.BuildRaidFrame(parent, fl) end local pname = names[inviteIndex] SendChatMessage(".playerbots bot remove "..pname, "SAY") - LichborneOutput("|cffC69B3APBM:|r Removing "..GetClassHex(pname)..pname.."|r before re-invite...",1,0.85,0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r Removing "]..GetClassHex(pname)..pname..PBM_L["|r before re-invite..."],1,0.85,0) waitTime = 0 reinviteSubPhase = "add" @@ -1633,7 +1634,7 @@ function PBM.BuildRaidFrame(parent, fl) if waitTime < 1.0 then return end local pname = names[inviteIndex] SendChatMessage(".playerbots bot add "..pname, "SAY") - LichborneOutput("|cffC69B3APBM:|r Re-inviting "..GetClassHex(pname)..pname.."|r...",1,0.85,0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r Re-inviting "]..GetClassHex(pname)..pname.."|r...",1,0.85,0) inviteIndex = inviteIndex + 1 waitTime = 0 reinviteSubPhase = "remove" @@ -1653,7 +1654,7 @@ function PBM.BuildRaidFrame(parent, fl) inviteGroupBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local inviteGroupLbl = inviteGroupBtn:CreateFontString(nil,"OVERLAY","GameFontNormal") inviteGroupLbl:SetAllPoints(inviteGroupBtn); inviteGroupLbl:SetJustifyH("CENTER"); inviteGroupLbl:SetJustifyV("MIDDLE") - inviteGroupLbl:SetText("|cffd4af37Invite Group|r") + inviteGroupLbl:SetText("|cffd4af37"..PBM_L["Invite Group"].."|r") inviteGroupBtn.lbl = inviteGroupLbl inviteGroupBtn:SetScript("OnEnter",function() -- Always count from T0 5-Man roster @@ -1663,9 +1664,9 @@ function PBM.BuildRaidFrame(parent, fl) local count = 0 for i=1,5 do if t0roster[i] and t0roster[i].name and t0roster[i].name ~= "" then count=count+1 end end GameTooltip:SetOwner(inviteGroupBtn,"ANCHOR_TOP") - GameTooltip:AddLine("Invite Group (5-Man)",0.78,0.61,0.23) - GameTooltip:AddLine(count.." players in T0 5-Man roster",0.8,0.8,0.8) - GameTooltip:AddLine("Does not work for rndbots.",1,0.4,0) + GameTooltip:AddLine(PBM_L["Invite Group (5-Man)"],0.78,0.61,0.23) + GameTooltip:AddLine(count..PBM_L[" players in T0 5-Man roster"],0.8,0.8,0.8) + GameTooltip:AddLine(PBM_L["Does not work for rndbots."],1,0.4,0) GameTooltip:Show() end) inviteGroupBtn:SetScript("OnLeave",function() GameTooltip:Hide() end) @@ -1691,7 +1692,7 @@ function PBM.BuildRaidFrame(parent, fl) end end if #names == 0 then - LichborneOutput("|cffC69B3APBM:|r No players in T0 5-Man roster.",1,0.5,0.5) + LichborneOutput(PBM_L["|cffC69B3APBM:|r No players in T0 5-Man roster."],1,0.5,0.5) return end local function GetClassHex(name) @@ -1701,8 +1702,8 @@ function PBM.BuildRaidFrame(parent, fl) return "|cffffff88" end PBM.SetInviteActive(true) - LichborneOutput("|cffC69B3APBM:|r Starting group invite for "..#names.." players...",1,0.85,0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff9900Logging out all bots...") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r Starting group invite for "]..#names..PBM_L[" players..."],1,0.85,0) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cffff9900Logging out all bots..."]) end -- Remove all bots with wildcard first SendChatMessage(".playerbots bot remove *", "SAY") local invIdx = 1 @@ -1719,14 +1720,14 @@ function PBM.BuildRaidFrame(parent, fl) waited = 0 LeaveParty() grpPhase = "leave_wait" - LichborneOutput("|cffC69B3APBM:|r Bots removed, leaving party...",1,0.85,0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff9900Leaving party, then inviting...") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r Bots removed, leaving party..."],1,0.85,0) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cffff9900Leaving party, then inviting..."]) end elseif grpPhase == "leave_wait" then if waited < 1.0 then return end waited = 0 grpPhase = "invite" - LichborneOutput("|cffC69B3APBM:|r Starting group invites...",1,0.85,0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff9900Inviting "..#names.." players...") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r Starting group invites..."],1,0.85,0) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cffff9900Inviting "]..#names..PBM_L[" players..."]) end elseif grpPhase == "invite" then if waited < 0.8 then return end waited = 0 @@ -1734,12 +1735,12 @@ function PBM.BuildRaidFrame(parent, fl) -- Verify pass grpPhase = "verify_wait" waited = 0 - LichborneOutput("|cffC69B3APBM:|r Initial invites sent, verifying...",1,0.85,0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r Initial invites sent, verifying..."],1,0.85,0) return end local pname = names[invIdx] SendChatMessage(".playerbots bot add "..pname, "SAY") - LichborneOutput("|cffC69B3APBM:|r Inviting "..GetClassHex(pname)..pname.."|r...",1,0.85,0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r Inviting "]..GetClassHex(pname)..pname.."|r...",1,0.85,0) invIdx = invIdx + 1 elseif grpPhase == "verify_wait" then if waited < 3.0 then return end @@ -1766,15 +1767,15 @@ function PBM.BuildRaidFrame(parent, fl) end end if #missing == 0 then - LichborneOutput("|cffC69B3APBM:|r |cff44ff44All "..#names.." players confirmed in group!|r",1,0.85,0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cff44ff44All "..#names.." players confirmed in group.|r") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r |cff44ff44All "]..#names..PBM_L[" players confirmed in group.|r"],1,0.85,0) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cff44ff44All "]..#names..PBM_L[" players confirmed in group.|r"]) end grpFrame:SetScript("OnUpdate",nil) PBM.State.activeInviteFrame = nil PBM.SetInviteActive(false) PBM.UpdateInviteButtons() return end - LichborneOutput("|cffC69B3APBM:|r |cffff9900"..#missing.." missed — re-inviting...|r",1,0.85,0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r |cffff9900"]..#missing..PBM_L[" missed — re-inviting...|r"],1,0.85,0) names = missing invIdx = 1 grpPhase = "reinvite" @@ -1782,8 +1783,8 @@ function PBM.BuildRaidFrame(parent, fl) elseif grpPhase == "reinvite" then if grpReinviteSubPhase == "remove" then if invIdx > #names then - LichborneOutput("|cffC69B3APBM:|r |cff44ff44Re-invite pass complete.|r",1,0.85,0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cff44ff44Invite complete (re-invite pass done).|r") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r |cff44ff44Re-invite pass complete.|r"],1,0.85,0) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cff44ff44Invite complete (re-invite pass done).|r"]) end grpFrame:SetScript("OnUpdate",nil) PBM.State.activeInviteFrame = nil PBM.SetInviteActive(false) @@ -1792,14 +1793,14 @@ function PBM.BuildRaidFrame(parent, fl) end local pname = names[invIdx] SendChatMessage(".playerbots bot remove "..pname, "SAY") - LichborneOutput("|cffC69B3APBM:|r Removing "..GetClassHex(pname)..pname.."|r before re-invite...",1,0.85,0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r Removing "]..GetClassHex(pname)..pname..PBM_L["|r before re-invite..."],1,0.85,0) waited = 0 grpReinviteSubPhase = "add" elseif grpReinviteSubPhase == "add" then if waited < 1.0 then return end local pname = names[invIdx] SendChatMessage(".playerbots bot add "..pname, "SAY") - LichborneOutput("|cffC69B3APBM:|r Re-inviting "..GetClassHex(pname)..pname.."|r...",1,0.85,0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r Re-inviting "]..GetClassHex(pname)..pname.."|r...",1,0.85,0) invIdx = invIdx + 1 waited = 0 grpReinviteSubPhase = "remove" @@ -1820,11 +1821,11 @@ function PBM.BuildRaidFrame(parent, fl) stopInviteBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local stopInviteLbl = stopInviteBtn:CreateFontString(nil,"OVERLAY","GameFontNormal") stopInviteLbl:SetAllPoints(stopInviteBtn); stopInviteLbl:SetJustifyH("CENTER"); stopInviteLbl:SetJustifyV("MIDDLE") - stopInviteLbl:SetText("|cffd4af37Stop Invite|r") + stopInviteLbl:SetText("|cffd4af37"..PBM_L["Stop Invite"].."|r") stopInviteBtn:SetScript("OnEnter",function() GameTooltip:SetOwner(stopInviteBtn,"ANCHOR_TOP") - GameTooltip:AddLine("Stop Invite",1,1,1) - GameTooltip:AddLine("Cancels the running invite script.",0.8,0.8,0.8) + GameTooltip:AddLine(PBM_L["Stop Invite"],1,1,1) + GameTooltip:AddLine(PBM_L["Cancels the running invite script."],0.8,0.8,0.8) GameTooltip:Show() end) stopInviteBtn:SetScript("OnLeave",function() GameTooltip:Hide() end) @@ -1834,8 +1835,8 @@ function PBM.BuildRaidFrame(parent, fl) PBM.State.activeInviteFrame = nil PBM.SetInviteActive(false) PBM.UpdateInviteButtons() - LichborneOutput("|cffC69B3APBM:|r |cffff4444Invite stopped.|r", 1, 0.85, 0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff4444Invite stopped.") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r |cffff4444Invite stopped.|r"], 1, 0.85, 0) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cffff4444Invite stopped."]) end end end) stopInviteBtn:Hide() @@ -1843,4 +1844,4 @@ function PBM.BuildRaidFrame(parent, fl) PBM.UpdateInviteButtons() -end +end \ No newline at end of file diff --git a/PBM/PBM_Rogue.lua b/PBM/PBM_Rogue.lua index 2e23adb..c74f0ed 100644 --- a/PBM/PBM_Rogue.lua +++ b/PBM/PBM_Rogue.lua @@ -18,12 +18,12 @@ end -- Talent spec templates for the Set Talents menu local ROGUE_TALENT_SPECS = { - { label="Assassination |cffffcc00PvE|r", spec="as pve", wowSpec="Assassination", icon="Interface\\Icons\\Ability_Rogue_Eviscerate" }, - { label="Combat |cffffcc00PvE|r", spec="combat pve", wowSpec="Combat", icon="Interface\\Icons\\Ability_BackStab" }, - { label="Subtlety |cffffcc00PvE|r", spec="subtlety pve", wowSpec="Subtlety", icon="Interface\\Icons\\Ability_Stealth" }, - { label="Assassination |cffff4444PvP|r", spec="as pvp", wowSpec="Assassination", icon="Interface\\Icons\\Ability_Rogue_Eviscerate" }, - { label="Combat |cffff4444PvP|r", spec="combat pvp", wowSpec="Combat", icon="Interface\\Icons\\Ability_BackStab" }, - { label="Subtlety |cffff4444PvP|r", spec="subtlety pvp", wowSpec="Subtlety", icon="Interface\\Icons\\Ability_Stealth" }, + { label=PBM_L["Assassination |cffffcc00PvE|r"], spec="as pve", wowSpec="Assassination", icon="Interface\\Icons\\Ability_Rogue_Eviscerate" }, + { label=PBM_L["Combat |cffffcc00PvE|r"], spec="combat pve", wowSpec="Combat", icon="Interface\\Icons\\Ability_BackStab" }, + { label=PBM_L["Subtlety |cffffcc00PvE|r"], spec="subtlety pve", wowSpec="Subtlety", icon="Interface\\Icons\\Ability_Stealth" }, + { label=PBM_L["Assassination |cffff4444PvP|r"], spec="as pvp", wowSpec="Assassination", icon="Interface\\Icons\\Ability_Rogue_Eviscerate" }, + { label=PBM_L["Combat |cffff4444PvP|r"], spec="combat pvp", wowSpec="Combat", icon="Interface\\Icons\\Ability_BackStab" }, + { label=PBM_L["Subtlety |cffff4444PvP|r"], spec="subtlety pvp", wowSpec="Subtlety", icon="Interface\\Icons\\Ability_Stealth" }, } -- ───────────────────────────────────────────────────────────────────────────── @@ -172,107 +172,107 @@ function PBM.OpenRogueMenu(row) end -- ── Row 1: Specs ───────────────────────────────────────────── - MakeSpecBox(col1X, specBoxY, SPEC_COL_W, "Assassination", "Interface\\Icons\\Ability_Rogue_Eviscerate") - MakeSpecBox(col2X, specBoxY, SPEC_COL_W, "Combat", "Interface\\Icons\\Ability_BackStab") - MakeSpecBox(col3X, specBoxY, SPEC_COL_W, "Subtlety", "Interface\\Icons\\Ability_Stealth") + MakeSpecBox(col1X, specBoxY, SPEC_COL_W, PBM_L["Assassination"], "Interface\\Icons\\Ability_Rogue_Eviscerate") + MakeSpecBox(col2X, specBoxY, SPEC_COL_W, PBM_L["Combat"], "Interface\\Icons\\Ability_BackStab") + MakeSpecBox(col3X, specBoxY, SPEC_COL_W, PBM_L["Subtlety"], "Interface\\Icons\\Ability_Stealth") local treeAsBtn = MakeTreeBtn(col1X + ICON_OFF, specIconY, "Interface\\Icons\\Ability_Rogue_Eviscerate", function() - GameTooltip:SetText("|cffffcc00Assassination|r |cff999999- |r|cffFFF569melee|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Assassination DoT specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Combat, Subtlety.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Assassination|r |cff999999- |r|cffFFF569melee|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Assassination DoT specialization|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Combat, Subtlety.|r"], 1, 1, 1) end) LichborneRogueMenu.treeAsBtn = treeAsBtn local treeCombatBtn = MakeTreeBtn(col2X + ICON_OFF, specIconY, "Interface\\Icons\\Ability_BackStab", function() - GameTooltip:SetText("|cffffcc00Combat|r |cff999999- |r|cffFFF569dps|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Combat sustained DPS|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Assassination, Subtlety.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Combat|r |cff999999- |r|cffFFF569dps|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Combat sustained DPS|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Assassination, Subtlety.|r"], 1, 1, 1) end) LichborneRogueMenu.treeCombatBtn = treeCombatBtn local treeSubtletyBtn = MakeTreeBtn(col3X + ICON_OFF, specIconY, "Interface\\Icons\\Ability_Stealth", function() - GameTooltip:SetText("|cffffcc00Subtlety|r |cff999999- |r|cffFFF569melee|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Subtlety burst from Stealth|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Assassination, Combat.|r", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Subtlety|r |cff999999- |r|cffFFF569melee|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Subtlety burst from Stealth|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cffFF4444Mutually exclusive with Assassination, Combat.|r"], 1, 1, 1) end) LichborneRogueMenu.treeSubtletyBtn = treeSubtletyBtn -- ── DPS section (3-wide, 1 row): DPS | Melee | Boost ──────────── - MakeWideBox(dpsHdrX, dpsHdrY, dpsSectionW, "DPS") + MakeWideBox(dpsHdrX, dpsHdrY, dpsSectionW, PBM_L["DPS"]) local treeDpsBtn = MakeTreeBtn(dpsHdrX, dpsIconY, "Interface\\Icons\\inv_sword_27", function() - GameTooltip:SetText("|cffffcc00Dps|r |cff999999- |r|cffFFF569dps|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Single-target DPS mode|r", 1, 1, 1) - GameTooltip:AddLine("Uses the standard Combat rotation", 1, 1, 1) - GameTooltip:AddLine("on the current target.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Dps|r |cff999999- |r|cffFFF569dps|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Single-target DPS mode|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Uses the standard Combat rotation"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["on the current target."], 1, 1, 1) end) LichborneRogueMenu.treeDpsBtn = treeDpsBtn local treeMeleeBtn = MakeTreeBtn(dpsHdrX + 30, dpsIconY, "Interface\\Icons\\inv_sword_35", function() - GameTooltip:SetText("|cffffcc00Melee|r |cff999999- |r|cffFFF569melee|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Melee DPS mode|r", 1, 1, 1) - GameTooltip:AddLine("Core melee attack mode for", 1, 1, 1) - GameTooltip:AddLine("Assassination and Subtlety.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Melee|r |cff999999- |r|cffFFF569melee|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Melee DPS mode|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Core melee attack mode for"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Assassination and Subtlety."], 1, 1, 1) end) LichborneRogueMenu.treeMeleeBtn = treeMeleeBtn local treeBoostBtn = MakeTreeBtn(dpsHdrX + 60, dpsIconY, "Interface\\Icons\\Ability_Mage_PotentSpirit", function() - GameTooltip:SetText("|cffffcc00Boost|r |cff999999- |r|cffFFF569boost|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Offensive cooldown burst|r", 1, 1, 1) - GameTooltip:AddLine("Works alongside all DPS modes.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Boost|r |cff999999- |r|cffFFF569boost|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Offensive cooldown burst|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Works alongside all DPS modes."], 1, 1, 1) end) LichborneRogueMenu.treeBoostBtn = treeBoostBtn -- ── Stealth section (2-wide, 1 row): Stealth | Stealthed ───────── - MakeWideBox(stlHdrX, stlHdrY, stlSectionW, "Stealth") + MakeWideBox(stlHdrX, stlHdrY, stlSectionW, PBM_L["Stealth"]) local treeStealthBtn = MakeTreeBtn(stlHdrX, stlIconY, "Interface\\Icons\\Ability_Stealth", function() - GameTooltip:SetText("|cffffcc00Stealth|r |cff999999- |r|cffFFF569stealth|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Activates Stealth mode|r", 1, 1, 1) - GameTooltip:AddLine("Enters |cffffcc00Stealth|r between fights when possible.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Stealth|r |cff999999- |r|cffFFF569stealth|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Activates Stealth mode|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Enters |cffffcc00Stealth|r between fights when possible."], 1, 1, 1) end) LichborneRogueMenu.treeStealthBtn = treeStealthBtn local treeStealthedBtn = MakeTreeBtn(stlHdrX + 30, stlIconY, "Interface\\Icons\\Ability_Sap", function() - GameTooltip:SetText("|cffffcc00Stealthed|r |cff999999- |r|cffFFF569stealthed|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00In-combat stealth behavior|r", 1, 1, 1) - GameTooltip:AddLine("Approaches targets in |cffffcc00Stealth|r.", 1, 1, 1) - GameTooltip:AddLine("May pause DPS to re-stealth.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Stealthed|r |cff999999- |r|cffFFF569stealthed|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00In-combat stealth behavior|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Approaches targets in |cffffcc00Stealth|r."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["May pause DPS to re-stealth."], 1, 1, 1) end) LichborneRogueMenu.treeStealthedBtn = treeStealthedBtn -- ── Assist header (3 buttons wide, centred) ─────────────────── - MakeWideBox(assistHdrX, assistHdrY, assistHdrW, "Assist") + MakeWideBox(assistHdrX, assistHdrY, assistHdrW, PBM_L["Assist"]) local treeTankAssistBtn = MakeTreeBtn(assistHdrX, assistIconY, "Interface\\Icons\\inv_shield_02", function() - GameTooltip:SetText("|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Tank target focus|r", 1, 1, 1) - GameTooltip:AddLine("Attacks the main tank's current target.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Tank target focus|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Attacks the main tank's current target."], 1, 1, 1) end) LichborneRogueMenu.treeTankAssistBtn = treeTankAssistBtn local treeDpsAssistBtn = MakeTreeBtn(assistHdrX + 30, assistIconY, "Interface\\Icons\\Ability_Warrior_Challange", function() - GameTooltip:SetText("|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Assists the main assist target|r", 1, 1, 1) - GameTooltip:AddLine("Attacks the assist leader's target.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Assists the main assist target|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Attacks the assist leader's target."], 1, 1, 1) end) LichborneRogueMenu.treeDpsAssistBtn = treeDpsAssistBtn local treeDpsAoeBtn = MakeTreeBtn(assistHdrX + 60, assistIconY, "Interface\\Icons\\Spell_Shadow_RainOfFire", function() - GameTooltip:SetText("|cffffcc00DPS AoE|r |cff999999- |r|cffFFF569aoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Cross-role AoE mode|r", 1, 1, 1) - GameTooltip:AddLine("Switches to |cffffcc00AoE|r attacks on multiple targets.", 1, 1, 1) + GameTooltip:SetText(PBM_L["|cffffcc00DPS AoE|r |cff999999- |r|cffFFF569aoe|r |cffee4433CO|r"]) + GameTooltip:AddLine(PBM_L["|cffffcc00Cross-role AoE mode|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Switches to |cffffcc00AoE|r attacks on multiple targets."], 1, 1, 1) end) LichborneRogueMenu.treeDpsAoeBtn = treeDpsAoeBtn @@ -443,4 +443,4 @@ function PBM.OpenRogueMenu(row) HideAllRogue(); return end PBM.ShowCharSheet(LichborneRogueMenu, LichborneRogueCatcher, row, ROGUE_LEFT_EXT) -end +end \ No newline at end of file diff --git a/PBM/PBM_Shaman.lua b/PBM/PBM_Shaman.lua index 2aa2ef9..a3c7726 100644 --- a/PBM/PBM_Shaman.lua +++ b/PBM/PBM_Shaman.lua @@ -18,12 +18,12 @@ end -- Talent spec templates for the Set Talents menu local SHAMAN_TALENT_SPECS = { - { label="Elemental |cffffcc00PvE|r", spec="ele pve", wowSpec="Elemental", icon="Interface\\Icons\\Spell_Nature_Lightning" }, - { label="Enhancement |cffffcc00PvE|r", spec="enh pve", wowSpec="Enhancement", icon="Interface\\Icons\\Spell_Nature_LightningShield" }, - { label="Restoration |cffffcc00PvE|r", spec="resto pve", wowSpec="Restoration Shaman", icon="Interface\\Icons\\Spell_Nature_MagicImmunity" }, - { label="Elemental |cffff4444PvP|r", spec="ele pvp", wowSpec="Elemental", icon="Interface\\Icons\\Spell_Nature_Lightning" }, - { label="Enhancement |cffff4444PvP|r", spec="enh pvp", wowSpec="Enhancement", icon="Interface\\Icons\\Spell_Nature_LightningShield" }, - { label="Restoration |cffff4444PvP|r", spec="resto pvp", wowSpec="Restoration Shaman", icon="Interface\\Icons\\Spell_Nature_MagicImmunity" }, + { label=PBM_L["Elemental |cffffcc00PvE|r"], spec="ele pve", wowSpec="Elemental", icon="Interface\\Icons\\Spell_Nature_Lightning" }, + { label=PBM_L["Enhancement |cffffcc00PvE|r"], spec="enh pve", wowSpec="Enhancement", icon="Interface\\Icons\\Spell_Nature_LightningShield" }, + { label=PBM_L["Restoration |cffffcc00PvE|r"], spec="resto pve", wowSpec="Restoration Shaman", icon="Interface\\Icons\\Spell_Nature_MagicImmunity" }, + { label=PBM_L["Elemental |cffff4444PvP|r"], spec="ele pvp", wowSpec="Elemental", icon="Interface\\Icons\\Spell_Nature_Lightning" }, + { label=PBM_L["Enhancement |cffff4444PvP|r"], spec="enh pvp", wowSpec="Enhancement", icon="Interface\\Icons\\Spell_Nature_LightningShield" }, + { label=PBM_L["Restoration |cffff4444PvP|r"], spec="resto pvp", wowSpec="Restoration Shaman", icon="Interface\\Icons\\Spell_Nature_MagicImmunity" }, } -- ───────────────────────────────────────────────────────────────────────────── @@ -156,37 +156,37 @@ function PBM.OpenShamanMenu(row) local assIconY = assBoxY - 18 - 4 -- row 3 icons -- ── Row 1: Spec columns ───────────────────────────────────── - MakeSpecBox(col1X, specBoxY, SPEC_COL_W, "Elemental", + MakeSpecBox(col1X, specBoxY, SPEC_COL_W, PBM_L["Elemental"], "Interface\\Icons\\Spell_Nature_Lightning") - MakeSpecBox(col2X, specBoxY, SPEC_COL_W, "Enhancement", + MakeSpecBox(col2X, specBoxY, SPEC_COL_W, PBM_L["Enhancement"], "Interface\\Icons\\Spell_Nature_LightningShield") - MakeSpecBox(col3X, specBoxY, SPEC_COL_W, "Restoration", + MakeSpecBox(col3X, specBoxY, SPEC_COL_W, PBM_L["Restoration"], "Interface\\Icons\\Spell_Nature_MagicImmunity") local treeEleBtn = MakeTreeBtn(col1X + ICON_OFF, specIconY, "Interface\\Icons\\Spell_Nature_Lightning", function() - GameTooltip:SetText("|cffffcc00Elemental|r |cff999999- |r|cff0070DEelemental|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Elemental caster DPS|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Enhancement, Restoration.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Elemental"] .. "|r |cff999999- |r|cff0070DEelemental|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Elemental caster DPS"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Enhancement, Restoration."] .. "|r", 1, 1, 1) end) LichborneShamanMenu.treeEleBtn = treeEleBtn local treeEnhBtn = MakeTreeBtn(col2X + ICON_OFF, specIconY, "Interface\\Icons\\Spell_Nature_LightningShield", function() - GameTooltip:SetText("|cffffcc00Enhancement|r |cff999999- |r|cff0070DEenhancement|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Enhancement melee DPS|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Elemental, Restoration.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Enhancement"] .. "|r |cff999999- |r|cff0070DEenhancement|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Enhancement melee DPS"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Elemental, Restoration."] .. "|r", 1, 1, 1) end) LichborneShamanMenu.treeEnhBtn = treeEnhBtn local treeRestoBtn = MakeTreeBtn(col3X + ICON_OFF, specIconY, "Interface\\Icons\\Spell_Nature_MagicImmunity", function() - GameTooltip:SetText("|cffffcc00Restoration|r |cff999999- |r|cff0070DErestoration|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Restoration healing specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Elemental, Enhancement.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Restoration"] .. "|r |cff999999- |r|cff0070DErestoration|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Restoration healing specialization"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Elemental, Enhancement."] .. "|r", 1, 1, 1) end) LichborneShamanMenu.treeRestoBtn = treeRestoBtn @@ -195,14 +195,14 @@ function PBM.OpenShamanMenu(row) local aoeHdrX = TREE_X + math.floor((TREE_TOTAL_W - pairW) / 2) -- TREE_X + 44 local hdpsHdrX = aoeHdrX + SPEC_COL_W + SPEC_COL_GAP -- aoeHdrX + 88 - MakeWideBox(aoeHdrX, subBoxY, SPEC_COL_W, "AoE") - MakeWideBox(hdpsHdrX, subBoxY, SPEC_COL_W, "Healer DPS") + MakeWideBox(aoeHdrX, subBoxY, SPEC_COL_W, PBM_L["AoE"]) + MakeWideBox(hdpsHdrX, subBoxY, SPEC_COL_W, PBM_L["Healer DPS"]) local treeAoeBtn = MakeTreeBtn(aoeHdrX + math.floor((SPEC_COL_W - EXT_ICON_SIZE) / 2), subIconY, "Interface\\Icons\\Spell_Frost_IceStorm", function() - GameTooltip:SetText("|cffffcc00AoE|r |cff999999- |r|cff0070DEaoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00AoE rotation|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["AoE"] .. "|r |cff999999- |r|cff0070DEaoe|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["AoE rotation"] .. "|r", 1, 1, 1) end) LichborneShamanMenu.treeAoeBtn = treeAoeBtn @@ -210,8 +210,8 @@ function PBM.OpenShamanMenu(row) local treeHealerDpsBtn = MakeTreeBtn(hdpsHdrX + math.floor((SPEC_COL_W - EXT_ICON_SIZE) / 2), subIconY, "Interface\\Icons\\INV_Alchemy_Elixir_02", function() - GameTooltip:SetText("|cffffcc00Healer DPS|r |cff999999- |r|cffffcc00healer dps|r |cffff8000CO|r") - GameTooltip:AddLine("|cffffcc00Healer that fills with DPS|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Healer DPS"] .. "|r |cff999999- |r|cffffcc00healer dps|r |cffff8000CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Healer that fills with DPS"] .. "|r", 1, 1, 1) end) LichborneShamanMenu.treeHealerDpsBtn = treeHealerDpsBtn @@ -219,7 +219,7 @@ function PBM.OpenShamanMenu(row) local ASS_TOTAL_W = 3 * EXT_ICON_SIZE -- 78px, no gaps local assHdrX = TREE_X + math.floor((TREE_TOTAL_W - ASS_TOTAL_W) / 2) - MakeWideBox(assHdrX, assBoxY, ASS_TOTAL_W, "Assist") + MakeWideBox(assHdrX, assBoxY, ASS_TOTAL_W, PBM_L["Assist"]) local function assX(idx) return assHdrX + idx * EXT_ICON_SIZE @@ -228,27 +228,27 @@ function PBM.OpenShamanMenu(row) local treeTankAssistBtn = MakeTreeBtn(assX(0), assIconY, "Interface\\Icons\\inv_shield_02", function() - GameTooltip:SetText("|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Tank target focus|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks whatever the main tank is targeting.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Tank Assist"] .. "|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Tank target focus"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks whatever the main tank is targeting."], 1, 1, 1) end) LichborneShamanMenu.treeTankAssistBtn = treeTankAssistBtn local treeDpsAssistBtn = MakeTreeBtn(assX(1), assIconY, "Interface\\Icons\\Ability_Warrior_Challange", function() - GameTooltip:SetText("|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Assists the main assist target|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks the group DPS focus target.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["DPS Assist"] .. "|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Assists the main assist target"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks the group DPS focus target."], 1, 1, 1) end) LichborneShamanMenu.treeDpsAssistBtn = treeDpsAssistBtn local treeDpsAoeBtn = MakeTreeBtn(assX(2), assIconY, "Interface\\Icons\\Spell_Shadow_RainOfFire", function() - GameTooltip:SetText("|cffffcc00DPS AoE|r |cff999999- |r|cff0070DEaoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Cross-role AoE mode|r", 1, 1, 1) - GameTooltip:AddLine("Switches to AoE rotation on multiple targets.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["DPS AoE"] .. "|r |cff999999- |r|cff0070DEaoe|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Cross-role AoE mode"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Switches to AoE rotation on multiple targets."], 1, 1, 1) end) LichborneShamanMenu.treeDpsAoeBtn = treeDpsAoeBtn @@ -269,7 +269,7 @@ function PBM.OpenShamanMenu(row) cureSideHdrLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") cureSideHdrLabel:SetTextColor(0.78, 0.61, 0.23, 1) cureSideHdrLabel:SetAllPoints(); cureSideHdrLabel:SetJustifyH("CENTER") - cureSideHdrLabel:SetText("Cure") + cureSideHdrLabel:SetText(PBM_L["Cure"]) local treeCureBtn = CreateFrame("Button", nil, LichborneShamanMenu) treeCureBtn:SetSize(EXT_ICON_SIZE, EXT_ICON_SIZE) @@ -284,9 +284,9 @@ function PBM.OpenShamanMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneShamanMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00Cure|r |cff999999- |r|cffd4af37cure|r |cffff8000CO|r") - GameTooltip:AddLine("|cffffcc00Cure debuffs on group members|r", 1, 1, 1) - GameTooltip:AddLine("Cleanses poison, disease, and curses.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Cure"] .. "|r |cff999999- |r|cffd4af37cure|r |cffff8000CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Cure debuffs on group members"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Cleanses poison, disease, and curses."], 1, 1, 1) GameTooltip:Show() end) treeCureBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -472,4 +472,4 @@ function PBM.OpenShamanMenu(row) HideAllShaman(); return end PBM.ShowCharSheet(LichborneShamanMenu, LichborneShamanCatcher, row, SHAMAN_LEFT_EXT) -end +end \ No newline at end of file diff --git a/PBM/PBM_Sort.lua b/PBM/PBM_Sort.lua index 64a3f12..b8e7cff 100644 --- a/PBM/PBM_Sort.lua +++ b/PBM/PBM_Sort.lua @@ -196,14 +196,14 @@ function PBM.UpdateInviteButtons() LichborneInviteRaidBtn:Show() LichborneInviteRaidBtn:SetBackdropColor(0.30, 0.15, 0.01, 1) if LichborneInviteRaidBtn.lbl then - LichborneInviteRaidBtn.lbl:SetText("|cffd4af37Invite Raid|r") + LichborneInviteRaidBtn.lbl:SetText("|cffd4af37" .. PBM_L["Invite Raid"] .. "|r") end end if _G["LichborneInviteGroupBtn"] then local grpBtn = _G["LichborneInviteGroupBtn"] grpBtn:Show() grpBtn:SetBackdropColor(0.035, 0.14, 0.245, 1) - if grpBtn.lbl then grpBtn.lbl:SetText("|cffd4af37Invite Group|r") end + if grpBtn.lbl then grpBtn.lbl:SetText("|cffd4af37" .. PBM_L["Invite Group"] .. "|r") end end -- Stop Invite overlay: covers both invite buttons when an invite is active if _G["LichborneStopInviteBtn"] then @@ -456,7 +456,7 @@ function PBM.MakeSortDropdown(parent, fl, onSelect) btn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local lbl = btn:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") lbl:SetAllPoints(btn); lbl:SetJustifyH("CENTER"); lbl:SetJustifyV("MIDDLE") - lbl:SetText(PBM.SORT_GOLD.."Sort v|r") + lbl:SetText(PBM.SORT_GOLD..PBM_L["Sort v"].."|r") local menu = CreateFrame("Frame", nil, UIParent) menu:SetFrameStrata("TOOLTIP"); menu:SetSize(150, #PBM.SORT_OPTS*22+8) @@ -493,4 +493,4 @@ function PBM.MakeSortDropdown(parent, fl, onSelect) btn._menu = menu return btn -end +end \ No newline at end of file diff --git a/PBM/PBM_Spec.lua b/PBM/PBM_Spec.lua index 5db3786..c06696f 100644 --- a/PBM/PBM_Spec.lua +++ b/PBM/PBM_Spec.lua @@ -26,7 +26,7 @@ local function CalcSpec() PBM.DBG("CalcSpec start: |cffffff88"..(rowData.name or "?").."|r cls=|cffffff88"..cls.."|r unit=|cffffff88"..(PBM.State.LichborneInspectUnit or "?").."|r UnitExists=|cffffff88"..tostring(UnitExists(PBM.State.LichborneInspectUnit or "target")).."|r") local specStartTime = GetTime() if not specNames then - LichborneOutput("|cffC69B3APBM:|r Unknown class: "..cls, 1, 0.5, 0.5) + LichborneOutput("|cffC69B3APBM:|r " .. PBM_L["Unknown class: "] .. cls, 1, 0.5, 0.5) PBM.State.LichborneSpecTarget = nil; PBM.State.specRetries = 0 return end @@ -80,9 +80,9 @@ local function CalcSpec() PBM.DBG("|cffff4444Spec talent data = 0/0/0 for |r|cffffff88"..(rowData.name or "?").."|r — retry "..PBM.State.specRetries.."/"..maxSpecRetries) if PBM.State.specRetries >= maxSpecRetries then PBM.DBG("|cffff4444FAILED spec for |r|cffffff88"..(rowData.name or "?").."|r — all trees 0 after "..maxSpecRetries.." retries") - LichborneOutput("|cffff4444"..(rowData.name or "?")..":|r |cffff4444FAILED — could not read talent data.|r", 1, 0.5, 0.5) + LichborneOutput("|cffff4444"..(rowData.name or "?").."|r" .. PBM_L[": FAILED — could not read talent data."], 1, 0.5, 0.5) if LichborneAddStatus then - LichborneAddStatus:SetText("|cffff4444Talent data unavailable. Try standing closer.|r") + LichborneAddStatus:SetText("|cffff4444" .. PBM_L["Talent data unavailable. Try standing closer."] .. "|r") end PBM.State.LichborneSpecTarget = nil; PBM.State.specRetries = 0 end @@ -98,9 +98,9 @@ local function CalcSpec() local c = PBM.CLASS_COLORS[cls] local hex = c and string.format("|cff%02x%02x%02x", math.floor(c.r*255), math.floor(c.g*255), math.floor(c.b*255)) or "|cffffffff" if LichborneAddStatus then - LichborneAddStatus:SetText(hex..(rowData.name or "?").."|r — Specialization: |cffffff00"..specName.."|r ("..bestPoints.." pts)") + LichborneAddStatus:SetText(hex..(rowData.name or "?").."|r" .. PBM_L[" — Specialization: "] .. "|cffffff00"..specName.."|r ("..bestPoints.. PBM_L[" pts)"]) end - LichborneOutput(hex..(rowData.name or "?").."|r: |cffffff00"..specName.."|r ("..bestPoints.." pts)", 1, 0.85, 0) + LichborneOutput(hex..(rowData.name or "?").."|r: |cffffff00"..specName.."|r ("..bestPoints.. PBM_L[" pts)"], 1, 0.85, 0) PBM.DBG("|cff44ff44SUCCESS|r spec |cffffff88"..(rowData.name or "?").."|r = |cffffff00"..specName.."|r tree"..best.." ("..bestPoints.." pts)") PBM.DBG("CalcSpec elapsed: |cffffff88"..string.format("%.3f", GetTime()-specStartTime).."s|r") @@ -131,4 +131,4 @@ specFrame:SetScript("OnEvent", function(_, event, guid) end PBM.State.specWait = 0 CalcSpec() -end) +end) \ No newline at end of file diff --git a/PBM/PBM_StratList.lua b/PBM/PBM_StratList.lua index 5c7894f..eb58e37 100644 --- a/PBM/PBM_StratList.lua +++ b/PBM/PBM_StratList.lua @@ -11,16 +11,16 @@ PBM = PBM or {} -- ── Class colour hex strings ───────────────────────────────────── PBM.CLASS_COLOR_HEX = { - ["Death Knight"] = "C41F3B", - ["Druid"] = "FF7D0A", - ["Hunter"] = "ABD473", - ["Mage"] = "40C7EB", - ["Paladin"] = "F58CBA", - ["Priest"] = "FFFFFF", - ["Rogue"] = "FFF569", - ["Shaman"] = "0070DE", - ["Warlock"] = "8787ED", - ["Warrior"] = "C79C6E", + [PBM_L["Death Knight"]] = "C41F3B", + [PBM_L["Druid"]] = "FF7D0A", + [PBM_L["Hunter"]] = "ABD473", + [PBM_L["Mage"]] = "40C7EB", + [PBM_L["Paladin"]] = "F58CBA", + [PBM_L["Priest"]] = "FFFFFF", + [PBM_L["Rogue"]] = "FFF569", + [PBM_L["Shaman"]] = "0070DE", + [PBM_L["Warlock"]] = "8787ED", + [PBM_L["Warrior"]] = "C79C6E", } -- ── Label / name colours by tier ───────────────────────────────── @@ -54,7 +54,7 @@ local UNIVERSAL_GREY = { PBM.CLASS_STRAT_LIST = { -- ── Warrior ───────────────────────────────────────────────── - ["Warrior"] = { + [PBM_L["Warrior"]] = { {n="tank", lab="CO", t=1}, {n="arms", lab="CO", t=1}, {n="fury", lab="CO", t=1}, @@ -89,7 +89,7 @@ PBM.CLASS_STRAT_LIST = { }, -- ── Paladin ────────────────────────────────────────────────── - ["Paladin"] = { + [PBM_L["Paladin"]] = { {n="tank", lab="CO", t=1}, {n="dps", lab="CO", t=1}, {n="heal", lab="CO", t=1}, @@ -140,7 +140,7 @@ PBM.CLASS_STRAT_LIST = { }, -- ── Hunter ─────────────────────────────────────────────────── - ["Hunter"] = { + [PBM_L["Hunter"]] = { {n="bm", lab="CO", t=1}, {n="mm", lab="CO", t=1}, {n="surv", lab="CO", t=1}, @@ -180,7 +180,7 @@ PBM.CLASS_STRAT_LIST = { }, -- ── Rogue ──────────────────────────────────────────────────── - ["Rogue"] = { + [PBM_L["Rogue"]] = { {n="dps", lab="CO", t=1}, {n="melee", lab="CO", t=1}, {n="aoe", lab="CO", t=1}, @@ -216,7 +216,7 @@ PBM.CLASS_STRAT_LIST = { }, -- ── Priest ─────────────────────────────────────────────────── - ["Priest"] = { + [PBM_L["Priest"]] = { {n="holy heal", lab="CO", t=1}, {n="heal", lab="CO", t=1}, {n="shadow", lab="CO", t=1}, @@ -257,7 +257,7 @@ PBM.CLASS_STRAT_LIST = { }, -- ── Shaman ─────────────────────────────────────────────────── - ["Shaman"] = { + [PBM_L["Shaman"]] = { {n="ele", lab="CO", t=1}, {n="enh", lab="CO", t=1}, {n="resto", lab="CO", t=1}, @@ -314,7 +314,7 @@ PBM.CLASS_STRAT_LIST = { }, -- ── Mage ───────────────────────────────────────────────────── - ["Mage"] = { + [PBM_L["Mage"]] = { {n="frost", lab="CO", t=1}, {n="fire", lab="CO", t=1}, {n="arcane", lab="CO", t=1}, @@ -354,7 +354,7 @@ PBM.CLASS_STRAT_LIST = { }, -- ── Warlock ────────────────────────────────────────────────── - ["Warlock"] = { + [PBM_L["Warlock"]] = { {n="affli", lab="CO", t=1}, {n="demo", lab="CO", t=1}, {n="destro", lab="CO", t=1}, @@ -408,7 +408,7 @@ PBM.CLASS_STRAT_LIST = { }, -- ── Druid ──────────────────────────────────────────────────── - ["Druid"] = { + [PBM_L["Druid"]] = { {n="bear", lab="CO", t=1}, {n="cat", lab="CO", t=1}, {n="balance", lab="CO", t=1}, @@ -454,7 +454,7 @@ PBM.CLASS_STRAT_LIST = { }, -- ── Death Knight ───────────────────────────────────────────── - ["Death Knight"] = { + [PBM_L["Death Knight"]] = { {n="blood", lab="CO", t=1}, {n="frost", lab="CO", t=1}, {n="unholy", lab="CO", t=1}, @@ -538,9 +538,9 @@ function PBM.InstallTieredStratDisplay(menuFrame, cls) } -- Canonical key → full display name shown in the strategy list local STRAT_DISPLAY = { - ["ele"] = "Elemental", - ["enh"] = "Enhancement", - ["resto"] = "resto", + ["ele"] = PBM_L["Elemental"], + ["enh"] = PBM_L["Enhancement"], + ["resto"] = PBM_L["Restoration"], } local CLASS_FILTER = {} @@ -599,7 +599,12 @@ function PBM.InstallTieredStratDisplay(menuFrame, cls) if lname == "pvp" then nameHex = LAB_RED elseif lname == "heal" or lname == "resto" or lname == "healer dps" then - local healClasses = {Paladin=true, Druid=true, Priest=true, Shaman=true} + local healClasses = { + [PBM_L["Paladin"]] = true, + [PBM_L["Druid"]] = true, + [PBM_L["Priest"]] = true, + [PBM_L["Shaman"]] = true + } nameHex = healClasses[cls] and clsHex or LAB_GOLD else nameHex = clsHex @@ -647,4 +652,4 @@ function PBM.InstallTieredStratDisplay(menuFrame, cls) end menuFrame.clearStratDisplay = ClearStratDisplay -end +end \ No newline at end of file diff --git a/PBM/PBM_Tab_IndividualProgression.lua b/PBM/PBM_Tab_IndividualProgression.lua index 8492380..221c3a6 100644 --- a/PBM/PBM_Tab_IndividualProgression.lua +++ b/PBM/PBM_Tab_IndividualProgression.lua @@ -1,5 +1,7 @@ PBM = PBM or {} +local PBM_L = PBM_L or PBM.L + -- ── Individual Progression tab panel ───────────────────────────── -- Called from PBM_TopTabs.lua:BuildBottomTabs as: -- PBM.BuildIPProgressionPanel(panel, ctx) @@ -74,52 +76,52 @@ function PBM.BuildIPProgressionPanel(ipPanel, ctx) end -- Column 1: What is Individual Progression? - IPInfoTitle(INFO_COL1, INFO_TOP, "What is Individual Progression?", nil, false) + IPInfoTitle(INFO_COL1, INFO_TOP, PBM_L["What is Individual Progression?"], nil, false) IPInfoLine(INFO_COL1, INFO_TOP - INFO_STEP, - "Each character advances through") + PBM_L["Each character advances through"]) IPInfoLine(INFO_COL1, INFO_TOP - INFO_STEP * 2, - "WoW's raid tiers chronologically.") + PBM_L["WoW's raid tiers chronologically."]) IPInfoLine(INFO_COL1, INFO_TOP - INFO_STEP * 3, - "Content is |cff69CCF0gated|r \226\128\148 clear each") + PBM_L["Content is |cff69CCF0gated|r \226\128\148 clear each"]) IPInfoLine(INFO_COL1, INFO_TOP - INFO_STEP * 4, - "tier before the next one opens.") + PBM_L["tier before the next one opens."]) IPInfoLine(INFO_COL1, INFO_TOP - INFO_STEP * 5, - "|cffFF8C00Each tier unlocks new raids,|r") + PBM_L["|cffFF8C00Each tier unlocks new raids,|r"]) IPInfoLine(INFO_COL1, INFO_TOP - INFO_STEP * 6, - "|cffFF8C00and/or expansions.|r") + PBM_L["|cffFF8C00and/or expansions.|r"]) -- Column 2: How to Advance Your Tier - IPInfoTitle(INFO_COL2, INFO_TOP, "How to Advance Your Tier", nil, false) + IPInfoTitle(INFO_COL2, INFO_TOP, PBM_L["How to Advance Your Tier"], nil, false) IPInfoLine(INFO_COL2, INFO_TOP - INFO_STEP, - "|cffd4af371.|r Defeat the |cff69CCF0final boss|r or the") + PBM_L["|cffd4af371.|r Defeat the |cff69CCF0final boss|r or the"]) IPInfoLine(INFO_COL2, INFO_TOP - INFO_STEP * 2, - " |cff69CCF0final quest|r listed in the table.") + PBM_L[" |cff69CCF0final quest|r listed in the table."]) IPInfoLine(INFO_COL2, INFO_TOP - INFO_STEP * 3, - "|cffd4af372.|r Tier advances automatically on") + PBM_L["|cffd4af372.|r Tier advances automatically on"]) IPInfoLine(INFO_COL2, INFO_TOP - INFO_STEP * 4, - " final boss / quest completion.") + PBM_L[" final boss / quest completion."]) IPInfoLine(INFO_COL2, INFO_TOP - INFO_STEP * 5, - "|cffFF8C00Altbots follow their own progression tier.|r", nil, 8) + PBM_L["|cffFF8C00Altbots follow their own progression tier.|r"], nil, 8) IPInfoLine(INFO_COL2, INFO_TOP - INFO_STEP * 6, - "|cffFF8C00Rndbots follow the group leader's tier.|r", nil, 8) + PBM_L["|cffFF8C00Rndbots follow the group leader's tier.|r"], nil, 8) -- Column 3: Commands (7 rows → nudge the block up to keep it centered in the band) local CMD_TOP = INFO_TOP + 7 - IPInfoTitle(INFO_COL3, CMD_TOP, "Commands", INFO_W, false) + IPInfoTitle(INFO_COL3, CMD_TOP, PBM_L["Commands"], INFO_W, false) IPInfoLine(INFO_COL3, CMD_TOP - INFO_STEP, - "Check Tier: |cffd4af37.ip get /|r", INFO_W) + PBM_L["Check Tier: |cffd4af37.ip get /|r"], INFO_W) IPInfoLine(INFO_COL3, CMD_TOP - INFO_STEP * 2, - "Check PvP: |cffd4af37.ip pvp /|r", INFO_W) + PBM_L["Check PvP: |cffd4af37.ip pvp /|r"], INFO_W) IPInfoLine(INFO_COL3, CMD_TOP - INFO_STEP * 3, - "Sync Bots: |cffd4af37.ip setbot (Tier)|r", INFO_W) + PBM_L["Sync Bots: |cffd4af37.ip setbot (Tier)|r"], INFO_W) IPInfoLine(INFO_COL3, CMD_TOP - INFO_STEP * 4, - "Sync Bots: |cffd4af37.ip setrep (Reputation)|r", INFO_W) + PBM_L["Sync Bots: |cffd4af37.ip setrep (Reputation)|r"], INFO_W) IPInfoLine(INFO_COL3, CMD_TOP - INFO_STEP * 5, - "Attune: |cffd4af37.ip attune onyxia/blacktemple|r", INFO_W) + PBM_L["Attune: |cffd4af37.ip attune onyxia/blacktemple|r"], INFO_W) IPInfoLine(INFO_COL3, CMD_TOP - INFO_STEP * 6, - "|cffff4444GM (Required):|r |cffd4af37.ip set (Change tier)|r", INFO_W) + PBM_L["|cffff4444GM (Required):|r |cffd4af37.ip set (Change tier)|r"], INFO_W) IPInfoLine(INFO_COL3, CMD_TOP - INFO_STEP * 7, - "|cffff4444GM (Required):|r |cffd4af37.ip tele (Teleport)|r", INFO_W) + PBM_L["|cffff4444GM (Required):|r |cffd4af37.ip tele (Teleport)|r"], INFO_W) -- Column 4: Expansion Level Caps (no header, vertically centered) -- Each block: name line, indented Tier line, indented Level Cap line (11px steps) @@ -151,24 +153,24 @@ function PBM.BuildIPProgressionPanel(ipPanel, ctx) tierFS:SetPoint("TOPLEFT", ipPanel, "TOPLEFT", EXP_SUB_X, y - EXP_LINE) tierFS:SetWidth(190); tierFS:SetJustifyH("LEFT") tierFS:SetTextColor(0.82, 0.82, 0.82) - tierFS:SetText("Tiers: " .. tierCol .. tierRange .. "|r") + tierFS:SetText(PBM_L["Tiers: "] .. tierCol .. tierRange .. "|r") -- Level Cap line (indented) local capFS = ipPanel:CreateFontString(nil, "OVERLAY") capFS:SetFont(IP_FONT, 8, "OUTLINE") capFS:SetPoint("TOPLEFT", ipPanel, "TOPLEFT", EXP_SUB_X, y - EXP_LINE * 2) capFS:SetWidth(190); capFS:SetJustifyH("LEFT") capFS:SetTextColor(0.82, 0.82, 0.82) - capFS:SetText("Level Cap: |cffd4af37" .. capLvl .. "|r") + capFS:SetText(PBM_L["Level Cap: |cffd4af37"] .. capLvl .. "|r") end -- Center 3 blocks (82px) in the 127px space between gold lines local EXP_Y = INFO_TOP -- align with Commands header row ExpBadge(EXP_Y, - 0.55, 0.08, 0.08, "|cffFF7070", "Classic World of Warcraft", "T0 \226\128\147 T7", "60") + 0.55, 0.08, 0.08, "|cffFF7070", PBM_L["Classic World of Warcraft"], "T0 \226\128\147 T7", "60") ExpBadge(EXP_Y - EXP_GAP, - 0.05, 0.45, 0.10, "|cff66CC44", "The Burning Crusade", "T8 \226\128\147 T12", "70") + 0.05, 0.45, 0.10, "|cff66CC44", PBM_L["The Burning Crusade"], "T8 \226\128\147 T12", "70") ExpBadge(EXP_Y - EXP_GAP * 2, - 0.05, 0.18, 0.50, "|cff69CCF0", "Wrath of the Lich King", "T13 \226\128\147 T17","80") + 0.05, 0.18, 0.50, "|cff69CCF0", PBM_L["Wrath of the Lich King"], "T13 \226\128\147 T17","80") -- ── Tier table ─────────────────────────────────────────────── local TABLE_TOP = -162 @@ -197,70 +199,70 @@ function PBM.BuildIPProgressionPanel(ipPanel, ctx) fs:SetText(text) end - TblHdr(COL_TIER_X, tblHdrY, "Tier", COL_TIER_W, "CENTER") - TblHdr(COL_RAID_X, tblHdrY, "Raid / Event", COL_RAID_W) - TblHdr(COL_LEVEL_X, tblHdrY, "LvL", COL_LEVEL_W, "CENTER") - TblHdr(COL_FINAL_X, tblHdrY, "Final Boss / Quest", COL_FINAL_W) - TblHdr(COL_UNLOCK_X, tblHdrY, "Unlocks", COL_UNLOCK_W) + TblHdr(COL_TIER_X, tblHdrY, PBM_L["Tier"], COL_TIER_W, "CENTER") + TblHdr(COL_RAID_X, tblHdrY, PBM_L["Raid / Event"], COL_RAID_W) + TblHdr(COL_LEVEL_X, tblHdrY, PBM_L["LvL"], COL_LEVEL_W, "CENTER") + TblHdr(COL_FINAL_X, tblHdrY, PBM_L["Final Boss / Quest"], COL_FINAL_W) + TblHdr(COL_UNLOCK_X, tblHdrY, PBM_L["Unlocks"], COL_UNLOCK_W) -- ── Tier data ──────────────────────────────────────────────── -- { tierNum, raidName, levelCap, finalBoss, unlocks, tooltipText } -- In tooltipText: \n = line break. Boss/quest names wrapped in |cffFFD900...|r local TIER_DATA = { - { 0, "Starting Tier", 60, "Ragnaros & Onyxia", - "Default starting tier (no unlock required)", - "All players start at this tier by default. Level is capped to 60.\n \nTier 0 and Tier 1 are available simultaneously, as was the case for the original Vanilla release.\n \nFinal bosses: |cffFFD900Ragnaros|r and |cffFFD900Onyxia|r." }, - { 1, "Molten Core / Onyxia's Lair", 60, "Ragnaros & Onyxia", - "Default starting tier (no unlock required)", - "All players start at this tier by default. Level is capped to 60.\n \nTier 0 and Tier 1 are available simultaneously, as was the case for the original Vanilla release.\n \nFinal bosses: |cffFFD900Ragnaros|r and |cffFFD900Onyxia|r." }, - { 2, "Blackwing Lair", 60, "Nefarian", - "BWL access (Onyxia Scale Cloak required)", - "Blackwing Lair is now available. Players can enter without having defeated |cffFFD900Onyxia|r, but will not survive Shadowflame without the Onyxia Scale Cloak.\n \nThis tier has a natural RPG-style progression requirement.\n \nFinal boss: |cffFFD900Nefarian|r.\n \n|cffFF8C00Altbots and Rndbots do not require the Onyxia Scale Cloak. The effect is applied automatically.|r" }, - { 3, "Ahn'Qiraj War Effort", 60, "Bang a Gong!", - "AQ war effort unlocked; Zul'Gurub (optional) opens", - "This phase includes the Scarab Lord quest chain and the AQ war effort. Every player must complete each resource turn-in quest at least once.\n \nZul'Gurub becomes available during this tier.\n \nFinal quest: |cffFFD900Bang a Gong!|r\n \n|cffFF8C00Zul'Gurub is optional and can be configured to open at an earlier tier.|r" }, - { 4, "Ahn'Qiraj War", 60, "Chaos and Destruction", - "AQ20 and AQ40 become available", - "The AQ conflict is active and both AQ20 and AQ40 are accessible. Quest NPCs for AQ equipment are not available until after the war effort ends.\n \nFinal quest: |cffFFD900Chaos and Destruction|r.\n \n|cffFF8C00The Scarab Gate does not stay open during the war. AQ War enemies will block the gate when it is closed. Click the gong to re-open it. Once the war is fully completed, the gate stays open permanently.|r" }, - { 5, "Ahn'Qiraj", 60, "C'Thun", - "Catch-up gearing quests in Silithus", - "Completing AQ40 is required to advance to the next tier. Catch-up gearing quests and upgrades are available through AQ20.\n \nFinal boss: |cffFFD900C'Thun|r" }, - { 6, "Naxxramas 40", 60, "Kel'Thuzad", - "Scourge Invasion; Light's Hope attunement", - "The Light's Hope Chapel and its associated quests unlock, enabling the Naxxramas attunement. Once attuned, players can enter through the Naxxramas teleport in the Eastern Plaguelands.\n \nThe Scourge Invasion is also active during this tier.\n \nFinal boss: |cffFFD900Kel'Thuzad|r\n \n|cffFF8C00The crystal teleporter is located in the Eastern Plaguelands, inside the Ziggurat that hosts the Naxxramas meeting stone.|r" }, - { 7, "Pre-TBC", 60, "Into the Breach", - "Dark Portal defense scenario", - "A brief phase where enemies are emerging from the Dark Portal, requiring players to mount a defense.\n \nFinal quest: |cffFFD900Into the Breach|r" }, - { 8, "Karazhan / Gruul's Lair / Magtheridon's Lair", 70, "Prince Malchezaar", - "Dark Portal opens; level cap raised to 70", - "Players may enter the Dark Portal and level to 70.\n \nFinal boss: |cffFFD900Prince Malchezaar|r\n \n|cffFF8C00Attunements will be necessary to enter TBC raids, which will require completing TBC heroics.|r" }, - { 9, "Serpentshrine Cavern / Tempest Keep", 70, "Kael'thas Sunstrider", - "Hyjal Summit / Black Temple - Attunements required", - "Players complete attunements for the next tier of TBC raids, progressing through Serpentshrine Cavern and Tempest Keep.\n \nFinal boss: |cffFFD900Kael'thas Sunstrider|r" }, - { 10, "Hyjal Summit / Black Temple", 70, "Illidan Stormrage", - "Completing this tier unlocks Sunwell Plateau", - "Hyjal Summit and Black Temple are now accessible. Completing this tier unlocks Sunwell Plateau.\n \nFinal boss: |cffFFD900Illidan Stormrage|r\n \n|cffFF8C00You may enter Black Temple without fully completing Hyjal.|r" }, - { 11, "Zul'Aman (Optional)", 70, "Zul'jin", - "Optional \226\128\148 Ghostlands raid; can be configured earlier", - "An optional raid located in the Ghostlands.\n \nFinal boss: |cffFFD900Zul'jin|r\n \n|cffFF8C00Can be configured to open earlier; by default unlocks after Black Temple.|r" }, - { 12, "Sunwell Plateau", 70, "Kil'jaeden", - "Isle of Quel'Danas; final TBC raid content", - "The Isle of Quel'Danas unlocks, enabling its questlines and access to Sunwell Plateau.\n \nFinal boss: |cffFFD900Kil'jaeden|r\n \n|cffFF8C00Unlocks daily quests and areas as their reputation with the Shattered Sun Offensive increases.|r" }, - { 13, "Naxxramas / Eye of Eternity / Obsidian Sanctum", 80, "Kel'Thuzad (80)", - "Northrend opens; level cap raised to 80", - "Players enter Northrend and may level to 80. Three raids are available: Naxxramas, Eye of Eternity, and Obsidian Sanctum.\n \nFinal boss: |cffFFD900Kel'Thuzad|r (level 80)" }, - { 14, "Ulduar", 80, "Yogg-Saron", - "Ulduar access with associated quest chain", - "Players are now able to enter and complete Ulduar, along with its associated quest chain.\n \nFinal boss: |cffFFD900Yogg-Saron|r" }, - { 15, "Trial of the Crusader", 80, "Anub'arak", - "Argent Tournament and associated content", - "The Argent Tournament and all related content unlock alongside Trial of the Crusader.\n \nFinal boss: |cffFFD900Anub'arak|r" }, - { 16, "Icecrown Citadel", 80, "The Lich King", - "Final WotLK raid tier", - "Players can finally enter Icecrown Citadel and challenge the Lich King.\n \nFinal boss: |cffFFD900The Lich King|r" }, - { 17, "Ruby Sanctum", 80, "Halion", - "Bonus endgame content", - "Ruby Sanctum is the only content unlocked in this tier, considered bonus endgame content.\n \nFinal boss: |cffFFD900Halion|r" }, + { 0, PBM_L["Starting Tier"], 60, PBM_L["Ragnaros & Onyxia"], + PBM_L["Default starting tier (no unlock required)"], + PBM_L["All players start at this tier by default. Level is capped to 60.\n \nTier 0 and Tier 1 are available simultaneously, as was the case for the original Vanilla release.\n \nFinal bosses: |cffFFD900Ragnaros|r and |cffFFD900Onyxia|r."] }, + { 1, PBM_L["Molten Core / Onyxia's Lair"], 60, PBM_L["Ragnaros & Onyxia"], + PBM_L["Default starting tier (no unlock required)"], + PBM_L["All players start at this tier by default. Level is capped to 60.\n \nTier 0 and Tier 1 are available simultaneously, as was the case for the original Vanilla release.\n \nFinal bosses: |cffFFD900Ragnaros|r and |cffFFD900Onyxia|r."] }, + { 2, PBM_L["Blackwing Lair"], 60, PBM_L["Nefarian"], + PBM_L["BWL access (Onyxia Scale Cloak required)"], + PBM_L["Blackwing Lair is now available. Players can enter without having defeated |cffFFD900Onyxia|r, but will not survive Shadowflame without the Onyxia Scale Cloak.\n \nThis tier has a natural RPG-style progression requirement.\n \nFinal boss: |cffFFD900Nefarian|r.\n \n|cffFF8C00Altbots and Rndbots do not require the Onyxia Scale Cloak. The effect is applied automatically.|r"] }, + { 3, PBM_L["Ahn'Qiraj War Effort"], 60, PBM_L["Bang a Gong!"], + PBM_L["AQ war effort unlocked; Zul'Gurub (optional) opens"], + PBM_L["This phase includes the Scarab Lord quest chain and the AQ war effort. Every player must complete each resource turn-in quest at least once.\n \nZul'Gurub becomes available during this tier.\n \nFinal quest: |cffFFD900Bang a Gong!|r\n \n|cffFF8C00Zul'Gurub is optional and can be configured to open at an earlier tier.|r"] }, + { 4, PBM_L["Ahn'Qiraj War"], 60, PBM_L["Chaos and Destruction"], + PBM_L["AQ20 and AQ40 become available"], + PBM_L["The AQ conflict is active and both AQ20 and AQ40 are accessible. Quest NPCs for AQ equipment are not available until after the war effort ends.\n \nFinal quest: |cffFFD900Chaos and Destruction|r.\n \n|cffFF8C00The Scarab Gate does not stay open during the war. AQ War enemies will block the gate when it is closed. Click the gong to re-open it. Once the war is fully completed, the gate stays open permanently.|r"] }, + { 5, PBM_L["Ahn'Qiraj"], 60, PBM_L["C'Thun"], + PBM_L["Catch-up gearing quests in Silithus"], + PBM_L["Completing AQ40 is required to advance to the next tier. Catch-up gearing quests and upgrades are available through AQ20.\n \nFinal boss: |cffFFD900C'Thun|r"] }, + { 6, PBM_L["Naxxramas 40"], 60, PBM_L["Kel'Thuzad"], + PBM_L["Scourge Invasion; Light's Hope attunement"], + PBM_L["The Light's Hope Chapel and its associated quests unlock, enabling the Naxxramas attunement. Once attuned, players can enter through the Naxxramas teleport in the Eastern Plaguelands.\n \nThe Scourge Invasion is also active during this tier.\n \nFinal boss: |cffFFD900Kel'Thuzad|r\n \n|cffFF8C00The crystal teleporter is located in the Eastern Plaguelands, inside the Ziggurat that hosts the Naxxramas meeting stone.|r"] }, + { 7, PBM_L["Pre-TBC"], 60, PBM_L["Into the Breach"], + PBM_L["Dark Portal defense scenario"], + PBM_L["A brief phase where enemies are emerging from the Dark Portal, requiring players to mount a defense.\n \nFinal quest: |cffFFD900Into the Breach|r"] }, + { 8, PBM_L["Karazhan / Gruul's Lair / Magtheridon's Lair"], 70, PBM_L["Prince Malchezaar"], + PBM_L["Dark Portal opens; level cap raised to 70"], + PBM_L["Players may enter the Dark Portal and level to 70.\n \nFinal boss: |cffFFD900Prince Malchezaar|r\n \n|cffFF8C00Attunements will be necessary to enter TBC raids, which will require completing TBC heroics.|r"] }, + { 9, PBM_L["Serpentshrine Cavern / Tempest Keep"], 70, PBM_L["Kael'thas Sunstrider"], + PBM_L["Hyjal Summit / Black Temple - Attunements required"], + PBM_L["Players complete attunements for the next tier of TBC raids, progressing through Serpentshrine Cavern and Tempest Keep.\n \nFinal boss: |cffFFD900Kael'thas Sunstrider|r"] }, + { 10, PBM_L["Hyjal Summit / Black Temple"], 70, PBM_L["Illidan Stormrage"], + PBM_L["Completing this tier unlocks Sunwell Plateau"], + PBM_L["Hyjal Summit and Black Temple are now accessible. Completing this tier unlocks Sunwell Plateau.\n \nFinal boss: |cffFFD900Illidan Stormrage|r\n \n|cffFF8C00You may enter Black Temple without fully completing Hyjal.|r"] }, + { 11, PBM_L["Zul'Aman (Optional)"], 70, PBM_L["Zul'jin"], + PBM_L["Optional \226\128\148 Ghostlands raid; can be configured earlier"], + PBM_L["An optional raid located in the Ghostlands.\n \nFinal boss: |cffFFD900Zul'jin|r\n \n|cffFF8C00Can be configured to open earlier; by default unlocks after Black Temple.|r"] }, + { 12, PBM_L["Sunwell Plateau"], 70, PBM_L["Kil'jaeden"], + PBM_L["Isle of Quel'Danas; final TBC raid content"], + PBM_L["The Isle of Quel'Danas unlocks, enabling its questlines and access to Sunwell Plateau.\n \nFinal boss: |cffFFD900Kil'jaeden|r\n \n|cffFF8C00Unlocks daily quests and areas as their reputation with the Shattered Sun Offensive increases.|r"] }, + { 13, PBM_L["Naxxramas / Eye of Eternity / Obsidian Sanctum"], 80, PBM_L["Kel'Thuzad (80)"], + PBM_L["Northrend opens; level cap raised to 80"], + PBM_L["Players enter Northrend and may level to 80. Three raids are available: Naxxramas, Eye of Eternity, and Obsidian Sanctum.\n \nFinal boss: |cffFFD900Kel'Thuzad|r (level 80)"] }, + { 14, PBM_L["Ulduar"], 80, PBM_L["Yogg-Saron"], + PBM_L["Ulduar access with associated quest chain"], + PBM_L["Players are now able to enter and complete Ulduar, along with its associated quest chain.\n \nFinal boss: |cffFFD900Yogg-Saron|r"] }, + { 15, PBM_L["Trial of the Crusader"], 80, PBM_L["Anub'arak"], + PBM_L["Argent Tournament and associated content"], + PBM_L["The Argent Tournament and all related content unlock alongside Trial of the Crusader.\n \nFinal boss: |cffFFD900Anub'arak|r"] }, + { 16, PBM_L["Icecrown Citadel"], 80, PBM_L["The Lich King"], + PBM_L["Final WotLK raid tier"], + PBM_L["Players can finally enter Icecrown Citadel and challenge the Lich King.\n \nFinal boss: |cffFFD900The Lich King|r"] }, + { 17, PBM_L["Ruby Sanctum"], 80, PBM_L["Halion"], + PBM_L["Bonus endgame content"], + PBM_L["Ruby Sanctum is the only content unlocked in this tier, considered bonus endgame content.\n \nFinal boss: |cffFFD900Halion|r"] }, } local ROW_H = 22 @@ -289,27 +291,27 @@ function PBM.BuildIPProgressionPanel(ipPanel, ctx) -- Expansion section dividers if tierNum == 0 then curY = curY - 10 -- room for "CLASSIC" text above the line - ExpDivider(curY, 0.85, 0.18, 0.18, "CLASSIC") + ExpDivider(curY, 0.85, 0.18, 0.18, PBM_L["CLASSIC"]) curY = curY - 6 -- gap below line before first row elseif tierNum == 8 then curY = curY - 8 -- gap from T7 - TblHdr(COL_TIER_X, curY, "Tier", COL_TIER_W, "CENTER") - TblHdr(COL_RAID_X, curY, "Raid / Event", COL_RAID_W) - TblHdr(COL_LEVEL_X, curY, "LvL", COL_LEVEL_W, "CENTER") - TblHdr(COL_FINAL_X, curY, "Final Boss / Quest", COL_FINAL_W) - TblHdr(COL_UNLOCK_X, curY, "Unlocks", COL_UNLOCK_W) + TblHdr(COL_TIER_X, curY, PBM_L["Tier"], COL_TIER_W, "CENTER") + TblHdr(COL_RAID_X, curY, PBM_L["Raid / Event"], COL_RAID_W) + TblHdr(COL_LEVEL_X, curY, PBM_L["LvL"], COL_LEVEL_W, "CENTER") + TblHdr(COL_FINAL_X, curY, PBM_L["Final Boss / Quest"], COL_FINAL_W) + TblHdr(COL_UNLOCK_X, curY, PBM_L["Unlocks"], COL_UNLOCK_W) curY = curY - 14 -- room for expansion label above line - ExpDivider(curY, 0.12, 0.68, 0.20, "THE BURNING CRUSADE") + ExpDivider(curY, 0.12, 0.68, 0.20, PBM_L["THE BURNING CRUSADE"]) curY = curY - 6 elseif tierNum == 13 then curY = curY - 8 -- gap from T12 - TblHdr(COL_TIER_X, curY, "Tier", COL_TIER_W, "CENTER") - TblHdr(COL_RAID_X, curY, "Raid / Event", COL_RAID_W) - TblHdr(COL_LEVEL_X, curY, "LvL", COL_LEVEL_W, "CENTER") - TblHdr(COL_FINAL_X, curY, "Final Boss / Quest", COL_FINAL_W) - TblHdr(COL_UNLOCK_X, curY, "Unlocks", COL_UNLOCK_W) + TblHdr(COL_TIER_X, curY, PBM_L["Tier"], COL_TIER_W, "CENTER") + TblHdr(COL_RAID_X, curY, PBM_L["Raid / Event"], COL_RAID_W) + TblHdr(COL_LEVEL_X, curY, PBM_L["LvL"], COL_LEVEL_W, "CENTER") + TblHdr(COL_FINAL_X, curY, PBM_L["Final Boss / Quest"], COL_FINAL_W) + TblHdr(COL_UNLOCK_X, curY, PBM_L["Unlocks"], COL_UNLOCK_W) curY = curY - 14 -- room for expansion label above line - ExpDivider(curY, 0.20, 0.50, 0.95, "WRATH OF THE LICH KING") + ExpDivider(curY, 0.20, 0.50, 0.95, PBM_L["WRATH OF THE LICH KING"]) curY = curY - 6 end @@ -417,13 +419,12 @@ function PBM.BuildIPProgressionPanel(ipPanel, ctx) footerFS:SetPoint("BOTTOMRIGHT", ipPanel, "BOTTOMRIGHT", -MARGIN, 6) footerFS:SetJustifyH("CENTER") footerFS:SetTextColor(0.72, 0.72, 0.72) - footerFS:SetText("** This tab requires |cffd4af37mod-individual-progression|r." .. - " Source: |cff69CCF0github.com/ZhengPeiRu21/mod-individual-progression|r") + footerFS:SetText(PBM_L["** This tab requires |cffd4af37mod-individual-progression|r. Source: |cff69CCF0github.com/ZhengPeiRu21/mod-individual-progression|r"]) local footerFS2 = ipPanel:CreateFontString(nil, "OVERLAY") footerFS2:SetFont(IP_FONT, 9, "OUTLINE") footerFS2:SetPoint("BOTTOMLEFT", ipPanel, "BOTTOMLEFT", MARGIN, 20) footerFS2:SetPoint("BOTTOMRIGHT", ipPanel, "BOTTOMRIGHT", -MARGIN, 20) footerFS2:SetJustifyH("CENTER") - footerFS2:SetText("|cffff4444** Information is subject to change as mod-individual-progression is updated.|r") -end + footerFS2:SetText(PBM_L["|cffff4444** Information is subject to change as mod-individual-progression is updated.|r"]) +end \ No newline at end of file diff --git a/PBM/PBM_Tab_LevelSync.lua b/PBM/PBM_Tab_LevelSync.lua index a5d4924..b6f0bcd 100644 --- a/PBM/PBM_Tab_LevelSync.lua +++ b/PBM/PBM_Tab_LevelSync.lua @@ -67,7 +67,7 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) -- ── Command sender ───────────────────────────────────────── local function lsSendCmd(cmd) if InCombatLockdown() then - LichborneOutput("|cffC69B3APBM:|r Cannot send commands while in combat.") + LichborneOutput("|cffC69B3APBM:|r " .. (PBM_L["Cannot send commands while in combat."] or "Cannot send commands while in combat.")) return end local box = ChatFrame1EditBox @@ -232,7 +232,7 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) hdrFS:SetPoint("TOPLEFT", cell, "TOPLEFT", 2, -3) hdrFS:SetWidth(LS_CELL_W - 4); hdrFS:SetJustifyH("CENTER") hdrFS:SetTextColor(LT_GOLD_R, LT_GOLD_G, LT_GOLD_B) - hdrFS:SetText("— empty —") + hdrFS:SetText(PBM_L["— empty —"]) local acctSep = cell:CreateTexture(nil, "ARTWORK") acctSep:SetHeight(1) @@ -248,8 +248,8 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) fs:SetTextColor(LT_GOLD_R, LT_GOLD_G, LT_GOLD_B) fs:SetText(text) end - ColHdr("Character", LS_NAM_X, LS_NAM_W) - ColHdr("Tier", LS_TIR_X, LS_TIR_W) + ColHdr(PBM_L["Character"], LS_NAM_X, LS_NAM_W) + ColHdr(PBM_L["Tier"], LS_TIR_X, LS_TIR_W) local hdrSep = cell:CreateTexture(nil, "ARTWORK") hdrSep:SetHeight(1) @@ -334,7 +334,7 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) lsRefreshBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") local lsRefLbl = lsRefreshBtn:CreateFontString(nil, "OVERLAY") lsRefLbl:SetFont(LT_FONT, 10, "OUTLINE"); lsRefLbl:SetAllPoints(lsRefreshBtn) - lsRefLbl:SetJustifyH("CENTER"); lsRefLbl:SetText("|cffd4af37Refresh|r") + lsRefLbl:SetJustifyH("CENTER"); lsRefLbl:SetText("|cffd4af37" .. PBM_L["Refresh"] .. "|r") lsRefreshBtn:SetScript("OnEnter", function(self) self:SetBackdropBorderColor(1, 0.95, 0.5, 1) end) @@ -347,25 +347,25 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) lsAccountsFS:SetFont(LT_FONT, 10, "OUTLINE") lsAccountsFS:SetPoint("TOPLEFT", lsPanel, "TOPLEFT", 192, lsStatY) lsAccountsFS:SetWidth(130); lsAccountsFS:SetJustifyH("CENTER") - lsAccountsFS:SetTextColor(0.70, 0.75, 0.85); lsAccountsFS:SetText("Accounts: —") + lsAccountsFS:SetTextColor(0.70, 0.75, 0.85); lsAccountsFS:SetText(PBM_L["Accounts: —"]) local lsTotalCharsFS = lsPanel:CreateFontString(nil, "OVERLAY") lsTotalCharsFS:SetFont(LT_FONT, 10, "OUTLINE") lsTotalCharsFS:SetPoint("TOPLEFT", lsPanel, "TOPLEFT", 409, lsStatY) lsTotalCharsFS:SetWidth(130); lsTotalCharsFS:SetJustifyH("CENTER") - lsTotalCharsFS:SetTextColor(0.70, 0.75, 0.85); lsTotalCharsFS:SetText("Characters: —") + lsTotalCharsFS:SetTextColor(0.70, 0.75, 0.85); lsTotalCharsFS:SetText(PBM_L["Characters: —"]) local lsLevelSyncFS = lsPanel:CreateFontString(nil, "OVERLAY") lsLevelSyncFS:SetFont(LT_FONT, 10, "OUTLINE") lsLevelSyncFS:SetPoint("TOPLEFT", lsPanel, "TOPLEFT", 626, lsStatY) lsLevelSyncFS:SetWidth(130); lsLevelSyncFS:SetJustifyH("CENTER") - lsLevelSyncFS:SetTextColor(0.70, 0.75, 0.85); lsLevelSyncFS:SetText("Level Sync: —") + lsLevelSyncFS:SetTextColor(0.70, 0.75, 0.85); lsLevelSyncFS:SetText(PBM_L["Level Sync: —"]) local lsIpSyncFS = lsPanel:CreateFontString(nil, "OVERLAY") lsIpSyncFS:SetFont(LT_FONT, 10, "OUTLINE") lsIpSyncFS:SetPoint("TOPLEFT", lsPanel, "TOPLEFT", 843, lsStatY) lsIpSyncFS:SetWidth(130); lsIpSyncFS:SetJustifyH("CENTER") - lsIpSyncFS:SetTextColor(0.70, 0.75, 0.85); lsIpSyncFS:SetText("IP Sync: —") + lsIpSyncFS:SetTextColor(0.70, 0.75, 0.85); lsIpSyncFS:SetText(PBM_L["IP Sync: —"]) -- ── Command Reference ────────────────────────────────────── local LS_CMD_Y = LS_GRID_END - 42 @@ -380,20 +380,20 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) cmdHdr:SetFont(LT_FONT, 13, "OUTLINE") cmdHdr:SetPoint("TOPLEFT", lsPanel, "TOPLEFT", LS_MARGIN, LS_CMD_Y - 8) cmdHdr:SetTextColor(LT_GOLD_R, LT_GOLD_G, LT_GOLD_B) - cmdHdr:SetText("Commands") + cmdHdr:SetText(PBM_L["Commands"]) local notesHdr = lsPanel:CreateFontString(nil, "OVERLAY") notesHdr:SetFont(LT_FONT, 13, "OUTLINE") notesHdr:SetPoint("TOPLEFT", lsPanel, "TOPLEFT", LS_CMD_COL3, LS_CMD_Y - 8) notesHdr:SetTextColor(LT_GOLD_R, LT_GOLD_G, LT_GOLD_B) - notesHdr:SetText("Notes") + notesHdr:SetText(PBM_L["Notes"]) local setupHdr = lsPanel:CreateFontString(nil, "OVERLAY") setupHdr:SetFont(LT_FONT, 13, "OUTLINE") setupHdr:SetPoint("TOPRIGHT", lsPanel, "TOPRIGHT", -(LS_MARGIN + 26), lsStatY) setupHdr:SetWidth(90); setupHdr:SetJustifyH("RIGHT") setupHdr:SetTextColor(LT_GOLD_R, LT_GOLD_G, LT_GOLD_B) - setupHdr:SetText("Setup:") + setupHdr:SetText(PBM_L["Setup:"]) local setupIcon1 = CreateFrame("Button", nil, lsPanel) setupIcon1:SetSize(20, 20) @@ -404,28 +404,28 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) setupIcon1:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_LEFT") GameTooltip:ClearLines() - GameTooltip:AddLine("|cffd4af37HOW TO USE LEVELSYNC|r") + GameTooltip:AddLine("|cffd4af37" .. PBM_L["HOW TO USE LEVELSYNC"] .. "|r") GameTooltip:AddLine(" ") - GameTooltip:AddLine("1. Set a |cffFF8C00security key|r for your account:", 1, 1, 1) - GameTooltip:AddLine(" |cffd4af37.levelsync setkey |r", 1, 1, 1) - GameTooltip:AddLine(" You need this key to add your accounts to the sync group.", 1, 1, 1) - GameTooltip:AddLine(" |cffff4444Keep it private \226\128\148 it's the \"password\" for linking.|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["1. Set a |cffFF8C00security key|r for your account:"], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" |cffd4af37.levelsync setkey |r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" You need this key to add your accounts to the sync group."], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" |cffff4444Keep it private \226\128\148 it's the \"password\" for linking.|r"], 1, 1, 1) GameTooltip:AddLine(" ") - GameTooltip:AddLine("2. Link other accounts or characters into your |cff66ccffsync|r group:", 1, 1, 1) - GameTooltip:AddLine(" |cffd4af37.levelsync addaccount |r", 1, 1, 1) - GameTooltip:AddLine(" |cffd4af37.levelsync addchar |r", 1, 1, 1) - GameTooltip:AddLine(" The key is |cffff4444NOT|r required if you're adding your own account.", 1, 1, 1) + GameTooltip:AddLine(PBM_L["2. Link other accounts or characters into your |cff66ccffsync|r group:"], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" |cffd4af37.levelsync addaccount |r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" |cffd4af37.levelsync addchar |r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" The key is |cffff4444NOT|r required if you're adding your own account."], 1, 1, 1) GameTooltip:AddLine(" ") - GameTooltip:AddLine("3. |cff66ccffLevel Sync|r and |cff66ccffIP Sync|r are |cffFF8C00toggle only|r. To toggle:", 1, 1, 1) - GameTooltip:AddLine(" |cffd4af37.levelsync level on|r", 1, 1, 1) - GameTooltip:AddLine(" |cffd4af37.levelsync IP on|r", 1, 1, 1) - GameTooltip:AddLine(" |cff44dd44Available|r indicates syncs are available.", 1, 1, 1) - GameTooltip:AddLine(" |cffdd4444Disabled|r indicates syncs are disabled.", 1, 1, 1) - GameTooltip:AddLine(" A |cffFF8C0010 second cooldown|r is applied after each sync.", 1, 1, 1) + GameTooltip:AddLine(PBM_L["3. |cff66ccffLevel Sync|r and |cff66ccffIP Sync|r are |cffFF8C00toggle only|r. To toggle:"], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" |cffd4af37.levelsync level on|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" |cffd4af37.levelsync IP on|r"], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" |cff44dd44Available|r indicates syncs are available."], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" |cffdd4444Disabled|r indicates syncs are disabled."], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" A |cffFF8C0010 second cooldown|r is applied after each sync."], 1, 1, 1) GameTooltip:AddLine(" ") - GameTooltip:AddLine("4. Use |cff66ccffpool gold|r to drain your level sync group members'", 1, 1, 1) - GameTooltip:AddLine(" wallets into yours:", 1, 1, 1) - GameTooltip:AddLine(" |cffd4af37.levelsync money|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["4. Use |cff66ccffpool gold|r to drain your level sync group members'"], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" wallets into yours:"], 1, 1, 1) + GameTooltip:AddLine(PBM_L[" |cffd4af37.levelsync money|r"], 1, 1, 1) GameTooltip:Show() end) setupIcon1:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -457,23 +457,23 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) end BuildLSCmdColumn(LS_MARGIN, { - { ".levelsync setkey ", "Set your account security key" }, - { ".levelsync addaccount [key]", "Link all characters from another account" }, - { ".levelsync addchar [key]", "Link a single character into your group" }, - { ".levelsync removechar ", "Remove one character from your group" }, - { ".levelsync removeaccount ", "Remove all characters of an account" }, - { ".levelsync removeaccount # ", "Remove an account by its account number" }, - { ".levelsync money", "Pool all group money to the caller" }, + { ".levelsync setkey ", PBM_L["Set your account security key"] }, + { ".levelsync addaccount [key]", PBM_L["Link all characters from another account"] }, + { ".levelsync addchar [key]", PBM_L["Link a single character into your group"] }, + { ".levelsync removechar ", PBM_L["Remove one character from your group"] }, + { ".levelsync removeaccount ", PBM_L["Remove all characters of an account"] }, + { ".levelsync removeaccount # ", PBM_L["Remove an account by its account number"] }, + { ".levelsync money", PBM_L["Pool all group money to the caller"] }, }) BuildLSCmdColumn(LS_CMD_COL2, { - { ".levelsync removeall", "Disband your sync group" }, - { ".levelsync disbandaccount", "Disband all groups tied to your account" }, - { ".levelsync listaccount [key]", "List all characters on an account" }, - { ".levelsync status", "Show full group summary and all members" }, - { ".levelsync level on|off", "Toggle level synchronization for the group" }, - { ".levelsync IP on|off", "Toggle progression (IP tier) sync for the group" }, - { ".levelsync unbindall", "Resets all instances for target (requires server auth)" }, + { ".levelsync removeall", PBM_L["Disband your sync group"] }, + { ".levelsync disbandaccount", PBM_L["Disband all groups tied to your account"] }, + { ".levelsync listaccount [key]", PBM_L["List all characters on an account"] }, + { ".levelsync status", PBM_L["Show full group summary and all members"] }, + { ".levelsync level on|off", PBM_L["Toggle level synchronization for the group"] }, + { ".levelsync IP on|off", PBM_L["Toggle progression (IP tier) sync for the group"] }, + { ".levelsync unbindall", PBM_L["Resets all instances for target (requires server auth)"] }, }) -- ── Notes columns (A = left, B = right) ─────────────────── @@ -492,16 +492,16 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) n:SetText(text) end - MakeNote(NOTE_COL_A, 0, "|cffd4af37UPWARD ONLY|r \226\128\148 Levels, XP, and IP tier are never lowered. Sub-max members get pulled up.") - MakeNote(NOTE_COL_A, -NOTE_STEP, "|cffd4af37SESSION SYNC|r \226\128\148 Syncs must be explicitly triggered via toggle \226\128\148 they do not fire automatically.") - MakeNote(NOTE_COL_A, -NOTE_STEP * 2, "|cffd4af37IP TIER|r \226\128\148 Tier syncs must be triggered manually via the IP toggle.") - MakeNote(NOTE_COL_A, -NOTE_STEP * 3, "|cffd4af37COOLDOWN|r \226\128\148 10-sec shared cooldown covers level, IP, and money commands.") - MakeNote(NOTE_COL_A, -NOTE_STEP * 4, "|cffd4af37SECURITY KEY|r \226\128\148 Controls who can link to your account. Keep it private.") + MakeNote(NOTE_COL_A, 0, PBM_L["|cffd4af37UPWARD ONLY|r \226\128\148 Levels, XP, and IP tier are never lowered. Sub-max members get pulled up."]) + MakeNote(NOTE_COL_A, -NOTE_STEP, PBM_L["|cffd4af37SESSION SYNC|r \226\128\148 Syncs must be explicitly triggered via toggle \226\128\148 they do not fire automatically."]) + MakeNote(NOTE_COL_A, -NOTE_STEP * 2, PBM_L["|cffd4af37IP TIER|r \226\128\148 Tier syncs must be triggered manually via the IP toggle."]) + MakeNote(NOTE_COL_A, -NOTE_STEP * 3, PBM_L["|cffd4af37COOLDOWN|r \226\128\148 10-sec shared cooldown covers level, IP, and money commands."]) + MakeNote(NOTE_COL_A, -NOTE_STEP * 4, PBM_L["|cffd4af37SECURITY KEY|r \226\128\148 Controls who can link to your account. Keep it private."]) - MakeNote(NOTE_COL_B, 0, "|cffd4af37DEATH KNIGHTS|r \226\128\148 DK's can't pull up sub-55 levels/IP. Configurable server-side.") - MakeNote(NOTE_COL_B, -NOTE_STEP, "|cffd4af37MONEY POOL|r \226\128\148 Toggle money pooling on/off. Pools group gold onto the caller.") - MakeNote(NOTE_COL_B, -NOTE_STEP * 2, "|cffd4af37GROUP LIMIT|r \226\128\148 Default cap is 6 accounts per group (up to 10 server-side).") - MakeNote(NOTE_COL_B, -NOTE_STEP * 3, "|cffd4af37UNBIND ALL|r \226\128\148 Uses the GM command to reset target instances. (Automated in the Playerbots tab)") + MakeNote(NOTE_COL_B, 0, PBM_L["|cffd4af37DEATH KNIGHTS|r \226\128\148 DK's can't pull up sub-55 levels/IP. Configurable server-side."]) + MakeNote(NOTE_COL_B, -NOTE_STEP, PBM_L["|cffd4af37MONEY POOL|r \226\128\148 Toggle money pooling on/off. Pools group gold onto the caller."]) + MakeNote(NOTE_COL_B, -NOTE_STEP * 2, PBM_L["|cffd4af37GROUP LIMIT|r \226\128\148 Default cap is 6 accounts per group (up to 10 server-side)."]) + MakeNote(NOTE_COL_B, -NOTE_STEP * 3, PBM_L["|cffd4af37UNBIND ALL|r \226\128\148 Uses the GM command to reset target instances. (Automated in the Playerbots tab)"]) -- ── Bottom footer ────────────────────────────────────────── local lsFooter = lsPanel:CreateFontString(nil, "OVERLAY") @@ -510,7 +510,7 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) lsFooter:SetPoint("BOTTOMRIGHT", lsPanel, "BOTTOMRIGHT", -LS_MARGIN, 8) lsFooter:SetJustifyH("CENTER") lsFooter:SetTextColor(0.75, 0.75, 0.75) - lsFooter:SetText("** This tab requires |cffd4af37mod-levelsync|r on your server. Latest release at |cff66ccffgithub.com/Lichborne-AC/mod-levelsync|r") + lsFooter:SetText(PBM_L["** This tab requires |cffd4af37mod-levelsync|r on your server. Latest release at |cff66ccffgithub.com/Lichborne-AC/mod-levelsync|r"]) -- ── Export LevelSync data into the PBM tracker ───────────── -- Copies each synced character's name, class, level and IP tier into the @@ -519,7 +519,7 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) local function lsExportToPBM() local d = lsData if not d.members or #d.members == 0 then - LichborneOutput("|cffC69B3APBM:|r No LevelSync data to export. Click |cffd4af37Refresh|r first.", 1, 0.6, 0.2) + LichborneOutput("|cffC69B3APBM:|r " .. PBM_L["No LevelSync data to export. Click |cffd4af37Refresh|r first."], 1, 0.6, 0.2) return end if not LichborneTrackerDB.rows then LichborneTrackerDB.rows = {} end @@ -568,14 +568,14 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) if PBM.State.overviewRowFrames and #PBM.State.overviewRowFrames > 0 then PBM.RefreshOverviewRows() end if PBM.State.raidRowFrames and #PBM.State.raidRowFrames > 0 then PBM.RefreshRaidRows() end - local msg = "Exported LevelSync: |cff44ff44"..added.." added|r, |cffd4af37"..updated.." updated|r" - if skipped > 0 then msg = msg..", |cffff6666"..skipped.." skipped (unknown class)|r" end + local msg = string.format(PBM_L["Exported LevelSync: |cff44ff44%s added|r, |cffd4af37%s updated|r"], tostring(added), tostring(updated)) + if skipped > 0 then msg = msg .. string.format(PBM_L[", |cffff6666%s skipped (unknown class)|r"], tostring(skipped)) end LichborneOutput("|cffC69B3APBM:|r "..msg, 1, 0.85, 0) end if not StaticPopupDialogs["PBM_EXPORT_LEVELSYNC"] then StaticPopupDialogs["PBM_EXPORT_LEVELSYNC"] = { - text = "Are you sure you want to export LevelSync data?\n\nThis copies each synced character's |cffd4af37name, class, level, and IP tier|r into the PBM tracker.", + text = PBM_L["Are you sure you want to export LevelSync data?\n\nThis copies each synced character's |cffd4af37name, class, level, and IP tier|r into the PBM tracker."], button1 = "Yes", button2 = "No", OnAccept = function() lsExportToPBM() end, @@ -596,13 +596,13 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) lsExportBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") local lsExportLbl = lsExportBtn:CreateFontString(nil, "OVERLAY") lsExportLbl:SetFont(LT_FONT, 11, "OUTLINE"); lsExportLbl:SetAllPoints(lsExportBtn) - lsExportLbl:SetJustifyH("CENTER"); lsExportLbl:SetText("|cffd4af37Export|r") + lsExportLbl:SetJustifyH("CENTER"); lsExportLbl:SetText("|cffd4af37" .. (PBM_L["Export"] or "Export") .. "|r") lsExportBtn:SetScript("OnEnter", function(self) self:SetBackdropColor(0.45, 0.08, 0.08, 1) GameTooltip:SetOwner(self, "ANCHOR_TOP") - GameTooltip:AddLine("Export LevelSync Data", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Copies name, class, level, and IP tier of every", 0.8, 0.8, 0.8) - GameTooltip:AddLine("synced character into the PBM tracker.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Export LevelSync Data"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Copies name, class, level, and IP tier of every"], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["synced character into the PBM tracker."], 0.8, 0.8, 0.8) GameTooltip:Show() end) lsExportBtn:SetScript("OnLeave", function(self) @@ -614,13 +614,13 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) lsRebuildGrid = function() local d = lsData if d.inGroup then - lsAccountsFS:SetText("Accounts: |cffd4af37"..d.accountsCur.."/"..d.accountsMax.."|r") - lsTotalCharsFS:SetText("Characters: |cffd4af37"..d.totalChars.."|r") - lsLevelSyncFS:SetText("Level Sync: "..(d.levelSync and "|cff44dd44Available|r" or "|cffdd4444Disabled|r")) - lsIpSyncFS:SetText("IP Sync: "..(d.ipSync and "|cff44dd44Available|r" or "|cffdd4444Disabled|r")) + lsAccountsFS:SetText(string.format(PBM_L["Accounts: |cffd4af37%s/%s|r"], tostring(d.accountsCur), tostring(d.accountsMax))) + lsTotalCharsFS:SetText(string.format(PBM_L["Characters: |cffd4af37%s|r"], tostring(d.totalChars))) + lsLevelSyncFS:SetText(PBM_L["Level Sync: "] .. (d.levelSync and "|cff44dd44Available|r" or "|cffdd4444Disabled|r")) + lsIpSyncFS:SetText(PBM_L["IP Sync: "] .. (d.ipSync and "|cff44dd44Available|r" or "|cffdd4444Disabled|r")) else - lsAccountsFS:SetText("Accounts: —"); lsTotalCharsFS:SetText("Characters: —") - lsLevelSyncFS:SetText("Level Sync: —"); lsIpSyncFS:SetText("IP Sync: —") + lsAccountsFS:SetText(PBM_L["Accounts: —"]); lsTotalCharsFS:SetText(PBM_L["Characters: —"]) + lsLevelSyncFS:SetText(PBM_L["Level Sync: —"]); lsIpSyncFS:SetText(PBM_L["IP Sync: —"]) end local accountOrder, accountMap = {}, {} @@ -636,7 +636,7 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) local cell = lsCells[cellIdx] local accId = accountOrder[cellIdx] if not accId then - cell.hdrFS:SetTextColor(0.35, 0.35, 0.50); cell.hdrFS:SetText("— empty —") + cell.hdrFS:SetTextColor(0.35, 0.35, 0.50); cell.hdrFS:SetText(PBM_L["— empty —"]) cell.frame:SetBackdropBorderColor(0.25, 0.35, 0.55, 0.80) for r = 1, LS_SLOT_CNT do cell.rows[r].nameFS:SetText(""); cell.rows[r].lvlFS:SetText("") @@ -646,7 +646,7 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) end else cell.hdrFS:SetTextColor(LT_GOLD_R, LT_GOLD_G, LT_GOLD_B) - cell.hdrFS:SetText("Account "..accId) + cell.hdrFS:SetText(PBM_L["Account "] .. accId) cell.frame:SetBackdropBorderColor(LT_GOLD_R*0.7, LT_GOLD_G*0.7, LT_GOLD_B*0.7, 0.9) local members = accountMap[accId] for r = 1, LS_SLOT_CNT do @@ -673,4 +673,4 @@ function PBM.BuildLevelSyncPanel(lsPanel, ctx) end end end -end +end \ No newline at end of file diff --git a/PBM/PBM_Tab_Notes.lua b/PBM/PBM_Tab_Notes.lua index bde1257..307463a 100644 --- a/PBM/PBM_Tab_Notes.lua +++ b/PBM/PBM_Tab_Notes.lua @@ -55,7 +55,7 @@ function PBM.BuildNotesPanel(pf, ctx) col:SetBackdropBorderColor(0.78, 0.61, 0.23, 0.6) -- ── Column title (single-line, user-editable) ───────── - local HINT_TEXT = "Column Title..." + local HINT_TEXT = PBM_L["Column Title..."] local HINT_R, HINT_G, HINT_B = 0.38, 0.38, 0.38 local REAL_R, REAL_G, REAL_B = 0.78, 0.61, 0.23 @@ -135,7 +135,7 @@ function PBM.BuildNotesPanel(pf, ctx) end) -- Multiline EditBox as scroll child - local NOTE_HINT = "Click here to add a note..." + local NOTE_HINT = PBM_L["Click here to add a note..."] local NOTE_HR, NOTE_HG, NOTE_HB = 0.38, 0.38, 0.38 local NOTE_RR, NOTE_RG, NOTE_RB = 0.78, 0.61, 0.23 @@ -183,4 +183,4 @@ function PBM.BuildNotesPanel(pf, ctx) end) eb:SetScript("OnEscapePressed", function(self) self:ClearFocus() end) end -end +end \ No newline at end of file diff --git a/PBM/PBM_Tab_Playerbots.lua b/PBM/PBM_Tab_Playerbots.lua index 119b193..f1b12d9 100644 --- a/PBM/PBM_Tab_Playerbots.lua +++ b/PBM/PBM_Tab_Playerbots.lua @@ -72,24 +72,24 @@ function PBM.BuildPlayerbotsPanel(pbPanel, ctx) end -- ── Column 1 – Add RndBot (x = 400) ─────────────────────── - PBLabel(400, PB_ROW_TOP, "Add RndBot") + PBLabel(400, PB_ROW_TOP, PBM_L["Add RndBot"]) PBDivider(400, PB_ROW_TOP + 16, 190) local CLASS_DEFS = { - { name="Death Knight", cmd="dk", hex="C41F3B", icon=PB_ADDON.."addclass_deathknight.blp" }, - { name="Druid", cmd="druid", hex="FF7D0A", icon=PB_ADDON.."addclass_druid.blp" }, - { name="Hunter", cmd="hunter", hex="ABD473", icon=PB_ADDON.."addclass_hunter.blp" }, - { name="Mage", cmd="mage", hex="3FC7EB", icon=PB_ADDON.."addclass_mage.blp" }, - { name="Paladin", cmd="paladin", hex="F58CBA", icon=PB_ADDON.."addclass_paladin.blp" }, - { name="Priest", cmd="priest", hex="FFFFFF", icon=PB_ADDON.."addclass_priest.blp" }, - { name="Rogue", cmd="rogue", hex="FFF569", icon=PB_ADDON.."addclass_rogue.blp" }, - { name="Shaman", cmd="shaman", hex="0070DE", icon=PB_ADDON.."addclass_shaman.blp" }, - { name="Warlock", cmd="warlock", hex="8787ED", icon=PB_ADDON.."addclass_warlock.blp" }, - { name="Warrior", cmd="warrior", hex="C79C3B", icon=PB_ADDON.."addclass_warrior.blp" }, + { name=PBM_L["Death Knight"], cmd="dk", hex="C41F3B", icon=PB_ADDON.."addclass_deathknight.blp" }, + { name=PBM_L["Druid"], cmd="druid", hex="FF7D0A", icon=PB_ADDON.."addclass_druid.blp" }, + { name=PBM_L["Hunter"], cmd="hunter", hex="ABD473", icon=PB_ADDON.."addclass_hunter.blp" }, + { name=PBM_L["Mage"], cmd="mage", hex="3FC7EB", icon=PB_ADDON.."addclass_mage.blp" }, + { name=PBM_L["Paladin"], cmd="paladin", hex="F58CBA", icon=PB_ADDON.."addclass_paladin.blp" }, + { name=PBM_L["Priest"], cmd="priest", hex="FFFFFF", icon=PB_ADDON.."addclass_priest.blp" }, + { name=PBM_L["Rogue"], cmd="rogue", hex="FFF569", icon=PB_ADDON.."addclass_rogue.blp" }, + { name=PBM_L["Shaman"], cmd="shaman", hex="0070DE", icon=PB_ADDON.."addclass_shaman.blp" }, + { name=PBM_L["Warlock"], cmd="warlock", hex="8787ED", icon=PB_ADDON.."addclass_warlock.blp" }, + { name=PBM_L["Warrior"], cmd="warrior", hex="C79C3B", icon=PB_ADDON.."addclass_warrior.blp" }, } local cy = PB_ROW_TOP + 24 for _, cd in ipairs(CLASS_DEFS) do - local cb = PBIconBtn(400, cy, cd.icon, cd.name, "Summon a random "..cd.name.." RndBot.") + local cb = PBIconBtn(400, cy, cd.icon, cd.name, string.format(PBM_L["Summon a random %s RndBot."], cd.name)) local cap = cd.cmd cb:SetScript("OnClick", function() SendChatMessage(".playerbots bot addclass "..cap, "SAY") end) local cl = pbPanel:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") @@ -103,7 +103,7 @@ function PBM.BuildPlayerbotsPanel(pbPanel, ctx) local CMD_DIV_W = 190 local CMD_STEP = 34 - PBLabel(CMD_X1, PB_ROW_TOP, "Bot Commands") + PBLabel(CMD_X1, PB_ROW_TOP, PBM_L["Bot Commands"]) PBDivider(CMD_X1, PB_ROW_TOP + 16, CMD_DIV_W) local function CMDEntry(x, y, cmd, desc) @@ -131,10 +131,10 @@ function PBM.BuildPlayerbotsPanel(pbPanel, ctx) -- Bot management commands local ey1 = PB_ROW_TOP + 26 local ALTBOT_CMDS = { - { ".playerbots bot add ", "Login altbot(s)" }, - { ".playerbots bot addaccount ", "Login entire account" }, - { "maintenance", "Learn spells, enchant, repair" }, - { "autogear", "Auto-equip best gear" }, + { ".playerbots bot add ", PBM_L["Login altbot(s)"] }, + { ".playerbots bot addaccount ", PBM_L["Login entire account"] }, + { "maintenance", PBM_L["Learn spells, enchant, repair"] }, + { "autogear", PBM_L["Auto-equip best gear"] }, } for _, e in ipairs(ALTBOT_CMDS) do CMDEntry(CMD_X1, ey1, e[1], e[2]) @@ -143,14 +143,14 @@ function PBM.BuildPlayerbotsPanel(pbPanel, ctx) -- Account Linking sub-section ey1 = ey1 + 8 - CMDSection(CMD_X1, ey1, "Account Linking") + CMDSection(CMD_X1, ey1, PBM_L["Account Linking"]) ey1 = ey1 + 20 local ACCT_CMDS = { - { ".playerbots account setKey ", "Set account security key" }, - { ".playerbots account link ", "Link account by key" }, - { ".playerbots account linkedAccounts", "List linked accounts" }, - { ".playerbots account unlink ", "Unlink account" }, + { ".playerbots account setKey ", PBM_L["Set account security key"] }, + { ".playerbots account link ", PBM_L["Link account by key"] }, + { ".playerbots account linkedAccounts", PBM_L["List linked accounts"] }, + { ".playerbots account unlink ", PBM_L["Unlink account"] }, } for _, e in ipairs(ACCT_CMDS) do CMDEntry(CMD_X1, ey1, e[1], e[2]) @@ -159,14 +159,14 @@ function PBM.BuildPlayerbotsPanel(pbPanel, ctx) -- Reset Instances sub-section ey1 = ey1 + 8 - CMDSection(CMD_X1, ey1, "Reset Instances") + CMDSection(CMD_X1, ey1, PBM_L["Reset Instances"]) ey1 = ey1 + 20 if not StaticPopupDialogs["PBM_RESET_INSTANCES"] then StaticPopupDialogs["PBM_RESET_INSTANCES"] = { - text = "|cffd4af37Reset Instances|r\n\nSend |cffFF8C00.playerbots bot refresh=raid *|r\nfor your current group/raid?", - button1 = "Yes, Reset All", - button2 = "Cancel", + text = "|cffd4af37" .. PBM_L["Reset Instances"] .. "|r\n\n" .. PBM_L["Send |cffFF8C00.playerbots bot refresh=raid *|r\nfor your current group/raid?"], + button1 = PBM_L["Yes, Reset All"], + button2 = PBM_L["Cancel"], OnAccept = function() SendChatMessage(".playerbots bot refresh=raid *", "SAY") end, @@ -177,13 +177,13 @@ function PBM.BuildPlayerbotsPanel(pbPanel, ctx) end local resetInstBtn = PBIconBtn(CMD_X1, ey1, PB_ICON.."inv_misc_punchcards_yellow", - "Reset Instances", nil) + PBM_L["Reset Instances"], nil) resetInstBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_RIGHT") - GameTooltip:AddLine("Reset Instances", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Resets instances for entire group using", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Reset Instances"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Resets instances for entire group using"], 0.8, 0.8, 0.8) GameTooltip:AddLine(".playerbots bot refresh=raid *", 0.8, 0.8, 0.8) - GameTooltip:AddLine("Requires AiPlayerbot.ResetInstanceIdForAltBots = 1", 1, 0.2, 0.2) + GameTooltip:AddLine(PBM_L["Requires AiPlayerbot.ResetInstanceIdForAltBots = 1"], 1, 0.2, 0.2) GameTooltip:Show() end) resetInstBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -191,7 +191,7 @@ function PBM.BuildPlayerbotsPanel(pbPanel, ctx) local riyl = pbPanel:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") riyl:SetPoint("LEFT", resetInstBtn, "RIGHT", 6, 0) riyl:SetJustifyH("LEFT") - riyl:SetText("|cffffffffReset Instances for group|r") + riyl:SetText("|cffffffff"..PBM_L["Reset Instances for group"].."|r") ey1 = ey1 + PB_STEP -- ── Universal Strategies List ───────────────────────────────── @@ -203,88 +203,88 @@ function PBM.BuildPlayerbotsPanel(pbPanel, ctx) local SL_W = 190 local SL_ROW = 19 - PBLabel(SL_X1, PB_ROW_TOP, "Universal Strategies") + PBLabel(SL_X1, PB_ROW_TOP, PBM_L["Universal Strategies"]) PBDivider(SL_X1, PB_ROW_TOP + 16, 285) -- 38 entries, alphabetical — left col = 1-19, right col = 20-38 local STRAT_LIST = { { n="adds", hex="aaaaaa", tp="CO", tphex="aaaaaa", - desc="Abort the pull if extra mobs are detected near the target" }, + desc=PBM_L["Abort the pull if extra mobs are detected near the target"] }, { n="aggressive", hex="aabb55", tp="CO", tphex="aaaaaa", - desc="Proactively engages nearby threats" }, + desc=PBM_L["Proactively engages nearby threats"] }, { n="avoid aoe", hex="7799ff", tp="CO", tphex="aaaaaa", - desc="Reposition to avoid AoE damage patterns" }, + desc=PBM_L["Reposition to avoid AoE damage patterns"] }, { n="boost", hex="ff9900", tp="CO", tphex="aaaaaa", - desc="Activate offensive cooldowns (class-specific)" }, + desc=PBM_L["Activate offensive cooldowns (class-specific)"] }, { n="buff", hex="ffff00", tp="NC", tphex="44aa44", - desc="Apply class-specific party buffs to the group out of combat" }, + desc=PBM_L["Apply class-specific party buffs to the group out of combat"] }, { n="cast time", hex="ffff88", tp="CO", tphex="aaaaaa", - desc="Skip long casts when target is about to die" }, + desc=PBM_L["Skip long casts when target is about to die"] }, { n="chat", hex="aaaaaa", tp="NC", tphex="44aa44", - desc="Respond to party chat commands" }, + desc=PBM_L["Respond to party chat commands"] }, { n="cure", hex="ffff00", tp="CO", tphex="ff8000", - desc="Cleanse party debuffs (class-appropriate ability)" }, + desc=PBM_L["Cleanse party debuffs (class-appropriate ability)"] }, { n="default", hex="aaaaaa", tp="NC", tphex="aaaaaa", - desc="Revert to base default rotation" }, + desc=PBM_L["Revert to base default rotation"] }, { n="dps", hex="ddaa00", tp="CO", tphex="ee4433", - desc="Generic DPS rotation (spec inferred from talents)" }, + desc=PBM_L["Generic DPS rotation (spec inferred from talents)"] }, { n="dps aoe", hex="ff8000", tp="CO", tphex="ffcc00", - desc="Bot switches to AoE rotation (area attacks)" }, + desc=PBM_L["Bot switches to AoE rotation (area attacks)"] }, { n="dps assist", hex="ff8000", tp="CO", tphex="ffcc00", - desc="Bot attacks the group DPS focus target (coordinates kill order)" }, + desc=PBM_L["Bot attacks the group DPS focus target (coordinates kill order)"] }, { n="duel", hex="aaaaaa", tp="NC", tphex="aaaaaa", - desc="Auto-accept or decline duel requests" }, + desc=PBM_L["Auto-accept or decline duel requests"] }, { n="emote", hex="aaaaaa", tp="NC", tphex="aaaaaa", - desc="Play social emotes" }, + desc=PBM_L["Play social emotes"] }, { n="flee", hex="aaaaaa", tp="CO", tphex="aaaaaa", - desc="Retreat when critical HP or outnumbered" }, + desc=PBM_L["Retreat when critical HP or outnumbered"] }, { n="follow", hex="7799bb", tp="NC", tphex="44aa44", - desc="Follow master" }, + desc=PBM_L["Follow master"] }, { n="food", hex="d4af37", tp="NC", tphex="44aa44", - desc="Auto-eat and drink to recover health and mana between pulls" }, + desc=PBM_L["Auto-eat and drink to recover health and mana between pulls"] }, { n="formation", hex="5599ee", tp="CO", tphex="aaaaaa", - desc="Maintain positional formation with group" }, + desc=PBM_L["Maintain positional formation with group"] }, { n="gather", hex="d4af37", tp="NC", tphex="44aa44", - desc="Harvest herbs, ore, or skinning nodes while moving" }, + desc=PBM_L["Harvest herbs, ore, or skinning nodes while moving"] }, { n="grind", hex="aaaaaa", tp="NC", tphex="aaaaaa", - desc="Auto-attack nearby mobs, manage food/drink" }, + desc=PBM_L["Auto-attack nearby mobs, manage food/drink"] }, -- right column starts here (20) { n="guard", hex="aaaa44", tp="NC", tphex="44aa44", - desc="Hold position as a guard" }, + desc=PBM_L["Hold position as a guard"] }, { n="heal", hex="ffcc00", tp="CO", tphex="ee4433", - desc="Bot takes healer role (must be healer-capable class)" }, + desc=PBM_L["Bot takes healer role (must be healer-capable class)"] }, { n="healer dps", hex="ffcc00", tp="CO", tphex="ee4433", - desc="Healer bot also attacks between heals" }, + desc=PBM_L["Healer bot also attacks between heals"] }, { n="kite", hex="aaaaaa", tp="", tphex="", - desc="Runs the bot away the instant it has aggro — keeps melee mobs perpetually chasing" }, + desc=PBM_L["Runs the bot away the instant it has aggro — keeps melee mobs perpetually chasing"] }, { n="loot", hex="d4af37", tp="NC", tphex="44aa44", - desc="Auto-loot corpses and containers" }, + desc=PBM_L["Auto-loot corpses and containers"] }, { n="mount", hex="aaaaaa", tp="NC", tphex="aaaaaa", - desc="Use a mount when traveling" }, + desc=PBM_L["Use a mount when traveling"] }, { n="offheal", hex="55cc77", tp="CO", tphex="ee4433", - desc="DPS bot assists with emergency heals (Paladin only)" }, + desc=PBM_L["DPS bot assists with emergency heals (Paladin only)"] }, { n="passive", hex="aabb55", tp="", tphex="", - desc="Bot does nothing (fully passive)" }, + desc=PBM_L["Bot does nothing (fully passive)"] }, { n="potions", hex="00ffaa", tp="CO", tphex="aaaaaa", - desc="Auto-use health and mana potions / healthstones" }, + desc=PBM_L["Auto-use health and mana potions / healthstones"] }, { n="pull", hex="ff8000", tp="CO/NC", tphex="ffcc00", - desc="Class-specific opening attack — tank-only initiation" }, + desc=PBM_L["Class-specific opening attack — tank-only initiation"] }, { n="pull back", hex="ff8000", tp="CO", tphex="ffcc00", - desc="Anchor at pull spot — bot opens then returns instead of running into melee" }, + desc=PBM_L["Anchor at pull spot — bot opens then returns instead of running into melee"] }, { n="pvp", hex="ee4433", tp="CO", tphex="ee4433", - desc="Enable attacking hostile players (player-targeting toggle ONLY — rotation unchanged)" }, + desc=PBM_L["Enable attacking hostile players (player-targeting toggle ONLY — rotation unchanged)"] }, { n="racials", hex="cc88ff", tp="CO", tphex="aaaaaa", - desc="Use racial abilities — EMFH, War Stomp, Berserking, etc." }, + desc=PBM_L["Use racial abilities — EMFH, War Stomp, Berserking, etc."] }, { n="save mana", hex="6699cc", tp="CO", tphex="aaaaaa", - desc="Suppress expensive casts when mana is low" }, + desc=PBM_L["Suppress expensive casts when mana is low"] }, { n="stay", hex="aaaaaa", tp="", tphex="", - desc="Hold at current spot; return to saved stay position if drifted" }, + desc=PBM_L["Hold at current spot; return to saved stay position if drifted"] }, { n="tank assist", hex="ff8000", tp="CO", tphex="ffcc00", - desc="Bot attacks the tank's current target" }, + desc=PBM_L["Bot attacks the tank's current target"] }, { n="tank face", hex="ff9966", tp="", tphex="", - desc="Tank rotates to face the current target each combat tick" }, + desc=PBM_L["Tank rotates to face the current target each combat tick"] }, { n="threat", hex="aaaaaa", tp="CO", tphex="aaaaaa", - desc="Suppress actions when threat >80% (prevents pulling aggro)" }, + desc=PBM_L["Suppress actions when threat >80% (prevents pulling aggro)"] }, } for i, def in ipairs(STRAT_LIST) do @@ -342,5 +342,5 @@ function PBM.BuildPlayerbotsPanel(pbPanel, ctx) pbFooter:SetPoint("BOTTOMLEFT", pbPanel, "BOTTOMLEFT", 310, 6) pbFooter:SetPoint("BOTTOMRIGHT", pbPanel, "BOTTOMRIGHT", -10, 6) pbFooter:SetJustifyH("CENTER") - pbFooter:SetText("|cffff4444** Information and strategies are subject to change as mod-playerbots is updated.|r") -end + pbFooter:SetText("|cffff4444" .. PBM_L["** Information and strategies are subject to change as mod-playerbots is updated."] .. "|r") +end \ No newline at end of file diff --git a/PBM/PBM_TopTabs.lua b/PBM/PBM_TopTabs.lua index 40e7a8d..7b040f7 100644 --- a/PBM/PBM_TopTabs.lua +++ b/PBM/PBM_TopTabs.lua @@ -25,11 +25,11 @@ local BD_CELL = { local IP_R, IP_G, IP_B = 0.78, 0.61, 0.23 -- gold (matches LevelSync) local BOTTOM_TABS = { - { id="Playerbots", label="Playerbots", r=GOLD_R, g=GOLD_G, b=GOLD_B }, - { id="IndividualProgression",label="Ind. Prog.", r=GOLD_R, g=GOLD_G, b=GOLD_B }, - { id="LevelSync", label="LevelSync", r=GOLD_R, g=GOLD_G, b=GOLD_B }, - { id="Notes", label="Notes", r=GOLD_R, g=GOLD_G, b=GOLD_B }, - { id="Group", label="Group", r=GOLD_R, g=GOLD_G, b=GOLD_B }, + { id="Playerbots", label=PBM_L["Playerbots"], r=GOLD_R, g=GOLD_G, b=GOLD_B }, + { id="IndividualProgression",label=PBM_L["Ind. Prog."], r=GOLD_R, g=GOLD_G, b=GOLD_B }, + { id="LevelSync", label=PBM_L["LevelSync"], r=GOLD_R, g=GOLD_G, b=GOLD_B }, + { id="Notes", label=PBM_L["Notes"], r=GOLD_R, g=GOLD_G, b=GOLD_B }, + { id="Group", label=PBM_L["Group"], r=GOLD_R, g=GOLD_G, b=GOLD_B }, } -- ── Tab button layout (title bar row, right of Clear buttons) ─ @@ -272,23 +272,23 @@ function PBM.BuildBottomTabs(parent, fl) } -- ── Playerbots panel ───────────────────────────────────── - local pbPanel = MakeContentFrame("PBMTabPanel_Playerbots", parent, fl, "Playerbots", false, GOLD_R, GOLD_G, GOLD_B) + local pbPanel = MakeContentFrame("PBMTabPanel_Playerbots", parent, fl, PBM_L["Playerbots"], false, GOLD_R, GOLD_G, GOLD_B) PBM.State.bottomTabPanels["Playerbots"] = pbPanel PBM.BuildPlayerbotsPanel(pbPanel, ctx) -- ── Individual Progression panel (full height, corrected width) ── local ipPanel = MakeContentFrame("PBMTabPanel_IndividualProgression", parent, fl, - "Individual Progression", true, GOLD_R, GOLD_G, GOLD_B) + PBM_L["Individual Progression"], true, GOLD_R, GOLD_G, GOLD_B) PBM.State.bottomTabPanels["IndividualProgression"] = ipPanel PBM.BuildIPProgressionPanel(ipPanel, ctx) -- ── LevelSync panel (full height, corrected width) ─────────── - local lsPanel = MakeContentFrame("PBMTabPanel_LevelSync", parent, fl, "LevelSync", true, GOLD_R, GOLD_G, GOLD_B) + local lsPanel = MakeContentFrame("PBMTabPanel_LevelSync", parent, fl, PBM_L["LevelSync"], true, GOLD_R, GOLD_G, GOLD_B) PBM.State.bottomTabPanels["LevelSync"] = lsPanel PBM.BuildLevelSyncPanel(lsPanel, ctx) -- ── Notes panel (gold header) ───────────────────────────── - local notesPanel = MakeContentFrame("PBMTabPanel_Notes", parent, fl, "Notes", false, GOLD_R, GOLD_G, GOLD_B) + local notesPanel = MakeContentFrame("PBMTabPanel_Notes", parent, fl, PBM_L["Notes"], false, GOLD_R, GOLD_G, GOLD_B) PBM.State.bottomTabPanels["Notes"] = notesPanel PBM.BuildNotesPanel(notesPanel, ctx) @@ -345,4 +345,4 @@ function PBM.BuildBottomTabs(parent, fl) end PBM.RefreshBottomTabPositions() -end +end \ No newline at end of file diff --git a/PBM/PBM_TrackerCore.lua b/PBM/PBM_TrackerCore.lua index 3a276d3..6c5d0e4 100644 --- a/PBM/PBM_TrackerCore.lua +++ b/PBM/PBM_TrackerCore.lua @@ -127,7 +127,7 @@ local function OnFirstShow() PBM.State.classSortHdrs[key] = {lbl = lbl, fs = fs} btn:SetScript("OnEnter", function() GameTooltip:SetOwner(btn, "ANCHOR_BOTTOM") - GameTooltip:AddLine("Click to sort", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Click to sort"], 1, 1, 1) GameTooltip:Show() end) btn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -153,14 +153,14 @@ local function OnFirstShow() specHdr:SetPoint("LEFT", hf, "LEFT", PBM.SPEC_OFF + 1, 0) specHdr:SetSize(PBM.COL_SPEC_W - 2, 18) specHdr:SetTexture("Interface\\Icons\\Ability_Rogue_Deadliness") - SH("Spec", PBM.SPEC_OFF - 4, PBM.COL_SPEC_W + 12, "spec", false) - SH("Name", PBM.NAME_OFF - 4, PBM.COL_NAME_W - 40, "name", false) - SH("iLvL", PBM.GS_OFF+2, PBM.COL_GS_W-4, "ilvl", true) - SH("GS", PBM.REALGS_OFF+2, PBM.COL_GS_W-4, "gs", true) + SH(PBM_L["Spec"], PBM.SPEC_OFF - 4, PBM.COL_SPEC_W + 12, "spec", false) + SH(PBM_L["Name"], PBM.NAME_OFF - 4, PBM.COL_NAME_W - 40, "name", false) + SH(PBM_L["iLvL"], PBM.GS_OFF+2, PBM.COL_GS_W-4, "ilvl", true) + SH(PBM_L["GS"], PBM.REALGS_OFF+2, PBM.COL_GS_W-4, "gs", true) local needsProfHdrFs = hf:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") needsProfHdrFs:SetPoint("LEFT", hf, "LEFT", PBM.NEEDS_OFF+2, 0) needsProfHdrFs:SetWidth(PBM.COL_NEEDS_W-4); needsProfHdrFs:SetJustifyH("CENTER") - needsProfHdrFs:SetText("|cffd4af37Prof|r") + needsProfHdrFs:SetText("|cffd4af37"..PBM_L["Prof"].."|r") PBM.State.needsProfHdrLabel = needsProfHdrFs for g, a in ipairs(PBM.SLOT_ABBR) do SH(a, PBM.GEAR_OFF+(g-1)*PBM.COL_GEAR_W, PBM.COL_GEAR_W, "gear_"..g, true) end @@ -199,7 +199,7 @@ local function OnFirstShow() avgbg:SetAllPoints(avgFrame); avgbg:SetTexture(0.05, 0.07, 0.13, 1) local avgTitle = avgFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") avgTitle:SetPoint("LEFT", avgFrame, "LEFT", 4, 0) - avgTitle:SetText("|cffC69B3AAvg iLvL:|r"); avgTitle:SetWidth(52) + avgTitle:SetText("|cffC69B3A"..PBM_L["Avg iLvL:"].."|r"); avgTitle:SetWidth(52) LichborneAvgSwatches = {} -- Roster block is 130px wide, 4px gap, label is 56px: swatches fill 1086-56-4-130 = 896px for 10 classes local rosterBlockW = 130 @@ -225,13 +225,13 @@ local function OnFirstShow() GameTooltip:SetOwner(sw, "ANCHOR_TOP") local avg = PBM.GetClassAvgIlvl(cls) GameTooltip:AddLine(PBM.TAB_LABELS[cls], c.r, c.g, c.b) - GameTooltip:AddLine("Average item level of all tracked "..PBM.TAB_LABELS[cls].."s.", 1,1,1) + GameTooltip:AddLine(string.format(PBM_L["Average item level of all tracked %ss."], PBM.TAB_LABELS[cls]), 1,1,1) if avg > 0 then - GameTooltip:AddLine("Current: |cffd4af37"..avg.."|r", 1,1,1) + GameTooltip:AddLine(string.format(PBM_L["Current: |cffd4af37%s|r"], tostring(avg)), 1,1,1) else - GameTooltip:AddLine("No gear data yet.", 0.6,0.6,0.6) + GameTooltip:AddLine(PBM_L["No gear data yet."], 0.6,0.6,0.6) end - GameTooltip:AddLine("Click to switch to this tab.", 0.5,0.5,0.5) + GameTooltip:AddLine(PBM_L["Click to switch to this tab."], 0.5,0.5,0.5) GameTooltip:Show() end) sw:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -259,14 +259,14 @@ local function OnFirstShow() local rosterIlvlLbl = rosterIlvlBlock:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") rosterIlvlLbl:SetAllPoints(rosterIlvlBlock) rosterIlvlLbl:SetJustifyH("CENTER"); rosterIlvlLbl:SetJustifyV("MIDDLE") - rosterIlvlLbl:SetText("|cffC69B3ARoster iLvL:|r |cff555555--|r") + rosterIlvlLbl:SetText("|cffC69B3A"..PBM_L["Roster iLvL:"].."|r |cff555555--|r") PBM.State.LichborneRosterIlvlLabel = rosterIlvlLbl rosterIlvlBlock:EnableMouse(true) rosterIlvlBlock:SetScript("OnEnter", function() GameTooltip:SetOwner(rosterIlvlBlock, "ANCHOR_TOP") - GameTooltip:AddLine("Roster Avg iLvL", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Average item level across your", 1,1,1) - GameTooltip:AddLine("entire tracked roster.", 1,1,1) + GameTooltip:AddLine(PBM_L["Roster Avg iLvL"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Average item level across your"], 1,1,1) + GameTooltip:AddLine(PBM_L["entire tracked roster."], 1,1,1) GameTooltip:Show() end) rosterIlvlBlock:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -275,17 +275,17 @@ local function OnFirstShow() local filtersLbl = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") filtersLbl:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 497, 152) filtersLbl:SetJustifyH("LEFT") - filtersLbl:SetText("|cffC69B3AFilters:|r") + filtersLbl:SetText("|cffC69B3A"..PBM_L["Filters:"].."|r") -- ── Info/Help label (between last filter and help icons) ────── local infoHelpLbl = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") infoHelpLbl:SetJustifyH("LEFT") - infoHelpLbl:SetText("|cffC69B3AHelp:|r") + infoHelpLbl:SetText("|cffC69B3A"..PBM_L["Help:"].."|r") -- ── Admin label (between overview help icon and import button) ─ local adminLbl = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") adminLbl:SetJustifyH("LEFT") - adminLbl:SetText("|cffC69B3AMenu:|r") + adminLbl:SetText("|cffC69B3A"..PBM_L["Menu:"].."|r") -- ── Add Target button ────────────────────────────────────── local addBtn = CreateFrame("Button", "LichborneAddTargetBtn", f) @@ -303,15 +303,15 @@ local function OnFirstShow() local addBtnLabel = addBtn:CreateFontString(nil, "OVERLAY", "GameFontNormal") addBtnLabel:SetAllPoints(addBtn) addBtnLabel:SetJustifyH("CENTER"); addBtnLabel:SetJustifyV("MIDDLE") - addBtnLabel:SetText("|cffd4af37+ Add Target|r") + addBtnLabel:SetText("|cffd4af37"..PBM_L["+ Add Target"].."|r") addBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") -- LichborneAddStatus is created inside outputBox after it is built (see below) addBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(addBtn, "ANCHOR_TOP") - GameTooltip:AddLine("+ Add Target", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Adds target to tracker.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["+ Add Target"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Adds target to tracker."], 0.8, 0.8, 0.8) GameTooltip:Show() end) addBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -320,14 +320,14 @@ local function OnFirstShow() -- Returns name, isNew on success; nil on invalid target. local function AddTargetToTracker() if not UnitExists("target") or not UnitIsPlayer("target") then - LichborneAddStatus:SetText("|cffff4444No player targeted.|r") + LichborneAddStatus:SetText("|cffff4444"..PBM_L["No player targeted."].."|r") return nil end local targetName = UnitName("target") local _, targetClass = UnitClass("target") local cls = targetClass and PBM.CLASS_TOKEN_MAP[targetClass] if not cls then - LichborneAddStatus:SetText("|cffff4444Unknown class: "..(targetClass or "nil").."|r") + LichborneAddStatus:SetText("|cffff4444"..string.format(PBM_L["Unknown class: %s"], targetClass or "nil").."|r") return nil end local c = PBM.CLASS_COLORS[cls] @@ -354,7 +354,7 @@ local function OnFirstShow() end LichborneTrackerDB.rows[slot].name = targetName LichborneTrackerDB.rows[slot].level = UnitLevel("target") - LichborneOutput("|cffC69B3APBM:|r Added "..hex..targetName.."|r ("..cls..")", 1, 0.85, 0) + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r "..string.format(PBM_L["Added %s|r (%s)"], hex..targetName, cls), 1, 0.85, 0) if PBM.State.overviewRowFrames and #PBM.State.overviewRowFrames > 0 then PBM.RefreshOverviewRows() end if PBM.State.rowFrames and #PBM.State.rowFrames > 0 then PBM.RefreshRows() end return targetName, true @@ -368,9 +368,9 @@ local function OnFirstShow() local c = cls and PBM.CLASS_COLORS[cls] local hex = c and string.format("|cff%02x%02x%02x", math.floor(c.r*255), math.floor(c.g*255), math.floor(c.b*255)) or "" if isNew then - LichborneAddStatus:SetText(hex..name.."|r added to Overview tab.") + LichborneAddStatus:SetText(string.format(PBM_L["%s|r added to Overview tab."], hex..name)) else - LichborneAddStatus:SetText(hex..name.."|r already in tracker. Level updated.") + LichborneAddStatus:SetText(string.format(PBM_L["%s|r already in tracker. Level updated."], hex..name)) end end) @@ -392,12 +392,12 @@ local function OnFirstShow() addGroupBtn:SetBackdropBorderColor(0.78, 0.61, 0.23, 0.9) local addGroupLbl = addGroupBtn:CreateFontString(nil, "OVERLAY", "GameFontNormal") addGroupLbl:SetAllPoints(addGroupBtn); addGroupLbl:SetJustifyH("CENTER"); addGroupLbl:SetJustifyV("MIDDLE") - addGroupLbl:SetText("|cffd4af37+ Add Group|r") + addGroupLbl:SetText("|cffd4af37"..PBM_L["+ Add Group"].."|r") addGroupBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") addGroupBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(addGroupBtn, "ANCHOR_TOP") - GameTooltip:AddLine("+ Add Group", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Adds group to tracker.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["+ Add Group"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Adds group to tracker."], 0.8, 0.8, 0.8) GameTooltip:Show() end) addGroupBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -405,7 +405,7 @@ local function OnFirstShow() addGroupBtn:SetScript("OnClick", function() if GetNumRaidMembers() == 0 and GetNumPartyMembers() == 0 then if LichborneAddStatus then - LichborneAddStatus:SetText("|cffff4444Not in a group, or no other members found.|r") + LichborneAddStatus:SetText("|cffff4444"..PBM_L["Not in a group, or no other members found."].."|r") end return end @@ -413,10 +413,10 @@ local function OnFirstShow() AddGroupMembers(function(added, skipped) SetScanActive(false) if LichborneAddStatus then - local lvlNote = skipped > 0 and " Levels updated." or "" - LichborneAddStatus:SetText("|cff44ff44Added "..added.." new, skipped "..skipped.." duplicates."..lvlNote.."|r") + local lvlNote = skipped > 0 and " "..PBM_L["Levels updated."] or "" + LichborneAddStatus:SetText("|cff44ff44"..string.format(PBM_L["Added %d new, skipped %d duplicates.%s"], added, skipped, lvlNote).."|r") end - LichborneOutput("|cffC69B3APBM:|r Group scan complete. Added: "..added..", Skipped: "..skipped..(skipped > 0 and ". Levels updated." or ""), 1, 0.85, 0) + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r "..string.format(PBM_L["Group scan complete. Added: %d, Skipped: %d%s"], added, skipped, (skipped > 0 and PBM_L[". Levels updated."] or "")), 1, 0.85, 0) end) end) @@ -508,15 +508,15 @@ local function OnFirstShow() end -- ── Update Target GS (row y=78, left) ──────────────────── - local gsBtn = MakeTrackerBtn("LichborneUpdateGSBtn", 15, 110, 155, 29, 0.10, 0.40, 0.70, "|cffd4af37+ Add Target Gear|r") + local gsBtn = MakeTrackerBtn("LichborneUpdateGSBtn", 15, 110, 155, 29, 0.10, 0.40, 0.70, "|cffd4af37"..PBM_L["+ Add Target Gear"].."|r") gsBtn:SetScript("OnEnter", function() - GameTooltip:SetOwner(gsBtn,"ANCHOR_TOP"); GameTooltip:AddLine("+ Add Target Gear",0.78,0.61,0.23) - GameTooltip:AddLine("Adds target's gear.",0.8,0.8,0.8) + GameTooltip:SetOwner(gsBtn,"ANCHOR_TOP"); GameTooltip:AddLine(PBM_L["+ Add Target Gear"],0.78,0.61,0.23) + GameTooltip:AddLine(PBM_L["Adds target's gear."],0.8,0.8,0.8) GameTooltip:Show() end) gsBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) gsBtn:SetScript("OnClick", function() - if not UnitExists("target") or not UnitIsPlayer("target") then LichborneAddStatus:SetText("|cffff4444No player targeted.|r"); return end + if not UnitExists("target") or not UnitIsPlayer("target") then LichborneAddStatus:SetText("|cffff4444"..PBM_L["No player targeted."].."|r"); return end local targetName = UnitName("target") local _, targetClassGS = UnitClass("target") local clsGS = targetClassGS and PBM.CLASS_TOKEN_MAP[targetClassGS] @@ -526,7 +526,7 @@ local function OnFirstShow() if row.name and row.name:lower() == targetName:lower() then foundDi = i; break end end if not foundDi then - if not clsGS then LichborneAddStatus:SetText("|cffff4444Unknown class for "..targetName.."|r"); return end + if not clsGS then LichborneAddStatus:SetText("|cffff4444"..string.format(PBM_L["Unknown class for %s"], targetName).."|r"); return end PBM.EnsureClass(clsGS) local idxs = PBM.GetAllClassRows(clsGS) for _, di in ipairs(idxs) do @@ -541,12 +541,12 @@ local function OnFirstShow() LichborneTrackerDB.rows[foundDi].level = UnitLevel("target") if PBM.State.overviewRowFrames and #PBM.State.overviewRowFrames > 0 then PBM.RefreshOverviewRows() end local cA = PBM.CLASS_COLORS[clsGS]; local hA = cA and string.format("|cff%02x%02x%02x",math.floor(cA.r*255),math.floor(cA.g*255),math.floor(cA.b*255)) or "|cffffffff" - LichborneOutput("|cffC69B3APBM:|r Added "..hA..targetName.."|r to tracker.", 1, 0.85, 0) + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r "..string.format(PBM_L["Added %s|r to tracker."], hA..targetName), 1, 0.85, 0) end local rowData = LichborneTrackerDB.rows[foundDi] local c = PBM.CLASS_COLORS[rowData.cls or ""]; local hex = c and string.format("|cff%02x%02x%02x",math.floor(c.r*255),math.floor(c.g*255),math.floor(c.b*255)) or "|cffffffff" - LichborneAddStatus:SetText("Updating Gear for "..hex..targetName.."|r...") - LichborneOutput("|cffC69B3APBM:|r Updating Gear for "..hex..targetName.."|r...", 1, 0.85, 0) + LichborneAddStatus:SetText(string.format(PBM_L["Updating Gear for %s|r..."], hex..targetName)) + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r "..string.format(PBM_L["Updating Gear for %s|r..."], hex..targetName), 1, 0.85, 0) local gsDi = foundDi -- Lock all buttons (including Stop and invite) during single-target scan SetScanActive(true) @@ -568,8 +568,8 @@ local function OnFirstShow() ClearInspectPlayer() SetScanActive(false) if stopBtn then stopBtn:Enable(); stopBtn:SetAlpha(1.0) end - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff4444GS scan timed out.|r") end - LichborneOutput("|cffC69B3APBM:|r |cffff4444Target GS scan timed out.|r", 1, 0.85, 0) + if LichborneAddStatus then LichborneAddStatus:SetText("|cffff4444"..PBM_L["GS scan timed out."].."|r") end + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r |cffff4444"..PBM_L["Target GS scan timed out."].."|r", 1, 0.85, 0) return end if gsPhase == "delay" then @@ -592,16 +592,16 @@ local function OnFirstShow() end) -- ── Update Target Spec (row y=78, right) ────────────────── - local tsBtn = MakeTrackerBtn("LichborneUpdateTargetSpecBtn", 15, 76, 155, 29, 0.10, 0.40, 0.70, "|cffd4af37+ Add Target Spec|r") + local tsBtn = MakeTrackerBtn("LichborneUpdateTargetSpecBtn", 15, 76, 155, 29, 0.10, 0.40, 0.70, "|cffd4af37"..PBM_L["+ Add Target Spec"].."|r") tsBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(tsBtn,"ANCHOR_TOP") - GameTooltip:AddLine("+ Add Target Spec",0.78,0.61,0.23) - GameTooltip:AddLine("Adds targets spec.",0.8,0.8,0.8) + GameTooltip:AddLine(PBM_L["+ Add Target Spec"],0.78,0.61,0.23) + GameTooltip:AddLine(PBM_L["Adds targets spec."],0.8,0.8,0.8) GameTooltip:Show() end) tsBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) tsBtn:SetScript("OnClick", function() - if not UnitExists("target") or not UnitIsPlayer("target") then LichborneAddStatus:SetText("|cffff4444No player targeted.|r"); return end + if not UnitExists("target") or not UnitIsPlayer("target") then LichborneAddStatus:SetText("|cffff4444"..PBM_L["No player targeted."].."|r"); return end local targetName = UnitName("target") local _, targetClassSP = UnitClass("target") local clsSP = targetClassSP and PBM.CLASS_TOKEN_MAP[targetClassSP] @@ -611,7 +611,7 @@ local function OnFirstShow() if row.name and row.name:lower() == targetName:lower() then foundDi = i; break end end if not foundDi then - if not clsSP then LichborneAddStatus:SetText("|cffff4444Unknown class for "..targetName.."|r"); return end + if not clsSP then LichborneAddStatus:SetText("|cffff4444"..string.format(PBM_L["Unknown class for %s"], targetName).."|r"); return end PBM.EnsureClass(clsSP) local idxs = PBM.GetAllClassRows(clsSP) for _, di in ipairs(idxs) do @@ -626,12 +626,12 @@ local function OnFirstShow() LichborneTrackerDB.rows[foundDi].level = UnitLevel("target") if PBM.State.overviewRowFrames and #PBM.State.overviewRowFrames > 0 then PBM.RefreshOverviewRows() end local cA = PBM.CLASS_COLORS[clsSP]; local hA = cA and string.format("|cff%02x%02x%02x",math.floor(cA.r*255),math.floor(cA.g*255),math.floor(cA.b*255)) or "|cffffffff" - LichborneOutput("|cffC69B3APBM:|r Added "..hA..targetName.."|r to tracker.", 1, 0.85, 0) + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r "..string.format(PBM_L["Added %s|r to tracker."], hA..targetName), 1, 0.85, 0) end local rowData = LichborneTrackerDB.rows[foundDi] local c = PBM.CLASS_COLORS[rowData.cls or ""]; local hex = c and string.format("|cff%02x%02x%02x",math.floor(c.r*255),math.floor(c.g*255),math.floor(c.b*255)) or "|cffffffff" - LichborneAddStatus:SetText("Adding Specialization for "..hex..targetName.."|r...") - LichborneOutput("|cffC69B3APBM:|r Adding Specialization for "..hex..targetName.."|r...", 1, 0.85, 0) + LichborneAddStatus:SetText(string.format(PBM_L["Adding Specialization for %s|r..."], hex..targetName)) + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r "..string.format(PBM_L["Adding Specialization for %s|r..."], hex..targetName), 1, 0.85, 0) local spDi = foundDi -- Lock all buttons (including Stop and invite) during single-target scan SetScanActive(true) @@ -653,8 +653,8 @@ local function OnFirstShow() ClearInspectPlayer() SetScanActive(false) if stopBtn then stopBtn:Enable(); stopBtn:SetAlpha(1.0) end - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff4444Specialization scan timed out.|r") end - LichborneOutput("|cffC69B3APBM:|r |cffff4444Target Specialization scan timed out.|r", 1, 0.85, 0) + if LichborneAddStatus then LichborneAddStatus:SetText("|cffff4444"..PBM_L["Specialization scan timed out."].."|r") end + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r |cffff4444"..PBM_L["Target Specialization scan timed out."].."|r", 1, 0.85, 0) return end if spPhase == "delay" then @@ -699,21 +699,21 @@ local function OnFirstShow() else stopInv:Enable(); stopInv:SetAlpha(1.0) end end end - local uggsBtn = MakeTrackerBtn("LichborneUpdateGroupGSBtn", 175, 110, 155, 29, 0.10, 0.40, 0.70, "|cffd4af37+ Add Group Gear|r") + local uggsBtn = MakeTrackerBtn("LichborneUpdateGroupGSBtn", 175, 110, 155, 29, 0.10, 0.40, 0.70, "|cffd4af37"..PBM_L["+ Add Group Gear"].."|r") uggsBtn:SetScript("OnEnter", function() - GameTooltip:SetOwner(uggsBtn,"ANCHOR_TOP"); GameTooltip:AddLine("+ Add Group Gear",0.78,0.61,0.23) - GameTooltip:AddLine("Adds members gear.",0.8,0.8,0.8) + GameTooltip:SetOwner(uggsBtn,"ANCHOR_TOP"); GameTooltip:AddLine(PBM_L["+ Add Group Gear"],0.78,0.61,0.23) + GameTooltip:AddLine(PBM_L["Adds members gear."],0.8,0.8,0.8) GameTooltip:Show() end) uggsBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) uggsBtn:SetScript("OnClick", function() local playerName = UnitName("player") if GetNumRaidMembers() == 0 and GetNumPartyMembers() == 0 then - LichborneAddStatus:SetText("|cffff4444Not in a group.|r"); return + LichborneAddStatus:SetText("|cffff4444"..PBM_L["Not in a group."].."|r"); return end SetScanActive(true) PBM.State.LichborneGroupScanActive = true - LichborneAddStatus:SetText("Adding group members first...") + LichborneAddStatus:SetText(PBM_L["Adding group members first..."]) AddGroupMembers(function(added, skipped) if not PBM.State.LichborneGroupScanActive then SetScanActive(false); return end -- Now build unit list and run GS scan @@ -724,10 +724,11 @@ local function OnFirstShow() elseif GetNumPartyMembers() > 0 then for i = 1, GetNumPartyMembers() do local unit="party"..i; if UnitExists(unit) then units[#units+1]=unit end end end - if #units == 0 then SetScanActive(false); LichborneAddStatus:SetText("|cffff4444No group members found.|r"); return end + if #units == 0 then SetScanActive(false); LichborneAddStatus:SetText("|cffff4444"..PBM_L["No group members found."].."|r"); return end local totalTime = math.ceil(#units*2.5) - LichborneAddStatus:SetText("|cffff9900Added "..added.." new, skipped "..skipped.." duplicates"..(skipped > 0 and ". Levels updated." or ".").."\nInspecting "..#units.." players (~"..totalTime.."s)...|r") - LichborneOutput("|cffC69B3APBM:|r Group synced (+"..added..", skipped "..skipped..(skipped > 0 and ". Levels updated." or "")..").\nStarting GS scan for "..#units.." players.", 1, 0.85, 0) + local lvlNote = skipped > 0 and PBM_L[". Levels updated."] or "." + LichborneAddStatus:SetText("|cffff9900"..string.format(PBM_L["Added %d new, skipped %d duplicates%s\nInspecting %d players (~%ds)..."], added, skipped, lvlNote, #units, totalTime).."|r") + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r "..string.format(PBM_L["Group synced (+%d, skipped %d%s).\nStarting GS scan for %d players."], added, skipped, (skipped > 0 and PBM_L[". Levels updated."] or ""), #units), 1, 0.85, 0) local scanGsStartTime = GetTime() -- PBM.DBG: group scan timing local idx,elapsed,inspecting = 1,0,false local gFrame = CreateFrame("Frame") @@ -747,8 +748,8 @@ local function OnFirstShow() gFrame:SetScript("OnUpdate",nil) PBM.State.LichborneGroupScanActive = false SetScanActive(false) - LichborneAddStatus:SetText("|cff44ff44Group GS update complete!|r") - LichborneOutput("|cffC69B3APBM:|r |cff44ff44Group GS update complete.|r", 1, 0.85, 0) + LichborneAddStatus:SetText("|cff44ff44"..PBM_L["Group GS update complete!"].."|r") + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r |cff44ff44"..PBM_L["Group GS update complete."].."|r", 1, 0.85, 0) PBM.DBG("|cff44ff44Group GS scan done|r - "..#units.." units, elapsed |cffffff88"..string.format("%.1f", GetTime()-scanGsStartTime).."s|r") PBM.RefreshRows(); return end @@ -757,8 +758,8 @@ local function OnFirstShow() if not targetName then PBM.DBG("|cffff4444[NIL]|r UnitName("..unit..") returned nil - skipping"); idx=idx+1; return end local foundDi = nil for i, row in ipairs(LichborneTrackerDB.rows) do if row.name and row.name:lower()==targetName:lower() then foundDi=i; break end end - if not foundDi then LichborneOutput("|cffC69B3APBM:|r Skipping "..tostring(targetName).." (not tracked)",1,0.6,0.3); idx=idx+1; return end - LichborneAddStatus:SetText("Updating Gear for |cffffff88"..tostring(targetName).."|r... ("..(idx).."/"..#units..")") + if not foundDi then LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r "..string.format(PBM_L["Skipping %s (not tracked)"], tostring(targetName)),1,0.6,0.3); idx=idx+1; return end + LichborneAddStatus:SetText(string.format(PBM_L["Updating Gear for |cffffff88%s|r... (%d/%d)"], tostring(targetName), idx, #units)) PBM.State.LichborneInspectTarget = foundDi; PBM.State.LichborneInspectUnit = unit PBM.DBG("InspectUnit("..unit..") -> group GS for |cffffff88"..tostring(targetName).."|r ("..idx.."/"..#units..") UnitExists=|cffffff88"..tostring(UnitExists(unit)).."|r InRange=|cffffff88"..tostring(CheckInteractDistance(unit,1)).."|r") InspectUnit(unit); PBM.State.LichborneInspectGUID = UnitGUID(unit); if not PBM.State.LichborneInspectGUID then PBM.DBG("|cffff4444[NIL]|r UnitGUID("..unit..")=nil — GUID capture skipped") end; PBM.State.inspectWait=0; idx=idx+1; inspecting=true; elapsed=0 @@ -767,21 +768,21 @@ local function OnFirstShow() end) -- ── Update Group Spec (row y=44, right) ─────────────────── - local ugsBtn = MakeTrackerBtn("LichborneUpdateGroupSpecBtn", 175, 76, 155, 29, 0.10, 0.40, 0.70, "|cffd4af37+ Add Group Spec|r") + local ugsBtn = MakeTrackerBtn("LichborneUpdateGroupSpecBtn", 175, 76, 155, 29, 0.10, 0.40, 0.70, "|cffd4af37"..PBM_L["+ Add Group Spec"].."|r") ugsBtn:SetScript("OnEnter", function() - GameTooltip:SetOwner(ugsBtn,"ANCHOR_TOP"); GameTooltip:AddLine("+ Add Group Spec",0.78,0.61,0.23) - GameTooltip:AddLine("Adds members spec.",0.8,0.8,0.8) + GameTooltip:SetOwner(ugsBtn,"ANCHOR_TOP"); GameTooltip:AddLine(PBM_L["+ Add Group Spec"],0.78,0.61,0.23) + GameTooltip:AddLine(PBM_L["Adds members spec."],0.8,0.8,0.8) GameTooltip:Show() end) ugsBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) ugsBtn:SetScript("OnClick", function() local playerName = UnitName("player") if GetNumRaidMembers() == 0 and GetNumPartyMembers() == 0 then - LichborneAddStatus:SetText("|cffff4444Not in a group.|r"); return + LichborneAddStatus:SetText("|cffff4444"..PBM_L["Not in a group."].."|r"); return end SetScanActive(true) PBM.State.LichborneGroupScanActive = true - LichborneAddStatus:SetText("Adding group members first...") + LichborneAddStatus:SetText(PBM_L["Adding group members first..."]) AddGroupMembers(function(added, skipped) if not PBM.State.LichborneGroupScanActive then SetScanActive(false); return end -- Now build unit list and run Spec scan @@ -792,10 +793,11 @@ local function OnFirstShow() elseif GetNumPartyMembers() > 0 then for i = 1, GetNumPartyMembers() do local unit="party"..i; if UnitExists(unit) then units[#units+1]=unit end end end - if #units == 0 then SetScanActive(false); LichborneAddStatus:SetText("|cffff4444No group members found.|r"); return end + if #units == 0 then SetScanActive(false); LichborneAddStatus:SetText("|cffff4444"..PBM_L["No group members found."].."|r"); return end local totalTime = math.ceil(#units*3) - LichborneAddStatus:SetText("|cffff9900Added "..added.." new, skipped "..skipped.." duplicates"..(skipped > 0 and ". Levels updated." or ".").."\nReading Specialization for "..#units.." players (~"..totalTime.."s)...|r") - LichborneOutput("|cffC69B3APBM:|r Group synced (+"..added..", skipped "..skipped..(skipped > 0 and ". Levels updated." or "")..").\nStarting Specialization scan for "..#units.." players.", 1, 0.85, 0) + local lvlNote = skipped > 0 and PBM_L[". Levels updated."] or "." + LichborneAddStatus:SetText("|cffff9900"..string.format(PBM_L["Added %d new, skipped %d duplicates%s\nReading Specialization for %d players (~%ds)..."], added, skipped, lvlNote, #units, totalTime).."|r") + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r "..string.format(PBM_L["Group synced (+%d, skipped %d%s).\nStarting Specialization scan for %d players."], added, skipped, (skipped > 0 and PBM_L[". Levels updated."] or ""), #units), 1, 0.85, 0) local scanSpecStartTime = GetTime() -- PBM.DBG: group scan timing local idx,elapsed,inspecting = 1,0,false local sFrame = CreateFrame("Frame") @@ -816,8 +818,8 @@ local function OnFirstShow() sFrame:SetScript("OnUpdate",nil) PBM.State.LichborneGroupScanActive = false SetScanActive(false) - LichborneAddStatus:SetText("|cff44ff44Group Specialization update complete!|r") - LichborneOutput("|cffC69B3APBM:|r |cff44ff44Group Specialization update complete.|r", 1, 0.85, 0) + LichborneAddStatus:SetText("|cff44ff44"..PBM_L["Group Specialization update complete!"].."|r") + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r |cff44ff44"..PBM_L["Group Specialization update complete."].."|r", 1, 0.85, 0) PBM.DBG("|cff44ff44Group Spec scan done|r - "..#units.." units, elapsed |cffffff88"..string.format("%.1f", GetTime()-scanSpecStartTime).."s|r") PBM.RefreshRows(); if PBM.State.raidRowFrames and #PBM.State.raidRowFrames > 0 then PBM.RefreshRaidRows() end; return end @@ -826,8 +828,8 @@ local function OnFirstShow() if not targetName then PBM.DBG("|cffff4444[NIL]|r UnitName("..unit..") returned nil - skipping"); idx=idx+1; return end local foundDi = nil for i, row in ipairs(LichborneTrackerDB.rows) do if row.name and row.name:lower()==targetName:lower() then foundDi=i; break end end - if not foundDi then LichborneOutput("|cffC69B3APBM:|r Skipping "..tostring(targetName).." (not tracked)",1,0.6,0.3); idx=idx+1; return end - LichborneAddStatus:SetText("Reading Specialization |cffffff88"..tostring(targetName).."|r... ("..(idx).."/"..#units..")") + if not foundDi then LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r "..string.format(PBM_L["Skipping %s (not tracked)"], tostring(targetName)),1,0.6,0.3); idx=idx+1; return end + LichborneAddStatus:SetText(string.format(PBM_L["Reading Specialization |cffffff88%s|r... (%d/%d)"], tostring(targetName), idx, #units)) PBM.State.LichborneSpecTarget = foundDi; PBM.State.LichborneInspectUnit = unit if LichborneTrackerDB.rows[foundDi] then LichborneTrackerDB.rows[foundDi].spec="" end PBM.DBG("InspectUnit("..unit..") -> group Spec for |cffffff88"..tostring(targetName).."|r ("..idx.."/"..#units..") UnitExists=|cffffff88"..tostring(UnitExists(unit)).."|r InRange=|cffffff88"..tostring(CheckInteractDistance(unit,1)).."|r") @@ -837,12 +839,12 @@ local function OnFirstShow() end) -- ── Stop Inspect button (below Get Group Spec) ──────────── - local stopInspectBtn = MakeTrackerBtn("LichborneStopInspectBtn", 15, 8, 155, 29, 0.90, 0.20, 0.20, "|cffd4af37Stop Scan|r") + local stopInspectBtn = MakeTrackerBtn("LichborneStopInspectBtn", 15, 8, 155, 29, 0.90, 0.20, 0.20, PBM_L["|cffd4af37Stop Scan|r"]) stopInspectBtn:SetBackdropColor(0.90*0.30, 0.20*0.30, 0.20*0.30, 1) stopInspectBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(stopInspectBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Stop Scan", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Cancels the running Gear or Spec scan.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Stop Scan"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Cancels the running Gear or Spec scan."], 0.8, 0.8, 0.8) GameTooltip:Show() end) stopInspectBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -856,8 +858,8 @@ local function OnFirstShow() PBM.State.LichborneGroupScanActive = false PBM.State.ipQueryActive = false SetScanActive(false) - LichborneAddStatus:SetText("|cffff4444Scan stopped.|r") - LichborneOutput("|cffC69B3APBM:|r |cffff4444Scan stopped.|r", 1, 0.85, 0) + LichborneAddStatus:SetText(PBM_L["|cffff4444Scan stopped.|r"]) + LichborneOutput(PBM_L["|cffC69B3APBM:|r |cffff4444Scan stopped.|r"], 1, 0.85, 0) end) -- Row y=10: Add Target / Add Group (existing buttons stay here) @@ -871,7 +873,7 @@ local function OnFirstShow() clsbg:SetAllPoints(clsFrame); clsbg:SetTexture(0.05, 0.07, 0.13, 1) local clsTitle = clsFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") clsTitle:SetPoint("LEFT", clsFrame, "LEFT", 4, 0) - clsTitle:SetText("|cffC69B3AAvg GS:|r"); clsTitle:SetWidth(52) + clsTitle:SetText(PBM_L["|cffC69B3AAvg GS:|r"]); clsTitle:SetWidth(52) LichborneCountLabels = {} local cRosterBlockW = 130 local cswTotalW = 1086 - 56 - 4 - cRosterBlockW @@ -897,13 +899,13 @@ local function OnFirstShow() GameTooltip:SetOwner(csw, "ANCHOR_TOP") local gs = PBM.GetClassAvgGS(cls) GameTooltip:AddLine(PBM.TAB_LABELS[cls], c.r, c.g, c.b) - GameTooltip:AddLine("Average gear score of all tracked "..PBM.TAB_LABELS[cls].."s.", 1,1,1) + GameTooltip:AddLine(string.format(PBM_L["Average gear score of all tracked %ss."], PBM.TAB_LABELS[cls]), 1,1,1) if gs > 0 then - GameTooltip:AddLine("Current: |cffd4af37"..gs.."|r", 1,1,1) + GameTooltip:AddLine(string.format(PBM_L["Current: |cffd4af37%d|r"], gs), 1,1,1) else - GameTooltip:AddLine("No gear data yet.", 0.6,0.6,0.6) + GameTooltip:AddLine(PBM_L["No gear data yet."], 0.6,0.6,0.6) end - GameTooltip:AddLine("Click to switch to this tab.", 0.5,0.5,0.5) + GameTooltip:AddLine(PBM_L["Click to switch to this tab."], 0.5,0.5,0.5) GameTooltip:Show() end) csw:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -930,14 +932,14 @@ local function OnFirstShow() local rosterGsLbl = rosterGsBlock:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") rosterGsLbl:SetAllPoints(rosterGsBlock) rosterGsLbl:SetJustifyH("CENTER"); rosterGsLbl:SetJustifyV("MIDDLE") - rosterGsLbl:SetText("|cffC69B3ARoster GS:|r |cff555555--|r") + rosterGsLbl:SetText(PBM_L["|cffC69B3ARoster GS:|r |cff555555--|r"]) PBM.State.LichborneRosterGsLabel = rosterGsLbl rosterGsBlock:EnableMouse(true) rosterGsBlock:SetScript("OnEnter", function() GameTooltip:SetOwner(rosterGsBlock, "ANCHOR_TOP") - GameTooltip:AddLine("Roster Avg GS", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Average gear score across your", 1,1,1) - GameTooltip:AddLine("entire tracked roster.", 1,1,1) + GameTooltip:AddLine(PBM_L["Roster Avg GS"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Average gear score across your"], 1,1,1) + GameTooltip:AddLine(PBM_L["entire tracked roster."], 1,1,1) GameTooltip:Show() end) rosterGsBlock:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -977,23 +979,23 @@ local function OnFirstShow() return btn end - local maintBtn = MakeSimpleBtn("LichborneMaintBtn", "|cffd4af37+ Full Group Scan|r", + local maintBtn = MakeSimpleBtn("LichborneMaintBtn", PBM_L["|cffd4af37+ Full Group Scan|r"], 0.2, 0.5, 0.9, 175, 8, 155, { - {"Full Group Scan",0.78,0.61,0.23}, - {"Long scan is used for first time setup",0.8,0.8,0.8}, - {"or reconfiguration of raid. Performs",0.8,0.8,0.8}, - {"gear and spec scan. Allow 6s per",0.8,0.8,0.8}, - {"character.",0.8,0.8,0.8}, + {PBM_L["Full Group Scan"],0.78,0.61,0.23}, + {PBM_L["Long scan is used for first time setup"],0.8,0.8,0.8}, + {PBM_L["or reconfiguration of raid. Performs"],0.8,0.8,0.8}, + {PBM_L["gear and spec scan. Allow 6s per"],0.8,0.8,0.8}, + {PBM_L["character."],0.8,0.8,0.8}, }) maintBtn:SetScript("OnClick", function() local playerName = UnitName("player") if GetNumRaidMembers() == 0 and GetNumPartyMembers() == 0 then - LichborneAddStatus:SetText("|cffff4444Not in a group.|r"); return + LichborneAddStatus:SetText(PBM_L["|cffff4444Not in a group.|r"]); return end SetScanActive(true) PBM.State.LichborneGroupScanActive = true - LichborneAddStatus:SetText("Adding group members...") + LichborneAddStatus:SetText(PBM_L["Adding group members..."]) AddGroupMembers(function(added, skipped) -- Abort if Stop Scan was pressed during the add phase if not PBM.State.LichborneGroupScanActive then return end @@ -1015,13 +1017,13 @@ local function OnFirstShow() end if #units == 0 then SetScanActive(false) - LichborneAddStatus:SetText("|cffff4444No group members found.|r") + LichborneAddStatus:SetText(PBM_L["|cffff4444No group members found.|r"]) return end -- ── Phase 2: GS scan ────────────────────────────────────────── local totalTime = math.ceil(#units * 6) - LichborneAddStatus:SetText("|cffff9900Added "..added.." new, skipped "..skipped.." duplicates"..(skipped > 0 and ". Levels updated." or ".").."\nFull scan: "..#units.." players (~"..totalTime.."s)...|r") - LichborneOutput("|cffC69B3APBM:|r Full Group Scan started (+"..added..", skipped "..skipped..(skipped > 0 and ". Levels updated." or "")..").\nGS phase: "..#units.." players.", 1, 0.85, 0) + LichborneAddStatus:SetText(string.format(PBM_L["|cffff9900Added %d new, skipped %d duplicates%s\nFull scan: %d players (~%ds)...|r"], added, skipped, (skipped > 0 and PBM_L[". Levels updated."] or "."), #units, totalTime)) + LichborneOutput(string.format(PBM_L["|cffC69B3APBM:|r Full Group Scan started (+%d, skipped %d%s).\nGS phase: %d players."], added, skipped, (skipped > 0 and PBM_L[". Levels updated."] or ""), #units), 1, 0.85, 0) local scanStartTime = GetTime() local idx, elapsed, inspecting = 1, 0, false local gFrame = CreateFrame("Frame") @@ -1041,8 +1043,8 @@ local function OnFirstShow() gFrame:SetScript("OnUpdate", nil) PBM.DBG("|cff44ff44FullScan GS phase done|r — elapsed |cffffff88"..string.format("%.1f", GetTime()-scanStartTime).."s|r") -- ── Phase 3: Spec scan ──────────────────────────────── - LichborneAddStatus:SetText("|cffff9900GS done. Starting Specialization scan ("..#units.." players)...|r") - LichborneOutput("|cffC69B3APBM:|r GS phase complete. Starting Specialization phase.", 1, 0.85, 0) + LichborneAddStatus:SetText(string.format(PBM_L["|cffff9900GS done. Starting Specialization scan (%d players)...|r"], #units)) + LichborneOutput(PBM_L["|cffC69B3APBM:|r GS phase complete. Starting Specialization phase."], 1, 0.85, 0) local sIdx, sElapsed, sInspecting = 1, 0, false local sFrame = CreateFrame("Frame") activeInspectFrame = sFrame @@ -1061,8 +1063,8 @@ local function OnFirstShow() sFrame:SetScript("OnUpdate", nil) PBM.State.LichborneGroupScanActive = false SetScanActive(false) - LichborneAddStatus:SetText("|cff44ff44Full Group Scan complete!|r") - LichborneOutput("|cffC69B3APBM:|r |cff44ff44Full Group Scan complete.|r", 1, 0.85, 0) + LichborneAddStatus:SetText(PBM_L["|cff44ff44Full Group Scan complete!|r"]) + LichborneOutput(PBM_L["|cffC69B3APBM:|r |cff44ff44Full Group Scan complete.|r"], 1, 0.85, 0) PBM.DBG("|cff44ff44FullScan complete|r — total elapsed |cffffff88"..string.format("%.1f", GetTime()-scanStartTime).."s|r") PBM.RefreshRows(); if PBM.State.raidRowFrames and #PBM.State.raidRowFrames > 0 then PBM.RefreshRaidRows() end -- Trigger group strategies query for all scanned members @@ -1078,7 +1080,7 @@ local function OnFirstShow() end end if strCount > 0 then - LichborneAddStatus:SetText("|cff44ff44Full Group Scan complete!|r |cffd4af37Fetching strategies: "..strCount.." members...|r") + LichborneAddStatus:SetText(string.format(PBM_L["|cff44ff44Full Group Scan complete!|r |cffd4af37Fetching strategies: %d members...|r"], strCount)) end return end @@ -1090,10 +1092,10 @@ local function OnFirstShow() if row.name and row.name:lower() == targetName:lower() then foundDi = i; break end end if not foundDi then - LichborneOutput("|cffC69B3APBM:|r Skipping "..tostring(targetName).." (not tracked)", 1, 0.6, 0.3) + LichborneOutput(string.format(PBM_L["|cffC69B3APBM:|r Skipping %s (not tracked)"], tostring(targetName)), 1, 0.6, 0.3) sIdx = sIdx + 1; return end - LichborneAddStatus:SetText("Specialization scan |cffffff88"..tostring(targetName).."|r... ("..sIdx.."/"..#units..")") + LichborneAddStatus:SetText(string.format(PBM_L["Specialization scan |cffffff88%s|r... (%d/%d)"], tostring(targetName), sIdx, #units)) PBM.State.LichborneSpecTarget = foundDi; PBM.State.LichborneInspectUnit = unit if LichborneTrackerDB.rows[foundDi] then LichborneTrackerDB.rows[foundDi].spec = "" end PBM.DBG("InspectUnit("..unit..") -> FullScan Spec for |cffffff88"..tostring(targetName).."|r ("..sIdx.."/"..#units..")") @@ -1109,10 +1111,10 @@ local function OnFirstShow() if row.name and row.name:lower() == targetName:lower() then foundDi = i; break end end if not foundDi then - LichborneOutput("|cffC69B3APBM:|r Skipping "..tostring(targetName).." (not tracked)", 1, 0.6, 0.3) + LichborneOutput(string.format(PBM_L["|cffC69B3APBM:|r Skipping %s (not tracked)"], tostring(targetName)), 1, 0.6, 0.3) idx = idx + 1; return end - LichborneAddStatus:SetText("Updating Gear for |cffffff88"..tostring(targetName).."|r... ("..idx.."/"..#units..")") + LichborneAddStatus:SetText(string.format(PBM_L["Updating Gear for |cffffff88%s|r... (%d/%d)"], tostring(targetName), idx, #units)) PBM.State.LichborneInspectTarget = foundDi; PBM.State.LichborneInspectUnit = unit PBM.DBG("InspectUnit("..unit..") -> FullScan GS for |cffffff88"..tostring(targetName).."|r ("..idx.."/"..#units..")") InspectUnit(unit); PBM.State.LichborneInspectGUID = UnitGUID(unit); if not PBM.State.LichborneInspectGUID then PBM.DBG("|cffff4444[NIL]|r UnitGUID("..unit..")=nil — GUID capture skipped") end; PBM.State.inspectWait = 0; idx = idx + 1; inspecting = true; elapsed = 0 @@ -1120,14 +1122,14 @@ local function OnFirstShow() end) end) - local loginBtn = MakeSimpleBtn("LichborneLoginBtn", "|cffd4af37Log in All Bots|r", + local loginBtn = MakeSimpleBtn("LichborneLoginBtn", PBM_L["|cffd4af37Log in All Bots|r"], 0.1, 0.6, 0.2, 335, 110, - 155, {{"Log in All Bots",0.78,0.61,0.23},{".playerbots bot add *",0.8,0.8,0.8}}) + 155, {{PBM_L["Log in All Bots"],0.78,0.61,0.23},{PBM_L[".playerbots bot add *"],0.8,0.8,0.8}}) loginBtn:SetScript("OnClick", function() SendChatMessage(".playerbots bot add *", "PARTY") end) - local logoutBtn = MakeSimpleBtn("LichborneLogoutBtn", "|cffd4af37Log Out All Bots|r", + local logoutBtn = MakeSimpleBtn("LichborneLogoutBtn", PBM_L["|cffd4af37Log Out All Bots|r"], 0.90, 0.20, 0.20, 335, 76, - 155, {{"Log Out All Bots",0.78,0.61,0.23},{".playerbots bot remove *",0.8,0.8,0.8}}) + 155, {{PBM_L["Log Out All Bots"],0.78,0.61,0.23},{PBM_L[".playerbots bot remove *"],0.8,0.8,0.8}}) logoutBtn:SetScript("OnClick", function() SendChatMessage(".playerbots bot remove *", "PARTY") end) -- ── Remove Orphaned Bots button ──────────────────────────── @@ -1143,13 +1145,13 @@ local function OnFirstShow() orphanedBotsBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") local orphanedBotsLbl = orphanedBotsBtn:CreateFontString(nil, "OVERLAY", "GameFontNormal") orphanedBotsLbl:SetAllPoints(orphanedBotsBtn); orphanedBotsLbl:SetJustifyH("CENTER"); orphanedBotsLbl:SetJustifyV("MIDDLE") - orphanedBotsLbl:SetText("|cffd4af37Remove Orphaned Bots|r") + orphanedBotsLbl:SetText(PBM_L["|cffd4af37Remove Orphaned Bots|r"]) orphanedBotsBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(orphanedBotsBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Remove Orphaned Bots", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Logs out all bots in your Overview tab", 0.8, 0.8, 0.8) - GameTooltip:AddLine("that are not currently in your", 0.8, 0.8, 0.8) - GameTooltip:AddLine("group or raid.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Remove Orphaned Bots"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Logs out all bots in your Overview tab"], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["that are not currently in your"], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["group or raid."], 0.8, 0.8, 0.8) GameTooltip:Show() end) orphanedBotsBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -1195,12 +1197,12 @@ local function OnFirstShow() end end if #botNames == 0 then - LichborneOutput("|cffC69B3APBM:|r No orphaned bots found.", 1, 0.5, 0.5) - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff4444No orphaned bots found.|r") end + LichborneOutput(PBM_L["|cffC69B3APBM:|r No orphaned bots found."], 1, 0.5, 0.5) + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cffff4444No orphaned bots found.|r"]) end return end - LichborneOutput("|cffC69B3APBM:|r Logging out "..#botNames.." orphaned bots...", 1, 0.85, 0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff9900Logging out "..#botNames.." orphaned bots...") end + LichborneOutput(string.format(PBM_L["|cffC69B3APBM:|r Logging out %d orphaned bots..."], #botNames), 1, 0.85, 0) + if LichborneAddStatus then LichborneAddStatus:SetText(string.format(PBM_L["|cffff9900Logging out %d orphaned bots..."], #botNames)) end SetScanActive(true) local stopBtn = _G["LichborneStopInspectBtn"] if stopBtn then stopBtn:Disable(); stopBtn:SetAlpha(0.35) end @@ -1216,8 +1218,8 @@ local function OnFirstShow() SetScanActive(false) local stopBtn2 = _G["LichborneStopInspectBtn"] if stopBtn2 then stopBtn2:Enable(); stopBtn2:SetAlpha(1.0) end - LichborneOutput("|cffC69B3APBM:|r |cff44ff44All "..#botNames.." orphaned bots logged out.|r", 1, 0.85, 0) - if LichborneAddStatus then LichborneAddStatus:SetText("|cff44ff44Orphaned bots logged out ("..#botNames..").|r") end + LichborneOutput(string.format(PBM_L["|cffC69B3APBM:|r |cff44ff44All %d orphaned bots logged out.|r"], #botNames), 1, 0.85, 0) + if LichborneAddStatus then LichborneAddStatus:SetText(string.format(PBM_L["|cff44ff44Orphaned bots logged out (%d).|r"], #botNames)) end return end local bname = botNames[orphanIdx] @@ -1237,14 +1239,14 @@ local function OnFirstShow() ipTiersBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") local ipTiersLbl = ipTiersBtn:CreateFontString(nil, "OVERLAY", "GameFontNormal") ipTiersLbl:SetAllPoints(ipTiersBtn); ipTiersLbl:SetJustifyH("CENTER"); ipTiersLbl:SetJustifyV("MIDDLE") - ipTiersLbl:SetText("|cffd4af37+ Add IP Tiers|r") + ipTiersLbl:SetText(PBM_L["|cffd4af37+ Add IP Tiers|r"]) ipTiersBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(ipTiersBtn, "ANCHOR_TOP") - GameTooltip:AddLine("+ Add IP Tiers", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Adds Individual Progression Tiers.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("To display tiers, enable |cffd4af37Show IP Tiers|r in the filter bar.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("Tier is shown in the number column next to each character.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("Requires |cffFF8C00mod-Individual-Progression|r", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["+ Add IP Tiers"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Adds Individual Progression Tiers."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["To display tiers, enable |cffd4af37Show IP Tiers|r in the filter bar."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Tier is shown in the number column next to each character."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Requires |cffFF8C00mod-Individual-Progression|r"], 0.8, 0.8, 0.8) GameTooltip:Show() end) ipTiersBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -1273,7 +1275,7 @@ local function OnFirstShow() ipTiersBtn:SetScript("OnClick", function() SetScanActive(true) - LichborneAddStatus:SetText("Adding group members first...") + LichborneAddStatus:SetText(PBM_L["Adding group members first..."]) AddGroupMembers(function(added, skipped) -- Always include self, then add group members (deduped) local selfName = UnitName("player") @@ -1293,13 +1295,13 @@ local function OnFirstShow() end if #members == 0 then SetScanActive(false) - if LichborneAddStatus then LichborneAddStatus:SetText("|cffff4444Could not determine any targets.|r") end + if LichborneAddStatus then LichborneAddStatus:SetText(PBM_L["|cffff4444Could not determine any targets.|r"]) end return end if not LichborneTrackerDB.ipData then LichborneTrackerDB.ipData = {} end PBM.State.ipQueryActive = true if LichborneAddStatus then - LichborneAddStatus:SetText("|cffd4af37Added "..added.." new, skipped "..skipped..". Querying IP tiers...|r") + LichborneAddStatus:SetText(string.format(PBM_L["|cffd4af37Added %d new, skipped %d. Querying IP tiers...|r"], added, skipped)) end local idx = 1 local wait = 0 @@ -1314,14 +1316,14 @@ local function OnFirstShow() PBM.State.ipQueryActive = false SetScanActive(false) if LichborneAddStatus then - LichborneAddStatus:SetText("|cff44ff44IP Tier query complete ("..#members.." members).|r") + LichborneAddStatus:SetText(string.format(PBM_L["|cff44ff44IP Tier query complete (%d members).|r"], #members)) end return end local name = members[idx] SendChatMessage(".ip get "..name, "SAY") if LichborneAddStatus then - LichborneAddStatus:SetText("|cffd4af37Querying IP: |r"..name.." ("..idx.."/"..#members..")") + LichborneAddStatus:SetText(string.format(PBM_L["|cffd4af37Querying IP: |r%s (%d/%d)"], name, idx, #members)) end idx = idx + 1 end) @@ -1338,11 +1340,11 @@ local function OnFirstShow() disbandBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") local disbandLbl = disbandBtn:CreateFontString(nil, "OVERLAY", "GameFontNormal") disbandLbl:SetAllPoints(disbandBtn); disbandLbl:SetJustifyH("CENTER"); disbandLbl:SetJustifyV("MIDDLE") - disbandLbl:SetText("|cffd4af37Disband Group|r") + disbandLbl:SetText(PBM_L["|cffd4af37Disband Group|r"]) disbandBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(disbandBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Disband Group", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Removes all bots and leaves the group.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Disband Group"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Removes all bots and leaves the group."], 0.8, 0.8, 0.8) GameTooltip:Show() end) disbandBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -1350,9 +1352,9 @@ local function OnFirstShow() -- Confirmation dialog for Disband Group (standard WoW dialog) if not StaticPopupDialogs["PBM_DISBAND_GROUP"] then StaticPopupDialogs["PBM_DISBAND_GROUP"] = { - text = "Disband Group?\n\nRemoves all bots and leaves the group.\n|cffff4444This cannot be undone.|r", - button1 = "Yes, Disband", - button2 = "Cancel", + text = PBM_L["Disband Group?\n\nRemoves all bots and leaves the group.\n|cffff4444This cannot be undone.|r"], + button1 = PBM_L["Yes, Disband"], + button2 = PBM_L["Cancel"], OnAccept = function() PBM.SetButtonsLocked(true) local function lockExtra(locked) @@ -1365,7 +1367,7 @@ local function OnFirstShow() end end lockExtra(true) - LichborneOutput("|cffC69B3APBM:|r |cffd4af37Disbanding group...|r", 1, 0.85, 0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r |cffd4af37Disbanding group...|r"], 1, 0.85, 0) SendChatMessage(".playerbots bot remove *", "SAY") local waited = 0 local disbFrame = CreateFrame("Frame") @@ -1375,7 +1377,7 @@ local function OnFirstShow() LeaveParty() PBM.SetButtonsLocked(false) lockExtra(false) - LichborneOutput("|cffC69B3APBM:|r |cffd4af37Group disbanded.|r", 1, 0.85, 0) + LichborneOutput(PBM_L["|cffC69B3APBM:|r |cffd4af37Group disbanded.|r"], 1, 0.85, 0) disbFrame:SetScript("OnUpdate", nil) end) end, @@ -1426,12 +1428,12 @@ local function OnFirstShow() end -- ── Top-row strategy buttons + upcoming placeholder ────────── - local strTargetBtn = MakeTrackerBtn("LichborneTargetStrategiesBtn", 15, 42, 155, 29, 0.10, 0.40, 0.70, "|cffd4af37+ Add Target Strategies|r") + local strTargetBtn = MakeTrackerBtn("LichborneTargetStrategiesBtn", 15, 42, 155, 29, 0.10, 0.40, 0.70, PBM_L["|cffd4af37+ Add Target Strategies|r"]) strTargetBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(strTargetBtn, "ANCHOR_TOP") - GameTooltip:AddLine("+ Add Target Strategies", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Adds target to tracker, then uses", 0.8, 0.8, 0.8) - GameTooltip:AddLine("co / nc to acquire strategies.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["+ Add Target Strategies"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Adds target to tracker, then uses"], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["co / nc to acquire strategies."], 0.8, 0.8, 0.8) GameTooltip:Show() end) strTargetBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -1440,21 +1442,21 @@ local function OnFirstShow() if not name then return end PBM.State.joinPending[name] = { step = 1 } PBM.SendToBot("co ?", name) - LichborneAddStatus:SetText("|cffd4af37Resyncing strategies: "..name.."...|r") + LichborneAddStatus:SetText(string.format(PBM_L["|cffd4af37Resyncing strategies: %s...|r"], name)) end) - local strGroupBtn = MakeTrackerBtn("LichborneGroupStrategiesBtn", 175, 42, 155, 29, 0.10, 0.40, 0.70, "|cffd4af37+ Add Group Strategies|r") + local strGroupBtn = MakeTrackerBtn("LichborneGroupStrategiesBtn", 175, 42, 155, 29, 0.10, 0.40, 0.70, PBM_L["|cffd4af37+ Add Group Strategies|r"]) strGroupBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(strGroupBtn, "ANCHOR_TOP") - GameTooltip:AddLine("+ Add Group Strategies", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Adds group to tracker, then uses", 0.8, 0.8, 0.8) - GameTooltip:AddLine("co / nc to acquire strategies.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["+ Add Group Strategies"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Adds group to tracker, then uses"], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["co / nc to acquire strategies."], 0.8, 0.8, 0.8) GameTooltip:Show() end) strGroupBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) strGroupBtn:SetScript("OnClick", function() if GetNumRaidMembers() == 0 and GetNumPartyMembers() == 0 then - LichborneAddStatus:SetText("|cffff4444Not in a group.|r") + LichborneAddStatus:SetText(PBM_L["|cffff4444Not in a group.|r"]) return end SetScanActive(true) @@ -1475,7 +1477,7 @@ local function OnFirstShow() elseif GetNumPartyMembers() > 0 then for i = 1, GetNumPartyMembers() do triggerMember("party"..i) end end - LichborneAddStatus:SetText("|cffd4af37Added "..added..", resyncing strategies: "..count.." members...|r") + LichborneAddStatus:SetText(string.format(PBM_L["|cffd4af37Added %d, resyncing strategies: %d members...|r"], added, count)) end) end) @@ -1492,8 +1494,8 @@ local function OnFirstShow() outputBox:EnableMouse(true) outputBox:SetScript("OnEnter", function() GameTooltip:SetOwner(outputBox, "ANCHOR_TOP") - GameTooltip:AddLine("Output Log", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Scroll up/down with the mouse wheel.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Output Log"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Scroll up/down with the mouse wheel."], 0.8, 0.8, 0.8) GameTooltip:Show() end) outputBox:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -1521,11 +1523,11 @@ local function OnFirstShow() dbgLbl:SetText("|cff888888DBG|r") dbgBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(dbgBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Debug Mode", 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Debug Mode"], 0.78, 0.61, 0.23) if LichborneDebugMode then - GameTooltip:AddLine("Currently: |cff44ff44ON|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Currently: |cff44ff44ON|r"], 1, 1, 1) else - GameTooltip:AddLine("Currently: |cffff4444OFF|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Currently: |cffff4444OFF|r"], 1, 1, 1) end GameTooltip:Show() end) @@ -1536,12 +1538,12 @@ local function OnFirstShow() dbgLbl:SetText("|cff44ff44DBG|r") dbgBtn:SetBackdropColor(0.05, 0.20, 0.05, 1) dbgBtn:SetBackdropBorderColor(0.3, 0.9, 0.3, 0.9) - LichborneOutput("|cff44ff44[PBM.DBG] Debug mode ON — inspect logging active.|r") + LichborneOutput(PBM_L["|cff44ff44[PBM.DBG] Debug mode ON — inspect logging active.|r"]) else dbgLbl:SetText("|cff888888DBG|r") dbgBtn:SetBackdropColor(0.10, 0.10, 0.10, 1) dbgBtn:SetBackdropBorderColor(0.5, 0.5, 0.5, 0.8) - LichborneOutput("|cffaaaaaa[PBM.DBG] Debug mode OFF.|r") + LichborneOutput(PBM_L["|cffaaaaaa[PBM.DBG] Debug mode OFF.|r"]) end end) @@ -1562,11 +1564,11 @@ local function OnFirstShow() expLbl:SetText("|cffaaaaaa/\\|r") expBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(expBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Output Box Size", 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Output Box Size"], 0.78, 0.61, 0.23) if outputExpanded then - GameTooltip:AddLine("Click to collapse the output box.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Click to collapse the output box."], 0.8, 0.8, 0.8) else - GameTooltip:AddLine("Click to expand the output box upward.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Click to expand the output box upward."], 0.8, 0.8, 0.8) end GameTooltip:Show() end) @@ -1609,23 +1611,23 @@ local function OnFirstShow() exportLbl:SetText("|cffd4af37>>|r") exportBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(exportBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Export Tracker Data", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Saves all tracker data to a text string.", 1, 1, 1) - GameTooltip:AddLine("Warning: Opening this window may", 1, 0.2, 0.2) - GameTooltip:AddLine("take several minutes.", 1, 0.2, 0.2) - GameTooltip:AddLine("Exports characters, raid rosters, and role data.", 1, 0.55, 0.0) - GameTooltip:AddLine("Gear data is excluded — a fresh scan is needed.", 1, 0.55, 0.0) + GameTooltip:AddLine(PBM_L["Export Tracker Data"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Saves all tracker data to a text string."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Warning: Opening this window may"], 1, 0.2, 0.2) + GameTooltip:AddLine(PBM_L["take several minutes."], 1, 0.2, 0.2) + GameTooltip:AddLine(PBM_L["Exports characters, raid rosters, and role data."], 1, 0.55, 0.0) + GameTooltip:AddLine(PBM_L["Gear data is excluded — a fresh scan is needed."], 1, 0.55, 0.0) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("On Account A:", 0.78, 0.61, 0.23) - GameTooltip:AddLine("1. Click >> to open the export window.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("2. Click 'Select All' to highlight the text.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("3. Press Ctrl+C to copy.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["On Account A:"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["1. Click >> to open the export window."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["2. Click 'Select All' to highlight the text."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["3. Press Ctrl+C to copy."], 0.8, 0.8, 0.8) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("On Account B:", 0.78, 0.61, 0.23) - GameTooltip:AddLine("4. Log in and open Lichborne.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("5. Click << to open the import window.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("6. Click Select, press Ctrl+V to paste.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("7. Click Import to apply the data.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["On Account B:"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["4. Log in and open Lichborne."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["5. Click << to open the import window."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["6. Click Select, press Ctrl+V to paste."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["7. Click Import to apply the data."], 0.8, 0.8, 0.8) GameTooltip:Show() end) exportBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -1644,19 +1646,19 @@ local function OnFirstShow() importLbl:SetText("|cffd4af37<<|r") importBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(importBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Import Tracker Data", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Loads tracker data from a copied export string.", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Import Tracker Data"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Loads tracker data from a copied export string."], 1, 1, 1) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("On Account A:", 0.78, 0.61, 0.23) - GameTooltip:AddLine("1. Click >> to open the export window.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("2. Click 'Select All' to highlight the text.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("3. Press Ctrl+C to copy.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["On Account A:"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["1. Click >> to open the export window."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["2. Click 'Select All' to highlight the text."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["3. Press Ctrl+C to copy."], 0.8, 0.8, 0.8) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("On Account B:", 0.78, 0.61, 0.23) - GameTooltip:AddLine("4. Log in and open Lichborne.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("5. Click << to open this import window.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("6. Click Select, press Ctrl+V to paste.", 0.8, 0.8, 0.8) - GameTooltip:AddLine("7. Click Import to apply the data.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["On Account B:"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["4. Log in and open Lichborne."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["5. Click << to open this import window."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["6. Click Select, press Ctrl+V to paste."], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["7. Click Import to apply the data."], 0.8, 0.8, 0.8) GameTooltip:Show() end) importBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -1676,7 +1678,7 @@ local function OnFirstShow() local expTitle = exportPopup:CreateFontString(nil,"OVERLAY","GameFontNormal") expTitle:SetPoint("TOP",exportPopup,"TOP",0,-12) - expTitle:SetText("|cffC69B3AExport Tracker Data|r") + expTitle:SetText("|cffC69B3A" .. PBM_L["Export Tracker Data"] .. "|r") -- Dark inset behind the EditBox (no border — direct fill) local expBoxBg = CreateFrame("Frame", nil, exportPopup) @@ -1705,7 +1707,7 @@ local function OnFirstShow() local expSelectBtn = CreateFrame("Button",nil,exportPopup,"UIPanelButtonTemplate") expSelectBtn:SetSize(110,24); expSelectBtn:SetPoint("BOTTOMLEFT",exportPopup,"BOTTOMLEFT",8,10) - expSelectBtn:SetText("Select All") + expSelectBtn:SetText(PBM_L["Select All"]) expSelectBtn:SetFrameLevel(exportPopup:GetFrameLevel() + 3) expSelectBtn:SetScript("OnClick", function() expEditBox:SetFocus() @@ -1714,11 +1716,11 @@ local function OnFirstShow() local expHint = exportPopup:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") expHint:SetPoint("LEFT",expSelectBtn,"RIGHT",10,0) - expHint:SetText("|cffd4af37Push Select All then Ctrl+C to copy|r") + expHint:SetText("|cffd4af37" .. PBM_L["Push Select All then Ctrl+C to copy"] .. "|r") local expCloseBtn = CreateFrame("Button",nil,exportPopup,"UIPanelButtonTemplate") expCloseBtn:SetSize(100,24); expCloseBtn:SetPoint("BOTTOMRIGHT",exportPopup,"BOTTOMRIGHT",-8,10) - expCloseBtn:SetText("Close") + expCloseBtn:SetText(PBM_L["Close"]) expCloseBtn:SetFrameLevel(exportPopup:GetFrameLevel() + 3) expCloseBtn:SetScript("OnClick", function() exportPopup:Hide() end) @@ -1731,7 +1733,7 @@ local function OnFirstShow() expEditBox:SetFocus() expEditBox:HighlightText() exportPopup:Show() - LichborneOutput("|cffC69B3APBM:|r |cffd4af37Export ready — click Select All, then press Ctrl+C.|r") + LichborneOutput("|cffC69B3APBM:|r |cffd4af37" .. PBM_L["Export ready — click Select All, then press Ctrl+C."] .. "|r") end) -- ── Import popup ──────────────────────────────────────────── @@ -1749,12 +1751,12 @@ local function OnFirstShow() local impTitle = importPopup:CreateFontString(nil,"OVERLAY","GameFontNormal") impTitle:SetPoint("TOP",importPopup,"TOP",0,-12) - impTitle:SetText("|cffC69B3AImport Tracker Data|r") + impTitle:SetText("|cffC69B3A" .. PBM_L["Import Tracker Data"] .. "|r") local impWarn = importPopup:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") impWarn:SetPoint("TOP",impTitle,"BOTTOM",0,-4) impWarn:SetWidth(480); impWarn:SetJustifyH("CENTER") - impWarn:SetText("|cffff3333WARNING: Paste may take several minutes — do not close WoW!|r") + impWarn:SetText("|cffff3333" .. PBM_L["WARNING: Paste may take several minutes — do not close WoW!"] .. "|r") local impBoxBg = CreateFrame("Frame",nil,importPopup) impBoxBg:SetPoint("TOPLEFT", importPopup, "TOPLEFT", 0, -46) @@ -1789,14 +1791,14 @@ local function OnFirstShow() -- Normal bottom buttons local impPasteBtn = CreateFrame("Button",nil,importPopup,"UIPanelButtonTemplate") impPasteBtn:SetSize(100,24); impPasteBtn:SetPoint("BOTTOMLEFT",importPopup,"BOTTOMLEFT",8,10) - impPasteBtn:SetText("Select") + impPasteBtn:SetText(PBM_L["Select"]) impPasteBtn:SetFrameLevel(importPopup:GetFrameLevel() + 3) impPasteBtn:SetScript("OnClick", function() impEditBox:SetFocus() end) local impHint = importPopup:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") impHint:SetPoint("CENTER",importPopup,"BOTTOM",0,22) impHint:SetWidth(500); impHint:SetJustifyH("CENTER") - impHint:SetText("|cffd4af37Click Select, press Ctrl+V to paste, then click Import.|r") + impHint:SetText("|cffd4af37" .. PBM_L["Click Select, press Ctrl+V to paste, then click Import."] .. "|r") -- X close button — top right corner local impCancelBtn = CreateFrame("Button",nil,importPopup) @@ -1814,19 +1816,19 @@ local function OnFirstShow() -- Import button — bottom right local impDoBtn = CreateFrame("Button",nil,importPopup,"UIPanelButtonTemplate") impDoBtn:SetSize(100,24); impDoBtn:SetPoint("BOTTOMRIGHT",importPopup,"BOTTOMRIGHT",-8,10) - impDoBtn:SetText("Import") + impDoBtn:SetText(PBM_L["Import"]) impDoBtn:SetFrameLevel(importPopup:GetFrameLevel() + 3) -- Inline confirm buttons — centered pair (150+10+110=270px, start at (520-270)/2=125) local impYesBtn = CreateFrame("Button",nil,importPopup,"UIPanelButtonTemplate") impYesBtn:SetSize(150,24); impYesBtn:SetPoint("BOTTOMLEFT",importPopup,"BOTTOMLEFT",125,10) - impYesBtn:SetText("Yes, Replace Data") + impYesBtn:SetText(PBM_L["Yes, Replace Data"]) impYesBtn:SetFrameLevel(importPopup:GetFrameLevel() + 3) impYesBtn:Hide() local impNoBtn = CreateFrame("Button",nil,importPopup,"UIPanelButtonTemplate") impNoBtn:SetSize(110,24); impNoBtn:SetPoint("LEFT",impYesBtn,"RIGHT",10,0) - impNoBtn:SetText("No, Go Back") + impNoBtn:SetText(PBM_L["No, Go Back"]) impNoBtn:SetFrameLevel(importPopup:GetFrameLevel() + 3) impNoBtn:Hide() @@ -1842,7 +1844,7 @@ local function OnFirstShow() impYesBtn:Show(); impNoBtn:Show() impHint:Hide() impStatus:SetPoint("BOTTOM",importPopup,"BOTTOM",0,42) - impStatus:SetText("|cffC69B3AReplace ALL tracker data? This cannot be undone.|r") + impStatus:SetText("|cffC69B3A" .. PBM_L["Replace ALL tracker data? This cannot be undone."] .. "|r") end local pendingImport = nil @@ -1874,14 +1876,14 @@ local function OnFirstShow() if LichborneRaidFrame then PBM.RefreshRaidRows() end if PBM.State.LichborneOverviewFrame then PBM.RefreshOverviewRows() end PBM.UpdateSummary() - LichborneOutput("|cffC69B3APBM:|r |cffd4af37Import complete — tracker data loaded.|r") + LichborneOutput("|cffC69B3APBM:|r |cffd4af37" .. PBM_L["Import complete — tracker data loaded."] .. "|r") end) impDoBtn:SetScript("OnClick", function() local raw = impEditBox:GetText() local result, err = PBM.LB_ImportDB(raw) if not result then - impStatus:SetText("|cffff4444Error: " .. (err or "unknown") .. "|r") + impStatus:SetText("|cffff4444" .. PBM_L["Error: "] .. (err or PBM_L["unknown"]) .. "|r") return end pendingImport = result @@ -1915,27 +1917,27 @@ local function OnFirstShow() helpIcon:SetTexture("Interface\\Icons\\Inv_misc_book_08") helpBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(helpBtn, "ANCHOR_TOP") - GameTooltip:AddLine("SETTING UP YOUR TRACKER", 0.78, 0.61, 0.23) - GameTooltip:AddLine("For First Time Use", 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["SETTING UP YOUR TRACKER"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["For First Time Use"], 0.4, 0.8, 1) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("1. Add your PlayerBots to the group.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("2. Click |cff4488FF+Full Group Scan|r to |cffC69B3Aadd bots,|r gear score", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" |cffC69B3A(GS)|r, |cffC69B3AiLvL|r, |cffC69B3Agear,|r |cffC69B3Aspecialization,|r and", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" |cffC69B3APlayerbot Strategies|r to the tracker.", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" Allow 4-5 minutes for a complete scan.", 1, 0.55, 0.0) + GameTooltip:AddLine(PBM_L["1. Add your PlayerBots to the group."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["2. Click |cff4488FF+Full Group Scan|r to |cffC69B3Aadd bots,|r gear score"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" |cffC69B3A(GS)|r, |cffC69B3AiLvL|r, |cffC69B3Agear,|r |cffC69B3Aspecialization,|r and"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" |cffC69B3APlayerbot Strategies|r to the tracker."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" Allow 4-5 minutes for a complete scan."], 1, 0.55, 0.0) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("TIP: Use |cffC69B3A.playerbot bot addaccount |r to", 0.4, 0.8, 1) - GameTooltip:AddLine(" quickly add bots for first time set up.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: |cffC69B3A+Add Target|r buttons are used for |cffC69B3ASingle|r scans.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: |cffC69B3A+Add Group|r buttons are used for |cffC69B3AGroup|r scans.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: |cffC69B3ARemove Orphaned Bots|r removes bots currently not", 0.4, 0.8, 1) - GameTooltip:AddLine(" in your group. (.playerbot bot remove)", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: |cffC69B3ADisband Group|r removes PlayerBots before", 0.4, 0.8, 1) - GameTooltip:AddLine(" disbanding the group.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: |cffC69B3AStop Scan|r stops the current scan.", 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Use |cffC69B3A.playerbot bot addaccount |r to"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" quickly add bots for first time set up."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: |cffC69B3A+Add Target|r buttons are used for |cffC69B3ASingle|r scans."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: |cffC69B3A+Add Group|r buttons are used for |cffC69B3AGroup|r scans."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: |cffC69B3ARemove Orphaned Bots|r removes bots currently not"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" in your group. (.playerbot bot remove)"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: |cffC69B3ADisband Group|r removes PlayerBots before"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" disbanding the group."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: |cffC69B3AStop Scan|r stops the current scan."], 0.4, 0.8, 1) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("|cffC69B3ANote:|r All |cffC69B3AScans|r add characters to the tracker before", 0.4, 0.8, 1) - GameTooltip:AddLine(" executing, to prevent corruption.", 0.4, 0.8, 1) + GameTooltip:AddLine("|cffC69B3A" .. PBM_L["Note:"] .. "|r " .. PBM_L["All |cffC69B3AScans|r add characters to the tracker before"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" executing, to prevent corruption."], 0.4, 0.8, 1) GameTooltip:Show() end) helpBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -1952,43 +1954,43 @@ local function OnFirstShow() raidHelpIcon:SetTexture("Interface\\Icons\\Inv_misc_book_06") raidHelpBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(raidHelpBtn, "ANCHOR_LEFT") - GameTooltip:AddLine("RAID TAB", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Allows you to plan raid configurations,", 0.9, 0.9, 0.9) - GameTooltip:AddLine("invite groups, and select roles for your", 0.9, 0.9, 0.9) - GameTooltip:AddLine("PlayerBot team.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["RAID TAB"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Allows you to plan raid configurations,"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["invite groups, and select roles for your"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["PlayerBot team."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("For Groups:", 0.27, 0.53, 1) - GameTooltip:AddLine("1. Select the |cff4488ffTO 5-Man Dungeons|r tab.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("2. Add characters via the Class or Overview tabs.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("3. Click |cff4488ffINVITE GROUP|r at the bottom of", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" the tracker to log in your PlayerBots.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["For Groups:"], 0.27, 0.53, 1) + GameTooltip:AddLine(PBM_L["1. Select the |cff4488ffTO 5-Man Dungeons|r tab."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["2. Add characters via the Class or Overview tabs."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["3. Click |cff4488ffINVITE GROUP|r at the bottom of"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" the tracker to log in your PlayerBots."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("For Raids:", 1, 0.4, 0) - GameTooltip:AddLine("1. Pick a Tier and Raid from the dropdowns", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" in the raid table header.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("2. Add characters via the Class or Overview tabs.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("3. Click |cffFF6600INVITE RAID|r at the bottom of", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" the tracker to log in your PlayerBots.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["For Raids:"], 1, 0.4, 0) + GameTooltip:AddLine(PBM_L["1. Pick a Tier and Raid from the dropdowns"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" in the raid table header."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["2. Add characters via the Class or Overview tabs."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["3. Click |cffFF6600INVITE RAID|r at the bottom of"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" the tracker to log in your PlayerBots."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("TIP: |cffC69B3AInvite Group|r always invites your 5-Man team,", 0.4, 0.8, 1) - GameTooltip:AddLine(" regardless of which raid tab is active.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: |cffC69B3AInvite Raid|r always invites from the", 0.4, 0.8, 1) - GameTooltip:AddLine(" currently selected raid.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: You can have multiple raid configurations", 0.4, 0.8, 1) - GameTooltip:AddLine(" for each raid. Use the dropdown menu located", 0.4, 0.8, 1) - GameTooltip:AddLine(" in the header (|cffC69B3AA, B, C|r).", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: Use |cffC69B3ACopy|r to duplicate your selected config", 0.4, 0.8, 1) - GameTooltip:AddLine(" into another raid category (see header).", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: Use |cffC69B3AClear|r (next to Copy) to reset your", 0.4, 0.8, 1) - GameTooltip:AddLine(" current selected raid.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: Raid configurations are saved after reloads.", 0.4, 0.8, 1) - GameTooltip:AddLine(" You must manually clear them.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: Assign |cffC69B3ARoles|r (Tank, Healer, DPS)", 0.4, 0.8, 1) - GameTooltip:AddLine(" by clicking the Roles Column. Write", 0.4, 0.8, 1) - GameTooltip:AddLine(" notes to help keep organized.", 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: |cffC69B3AInvite Group|r always invites your 5-Man team,"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" regardless of which raid tab is active."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: |cffC69B3AInvite Raid|r always invites from the"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" currently selected raid."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: You can have multiple raid configurations"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" for each raid. Use the dropdown menu located"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" in the header (|cffC69B3AA, B, C|r)."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Use |cffC69B3ACopy|r to duplicate your selected config"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" into another raid category (see header)."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Use |cffC69B3AClear|r (next to Copy) to reset your"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" current selected raid."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Raid configurations are saved after reloads."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" You must manually clear them."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Assign |cffC69B3ARoles|r (Tank, Healer, DPS)"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" by clicking the Roles Column. Write"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" notes to help keep organized."], 0.4, 0.8, 1) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("|cffC69B3ANote:|r All Raids have a unique table that work", 0.4, 0.8, 1) - GameTooltip:AddLine(" |cffC69B3Aindependently|r of each other.", 0.4, 0.8, 1) + GameTooltip:AddLine("|cffC69B3A" .. PBM_L["Note:"] .. "|r " .. PBM_L["All Raids have a unique table that work"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" |cffC69B3Aindependently|r of each other."], 0.4, 0.8, 1) GameTooltip:Show() end) raidHelpBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -2004,33 +2006,33 @@ local function OnFirstShow() classHelpIcon:SetTexture("Interface\\Icons\\Inv_misc_book_01") classHelpBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(classHelpBtn, "ANCHOR_LEFT") - GameTooltip:AddLine("CLASS TABS", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Each class has its own dedicated tab.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["CLASS TABS"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Each class has its own dedicated tab."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("1. Scan to add gear score (|cffC69B3AGS|r), |cffC69B3AiLvL|r and gear.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("2. Hover on a gear slot to view the equipped item.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("3. The |cffC69B3AiLvL|r and |cffC69B3AGS|r is calculated after a scan", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" (not manual edits)", 0.9, 0.9, 0.9) - GameTooltip:AddLine("4. After a gear upgrade, it is suggested to use", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" |cff4488FF+Add Target Gear|r to update the row. OR", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" |cff4488FF+Add Group Gear|r at the end of the raid.", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" Gear only updates after a scan, not on equip.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["1. Scan to add gear score (|cffC69B3AGS|r), |cffC69B3AiLvL|r and gear."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["2. Hover on a gear slot to view the equipped item."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["3. The |cffC69B3AiLvL|r and |cffC69B3AGS|r is calculated after a scan"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" (not manual edits)"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["4. After a gear upgrade, it is suggested to use"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" |cff4488FF+Add Target Gear|r to update the row. OR"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" |cff4488FF+Add Group Gear|r at the end of the raid."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" Gear only updates after a scan, not on equip."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("TIP: Click any column header to |cffC69B3ASort|r.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: Use the |cffC69B3AProf|r cell to track a character's", 0.4, 0.8, 1) - GameTooltip:AddLine(" profession, gear needs, or role.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: You can change the spec by clicking the icon.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: Click |cff00cc00[+]|r on a PlayerBot row to add to the", 0.4, 0.8, 1) - GameTooltip:AddLine(" |cffC69B3ARaid Tab|r. Right-click |cffFF6600[+]|r to remove.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: Click |cff00cc00[>]|r to invite PlayerBot to your", 0.4, 0.8, 1) - GameTooltip:AddLine(" |cffC69B3AGroup|r. Right-click |cff00cc00[>]|r to remove.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: Use |cff66CCFFDelete Character|r |cffff3333[x]|r to remove", 0.4, 0.8, 1) - GameTooltip:AddLine(" PlayerBots from your tracker.", 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Click any column header to |cffC69B3ASort|r."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Use the |cffC69B3AProf|r cell to track a character's"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" profession, gear needs, or role."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: You can change the spec by clicking the icon."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Click |cff00cc00[+]|r on a PlayerBot row to add to the"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" |cffC69B3ARaid Tab|r. Right-click |cffFF6600[+]|r to remove."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Click |cff00cc00[>]|r to invite PlayerBot to your"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" |cffC69B3AGroup|r. Right-click |cff00cc00[>]|r to remove."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Use |cff66CCFFDelete Character|r |cffff3333[x]|r to remove"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" PlayerBots from your tracker."], 0.4, 0.8, 1) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("|cffC69B3ANote:|r Some |cff00cc00|r gear may", 0.4, 0.8, 1) - GameTooltip:AddLine(" not display correctly.", 0.4, 0.8, 1) - GameTooltip:AddLine("|cffC69B3ANote:|r Some items may display with a 0 Gear Score.", 0.4, 0.8, 1) - GameTooltip:AddLine(" Such as PvP gear.", 0.4, 0.8, 1) + GameTooltip:AddLine("|cffC69B3A" .. PBM_L["Note:"] .. "|r " .. PBM_L["Some |cff00cc00|r gear may"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" not display correctly."], 0.4, 0.8, 1) + GameTooltip:AddLine("|cffC69B3A" .. PBM_L["Note:"] .. "|r " .. PBM_L["Some items may display with a 0 Gear Score."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" Such as PvP gear."], 0.4, 0.8, 1) GameTooltip:Show() end) classHelpBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -2047,28 +2049,28 @@ local function OnFirstShow() setupHelpIcon:SetTexture("Interface\\Icons\\inv_misc_book_11") setupHelpBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(setupHelpBtn, "ANCHOR_LEFT") - GameTooltip:AddLine("SETTING UP PLAYERBOTS", 0.78, 0.61, 0.23) - GameTooltip:AddLine("|cffd4af37Linking Accounts|r", 1, 1, 1) - GameTooltip:AddLine("Linking sets you as the |cffFF8C00owner|r of bots on other accounts.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("|cffff4444Requires:|r AiPlayerbot.AllowTrustedAccountBots = 1", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["SETTING UP PLAYERBOTS"], 0.78, 0.61, 0.23) + GameTooltip:AddLine("|cffd4af37" .. PBM_L["Linking Accounts"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Linking sets you as the |cffFF8C00owner|r of bots on other accounts."], 0.9, 0.9, 0.9) + GameTooltip:AddLine("|cffff4444" .. PBM_L["Requires:"] .. "|r AiPlayerbot.AllowTrustedAccountBots = 1", 0.9, 0.9, 0.9) GameTooltip:AddLine(" |cff69CCF0.playerbots account setKey |r", 1, 1, 1) GameTooltip:AddLine(" |cff69CCF0.playerbots account link |r", 1, 1, 1) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("|cffFF8C00Altbots|r", 1, 1, 1) - GameTooltip:AddLine("Characters you create on your account (or a linked", 0.9, 0.9, 0.9) - GameTooltip:AddLine("account) that you log in as bots. You control them,", 0.9, 0.9, 0.9) - GameTooltip:AddLine("party with them, and they persist.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("They follow their own IP progression tier.", 1, 0.55, 0.0) + GameTooltip:AddLine("|cffFF8C00" .. PBM_L["Altbots"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Characters you create on your account (or a linked"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["account) that you log in as bots. You control them,"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["party with them, and they persist."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["They follow their own IP progression tier."], 1, 0.55, 0.0) GameTooltip:AddLine(" |cff69CCF0.playerbots bot add |r", 1, 1, 1) GameTooltip:AddLine(" |cff69CCF0.playerbots bot addaccount |r", 1, 1, 1) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("|cffFF8C00Rndbots|r", 1, 1, 1) - GameTooltip:AddLine("Server-generated bots that populate the world", 0.9, 0.9, 0.9) - GameTooltip:AddLine("automatically. No manual setup needed.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("They follow the group leader's IP tier.", 1, 0.55, 0.0) + GameTooltip:AddLine("|cffFF8C00" .. PBM_L["Rndbots"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Server-generated bots that populate the world"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["automatically. No manual setup needed."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["They follow the group leader's IP tier."], 1, 0.55, 0.0) GameTooltip:AddLine(" |cff69CCF0.playerbots bot addclass |r", 1, 1, 1) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("|cffd4af37GitHub:|r github.com/mod-playerbots/mod-playerbots", 0.6, 0.6, 0.6) + GameTooltip:AddLine("|cffd4af37" .. PBM_L["GitHub:"] .. "|r github.com/mod-playerbots/mod-playerbots", 0.6, 0.6, 0.6) GameTooltip:Show() end) setupHelpBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -2085,21 +2087,21 @@ local function OnFirstShow() overviewHelpIcon:SetTexture("Interface\\Icons\\Inv_misc_book_05") overviewHelpBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(overviewHelpBtn, "ANCHOR_LEFT") - GameTooltip:AddLine("OVERVIEW TAB", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Provides an overview of all current PlayerBots", 0.9, 0.9, 0.9) - GameTooltip:AddLine("you have in your tracker.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["OVERVIEW TAB"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Provides an overview of all current PlayerBots"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["you have in your tracker."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("1. Click |cff00cc00[+]|r on a PlayerBot row to add to the", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" selected raid. (in |cffC69B3ARaid Tab|r)", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" Right-click |cffFF6600[+]|r to remove from raid.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("2. Click |cff00cc00[>]|r to invite a PlayerBot to your |cffC69B3AGroup|r.", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" Right-click to remove from your |cffC69B3AGroup|r.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("3. If you have more than 60 characters, use the", 0.9, 0.9, 0.9) - GameTooltip:AddLine(" |cffC69B3APage|r dropdown in the header to view overflow.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["1. Click |cff00cc00[+]|r on a PlayerBot row to add to the"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" selected raid. (in |cffC69B3ARaid Tab|r)"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" Right-click |cffFF6600[+]|r to remove from raid."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["2. Click |cff00cc00[>]|r to invite a PlayerBot to your |cffC69B3AGroup|r."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" Right-click to remove from your |cffC69B3AGroup|r."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["3. If you have more than 60 characters, use the"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L[" |cffC69B3APage|r dropdown in the header to view overflow."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("TIP: Click any column header to |cffC69B3ASort|r.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: Use Delete Character |cffff3333[x]|r to remove", 0.4, 0.8, 1) - GameTooltip:AddLine(" PlayerBots from your tracker.", 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Click any column header to |cffC69B3ASort|r."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Use Delete Character |cffff3333[x]|r to remove"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" PlayerBots from your tracker."], 0.4, 0.8, 1) GameTooltip:Show() end) overviewHelpBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -2115,34 +2117,34 @@ local function OnFirstShow() bookHelpIcon:SetTexture("Interface\\Icons\\inv_misc_book_07") bookHelpBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(bookHelpBtn, "ANCHOR_LEFT") - GameTooltip:AddLine("CLASS STRATEGIES", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Strategies control what your PlayerBots do in combat.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("Each bot can have its own unique strategy loadout.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["CLASS STRATEGIES"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Strategies control what your PlayerBots do in combat."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["Each bot can have its own unique strategy loadout."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("HOW TO OPEN THE STRATEGIES MENU", 0.78, 0.61, 0.23) - GameTooltip:AddLine("1. Go to any |cffC69B3AClass Tab|r (Warrior, Priest, etc.)", 0.9, 0.9, 0.9) - GameTooltip:AddLine("2. Click on a |cffC69B3Acharacter's name|r in the table.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("3. This opens that bot's |cffC69B3AStrategies Menu|r.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("4. Toggle individual strategies on/off from there.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["HOW TO OPEN THE STRATEGIES MENU"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["1. Go to any |cffC69B3AClass Tab|r (Warrior, Priest, etc.)"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["2. Click on a |cffC69B3Acharacter's name|r in the table."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["3. This opens that bot's |cffC69B3AStrategies Menu|r."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["4. Toggle individual strategies on/off from there."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("HOW STRATEGIES WORK", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Strategies are behavior modifiers — they tell the bot", 0.9, 0.9, 0.9) - GameTooltip:AddLine("which spells to cast, when to use cooldowns, how to", 0.9, 0.9, 0.9) - GameTooltip:AddLine("position, and what role to fill during combat.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("Strategies stack — multiple can be active at once.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["HOW STRATEGIES WORK"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Strategies are behavior modifiers — they tell the bot"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["which spells to cast, when to use cooldowns, how to"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["position, and what role to fill during combat."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["Strategies stack — multiple can be active at once."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("USING TEMPLATES |cffC69B3A(Recommended)|r", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Instead of toggling strategies one by one, use", 0.9, 0.9, 0.9) - GameTooltip:AddLine("|cffC69B3ATemplates|r — pre-built strategy sets optimized", 0.9, 0.9, 0.9) - GameTooltip:AddLine("for each spec and role.", 0.9, 0.9, 0.9) - GameTooltip:AddLine("Templates are found in each |cffC69B3AClass Tab|r — click |cffC69B3A?|r", 0.9, 0.9, 0.9) - GameTooltip:AddLine("or the |cffC69B3ASpec icon|r in the top-left of the tab.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["USING TEMPLATES |cffC69B3A(Recommended)|r"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Instead of toggling strategies one by one, use"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["|cffC69B3ATemplates|r — pre-built strategy sets optimized"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["for each spec and role."], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["Templates are found in each |cffC69B3AClass Tab|r — click |cffC69B3A?|r"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["or the |cffC69B3ASpec icon|r in the top-left of the tab."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("TIP: Always set strategies via a |cffC69B3ATemplate|r first,", 0.4, 0.8, 1) - GameTooltip:AddLine(" then fine-tune individual strategies if needed.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: Bots retain their strategies between sessions.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: |cffC69B3ACO|r is Combat Strategies.", 0.4, 0.8, 1) - GameTooltip:AddLine("TIP: |cffC69B3ANC|r is Non-Combat Strategies.", 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Always set strategies via a |cffC69B3ATemplate|r first,"], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L[" then fine-tune individual strategies if needed."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: Bots retain their strategies between sessions."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: |cffC69B3ACO|r is Combat Strategies."], 0.4, 0.8, 1) + GameTooltip:AddLine(PBM_L["TIP: |cffC69B3ANC|r is Non-Combat Strategies."], 0.4, 0.8, 1) GameTooltip:Show() end) bookHelpBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -2159,33 +2161,33 @@ local function OnFirstShow() levelSyncHelpIcon:SetTexture("Interface\\Icons\\inv_misc_groupneedmore") levelSyncHelpBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(levelSyncHelpBtn, "ANCHOR_LEFT") - GameTooltip:AddLine("LEVELSYNC", 0.78, 0.61, 0.23) - GameTooltip:AddLine("This was added for my personal server to give players", 0.9, 0.9, 0.9) - GameTooltip:AddLine("the ability to run a full raid without leveling 40+", 0.9, 0.9, 0.9) - GameTooltip:AddLine("characters. It is designed for |cffFF8C00large altbot setups|r.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["LEVELSYNC"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["This was added for my personal server to give players"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["the ability to run a full raid without leveling 40+"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["characters. It is designed for |cffFF8C00large altbot setups|r."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("LevelSync is a shortcut to set your characters'", 0.9, 0.9, 0.9) - GameTooltip:AddLine("IP levels and tiers automatically across accounts.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["LevelSync is a shortcut to set your characters'"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["IP levels and tiers automatically across accounts."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("|cffff4444Level sync and IP sync are not recommended for all players.|r", 1, 1, 1) - GameTooltip:AddLine("|cffff4444Use at your own risk. Double check entries before toggles.|r", 1, 1, 1) + GameTooltip:AddLine("|cffff4444" .. PBM_L["Level sync and IP sync are not recommended for all players."] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffff4444" .. PBM_L["Use at your own risk. Double check entries before toggles."] .. "|r", 1, 1, 1) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("|cffd4af37Toggle Only|r", 1, 1, 1) - GameTooltip:AddLine("LevelSync must first be enabled by the server, then", 0.9, 0.9, 0.9) - GameTooltip:AddLine("toggled by the player. It will not fire until both", 0.9, 0.9, 0.9) - GameTooltip:AddLine("conditions are met. Syncs do not run automatically", 0.9, 0.9, 0.9) - GameTooltip:AddLine("— you must enter the toggle command to fire each sync.", 0.9, 0.9, 0.9) + GameTooltip:AddLine("|cffd4af37" .. PBM_L["Toggle Only"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["LevelSync must first be enabled by the server, then"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["toggled by the player. It will not fire until both"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["conditions are met. Syncs do not run automatically"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["— you must enter the toggle command to fire each sync."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" |cff69CCF0.levelsync level on|r / |cff69CCF0.levelsync IP on|r", 1, 1, 1) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("|cffd4af37Pool Gold|r", 1, 1, 1) - GameTooltip:AddLine("Collects all gold from every member of your level", 0.9, 0.9, 0.9) - GameTooltip:AddLine("sync group and transfers it to the caller.", 0.9, 0.9, 0.9) + GameTooltip:AddLine("|cffd4af37" .. PBM_L["Pool Gold"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Collects all gold from every member of your level"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["sync group and transfers it to the caller."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" |cff69CCF0.levelsync money|r", 1, 1, 1) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("To learn how to use LevelSync, see the", 0.9, 0.9, 0.9) - GameTooltip:AddLine("|cffd4af37LevelSync Tab|r in this addon.", 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["To learn how to use LevelSync, see the"], 0.9, 0.9, 0.9) + GameTooltip:AddLine(PBM_L["|cffd4af37LevelSync Tab|r in this addon."], 0.9, 0.9, 0.9) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("|cffd4af37GitHub:|r github.com/Lichborne-AC/mod-levelsync", 0.6, 0.6, 0.6) + GameTooltip:AddLine("|cffd4af37" .. PBM_L["GitHub:"] .. "|r github.com/Lichborne-AC/mod-levelsync", 0.6, 0.6, 0.6) GameTooltip:Show() end) levelSyncHelpBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -2253,11 +2255,11 @@ local function OnFirstShow() return btn end - local optsTabChanges = MakeOptsTab("Recent Changes", 8) - local optsTabOptions = MakeOptsTab("Show/Hide", 112, 84) - local optsTabData = MakeOptsTab("Data", 200, 84) - local optsTabGeneral = MakeOptsTab("Links", 288, 84) - local optsTabCredits = MakeOptsTab("Credits", 376, 84) + local optsTabChanges = MakeOptsTab(PBM_L["Recent Changes"], 8) + local optsTabOptions = MakeOptsTab(PBM_L["Show/Hide"], 112, 84) + local optsTabData = MakeOptsTab(PBM_L["Data"], 200, 84) + local optsTabGeneral = MakeOptsTab(PBM_L["Links"], 288, 84) + local optsTabCredits = MakeOptsTab(PBM_L["Credits"], 376, 84) -- ── Options tab content ─────────────────────────────────────────── local optsOptionsBox = CreateFrame("Frame", nil, optionsPanel) @@ -2277,9 +2279,9 @@ local function OnFirstShow() -- Forward reference: assigned after confirmAll is created below if not StaticPopupDialogs["PBM_CLEAR_ALL_DATA"] then StaticPopupDialogs["PBM_CLEAR_ALL_DATA"] = { - text = "|cffd4af37Clear All Data|r\n\nThis permanently deletes ALL tracked characters,\ngear data, raid rosters, and the Overview list.\n|cffff4444This cannot be undone.|r", - button1 = "Yes, Clear All", - button2 = "Cancel", + text = "|cffd4af37" .. PBM_L["Clear All Data"] .. "|r\n\n" .. PBM_L["This permanently deletes ALL tracked characters,\ngear data, raid rosters, and the Overview list.\n|cffff4444This cannot be undone.|r"], + button1 = PBM_L["Yes, Clear All"], + button2 = PBM_L["Cancel"], OnAccept = function() LichborneTrackerDB.rows = {} LichborneTrackerDB.raidRosters = {} @@ -2292,7 +2294,7 @@ local function OnFirstShow() LichborneTrackerDB.allGroups[g][i] = {name="",cls="",spec="",gs=0,realGs=0} end end - LichborneOutput("|cffC69B3APBM:|r |cffff4444All data wiped.|r", 1, 0.5, 0.5) + LichborneOutput("|cffC69B3APBM:|r |cffff4444" .. PBM_L["All data wiped."] .. "|r", 1, 0.5, 0.5) PBM.RefreshRows() if PBM.State.LichborneOverviewFrame then PBM.RefreshOverviewRows() end if PBM.State.raidRowFrames and #PBM.State.raidRowFrames > 0 then PBM.RefreshRaidRows() end @@ -2316,7 +2318,7 @@ local function OnFirstShow() optSecHdr:SetFont(OPT_FONT, 11, "OUTLINE") optSecHdr:SetPoint("TOPLEFT", optsOptionsBox, "TOPLEFT", OPT_MX, -14) optSecHdr:SetTextColor(OPT_GR, OPT_GG, OPT_GB) - optSecHdr:SetText("Data Management") + optSecHdr:SetText(PBM_L["Data Management"]) local optSecDiv = optsOptionsBox:CreateTexture(nil, "ARTWORK") optSecDiv:SetPoint("TOPLEFT", optsOptionsBox, "TOPLEFT", OPT_MX, -28) @@ -2350,8 +2352,8 @@ local function OnFirstShow() end OptActionBtn(-34, - "Export Data", - "Export all tracked character and raid data to a string. Click Select All, then Ctrl+C to copy.", + PBM_L["Export Data"], + PBM_L["Export all tracked character and raid data to a string. Click Select All, then Ctrl+C to copy."], 0.04, 0.07, 0.14, function() if exportPopup:IsShown() then exportPopup:Hide(); return end @@ -2361,12 +2363,12 @@ local function OnFirstShow() expEditBox:SetText(blob) expEditBox:SetFocus(); expEditBox:HighlightText() exportPopup:Show() - LichborneOutput("|cffC69B3APBM:|r |cffd4af37Export ready — click Select All, then press Ctrl+C.|r") + LichborneOutput("|cffC69B3APBM:|r |cffd4af37" .. PBM_L["Export ready — click Select All, then press Ctrl+C."] .. "|r") end) OptActionBtn(-104, - "Import Data", - "Load tracker data from a previously exported string. Paste the export string and click Import.", + PBM_L["Import Data"], + PBM_L["Load tracker data from a previously exported string. Paste the export string and click Import."], 0.04, 0.07, 0.14, function() if importPopup:IsShown() then importPopup:Hide(); return end @@ -2379,8 +2381,8 @@ local function OnFirstShow() end) OptActionBtn(-174, - "Clear All Data", - "|cffff6666Permanently deletes ALL tracked characters, gear data,\nraid rosters, and the Overview list. This cannot be undone.|r", + PBM_L["Clear All Data"], + PBM_L["|cffff6666Permanently deletes ALL tracked characters, gear data,\nraid rosters, and the Overview list. This cannot be undone.|r"], 0.22, 0.03, 0.03, function() optionsPanel:Hide() @@ -2475,27 +2477,27 @@ local function OnFirstShow() local btn = CreateFrame("Button", nil, linksChild, "UIPanelButtonTemplate") btn:SetSize(90, 22) btn:SetPoint("TOPLEFT", linksChild, "TOPLEFT", 8, y - 48) - btn:SetText("Select All") + btn:SetText(PBM_L["Select All"]) btn:SetFrameLevel(lnkFL + 4) btn:SetScript("OnClick", function() eb:SetFocus(); eb:HighlightText() end) local hint = linksChild:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") hint:SetPoint("LEFT", btn, "RIGHT", 10, 0) - hint:SetText("|cffd4af37Ctrl+C to copy|r") + hint:SetText("|cffd4af37"..PBM_L["Ctrl+C to copy"].."|r") return y - 76 -- bottom y of this entry (label16 + box22 + btn22 + gap16) end local cy = -14 - cy = LnkEntry("PlayerBot Manager:", "https://github.com/Lichborne-AC/PlayerbotManager", cy, "LichborneUpdateRepoBox") + cy = LnkEntry(PBM_L["PlayerBot Manager:"], "https://github.com/Lichborne-AC/PlayerbotManager", cy, "LichborneUpdateRepoBox") LnkSep(cy - 10); cy = cy - 30 - cy = LnkEntry("mod-playerbots:", "https://github.com/mod-playerbots/mod-playerbots", cy, "PBMUpdatePlayerbotsBox") + cy = LnkEntry(PBM_L["mod-playerbots:"], "https://github.com/mod-playerbots/mod-playerbots", cy, "PBMUpdatePlayerbotsBox") LnkSep(cy - 10); cy = cy - 30 - cy = LnkEntry("mod-levelsync:", "https://github.com/Lichborne-AC/mod-levelsync", cy, "PBMUpdateLevelSyncBox") + cy = LnkEntry(PBM_L["mod-levelsync:"], "https://github.com/Lichborne-AC/mod-levelsync", cy, "PBMUpdateLevelSyncBox") LnkSep(cy - 10); cy = cy - 30 - cy = LnkEntry("mod-individual-progression:", "https://github.com/ZhengPeiRu21/mod-individual-progression", cy, "PBMUpdateIndivProgBox") + cy = LnkEntry(PBM_L["mod-individual-progression:"], "https://github.com/ZhengPeiRu21/mod-individual-progression", cy, "PBMUpdateIndivProgBox") LnkSep(cy - 10); cy = cy - 30 - cy = LnkEntry("Multibot:", "https://github.com/Wishmaster117/MultiBot-Chatless", cy, "PBMUpdateMultibotBox") + cy = LnkEntry(PBM_L["Multibot:"], "https://github.com/Wishmaster117/MultiBot-Chatless", cy, "PBMUpdateMultibotBox") linksChild:SetHeight(math.abs(cy) + 20) -- ── Recent Changes tab content ──────────────────────────────────── @@ -2568,98 +2570,98 @@ local function OnFirstShow() end function CT.line(t) ChgLine(t, CT.y); CT.y = CT.y - 13 end - CT.title("|cffFF8C00Recent Changes|r") + CT.title("|cffFF8C00"..PBM_L["Recent Changes"].."|r") -- ── Release v1.4 ─────────────────────────────────────────────── - CT.release("|cffd4af37Release v1.4|r |cffFF8C00July 3, 2026|r") - CT.section("|cffC69B3AReorder Rows|r") - CT.line("|cff888888-|r |cffffcc00Drag to reorder|r — grab the |cff888888#|r handle at the left of a") - CT.line(" row and drag. Works in |cffABD473Class|r, |cffFF8C00Raid|r, and |cffffcc00Group|r tabs") - CT.line("|cff888888-|r Manual order is saved and clears the active column sort") - CT.section("|cffC69B3ALevelSync|r") - CT.line("|cff888888-|r New |cffd4af37Export|r button (bottom-right) — copies synced") - CT.line(" characters |cff888888(name, class, level, IP tier)|r into the tracker") - CT.section("|cffC69B3AIndividual Progression|r") - CT.line("|cff888888-|r New |cffd4af37.ip attune onyxia/blacktemple|r command added") - CT.line(" to the Commands list") - CT.section("|cffC69B3AClass Tabs|r") - CT.line("|cff888888-|r Gear cells now |cffffcc00highlight on hover|r, matching the") - CT.line(" |cffffcc00Group|r tab") - CT.section("|cffC69B3ACC|r") - CT.line("|cff888888-|r Added |cffC69B3ACC|r button to character sheet — toggles the |cffff8000cc|r") - CT.line(" strategy for |cff40C7EBMage|r, |cffFFFFFFPriest|r, |cff8787EDWarlock|r, and |cffFF7D0ADruid|r") - CT.line("|cff888888-|r |cff40C7EBMage|r: |cffffcc00Polymorph|r") - CT.line("|cff888888-|r |cffFFFFFFPriest|r: |cffffcc00Shackle Undead|r") - CT.line("|cff888888-|r |cff8787EDWarlock|r: |cffffcc00Fear|r / |cffffcc00Banish|r") - CT.line("|cff888888-|r |cffFF7D0ADruid|r: |cffffcc00Cyclone|r / |cffffcc00Hibernate|r / |cffffcc00Entangling Roots|r") - CT.section("|cffFF8C00Invite Raid|r") - CT.line("|cff888888-|r Removed the 6th-member |cffffcc00pause/re-add|r workaround —") - CT.line(" party->raid conversion is now handled server-side by") - CT.line(" mod-playerbots |cff66ccffPR #2502|r") + CT.release("|cffd4af37"..PBM_L["Release v1.4"].."|r |cffFF8C00"..PBM_L["July 3, 2026"].."|r") + CT.section("|cffC69B3A"..PBM_L["Reorder Rows"].."|r") + CT.line("|cff888888-|r |cffffcc00"..PBM_L["Drag to reorder"].."|r — "..PBM_L["grab the"].." |cff888888#|r "..PBM_L["handle at the left of a"]) + CT.line(" "..PBM_L["row and drag. Works in"].." |cffABD473"..PBM_L["Class"].."|r, |cffFF8C00"..PBM_L["Raid"].."|r, "..PBM_L["and"].." |cffffcc00"..PBM_L["Group"].."|r") + CT.line("|cff888888-|r "..PBM_L["Manual order is saved and clears the active column sort"]) + CT.section("|cffC69B3A"..PBM_L["LevelSync"].."|r") + CT.line("|cff888888-|r "..PBM_L["New"].." |cffd4af37"..PBM_L["Export"].."|r "..PBM_L["button (bottom-right) — copies synced"]) + CT.line(" "..PBM_L["characters"].." |cff888888"..PBM_L["(name, class, level, IP tier)"].."|r "..PBM_L["into the tracker"]) + CT.section("|cffC69B3A"..PBM_L["Individual Progression"].."|r") + CT.line("|cff888888-|r "..PBM_L["New"].." |cffd4af37"..PBM_L[".ip attune onyxia/blacktemple"].."|r "..PBM_L["command added"]) + CT.line(" "..PBM_L["to the Commands list"]) + CT.section("|cffC69B3A"..PBM_L["Class Tabs"].."|r") + CT.line("|cff888888-|r "..PBM_L["Gear cells now"].." |cffffcc00"..PBM_L["highlight on hover"].."|r, "..PBM_L["matching the"]) + CT.line(" |cffffcc00"..PBM_L["Group"].."|r "..PBM_L["tab"]) + CT.section("|cffC69B3A"..PBM_L["CC"].."|r") + CT.line("|cff888888-|r "..PBM_L["Added"].." |cffC69B3A"..PBM_L["CC"].."|r "..PBM_L["button to character sheet — toggles the"].." |cffff8000cc|r") + CT.line(" "..PBM_L["strategy for"].." |cff40C7EB"..PBM_L["Mage"].."|r, |cffFFFFFF"..PBM_L["Priest"].."|r, |cff8787ED"..PBM_L["Warlock"].."|r, "..PBM_L["and"].." |cffFF7D0A"..PBM_L["Druid"].."|r") + CT.line("|cff888888-|r |cff40C7EB"..PBM_L["Mage"].."|r: |cffffcc00"..PBM_L["Polymorph"].."|r") + CT.line("|cff888888-|r |cffFFFFFF"..PBM_L["Priest"].."|r: |cffffcc00"..PBM_L["Shackle Undead"].."|r") + CT.line("|cff888888-|r |cff8787ED"..PBM_L["Warlock"].."|r: |cffffcc00"..PBM_L["Fear"].."|r / |cffffcc00"..PBM_L["Banish"].."|r") + CT.line("|cff888888-|r |cffFF7D0A"..PBM_L["Druid"].."|r: |cffffcc00"..PBM_L["Cyclone"].."|r / |cffffcc00"..PBM_L["Hibernate"].."|r / |cffffcc00"..PBM_L["Entangling Roots"].."|r") + CT.section("|cffFF8C00"..PBM_L["Invite Raid"].."|r") + CT.line("|cff888888-|r "..PBM_L["Removed the 6th-member"].." |cffffcc00"..PBM_L["pause/re-add"].."|r "..PBM_L["workaround —"]) + CT.line(" "..PBM_L["party->raid conversion is now handled server-side by"]) + CT.line(" "..PBM_L["mod-playerbots"].." |cff66ccff"..PBM_L["PR #2502"].."|r") -- ── Release v1.3 ─────────────────────────────────────────────── - CT.release("|cffd4af37Release v1.3|r |cffFF8C00June 5, 2026|r") - CT.section("|cffABD473Hunter|r") - CT.line("|cff888888-|r Removed |cffABD473dps|r button from character sheet (CO)") - CT.line("|cff888888-|r Removed |cffABD473dps debuff|r button from character sheet (CO)") - CT.line("|cff888888-|r Removed |cffABD473bviper|r aspect from character sheet (CO + NC)") - CT.section("|cffF58CBAPaladin|r") - CT.line("|cff888888-|r |cffF58CBABlessings renamed|r — mod-playerbots |cff66ccffPR #2432|r") - CT.line("|cff888888-|r |cffd4af37bstats|r -> |cffF58CBAbkings |cffF58CBA(Blessing of Kings)|r") - CT.line("|cff888888-|r |cffd4af37bhealth|r -> |cffF58CBAbsanc |cffF58CBA(Blessing of Sanctuary)|r") - CT.line("|cff888888-|r |cffd4af37bmana|r -> |cffF58CBAbwisdom |cffF58CBA(Blessing of Wisdom)|r") - CT.line("|cff888888-|r |cffd4af37bdps|r -> |cffF58CBAbmight |cffF58CBA(Blessing of Might)|r") - CT.section("|cffFFF569Rogue|r") - CT.line("|cff888888-|r Added |cffFFF569Melee|r button — DPS column: DPS / Melee / Boost") - CT.line("|cff888888-|r Combat section split into |cffFFF569DPS|r and |cffFFF569Stealth|r columns") - CT.section("|cffC69B3APlayerbots Tab|r") - CT.line("|cff888888-|r Reset Instances now uses |cff66ccff.playerbots bot refresh=raid *|r") - CT.line("|cff888888-|r Removed GM Reset Instances button") - CT.section("|cffC69B3ABug Fixes|r") - CT.line("|cff888888-|r Fixed: |cffFF7D0ADruid|r offheal strategy showing up red in notes") - CT.section("|cffC69B3AUI|r") - CT.line("|cff888888-|r New |cffffcc00Group|r tab added — shows current group members") - CT.line("|cff888888-|r Character sheet: bag colors now correspond to how full the inventory is") - CT.section("|cffC69B3AFilters|r") - CT.line("|cff888888-|r New filter: removes generated notes in the |cffFF8C00Raid|r tab — allows for manual entry") - CT.line("|cff888888-|r New filter: removes generated roles in the |cffFF8C00Raid|r/|cffABD473Overview|r tab —") - CT.line(" allows for manual entry") - CT.line("|cff888888-|r New filter: Show/Hide new |cffffcc00Group|r tab") - CT.line("|cff888888-|r New filter: Show/Hide |cff66ccffStrategy|r responses in output box") - CT.line("|cff888888-|r New filter: Show/Hide |cff66ccff+Add Target/Group Strategies|r buttons") - CT.line("|cff888888-|r New filter: Show/Hide Who response (when opening character menus)") - CT.line("|cff888888-|r New filter: |cffffcc00Hide Group Members|r — hides chars in your party") - CT.line("|cff888888-|r New toggles: name-click char sheet — |cffffcc00Group|r + Class tabs") - CT.section("|cffC69B3AButtons|r") - CT.line("|cff888888-|r Added |cffff8c00\"Does not work for rndbots.\"|r note in Invite Group & Raid buttons") - CT.section("|cffC69B3ATemplates|r") - CT.line("|cff888888-|r |cffC41F3BDK:|r |cffC69B3ADbl Aura Blood PvE|r (43-26-2) added — spec \"double aura blood pve\"") + CT.release("|cffd4af37"..PBM_L["Release v1.3"].."|r |cffFF8C00"..PBM_L["June 5, 2026"].."|r") + CT.section("|cffABD473"..PBM_L["Hunter"].."|r") + CT.line("|cff888888-|r "..PBM_L["Removed"].." |cffABD473dps|r "..PBM_L["button from character sheet (CO)"]) + CT.line("|cff888888-|r "..PBM_L["Removed"].." |cffABD473dps "..PBM_L["debuff"].."|r "..PBM_L["button from character sheet (CO)"]) + CT.line("|cff888888-|r "..PBM_L["Removed"].." |cffABD473bviper|r "..PBM_L["aspect from character sheet (CO + NC)"]) + CT.section("|cffF58CBA"..PBM_L["Paladin"].."|r") + CT.line("|cff888888-|r |cffF58CBA"..PBM_L["Blessings renamed"].."|r — "..PBM_L["mod-playerbots"].." |cff66ccff"..PBM_L["PR #2432"].."|r") + CT.line("|cff888888-|r |cffd4af37bstats|r -> |cffF58CBAbkings |cffF58CBA"..PBM_L["(Blessing of Kings)"].."|r") + CT.line("|cff888888-|r |cffd4af37bhealth|r -> |cffF58CBAbsanc |cffF58CBA"..PBM_L["(Blessing of Sanctuary)"].."|r") + CT.line("|cff888888-|r |cffd4af37bmana|r -> |cffF58CBAbwisdom |cffF58CBA"..PBM_L["(Blessing of Wisdom)"].."|r") + CT.line("|cff888888-|r |cffd4af37bdps|r -> |cffF58CBAbmight |cffF58CBA"..PBM_L["(Blessing of Might)"].."|r") + CT.section("|cffFFF569"..PBM_L["Rogue"].."|r") + CT.line("|cff888888-|r "..PBM_L["Added"].." |cffFFF569"..PBM_L["Melee"].."|r "..PBM_L["button — DPS column: DPS / Melee / Boost"]) + CT.line("|cff888888-|r "..PBM_L["Combat section split into"].." |cffFFF569DPS|r "..PBM_L["and"].." |cffFFF569"..PBM_L["Stealth"].."|r "..PBM_L["columns"]) + CT.section("|cffC69B3A"..PBM_L["Playerbots Tab"].."|r") + CT.line("|cff888888-|r "..PBM_L["Reset Instances now uses"].." |cff66ccff"..PBM_L[".playerbots bot refresh=raid *"].."|r") + CT.line("|cff888888-|r "..PBM_L["Removed GM Reset Instances button"]) + CT.section("|cffC69B3A"..PBM_L["Bug Fixes"].."|r") + CT.line("|cff888888-|r "..PBM_L["Fixed:"].." |cffFF7D0A"..PBM_L["Druid"].."|r "..PBM_L["offheal strategy showing up red in notes"]) + CT.section("|cffC69B3A"..PBM_L["UI"].."|r") + CT.line("|cff888888-|r "..PBM_L["New"].." |cffffcc00"..PBM_L["Group"].."|r "..PBM_L["Group tab added — shows current group members"]) + CT.line("|cff888888-|r "..PBM_L["Character sheet: bag colors now correspond to how full the inventory is"]) + CT.section("|cffC69B3A"..PBM_L["Filters"].."|r") + CT.line("|cff888888-|r "..PBM_L["New filter: removes generated notes in the"].." |cffFF8C00"..PBM_L["Raid"].."|r "..PBM_L["tab — allows for manual entry"]) + CT.line("|cff888888-|r "..PBM_L["New filter: removes generated roles in the"].." |cffFF8C00"..PBM_L["Raid"].."|r/|cffABD473"..PBM_L["Overview"].."|r "..PBM_L["tab —"]) + CT.line(" "..PBM_L["allows for manual entry"]) + CT.line("|cff888888-|r "..PBM_L["New filter: Show/Hide new"].." |cffffcc00"..PBM_L["Group"].."|r "..PBM_L["tab"]) + CT.line("|cff888888-|r "..PBM_L["New filter: Show/Hide"].." |cff66ccff"..PBM_L["Strategy"].."|r "..PBM_L["responses in output box"]) + CT.line("|cff888888-|r "..PBM_L["New filter: Show/Hide"].." |cff66ccff"..PBM_L["+Add Target/Group Strategies"].."|r "..PBM_L["buttons"]) + CT.line("|cff888888-|r "..PBM_L["New filter: Show/Hide Who response (when opening character menus)"]) + CT.line("|cff888888-|r "..PBM_L["New filter:"].." |cffffcc00"..PBM_L["Hide Group Members"].."|r "..PBM_L["— hides chars in your party"]) + CT.line("|cff888888-|r "..PBM_L["New toggles: name-click char sheet —"].." |cffffcc00"..PBM_L["Group"].."|r + "..PBM_L["Class tabs"]) + CT.section("|cffC69B3A"..PBM_L["Buttons"].."|r") + CT.line("|cff888888-|r "..PBM_L["Added"].." |cffff8c00"..PBM_L["\"Does not work for rndbots.\""].."|r "..PBM_L["note in Invite Group & Raid buttons"]) + CT.section("|cffC69B3A"..PBM_L["Templates"].."|r") + CT.line("|cff888888-|r |cffC41F3B"..PBM_L["DK:"].."|r |cffC69B3A"..PBM_L["Dbl Aura Blood PvE"].."|r "..PBM_L["(43-26-2) added — spec \"double aura blood pve\""]) -- ── Release v1.2 ─────────────────────────────────────────────── - CT.release("|cffd4af37Release v1.2|r |cffFF8C00May 30, 2026|r") - CT.section("|cffC69B3ABug Fixes|r") - CT.line("|cff888888-|r Fixed: Invite Raid no longer kicks and reinvites members in partial groups") - CT.line("|cff888888-|r Stop Scan now stops |cffffcc00+Add IP Tiers|r mid-run") - CT.line("|cff888888-|r Clear All no longer resets Raid tier/raid selection") - CT.section("|cffC69B3AUI|r") - CT.line("|cff888888-|r Show/Hide menu added: toggle tab and button visibility per bot row") - CT.line("|cff888888-|r Needs column restored — shares the Prof. column |cff888888(use either)|r") - CT.line("|cff888888-|r Raid tab: note color brightened for readability") - CT.line("|cff888888-|r Tracker section header renamed: |cffffcc00Admin:|r -> |cffffcc00Menu:|r") - CT.line("|cff888888-|r Character sheet: name on its own line in class color") - CT.line("|cff888888-|r PvP tooltip: moved above button, wording cleaned up") - CT.line("|cff888888-|r Several AoE icons updated to Blizzard |cff888888(spell_frost_icestorm)|r") - CT.line("|cff888888-|r Reset Instances: tooltips updated") - CT.section("|cffC69B3AClass Menus|r") - CT.line("|cff888888-|r Removed ability rotation lines from all 10 class spec tooltips") - CT.line(" |cff999999Due to time restraints and constantly evolving Playerbot strategies.|r") - CT.line("|cff888888-|r |cff8787EDWarlock:|r removed DPS toggle button, Combat row shrunk to 3 icons") - CT.line("|cff888888-|r |cff8787EDWarlock|r & |cff0070DEShaman:|r increased vertical row spacing |cff888888(15 px gap)|r") - CT.line("|cff888888-|r |cff0070DEShaman:|r Caster AoE + Melee AoE merged into single |cffffcc00AoE|r button") - CT.line("|cff888888-|r |cff0070DEShaman|r Totem section removed — use |cffffcc00Multibot|r for totem functions") - CT.line("|cff888888-|r |cffFF7D0ADruid:|r added |cffffcc00Tranquility|r, |cffffcc00Blanketing|r, and |cffffcc00Feral Charge|r strategies") - CT.section("|cffC69B3AButtons|r") - CT.line("|cff888888-|r Buttons disabled while |cffffcc00+Add IP Tiers|r is running") + CT.release("|cffd4af37"..PBM_L["Release v1.2"].."|r |cffFF8C00"..PBM_L["May 30, 2026"].."|r") + CT.section("|cffC69B3A"..PBM_L["Bug Fixes"].."|r") + CT.line("|cff888888-|r "..PBM_L["Fixed: Invite Raid no longer kicks and reinvites members in partial groups"]) + CT.line("|cff888888-|r "..PBM_L["Stop Scan now stops"].." |cffffcc00"..PBM_L["+Add IP Tiers"].."|r "..PBM_L["mid-run"]) + CT.line("|cff888888-|r "..PBM_L["Clear All no longer resets Raid tier/raid selection"]) + CT.section("|cffC69B3A"..PBM_L["UI"].."|r") + CT.line("|cff888888-|r "..PBM_L["Show/Hide menu added: toggle tab and button visibility per bot row"]) + CT.line("|cff888888-|r "..PBM_L["Needs column restored — shares the Prof. column"].." |cff888888"..PBM_L["(use either)"].."|r") + CT.line("|cff888888-|r "..PBM_L["Raid tab: note color brightened for readability"]) + CT.line("|cff888888-|r "..PBM_L["Tracker section header renamed:"].." |cffffcc00"..PBM_L["Admin:"].."|r -> |cffffcc00"..PBM_L["Menu:"].."|r") + CT.line("|cff888888-|r "..PBM_L["Character sheet: name on its own line in class color"]) + CT.line("|cff888888-|r "..PBM_L["PvP tooltip: moved above button, wording cleaned up"]) + CT.line("|cff888888-|r "..PBM_L["Several AoE icons updated to Blizzard"].." |cff888888"..PBM_L["(spell_frost_icestorm)"].."|r") + CT.line("|cff888888-|r "..PBM_L["Reset Instances: tooltips updated"]) + CT.section("|cffC69B3A"..PBM_L["Class Menus"].."|r") + CT.line("|cff888888-|r "..PBM_L["Removed ability rotation lines from all 10 class spec tooltips"]) + CT.line(" |cff999999"..PBM_L["Due to time restraints and constantly evolving Playerbot strategies."].."|r") + CT.line("|cff888888-|r |cff8787ED"..PBM_L["Warlock"].."|r: "..PBM_L["removed DPS toggle button, Combat row shrunk to 3 icons"]) + CT.line("|cff888888-|r |cff8787ED"..PBM_L["Warlock"].."|r "..PBM_L["&"].." |cff0070DE"..PBM_L["Shaman"].."|r: "..PBM_L["increased vertical row spacing"].." |cff888888"..PBM_L["(15 px gap)"].."|r") + CT.line("|cff888888-|r |cff0070DE"..PBM_L["Shaman"].."|r: "..PBM_L["Caster AoE + Melee AoE merged into single"].." |cffffcc00"..PBM_L["AoE"].."|r "..PBM_L["button"]) + CT.line("|cff888888-|r |cff0070DE"..PBM_L["Shaman"].."|r "..PBM_L["Totem section removed — use"].." |cffffcc00"..PBM_L["Multibot"].."|r "..PBM_L["for totem functions"]) + CT.line("|cff888888-|r |cffFF7D0A"..PBM_L["Druid"].."|r: "..PBM_L["added"].." |cffffcc00"..PBM_L["Tranquility"].."|r, |cffffcc00"..PBM_L["Blanketing"].."|r, "..PBM_L["and"].." |cffffcc00"..PBM_L["Feral Charge"].."|r "..PBM_L["strategies"]) + CT.section("|cffC69B3A"..PBM_L["Buttons"].."|r") + CT.line("|cff888888-|r "..PBM_L["Buttons disabled while"].." |cffffcc00"..PBM_L["+Add IP Tiers"].."|r "..PBM_L["is running"]) chgChild:SetHeight(-CT.y + 30) @@ -2695,9 +2697,9 @@ local function OnFirstShow() t:SetTexture(0.78, 0.61, 0.23, 0.4) end - CreditsLine("|cffC69B3ACredits|r", -14, 14) + CreditsLine("|cffC69B3A"..PBM_L["Credits"].."|r", -14, 14) CreditsDivider(-34) - CreditsLine("|cffd4af37Special thanks to:|r", -60, nil, "CENTER") + CreditsLine("|cffd4af37"..PBM_L["Special thanks to:"].."|r", -60, nil, "CENTER") CreditsLine("|cffffffffDohtt|r", -74, nil, "CENTER") CreditsLine("|cffffffffScarecr0w12 |cffaaaaaa- TheCGN.net|r", -86, nil, "CENTER") CreditsLine("|cffffffffDreathean|r", -98, nil, "CENTER") @@ -2709,10 +2711,10 @@ local function OnFirstShow() CreditsLine("|cffffffffGrimfeather|r", -170, nil, "CENTER") CreditsLine("|cffffffffKeleborn|r", -182, nil, "CENTER") CreditsLine("|cffffffffGromleq|r", -194, nil, "CENTER") - CreditsLine("|cffffffffPortions of PBM's character menu code were derived from Wishmaster117's Multibot.|r", -238, nil, "CENTER") - CreditsLine("|cffffffffThank you for the work.|r", -252, nil, "CENTER") + CreditsLine("|cffffffff"..PBM_L["Portions of PBM's character menu code were derived from Wishmaster117's Multibot."].."|r", -238, nil, "CENTER") + CreditsLine("|cffffffff"..PBM_L["Thank you for the work."].."|r", -252, nil, "CENTER") CreditsDivider(-270) - CreditsLine("|cffd4af37Questions & Support:|r lichborne.wow@proton.me — |cffd4af37Discord:|r jared2219", -292, nil, "CENTER") + CreditsLine("|cffd4af37"..PBM_L["Questions & Support:"].."|r lichborne.wow@proton.me — |cffd4af37"..PBM_L["Discord:"].."|r jared2219", -292, nil, "CENTER") -- ── Store bottom-button refs for Show/Hide menu ────────────────── PBM.State.trackerBtns = { @@ -2807,7 +2809,7 @@ local function OnFirstShow() visHdr:SetFont(VIS_FONT, 11, "OUTLINE") visHdr:SetPoint("TOPLEFT", optsVisBox, "TOPLEFT", VIS_MX, -14) visHdr:SetTextColor(VIS_GR, VIS_GG, VIS_GB) - visHdr:SetText("Show/Hide") + visHdr:SetText(PBM_L["Show/Hide"]) local visHdrDiv = optsVisBox:CreateTexture(nil, "ARTWORK") visHdrDiv:SetPoint("TOPLEFT", optsVisBox, "TOPLEFT", VIS_MX, -28) @@ -2817,11 +2819,11 @@ local function OnFirstShow() visHdrDiv:SetVertexColor(VIS_GR, VIS_GG, VIS_GB, 0.5) local VIS_SECTIONS = { - {id = "Playerbots", label = "Playerbots Tab"}, - {id = "IndividualProgression", label = "Ind. Prog. Tab"}, - {id = "LevelSync", label = "LevelSync Tab"}, - {id = "Notes", label = "Notes Tab"}, - {id = "Group", label = "Group Tab"}, + {id = "Playerbots", label = PBM_L["Playerbots Tab"]}, + {id = "IndividualProgression", label = PBM_L["Ind. Prog. Tab"]}, + {id = "LevelSync", label = PBM_L["LevelSync Tab"]}, + {id = "Notes", label = PBM_L["Notes Tab"]}, + {id = "Group", label = PBM_L["Group Tab"]}, } PBM.State.visToggleBtns = {} @@ -2849,10 +2851,10 @@ local function OnFirstShow() local isHidden = PBMConfig.hiddenTabs and PBMConfig.hiddenTabs[sectionId] if isHidden then btn:SetBackdropColor(0.18, 0.04, 0.04, 1) - stateLbl:SetText("|cffff6666Hidden|r") + stateLbl:SetText("|cffff6666"..PBM_L["Hidden"].."|r") else btn:SetBackdropColor(0.04, 0.14, 0.06, 1) - stateLbl:SetText("|cff55dd77Visible|r") + stateLbl:SetText("|cff55dd77"..PBM_L["Visible"].."|r") end end btn:Refresh() @@ -2896,7 +2898,7 @@ local function OnFirstShow() -- Order: Add IP Tiers, Strategy Buttons, Strategy Whispers, Who Commands, Role Filter, Notes Filter -- (1) Add IP Tiers — tab/button visibility toggle, reuses MakeVisToggle - local ipTiersToggle = MakeVisToggle(-34, "IPTiers", "+Add IP Tiers (button)", COL2_X) + local ipTiersToggle = MakeVisToggle(-34, "IPTiers", PBM_L["+Add IP Tiers (button)"], COL2_X) PBM.State.visToggleBtns[#PBM.State.visToggleBtns + 1] = ipTiersToggle -- (2) Strategy Buttons show/hide toggle @@ -2907,13 +2909,13 @@ local function OnFirstShow() stratVisBtn:SetBackdropBorderColor(VIS_GR, VIS_GG, VIS_GB, 0.85) stratVisBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight", "ADD") local svNLbl = stratVisBtn:CreateFontString(nil,"OVERLAY"); svNLbl:SetFont(VIS_FONT,10,"OUTLINE") - svNLbl:SetPoint("LEFT",stratVisBtn,"LEFT",10,0); svNLbl:SetText("|cffd4af37+Add Strategy Buttons|r") + svNLbl:SetPoint("LEFT",stratVisBtn,"LEFT",10,0); svNLbl:SetText("|cffd4af37"..PBM_L["+Add Strategy Buttons"].."|r") local svSLbl = stratVisBtn:CreateFontString(nil,"OVERLAY"); svSLbl:SetFont(VIS_FONT,10,"OUTLINE") svSLbl:SetPoint("RIGHT",stratVisBtn,"RIGHT",-10,0) function stratVisBtn:Refresh() local hidden = PBMConfig and PBMConfig.hiddenButtons and PBMConfig.hiddenButtons.strategies - if hidden then stratVisBtn:SetBackdropColor(0.18,0.04,0.04,1); svSLbl:SetText("|cffff6666Hidden|r") - else stratVisBtn:SetBackdropColor(0.04,0.14,0.06,1); svSLbl:SetText("|cff55dd77Visible|r") end + if hidden then stratVisBtn:SetBackdropColor(0.18,0.04,0.04,1); svSLbl:SetText("|cffff6666"..PBM_L["Hidden"].."|r") + else stratVisBtn:SetBackdropColor(0.04,0.14,0.06,1); svSLbl:SetText("|cff55dd77"..PBM_L["Visible"].."|r") end end stratVisBtn:Refresh() stratVisBtn:SetScript("OnClick", function() @@ -2925,9 +2927,9 @@ local function OnFirstShow() end) stratVisBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(stratVisBtn, "ANCHOR_TOP") - GameTooltip:AddLine("+Add Strategy Buttons", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Hides +Add Target/Group Strategies buttons", 0.7, 0.7, 0.7) - GameTooltip:AddLine("and expands the remaining buttons to fill the gap.", 0.7, 0.7, 0.7) + GameTooltip:AddLine(PBM_L["+Add Strategy Buttons"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Hides +Add Target/Group Strategies buttons"], 0.7, 0.7, 0.7) + GameTooltip:AddLine(PBM_L["and expands the remaining buttons to fill the gap."], 0.7, 0.7, 0.7) GameTooltip:Show() end) stratVisBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -2948,7 +2950,7 @@ local function OnFirstShow() local stratNameLbl = stratBtn:CreateFontString(nil, "OVERLAY") stratNameLbl:SetFont(VIS_FONT, 10, "OUTLINE") stratNameLbl:SetPoint("LEFT", stratBtn, "LEFT", 10, 0) - stratNameLbl:SetText("|cffd4af37Strategy Whispers|r") + stratNameLbl:SetText("|cffd4af37"..PBM_L["Strategy Whispers"].."|r") local stratStateLbl = stratBtn:CreateFontString(nil, "OVERLAY") stratStateLbl:SetFont(VIS_FONT, 10, "OUTLINE") @@ -2957,10 +2959,10 @@ local function OnFirstShow() function stratBtn:Refresh() if PBMConfig and PBMConfig.hideStrategyOutput then stratBtn:SetBackdropColor(0.18, 0.04, 0.04, 1) - stratStateLbl:SetText("|cffff6666Hidden|r") + stratStateLbl:SetText("|cffff6666"..PBM_L["Hidden"].."|r") else stratBtn:SetBackdropColor(0.04, 0.14, 0.06, 1) - stratStateLbl:SetText("|cff55dd77Visible|r") + stratStateLbl:SetText("|cff55dd77"..PBM_L["Visible"].."|r") end end stratBtn:Refresh() @@ -2973,12 +2975,12 @@ local function OnFirstShow() end) stratBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(stratBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Strategy Whispers", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Filters bot strategy replies from the", 0.8, 0.8, 0.8) - GameTooltip:AddLine("PBM output box when you open a bot menu.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Strategy Whispers"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Filters bot strategy replies from the"], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["PBM output box when you open a bot menu."], 0.8, 0.8, 0.8) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("Filtered messages:", 0.6, 0.6, 0.6) - GameTooltip:AddLine("|cffd4af37[Bot] whispers: Strategies: tank, heal ...|r", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Filtered messages:"], 0.6, 0.6, 0.6) + GameTooltip:AddLine("|cffd4af37"..PBM_L["[Bot] whispers: Strategies: tank, heal ..."].."|r", 0.8, 0.8, 0.8) GameTooltip:Show() end) stratBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -2995,7 +2997,7 @@ local function OnFirstShow() local whoNameLbl = whoBtn:CreateFontString(nil, "OVERLAY") whoNameLbl:SetFont(VIS_FONT, 10, "OUTLINE") whoNameLbl:SetPoint("LEFT", whoBtn, "LEFT", 10, 0) - whoNameLbl:SetText("|cffd4af37Who Commands|r") + whoNameLbl:SetText("|cffd4af37"..PBM_L["Who Commands"].."|r") local whoStateLbl = whoBtn:CreateFontString(nil, "OVERLAY") whoStateLbl:SetFont(VIS_FONT, 10, "OUTLINE") @@ -3004,10 +3006,10 @@ local function OnFirstShow() function whoBtn:Refresh() if PBMConfig and PBMConfig.hideWhoCommands then whoBtn:SetBackdropColor(0.18, 0.04, 0.04, 1) - whoStateLbl:SetText("|cffff6666Hidden|r") + whoStateLbl:SetText("|cffff6666"..PBM_L["Hidden"].."|r") else whoBtn:SetBackdropColor(0.04, 0.14, 0.06, 1) - whoStateLbl:SetText("|cff55dd77Visible|r") + whoStateLbl:SetText("|cff55dd77"..PBM_L["Visible"].."|r") end end whoBtn:Refresh() @@ -3020,19 +3022,19 @@ local function OnFirstShow() end) whoBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(whoBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Who Commands", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Filters the bot query commands and their", 0.8, 0.8, 0.8) - GameTooltip:AddLine("responses from your chat window.", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Who Commands"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Filters the bot query commands and their"], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["responses from your chat window."], 0.8, 0.8, 0.8) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("Filtered outgoing:", 0.6, 0.6, 0.6) - GameTooltip:AddLine("|cffd4af37To [Bot]: co ? / nc ? / stats / who / ss ?|r", 0.8, 0.8, 0.8) - GameTooltip:AddLine("Filtered incoming:", 0.6, 0.6, 0.6) - GameTooltip:AddLine("|cffd4af37[Bot] whispers: stats, bag, durability line|r", 0.8, 0.8, 0.8) - GameTooltip:AddLine("|cffd4af37[Bot] whispers: race/class/level/GS line|r", 0.8, 0.8, 0.8) - GameTooltip:AddLine("|cffd4af37[Bot] whispers: Ignored spell list ...|r", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Filtered outgoing:"], 0.6, 0.6, 0.6) + GameTooltip:AddLine("|cffd4af37"..PBM_L["To [Bot]: co ? / nc ? / stats / who / ss ?"].."|r", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Filtered incoming:"], 0.6, 0.6, 0.6) + GameTooltip:AddLine("|cffd4af37"..PBM_L["[Bot] whispers: stats, bag, durability line"].."|r", 0.8, 0.8, 0.8) + GameTooltip:AddLine("|cffd4af37"..PBM_L["[Bot] whispers: race/class/level/GS line"].."|r", 0.8, 0.8, 0.8) + GameTooltip:AddLine("|cffd4af37"..PBM_L["[Bot] whispers: Ignored spell list ..."].."|r", 0.8, 0.8, 0.8) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("|cffaaaaaa\"who\" is sent automatically when opening", 0.7, 0.7, 0.7) - GameTooltip:AddLine("|cffaaaaaaa character's strategy menu.|r", 0.7, 0.7, 0.7) + GameTooltip:AddLine("|cffaaaaaa"..PBM_L["\"who\" is sent automatically when opening"], 0.7, 0.7, 0.7) + GameTooltip:AddLine("|cffaaaaaa"..PBM_L["a character's strategy menu."].."|r", 0.7, 0.7, 0.7) GameTooltip:Show() end) whoBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -3048,15 +3050,15 @@ local function OnFirstShow() local talNameLbl = talBtn:CreateFontString(nil, "OVERLAY") talNameLbl:SetFont(VIS_FONT, 10, "OUTLINE") talNameLbl:SetPoint("LEFT", talBtn, "LEFT", 10, 0) - talNameLbl:SetText("|cffd4af37Talent Whispers|r") + talNameLbl:SetText("|cffd4af37"..PBM_L["Talent Whispers"].."|r") local talStateLbl = talBtn:CreateFontString(nil, "OVERLAY") talStateLbl:SetFont(VIS_FONT, 10, "OUTLINE") talStateLbl:SetPoint("RIGHT", talBtn, "RIGHT", -10, 0) function talBtn:Refresh() if PBMConfig and PBMConfig.hideTalentsOutput then - talBtn:SetBackdropColor(0.18, 0.04, 0.04, 1); talStateLbl:SetText("|cffff6666Hidden|r") + talBtn:SetBackdropColor(0.18, 0.04, 0.04, 1); talStateLbl:SetText("|cffff6666"..PBM_L["Hidden"].."|r") else - talBtn:SetBackdropColor(0.04, 0.14, 0.06, 1); talStateLbl:SetText("|cff55dd77Visible|r") + talBtn:SetBackdropColor(0.04, 0.14, 0.06, 1); talStateLbl:SetText("|cff55dd77"..PBM_L["Visible"].."|r") end end talBtn:Refresh() @@ -3068,15 +3070,15 @@ local function OnFirstShow() end) talBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(talBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Talent Whispers", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Filters the talents exchange triggered by the", 0.8, 0.8, 0.8) - GameTooltip:AddLine("Templates menu (same for all 10 classes).", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Talent Whispers"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Filters the talents exchange triggered by the"], 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Templates menu (same for all 10 classes)."], 0.8, 0.8, 0.8) GameTooltip:AddLine(" ", 1, 1, 1) - GameTooltip:AddLine("Filtered outgoing:", 0.6, 0.6, 0.6) - GameTooltip:AddLine("|cffd4af37To [Bot]: talents / talents spec list ...|r", 0.8, 0.8, 0.8) - GameTooltip:AddLine("Filtered incoming:", 0.6, 0.6, 0.6) - GameTooltip:AddLine("|cffd4af37[Bot] whispers: My current talent spec is ...|r", 0.8, 0.8, 0.8) - GameTooltip:AddLine("|cffd4af37[Bot] whispers: numbered spec list, Total N specs|r", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Filtered outgoing:"], 0.6, 0.6, 0.6) + GameTooltip:AddLine("|cffd4af37"..PBM_L["To [Bot]: talents / talents spec list ..."].."|r", 0.8, 0.8, 0.8) + GameTooltip:AddLine(PBM_L["Filtered incoming:"], 0.6, 0.6, 0.6) + GameTooltip:AddLine("|cffd4af37"..PBM_L["[Bot] whispers: My current talent spec is ..."].."|r", 0.8, 0.8, 0.8) + GameTooltip:AddLine("|cffd4af37"..PBM_L["[Bot] whispers: numbered spec list, Total N specs"].."|r", 0.8, 0.8, 0.8) GameTooltip:Show() end) talBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -3098,9 +3100,9 @@ local function OnFirstShow() sLbl:SetPoint("RIGHT",btn,"RIGHT",-10,0) function btn:Refresh() if getState() then - btn:SetBackdropColor(0.04,0.14,0.06,1); sLbl:SetText("|cff55dd77On|r") + btn:SetBackdropColor(0.04,0.14,0.06,1); sLbl:SetText("|cff55dd77"..PBM_L["On"].."|r") else - btn:SetBackdropColor(0.18,0.04,0.04,1); sLbl:SetText("|cffff6666Off|r") + btn:SetBackdropColor(0.18,0.04,0.04,1); sLbl:SetText("|cffff6666"..PBM_L["Off"].."|r") end end btn:Refresh() @@ -3117,7 +3119,7 @@ local function OnFirstShow() return btn end - MakeMenuFilterBtn(col2Y, "Role Filter", + MakeMenuFilterBtn(col2Y, PBM_L["Role Filter"], function() return PBM.State.LBFilter and PBM.State.LBFilter.raidRoleFilter end, function() PBM.State.LBFilter.raidRoleFilter = not PBM.State.LBFilter.raidRoleFilter @@ -3128,35 +3130,35 @@ local function OnFirstShow() if PBM.State.LichborneOverviewFrame then PBM.RefreshOverviewRows() end if PBM.State.groupViewFrame then PBM.RefreshGroupViewRows() end end, - {{"Role Filter",0.78,0.61,0.23},{"Hides strategy roles in the Raid tab.",0.7,0.7,0.7},{"Allows manual role assignment per slot.",0.7,0.7,0.7}}) + {{PBM_L["Role Filter"],0.78,0.61,0.23},{PBM_L["Hides strategy roles in the Raid tab."],0.7,0.7,0.7},{PBM_L["Allows manual role assignment per slot."],0.7,0.7,0.7}}) - MakeMenuFilterBtn(col2Y - (VIS_BTN_H + 6), "Notes Filter", + MakeMenuFilterBtn(col2Y - (VIS_BTN_H + 6), PBM_L["Notes Filter"], function() return PBM.State.LBFilter and PBM.State.LBFilter.raidNotesFilter end, function() PBM.State.LBFilter.raidNotesFilter = not PBM.State.LBFilter.raidNotesFilter LichborneTrackerDB.raidNotesFilter = PBM.State.LBFilter.raidNotesFilter if PBM.State.raidRowFrames and #PBM.State.raidRowFrames > 0 then PBM.RefreshRaidRows() end end, - {{"Notes Filter",0.78,0.61,0.23},{"Hides strategy notes in the Raid tab.",0.7,0.7,0.7},{"Enables manual note entry per slot.",0.7,0.7,0.7}}) + {{PBM_L["Notes Filter"],0.78,0.61,0.23},{PBM_L["Hides strategy notes in the Raid tab."],0.7,0.7,0.7},{PBM_L["Enables manual note entry per slot."],0.7,0.7,0.7}}) -- Col1 slots 6 & 7: Char Sheet toggles (under Group Tab) -- Col1 step = VIS_BTN_H+6 = 36; 5 tabs placed, so next y = -34 - 36*5 = -214 - MakeMenuFilterBtn(-214, "Group Tab: Char Sheet", + MakeMenuFilterBtn(-214, PBM_L["Group Tab: Char Sheet"], function() return PBM.State.LBFilter and PBM.State.LBFilter.gvCharSheet ~= false end, function() PBM.State.LBFilter.gvCharSheet = not (PBM.State.LBFilter.gvCharSheet ~= false) LichborneTrackerDB.gvCharSheet = PBM.State.LBFilter.gvCharSheet end, - {{"Group Tab: Char Sheet",0.78,0.61,0.23},{"Enable or disable clicking a name in the",0.7,0.7,0.7},{"Group tab to open their character sheet.",0.7,0.7,0.7}}, + {{PBM_L["Group Tab: Char Sheet"],0.78,0.61,0.23},{PBM_L["Enable or disable clicking a name in the"],0.7,0.7,0.7},{PBM_L["Group tab to open their character sheet."],0.7,0.7,0.7}}, VIS_MX) - MakeMenuFilterBtn(-250, "Class Tabs: Char Sheet", + MakeMenuFilterBtn(-250, PBM_L["Class Tabs: Char Sheet"], function() return PBM.State.LBFilter and PBM.State.LBFilter.classCharSheet ~= false end, function() PBM.State.LBFilter.classCharSheet = not (PBM.State.LBFilter.classCharSheet ~= false) LichborneTrackerDB.classCharSheet = PBM.State.LBFilter.classCharSheet end, - {{"Class Tabs: Char Sheet",0.78,0.61,0.23},{"Enable or disable clicking a name in any",0.7,0.7,0.7},{"class tab to open their character sheet.",0.7,0.7,0.7}}, + {{PBM_L["Class Tabs: Char Sheet"],0.78,0.61,0.23},{PBM_L["Enable or disable clicking a name in any"],0.7,0.7,0.7},{PBM_L["class tab to open their character sheet."],0.7,0.7,0.7}}, VIS_MX) end @@ -3206,7 +3208,7 @@ local function OnFirstShow() local optsCloseBtn = CreateFrame("Button", nil, optionsPanel, "UIPanelButtonTemplate") optsCloseBtn:SetPoint("BOTTOMRIGHT", optionsPanel, "BOTTOMRIGHT", -8, 12) optsCloseBtn:SetSize(80, 24) - optsCloseBtn:SetText("Close") + optsCloseBtn:SetText(PBM_L["Close"]) optsCloseBtn:SetFrameLevel(optionsPanel:GetFrameLevel() + 3) optsCloseBtn:SetScript("OnClick", function() optionsPanel:Hide() end) @@ -3223,8 +3225,8 @@ local function OnFirstShow() settingsIcon:SetTexture("Interface\\Icons\\Trade_Engineering") settingsBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(settingsBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Menu", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Open the Playerbot Manager menu.", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Menu:"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Open the Playerbot Manager menu."], 1, 1, 1) GameTooltip:Show() end) settingsBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -3261,8 +3263,8 @@ local function OnFirstShow() end groupFilterBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(groupFilterBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Party Filter", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Hides characters |cffFF8C00not|r in your group/raid.", 0.7, 0.7, 0.7) + GameTooltip:AddLine(PBM_L["Party Filter"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Hides characters |cffFF8C00not|r in your group/raid."], 0.7, 0.7, 0.7) GameTooltip:Show() end) groupFilterBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -3306,8 +3308,8 @@ local function OnFirstShow() end hideRaidBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(hideRaidBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Raid Tab Filter", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Shows characters that have been added to the raid tab.", 0.7, 0.7, 0.7) + GameTooltip:AddLine(PBM_L["Raid Tab Filter"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Shows characters that have been added to the raid tab."], 0.7, 0.7, 0.7) GameTooltip:Show() end) hideRaidBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -3349,8 +3351,8 @@ local function OnFirstShow() end hideGroupBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(hideGroupBtn, "ANCHOR_TOP") - GameTooltip:AddLine("Hide Group Members", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Hides characters in your current group.", 0.7, 0.7, 0.7) + GameTooltip:AddLine(PBM_L["Hide Group Members"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Hides characters in your current group."], 0.7, 0.7, 0.7) GameTooltip:Show() end) hideGroupBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -3394,8 +3396,8 @@ local function OnFirstShow() end filterBtn2:SetScript("OnEnter", function() GameTooltip:SetOwner(filterBtn2, "ANCHOR_TOP") - GameTooltip:AddLine("Show Level", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Replaces row numbers with character level", 0.7, 0.7, 0.7) + GameTooltip:AddLine(PBM_L["Show Level"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Replaces row numbers with character level"], 0.7, 0.7, 0.7) GameTooltip:Show() end) filterBtn2:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -3437,8 +3439,8 @@ local function OnFirstShow() end filterBtn3:SetScript("OnEnter", function() GameTooltip:SetOwner(filterBtn3, "ANCHOR_TOP") - GameTooltip:AddLine("Show IP Tiers", 0.78, 0.61, 0.23) - GameTooltip:AddLine("Replaces row numbers with IP tier (1-18)", 0.7, 0.7, 0.7) + GameTooltip:AddLine(PBM_L["Show IP Tiers"], 0.78, 0.61, 0.23) + GameTooltip:AddLine(PBM_L["Replaces row numbers with IP tier (1-18)"], 0.7, 0.7, 0.7) GameTooltip:Show() end) filterBtn3:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -3491,8 +3493,8 @@ local function OnFirstShow() end tierKeyToggleBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(tierKeyToggleBtn, "ANCHOR_TOP") - GameTooltip:AddLine("|cffC69B3AIndividual Progression Tiers|r", 1, 1, 1) - GameTooltip:AddLine("Show or hide the tier key bar.", 0.7, 0.7, 0.7) + GameTooltip:AddLine("|cffC69B3A"..PBM_L["Individual Progression Tiers"].."|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Show or hide the tier key bar."], 0.7, 0.7, 0.7) GameTooltip:Show() end) tierKeyToggleBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -3506,7 +3508,7 @@ local function OnFirstShow() -- Tier Key filter swatches (bottom bar) tkLabel = f:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") tkLabel:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 15, 152) - tkLabel:SetText("|cffC69B3ATiers:|r") + tkLabel:SetText("|cffC69B3A"..PBM_L["Tiers:"].."|r") -- Single combined Tier Key button replacing T1–T17 individual swatches local tierKeyAllBtn = CreateFrame("Button", "LichborneTierKeyAllBtn", f) @@ -3523,18 +3525,18 @@ local function OnFirstShow() table.insert(tierKeyFrames, tierKeyAllBtn) tierKeyAllBtn:SetScript("OnEnter", function() GameTooltip:SetOwner(tierKeyAllBtn, "ANCHOR_TOP") - GameTooltip:AddLine("|cffC69B3AIndividual Progression Tiers|r", 1, 1, 1) - GameTooltip:AddLine("Level 60 Raids", 0.85, 0.85, 0.85) + GameTooltip:AddLine("|cffC69B3A"..PBM_L["Individual Progression Tiers"].."|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Level 60 Raids"], 0.85, 0.85, 0.85) for t = 0, 6 do local c = PBM.TIER_COLORS[t] or {r=0.6,g=0.6,b=0.6} GameTooltip:AddLine(" "..(PBM.TIER_LABELS[t] or ("T"..t)), c.r, c.g, c.b) end - GameTooltip:AddLine("Level 70 Raids", 0.85, 0.85, 0.85) + GameTooltip:AddLine(PBM_L["Level 70 Raids"], 0.85, 0.85, 0.85) for t = 7, 12 do local c = PBM.TIER_COLORS[t] or {r=0.6,g=0.6,b=0.6} GameTooltip:AddLine(" "..(PBM.TIER_LABELS[t] or ("T"..t)), c.r, c.g, c.b) end - GameTooltip:AddLine("Level 80 Raids", 0.85, 0.85, 0.85) + GameTooltip:AddLine(PBM_L["Level 80 Raids"], 0.85, 0.85, 0.85) for t = 13, 18 do local c = PBM.TIER_COLORS[t] or {r=0.6,g=0.6,b=0.6} GameTooltip:AddLine(" "..(PBM.TIER_LABELS[t] or ("T"..t)), c.r, c.g, c.b) @@ -3678,7 +3680,7 @@ local function BuildFrameBG() title:SetPoint("TOPLEFT", f, "TOPLEFT", 10, -12) title:SetPoint("TOPRIGHT", f, "TOPRIGHT", -280, -12) title:SetJustifyH("LEFT") - title:SetText("|cffC69B3APlayerbot Manager|r |cffffffff- v1.4|r") + title:SetText("|cffC69B3A"..PBM_L["Playerbot Manager"].."|r |cffffffff"..PBM_L["- v1.4"].."|r") local closeBtn = CreateFrame("Button", "LichborneCloseBtn", f, "UIPanelCloseButton") closeBtn:SetPoint("TOPRIGHT", f, "TOPRIGHT", 2, 2) closeBtn:SetScript("OnClick", function() f:Hide() end) @@ -3719,7 +3721,7 @@ local function BuildFrameBG() yBtn:SetBackdropColor(0.35,0.04,0.04,1); yBtn:SetBackdropBorderColor(1,0.2,0.2,0.9) yBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local yLbl=yBtn:CreateFontString(nil,"OVERLAY","GameFontNormal"); yLbl:SetAllPoints(yBtn); yLbl:SetJustifyH("CENTER") - yLbl:SetText("|cffff5555Yes, wipe it all|r") + yLbl:SetText("|cffff5555"..PBM_L["Yes, wipe it all"].."|r") yBtn:SetScript("OnClick",function() onConfirm(); cf:Hide() end) local nBtn = CreateFrame("Button",nil,cf) @@ -3728,15 +3730,15 @@ local function BuildFrameBG() nBtn:SetBackdropColor(0.04,0.15,0.04,1); nBtn:SetBackdropBorderColor(0.2,0.8,0.2,0.9) nBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local nLbl=nBtn:CreateFontString(nil,"OVERLAY","GameFontNormal"); nLbl:SetAllPoints(nBtn); nLbl:SetJustifyH("CENTER") - nLbl:SetText("|cff44ff44Keep my data|r") + nLbl:SetText("|cff44ff44"..PBM_L["Keep my data"].."|r") nBtn:SetScript("OnClick",function() cf:Hide() end) return cf end -- Confirm: Clear ALL data (characters + all raids) local confirmAll = MakeDangerConfirm( - "⚠ Wipe Entire Database?", - "This permanently deletes ALL tracked characters,\ngear data, raid rosters, and the Overview list.", + PBM_L["⚠ Wipe Entire Database?"], + PBM_L["This permanently deletes ALL tracked characters,\ngear data, raid rosters, and the Overview list."], function() LichborneTrackerDB.rows = {} LichborneTrackerDB.raidRosters = {} @@ -3749,7 +3751,7 @@ local function BuildFrameBG() LichborneTrackerDB.allGroups[g][i] = {name="",cls="",spec="",gs=0,realGs=0} end end - LichborneOutput("|cffC69B3APBM:|r |cffff4444All data wiped.|r", 1, 0.5, 0.5) + LichborneOutput("|cffC69B3A"..PBM_L["PBM:"].."|r |cffff4444"..PBM_L["All data wiped."].."|r", 1, 0.5, 0.5) PBM.RefreshRows() if PBM.State.LichborneOverviewFrame then PBM.RefreshOverviewRows() end if PBM.State.raidRowFrames and #PBM.State.raidRowFrames > 0 then PBM.RefreshRaidRows() end @@ -3765,14 +3767,14 @@ local function BuildFrameBG() clrAllBtn:SetBackdropColor(0.30,0.04,0.04,1); clrAllBtn:SetBackdropBorderColor(0.78,0.61,0.23,0.9) clrAllBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight","ADD") local clrAllLbl=clrAllBtn:CreateFontString(nil,"OVERLAY","GameFontNormalSmall"); clrAllLbl:SetAllPoints(clrAllBtn); clrAllLbl:SetJustifyH("CENTER") - clrAllLbl:SetText("|cffd4af37Clear All Data|r") + clrAllLbl:SetText("|cffd4af37"..PBM_L["Clear All Data"].."|r") clrAllBtn:SetScript("OnEnter",function() GameTooltip:SetOwner(clrAllBtn,"ANCHOR_BOTTOM") - GameTooltip:AddLine("|cffff2020Clear All Data|r",1,1,1) - GameTooltip:AddLine("Deletes ALL characters, gear data,",0.8,0.8,0.8) - GameTooltip:AddLine("raid rosters, and the Overview list.",0.8,0.8,0.8) - GameTooltip:AddLine("|cffFF8C00Does not clear LevelSync data.|r",1,1,1) - GameTooltip:AddLine("|cffff2020This cannot be undone.|r",1,1,1) + GameTooltip:AddLine("|cffff2020"..PBM_L["Clear All Data"].."|r",1,1,1) + GameTooltip:AddLine(PBM_L["Deletes ALL characters, gear data,"],0.8,0.8,0.8) + GameTooltip:AddLine(PBM_L["raid rosters, and the Overview list."],0.8,0.8,0.8) + GameTooltip:AddLine("|cffFF8C00"..PBM_L["Does not clear LevelSync data."].."|r",1,1,1) + GameTooltip:AddLine("|cffff2020"..PBM_L["This cannot be undone."].."|r",1,1,1) GameTooltip:Show() end) clrAllBtn:SetScript("OnLeave",function() GameTooltip:Hide() end) @@ -3879,5 +3881,4 @@ SlashCmdList["LICHBORNE"] = function(msg) else LichborneTracker_Open() end -end - +end \ No newline at end of file diff --git a/PBM/PBM_Warlock.lua b/PBM/PBM_Warlock.lua index d5e6576..db71194 100644 --- a/PBM/PBM_Warlock.lua +++ b/PBM/PBM_Warlock.lua @@ -1,5 +1,8 @@ PBM = PBM or {} +-- Localize translation engine +local PBM_L = PBM_L or PBM.L + -- Timer helper (mirrors Multibot pattern): uses C_Timer if available, else OnUpdate fallback local function PBM_TimerAfter(delay, callback) if C_Timer and C_Timer.After then @@ -18,12 +21,12 @@ end -- Talent spec templates for the Set Talents menu local WARLOCK_TALENT_SPECS = { - { label="Affliction |cffffcc00PvE|r", spec="affli pve", wowSpec="Affliction", icon="Interface\\Icons\\Spell_Shadow_DeathCoil" }, - { label="Demonology |cffffcc00PvE|r", spec="demo pve", wowSpec="Demonology", icon="Interface\\Icons\\Spell_Shadow_Metamorphosis" }, - { label="Destruction |cffffcc00PvE|r", spec="destro pve", wowSpec="Destruction", icon="Interface\\Icons\\Spell_Shadow_RainOfFire" }, - { label="Affliction |cffff4444PvP|r", spec="affli pvp", wowSpec="Affliction", icon="Interface\\Icons\\Spell_Shadow_DeathCoil" }, - { label="Demonology |cffff4444PvP|r", spec="demo pvp", wowSpec="Demonology", icon="Interface\\Icons\\Spell_Shadow_Metamorphosis" }, - { label="Destruction |cffff4444PvP|r", spec="destro pvp", wowSpec="Destruction", icon="Interface\\Icons\\Spell_Shadow_RainOfFire" }, + { label=PBM_L["Affliction"] .. " |cffffcc00PvE|r", spec="affli pve", wowSpec="Affliction", icon="Interface\\Icons\\Spell_Shadow_DeathCoil" }, + { label=PBM_L["Demonology"] .. " |cffffcc00PvE|r", spec="demo pve", wowSpec="Demonology", icon="Interface\\Icons\\Spell_Shadow_Metamorphosis" }, + { label=PBM_L["Destruction"] .. " |cffffcc00PvE|r", spec="destro pve", wowSpec="Destruction", icon="Interface\\Icons\\Spell_Shadow_RainOfFire" }, + { label=PBM_L["Affliction"] .. " |cffff4444PvP|r", spec="affli pvp", wowSpec="Affliction", icon="Interface\\Icons\\Spell_Shadow_DeathCoil" }, + { label=PBM_L["Demonology"] .. " |cffff4444PvP|r", spec="demo pvp", wowSpec="Demonology", icon="Interface\\Icons\\Spell_Shadow_Metamorphosis" }, + { label=PBM_L["Destruction"] .. " |cffff4444PvP|r", spec="destro pvp", wowSpec="Destruction", icon="Interface\\Icons\\Spell_Shadow_RainOfFire" }, } -- ───────────────────────────────────────────────────────────────────────────── @@ -177,37 +180,37 @@ function PBM.OpenWarlockMenu(row) local stonesColW = 2 * EXT_ICON_SIZE + 4 -- ── Row 1: Spec columns ────────────────────────────────────── - MakeSpecBox(col1X, specBoxY, SPEC_COL_W, "Affliction", + MakeSpecBox(col1X, specBoxY, SPEC_COL_W, PBM_L["Affliction"], "Interface\\Icons\\Spell_Shadow_DeathCoil") - MakeSpecBox(col2X, specBoxY, SPEC_COL_W, "Demonology", + MakeSpecBox(col2X, specBoxY, SPEC_COL_W, PBM_L["Demonology"], "Interface\\Icons\\Spell_Shadow_Metamorphosis") - MakeSpecBox(col3X, specBoxY, SPEC_COL_W, "Destruction", + MakeSpecBox(col3X, specBoxY, SPEC_COL_W, PBM_L["Destruction"], "Interface\\Icons\\Spell_Shadow_RainOfFire") local treeAffliBtn = MakeTreeBtn(col1X + ICON_OFF, specIconY, "Interface\\Icons\\Spell_Shadow_DeathCoil", function() - GameTooltip:SetText("|cffffcc00Affliction|r |cff999999- |r|cff8787EDaffli|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Affliction DoT specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Demonology, Destruction.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Affliction"] .. "|r |cff999999- |r|cff8787EDaffli|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Affliction DoT specialization"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Demonology, Destruction."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeAffliBtn = treeAffliBtn local treeDemoBtn = MakeTreeBtn(col2X + ICON_OFF, specIconY, "Interface\\Icons\\Spell_Shadow_Metamorphosis", function() - GameTooltip:SetText("|cffffcc00Demonology|r |cff999999- |r|cff8787EDdemo|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Demonology burst specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Affliction, Destruction.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Demonology"] .. "|r |cff999999- |r|cff8787EDdemo|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Demonology burst specialization"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Affliction, Destruction."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeDemoBtn = treeDemoBtn local treeDestroBtn = MakeTreeBtn(col3X + ICON_OFF, specIconY, "Interface\\Icons\\Spell_Shadow_RainOfFire", function() - GameTooltip:SetText("|cffffcc00Destruction|r |cff999999- |r|cff8787EDdestro|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Destruction fire specialization|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Affliction, Demonology.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Destruction"] .. "|r |cff999999- |r|cff8787EDdestro|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Destruction fire specialization"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Affliction, Demonology."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeDestroBtn = treeDestroBtn @@ -216,98 +219,98 @@ function PBM.OpenWarlockMenu(row) local R2_TOTAL = 3 * EXT_ICON_SIZE + 2 * 4 local R2_PAD = math.floor((TREE_TOTAL_W - R2_TOTAL) / 2) local function r2X(i) return TREE_X + R2_PAD + i * (EXT_ICON_SIZE + 4) end - MakeWideBox(TREE_X + R2_PAD, r2BoxY, R2_TOTAL, "Combat") + MakeWideBox(TREE_X + R2_PAD, r2BoxY, R2_TOTAL, PBM_L["Combat"]) local treeWarlockAoeBtn = MakeTreeBtn(r2X(0), r2IconY, "Interface\\Icons\\Spell_Frost_IceStorm", function() - GameTooltip:SetText("|cffffcc00AoE|r |cff999999- |r|cff8787EDaoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Warlock AoE rotation|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["AoE"] .. "|r |cff999999- |r|cff8787EDaoe|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Warlock AoE rotation"] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeWarlockAoeBtn = treeWarlockAoeBtn local treeMetaMeleeBtn = MakeTreeBtn(r2X(1), r2IconY, "Interface\\Icons\\Spell_Shadow_DemonForm", function() - GameTooltip:SetText("|cffffcc00Meta Melee|r |cff999999- |r|cff8787EDmeta melee|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Demonology melee mode|r", 1, 1, 1) - GameTooltip:AddLine("While |cff8787EDImmolation Aura|r is active,", 1, 1, 1) - GameTooltip:AddLine("closes to melee and uses |cff8787EDDemon Charge|r.", 1, 1, 1) - GameTooltip:AddLine("No effect without |cffffcc00Metamorphosis|r active.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Meta Melee"] .. "|r |cff999999- |r|cff8787EDmeta melee|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Demonology melee mode"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["While |cff8787EDImmolation Aura|r is active,"], 1, 1, 1) + GameTooltip:AddLine(PBM_L["closes to melee and uses |cff8787EDDemon Charge|r."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["No effect without |cffffcc00Metamorphosis|r active."], 1, 1, 1) end) LichborneWarlockMenu.treeMetaMeleeBtn = treeMetaMeleeBtn local treeTankBtn = MakeTreeBtn(r2X(2), r2IconY, "Interface\\Icons\\Ability_Warrior_ShieldMastery", function() - GameTooltip:SetText("|cffffcc00Tank|r |cff999999- |r|cff8787EDtank|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Warlock tank role|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Tank"] .. "|r |cff999999- |r|cff8787EDtank|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Warlock tank role"] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeTankBtn = treeTankBtn -- ── Left column: Curses (1-wide) beside Affliction ────────── - MakeSpecBox(cursesHdrX, cursesHdrY, 44, "Curses") + MakeSpecBox(cursesHdrX, cursesHdrY, 44, PBM_L["Curses"]) local treeCurseAgonyBtn = MakeTreeBtn(cursesX, curseIcon1Y, "Interface\\Icons\\Spell_Shadow_CurseOfSargeras", function() - GameTooltip:SetText("|cffffcc00Curse of Agony|r |cff999999- |r|cff8787EDcurse of agony|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Shadow DoT curse|r", 1, 1, 1) - GameTooltip:AddLine("Stacking shadow damage over 24 seconds.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one curse active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Curse of Agony"] .. "|r |cff999999- |r|cff8787EDcurse of agony|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Shadow DoT curse"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Stacking shadow damage over 24 seconds."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one curse active at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeCurseAgonyBtn = treeCurseAgonyBtn local treeCurseElementsBtn = MakeTreeBtn(cursesX, curseIcon2Y, "Interface\\Icons\\Spell_Shadow_ChillTouch", function() - GameTooltip:SetText("|cffffcc00Curse of the Elements|r |cff999999- |r|cff8787EDcurse of elements|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Spell damage amplifier|r", 1, 1, 1) - GameTooltip:AddLine("Increases Fire, Frost, Arcane, Shadow damage taken.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one curse active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Curse of the Elements"] .. "|r |cff999999- |r|cff8787EDcurse of elements|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Spell damage amplifier"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Increases Fire, Frost, Arcane, Shadow damage taken."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one curse active at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeCurseElementsBtn = treeCurseElementsBtn local treeCurseExhaustionBtn = MakeTreeBtn(cursesX, curseIcon3Y, "Interface\\Icons\\Spell_Shadow_GrimWard", function() - GameTooltip:SetText("|cffffcc00Curse of Exhaustion|r |cff999999- |r|cff8787EDcurse of exhaustion|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Movement speed slow curse|r", 1, 1, 1) - GameTooltip:AddLine("Reduces target movement speed by 30%.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one curse active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Curse of Exhaustion"] .. "|r |cff999999- |r|cff8787EDcurse of exhaustion|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Movement speed slow curse"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Reduces target movement speed by 30%."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one curse active at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeCurseExhaustionBtn = treeCurseExhaustionBtn local treeCurseDoomBtn = MakeTreeBtn(cursesX, curseIcon4Y, "Interface\\Icons\\Spell_Shadow_AuraOfDarkness", function() - GameTooltip:SetText("|cffffcc00Curse of Doom|r |cff999999- |r|cff8787EDcurse of doom|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Heavy delayed-hit curse|r", 1, 1, 1) - GameTooltip:AddLine("Massive shadow damage after 60 seconds.", 1, 1, 1) - GameTooltip:AddLine("Best on long boss fights.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one curse active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Curse of Doom"] .. "|r |cff999999- |r|cff8787EDcurse of doom|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Heavy delayed-hit curse"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Massive shadow damage after 60 seconds."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Best on long boss fights."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one curse active at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeCurseDoomBtn = treeCurseDoomBtn local treeCurseWeaknessBtn = MakeTreeBtn(cursesX, curseIcon5Y, "Interface\\Icons\\Spell_Shadow_CurseOfMannoroth", function() - GameTooltip:SetText("|cffffcc00Curse of Weakness|r |cff999999- |r|cff8787EDcurse of weakness|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Attack power reduction curse|r", 1, 1, 1) - GameTooltip:AddLine("Reduces target attack power by 478.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one curse active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Curse of Weakness"] .. "|r |cff999999- |r|cff8787EDcurse of weakness|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Attack power reduction curse"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Reduces target attack power by 478."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one curse active at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeCurseWeaknessBtn = treeCurseWeaknessBtn local treeCurseTonguesBtn = MakeTreeBtn(cursesX, curseIcon6Y, "Interface\\Icons\\Spell_Shadow_CurseOfTounges", function() - GameTooltip:SetText("|cffffcc00Curse of Tongues|r |cff999999- |r|cff8787EDcurse of tongues|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Spellcasting slow curse|r", 1, 1, 1) - GameTooltip:AddLine("Reduces target casting speed by 50%.", 1, 1, 1) - GameTooltip:AddLine("Best against caster targets.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one curse active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Curse of Tongues"] .. "|r |cff999999- |r|cff8787EDcurse of tongues|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Spellcasting slow curse"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Reduces target casting speed by 50%."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Best against caster targets."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one curse active at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeCurseTonguesBtn = treeCurseTonguesBtn @@ -322,7 +325,7 @@ function PBM.OpenWarlockMenu(row) stonesHdrLbl:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") stonesHdrLbl:SetTextColor(0.78, 0.61, 0.23, 1) stonesHdrLbl:SetAllPoints(); stonesHdrLbl:SetJustifyH("CENTER") - stonesHdrLbl:SetText("Stones") + stonesHdrLbl:SetText(PBM_L["Stones"]) local treeStoneSpellBtn = CreateFrame("Button", nil, LichborneWarlockMenu) treeStoneSpellBtn:SetSize(EXT_ICON_SIZE, EXT_ICON_SIZE) @@ -337,10 +340,10 @@ function PBM.OpenWarlockMenu(row) treeStoneSpellBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneWarlockMenu:GetFrameLevel() + 20) - GameTooltip:SetText("|cffffcc00Spellstone|r |cff999999- |r|cff8787EDspellstone|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Apply Spellstone|r", 1, 1, 1) - GameTooltip:AddLine("Max |cff3A8FC4mana|r, spell |cffFF9900crit|r, dispels one magic effect.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one stone active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Spellstone"] .. "|r |cff999999- |r|cff8787EDspellstone|r |cffee4433NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Apply Spellstone"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Max |cff3A8FC4mana|r, spell |cffFF9900crit|r, dispels one magic effect."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one stone active at a time."] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeStoneSpellBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -359,10 +362,10 @@ function PBM.OpenWarlockMenu(row) treeStoneFireBtn:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneWarlockMenu:GetFrameLevel() + 20) - GameTooltip:SetText("|cffffcc00Firestone|r |cff999999- |r|cff8787EDfirestone|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Apply Firestone|r", 1, 1, 1) - GameTooltip:AddLine("Adds |cffFF4444fire damage|r procs to weapon.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one stone active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Firestone"] .. "|r |cff999999- |r|cff8787EDfirestone|r |cffee4433NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Apply Firestone"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Adds |cffFF4444fire damage|r procs to weapon."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one stone active at a time."] .. "|r", 1, 1, 1) GameTooltip:Show() end) treeStoneFireBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -385,7 +388,7 @@ function PBM.OpenWarlockMenu(row) ccSideHdrLabel:SetFont("Fonts\\FRIZQT__.TTF", 9, "OUTLINE") ccSideHdrLabel:SetTextColor(0.78, 0.61, 0.23, 1) ccSideHdrLabel:SetAllPoints(); ccSideHdrLabel:SetJustifyH("CENTER") - ccSideHdrLabel:SetText("CC") + ccSideHdrLabel:SetText(PBM_L["CC"]) local treeCCBtn = CreateFrame("Button", nil, LichborneWarlockMenu) treeCCBtn:SetSize(EXT_ICON_SIZE, EXT_ICON_SIZE) @@ -400,10 +403,10 @@ function PBM.OpenWarlockMenu(row) GameTooltip:SetOwner(self, "ANCHOR_TOP") GameTooltip:SetFrameLevel(LichborneWarlockMenu:GetFrameLevel() + 20) GameTooltip:ClearLines() - GameTooltip:SetText("|cffffcc00CC|r |cff999999- |r|cff8787EDcc|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Crowd control|r", 1, 1, 1) - GameTooltip:AddLine("Fears or Banishes extra targets in combat.", 1, 1, 1) - GameTooltip:AddLine("Re-applies when the effect breaks.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["CC"] .. "|r |cff999999- |r|cff8787EDcc|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Crowd control"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Fears or Banishes extra targets in combat."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["Re-applies when the effect breaks."], 1, 1, 1) GameTooltip:Show() end) treeCCBtn:SetScript("OnLeave", function() GameTooltip:Hide() end) @@ -412,56 +415,56 @@ function PBM.OpenWarlockMenu(row) LichborneWarlockMenu.treeCCBtn = treeCCBtn -- ── Right column: Pets (1-wide) beside Destruction ───────── - MakeSpecBox(petsX, petsHdrY, EXT_ICON_SIZE, "Pets") + MakeSpecBox(petsX, petsHdrY, EXT_ICON_SIZE, PBM_L["Pets"]) local treePetImpBtn = MakeTreeBtn(petsX, petIcon1Y, "Interface\\Icons\\Spell_Shadow_SummonImp", function() - GameTooltip:SetText("|cffffcc00Imp|r |cff999999- |r|cff8787EDimp|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Summon Imp|r", 1, 1, 1) - GameTooltip:AddLine("Ranged fire damage, Firebolt spam.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one pet active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Imp"] .. "|r |cff999999- |r|cff8787EDimp|r |cffee4433NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Summon Imp"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Ranged fire damage, Firebolt spam."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one pet active at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treePetImpBtn = treePetImpBtn local treePetVoidBtn = MakeTreeBtn(petsX, petIcon2Y, "Interface\\Icons\\Spell_Shadow_SummonVoidWalker", function() - GameTooltip:SetText("|cffffcc00Voidwalker|r |cff999999- |r|cff8787EDvoidwalker|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Summon Voidwalker|r", 1, 1, 1) - GameTooltip:AddLine("Tanking pet — taunts and absorbs damage.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one pet active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Voidwalker"] .. "|r |cff999999- |r|cff8787EDvoidwalker|r |cffee4433NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Summon Voidwalker"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Tanking pet — taunts and absorbs damage."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one pet active at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treePetVoidBtn = treePetVoidBtn local treePetSuccubusBtn = MakeTreeBtn(petsX, petIcon3Y, "Interface\\Icons\\Spell_Shadow_SummonSuccubus", function() - GameTooltip:SetText("|cffffcc00Succubus|r |cff999999- |r|cff8787EDsuccubus|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Summon Succubus|r", 1, 1, 1) - GameTooltip:AddLine("DPS pet — |cff8787EDLash of Pain, Seduction|r CC.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one pet active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Succubus"] .. "|r |cff999999- |r|cff8787EDsuccubus|r |cffee4433NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Summon Succubus"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["DPS pet — |cff8787EDLash of Pain, Seduction|r CC."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one pet active at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treePetSuccubusBtn = treePetSuccubusBtn local treePetFelhunterBtn = MakeTreeBtn(petsX, petIcon4Y, "Interface\\Icons\\Spell_Shadow_SummonFelHunter", function() - GameTooltip:SetText("|cffffcc00Felhunter|r |cff999999- |r|cff8787EDfelhunter|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Summon Felhunter|r", 1, 1, 1) - GameTooltip:AddLine("|cff8787EDSpell Lock|r interrupts enemy casters.", 1, 1, 1) - GameTooltip:AddLine("|cff8787EDDevour Magic|r purges buffs, cleanses allies.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one pet active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Felhunter"] .. "|r |cff999999- |r|cff8787EDfelhunter|r |cffee4433NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Summon Felhunter"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cff8787EDSpell Lock|r interrupts enemy casters."], 1, 1, 1) + GameTooltip:AddLine(PBM_L["|cff8787EDDevour Magic|r purges buffs, cleanses allies."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one pet active at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treePetFelhunterBtn = treePetFelhunterBtn local treePetFelguardBtn = MakeTreeBtn(petsX, petIcon5Y, "Interface\\Icons\\Spell_Shadow_SummonFelGuard", function() - GameTooltip:SetText("|cffffcc00Felguard|r |cff999999- |r|cff8787EDfelguard|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Summon Felguard|r", 1, 1, 1) - GameTooltip:AddLine("Melee DPS pet, empowered by |cffffcc00Demonic Empowerment|r.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one pet active at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Felguard"] .. "|r |cff999999- |r|cff8787EDfelguard|r |cffee4433NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Summon Felguard"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Melee DPS pet, empowered by |cffffcc00Demonic Empowerment|r."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one pet active at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treePetFelguardBtn = treePetFelguardBtn @@ -469,45 +472,45 @@ function PBM.OpenWarlockMenu(row) local SS_TOTAL = 4 * EXT_ICON_SIZE + 3 * 4 local ssPad = math.floor((TREE_TOTAL_W - SS_TOTAL) / 2) local function ssX(i) return TREE_X + ssPad + i * (EXT_ICON_SIZE + 4) end - MakeWideBox(TREE_X + ssPad, r5BoxY, SS_TOTAL, "Soulstone") + MakeWideBox(TREE_X + ssPad, r5BoxY, SS_TOTAL, PBM_L["Soulstone"]) local treeSSSelfBtn = MakeTreeBtn(ssX(0), r5IconY, "Interface\\Icons\\Spell_Shadow_Shadowform", function() - GameTooltip:SetText("|cffffcc00SS Self|r |cff999999- |r|cff8787EDss self|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Soulstone self|r", 1, 1, 1) - GameTooltip:AddLine("Bot places |cff8787EDSoulstone|r on itself.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one Soulstone target at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["SS Self"] .. "|r |cff999999- |r|cff8787EDss self|r |cffee4433NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Soulstone self"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot places |cff8787EDSoulstone|r on itself."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one Soulstone target at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeSSSelfBtn = treeSSSelfBtn local treeSSMasterBtn = MakeTreeBtn(ssX(1), r5IconY, "Interface\\Icons\\Achievement_WorldEvent_LittleHelper", function() - GameTooltip:SetText("|cffffcc00SS Master|r |cff999999- |r|cff8787EDss master|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Soulstone the group leader|r", 1, 1, 1) - GameTooltip:AddLine("Bot places |cff8787EDSoulstone|r on the group leader.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one Soulstone target at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["SS Master"] .. "|r |cff999999- |r|cff8787EDss master|r |cffee4433NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Soulstone the group leader"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot places |cff8787EDSoulstone|r on the group leader."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one Soulstone target at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeSSMasterBtn = treeSSMasterBtn local treeSSTankBtn = MakeTreeBtn(ssX(2), r5IconY, "Interface\\Icons\\Ability_Warrior_DefensiveStance", function() - GameTooltip:SetText("|cffffcc00SS Tank|r |cff999999- |r|cff8787EDss tank|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Soulstone the main tank|r", 1, 1, 1) - GameTooltip:AddLine("Bot places |cff8787EDSoulstone|r on the tank.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one Soulstone target at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["SS Tank"] .. "|r |cff999999- |r|cff8787EDss tank|r |cffee4433NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Soulstone the main tank"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot places |cff8787EDSoulstone|r on the tank."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one Soulstone target at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeSSTankBtn = treeSSTankBtn local treeSSHealerBtn = MakeTreeBtn(ssX(3), r5IconY, "Interface\\Icons\\INV_Elemental_Primal_Life", function() - GameTooltip:SetText("|cffffcc00SS Healer|r |cff999999- |r|cff8787EDss healer|r |cffee4433NC|r") - GameTooltip:AddLine("|cffffcc00Soulstone the main healer|r", 1, 1, 1) - GameTooltip:AddLine("Bot places |cff8787EDSoulstone|r on the healer.", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Only one Soulstone target at a time.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["SS Healer"] .. "|r |cff999999- |r|cff8787EDss healer|r |cffee4433NC|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Soulstone the main healer"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot places |cff8787EDSoulstone|r on the healer."], 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Only one Soulstone target at a time."] .. "|r", 1, 1, 1) end) LichborneWarlockMenu.treeSSHealerBtn = treeSSHealerBtn @@ -515,32 +518,32 @@ function PBM.OpenWarlockMenu(row) local R6_TOTAL = 3 * EXT_ICON_SIZE + 2 * 4 local R6_PAD = math.floor((TREE_TOTAL_W - R6_TOTAL) / 2) local function r6X(i) return TREE_X + R6_PAD + i * (EXT_ICON_SIZE + 4) end - MakeWideBox(TREE_X + R6_PAD, r6BoxY, R6_TOTAL, "Assist") + MakeWideBox(TREE_X + R6_PAD, r6BoxY, R6_TOTAL, PBM_L["Assist"]) local treeTankAssistBtn = MakeTreeBtn(r6X(0), r6IconY, "Interface\\Icons\\inv_shield_02", function() - GameTooltip:SetText("|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Tank target focus|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks the tank's current target.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Tank Assist"] .. "|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Tank target focus"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks the tank's current target."], 1, 1, 1) end) LichborneWarlockMenu.treeTankAssistBtn = treeTankAssistBtn local treeDpsAssistBtn = MakeTreeBtn(r6X(1), r6IconY, "Interface\\Icons\\Ability_Warrior_Challange", function() - GameTooltip:SetText("|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00DPS target focus|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks the group's coordinated DPS target.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["DPS Assist"] .. "|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["DPS target focus"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks the group's coordinated DPS target."], 1, 1, 1) end) LichborneWarlockMenu.treeDpsAssistBtn = treeDpsAssistBtn local treeDpsAoeBtn = MakeTreeBtn(r6X(2), r6IconY, "Interface\\Icons\\Spell_Shadow_RainOfFire", function() - GameTooltip:SetText("|cffffcc00DPS AoE|r |cff999999- |r|cff8787EDaoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Cross-role AoE mode|r", 1, 1, 1) - GameTooltip:AddLine("Switches to AoE rotation on multiple targets.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["DPS AoE"] .. "|r |cff999999- |r|cff8787EDaoe|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Cross-role AoE mode"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Switches to AoE rotation on multiple targets."], 1, 1, 1) end) LichborneWarlockMenu.treeDpsAoeBtn = treeDpsAoeBtn @@ -812,4 +815,4 @@ function PBM.OpenWarlockMenu(row) HideAllWarlock(); return end PBM.ShowCharSheet(LichborneWarlockMenu, LichborneWarlockCatcher, row, WARLOCK_LEFT_EXT) -end +end \ No newline at end of file diff --git a/PBM/PBM_Warrior.lua b/PBM/PBM_Warrior.lua index 3cf30e9..98391f8 100644 --- a/PBM/PBM_Warrior.lua +++ b/PBM/PBM_Warrior.lua @@ -132,34 +132,34 @@ function PBM.OpenWarriorMenu(row) local CENTER_X = col1X + math.floor(SPEC_W / 2) local singleOff = math.floor((COL_W - EXT_ICON_SIZE) / 2) - MakeWideBox(col1X, specBoxY, COL_W, "Arms", "Interface\\Icons\\Ability_Warrior_Sunder") - MakeWideBox(col2X, specBoxY, COL_W, "Fury", "Interface\\Icons\\Ability_Warrior_InnerRage") - MakeWideBox(col3X, specBoxY, COL_W, "Protection", "Interface\\Icons\\Ability_Warrior_DefensiveStance") + MakeWideBox(col1X, specBoxY, COL_W, PBM_L["Arms"], "Interface\\Icons\\Ability_Warrior_Sunder") + MakeWideBox(col2X, specBoxY, COL_W, PBM_L["Fury"], "Interface\\Icons\\Ability_Warrior_InnerRage") + MakeWideBox(col3X, specBoxY, COL_W, PBM_L["Protection"], "Interface\\Icons\\Ability_Warrior_DefensiveStance") local treeArmsBtn = MakeTreeBtn(col1X + singleOff, specIconY, "Interface\\Icons\\Ability_Warrior_Sunder", function() - GameTooltip:SetText("|cffffcc00Arms|r |cff999999- |r|cffC79C6Earms|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Arms DPS|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Fury, Protection.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Arms"] .. "|r |cff999999- |r|cffC79C6Earms|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Arms DPS"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Fury, Protection."] .. "|r", 1, 1, 1) end) LichborneWarriorMenu.treeArmsBtn = treeArmsBtn local treeFuryBtn = MakeTreeBtn(col2X + singleOff, specIconY, "Interface\\Icons\\Ability_Warrior_InnerRage", function() - GameTooltip:SetText("|cffffcc00Fury|r |cff999999- |r|cffC79C6Efury|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Fury DPS|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Arms, Protection.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Fury"] .. "|r |cff999999- |r|cffC79C6Efury|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Fury DPS"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Arms, Protection."] .. "|r", 1, 1, 1) end) LichborneWarriorMenu.treeFuryBtn = treeFuryBtn local treeTankBtn = MakeTreeBtn(col3X + singleOff, specIconY, "Interface\\Icons\\Ability_Warrior_DefensiveStance", function() - GameTooltip:SetText("|cffffcc00Protection|r |cff999999- |r|cffC79C6Etank|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Protection tank|r", 1, 1, 1) - GameTooltip:AddLine("|cffFF4444Mutually exclusive with Arms, Fury.|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Protection"] .. "|r |cff999999- |r|cffC79C6Etank|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Protection tank"] .. "|r", 1, 1, 1) + GameTooltip:AddLine("|cffFF4444" .. PBM_L["Mutually exclusive with Arms, Fury."] .. "|r", 1, 1, 1) end) LichborneWarriorMenu.treeTankBtn = treeTankBtn @@ -167,13 +167,13 @@ function PBM.OpenWarriorMenu(row) local aoeBoxY = specBoxY - BOX_H - ROW_GAP local aoeIconY = aoeBoxY - BOX_H - 3 local aoeBoxW = 60 - MakeWideBox(CENTER_X - math.floor(aoeBoxW / 2), aoeBoxY, aoeBoxW, "AoE") + MakeWideBox(CENTER_X - math.floor(aoeBoxW / 2), aoeBoxY, aoeBoxW, PBM_L["AoE"]) local treeDpsAoeBtn = MakeTreeBtn(CENTER_X - 13, aoeIconY, "Interface\\Icons\\Spell_Frost_IceStorm", function() - GameTooltip:SetText("|cffffcc00DPS AoE|r |cff999999- |r|cffC79C6Eaoe|r |cffee4433CO|r") - GameTooltip:AddLine("|cffffcc00Cross-role AoE mode|r", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["DPS AoE"] .. "|r |cff999999- |r|cffC79C6Eaoe|r |cffee4433CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Cross-role AoE mode"] .. "|r", 1, 1, 1) end) LichborneWarriorMenu.treeDpsAoeBtn = treeDpsAoeBtn @@ -181,23 +181,23 @@ function PBM.OpenWarriorMenu(row) local assistBoxY = aoeBoxY - BOX_H - ROW_GAP local assistIconY = assistBoxY - BOX_H - 3 local assistBoxW = 84 - MakeWideBox(CENTER_X - math.floor(assistBoxW / 2), assistBoxY, assistBoxW, "Assist") + MakeWideBox(CENTER_X - math.floor(assistBoxW / 2), assistBoxY, assistBoxW, PBM_L["Assist"]) local treeTankAssistBtn = MakeTreeBtn(CENTER_X - 28, assistIconY, "Interface\\Icons\\inv_shield_02", function() - GameTooltip:SetText("|cffffcc00Tank Assist|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00Tank target focus|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks the tank's current target.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["Tank Assist"] .. "|r |cff999999- |r|cffff8000tank assist|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["Tank target focus"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks the tank's current target."], 1, 1, 1) end) LichborneWarriorMenu.treeTankAssistBtn = treeTankAssistBtn local treeDpsAssistBtn = MakeTreeBtn(CENTER_X + 2, assistIconY, "Interface\\Icons\\Ability_Warrior_Challange", function() - GameTooltip:SetText("|cffffcc00DPS Assist|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") - GameTooltip:AddLine("|cffffcc00DPS target focus|r", 1, 1, 1) - GameTooltip:AddLine("Bot attacks the group DPS focus target.", 1, 1, 1) + GameTooltip:SetText("|cffffcc00" .. PBM_L["DPS Assist"] .. "|r |cff999999- |r|cffff8000dps assist|r |cffffcc00CO|r") + GameTooltip:AddLine("|cffffcc00" .. PBM_L["DPS target focus"] .. "|r", 1, 1, 1) + GameTooltip:AddLine(PBM_L["Bot attacks the group DPS focus target."], 1, 1, 1) end) LichborneWarriorMenu.treeDpsAssistBtn = treeDpsAssistBtn @@ -311,4 +311,4 @@ function PBM.OpenWarriorMenu(row) HideAllWarrior(); return end PBM.ShowCharSheet(LichborneWarriorMenu, LichborneWarriorCatcher, row, WARRIOR_LEFT_EXT) -end +end \ No newline at end of file diff --git a/PBM/PBM_Windows.lua b/PBM/PBM_Windows.lua index 9bc54f0..1aca50b 100644 --- a/PBM/PBM_Windows.lua +++ b/PBM/PBM_Windows.lua @@ -22,47 +22,47 @@ PBM._waitFor = {} -- [botName] = state string -- ── Info strings (localization defaults) ───────────────────── PBM.info = PBM.info or {} PBM.info.talent = PBM.info.talent or { - ["Points"] = "Talent Points: ", - ["Title"] = "Talents: NAME", - Apply = "Apply", - Copy = "Copy Target", + ["Points"] = PBM_L["Talent Points: "], + ["Title"] = PBM_L["Talents: NAME"], + Apply = PBM_L["Apply"], + Copy = PBM_L["Copy Target"], -- Class spec names (class..specNum) - DeathKnight1 = "Blood", DeathKnight2 = "Frost", DeathKnight3 = "Unholy", - Druid1 = "Balance", Druid2 = "Feral", Druid3 = "Restoration", - Hunter1 = "Beast", Hunter2 = "Marks", Hunter3 = "Survival", - Mage1 = "Arcane", Mage2 = "Fire", Mage3 = "Frost", - Paladin1 = "Holy", Paladin2 = "Protection", Paladin3 = "Retribution", - Priest1 = "Discipline", Priest2 = "Holy", Priest3 = "Shadow", - Rogue1 = "Assassination", Rogue2 = "Combat", Rogue3 = "Subtlety", - Shaman1 = "Elemental", Shaman2 = "Enhancement", Shaman3 = "Restoration", - Warlock1 = "Affliction", Warlock2 = "Demonology", Warlock3 = "Destruction", - Warrior1 = "Arms", Warrior2 = "Fury", Warrior3 = "Protection", + DeathKnight1 = PBM_L["Blood"], DeathKnight2 = PBM_L["Frost"], DeathKnight3 = PBM_L["Unholy"], + Druid1 = PBM_L["Balance"], Druid2 = PBM_L["Feral"], Druid3 = PBM_L["Restoration"], + Hunter1 = PBM_L["Beast"], Hunter2 = PBM_L["Marks"], Hunter3 = PBM_L["Survival"], + Mage1 = PBM_L["Arcane"], Mage2 = PBM_L["Fire"], Mage3 = PBM_L["Frost"], + Paladin1 = PBM_L["Holy"], Paladin2 = PBM_L["Protection"], Paladin3 = PBM_L["Retribution"], + Priest1 = PBM_L["Discipline"], Priest2 = PBM_L["Holy"], Priest3 = PBM_L["Shadow"], + Rogue1 = PBM_L["Assassination"], Rogue2 = PBM_L["Combat"], Rogue3 = PBM_L["Subtlety"], + Shaman1 = PBM_L["Elemental"], Shaman2 = PBM_L["Enhancement"], Shaman3 = PBM_L["Restoration"], + Warlock1 = PBM_L["Affliction"], Warlock2 = PBM_L["Demonology"], Warlock3 = PBM_L["Destruction"], + Warrior1 = PBM_L["Arms"], Warrior2 = PBM_L["Fury"], Warrior3 = PBM_L["Protection"], } -PBM.info.inventory = "Inventory: NAME" -PBM.info.spellbook = "Spellbook: NAME" -PBM.info.target = "No target selected" -PBM.info.action = "No action selected" -PBM.info.itemsellalert = "Cannot sell Hearthstone!" -PBM.info.keydestroyalert = "Cannot destroy a key!" -PBM.info.itemdestroyalert = "Are you sure you want to destroy %s?" -PBM.info.glyphsglyphsfor = "Glyphs for" +PBM.info.inventory = PBM_L["Inventory: NAME"] +PBM.info.spellbook = PBM_L["Spellbook: NAME"] +PBM.info.target = PBM_L["No target selected"] +PBM.info.action = PBM_L["No action selected"] +PBM.info.itemsellalert = PBM_L["Cannot sell Hearthstone!"] +PBM.info.keydestroyalert = PBM_L["Cannot destroy a key!"] +PBM.info.itemdestroyalert = PBM_L["Are you sure you want to destroy %s?"] +PBM.info.glyphsglyphsfor = PBM_L["Glyphs for"] PBM.tips = PBM.tips or {} PBM.tips.move = PBM.tips.move or { - talent = "Move Talent Window", - inventory = "Move Inventory Window", - spellbook = "Move Spellbook Window", - stats = "Move Stats Window", + talent = PBM_L["Move Talent Window"], + inventory = PBM_L["Move Inventory Window"], + spellbook = PBM_L["Move Spellbook Window"], + stats = PBM_L["Move Stats Window"], } PBM.tips.inventory = PBM.tips.inventory or { - sell = "Sell selected item", - sellgrey = "Sell all grey items", - sellvendor = "Sell all vendor items", - equip = "Equip item", - use = "Use item", - trade = "Trade item to you", - drop = "Destroy item", - open = "Open all containers", + sell = PBM_L["Sell selected item"], + sellgrey = PBM_L["Sell all grey items"], + sellvendor = PBM_L["Sell all vendor items"], + equip = PBM_L["Equip item"], + use = PBM_L["Use item"], + trade = PBM_L["Trade item to you"], + drop = PBM_L["Destroy item"], + open = PBM_L["Open all containers"], } -- ════════════════════════════════════════════════════════════ @@ -71,7 +71,7 @@ PBM.tips.inventory = PBM.tips.inventory or { PBM.inventory = PBM.newFrame(PBM._windowParent, -700, -144, 32, 442, 884) PBM.inventory.addTexture("Interface\\AddOns\\PlayerBotManager\\Textures\\Inventory.blp") -PBM.inventory.addText("Title", "Inventory", "CENTER", -58, 429, 12) +PBM.inventory.addText("Title", PBM_L["Inventory"], "CENTER", -58, 429, 12) PBM.inventory.action = "s" PBM.inventory:SetMovable(true) PBM.inventory:Hide() @@ -245,7 +245,7 @@ tFrame.addTexture("Interface/Spellbook/UI-SpellbookPanel-BotRight") tFrame:SetFrameLevel(4) local tOverlay = PBM.spellbook.addFrame("Overlay", -47, 81, 28, 258, 292) -tOverlay.addText("Title", "Spellbook", "CENTER", 14, 200, 13) +tOverlay.addText("Title", PBM_L["Spellbook"], "CENTER", 14, 200, 13) tOverlay.addText("Pages", "0/0", "CENTER", 14, 173, 13) tOverlay:SetFrameLevel(5) @@ -290,8 +290,8 @@ tOverlay.wowButton("X", 16, 336, 15, 18, 11) PBM.spellbook:Hide() end -tOverlay.addText("R01", "|cff402000Rank|r", "TOPLEFT", 44, -16, 11) -tOverlay.addText("T01", "|cffffcc00Title|r", "TOPLEFT", 30, -2, 12) +tOverlay.addText("R01", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 44, -16, 11) +tOverlay.addText("T01", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 30, -2, 12) local tButton = tOverlay.addButton("S01", -230, 264, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -300,8 +300,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R02", "|cff402000Rank|r", "TOPLEFT", 172, -16, 11) -tOverlay.addText("T02", "|cffffcc00Title|r", "TOPLEFT", 159, -2, 12) +tOverlay.addText("R02", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 172, -16, 11) +tOverlay.addText("T02", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 159, -2, 12) local tButton = tOverlay.addButton("S02", -101, 264, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -310,8 +310,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R03", "|cff402000Rank|r", "TOPLEFT", 44, -52, 11) -tOverlay.addText("T03", "|cffffcc00Title|r", "TOPLEFT", 30, -38, 12) +tOverlay.addText("R03", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 44, -52, 11) +tOverlay.addText("T03", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 30, -38, 12) local tButton = tOverlay.addButton("S03", -230, 228, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -320,8 +320,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R04", "|cff402000Rank|r", "TOPLEFT", 172, -52, 11) -tOverlay.addText("T04", "|cffffcc00Title|r", "TOPLEFT", 159, -38, 12) +tOverlay.addText("R04", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 172, -52, 11) +tOverlay.addText("T04", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 159, -38, 12) local tButton = tOverlay.addButton("S04", -101, 228, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -330,8 +330,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R05", "|cff402000Rank|r", "TOPLEFT", 44, -88, 11) -tOverlay.addText("T05", "|cffffcc00Title|r", "TOPLEFT", 30, -74, 12) +tOverlay.addText("R05", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 44, -88, 11) +tOverlay.addText("T05", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 30, -74, 12) local tButton = tOverlay.addButton("S05", -230, 192, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -340,8 +340,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R06", "|cff402000Rank|r", "TOPLEFT", 172, -88, 11) -tOverlay.addText("T06", "|cffffcc00Title|r", "TOPLEFT", 159, -74, 12) +tOverlay.addText("R06", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 172, -88, 11) +tOverlay.addText("T06", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 159, -74, 12) local tButton = tOverlay.addButton("S06", -101, 192, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -350,8 +350,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R07", "|cff402000Rank|r", "TOPLEFT", 44, -124, 11) -tOverlay.addText("T07", "|cffffcc00Title|r", "TOPLEFT", 30, -110, 12) +tOverlay.addText("R07", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 44, -124, 11) +tOverlay.addText("T07", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 30, -110, 12) local tButton = tOverlay.addButton("S07", -230, 156, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -360,8 +360,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R08", "|cff402000Rank|r", "TOPLEFT", 172, -124, 11) -tOverlay.addText("T08", "|cffffcc00Title|r", "TOPLEFT", 159, -110, 12) +tOverlay.addText("R08", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 172, -124, 11) +tOverlay.addText("T08", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 159, -110, 12) local tButton = tOverlay.addButton("S08", -101, 156, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -370,8 +370,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R09", "|cff402000Rank|r", "TOPLEFT", 44, -160, 11) -tOverlay.addText("T09", "|cffffcc00Title|r", "TOPLEFT", 30, -146, 12) +tOverlay.addText("R09", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 44, -160, 11) +tOverlay.addText("T09", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 30, -146, 12) local tButton = tOverlay.addButton("S09", -230, 120, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -380,8 +380,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R10", "|cff402000Rank|r", "TOPLEFT", 172, -160, 11) -tOverlay.addText("T10", "|cffffcc00Title|r", "TOPLEFT", 159, -146, 12) +tOverlay.addText("R10", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 172, -160, 11) +tOverlay.addText("T10", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 159, -146, 12) local tButton = tOverlay.addButton("S10", -101, 120, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -390,8 +390,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R11", "|cff402000Rank|r", "TOPLEFT", 44, -196, 11) -tOverlay.addText("T11", "|cffffcc00Title|r", "TOPLEFT", 30, -182, 12) +tOverlay.addText("R11", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 44, -196, 11) +tOverlay.addText("T11", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 30, -182, 12) local tButton = tOverlay.addButton("S11", -230, 84, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -400,8 +400,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R12", "|cff402000Rank|r", "TOPLEFT", 172, -196, 11) -tOverlay.addText("T12", "|cffffcc00Title|r", "TOPLEFT", 159, -182, 12) +tOverlay.addText("R12", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 172, -196, 11) +tOverlay.addText("T12", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 159, -182, 12) local tButton = tOverlay.addButton("S12", -101, 84, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -410,8 +410,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R13", "|cff402000Rank|r", "TOPLEFT", 44, -232, 11) -tOverlay.addText("T13", "|cffffcc00Title|r", "TOPLEFT", 30, -218, 12) +tOverlay.addText("R13", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 44, -232, 11) +tOverlay.addText("T13", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 30, -218, 12) local tButton = tOverlay.addButton("S13", -230, 48, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -420,8 +420,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R14", "|cff402000Rank|r", "TOPLEFT", 172, -232, 11) -tOverlay.addText("T14", "|cffffcc00Title|r", "TOPLEFT", 159, -218, 12) +tOverlay.addText("R14", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 172, -232, 11) +tOverlay.addText("T14", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 159, -218, 12) local tButton = tOverlay.addButton("S14", -101, 48, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -430,8 +430,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R15", "|cff402000Rank|r", "TOPLEFT", 44, -268, 11) -tOverlay.addText("T15", "|cffffcc00Title|r", "TOPLEFT", 30, -254, 12) +tOverlay.addText("R15", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 44, -268, 11) +tOverlay.addText("T15", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 30, -254, 12) local tButton = tOverlay.addButton("S15", -230, 12, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -440,8 +440,8 @@ tButton.doLeft = function(pButton) SendChatMessage("cast " .. pButton.spell, "WHISPER", nil, PBM.spellbook.name) end -tOverlay.addText("R16", "|cff402000Rank|r", "TOPLEFT", 172, -268, 11) -tOverlay.addText("T16", "|cffffcc00Title|r", "TOPLEFT", 159, -254, 12) +tOverlay.addText("R16", "|cff402000" .. PBM_L["Rank"] .. "|r", "TOPLEFT", 172, -268, 11) +tOverlay.addText("T16", "|cffffcc00" .. PBM_L["Title"] .. "|r", "TOPLEFT", 159, -254, 12) local tButton = tOverlay.addButton("S16", -101, 12, "inv_misc_questionmark", "Text") tButton.doRight = function(pButton) PBM.SpellToMacro(PBM.spellbook.name, pButton.spell, pButton.texture) @@ -508,10 +508,10 @@ copyBtn.doLeft = function(pButton) if(tName == nil or tName == "Unknown Entity") then return SendChatMessage(PBM.info.target, "SAY") end local tLocClass, tClass = UnitClass("target") - if(PBM.talent.class ~= PBM.toClass(tClass)) then return SendChatMessage("The Classes do not match.", "SAY") end + if(PBM.talent.class ~= PBM.toClass(tClass)) then return SendChatMessage(PBM_L["The Classes do not match."], "SAY") end local tUnit = PBM.toUnit(PBM.talent.name) - if(UnitLevel(tUnit) ~= UnitLevel("target")) then return SendChatMessage("The Levels do not match.", "SAY") end + if(UnitLevel(tUnit) ~= UnitLevel("target")) then return SendChatMessage(PBM_L["The Levels do not match."], "SAY") end local tValues = "" @@ -535,21 +535,21 @@ end local tTab = PBM.talent.addFrame("Tab1", -830, 518, 28, 170, 408) tTab.addTexture("Interface\\AddOns\\PlayerBotManager\\Textures\\White.blp") -tTab.addText("Title", "Title", "CENTER", 0, 214, 13) +tTab.addText("Title", PBM_L["Title"], "CENTER", 0, 214, 13) tTab.arrows = {} tTab.value = 0 tTab.id = 1 local tTab = PBM.talent.addFrame("Tab2", -656, 518, 28, 170, 408) tTab.addTexture("Interface\\AddOns\\PlayerBotManager\\Textures\\White.blp") -tTab.addText("Title", "Title", "CENTER", 0, 214, 13) +tTab.addText("Title", PBM_L["Title"], "CENTER", 0, 214, 13) tTab.arrows = {} tTab.value = 0 tTab.id = 2 local tTab = PBM.talent.addFrame("Tab3", -482, 518, 28, 170, 408) tTab.addTexture("Interface\\AddOns\\PlayerBotManager\\Textures\\White.blp") -tTab.addText("Title", "Title", "CENTER", 0, 214, 13) +tTab.addText("Title", PBM_L["Title"], "CENTER", 0, 214, 13) tTab.arrows = {} tTab.value = 0 tTab.id = 3 @@ -586,7 +586,7 @@ function PBM.FillDefaultGlyphs() -- { [1]={id=…,type=…}, …, [6]={…} } local rec = PBM.receivedGlyphs and PBM.receivedGlyphs[botName] if not rec then - DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00[PBM]|r Waiting for glyphs…") + DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00[PBM]|r " .. PBM_L["Waiting for glyphs…"]) return end @@ -687,7 +687,7 @@ tTab:Hide() local parentTab4 = PBM.talent.frames["Tab4"] -- alias -- Bouton “Apply Glyphs” – créé **une seule fois** : -gApply = parentTab4.wowButton("Apply Glyphs", 0, 0, 100, 20, 12) +gApply = parentTab4.wowButton(PBM_L["Apply Glyphs"], 0, 0, 100, 20, 12) gApply:ClearAllPoints() gApply:SetPoint("TOPRIGHT", parentTab4, "TOPRIGHT", -20, -20) gApply:SetFrameLevel(parentTab4:GetFrameLevel() + 10) @@ -774,7 +774,7 @@ tGlyph.addFrame("Overlay", -12, 12, 96) .setLevel(9).doHide() -- TAB TALENTS -- local tTab = PBM.talent.addFrame("Tab5", -900, 461, 28, 96, 24) tTab.addTexture("Interface\\AddOns\\PlayerBotManager\\Textures\\Talent_Tab.blp") -tTab.wowButton("Talents", -2, 6, 92, 17, 11) +tTab.wowButton(PBM_L["Talents"], -2, 6, 92, 17, 11) .doLeft = function(pButton) if gApply then gApply:Hide() end -- Update UI @@ -790,7 +790,7 @@ end -- TAB GLYPHS -- local tTab = PBM.talent.addFrame("Tab6", -800, 461, 28, 96, 24) tTab.addTexture("Interface\\AddOns\\PlayerBotManager\\Textures\\Talent_Tab.blp") -tTab.wowButton("Glyphs", -2, 6, 92, 17, 11) +tTab.wowButton(PBM_L["Glyphs"], -2, 6, 92, 17, 11) .doLeft = function(pButton) if gApply then gApply:Hide() end @@ -945,14 +945,14 @@ PBM.talent.setTalents = function() -- 1) Check datas local tClass = PBM.data.talent.talents[ PBM.talent.class ] if not tClass then - print("|cffff0000[PBM] No build found for class " + print("|cffff0000[PBM] " .. PBM_L["No build found for class "] .. tostring(PBM.talent.class) .. "!|r") return end local tArrow = PBM.data.talent.arrows[ PBM.talent.class ] if not tArrow then - print("|cffff0000[PBM] No arrow schem found for class " + print("|cffff0000[PBM] " .. PBM_L["No arrow schem found for class "] .. tostring(PBM.talent.class) .. "!|r") return end @@ -1180,31 +1180,31 @@ function PBM.OpenTalentWindow(botName) local unit = PBM.NameToUnit(botName) if not unit then - DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. botName .. " is not in your group.") + DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. botName .. PBM_L[" is not in your group."]) return end -- Level check local level = UnitLevel(unit) if level and level < 10 then - DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. botName .. " must be level 10+ for talents.") + DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. botName .. PBM_L[" must be level 10+ for talents."]) return end -- Range check if not CheckInteractDistance(unit, 1) then - DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. botName .. " is too far away to inspect.") + DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. botName .. PBM_L[" is too far away to inspect."]) return end -- InspectUnit conflict prevention with PBM if PBM and PBM.State then if PBM.State.LichborneInspectTarget then - DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r Cannot inspect — PBM gear/spec scan in progress.") + DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. PBM_L["Cannot inspect — PBM gear/spec scan in progress."]) return end if PBM.State.LichborneGroupScanActive then - DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r Cannot inspect — PBM group scan in progress.") + DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. PBM_L["Cannot inspect — PBM group scan in progress."]) return end end @@ -1237,7 +1237,7 @@ function PBM.OpenInventoryWindow(botName) -- If already waiting for this bot, don't double-send if PBM._waitFor[botName] then - DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r Already waiting for " .. botName .. " data.") + DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. PBM_L["Already waiting for "] .. botName .. PBM_L[" data."]) return end @@ -1253,11 +1253,11 @@ function PBM.OpenSpellbookWindow(botName) -- If already waiting for this bot, don't double-send if PBM._waitFor[botName] then - DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r Already waiting for " .. botName .. " data.") + DEFAULT_CHAT_FRAME:AddMessage("|cffFFAA00PBM:|r " .. PBM_L["Already waiting for "] .. botName .. PBM_L[" data."]) return end PBM._waitFor[botName] = "SPELLBOOK" PBM.spellbook.name = botName SendChatMessage("spells", "WHISPER", nil, botName) -end +end \ No newline at end of file diff --git a/PlayerBotManager.toc b/PlayerBotManager.toc index 0e5170d..6ce8b1d 100644 --- a/PlayerBotManager.toc +++ b/PlayerBotManager.toc @@ -11,6 +11,10 @@ libs\CallbackHandler-1.0\CallbackHandler-1.0.lua libs\LibDataBroker-1.1\LibDataBroker-1.1.lua libs\LibDBIcon-1.0\LibDBIcon-1.0.lua +# Localization +Locales\Locales.lua +Locales\esES.lua + # Frame definitions LichborneTracker.xml @@ -65,4 +69,4 @@ PBM\PBM_Core.lua PBM\PBM_Windows.lua # PBM — Modules -PBM\PBM_MultibotPanel.lua +PBM\PBM_MultibotPanel.lua \ No newline at end of file