feat: localization

This commit is contained in:
Vati
2026-04-09 01:46:07 +04:00
parent 5797e0f15f
commit c1ff6ee4be
14 changed files with 453 additions and 180 deletions
+29 -28
View File
@@ -2,6 +2,7 @@
-- Sets up all modules and auto-save system
local addon = Guda
local L = Guda_L
local Main = {}
addon.Modules.Main = Main
@@ -10,7 +11,7 @@ addon.Modules.Main = Main
function Main:Initialize()
-- Wait for PLAYER_LOGIN to ensure saved variables are loaded
addon.Modules.Events:OnPlayerLogin(function()
addon:Print("Initializing...")
addon:Print(L["Initializing..."])
-- Initialize database
addon.Modules.DB:Initialize()
@@ -38,7 +39,7 @@ function Main:Initialize()
end
-- Initialize UI
addon:Print("Initializing UI...")
addon:Print(L["Initializing UI..."])
addon.Modules.BagFrame:Initialize()
addon.Modules.BankFrame:Initialize()
addon.Modules.MailboxFrame:Initialize()
@@ -100,7 +101,7 @@ function Main:Initialize()
end
addon:Debug("Initialization complete")
addon:Print("Ready! Type /guda to open bags")
addon:Print(L["Ready! Type /guda to open bags"])
end, "Main")
end
@@ -135,24 +136,24 @@ function Main:SetupSlashCommands()
elseif msg == "debug" then
-- Toggle debug
addon.DEBUG = not addon.DEBUG
addon:Print("Debug mode: %s", addon.DEBUG and "ON" or "OFF")
addon:Print(L["Debug mode: %s"], addon.DEBUG and L["ON"] or L["OFF"])
elseif msg == "debugsort" then
-- Toggle debug sort (verbose sorting output)
addon.DEBUG_SORT = not addon.DEBUG_SORT
addon:Print("Debug sort mode: %s", addon.DEBUG_SORT and "ON" or "OFF")
addon:Print(L["Debug sort mode: %s"], addon.DEBUG_SORT and L["ON"] or L["OFF"])
elseif msg == "debugcat" then
-- Toggle debug category view (for troubleshooting layout issues)
addon.DEBUG_CATEGORY = not addon.DEBUG_CATEGORY
addon:Print("Debug category mode: %s", addon.DEBUG_CATEGORY and "ON" or "OFF")
addon:Print(L["Debug category mode: %s"], addon.DEBUG_CATEGORY and L["ON"] or L["OFF"])
elseif msg == "quest" then
-- Toggle quest bar
local show = not addon.Modules.DB:GetSetting("showQuestBar")
addon.Modules.DB:SetSetting("showQuestBar", show)
addon.Modules.QuestItemBar:Update()
addon:Print("Quest bar: %s", show and "ON" or "OFF")
addon:Print(L["Quest bar: %s"], show and L["ON"] or L["OFF"])
elseif msg == "track" then
-- Toggle tracked items bar visibility
@@ -172,7 +173,7 @@ function Main:SetupSlashCommands()
elseif addon.Modules.SettingsPopup and addon.Modules.SettingsPopup.Toggle then
addon.Modules.SettingsPopup:Toggle()
else
addon:Print("Settings window not available")
addon:Print(L["Settings window not available"])
end
elseif msg == "cleanup" then
@@ -184,7 +185,7 @@ function Main:SetupSlashCommands()
if addon.Modules.Utils and addon.Modules.Utils.PrintPerformanceStats then
addon.Modules.Utils:PrintPerformanceStats()
else
addon:Print("Performance stats not available")
addon:Print(L["Performance stats not available"])
end
-- Also show category cache stats
if addon.Modules.CategoryManager and addon.Modules.CategoryManager.GetCacheStats then
@@ -215,7 +216,7 @@ function Main:SetupSlashCommands()
-- Reset performance statistics
if addon.Modules.Utils and addon.Modules.Utils.ResetPerformanceStats then
addon.Modules.Utils:ResetPerformanceStats()
addon:Print("Performance stats reset")
addon:Print(L["Performance stats reset"])
end
-- Also clear category cache
if addon.Modules.CategoryManager and addon.Modules.CategoryManager.ClearCache then
@@ -235,35 +236,35 @@ function Main:SetupSlashCommands()
local bagFrame = getglobal("Guda_BagFrame")
local bankFrame = getglobal("Guda_BankFrame")
if (bagFrame and bagFrame:IsShown()) or (bankFrame and bankFrame:IsShown()) then
addon:Print("Cannot reset pool while bag/bank frames are open. Close them first.")
addon:Print(L["Cannot reset pool while bag/bank frames are open. Close them first."])
else
if Guda_ResetButtonPool then
Guda_ResetButtonPool()
addon:Print("Button pool reset. Pool is now empty.")
addon:Print(L["Button pool reset. Pool is now empty."])
else
addon:Print("Button pool reset function not available.")
addon:Print(L["Button pool reset function not available."])
end
end
elseif msg == "help" then
-- Show help
addon:Print("Commands:")
addon:Print("/guda - Toggle bags")
addon:Print("/guda bank - Toggle bank")
addon:Print("/guda mail - Toggle mailbox")
addon:Print("/guda settings - Open settings")
addon:Print("/guda sort - Sort bags")
addon:Print("/guda sortbank - Sort bank")
addon:Print("/guda track - Toggle item tracking")
addon:Print("/guda debug - Toggle debug mode")
addon:Print("/guda debugsort - Toggle sort debug output")
addon:Print("/guda cleanup - Remove old characters")
addon:Print("/guda perf - Show performance stats")
addon:Print("/guda perfreset - Reset performance stats")
addon:Print("/guda poolreset - Reset button pool (debug)")
addon:Print(L["Commands:"])
addon:Print(L["/guda - Toggle bags"])
addon:Print(L["/guda bank - Toggle bank"])
addon:Print(L["/guda mail - Toggle mailbox"])
addon:Print(L["/guda settings - Open settings"])
addon:Print(L["/guda sort - Sort bags"])
addon:Print(L["/guda sortbank - Sort bank"])
addon:Print(L["/guda track - Toggle item tracking"])
addon:Print(L["/guda debug - Toggle debug mode"])
addon:Print(L["/guda debugsort - Toggle sort debug output"])
addon:Print(L["/guda cleanup - Remove old characters"])
addon:Print(L["/guda perf - Show performance stats"])
addon:Print(L["/guda perfreset - Reset performance stats"])
addon:Print(L["/guda poolreset - Reset button pool (debug)"])
else
addon:Print("Unknown command. Type /guda help for commands")
addon:Print(L["Unknown command. Type /guda help for commands"])
end
end
+1 -1
View File
@@ -100,7 +100,7 @@ function SharedData:Initialize()
end
if importCount > 0 then
addon:Print("Imported " .. importCount .. " character(s) from other accounts")
addon:Print(format(Guda_L["Imported %d character(s) from other accounts"], importCount))
end
-- Clean up the global to free memory
+11 -11
View File
@@ -325,16 +325,16 @@ function Tooltip:AddInventoryInfo(tooltip, link)
tooltip:AddLine(" ")
-- Inventory label in exact bag frame title color
tooltip:AddLine("|cFFFFD200Inventory|r")
tooltip:AddLine("|cFFFFD200" .. Guda_L["Inventory"] .. "|r")
-- Total line with cyan label and white count (reuse module-level table)
local totalText = "|cFF00FFFFTotal|r: |cFFFFFFFF" .. totalCount .. "|r"
local totalText = "|cFF00FFFF" .. Guda_L["Total"] .. "|r: |cFFFFFFFF" .. totalCount .. "|r"
local breakdownParts = _breakdownParts
local bpIndex = 0
if totalBags > 0 then bpIndex = bpIndex + 1; breakdownParts[bpIndex] = "|cFF00FFFFBags|r: |cFFFFFFFF" .. totalBags .. "|r" end
if totalBank > 0 then bpIndex = bpIndex + 1; breakdownParts[bpIndex] = "|cFF00FFFFBank|r: |cFFFFFFFF" .. totalBank .. "|r" end
if totalMail > 0 then bpIndex = bpIndex + 1; breakdownParts[bpIndex] = "|cFF00FFFFMail|r: |cFFFFFFFF" .. totalMail .. "|r" end
if totalEquipped > 0 then bpIndex = bpIndex + 1; breakdownParts[bpIndex] = "|cFF00FFFFEquipped|r: |cFFFFFFFF" .. totalEquipped .. "|r" end
if totalBags > 0 then bpIndex = bpIndex + 1; breakdownParts[bpIndex] = "|cFF00FFFF" .. Guda_L["Bags"] .. "|r: |cFFFFFFFF" .. totalBags .. "|r" end
if totalBank > 0 then bpIndex = bpIndex + 1; breakdownParts[bpIndex] = "|cFF00FFFF" .. Guda_L["Bank"] .. "|r: |cFFFFFFFF" .. totalBank .. "|r" end
if totalMail > 0 then bpIndex = bpIndex + 1; breakdownParts[bpIndex] = "|cFF00FFFF" .. Guda_L["Mail"] .. "|r: |cFFFFFFFF" .. totalMail .. "|r" end
if totalEquipped > 0 then bpIndex = bpIndex + 1; breakdownParts[bpIndex] = "|cFF00FFFF" .. Guda_L["Equipped"] .. "|r: |cFFFFFFFF" .. totalEquipped .. "|r" end
for i = bpIndex + 1, table.getn(breakdownParts) do breakdownParts[i] = nil end
local breakdownText = ""
@@ -356,23 +356,23 @@ function Tooltip:AddInventoryInfo(tooltip, link)
local sharedSeparatorShown = false
for _, charInfo in ipairs(characterCounts) do
if charInfo.isShared and not sharedSeparatorShown then
tooltip:AddLine("|cFF80C0FFOther Accounts|r")
tooltip:AddLine("|cFF80C0FF" .. Guda_L["Other Accounts"] .. "|r")
sharedSeparatorShown = true
end
local r, g, b = GetClassColor(charInfo.classToken)
local pIndex = 0
if charInfo.bagCount > 0 then
pIndex = pIndex + 1; parts[pIndex] = "|cFF00FFFFBags|r: |cFFFFFFFF" .. charInfo.bagCount .. "|r"
pIndex = pIndex + 1; parts[pIndex] = "|cFF00FFFF" .. Guda_L["Bags"] .. "|r: |cFFFFFFFF" .. charInfo.bagCount .. "|r"
end
if charInfo.bankCount > 0 then
pIndex = pIndex + 1; parts[pIndex] = "|cFF00FFFFBank|r: |cFFFFFFFF" .. charInfo.bankCount .. "|r"
pIndex = pIndex + 1; parts[pIndex] = "|cFF00FFFF" .. Guda_L["Bank"] .. "|r: |cFFFFFFFF" .. charInfo.bankCount .. "|r"
end
if charInfo.mailCount > 0 then
pIndex = pIndex + 1; parts[pIndex] = "|cFF00FFFFMail|r: |cFFFFFFFF" .. charInfo.mailCount .. "|r"
pIndex = pIndex + 1; parts[pIndex] = "|cFF00FFFF" .. Guda_L["Mail"] .. "|r: |cFFFFFFFF" .. charInfo.mailCount .. "|r"
end
if charInfo.equippedCount > 0 then
pIndex = pIndex + 1; parts[pIndex] = "|cFF00FFFFEquipped|r: |cFFFFFFFF" .. charInfo.equippedCount .. "|r"
pIndex = pIndex + 1; parts[pIndex] = "|cFF00FFFF" .. Guda_L["Equipped"] .. "|r: |cFFFFFFFF" .. charInfo.equippedCount .. "|r"
end
for i = pIndex + 1, table.getn(parts) do parts[i] = nil end
+88 -31
View File
@@ -291,12 +291,12 @@ end
-- Print current performance statistics (for debugging)
function Utils:PrintPerformanceStats()
local stats = self:GetPerformanceStats()
addon:Print("=== Guda Performance Stats ===")
addon:Print("Frame Budget: %.0fms", stats.frameBudget * 1000)
addon:Print("Last Update: %.1fms", stats.lastUpdateDuration * 1000)
addon:Print(Guda_L["=== Guda Performance Stats ==="])
addon:Print(Guda_L["Frame Budget: %.0fms"], stats.frameBudget * 1000)
addon:Print(Guda_L["Last Update: %.1fms"], stats.lastUpdateDuration * 1000)
addon:Print("Avg Update: %.1fms", stats.averageUpdateDuration * 1000)
addon:Print("Total Updates: %d", stats.totalUpdates)
addon:Print("Budget Exceeded: %d times", stats.budgetExceededCount)
addon:Print(Guda_L["Total Updates: %d"], stats.totalUpdates)
addon:Print(Guda_L["Budget Exceeded: %d times"], stats.budgetExceededCount)
addon:Print("Work Queue: %d items", stats.workQueueSize)
end
@@ -987,6 +987,55 @@ end
-- Returns: "soul", "herb", "enchant", "quiver", "ammo", or nil
-- This is the consolidated bag type detection function with tooltip fallback
-- =============================================================================
-- Locale-independent type resolution
-- =============================================================================
-- WoW's GetItemInfo returns LOCALIZED type/subtype strings ("Quiver" on enUS,
-- "箭袋" on zhCN, etc.). We resolve the local-client strings at runtime by
-- querying a few reference itemIDs that exist in every WoW 1.12 client, so
-- the rest of the code can match against the local language without hardcoding.
local localizedBagTypes = {} -- lowercased localized subType -> "quiver"/"ammo"/...
local localizedProjectiles = {} -- localized subType (any case) -> "arrow"/"bullet"
local localizedTypesResolved = false
-- Reference itemIDs guaranteed to exist in every WoW 1.12 client.
-- Soul/herb/enchant bag IDs are intentionally omitted because they vary per
-- server (TurtleWoW custom items, etc.) — those still use the English fallback.
local BAG_REFERENCE_ITEMS = {
[2101] = "quiver", -- Light Quiver
[2102] = "ammo", -- Small Ammo Pouch
}
local PROJECTILE_REFERENCE_ITEMS = {
[2512] = "arrow", -- Rough Arrow
[2516] = "bullet", -- Light Shot
}
local function ResolveLocalizedTypes()
if localizedTypesResolved then return end
local allResolved = true
for itemID, key in pairs(BAG_REFERENCE_ITEMS) do
-- Position 6 in TurtleWoW GetItemInfo signature is itemType (subType)
local _, _, _, _, _, itemType = GetItemInfo(itemID)
if itemType then
localizedBagTypes[string.lower(itemType)] = key
else
allResolved = false
end
end
for itemID, key in pairs(PROJECTILE_REFERENCE_ITEMS) do
local _, _, _, _, _, itemType = GetItemInfo(itemID)
if itemType then
localizedProjectiles[itemType] = key
else
allResolved = false
end
end
if allResolved then localizedTypesResolved = true end
end
function Utils:GetSpecializedBagType(bagID)
-- Skip backpack, bank, and keyring
if bagID == 0 or bagID == -1 or bagID == -2 then
@@ -1012,6 +1061,12 @@ function Utils:GetSpecializedBagType(bagID)
if itemType then
local typeLower = string.lower(itemType)
-- Locale-independent: match against resolved local-client strings
ResolveLocalizedTypes()
if localizedBagTypes[typeLower] then
return localizedBagTypes[typeLower]
end
if string.find(typeLower, "soul bag") or string.find(typeLower, "soul pouch") then
return "soul"
end
@@ -1176,17 +1231,28 @@ function Utils:GetConsumableRestoreTag(bagID, slotID, itemLink)
return tag
end
-- Check if item is Arrow or Bullet (for Quiver routing)
-- Check if item is Arrow or Bullet (for Quiver routing).
-- Locale-independent: also matches against the local client's translated
-- subtype strings, resolved from reference vanilla items at runtime.
function Utils:IsArrowOrBullet(itemType)
if not itemType then return false end
-- Exact matching only
return itemType == "Arrow" or itemType == "Bullet"
if itemType == "Arrow" or itemType == "Bullet" then return true end
ResolveLocalizedTypes()
return localizedProjectiles[itemType] ~= nil
end
-- Check if item is Ammo (any type - for Ammo Pouch)
function Utils:IsAmmo(itemType)
if not itemType then return false end
return itemType == "Arrow" or itemType == "Bullet"
return self:IsArrowOrBullet(itemType)
end
-- Returns "arrow", "bullet", or nil for the given item subtype string.
function Utils:GetProjectileKind(itemType)
if not itemType then return nil end
if itemType == "Arrow" then return "arrow" end
if itemType == "Bullet" then return "bullet" end
ResolveLocalizedTypes()
return localizedProjectiles[itemType]
end
-- Get preferred container type for an item
@@ -1206,13 +1272,14 @@ function Utils:GetItemPreferredContainer(itemLink)
local itemName, _, itemRarity, itemLevel, itemCategory, itemType, itemStackCount, itemSubType, itemTexture = self:GetItemInfoSafe(itemID)
if not itemType then return nil end
-- Only route PROJECTILE category items that are specifically arrows or bullets
if itemCategory == "Projectile" then
if itemType == "Arrow" then
return "quiver"
elseif itemType == "Bullet" then
return "ammo"
end
-- Locale-independent projectile routing. Don't gate on itemCategory string
-- (it's localized); the projectile kind lookup already covers both English
-- and the local client's strings via runtime-resolved reference items.
local projectileKind = self:GetProjectileKind(itemType)
if projectileKind == "arrow" then
return "quiver"
elseif projectileKind == "bullet" then
return "ammo"
end
-- Route herbs to herb bags (robust: category/subtype OR texture pattern fallback)
@@ -1387,15 +1454,12 @@ function Utils:IsHerbItem(itemLink)
local name, _, quality, iLevel, itemCategory, itemType, itemStackCount, itemSubType, itemTexture = self:GetItemInfoSafe(itemID)
if itemCategory ~= "Trade Goods" then
return false
end
if not itemTexture then
return false
end
-- Normalize and check texture name
-- Texture path is locale-independent (English in every WoW client),
-- so we don't need to gate on the localized "Trade Goods" category.
local tex = string.lower(itemTexture)
tex = string.gsub(tex, "^interface\\\\icons\\\\", "")
@@ -1418,14 +1482,7 @@ function Utils:IsEnchantingItem(itemLink)
local name, _, quality, iLevel, itemCategory, itemType, itemStackCount, itemSubType, itemTexture = self:GetItemInfoSafe(itemID)
if itemCategory ~= "Trade Goods" then
-- Some private servers may report Enchanting directly as type
if itemType ~= "Enchanting" and itemSubType ~= "Enchanting" then
return false
end
end
-- If explicit Enchanting subtype/type, accept immediately
-- Explicit English subtype (rare but possible on some servers)
if itemType == "Enchanting" or itemSubType == "Enchanting" then
return true
end
@@ -1434,7 +1491,7 @@ function Utils:IsEnchantingItem(itemLink)
return false
end
-- Normalize and check texture name
-- Texture path is locale-independent — primary signal for non-English clients.
local tex = string.lower(itemTexture)
tex = string.gsub(tex, "^interface\\\\icons\\\\", "")
+2 -2
View File
@@ -89,12 +89,12 @@ function EquipmentScanner:Initialize()
-- Player logged in - save equipment data
addon.Modules.Events:OnPlayerLogin(function()
playerLoggedIn = true
addon:Print("Scanning equipped items...")
addon:Print(Guda_L["Scanning equipped items..."])
-- Delay scan to ensure character is fully loaded (uses pooled timer)
Guda_ScheduleTimer(2.0, function()
EquipmentScanner:SaveToDatabase()
addon:Print("Equipped items scanned and saved!")
addon:Print(Guda_L["Equipped items scanned and saved!"])
end)
end, "EquipmentScanner")
+218 -3
View File
@@ -1,16 +1,32 @@
-- Guda Localization
--
-- Pattern mirrored from GudaPlates_Locale.lua: a single Guda_L table holding the
-- English defaults, then per-locale override blocks. Call sites use
-- Guda_L["English string"] (or `local L = Guda_L`). Missing keys gracefully
-- render English, since the keys ARE the English strings.
--
-- Supported locales: enUS (default), zhCN, esES, ptBR, deDE, ruRU.
-- Translators: copy any L[...] line into the matching locale block below and
-- replace the right-hand value.
-- Keybinding localization
Guda_L = {}
local L = Guda_L
-- ============================================================================
-- Keybindings (WoW-conventional globals — must stay as BINDING_*)
-- ============================================================================
BINDING_HEADER_GUDA = "Guda"
BINDING_NAME_GUDA_TOGGLE_BAGS = "Toggle Bags"
BINDING_NAME_GUDA_TOGGLE_BANK = "Toggle Bank"
BINDING_NAME_GUDA_USE_QUEST_ITEM_1 = "Quest Bar 1"
BINDING_NAME_GUDA_USE_QUEST_ITEM_2 = "Quest Bar 2"
-- Additional localization strings can be added here
-- ============================================================================
-- Settings tooltips (legacy L_* globals — referenced from SettingsPopup.lua)
-- Kept as globals for compatibility; do not remove.
-- ============================================================================
L_SHOW_TOOLTIP_COUNTS = "Tooltip Extension"
L_SHOW_TOOLTIP_COUNTS_TT = "Show how many of this item you have across all your characters in the item tooltip."
L_LOCK_BAGS_TT = "Lock the bag frames in place so they cannot be moved by dragging."
L_HIDE_BORDERS_TT = "Hide the thick borders around the bag and bank frames for a cleaner look."
L_QUALITY_BORDER_EQ_TT = "Show a color-coded border around equipped items based on their quality (Common, Rare, Epic, etc.)."
@@ -20,3 +36,202 @@ L_SHOW_QUEST_BAR_TT = "Show a bar for quickly accessing quest-related items."
L_HOVER_BAGLINE_TT = "Minimizes the bag container to show only the main bag and keyring. Hover over the main bag to view the other bags."
L_HIDE_BAGLINE_TT = "Hides bag slots 1-4 from the footer. Click the main bag to show a flyout with all bag slots."
L_HIDE_FOOTER_TT = "Hide the bottom section of the bag frame containing money and bag slots."
-- ============================================================================
-- English (default / enUS)
-- ============================================================================
-- Init / lifecycle (Core/Main.lua, Data/EquipmentScanner.lua, Core/Tooltip.lua)
L["Initializing..."] = "Initializing..."
L["Initializing UI..."] = "Initializing UI..."
L["Ready! Type /guda to open bags"] = "Ready! Type /guda to open bags"
L["Initializing tooltip module..."] = "Initializing tooltip module..."
L["Tooltip integration enabled - Inventory displays above vendor price"] = "Tooltip integration enabled - Inventory displays above vendor price"
L["Scanning equipped items..."] = "Scanning equipped items..."
L["Equipped items scanned and saved!"] = "Equipped items scanned and saved!"
-- Slash command help (Core/Main.lua)
L["Commands:"] = "Commands:"
L["/guda - Toggle bags"] = "/guda - Toggle bags"
L["/guda bank - Toggle bank"] = "/guda bank - Toggle bank"
L["/guda mail - Toggle mailbox"] = "/guda mail - Toggle mailbox"
L["/guda settings - Open settings"] = "/guda settings - Open settings"
L["/guda sort - Sort bags"] = "/guda sort - Sort bags"
L["/guda sortbank - Sort bank"] = "/guda sortbank - Sort bank"
L["/guda track - Toggle item tracking"] = "/guda track - Toggle item tracking"
L["/guda debug - Toggle debug mode"] = "/guda debug - Toggle debug mode"
L["/guda debugsort - Toggle sort debug output"] = "/guda debugsort - Toggle sort debug output"
L["/guda cleanup - Remove old characters"] = "/guda cleanup - Remove old characters"
L["/guda perf - Show performance stats"] = "/guda perf - Show performance stats"
L["/guda perfreset - Reset performance stats"] = "/guda perfreset - Reset performance stats"
L["/guda poolreset - Reset button pool (debug)"] = "/guda poolreset - Reset button pool (debug)"
L["Unknown command. Type /guda help for commands"] = "Unknown command. Type /guda help for commands"
L["Debug mode: %s"] = "Debug mode: %s"
L["Debug sort mode: %s"] = "Debug sort mode: %s"
L["Debug category mode: %s"] = "Debug category mode: %s"
L["Quest bar: %s"] = "Quest bar: %s"
L["ON"] = "ON"
L["OFF"] = "OFF"
L["Settings window not available"] = "Settings window not available"
L["Performance stats not available"] = "Performance stats not available"
L["Performance stats reset"] = "Performance stats reset"
L["Cannot reset pool while bag/bank frames are open. Close them first."] = "Cannot reset pool while bag/bank frames are open. Close them first."
L["Button pool reset. Pool is now empty."] = "Button pool reset. Pool is now empty."
L["Button pool reset function not available."] = "Button pool reset function not available."
-- Bag/Bank/Mail frame chrome (UI/BagFrame.lua, UI/BankFrame.lua, UI/MailboxFrame.lua)
L["%s's Bags"] = "%s's Bags"
L["%s's Bank"] = "%s's Bank"
L["%s's Mailbox"] = "%s's Mailbox"
L["Bank"] = "Bank"
L["Bank Bag Slot %d"] = "Bank Bag Slot %d"
L["Backpack"] = "Backpack"
L["Keyring"] = "Keyring"
L["Bag %d"] = "Bag %d"
L["Bag Slots"] = "Bag Slots"
L["Search, try ~equipment"] = "Search, try ~equipment"
L["Search bank..."] = "Search bank..."
L["Search mailbox..."] = "Search mailbox..."
L["Use Guda Bank UI"] = "Use Guda Bank UI"
L["Switched to Guda bank UI"] = "Switched to Guda bank UI"
L["No Mail"] = "No Mail"
L["No mailbox data found for this character.\n\nVisit a mailbox in-game to save your mail data."] = "No mailbox data found for this character.\n\nVisit a mailbox in-game to save your mail data."
L["Current realm gold"] = "Current realm gold"
-- Sort / sell prints (UI/BagFrame.lua, UI/BankFrame.lua, Sorting/SortEngine.lua, Sorting/BagReplacer.lua)
L["Cannot sort another character's bags!"] = "Cannot sort another character's bags!"
L["Cannot sort in read-only mode!"] = "Cannot sort in read-only mode!"
L["Bags are already sorted!"] = "Bags are already sorted!"
L["Bank is already sorted!"] = "Bank is already sorted!"
L["Bank must be open to sort!"] = "Bank must be open to sort!"
L["Sorting already in progress, please wait..."] = "Sorting already in progress, please wait..."
L["Restacked %d stack(s)"] = "Restacked %d stack(s)"
L["Sold %d junk item(s)"] = "Sold %d junk item(s)"
L["Bag replaced successfully!"] = "Bag replaced successfully!"
L["Cannot replace bag: another replacement is in progress."] = "Cannot replace bag: another replacement is in progress."
L["Cannot replace bag while sorting is in progress."] = "Cannot replace bag while sorting is in progress."
L["Cannot replace bag during combat."] = "Cannot replace bag during combat."
-- Item-button protection prints (UI/ItemButton.lua)
L["Cannot sell %s — item is protected"] = "Cannot sell %s — item is protected"
L["Cannot disenchant %s — item is protected"] = "Cannot disenchant %s — item is protected"
L["Cannot delete %s — item is protected"] = "Cannot delete %s — item is protected"
L["Slot pinned %s (skipped during sort)"] = "Slot pinned %s (skipped during sort)"
L["Slot unpinned %s"] = "Slot unpinned %s"
L["%s set protection removed"] = "%s set protection removed"
L["%s set protection restored"] = "%s set protection restored"
L["%s locked"] = "%s locked"
L["%s unlocked"] = "%s unlocked"
-- Quest item bar (UI/QuestItemBar.lua)
L["Item is not currently in your bags (loading from database)."] = "Item is not currently in your bags (loading from database)."
-- Tooltip integration (Core/Tooltip.lua)
L["Inventory"] = "Inventory"
L["Other Accounts"] = "Other Accounts"
L["Total"] = "Total"
L["Bags"] = "Bags"
L["Mail"] = "Mail"
L["Equipped"] = "Equipped"
-- SharedData (Core/SharedData.lua)
L["Imported %d character(s) from other accounts"] = "Imported %d character(s) from other accounts"
-- Performance stats (Core/Utils.lua)
L["=== Guda Performance Stats ==="] = "=== Guda Performance Stats ==="
L["Frame Budget: %.0fms"] = "Frame Budget: %.0fms"
L["Last Update: %.1fms"] = "Last Update: %.1fms"
L["Total Updates: %d"] = "Total Updates: %d"
L["Budget Exceeded: %d times"] = "Budget Exceeded: %d times"
-- Settings popup (UI/SettingsPopup.lua) — labels, sliders, checkboxes, buttons
L["Guda Settings"] = "Guda Settings"
L["Appearance"] = "Appearance"
L["Options"] = "Options"
L["Automation"] = "Automation"
L["View"] = "View"
L["Columns"] = "Columns"
L["Icon"] = "Icon"
L["Icon Options"] = "Icon Options"
L["Quest Bar"] = "Quest Bar"
L["Tracked"] = "Tracked"
L["Theme"] = "Theme"
L["Bag View"] = "Bag View"
L["Bank View"] = "Bank View"
L["Bag columns"] = "Bag columns"
L["Bank columns"] = "Bank columns"
L["Background Transparency"] = "Background Transparency"
L["Icon size"] = "Icon size"
L["Icon font size"] = "Icon font size"
L["Icon spacing"] = "Icon spacing"
L["Quest bar size"] = "Quest bar size"
L["Tracked bar size"] = "Tracked bar size"
L["Junk item opacity"] = "Junk item opacity"
L["Lock Window"] = "Lock Window"
L["Hide Frame Borders"] = "Hide Frame Borders"
L["Equipment Borders"] = "Equipment Borders"
L["Other Item Borders"] = "Other Item Borders"
L["Show Search Bar"] = "Show Search Bar"
L["Show Quest Bar"] = "Show Quest Bar"
L["Show All Bags"] = "Show All Bags"
L["Hide Footer"] = "Hide Footer"
L["Reverse Stack Sort"] = "Reverse Stack Sort"
L["Merge"] = "Merge"
L["Group:"] = "Group:"
L["Mark:"] = "Mark:"
L["Any rule"] = "Any rule"
L["All rules"] = "All rules"
L["Edit Category (Built-in)"] = "Edit Category (Built-in)"
L["Edit Category"] = "Edit Category"
L["Rules (%d/%d):"] = "Rules (%d/%d):"
L["Mark Unusable Items"] = "Mark Unusable Items"
L["Equip Set Categories"] = "Equip Set Categories"
L["Mark Equipment Sets"] = "Mark Equipment Sets"
L["Auto Lock Set Items"] = "Auto Lock Set Items"
L["Show Category Count"] = "Show Category Count"
L["Auto Sell Junk"] = "Auto Sell Junk"
L["Auto Open Bags"] = "Auto Open Bags"
L["Auto Close Bags"] = "Auto Close Bags"
L["White Items as Junk"] = "White Items as Junk"
L["pfUI Transparency"] = "pfUI Transparency"
L["Edit"] = "Edit"
L["Save"] = "Save"
L["Cancel"] = "Cancel"
L["+ Add Category"] = "+ Add Category"
L["+ Add Rule"] = "+ Add Rule"
L["Reset Defaults"] = "Reset Defaults"
L["Select Type"] = "Select Type"
L["Select Value"] = "Select Value"
L["Tracking Items:"] = "Tracking Items:"
L["Locked Items:"] = "Locked Items:"
L["Pin Slot:"] = "Pin Slot:"
L["Moving Bars:"] = "Moving Bars:"
-- ============================================================================
-- Locale overrides
-- Translators: copy any L["..."] = "..." line above into the matching block
-- below and replace the right-hand value with the translation.
-- ============================================================================
local locale = GetLocale and GetLocale() or "enUS"
if locale == "zhCN" then
-- Chinese (Simplified) — translations go here
-- L["Guda Settings"] = "Guda 设置"
elseif locale == "esES" then
-- Spanish — translations go here
-- L["Guda Settings"] = "Ajustes de Guda"
elseif locale == "ptBR" then
-- Portuguese (Brazilian) — translations go here
-- L["Guda Settings"] = "Configurações Guda"
elseif locale == "deDE" then
-- German — translations go here
-- L["Guda Settings"] = "Guda Einstellungen"
elseif locale == "ruRU" then
-- Russian — translations go here
-- L["Guda Settings"] = "Настройки Guda"
end
+4 -4
View File
@@ -299,7 +299,7 @@ local function FinalizeReplacement()
waitingForLocks = false
onLocksCleared = nil
BagReplacer.inProgress = false
addon:Print("Bag replaced successfully!")
addon:Print(Guda_L["Bag replaced successfully!"])
-- Invalidate bag scanner cache BEFORE update so it does a full rescan
-- (bag slot count changed, incremental update can't handle that)
@@ -479,7 +479,7 @@ function BagReplacer:Execute(targetBagID, invSlot)
-- Guard: already in progress
if self.inProgress then
addon:DebugSort("[BagReplacer] Blocked: replacement already in progress")
addon:Print("Cannot replace bag: another replacement is in progress.")
addon:Print(Guda_L["Cannot replace bag: another replacement is in progress."])
return
end
@@ -487,14 +487,14 @@ function BagReplacer:Execute(targetBagID, invSlot)
local SortEngine = addon.Modules.SortEngine
if SortEngine and SortEngine.sortingInProgress then
addon:DebugSort("[BagReplacer] Blocked: sorting in progress")
addon:Print("Cannot replace bag while sorting is in progress.")
addon:Print(Guda_L["Cannot replace bag while sorting is in progress."])
return
end
-- Guard: combat
if UnitAffectingCombat("player") then
addon:DebugSort("[BagReplacer] Blocked: in combat")
addon:Print("Cannot replace bag during combat.")
addon:Print(Guda_L["Cannot replace bag during combat."])
return
end
+3 -3
View File
@@ -1779,7 +1779,7 @@ function SortEngine:SortBankPass()
propertyCache = {}
if not addon.Modules.BankScanner:IsBankOpen() then
addon:Print("Bank must be open to sort!")
addon:Print(Guda_L["Bank must be open to sort!"])
return 0
end
@@ -1849,7 +1849,7 @@ end
function SortEngine:SortBank()
if not addon.Modules.BankScanner:IsBankOpen() then
addon:Print("Bank must be open to sort!")
addon:Print(Guda_L["Bank must be open to sort!"])
return 0
end
@@ -1935,7 +1935,7 @@ end
function SortEngine:ExecuteSort(sortFunction, analyzeFunction, updateFrame, sortType)
-- Check if sorting is already in progress
if self.sortingInProgress then
addon:Print("Sorting already in progress, please wait...")
addon:Print(Guda_L["Sorting already in progress, please wait..."])
return false, "sorting in progress"
end
+16 -16
View File
@@ -156,7 +156,7 @@ function Guda_BagFrame_OnLoad(self)
-- Set up search box placeholder
local searchBox = getglobal(self:GetName().."_SearchBar_SearchBox")
if searchBox then
searchBox:SetText("Search, try ~equipment")
searchBox:SetText(Guda_L["Search, try ~equipment"])
searchBox:SetTextColor(0.5, 0.5, 0.5, 1)
end
@@ -859,7 +859,7 @@ function BagFrame:Update()
end
if titleFont and displayName then
titleFont:SetText(string.format("%s's Bags", displayName))
titleFont:SetText(string.format(Guda_L["%s's Bags"], displayName))
end
-- Display items
@@ -1604,7 +1604,7 @@ end
-- Check if search is currently active
function BagFrame:IsSearchActive()
return searchText and searchText ~= "" and searchText ~= "Search, try ~equipment"
return searchText and searchText ~= "" and searchText ~= Guda_L["Search, try ~equipment"]
end
-- Check if item passes search filter (pfUI style)
@@ -1729,7 +1729,7 @@ function BagFrame:UpdateBagSlotsInfo(bagData, isOtherChar)
infoFrame:EnableMouse(true)
infoFrame:SetScript("OnEnter", function()
GameTooltip:SetOwner(this, "ANCHOR_TOP")
GameTooltip:AddLine("Bag Slots", 1, 1, 1)
GameTooltip:AddLine(Guda_L["Bag Slots"], 1, 1, 1)
GameTooltip:AddLine(" ")
-- Regular bags
if this.regularTotal then
@@ -2209,7 +2209,7 @@ local function CreateMoneyTooltip()
-- Header label
f.header = f:CreateFontString(nil, "OVERLAY", "GameFontNormal")
f.header:SetPoint("TOPLEFT", f, "TOPLEFT", 10, -10)
f.header:SetText("Current realm gold")
f.header:SetText(Guda_L["Current realm gold"])
f.header:SetTextColor(1, 0.82, 0)
-- Header money frame (total) — anchored to right edge, same row as header
@@ -2778,7 +2778,7 @@ end
function Guda_BagFrame_ClearSearch()
local searchBox = getglobal("Guda_BagFrame_SearchBar_SearchBox")
if searchBox then
searchBox:SetText("Search, try ~equipment")
searchBox:SetText(Guda_L["Search, try ~equipment"])
searchBox:SetTextColor(0.5, 0.5, 0.5, 1)
searchBox:ClearFocus()
end
@@ -2797,7 +2797,7 @@ end
function Guda_BagFrame_OnSearchChanged(self)
local text = self:GetText()
-- Ignore placeholder text
if text == "Search, try ~equipment" then
if text == Guda_L["Search, try ~equipment"] then
text = ""
end
if text ~= searchText then
@@ -2884,7 +2884,7 @@ end
function Guda_BagFrame_Sort()
if currentViewChar then
addon:Print("Cannot sort another character's bags!")
addon:Print(Guda_L["Cannot sort another character's bags!"])
return
end
@@ -2903,7 +2903,7 @@ function Guda_BagFrame_Sort()
)
if not success and message == "already sorted" then
addon:Print("Bags are already sorted!")
addon:Print(Guda_L["Bags are already sorted!"])
end
end
@@ -2917,7 +2917,7 @@ function Guda_BagFrame_MergeStacks()
-- Check if sorting is already in progress
if addon.Modules.SortEngine.sortingInProgress then
addon:Print("Sorting already in progress, please wait...")
addon:Print(Guda_L["Sorting already in progress, please wait..."])
return
end
@@ -3042,7 +3042,7 @@ function Guda_BagFrame_MergeStacks()
end
-- Refresh the view
BagFrame:Update()
addon:Print("Restacked " .. totalMoves .. " stack(s)")
addon:Print(format(Guda_L["Restacked %d stack(s)"], totalMoves))
return
end
@@ -3739,7 +3739,7 @@ function Guda_BagSlot_OnEnter(button, bagID)
if bagID == 0 then
-- Backpack tooltip
GameTooltip:SetText("Backpack", 1.0, 1.0, 1.0)
GameTooltip:SetText(Guda_L["Backpack"], 1.0, 1.0, 1.0)
local numSlots = GetContainerNumSlots(0)
GameTooltip:AddLine(string.format("%d Slots", numSlots), 0.8, 0.8, 0.8)
if hiddenBags[bagID] then
@@ -3750,7 +3750,7 @@ function Guda_BagSlot_OnEnter(button, bagID)
Guda_BagFrame_HighlightBagSlots(0)
elseif bagID == -2 then
-- Keyring tooltip
GameTooltip:SetText("Keyring", 1.0, 1.0, 1.0)
GameTooltip:SetText(Guda_L["Keyring"], 1.0, 1.0, 1.0)
local numSlots = GetContainerNumSlots(-2) or 0
GameTooltip:AddLine(string.format("%d Slots", numSlots), 0.8, 0.8, 0.8)
if hiddenBags[bagID] then
@@ -3775,7 +3775,7 @@ function Guda_BagSlot_OnEnter(button, bagID)
Guda_BagFrame_HighlightBagSlots(bagID)
else
-- Empty slot
GameTooltip:SetText(string.format("Bag %d", bagID), 1.0, 1.0, 1.0)
GameTooltip:SetText(string.format(Guda_L["Bag %d"], bagID), 1.0, 1.0, 1.0)
GameTooltip:AddLine("Empty", 0.5, 0.5, 0.5)
if hiddenBags[bagID] then
GameTooltip:AddLine("(Hidden - Right-Click to show)", 0.8, 0.5, 0.5)
@@ -4134,7 +4134,7 @@ function BagFrame:Initialize()
if not isMerchantOpen then
this:SetScript("OnUpdate", nil)
if soldCount > 0 then
addon:Print("Sold " .. soldCount .. " junk item(s).")
addon:Print(format(Guda_L["Sold %d junk item(s)"], soldCount))
end
return
end
@@ -4149,7 +4149,7 @@ function BagFrame:Initialize()
else
this:SetScript("OnUpdate", nil)
if soldCount > 0 then
addon:Print("Sold " .. soldCount .. " junk item(s).")
addon:Print(format(Guda_L["Sold %d junk item(s)"], soldCount))
end
end
end)
+17 -17
View File
@@ -135,7 +135,7 @@ function Guda_BankFrame_OnLoad(self)
-- Set up search box placeholder
local searchBox = getglobal(self:GetName().."_SearchBar_SearchBox")
if searchBox then
searchBox:SetText("Search bank...")
searchBox:SetText(Guda_L["Search bank..."])
searchBox:SetTextColor(0.5, 0.5, 0.5, 1)
end
@@ -641,7 +641,7 @@ function BankFrame:Update()
bankData = addon.Modules.DB:GetCharacterBank(currentViewChar)
isOtherChar = true
charName = currentViewChar
getglobal("Guda_BankFrame_Title"):SetText(currentViewChar .. "'s Bank")
getglobal("Guda_BankFrame_Title"):SetText(format(Guda_L["%s's Bank"], currentViewChar))
else
-- Viewing current character's bank
-- Use live data if bank is officially open OR if we can access bank data
@@ -660,11 +660,11 @@ function BankFrame:Update()
if useLiveData then
-- Bank is accessible - use live data
bankData = addon.Modules.BankScanner:GetBankData()
getglobal("Guda_BankFrame_Title"):SetText(playerName .. "'s Bank")
getglobal("Guda_BankFrame_Title"):SetText(format(Guda_L["%s's Bank"], playerName))
else
-- Bank is truly closed - use saved data (read-only mode)
bankData = addon.Modules.DB:GetCharacterBank(playerName)
getglobal("Guda_BankFrame_Title"):SetText(playerName .. "'s Bank")
getglobal("Guda_BankFrame_Title"):SetText(format(Guda_L["%s's Bank"], playerName))
end
end
@@ -1579,7 +1579,7 @@ end
-- Check if search is currently active
function BankFrame:IsSearchActive()
return searchText and searchText ~= "" and searchText ~= "Search bank..."
return searchText and searchText ~= "" and searchText ~= Guda_L["Search bank..."]
end
-- Check if item passes search filter (pfUI style)
@@ -1592,7 +1592,7 @@ end
function Guda_BankFrame_OnSearchChanged(self)
local text = self:GetText()
-- Ignore placeholder text
if text == "Search bank..." then
if text == Guda_L["Search bank..."] then
text = ""
end
if text ~= searchText then
@@ -1605,7 +1605,7 @@ end
function Guda_BankFrame_ClearSearch()
local searchBox = getglobal("Guda_BankFrame_SearchBar_SearchBox")
if searchBox then
searchBox:SetText("Search bank...")
searchBox:SetText(Guda_L["Search bank..."])
searchBox:SetTextColor(0.5, 0.5, 0.5, 1)
if searchBox.ClearFocus then searchBox:ClearFocus() end
end
@@ -1625,12 +1625,12 @@ end
-- Bank button handler
function Guda_BankFrame_Sort()
if isReadOnlyMode or currentViewChar then
addon:Print("Cannot sort in read-only mode!")
addon:Print(Guda_L["Cannot sort in read-only mode!"])
return
end
if not addon.Modules.BankScanner:IsBankOpen() then
addon:Print("Bank must be open to sort!")
addon:Print(Guda_L["Bank must be open to sort!"])
return
end
@@ -1649,7 +1649,7 @@ function Guda_BankFrame_Sort()
)
if not success and message == "already sorted" then
addon:Print("Bank is already sorted!")
addon:Print(Guda_L["Bank is already sorted!"])
end
end
@@ -1668,7 +1668,7 @@ function Guda_BankFrame_MergeStacks()
-- Check if sorting is already in progress
if addon.Modules.SortEngine.sortingInProgress then
addon:Print("Sorting already in progress, please wait...")
addon:Print(Guda_L["Sorting already in progress, please wait..."])
return
end
@@ -1795,7 +1795,7 @@ function Guda_BankFrame_MergeStacks()
addon.Modules.ItemDetection:ClearCache()
end
BankFrame:Update()
addon:Print("Restacked " .. totalMoves .. " stack(s)")
addon:Print(format(Guda_L["Restacked %d stack(s)"], totalMoves))
return
end
@@ -1884,7 +1884,7 @@ function Guda_BankFrame_SwitchToGudaUI()
-- Update the custom bank frame in interactive mode
BankFrame:ShowCurrentCharacter()
addon:Print("Switched to Guda bank UI")
addon:Print(Guda_L["Switched to Guda bank UI"])
end
-- Create button on Blizzard BankFrame to switch to Guda UI
@@ -1927,7 +1927,7 @@ function BankFrame:CreateGudaButtonOnBlizzardUI()
gudaButton:SetScript("OnEnter", function()
GameTooltip:SetOwner(this, "ANCHOR_LEFT")
GameTooltip:SetText("Use Guda Bank UI")
GameTooltip:SetText(Guda_L["Use Guda Bank UI"])
GameTooltip:Show()
end)
@@ -2658,7 +2658,7 @@ function Guda_BankBagSlot_OnEnter(button, bagID)
if bagID == -1 then
-- Main bank bag tooltip
GameTooltip:SetText("Bank", 1.0, 1.0, 1.0)
GameTooltip:SetText(Guda_L["Bank"], 1.0, 1.0, 1.0)
local numSlots = 24
GameTooltip:AddLine(string.format("%d Slots", numSlots), 0.8, 0.8, 0.8)
if hiddenBankBags[bagID] then
@@ -2684,13 +2684,13 @@ function Guda_BankBagSlot_OnEnter(button, bagID)
ResetCursor()
elseif isPurchased then
-- Empty purchased slot (no hide/show text, no purchase cursor)
GameTooltip:SetText(string.format("Bank Bag Slot %d", bankButtonID or -1), 1.0, 1.0, 1.0)
GameTooltip:SetText(string.format(Guda_L["Bank Bag Slot %d"], bankButtonID or -1), 1.0, 1.0, 1.0)
GameTooltip:AddLine("Empty", 0.8, 0.8, 0.8)
-- Reset cursor for empty purchased slots
ResetCursor()
else
-- Unpurchased slot (no hide/show text, show purchase cursor)
GameTooltip:SetText(string.format("Bank Bag Slot %d", bankButtonID or -1), 1.0, 1.0, 1.0)
GameTooltip:SetText(string.format(Guda_L["Bank Bag Slot %d"], bankButtonID or -1), 1.0, 1.0, 1.0)
local cost = GetBankSlotCost(numSlots)
GameTooltip:AddLine(addon.Modules.Utils:FormatMoney(cost, false, true), 1, 1, 1)
-- Show purchase cursor (coin icon)
+10 -10
View File
@@ -695,13 +695,13 @@ UseContainerItem = function(bag, slot, ...)
if itemID and DB:IsItemProtected(itemID) then
-- Block selling at merchant
if MerchantFrame and MerchantFrame:IsVisible() then
addon:Print("Cannot sell " .. link .. " — item is protected")
addon:Print(format(Guda_L["Cannot sell %s — item is protected"], link))
return
end
-- Block disenchant/milling/prospecting (spell targeting an item)
if SpellIsTargeting and SpellIsTargeting() then
SpellStopTargeting()
addon:Print("Cannot disenchant " .. link .. " — item is protected")
addon:Print(format(Guda_L["Cannot disenchant %s — item is protected"], link))
return
end
end
@@ -739,7 +739,7 @@ local function HookDeletePopup(dialogName)
local originalOnShow = StaticPopupDialogs[dialogName].OnShow
StaticPopupDialogs[dialogName].OnShow = function()
if cursorProtectedLink then
addon:Print("Cannot delete " .. cursorProtectedLink .. " — item is protected")
addon:Print(format(Guda_L["Cannot delete %s — item is protected"], cursorProtectedLink))
ClearCursor()
cursorProtectedLink = nil
this:Hide()
@@ -1092,9 +1092,9 @@ function Guda_ItemButton_OnLoad(self)
if EquipSets and EquipSets.IsInSet and EquipSets:IsInSet(itemID) then
local isNowExcepted = addon.Modules.DB:ToggleSetProtectionException(itemID)
if isNowExcepted then
addon:Print(link .. " set protection removed")
addon:Print(format(Guda_L["%s set protection removed"], link))
else
addon:Print(link .. " set protection restored")
addon:Print(format(Guda_L["%s set protection restored"], link))
end
-- Refresh bag/bank frames
if addon.Modules.BagFrame and addon.Modules.BagFrame.Update then
@@ -1108,9 +1108,9 @@ function Guda_ItemButton_OnLoad(self)
end
local isNowLocked = addon.Modules.DB:ToggleItemLock(itemID)
if isNowLocked then
addon:Print(link .. " locked")
addon:Print(format(Guda_L["%s locked"], link))
else
addon:Print(link .. " unlocked")
addon:Print(format(Guda_L["%s unlocked"], link))
end
-- Refresh bag/bank frames
if addon.Modules.BagFrame and addon.Modules.BagFrame.Update then
@@ -1133,9 +1133,9 @@ function Guda_ItemButton_OnLoad(self)
itemName = " " .. this.itemData.link
end
if isNowPinned then
addon:Print("Slot pinned" .. itemName .. " (skipped during sort)")
addon:Print(format(Guda_L["Slot pinned %s (skipped during sort)"], itemName))
else
addon:Print("Slot unpinned" .. itemName)
addon:Print(format(Guda_L["Slot unpinned %s"], itemName))
end
-- Refresh to show/hide pin icon
if addon.Modules.BagFrame and addon.Modules.BagFrame.Update then
@@ -1204,7 +1204,7 @@ function Guda_ItemButton_OnLoad(self)
local itemID = addon.Modules.Utils:ExtractItemID(link)
if itemID and addon.Modules.DB:IsItemProtected(itemID) then
SpellStopTargeting()
addon:Print("Cannot disenchant " .. link .. " — item is protected")
addon:Print(format(Guda_L["Cannot disenchant %s — item is protected"], link))
return
end
end
+5 -5
View File
@@ -30,7 +30,7 @@ function Guda_MailboxFrame_OnLoad(self)
-- Set up search box placeholder
local searchBox = getglobal(self:GetName().."_SearchBar_SearchBox")
if searchBox then
searchBox:SetText("Search mailbox...")
searchBox:SetText(Guda_L["Search mailbox..."])
searchBox:SetTextColor(0.5, 0.5, 0.5, 1)
end
@@ -148,7 +148,7 @@ function MailboxFrame:Update()
charName = string.sub(charFullName, 1, dashPos - 1)
end
getglobal("Guda_MailboxFrame_Title"):SetText(charName .. "'s Mailbox")
getglobal("Guda_MailboxFrame_Title"):SetText(format(Guda_L["%s's Mailbox"], charName))
-- Filter items based on search text
local filteredItems = {}
@@ -175,7 +175,7 @@ function MailboxFrame:Update()
local emptyMessage = getglobal("Guda_MailboxFrame_EmptyMessage")
if emptyMessage then
if totalItems == 0 then
emptyMessage:SetText("No mailbox data found for this character.\n\nVisit a mailbox in-game to save your mail data.")
emptyMessage:SetText(Guda_L["No mailbox data found for this character.\n\nVisit a mailbox in-game to save your mail data."])
emptyMessage:Show()
else
emptyMessage:Hide()
@@ -333,7 +333,7 @@ function MailboxFrame:DisplayItems(items, charFullName, totalMails)
local paginationText = getglobal("Guda_MailboxFrame_Pagination_Text")
if paginationText then
if totalMails == 0 then
paginationText:SetText("No Mail")
paginationText:SetText(Guda_L["No Mail"])
else
paginationText:SetText(string.format("%d/%d (items: %d)", currentPage, totalPages, totalMails or 0))
end
@@ -344,7 +344,7 @@ end
function Guda_MailboxFrame_OnSearchTextChanged()
local searchBox = getglobal("Guda_MailboxFrame_SearchBar_SearchBox")
local text = searchBox:GetText()
if text == "Search mailbox..." then
if text == Guda_L["Search mailbox..."] then
searchText = ""
else
searchText = string.lower(text)
+2 -2
View File
@@ -272,7 +272,7 @@ function QuestItemBar:Update()
button:SetScript("OnClick", function()
if this.fromDB then
addon:Print("Item is not currently in your bags (loading from database).")
addon:Print(Guda_L["Item is not currently in your bags (loading from database)."])
return
end
@@ -613,7 +613,7 @@ function QuestItemBar:UpdateFlyout(parent)
btn:SetScript("OnClick", function()
if this.fromDB then
addon:Print("Item is not currently in your bags (loading from database).")
addon:Print(Guda_L["Item is not currently in your bags (loading from database)."])
return
end
+47 -47
View File
@@ -39,7 +39,7 @@ function Guda_SettingsPopup_OnLoad(self)
Guda:ApplyBackdrop(self, "DEFAULT_FRAME")
local title = getglobal(self:GetName().."_Title")
title:SetText("Guda Settings")
title:SetText(Guda_L["Guda Settings"])
-- Increase title font size
local titleFont, _, titleFlags = title:GetFont()
if titleFont then
@@ -405,7 +405,7 @@ function Guda_SettingsPopup_BagColumnsSlider_OnLoad(self)
getglobal(self:GetName().."High"):SetText("20")
local text = getglobal(self:GetName().."Text")
text:SetText("Bag columns")
text:SetText(Guda_L["Bag columns"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -443,7 +443,7 @@ function Guda_SettingsPopup_BankColumnsSlider_OnLoad(self)
getglobal(self:GetName().."High"):SetText("20")
local text = getglobal(self:GetName().."Text")
text:SetText("Bank columns")
text:SetText(Guda_L["Bank columns"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -481,7 +481,7 @@ function Guda_SettingsPopup_BgTransparencySlider_OnLoad(self)
getglobal(self:GetName().."High"):SetText("100%")
local text = getglobal(self:GetName().."Text")
text:SetText("Background Transparency")
text:SetText(Guda_L["Background Transparency"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -540,7 +540,7 @@ function Guda_SettingsPopup_IconSizeSlider_OnLoad(self)
getglobal(self:GetName().."High"):SetText("64px")
local text = getglobal(self:GetName().."Text")
text:SetText("Icon size")
text:SetText(Guda_L["Icon size"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -580,7 +580,7 @@ function Guda_SettingsPopup_IconFontSizeSlider_OnLoad(self)
getglobal(self:GetName().."High"):SetText("20px")
local text = getglobal(self:GetName().."Text")
text:SetText("Icon font size")
text:SetText(Guda_L["Icon font size"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -620,7 +620,7 @@ function Guda_SettingsPopup_IconSpacingSlider_OnLoad(self)
getglobal(self:GetName().."High"):SetText("20px")
local text = getglobal(self:GetName().."Text")
text:SetText("Icon spacing")
text:SetText(Guda_L["Icon spacing"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -666,7 +666,7 @@ function Guda_SettingsPopup_QuestBarSizeSlider_OnLoad(self)
getglobal(self:GetName().."High"):SetText("64px")
local text = getglobal(self:GetName().."Text")
text:SetText("Quest bar size")
text:SetText(Guda_L["Quest bar size"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -701,7 +701,7 @@ function Guda_SettingsPopup_TrackedBarSizeSlider_OnLoad(self)
getglobal(self:GetName().."High"):SetText("64px")
local text = getglobal(self:GetName().."Text")
text:SetText("Tracked bar size")
text:SetText(Guda_L["Tracked bar size"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -734,7 +734,7 @@ end
function Guda_SettingsPopup_LockBagsCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Lock Window")
text:SetText(Guda_L["Lock Window"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -781,7 +781,7 @@ end
function Guda_SettingsPopup_HideBordersCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Hide Frame Borders")
text:SetText(Guda_L["Hide Frame Borders"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -840,7 +840,7 @@ end
function Guda_SettingsPopup_QualityBorderEquipmentCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Equipment Borders")
text:SetText(Guda_L["Equipment Borders"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -888,7 +888,7 @@ end
function Guda_SettingsPopup_QualityBorderOtherCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Other Item Borders")
text:SetText(Guda_L["Other Item Borders"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -936,7 +936,7 @@ end
function Guda_SettingsPopup_ShowSearchBarCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Show Search Bar")
text:SetText(Guda_L["Show Search Bar"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -993,7 +993,7 @@ end
function Guda_SettingsPopup_ShowQuestBarCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Show Quest Bar")
text:SetText(Guda_L["Show Quest Bar"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -1035,7 +1035,7 @@ end
function Guda_SettingsPopup_HoverBaglineCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Show All Bags")
text:SetText(Guda_L["Show All Bags"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -1087,7 +1087,7 @@ end
function Guda_SettingsPopup_HideFooterCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Hide Footer")
text:SetText(Guda_L["Hide Footer"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -1181,7 +1181,7 @@ function Guda_SettingsPopup_JunkOpacitySlider_OnLoad(self)
getglobal(self:GetName().."High"):SetText("100%")
local text = getglobal(self:GetName().."Text")
text:SetText("Junk item opacity")
text:SetText(Guda_L["Junk item opacity"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -1225,7 +1225,7 @@ end
function Guda_SettingsPopup_MarkUnusableCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Mark Unusable Items")
text:SetText(Guda_L["Mark Unusable Items"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -1273,7 +1273,7 @@ end
function Guda_SettingsPopup_ShowEquipSetCategoriesCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Equip Set Categories")
text:SetText(Guda_L["Equip Set Categories"])
local font, _, flags = text:GetFont()
if font then
@@ -1315,7 +1315,7 @@ end
function Guda_SettingsPopup_MarkEquipmentSetsCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Mark Equipment Sets")
text:SetText(Guda_L["Mark Equipment Sets"])
local font, _, flags = text:GetFont()
if font then
@@ -1357,7 +1357,7 @@ end
function Guda_SettingsPopup_AutoLockSetItemsCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Auto Lock Set Items")
text:SetText(Guda_L["Auto Lock Set Items"])
local font, _, flags = text:GetFont()
if font then
@@ -1389,7 +1389,7 @@ end
function Guda_SettingsPopup_ShowCategoryCountCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Show Category Count")
text:SetText(Guda_L["Show Category Count"])
local font, _, flags = text:GetFont()
if font then
@@ -1431,7 +1431,7 @@ end
function Guda_SettingsPopup_AutoVendorJunkCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Auto Sell Junk")
text:SetText(Guda_L["Auto Sell Junk"])
local font, _, flags = text:GetFont()
if font then
@@ -1463,7 +1463,7 @@ end
function Guda_SettingsPopup_AutoOpenBagsCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Auto Open Bags")
text:SetText(Guda_L["Auto Open Bags"])
local font, _, flags = text:GetFont()
if font then
@@ -1495,7 +1495,7 @@ end
function Guda_SettingsPopup_AutoCloseBagsCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Auto Close Bags")
text:SetText(Guda_L["Auto Close Bags"])
local font, _, flags = text:GetFont()
if font then
@@ -1527,7 +1527,7 @@ end
function Guda_SettingsPopup_WhiteItemsJunkCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("White Items as Junk")
text:SetText(Guda_L["White Items as Junk"])
local font, _, flags = text:GetFont()
if font then
@@ -1643,7 +1643,7 @@ function Guda_SettingsPopup_ThemeDropdown_OnLoad(self)
-- Add label above dropdown
local label = self:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
label:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 20, 2)
label:SetText("Theme")
label:SetText(Guda_L["Theme"])
label:SetTextColor(1, 0.82, 0, 1)
end
@@ -1761,7 +1761,7 @@ function Guda_SettingsPopup_BagViewDropdown_OnLoad(self)
local label = self:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
label:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 20, 2)
label:SetText("Bag View")
label:SetText(Guda_L["Bag View"])
label:SetTextColor(1, 0.82, 0, 1)
end
@@ -1800,7 +1800,7 @@ function Guda_SettingsPopup_BankViewDropdown_OnLoad(self)
local label = self:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
label:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 20, 2)
label:SetText("Bank View")
label:SetText(Guda_L["Bank View"])
label:SetTextColor(1, 0.82, 0, 1)
end
@@ -1808,7 +1808,7 @@ end
function Guda_SettingsPopup_ReverseStackSortCheckbox_OnLoad(self)
local text = getglobal(self:GetName().."Text")
if text then
text:SetText("Reverse Stack Sort")
text:SetText(Guda_L["Reverse Stack Sort"])
-- Increase font size
local font, _, flags = text:GetFont()
@@ -1901,7 +1901,7 @@ local function GetCategoryRowFrame(index)
editBtn:SetWidth(40)
editBtn:SetHeight(18)
editBtn:SetPoint("LEFT", nameText, "RIGHT", 5, 0)
editBtn:SetText("Edit")
editBtn:SetText(Guda_L["Edit"])
editBtn:SetScript("OnClick", function()
local catId = this:GetParent().categoryId
if catId then
@@ -1991,7 +1991,7 @@ local function GetCategoryRowFrame(index)
end)
local mergeLabel = row:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
mergeLabel:SetPoint("RIGHT", mergeCheckbox, "LEFT", -2, 0)
mergeLabel:SetText("Merge")
mergeLabel:SetText(Guda_L["Merge"])
mergeLabel:SetTextColor(0.8, 0.8, 0.8)
row.mergeCheckbox = mergeCheckbox
row.mergeLabel = mergeLabel
@@ -2141,12 +2141,12 @@ function Guda_SettingsPopup_CategoriesTab_Update()
-- Set button texts
local addBtn = getglobal("Guda_SettingsPopup_AddCategoryButton")
if addBtn then
addBtn:SetText("+ Add Category")
addBtn:SetText(Guda_L["+ Add Category"])
end
local resetBtn = getglobal("Guda_SettingsPopup_ResetCategoriesButton")
if resetBtn then
resetBtn:SetText("Reset Defaults")
resetBtn:SetText(Guda_L["Reset Defaults"])
end
end
@@ -2262,13 +2262,13 @@ function Guda_CategoryEditor_OnLoad(self)
-- Set button texts
local addBtn = getglobal("Guda_CategoryEditor_AddRuleButton")
if addBtn then addBtn:SetText("+ Add Rule") end
if addBtn then addBtn:SetText(Guda_L["+ Add Rule"]) end
local saveBtn = getglobal("Guda_CategoryEditor_SaveButton")
if saveBtn then saveBtn:SetText("Save") end
if saveBtn then saveBtn:SetText(Guda_L["Save"]) end
local cancelBtn = getglobal("Guda_CategoryEditor_CancelButton")
if cancelBtn then cancelBtn:SetText("Cancel") end
if cancelBtn then cancelBtn:SetText(Guda_L["Cancel"]) end
-- Create group EditBox if it doesn't exist
if not getglobal("Guda_CategoryEditor_GroupEditBox") then
@@ -2277,7 +2277,7 @@ function Guda_CategoryEditor_OnLoad(self)
-- Label
local groupLabel = self:CreateFontString("Guda_CategoryEditor_GroupLabel", "OVERLAY", "GameFontNormalSmall")
groupLabel:SetPoint("LEFT", nameBox, "RIGHT", 14, 0)
groupLabel:SetText("Group:")
groupLabel:SetText(Guda_L["Group:"])
groupLabel:SetTextColor(0.7, 0.7, 0.7)
-- EditBox
@@ -2299,7 +2299,7 @@ function Guda_CategoryEditor_OnLoad(self)
local markLabel = self:CreateFontString("Guda_CategoryEditor_MarkLabel", "OVERLAY", "GameFontNormalSmall")
markLabel:SetPoint("TOPLEFT", self, "TOPLEFT", 20, -78)
markLabel:SetText("Mark:")
markLabel:SetText(Guda_L["Mark:"])
markLabel:SetTextColor(0.7, 0.7, 0.7)
-- "None" button (first)
@@ -2360,14 +2360,14 @@ function Guda_CategoryEditor_OnLoad(self)
if anyRadio then
local label = anyRadio:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
label:SetPoint("LEFT", anyRadio, "RIGHT", 2, 0)
label:SetText("Any rule")
label:SetText(Guda_L["Any rule"])
end
local allRadio = getglobal("Guda_CategoryEditor_MatchAll")
if allRadio then
local label = allRadio:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
label:SetPoint("LEFT", allRadio, "RIGHT", 2, 0)
label:SetText("All rules")
label:SetText(Guda_L["All rules"])
end
end
@@ -2413,9 +2413,9 @@ function Guda_CategoryEditor_Open(categoryId)
local title = getglobal("Guda_CategoryEditor_Title")
if title then
if categoryDef.isBuiltIn then
title:SetText("Edit Category (Built-in)")
title:SetText(Guda_L["Edit Category (Built-in)"])
else
title:SetText("Edit Category")
title:SetText(Guda_L["Edit Category"])
end
end
@@ -2498,7 +2498,7 @@ local function GetRuleRowFrame(index)
typeBtn:SetWidth(120)
typeBtn:SetHeight(22)
typeBtn:SetPoint("LEFT", row, "LEFT", 0, 0)
typeBtn:SetText("Select Type")
typeBtn:SetText(Guda_L["Select Type"])
typeBtn.ruleIndex = index
typeBtn:SetScript("OnClick", function()
Guda_CategoryEditor_ShowTypeDropdown(this, this.ruleIndex)
@@ -2527,7 +2527,7 @@ local function GetRuleRowFrame(index)
valueBtn:SetWidth(140)
valueBtn:SetHeight(22)
valueBtn:SetPoint("LEFT", typeBtn, "RIGHT", 5, 0)
valueBtn:SetText("Select Value")
valueBtn:SetText(Guda_L["Select Value"])
valueBtn.ruleIndex = index
valueBtn:SetScript("OnClick", function()
Guda_CategoryEditor_ShowValueDropdown(this, this.ruleIndex)
@@ -2672,7 +2672,7 @@ function Guda_CategoryEditor_UpdateRulesDisplay()
-- Update rules count label
local rulesLabel = getglobal("Guda_CategoryEditor_RulesLabel")
if rulesLabel then
rulesLabel:SetText("Rules (" .. numRules .. "/" .. MAX_RULES .. "):")
rulesLabel:SetText(format(Guda_L["Rules (%d/%d):"], numRules, MAX_RULES))
end
-- Update scroll frame