WoWInterface SVN RecipeRadar

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /trunk
    from Rev 3 to Rev 4
    Reverse comparison

Rev 3 → Rev 4

RecipeRadar/locales/enUS.lua New file
0,0 → 1,575
local L = LibStub("AceLocale-3.0"):NewLocale("RecipeRadar", "enUS", true)
 
-- the name of the addon!
L["Recipe Radar"] = true
 
L["Left-click to open RecipeRadar."] = true
L["Right-click and drag to move this button."] = true
 
-- these show up in the game's Key Bindings screen
L["Recipe Radar Bindings"] = true
L["Toggle Recipe Radar"] = true
 
-- options button and corresponding options frame
L["Options"] = true
L["Auto-map Contributive Vendors"] = true
L["Auto-select Current Region"] = true
L["Check Availability for Alts"] = true
L["Minimap Button Position"] = true
L["Show Minimap Button"] = true
 
-- format strings used in the map tooltips
L["1 recipe"] = true
L["%d learnable"] = true
L["%d recipes"] = true
 
-- this appears when the recipe is not in your local database
L["Uncached Recipe"] = true
 
-- uncached recipe tooltip - see RecipeRadar_Availability_CreateTooltip()
L["You may mouse over the"] = true
L["icon to lookup this recipe."] = true
L["Warning: if your server has"] = true
L["not yet seen this item, you"] = true
L["will be disconnected!"] = true
 
-- some regions don't have any recipes for sale
L["No recipes for sale in this region."] = true
 
-- radio button (and tooltip) that indicates a mapped vendor
L["Locate Vendor on Map"] = true
L["Shift-click a vendor to add or remove her location on the world map."] = true
 
-- strings in the faction filtering dropdown; we don't need 'Horde' or 'Alliance' because Blizzard provides them for us
L["Factions"] = true
L["Neutral"] = true
 
-- profession filtering dropdown - these strings must match those returned by GetTradeSkillLine() and GetCraftDisplaySkillLine()
L["Professions"] = true
L["Alchemy"] = true
L["Blacksmithing"] = true
L["Cooking"] = true
L["Enchanting"] = true
L["Engineering"] = true
L["First Aid"] = true
L["Fishing"] = true
L["Inscription"] = true
L["Jewelcrafting"] = true
L["Leatherworking"] = true
L["Tailoring"] = true
 
-- strings in the availability filtering dropdown
L["Availability"] = true
L["Already Known (Alts)"] = true
L["Already Known (Player)"] = true
L["Available Now (Alts)"] = true
L["Available Now (Player)"] = true
L["Future Prospect (Alts)"] = true
L["Future Prospect (Player)"] = true
L["Inapplicable"] = true
 
-- headings for the availability tooltip
L["Available For:"] = true
L["Already Known By:"] = true
L["Future Prospect For:"] = true
 
-- format string for rank indicator for future prospects; that is, it tells you how soon you can learn the recipe - eg. "163 of 175"
L["%d of %d"] = true
 
-- special notes for vendor requirements follow vendor names (eg. "Seasonal Vendor")
L["%s Vendor"] = true
L["Intermittent"] = true
L["Quest"] = true
L["Roving"] = true
L["Seasonal"] = true
 
-- other recipe requirements
L["%s Only"] = true
L["Rogue"] = true
L["Special"] = true
 
-- menu item in the right-click context menu for mapped vendor buttons
L["Unmap Vendor"] = true
L["Collapse"] = true
L["Collapse All"] = true
L["Expand"] = true
L["Expand All"] = true
L["Map Vendor"] = true
 
-- trade skill specialties
L["Gnomish Engineer"] = true
L["Armorsmith"] = true
L["Dragonscale Leatherworking"] = true
L["Elemental Leatherworking"] = true
L["Goblin Engineer"] = true
L["Master Axesmith"] = true
L["Master Hammersmith"] = true
L["Master Swordsmith"] = true
L["Mooncloth Tailoring"] = true
L["Shadoweave Tailoring"] = true
L["Spellfire Tailoring"] = true
L["Tribal Leatherworking"] = true
L["Weaponsmith"] = true
 
-- continent names for alternate region selection
L["Kalimdor"] = true
L["Eastern Kingdoms"] = true
L["Instances"] = true
L["Northrend"] = true
L["Outland"] = true
 
-- some vendor names may need translating
L["\"Chef\" Overheat"] = true
L["\"Cookie\" McWeaksauce"] = true
L["Aaron Hollman"] = true
L["Abigail Shiel"] = true
L["Aendel Windspear"] = true
L["Agatian Fallanos"] = true
L["Aged Dalaran Wizard"] = true
L["Ainderu Summerleaf"] = true
L["Alchemist Finklestein"] = true
L["Alchemist Gribble"] = true
L["Alchemist Pestlezugg"] = true
L["Aldraan"] = true
L["Alexandra Bolero"] = true
L["Algernon"] = true
L["Almaador"] = true
L["Altaa"] = true
L["Alurmi"] = true
L["Alys Vol'tyr"] = true
L["Amy Davenport"] = true
L["Andormu"] = true
L["Andrew Hilbert"] = true
L["Andrion Darkspinner"] = true
L["Androd Fadran"] = true
L["Anuur"] = true
L["Apothecary Antonivich"] = true
L["Apprentice Darius"] = true
L["Apprentice of Estulan"] = true
L["Archmage Alvareaux"] = true
L["Aresella"] = true
L["Argent Quartermaster Hasana"] = true
L["Argent Quartermaster Lightspark"] = true
L["Arille Azuregaze"] = true
L["Aristaleon Sunweaver"] = true
L["Arras"] = true
L["Arred"] = true
L["Arrond"] = true
L["Asarnan"] = true
L["Ayla Shadowstorm"] = true
L["Bale"] = true
L["Banalash"] = true
L["Bario Matalli"] = true
L["Blackwing"] = true
L["Blimo Gadgetspring"] = true
L["Blixrez Goodstitch"] = true
L["Blizrik Buckshot"] = true
L["Bliztik"] = true
L["Bombus Finespindle"] = true
L["Borto"] = true
L["Borya"] = true
L["Bountiful Barrel"] = true
L["Bradley Towns"] = true
L["Braeg Stoutbeard"] = true
L["Brienna Starglow"] = true
L["Bro'kin"] = true
L["Bronk"] = true
L["Brundall Chiselgut"] = true
L["Bryan Landers"] = true
L["Buckslappy"] = true
L["Burbik Gearspanner"] = true
L["Burko"] = true
L["Captain Samir"] = true
L["Captured Gnome"] = true
L["Casandra Downs"] = true
L["Catherine Leland"] = true
L["Chapman"] = true
L["Christoph Jeffcoat"] = true
L["Cielstrasza"] = true
L["Clyde Ranthal"] = true
L["Constance Brisboise"] = true
L["Cookie One-Eye"] = true
L["Coreiel"] = true
L["Corporal Bluth"] = true
L["Cowardly Crosby"] = true
L["Crazk Sparks"] = true
L["Cro Threadstrong"] = true
L["Daga Ramba"] = true
L["Daggle Ironshaper"] = true
L["Dalni Tallgrass"] = true
L["Dalria"] = true
L["Damek Bloombeard"] = true
L["Daniel Bartlett"] = true
L["Danielle Zipstitch"] = true
L["Darian Singh"] = true
L["Darnall"] = true
L["Dealer Malij"] = true
L["Defias Profiteer"] = true
L["Derak Nightfall"] = true
L["Derek Odds"] = true
L["Desaan"] = true
L["Deynna"] = true
L["Dirge Quikcleave"] = true
L["Doba"] = true
L["Doris Volanthius"] = true
L["Drac Roughcut"] = true
L["Draelan"] = true
L["Drake Lindgren"] = true
L["Drovnar Strongbrew"] = true
L["Duchess Mynx"] = true
L["Edna Mullby"] = true
L["Eebee Jinglepocket"] = true
L["Egomis"] = true
L["Eiin"] = true
L["Eldara Dawnrunner"] = true
L["Elizabeth Barker Winslow"] = true
L["Elynna"] = true
L["Emrul Riknussun"] = true
L["Enchantress Andiala"] = true
L["Eriden"] = true
L["Erika Tate"] = true
L["Erilia"] = true
L["Evie Whirlbrew"] = true
L["Fariel Starsong"] = true
L["Fazu"] = true
L["Fedryen Swiftspear"] = true
L["Feera"] = true
L["Felannia"] = true
L["Felicia Doan"] = true
L["Felika"] = true
L["Fizzix Blastbolt"] = true
L["Fradd Swiftgear"] = true
L["Frozo the Renowned"] = true
L["Fyldan"] = true
L["Gagsprocket"] = true
L["Galley Chief Alunwea"] = true
L["Galley Chief Gathers"] = true
L["Galley Chief Grace"] = true
L["Galley Chief Halumvorea"] = true
L["Galley Chief Mariss"] = true
L["Galley Chief Steelbelly"] = true
L["Gambarinka"] = true
L["Gara Skullcrush"] = true
L["Gearcutter Cogspinner"] = true
L["Geen"] = true
L["Gelanthis"] = true
L["George Candarte"] = true
L["Gharash"] = true
L["Ghok'kah"] = true
L["Gidge Spellweaver"] = true
L["Gigget Zipcoil"] = true
L["Gikkix"] = true
L["Gina MacGregor"] = true
L["Gloria Femmel"] = true
L["Glyx Brewright"] = true
L["Gnaz Blunderflame"] = true
L["Goram"] = true
L["Gretta Ganter"] = true
L["Grimtak"] = true
L["Grub"] = true
L["Haalrun"] = true
L["Haferet"] = true
L["Hagrus"] = true
L["Hammon Karwn"] = true
L["Harggan"] = true
L["Harklan Moongrove"] = true
L["Harlon Thornguard"] = true
L["Harlown Darkweave"] = true
L["Harn Longcast"] = true
L["Haughty Modiste"] = true
L["Heldan Galesong"] = true
L["Helenia Olden"] = true
L["High Admiral \"Shelly\" Jorrik"] = true
L["Himmik"] = true
L["Hotoppik Copperpinch"] = true
L["Hula'mahi"] = true
L["Ikaneba Summerset"] = true
L["Ildine Sorrowspear"] = true
L["Indormi"] = true
L["Inessera"] = true
L["Innkeeper Biribi"] = true
L["Innkeeper Fizzgrimble"] = true
L["Innkeeper Grilka"] = true
L["Isabel Jones"] = true
L["Jabbey"] = true
L["Jandia"] = true
L["Janet Hommers"] = true
L["Jangdor Swiftstrider"] = true
L["Jannos Ironwill"] = true
L["Jaquilina Dramet"] = true
L["Jase Farlane"] = true
L["Jazzrik"] = true
L["Jeeda"] = true
L["Jennabink Powerseam"] = true
L["Jessara Cordell"] = true
L["Jezebel Bican"] = true
L["Jillian Tanner"] = true
L["Jim Saltit"] = true
L["Jinky Twizzlefixxit"] = true
L["Johan Barnes"] = true
L["John Rigsdale"] = true
L["Joseph Moore"] = true
L["Jubie Gadgetspring"] = true
L["Jungle Serpent"] = true
L["Jun'ha"] = true
L["Juno Dufrain"] = true
L["Jutak"] = true
L["Kaita Deepforge"] = true
L["Kalldan Felmoon"] = true
L["Kania"] = true
L["Karaaz"] = true
L["Karizi Porkpatty"] = true
L["Kaye Toogie"] = true
L["Keena"] = true
L["Kelsey Yance"] = true
L["Kendor Kabonka"] = true
L["Khara Deepwater"] = true
L["Khole Jinglepocket"] = true
L["Kiknikle"] = true
L["Killian Sanatha"] = true
L["Kilxx"] = true
L["Kim Horn"] = true
L["Kireena"] = true
L["Kirembri Silvermane"] = true
L["Kithas"] = true
L["Knaz Blunderflame"] = true
L["Knight Dameron"] = true
L["Koren"] = true
L["Kor'geld"] = true
L["Krek Cragcrush"] = true
L["Kriggon Talsone"] = true
L["Krinkle Goodsteel"] = true
L["KTC Train-a-Tron Deluxe"] = true
L["Kul Inkspiller"] = true
L["Kuldar Steeltooth"] = true
L["Kulwia"] = true
L["Kzixx"] = true
L["Lady Palanseer"] = true
L["Laha Farplain"] = true
L["Laida Gembold"] = true
L["Laird"] = true
L["Lalla Brightweave"] = true
L["Landraelanis"] = true
L["Larana Drome"] = true
L["Lardan"] = true
L["Larissia"] = true
L["Layna Karner"] = true
L["Lebowski"] = true
L["Leeli Longhaggle"] = true
L["Leo Sarn"] = true
L["Leonard Porter"] = true
L["Librarian Erickson"] = true
L["Lieutenant General Andorov"] = true
L["Lillehoff"] = true
L["Lilly"] = true
L["Lindea Rabonne"] = true
L["Linna Bruder"] = true
L["Lizbeth Cromwell"] = true
L["Lizna Goldweaver"] = true
L["Logannas"] = true
L["Logistics Officer Brighton"] = true
L["Logistics Officer Silverstone"] = true
L["Logistics Officer Ulrike"] = true
L["Lokhtos Darkbargainer"] = true
L["Loolruna"] = true
L["Lorelae Wintersong"] = true
L["Lyna"] = true
L["Madame Ruby"] = true
L["Magnus Frostwake"] = true
L["Mahu"] = true
L["Mak"] = true
L["Mallen Swain"] = true
L["Malygen"] = true
L["Mari Stonehand"] = true
L["Maria Lumere"] = true
L["Marith Lazuria"] = true
L["Martine Tramblay"] = true
L["Masat T'andr"] = true
L["Master Chef Mouldier"] = true
L["Master Craftsman Omarion"] = true
L["Mathar G'ochar"] = true
L["Mavralyn"] = true
L["Mazk Snipeshot"] = true
L["Meilosh"] = true
L["Melaris"] = true
L["Mera Mistrunner"] = true
L["Micha Yance"] = true
L["Millie Gregorian"] = true
L["Mirla Silverblaze"] = true
L["Misensi"] = true
L["Mishta"] = true
L["Misty Merriweather"] = true
L["Mixie Farshot"] = true
L["Modoru"] = true
L["Montarr"] = true
L["Morgan Day"] = true
L["Moro Sungrain"] = true
L["Muheru the Weaver"] = true
L["Muuran"] = true
L["Mycah"] = true
L["Mythrin'dir"] = true
L["Naal Mistrunner"] = true
L["Nakodu"] = true
L["Namdo Bizzfizzle"] = true
L["Nandar Branson"] = true
L["Nardstrum Copperpinch"] = true
L["Narj Deepslice"] = true
L["Narkk"] = true
L["Nasmara Moonsong"] = true
L["Nata Dawnstrider"] = true
L["Neal Allen"] = true
L["Neii"] = true
L["Nemiha"] = true
L["Nergal"] = true
L["Nerrist"] = true
L["Nessa Shadowsong"] = true
L["Nina Lightbrew"] = true
L["Nioma"] = true
L["Nula the Butcher"] = true
L["Nuri"] = true
L["Nyoma"] = true
L["Ogg'marr"] = true
L["Okuno"] = true
L["Ontuvo"] = true
L["Otho Moji'ko"] = true
L["Outfitter Eric"] = true
L["Paku Cloudchaser"] = true
L["Palehoof's Big Bag of Parts"] = true
L["Paulsta'ats"] = true
L["Penney Copperpinch"] = true
L["Phea"] = true
L["Plugger Spazzring"] = true
L["Poranna Snowbraid"] = true
L["Pratt McGrubben"] = true
L["Prospector Khazgorm"] = true
L["Provisioner Lorkran"] = true
L["Provisioner Nasela"] = true
L["Punra"] = true
L["Qia"] = true
L["Quartermaster Davian Vaclav"] = true
L["Quartermaster Endarin"] = true
L["Quartermaster Enuril"] = true
L["Quartermaster Jaffrey Noreliqe"] = true
L["Quartermaster Miranda Breechlock"] = true
L["Quartermaster Urgronn"] = true
L["Quelis"] = true
L["Randah Songhorn"] = true
L["Ranik"] = true
L["Ranisa Whitebough"] = true
L["Rann Flamespinner"] = true
L["Rartar"] = true
L["Rathis Tomber"] = true
L["Riha"] = true
L["Rikqiz"] = true
L["Rin'wosho the Trader"] = true
L["Rizz Loosebolt"] = true
L["Rohok"] = true
L["Ronald Burch"] = true
L["Rose Standish"] = true
L["Rungor"] = true
L["Ruppo Zipcoil"] = true
L["Saenorion"] = true
L["Sairuk"] = true
L["Sal Ferraga"] = true
L["Samuel Van Brunt"] = true
L["Sara Lanner"] = true
L["Sarah Lightbrew"] = true
L["Sassa Weldwell"] = true
L["Sebastian Crane"] = true
L["Seer Janidi"] = true
L["Seersa Copperpinch"] = true
L["Senthii"] = true
L["Sewa Mistrunner"] = true
L["Shaani"] = true
L["Shadi Mistrunner"] = true
L["Shankys"] = true
L["Shay Pressler"] = true
L["Shazdar"] = true
L["Sheendra Tallgrass"] = true
L["Shen'dralar Provisioner"] = true
L["Sheri Zipstitch"] = true
L["Sid Limbardi"] = true
L["Skreah"] = true
L["Smudge Thunderwood"] = true
L["Soolie Berryfizz"] = true
L["Sovik"] = true
L["Steeg Haskell"] = true
L["Stone Guard Mukar"] = true
L["Stuart Fleming"] = true
L["Suja"] = true
L["Sumi"] = true
L["Super-Seller 680"] = true
L["Supply Officer Mills"] = true
L["Tamar"] = true
L["Tanaika"] = true
L["Tanak"] = true
L["Tansy Puddlefizz"] = true
L["Tarban Hearthgrain"] = true
L["Tarien Silverdew"] = true
L["Tari'qa"] = true
L["Taur Stonehoof"] = true
L["Terrance Denman"] = true
L["Thaddeus Webb"] = true
L["Tharynn Bouden"] = true
L["Thomas Yance"] = true
L["Threm Blackscalp"] = true
L["Thurgrum Deepforge"] = true
L["Tiffany Cartier"] = true
L["Tilli Thistlefuzz"] = true
L["Timothy Jones"] = true
L["Trader Narasu"] = true
L["Truk Wildbeard"] = true
L["Tunkk"] = true
L["Ulthaan"] = true
L["Ulthir"] = true
L["Una Kobuna"] = true
L["Uriku"] = true
L["Uthok"] = true
L["Vaean"] = true
L["Valdaron"] = true
L["Vanessa Sellers"] = true
L["Vargus"] = true
L["Veenix"] = true
L["Velia Moonbow"] = true
L["Vendor-Tron 1000"] = true
L["Veteran Crusader Aliocha Segard"] = true
L["Vharr"] = true
L["Viggz Shinesparked"] = true
L["Vivianna"] = true
L["Vix Chromeblaster"] = true
L["Vizna Bangwrench"] = true
L["Vizzklick"] = true
L["Vodesiin"] = true
L["Wenna Silkbeard"] = true
L["Werg Thickblade"] = true
L["Wik'Tar"] = true
L["Wilmina Holbeck"] = true
L["Wind Trader Lathrai"] = true
L["Wolgren Jinglepocket"] = true
L["Worb Strongstitch"] = true
L["Wrahk"] = true
L["Wulan"] = true
L["Wulmort Jinglepocket"] = true
L["Wunna Darkmane"] = true
L["Xandar Goodbeard"] = true
L["Xen'to"] = true
L["Xerintha Ravenoak"] = true
L["Xizk Goodstitch"] = true
L["Xizzer Fizzbolt"] = true
L["Yatheon"] = true
L["Yonada"] = true
L["Ythyar"] = true
L["Yuka Screwspigot"] = true
L["Yurial Soulwater"] = true
L["Zan Shivsproket"] = true
L["Zannok Hidepiercer"] = true
L["Zansoa"] = true
L["Zaralda"] = true
L["Zarena Cromwind"] = true
L["Zargh"] = true
L["Zido Helmbreaker"] = true
L["Zixil"] = true
L["Zoey Wizzlespark"] = true
L["Zorbin Fandazzle"] = true
L["Zurai"] = true
L["Zurii"] = true
RecipeRadar/locales/zhTW.lua New file
0,0 → 1,500
local L = LibStub("AceLocale-3.0"):NewLocale("RecipeRadar", "zhTW", false)
if not L then return end
 
L["Recipe Radar"] = "配方雷達"
L["Toggle Recipe Radar"] = "顯示配方雷達"
L["Recipe Radar Bindings"] = "配方雷達熱鍵"
L["Auto-map Contributive Vendors"] = "顯示屏食譜"
L["Auto-select Current Region"] = "自動選擇地區"
L["Check Availability for Alts"] = "判斷分身是否可用"
L["Minimap Button Position"] = "小地圖按鈕位置"
L["Show Minimap Button"] = "顯示小地圖按鈕"
L["Options"] = "選項"
L["%d learnable"] = "%d 可學"
L["%d recipes"] = "%d 配方"
L["1 recipe"] = "1 配方"
L["Uncached Recipe"] = "未快取的配方"
L["You may mouse over the"] = "可把滑鼠移到"
L["icon to lookup this recipe."] = "圖示來看這個配方."
L["Warning: if your server has"] = "警告: 如果妳的伺服器"
L["not yet seen this item, you"] = "還沒出現過這個物品"
L["will be disconnected!"] = "妳將有可能斷線!"
L["No recipes for sale in this region."] = "這地區沒有配方可買"
L["Shift-click a vendor to add or remove her location on the world map."] = "Shift-click 一個商人來加入或移除在世界地圖的標示."
L["Locate Vendor on Map"] = "在地圖上標示商人"
L["Neutral"] = "中立"
L["Factions"] = "聲望"
L["Alchemy"] = "煉金術"
L["Blacksmithing"] = "鍛造"
L["Cooking"] = "烹飪"
L["Enchanting"] = "附魔"
L["Engineering"] = "工程學"
L["First Aid"] = "急救"
L["Fishing"] = "釣魚"
L["Jewelcrafting"] = "珠寶設計"
L["Leatherworking"] = "製皮"
L["Tailoring"] = "裁縫"
L["Professions"] = "專業技能"
L["Already Known (Alts)"] = "已學會 (分身)"
L["Already Known (Player)"] = "已學會 (玩家)"
L["Available Now (Alts)"] = "現在可學 (分身)"
L["Available Now (Player)"] = "現在可學 (玩家)"
L["Future Prospect (Alts)"] = "以後可學 (分身)"
L["Future Prospect (Player)"] = "以後可學 (玩家)"
L["Inapplicable"] = "無法學習"
L["Availability"] = "可獲得性"
L["Already Known By:"] = "已知:"
L["Future Prospect For:"] = "以後可學會:"
L["Available For:"] = "可學:"
L["Quest"] = "任務"
L["Roving"] = "漫遊"
L["Seasonal"] = "季節性"
L["%s Vendor"] = "%s 商人"
L["Ashtongue Deathsworn"] = "灰舌死亡誓言者"
L["Cenarion Circle"] = "塞納里奧議會"
L["Cenarion Expedition"] = "塞納里奧遠征隊"
L["Honor Hold"] = "榮譽堡"
L["Keepers of Time"] = "時光守衛者"
L["Kurenai"] = "卡爾奈"
L["Lower City"] = "陰鬱城"
L["Netherwing"] = "虛空之翼"
L["Shattered Sun Offensive"] = "破碎之日進攻部隊"
L["Sporeggar"] = "斯博格爾"
L["The Aldor"] = "奧多爾"
L["The Consortium"] = "聯合團"
L["The Mag'har"] = "瑪格哈"
L["The Scale of the Sands"] = "流沙之鱗"
L["The Scryers"] = "占卜者"
L["The Sha'tar"] = "薩塔"
L["The Violet Eye"] = "紫羅蘭之眼"
L["Thorium Brotherhood"] = "瑟銀兄弟會"
L["Thrallmar"] = "索爾瑪"
L["Timbermaw Hold"] = "木喉要塞"
L["Zandalar Tribe"] = "贊達拉部族"
L["Argent Dawn"] = "銀色黎明"
L["Rogue"] = "盜賊"
L["Special"] = "特殊"
L["Collapse"] = "折疊"
L["Collapse All"] = "折疊全部"
L["Expand"] = "展開"
L["Expand All"] = "展開全部"
L["Armorsmith"] = "護甲鍛造師"
L["Dragonscale Leatherworking"] = "龍鱗製皮"
L["Elemental Leatherworking"] = "元素製皮"
L["Goblin Engineer"] = "哥布林工程師"
L["Master Axesmith"] = "鑄斧大師"
L["Master Hammersmith"] = "鑄鎚大師"
L["Master Swordsmith"] = "鑄劍大師"
L["Mooncloth Tailoring"] = "月系裁縫"
L["Shadoweave Tailoring"] = "暗紋裁縫"
L["Spellfire Tailoring"] = "魔焰裁縫"
L["Tribal Leatherworking"] = "部族製皮"
L["Weaponsmith"] = "武器鑄造"
L["Gnomish Engineer"] = "地精工程"
L["Eastern Kingdoms"] = "東部王國"
L["Instances"] = "副本"
L["Kalimdor"] = "卡林多"
 
L["Alterac Mountains"] = "奧特蘭克山脈"
L["Arathi Highlands"] = "阿拉希高地"
L["Ashenvale"] = "梣谷"
L["Azshara"] = "艾薩拉"
L["Azuremyst Isle"] = "藍謎島"
L["Badlands"] = "荒蕪之地"
L["Blackrock Depths"] = "黑石深淵"
L["Blade's Edge Mountains"] = "劍刃山脈"
L["Blasted Lands"] = "詛咒之地"
L["Bloodmyst Isle"] = "血謎島"
L["Burning Steppes"] = "燃燒平原"
L["Darkshore"] = "黑海岸"
L["Darnassus"] = "達納蘇斯"
L["Deadwind Pass"] = "逆風小徑"
L["Desolace"] = "淒涼之地"
L["Dire Maul"] = "厄運之槌"
L["Dun Morogh"] = "丹莫洛"
L["Durotar"] = "杜洛塔"
L["Duskwood"] = "暮色森林"
L["Dustwallow Marsh"] = "塵泥沼澤"
L["Eastern Plaguelands"] = "東瘟疫之地"
L["Elwynn Forest"] = "艾爾文森林"
L["Eversong Woods"] = "永歌森林"
L["Felwood"] = "費伍德森林"
L["Feralas"] = "菲拉斯"
L["Ghostlands"] = "鬼魂之地"
L["Gnomeregan"] = "諾姆瑞根"
L["Hellfire Peninsula"] = "地獄火半島"
L["Hillsbrad Foothills"] = "希爾斯布萊德丘陵"
L["Ironforge"] = "鐵爐堡"
L["Karazhan"] = "卡拉贊"
L["Loch Modan"] = "洛克莫丹"
L["Moonglade"] = "月光林地"
L["Mulgore"] = "莫高雷"
L["Nagrand"] = "納葛蘭"
L["Naxxramas"] = "納克薩瑪斯"
L["Netherstorm"] = "虛空風暴"
L["Old Hillsbrad Foothills"] = "希爾斯布萊德丘陵舊址"
L["Orgrimmar"] = "奧格瑪"
L["Redridge Mountains"] = "赤脊山"
L["Ruins of Ahn'Qiraj"] = "安其拉廢墟"
L["Searing Gorge"] = "灼熱峽谷"
L["Shadowmoon Valley"] = "影月谷"
L["Shattrath City"] = "撒塔斯城"
L["Silithus"] = "希利蘇斯"
L["Silvermoon City"] = "銀月城"
L["Silverpine Forest"] = "銀松森林"
L["Stonetalon Mountains"] = "石爪山脈"
L["Stormwind City"] = "暴風城"
L["Stranglethorn Vale"] = "荊棘谷"
L["Swamp of Sorrows"] = "悲傷沼澤"
L["Tanaris"] = "塔納利斯"
L["Teldrassil"] = "泰達希爾"
L["Terokkar Forest"] = "泰洛卡森林"
L["The Barrens"] = "貧瘠之地"
L["The Exodar"] = "艾克索達"
L["The Hinterlands"] = "辛特蘭"
L["Thousand Needles"] = "千針石林"
L["Thunder Bluff"] = "雷霆崖"
L["Tirisfal Glades"] = "提裡斯法林地"
L["Undercity"] = "幽暗城"
L["Un'Goro Crater"] = "安戈洛環形山"
L["Wailing Caverns"] = "哀嚎洞穴"
L["Western Plaguelands"] = "西瘟疫之地"
L["Westfall"] = "西部荒野"
L["Wetlands"] = "濕地"
L["Winterspring"] = "冬泉谷"
L["Zangarmarsh"] = "贊格沼澤"
 
L["\"Cookie\" McWeaksauce"] = "『小廚』麥克威醬"
L["Aaron Hollman"] = "艾朗·赫曼"
L["Abigail Shiel"] = "阿比蓋爾·沙伊爾"
L["Aendel Windspear"] = "安迪爾·風矛"
L["Aged Dalaran Wizard"] = "年邁的達拉然法師"
L["Alchemist Gribble"] = "鍊金師古利伯"
L["Alchemist Pestlezugg"] = "煉金師匹斯特蘇格"
L["Aldraan"] = "阿爾德蘭"
L["Alexandra Bolero"] = "亞歷山卓·波利羅"
L["Algernon"] = "奧格諾恩"
L["Almaador"] = "阿拉瑪多爾"
L["Altaa"] = "艾歐塔"
L["Alurmi"] = "阿勒米"
L["Amy Davenport"] = "艾米·達文波特"
L["Andormu"] = "安杜姆"
L["Andrew Hilbert"] = "安德魯·希爾伯特"
L["Andrion Darkspinner"] = "安德利恩·暗紋紡織者"
L["Androd Fadran"] = "安多德·法德蘭"
L["Apothecary Antonivich"] = "藥劑師安拓維奇"
L["Apprentice Darius"] = "學徒達瑞爾斯"
L["Aresella"] = "艾瑞斯拉"
L["Argent Quartermaster Hasana"] = "銀色黎明軍需官哈薩娜"
L["Argent Quartermaster Lightspark"] = "銀色黎明軍需官萊斯巴克"
L["Arras"] = "阿拉斯"
L["Arred"] = "阿瑞德"
L["Arrond"] = "阿羅德"
L["Asarnan"] = "阿薩南"
L["Balai Lok'Wein"] = "巴萊·洛克維"
L["Bale"] = "拜爾"
L["Banalash"] = "巴納拉許"
L["Baxter"] = "拜斯特"
L["Blimo Gadgetspring"] = "布里莫"
L["Blixrez Goodstitch"] = "布里克雷茲·古斯提"
L["Blizrik Buckshot"] = "布雷茲里克·巴克舒特"
L["Bliztik"] = "布里茲提克"
L["Bombus Finespindle"] = "伯布斯·鋼軸"
L["Borto"] = "波爾土"
L["Borya"] = "博亞"
L["Brienna Starglow"] = "布琳娜·星光"
L["Bro'kin"] = "布洛金"
L["Bronk"] = "布隆克"
L["Burbik Gearspanner"] = "巴比克·齒輪"
L["Burko"] = "波爾寇"
L["Captured Gnome"] = "捕獲的地精"
L["Catherine Leland"] = "凱薩琳·利蘭"
L["Christoph Jeffcoat"] = "克里斯多夫·傑弗寇特"
L["Clyde Ranthal"] = "克萊德·蘭薩爾"
L["Constance Brisboise"] = "康斯坦茨·布里斯博埃斯"
L["Cookie One-Eye"] = "獨眼廚師"
L["Coreiel"] = "寇瑞歐"
L["Corporal Bluth"] = "布魯斯下士"
L["Cowardly Crosby"] = "怯懦的克羅斯比"
L["Crazk Sparks"] = "克拉賽·斯巴克斯"
L["Cro Threadstrong"] = "克洛·絲壯"
L["Daga Ramba"] = "達卡·萊芭"
L["Daggle Ironshaper"] = "達茍·煉鐵者"
L["Dalria"] = "達利亞"
L["Daniel Bartlett"] = "丹尼爾·巴特萊特"
L["Danielle Zipstitch"] = "丹尼勒·希普斯迪"
L["Darian Singh"] = "達利安·辛格"
L["Darnall"] = "旅店老闆達納爾"
L["Dealer Malij"] = "商人瑪力吉"
L["Defias Profiteer"] = "迪菲亞奸商"
L["Deneb Walker"] = "德尼布·沃克"
L["Derak Nightfall"] = "德拉克·奈特弗"
L["Deynna"] = "笛娜"
L["Dirge Quikcleave"] = "迪爾格·奎克里弗"
L["Doba"] = "杜巴"
L["Drac Roughcut"] = "德拉克·卷刃"
L["Drake Lindgren"] = "崔克·林格雷"
L["Drovnar Strongbrew"] = "德魯納·烈酒"
L["Edna Mullby"] = "艾德娜·穆比"
L["Eebee Jinglepocket"] = "伊比·響囊"
L["Egomis"] = "伊歐糜斯"
L["Eiin"] = "伊恩"
L["Eldara Dawnrunner"] = "艾達拉·晨路"
L["Elynna"] = "愛琳娜"
L["Emrul Riknussun"] = "埃姆盧爾·里克努斯"
L["Eriden"] = "艾利丹"
L["Erika Tate"] = "艾瑞卡·塔特"
L["Erilia"] = "艾瑞麗雅"
L["Evie Whirlbrew"] = "埃文·維布魯"
L["Fazu"] = "法蘇"
L["Fedryen Swiftspear"] = "費德萊恩·迅矛"
L["Feera"] = "菲娜"
L["Felannia"] = "菲蘭妮雅"
L["Felicia Doan"] = "菲利希亞·杜安"
L["Felika"] = "菲利卡"
L["Fradd Swiftgear"] = "弗拉德"
L["Fyldan"] = "菲爾丹"
L["Gagsprocket"] = "加格斯普吉特"
L["Galley Chief Alunwea"] = "船艙長艾魯威"
L["Galley Chief Gathers"] = "船艙長賈德斯"
L["Galley Chief Grace"] = "船艙長葛蕾絲"
L["Galley Chief Halumvorea"] = "船艙長哈倫寶利"
L["Galley Chief Mariss"] = "船艙長馬里斯"
L["Gambarinka"] = "坎巴利卡"
L["Gaston"] = "凱斯頓"
L["Gearcutter Cogspinner"] = "考格斯賓"
L["Gelanthis"] = "吉藍迪斯"
L["George Candarte"] = "喬治·坎達特"
L["Gharash"] = "卡爾拉什"
L["Ghok'kah"] = "格魯克卡恩"
L["Gidge Spellweaver"] = "蓋吉·術法編織者"
L["Gikkix"] = "吉科希斯"
L["Gina MacGregor"] = "吉娜·馬克葛瑞格"
L["Gloria Femmel"] = "格勞瑞亞·菲米爾"
L["Glyx Brewright"] = "格里克斯·布魯維特"
L["Gnaz Blunderflame"] = "格納茲·槍焰"
L["Gretta Ganter"] = "格雷塔·甘特"
L["Grimtak"] = "格瑞姆塔克"
L["Haalrun"] = "哈爾隆恩"
L["Haferet"] = "哈弗瑞"
L["Hagrus"] = "哈格魯斯"
L["Hammon Karwn"] = "哈蒙·卡文"
L["Harggan"] = "哈爾甘"
L["Harklan Moongrove"] = "哈克蘭·月林"
L["Harlon Thornguard"] = "哈隆·棘甲"
L["Harn Longcast"] = "哈恩·長線"
L["Haughty Modiste"] = "傲慢的店主"
L["Heldan Galesong"] = "海爾丹·風歌"
L["Helenia Olden"] = "海倫妮亞·奧德恩"
L["Himmik"] = "西米克"
L["Hula'mahi"] = "哈拉瑪"
L["Indormi"] = "隱多米"
L["Innkeeper Biribi"] = "旅店老闆畢瑞比"
L["Innkeeper Fizzgrimble"] = "旅店老闆菲茲格瑞博"
L["Innkeeper Grilka"] = "旅店老闆格瑞伊卡"
L["Jabbey"] = "加貝"
L["Jandia"] = "詹迪亞"
L["Janet Hommers"] = "詹奈特·霍莫斯"
L["Jangdor Swiftstrider"] = "杉多爾·迅蹄"
L["Jannos Ironwill"] = "加諾斯·鐵心"
L["Jaquilina Dramet"] = "加奎琳娜·德拉米特"
L["Jase Farlane"] = "賈斯·法拉恩"
L["Jazzrik"] = "加茲里克"
L["Jeeda"] = "基達"
L["Jennabink Powerseam"] = "吉娜比克·鐵線"
L["Jessara Cordell"] = "傑薩拉·考迪爾"
L["Jim Saltit"] = "吉姆·沙提"
L["Jinky Twizzlefixxit"] = "金克·鐵鉤"
L["Johan Barnes"] = "裘汗·巴奈斯"
L["Joseph Moore"] = "約瑟夫·摩爾"
L["Jubie Gadgetspring"] = "朱比"
L["Jun'ha"] = "祖恩哈"
L["Juno Dufrain"] = "喬諾·杜伏恩"
L["Jutak"] = "祖塔克"
L["Kaita Deepforge"] = "凱塔·深爐"
L["Kalaen"] = "卡連恩"
L["Kalldan Felmoon"] = "卡爾丹·暗月"
L["Kania"] = "卡妮亞"
L["Karaaz"] = "卡瑞阿斯"
L["Keena"] = "基納"
L["Kelsey Yance"] = "凱爾希·楊斯"
L["Kendor Kabonka"] = "肯多爾·卡邦卡"
L["Khara Deepwater"] = "卡拉·深水"
L["Khole Jinglepocket"] = "霍勒"
L["Kiknikle"] = "吉克尼庫"
L["Killian Sanatha"] = "基利恩·薩納森"
L["Kilxx"] = "基爾克斯"
L["Kireena"] = "基瑞娜"
L["Kithas"] = "基薩斯"
L["Knaz Blunderflame"] = "克納茲·槍焰"
L["Koren"] = "卡爾侖"
L["Kor'geld"] = "考吉爾德"
L["Krek Cragcrush"] = "克瑞克·碎岩"
L["Kriggon Talsone"] = "克雷貢·塔爾松"
L["Krinkle Goodsteel"] = "克林科·古德斯迪爾"
L["Kulwia"] = "庫爾維亞"
L["Kzixx"] = "卡茲克斯"
L["Laird"] = "賴爾德"
L["Landraelanis"] = "藍卓阿蘭妮絲"
L["Lardan"] = "拉爾丹"
L["Lebowski"] = "樂柏斯基"
L["Leeli Longhaggle"] = "莉利·長爭"
L["Leonard Porter"] = "萊納德·波特"
L["Lieutenant General Andorov"] = "安多洛夫中將"
L["Lilly"] = "莉蕾"
L["Lindea Rabonne"] = "林迪·拉波尼"
L["Lizbeth Cromwell"] = "莉茲白·克倫威爾"
L["Logannas"] = "洛加納斯"
L["Logistics Officer Ulrike"] = "物流幹部烏賴克"
L["Lokhtos Darkbargainer"] = "羅克圖斯·暗契"
L["Loolruna"] = "路歐露娜"
L["Lorelae Wintersong"] = "羅賴爾·冬歌"
L["Lucan Cordell"] = "魯坎·考迪爾"
L["Lyna"] = "萊娜"
L["Madame Ruby"] = "魯比夫人"
L["Magnus Frostwake"] = "瑪格努斯·霜鳴"
L["Mahu"] = "曼胡"
L["Mallen Swain"] = "瑪林·斯萬"
L["Malygen"] = "瑪里甘"
L["Mari Stonehand"] = "瑪利·石手"
L["Maria Lumere"] = "瑪麗亞·盧米爾"
L["Martine Tramblay"] = "馬丁·塔布雷"
L["Masat T'andr"] = "馬薩特·坦德"
L["Master Chef Mouldier"] = "大廚師瑪戴爾"
L["Master Craftsman Omarion"] = "工匠大師歐瑪利安"
L["Mathar G'ochar"] = "瑪沙爾·葛歐洽"
L["Mavralyn"] = "馬弗拉林"
L["Mazk Snipeshot"] = "瑪茲克·斯奈普沙特"
L["Meilosh"] = "梅羅什"
L["Melaris"] = "米拉瑞斯"
L["Micha Yance"] = "米莎·楊斯"
L["Millie Gregorian"] = "米利爾·格里高利"
L["Mishta"] = "米希塔"
L["Mixie Farshot"] = "扎米·費雪"
L["Montarr"] = "莫塔爾"
L["Muheru the Weaver"] = "『編織者』姆賀魯"
L["Muuran"] = "莫爾蘭"
L["Mycah"] = "麥卡"
L["Mythrin'dir"] = "邁斯林迪爾"
L["Naal Mistrunner"] = "納爾·迷霧行者"
L["Naka"] = "那卡"
L["Nakodu"] = "納克杜"
L["Namdo Bizzfizzle"] = "納姆杜"
L["Nandar Branson"] = "南達·布拉森"
L["Narj Deepslice"] = "納爾基·長刀"
L["Narkk"] = "納爾克"
L["Nasmara Moonsong"] = "那斯馬拉·月歌"
L["Nata Dawnstrider"] = "納塔·黎明行者"
L["Neal Allen"] = "尼爾·奧雷"
L["Neii"] = "奈伊"
L["Nergal"] = "奈爾加"
L["Nerrist"] = "耐里斯特"
L["Nessa Shadowsong"] = "奈莎·影歌"
L["Nina Lightbrew"] = "妮娜·萊特布魯"
L["Nioma"] = "尼奧瑪"
L["Nula the Butcher"] = "屠夫奴拉"
L["Nyoma"] = "奈歐瑪"
L["Ogg'marr"] = "奧克瑪爾"
L["Okuno"] = "歐庫諾"
L["Old Man Heming"] = "老人海明威"
L["Ontuvo"] = "昂圖沃"
L["Otho Moji'ko"] = "奧索·莫吉克"
L["Outfitter Eric"] = "埃瑞克"
L["Paulsta'ats"] = "波斯塔茲"
L["Phea"] = "菲亞"
L["Plugger Spazzring"] = "普拉格"
L["Pratt McGrubben"] = "普拉特·馬克格魯比"
L["Provisioner Nasela"] = "糧食供應者奈斯拉"
L["Qia"] = "琦亞"
L["Quartermaster Davian Vaclav"] = "軍需官戴夫恩·瓦克拉夫"
L["Quartermaster Endarin"] = "軍需官伊恩達瑞"
L["Quartermaster Enuril"] = "軍需官伊奴瑞歐"
L["Quartermaster Jaffrey Noreliqe"] = "軍需官傑夫利·諾利克"
L["Quartermaster Miranda Breechlock"] = "軍需官米蘭達·布利洛克"
L["Quartermaster Urgronn"] = "軍需官優爾古隆"
L["Quelis"] = "奎利斯"
L["Ranik"] = "拉尼克"
L["Rann Flamespinner"] = "拉恩·火翼"
L["Rartar"] = "拉爾塔"
L["Rathis Tomber"] = "拉提斯·土柏"
L["Rikqiz"] = "雷克奇茲"
L["Rin'wosho the Trader"] = "商人林沃斯"
L["Rizz Loosebolt"] = "里茲·飛矢"
L["Rohok"] = "洛赫克"
L["Ronald Burch"] = "羅奈爾得·伯奇"
L["Rungor"] = "阮勾爾"
L["Saenorion"] = "塞諾里奧"
L["Sassa Weldwell"] = "莎紗·威德衛爾"
L["Seer Janidi"] = "先知賈尼迪"
L["Sewa Mistrunner"] = "蘇瓦·迷霧行者"
L["Shaani"] = "夏尼"
L["Shadi Mistrunner"] = "沙迪·迷霧行者"
L["Shandrina"] = "珊蒂瑞亞"
L["Shankys"] = "山吉斯"
L["Sheendra Tallgrass"] = "希恩德拉·深草"
L["Shen'dralar Provisioner"] = "辛德拉聖職者"
L["Sheri Zipstitch"] = "舍瑞·希普斯迪"
L["Sid Limbardi"] = "希德·琳巴迪"
L["Skreah"] = "史卡瑞"
L["Smudge Thunderwood"] = "斯穆德·雷木"
L["Soolie Berryfizz"] = "蘇雷·漿泡"
L["Sovik"] = "索維克"
L["Stuart Fleming"] = "斯圖亞特·弗雷明"
L["Sumi"] = "蘇米"
L["Super-Seller 680"] = "超級商人680型"
L["Supply Officer Mills"] = "物資商人米歐斯"
L["Tamar"] = "達瑪爾"
L["Tansy Puddlefizz"] = "坦斯·泥泡"
L["Tarban Hearthgrain"] = "塔班·熟麥"
L["Tari'qa"] = "塔里查"
L["Tatiana"] = "塔蒂安娜"
L["Thaddeus Webb"] = "薩德烏斯·韋伯"
L["Tharynn Bouden"] = "薩瑞恩·博丁"
L["Thomas Yance"] = "湯瑪斯·陽斯"
L["Tilli Thistlefuzz"] = "提爾利·草鬚"
L["Trader Narasu"] = "商人娜拉蘇"
L["Truk Wildbeard"] = "特魯克·蠻鬃"
L["Tunkk"] = "吞克"
L["Ulthaan"] = "尤薩恩"
L["Ulthir"] = "尤希爾"
L["Uriku"] = "烏銳庫"
L["Uthok"] = "尤索克"
L["Vaean"] = "維安"
L["Valdaron"] = "瓦爾達隆"
L["Vargus"] = "瓦古斯"
L["Veenix"] = "維尼克斯"
L["Vendor-Tron 1000"] = "貿易機器人1000型"
L["Vharr"] = "維哈爾"
L["Viggz Shinesparked"] = "維格斯·亮星"
L["Vivianna"] = "薇薇安娜"
L["Vizzklick"] = "維茲格里克"
L["Vodesiin"] = "伏德希恩"
L["Wenna Silkbeard"] = "溫納·銀鬚"
L["Werg Thickblade"] = "維爾格·厚刃"
L["Wik'Tar"] = "維克塔"
L["Wind Trader Lathrai"] = "風之貿易者拉斯蕊"
L["Wolgren Jinglepocket"] = "沃格蘭·響囊"
L["Worb Strongstitch"] = "沃爾布"
L["Wrahk"] = "瓦爾克"
L["Wulan"] = "烏蘭"
L["Wulmort Jinglepocket"] = "烏爾莫特"
L["Wunna Darkmane"] = "溫納·黑鬃"
L["Xandar Goodbeard"] = "山達·細鬚"
L["Xen'to"] = "克森圖"
L["Xerintha Ravenoak"] = "希瑞莎·鴉橡"
L["Xizk Goodstitch"] = "希茲克·古斯提"
L["Xizzer Fizzbolt"] = "希茲爾·菲茲波特"
L["Yatheon"] = "亞斯恩"
L["Yonada"] = "猶納達"
L["Ythyar"] = "伊斯亞爾"
L["Yuka Screwspigot"] = "尤卡·斯庫比格特"
L["Yurial Soulwater"] = "優立歐·靈魂之水"
L["Zan Shivsproket"] = "薩恩·刀鏈"
L["Zannok Hidepiercer"] = "札諾克"
L["Zansoa"] = "詹蘇爾"
L["Zaralda"] = "莎拉達"
L["Zarena Cromwind"] = "薩瑞娜·克羅姆溫德"
L["Zargh"] = "札爾夫"
L["Zixil"] = "吉克希爾"
L["Zorbin Fandazzle"] = "索爾賓·范達瑟"
L["Zurai"] = "祖瑞伊"
RecipeRadar/locales/ruRU.lua New file
0,0 → 1,543
local L = LibStub("AceLocale-3.0"):NewLocale("RecipeRadar", "ruRU", false)
if not L then return end
 
L["Recipe Radar"] = "Радар Рецептов"
L["Left-click to open RecipeRadar."] = "Левый клик - открыть RecipeRadar."
L["Right-click and drag to move this button."] = "Правый клик и тащить - переместить"
 
L["Recipe Radar Bindings"] = "Настройки клавиш Радара Рецептов"
L["Toggle Recipe Radar"] = "Включить Радар Рецептов"
L["Auto-map Contributive Vendors"] = "Автоматически показывать продавцов с доступными рецептами на мини-карте"
L["Auto-select Current Region"] = "Автоматически выбирать текущую территорию"
L["Check Availability for Alts"] = "Проверять доступность для альтов"
L["Minimap Button Position"] = "Позиция кнопки у мини-карты"
L["Show Minimap Button"] = "Показывать кнопку у мини-карты"
L["Options"] = "Настройки"
L["%d learnable"] = "%d можно изучить"
L["%d recipes"] = "Рецептов: %d"
L["1 recipe"] = "1 рецепт"
L["Uncached Recipe"] = "Неизвестный рецепт"
L["You may mouse over the"] = "Вы можете провести мышью через иконку"
L["icon to lookup this recipe."] = "чтобы узнать этот рецепт."
L["Warning: if your server has"] = "Внимание: если ваш сервер"
L["not yet seen this item, you"] = "еще не имеет этого предмета, вы"
L["will be disconnected!"] = "будете отсоеденены!"
L["No recipes for sale in this region."] = "В этой территории нет рецептов"
L["Shift-click a vendor to add or remove her location on the world map."] = "Shift-клик чтобы добавить или убрать местонахождение продавца на карте мира"
L["Locate Vendor on Map"] = "Показывать продавцов на карте"
L["Neutral"] = "Нейтрально"
L["Factions"] = "Фракции"
L["Alchemy"] = "Алхимия"
L["Blacksmithing"] = "Кузнечное дело"
L["Cooking"] = "Кулинария"
L["Enchanting"] = "Наложение чар"
L["Engineering"] = "Инженерное дело"
L["First Aid"] = "Первая помощь"
L["Fishing"] = "Рыбная ловля"
L["Inscription"] = "Начертание"
L["Jewelcrafting"] = "Ювелирное дело"
L["Leatherworking"] = "Кожевничество"
L["Tailoring"] = "Портняжное дело"
L["Professions"] = "Профессии"
L["Already Known (Alts)"] = "Уже известно (альт)"
L["Already Known (Player)"] = "Уже известно (игрок)"
L["Available Now (Alts)"] = "Доступно (альт)"
L["Available Now (Player)"] = "Доступно (игрок)"
L["Future Prospect (Alts)"] = "Будет доступно (альт)"
L["Future Prospect (Player)"] = "Будет доступно (игрок)"
L["Inapplicable"] = "Неподходящий"
L["Availability"] = "Доступно"
L["Already Known By:"] = "Уже известно:"
L["Future Prospect For:"] = "Будет доступно для:"
L["Available For:"] = "Доступно для:"
L["%d of %d"] = "%d из %d"
L["Intermittent"] = "Перемещяющийся"
L["Quest"] = "C заданий"
L["Roving"] = "Бродячий"
L["Seasonal"] = "Сезонный"
L["%s Vendor"] = "%s продавец"
 
L["Rogue"] = "Разбойник"
L["Special"] = "Особенное"
L["%s Only"] = "Только %s"
L["Collapse"] = "Свернуть"
L["Collapse All"] = "Свернуть все"
L["Expand"] = "Раскрыть"
L["Expand All"] = "Раскрыть все"
L["Map Vendor"] = "Показать продовца на карте"
L["Unmap Vendor"] = "Убрать продовца с карты"
 
L["Gnomish Engineer"] = "Гномский механик"
L["Armorsmith"] = "Бронник"
L["Dragonscale Leatherworking"] = "Кожевничество: чешуя дракона"
L["Elemental Leatherworking"] = "Кожевничество: сила стихий"
L["Goblin Engineer"] = "Гоблинский механик"
L["Master Axesmith"] = "Мастер школы топора"
L["Master Hammersmith"] = "Мастер школы молота"
L["Master Swordsmith"] = "Мастер ковки клинков"
L["Mooncloth Tailoring"] = "Шитье из луноткани"
L["Shadoweave Tailoring"] = "Шитье из тенеткани"
L["Spellfire Tailoring"] = "Шитье из чароткани"
L["Tribal Leatherworking"] = "Кожевничество: традиции предков"
L["Weaponsmith"] = "Оружейник"
 
L["Kalimdor"] = "Калимдор"
L["Eastern Kingdoms"] = "Восточные королевства"
L["Instances"] = "Подземелья"
L["Northrend"] = "Нордскол"
L["Outland"] = "Запределье"
 
L["\"Chef\" Overheat"] = "\"Шеф\" Перегрев"
L["\"Cookie\" McWeaksauce"] = "\"Поваренок\" Максоус"
L["Aaron Hollman"] = "Аарон Холлман"
L["Abigail Shiel"] = "Эбигейл Шиль"
L["Aendel Windspear"] = "Эндель Копье Ветра"
L["Agatian Fallanos"] = "Агатиан Фалланос"
L["Aged Dalaran Wizard"] = "Даларанский старый волшебник"
L["Ainderu Summerleaf"] = "Айндеру Летний Лист"
L["Alchemist Finklestein"] = "Алхимик Финкльштейн"
L["Alchemist Gribble"] = "Алхимик Гриббл"
L["Alchemist Pestlezugg"] = "Алхимик Пестычинс"
L["Aldraan"] = "Алдраан"
L["Alexandra Bolero"] = "Александра Болеро"
L["Algernon"] = "Алжернон"
L["Almaador"] = "Альмаадор"
L["Altaa"] = "Алтаа"
L["Alurmi"] = "Алурми"
L["Alys Vol'tyr"] = "Алис Вол'тир"
L["Amy Davenport"] = "Ами Девенпорт"
L["Andormu"] = "Андорму"
L["Andrew Hilbert"] = "Эндрю Гилберт"
L["Andrion Darkspinner"] = "Андрион Темнопряд"
L["Androd Fadran"] = "Андрод Фадран"
L["Anuur"] = "Ануур"
L["Apothecary Antonivich"] = "Аптекарь Антонивич"
L["Apprentice Darius"] = "Ученик Дариус"
L["Apprentice of Estulan"] = "Ученик Эстулана"
L["Archmage Alvareaux"] = "Верховный маг Алварекс"
L["Aresella"] = "Ареселла"
L["Argent Quartermaster Hasana"] = "Интендант Хасна из ордена Серебряного Рассвета"
L["Argent Quartermaster Lightspark"] = "Интендант Искромет"
L["Arille Azuregaze"] = "Арилль Лазурный Взгляд"
L["Aristaleon Sunweaver"] = "Аристалеон Солнечный Ткач"
L["Arras"] = "Аррас"
L["Arred"] = "Арред"
L["Arrond"] = "Арронд"
L["Asarnan"] = "Азарнан"
L["Ayla Shadowstorm"] = "[Ayla Shadowstorm]"
L["Bale"] = "Тюкн"
L["Banalash"] = "Баналаш"
L["Bario Matalli"] = "Барио Маталли"
L["Blackwing"] = "Крыло тьмы"
L["Blimo Gadgetspring"] = "Блимо Прибамбас"
L["Blixrez Goodstitch"] = "Бликрез Ладноскрой"
L["Blizrik Buckshot"] = "Близрик Шрапнельс"
L["Bliztik"] = "Близтик"
L["Bombus Finespindle"] = "Бомбус Остроигл"
L["Borto"] = "Борто"
L["Borya"] = "Боря"
L["Bountiful Barrel"] = "Пиршественный бочонок"
L["Bradley Towns"] = "Бредли Таунс"
L["Braeg Stoutbeard"] = "Брейг Пивобород"
L["Brienna Starglow"] = "Бриенна Мерцание Звезд"
L["Bro'kin"] = "Бро'кин"
L["Bronk"] = "Бронк"
L["Brundall Chiselgut"] = "Брундалл Узкоклин"
L["Bryan Landers"] = "Брайан Лэндерс"
L["Buckslappy"] = "Шлепась"
L["Burbik Gearspanner"] = "Бурбик Гайковерт"
L["Burko"] = "Бюрко"
L["Captain Samir"] = "Капитан Самир"
L["Captured Gnome"] = "Пленный гном"
L["Casandra Downs"] = "Касандра Даунс"
L["Catherine Leland"] = "Катрин Лиланд"
L["Chapman"] = "Чепман"
L["Christoph Jeffcoat"] = "Кристоф Френч"
L["Cielstrasza"] = "Небостраза"
L["Clyde Ranthal"] = "Клайд Рантал"
L["Constance Brisboise"] = "Констанция Брибуа"
L["Cookie One-Eye"] = "Поваренок Одноглаз"
L["Coreiel"] = "Кориэль"
L["Corporal Bluth"] = "Капрал Блуф"
L["Cowardly Crosby"] = "Трусишка Кросби"
L["Crazk Sparks"] = "Кразк Искрец"
L["Cro Threadstrong"] = "Кро Ладнокрой"
L["Daga Ramba"] = "Дага Рамба"
L["Daggle Ironshaper"] = "Даггл Литейщик"
L["Dalni Tallgrass"] = "Дални Высокая Трава"
L["Dalria"] = "Дальрия"
L["Damek Bloombeard"] = "[Damek Bloombeard]"
L["Daniel Bartlett"] = "Даниэль Бартлетт"
L["Danielle Zipstitch"] = "Даниэлла Рваношов"
L["Darian Singh"] = "Дариан Сингх"
L["Darnall"] = "Дарналл"
L["Dealer Malij"] = "Делец Малиж"
L["Defias Profiteer"] = "Спекулянт из Братства Справедливости"
L["Derak Nightfall"] = "Дерек Приход Тьмы"
L["Derek Odds"] = "Дерек Оддс"
L["Desaan"] = "Десаан"
L["Deynna"] = "Дейна"
L["Dirge Quikcleave"] = "Могиль Быстроруб"
L["Doba"] = "Доба"
L["Doris Volanthius"] = "Дорисса Волантий"
L["Drac Roughcut"] = "Драк Грубиян"
L["Draelan"] = "Дрейлан"
L["Drake Lindgren"] = "Дрейк Линдгрен"
L["Drovnar Strongbrew"] = "Дровнар Густовар"
L["Duchess Mynx"] = "Герцогиня Минкс"
L["Edna Mullby"] = "Эдна Милби"
L["Eebee Jinglepocket"] = "Лореала Деньгозвон"
L["Egomis"] = "Эгомис"
L["Eiin"] = "Эйин"
L["Eldara Dawnrunner"] = "Эльдара Вестница Зари"
L["Elizabeth Barker Winslow"] = "Элизабет Баркер Уинслоу"
L["Elynna"] = "Элинна"
L["Emrul Riknussun"] = "Эмруль Рикнуссен"
L["Enchantress Andiala"] = "Чародейка Андиала"
L["Eriden"] = "Эриден"
L["Erika Tate"] = "Эрика Тейт"
L["Erilia"] = "Эрилия"
L["Evie Whirlbrew"] = "Иви Бурноварка"
L["Fariel Starsong"] = "Фариэль Песнь Звезд"
L["Fazu"] = "Фазу"
L["Fedryen Swiftspear"] = "Федриен Быстрое Копье"
L["Feera"] = "Феера"
L["Felannia"] = "Феланния"
L["Felicia Doan"] = "Фелиция Доан"
L["Felika"] = "Фелика"
L["Fizzix Blastbolt"] = "Физзикс Рвизасов"
L["Fradd Swiftgear"] = "Фрадд Бынструмент"
L["Frozo the Renowned"] = "Ледо Прославленный"
L["Fyldan"] = "Филдан"
L["Gagsprocket"] = "Заглушестер"
L["Galley Chief Alunwea"] = "Галерный кок Алунвея"
L["Galley Chief Gathers"] = "Галерный кок Сборень"
L["Galley Chief Grace"] = "Галерный повар Грейс"
L["Galley Chief Halumvorea"] = "Галерный кок Галумвория"
L["Galley Chief Mariss"] = "Галерный кок Марисс"
L["Galley Chief Steelbelly"] = "Галерный кок Сталебрюх"
L["Gambarinka"] = "Гамбаринко"
L["Gara Skullcrush"] = "Гара Череполом"
L["Gearcutter Cogspinner"] = "Зуборез Шестеренок"
L["Geen"] = "Джиун"
L["Gelanthis"] = "Гелантис"
L["George Candarte"] = "Джорлж Кандарте"
L["Gharash"] = "Гхарраш"
L["Ghok'kah"] = "Гхок'ка"
L["Gidge Spellweaver"] = "Гиджа Чароплетка"
L["Gigget Zipcoil"] = "Гиджет Свистопулька"
L["Gikkix"] = "Гиккикс"
L["Gina MacGregor"] = "Джина Макгрегор"
L["Gloria Femmel"] = "Глория Даммель"
L["Glyx Brewright"] = "Гликс Пивоправ"
L["Gnaz Blunderflame"] = "Гназ Огнепых"
L["Goram"] = "Горам"
L["Gretta Ganter"] = "Гретта Гантер"
L["Grimtak"] = "Гримтак"
L["Grub"] = "Грязнуля"
L["Haalrun"] = "Хаалрун"
L["Haferet"] = "Хаферет"
L["Hagrus"] = "Хагрус"
L["Hammon Karwn"] = "Хаммон Карун"
L["Harggan"] = "Харгган"
L["Harklan Moongrove"] = "Харклан Лунная Роща"
L["Harlon Thornguard"] = "Харлон Терновый Страж"
L["Harlown Darkweave"] = "Харлон Темный Узор"
L["Harn Longcast"] = "Харн Далекий Заброс"
L["Haughty Modiste"] = "Отти Кутюри"
L["Heldan Galesong"] = "Хельдан Рокот Прибоя"
L["Helenia Olden"] = "Еления Ольден"
L["High Admiral \"Shelly\" Jorrik"] = "Верховный адмирал \"Ракушечник\" Йоррик"
L["Himmik"] = "Химмик"
L["Hotoppik Copperpinch"] = "Ферера Меднокноп"
L["Hula'mahi"] = "Хула'махи"
L["Ikaneba Summerset"] = "Иканеба Саммерсет"
L["Ildine Sorrowspear"] = "Ильдина Печальная Осока"
L["Indormi"] = "Индорми"
L["Inessera"] = "Инессера"
L["Innkeeper Biribi"] = "Трактирщица Бириби"
L["Innkeeper Fizzgrimble"] = "Трактирщик Ворчунелло"
L["Innkeeper Grilka"] = "Трактирщица Грилка"
L["Isabel Jones"] = "Изабель Джонс"
L["Jabbey"] = "Джабби"
L["Jandia"] = "Джандия"
L["Janet Hommers"] = "Джанет Хоммерс"
L["Jangdor Swiftstrider"] = "Джангор Быстрый Странник"
L["Jannos Ironwill"] = "Джаннос Неуступ"
L["Jaquilina Dramet"] = "Жаклина Драмет"
L["Jase Farlane"] = "Джез Фарлен"
L["Jazzrik"] = "Джаззрик"
L["Jeeda"] = "Джиида"
L["Jennabink Powerseam"] = "Дженнабик Мелкостежка"
L["Jessara Cordell"] = "Джессара Корделл"
L["Jezebel Bican"] = "Жезебель Бикан"
L["Jillian Tanner"] = "Джиллиан Дубильщица"
L["Jim Saltit"] = "Джим Соленит"
L["Jinky Twizzlefixxit"] = "Джинки Дзыньбламбум"
L["Johan Barnes"] = "Йохан Барнс"
L["John Rigsdale"] = "Джон Ригсдейл"
L["Joseph Moore"] = "Джозеф Мур"
L["Jubie Gadgetspring"] = "Джуби Прибамбас"
L["Jungle Serpent"] = "Тропическая гадюка"
L["Jun'ha"] = "Джун'ха"
L["Juno Dufrain"] = "Джуно Дюфрейн"
L["Jutak"] = "Ютак"
L["Kaita Deepforge"] = "Кайта Подземная Кузня"
L["Kalldan Felmoon"] = "Калидан Лунный Серп"
L["Kania"] = "Кания"
L["Karaaz"] = "Карааз"
L["Karizi Porkpatty"] = "Каризи Беляшизи"
L["Kaye Toogie"] = "Кей Туги"
L["Keena"] = "Кеена"
L["Kelsey Yance"] = "Келси Янс"
L["Kendor Kabonka"] = "Кендор Кабонка"
L["Khara Deepwater"] = "Хара Рыбовод"
L["Khole Jinglepocket"] = "Деор Деньгозвон"
L["Kiknikle"] = "Пниподзад"
L["Killian Sanatha"] = "Киллиан Саната"
L["Kilxx"] = "Кликс"
L["Kim Horn"] = "Ким Хорн"
L["Kireena"] = "Киреена"
L["Kirembri Silvermane"] = "Кирембри Серебряная Грива"
L["Kithas"] = "Китхас"
L["Knaz Blunderflame"] = "Наз Огнепых"
L["Knight Dameron"] = "Рыцарь Дамерон"
L["Koren"] = "Корен"
L["Kor'geld"] = "Кор'гельд"
L["Krek Cragcrush"] = "Крек Скалолом"
L["Kriggon Talsone"] = "Криггон Талсон"
L["Krinkle Goodsteel"] = "Кринкель Сталлер"
L["KTC Train-a-Tron Deluxe"] = "Трен-о-матик Делюкс"
L["Kul Inkspiller"] = "Кул Клякса"
L["Kuldar Steeltooth"] = "Кулдар Стальной Зуб"
L["Kulwia"] = "Кульвия"
L["Kzixx"] = "Кзикс"
L["Lady Palanseer"] = "Леди Палансир"
L["Laha Farplain"] = "Лаха Дальний Луг"
L["Laida Gembold"] = "Лаида Бриллибольд"
L["Laird"] = "Лайрд"
L["Lalla Brightweave"] = "Лала Светопряд"
L["Landraelanis"] = "Ландреленис"
L["Larana Drome"] = "Ларана Дром"
L["Lardan"] = "Лардан"
L["Larissia"] = "Лариссия"
L["Layna Karner"] = "Лейна Карнер"
L["Lebowski"] = "Лебовски"
L["Leeli Longhaggle"] = "Леели Нудноторг"
L["Leo Sarn"] = "Лео Сарн"
L["Leonard Porter"] = "Леонард Портер"
L["Librarian Erickson"] = "Библиотекарь Эриксон"
L["Lieutenant General Andorov"] = "Генерал-лейтенант Андоров"
L["Lillehoff"] = "Лиллехофф"
L["Lilly"] = "Лилли"
L["Lindea Rabonne"] = "Линди Рабонн"
L["Linna Bruder"] = "Линна Брудер"
L["Lizbeth Cromwell"] = "Лизбет Кромвель"
L["Lizna Goldweaver"] = "Лизна Златопрягс"
L["Logannas"] = "Логаннас"
L["Logistics Officer Brighton"] = "Офицер-логистик Брайтон"
L["Logistics Officer Silverstone"] = "Офицер-логистик Сильверстоун"
L["Logistics Officer Ulrike"] = "Офицер-логистик Ульрика"
L["Lokhtos Darkbargainer"] = "Локтос Зловещий Торговец"
L["Loolruna"] = "Лооруна"
L["Lorelae Wintersong"] = "Лорелея Песнь Зимы"
L["Lyna"] = "Лина"
L["Madame Ruby"] = "Мадам Рубина"
L["Magnus Frostwake"] = "Магнус Хладоступ"
L["Mahu"] = "Маху"
L["Mak"] = "Мак"
L["Mallen Swain"] = "Маллен Свейн"
L["Malygen"] = "Малиген"
L["Mari Stonehand"] = "Мари Крепкорук"
L["Maria Lumere"] = "Мария Лумере"
L["Marith Lazuria"] = "Марит Лазурия"
L["Martine Tramblay"] = "Мартин Трамбле"
L["Masat T'andr"] = "Масат Т'андр"
L["Master Chef Mouldier"] = "Главный шеф-повар Плеснер"
L["Master Craftsman Omarion"] = "Мастер-ремесленник Омарион"
L["Mathar G'ochar"] = "Матар Гочар"
L["Mavralyn"] = "Мавралинн"
L["Mazk Snipeshot"] = "Мазк Карабинс"
L["Meilosh"] = "Мелиош"
L["Melaris"] = "Меларис"
L["Mera Mistrunner"] = "Мера Вестница Туманов"
L["Micha Yance"] = "Мика Янс"
L["Millie Gregorian"] = "Милли Грегориан"
L["Mirla Silverblaze"] = "Мирла Серебряная Вспышка"
L["Misensi"] = "Мизенси"
L["Mishta"] = "Мишта"
L["Misty Merriweather"] = "Мисти Мерривезер"
L["Mixie Farshot"] = "Микси Дальнострел"
L["Modoru"] = "Модору"
L["Montarr"] = "Монтарр"
L["Morgan Day"] = "Морган Дей"
L["Moro Sungrain"] = "Моро Солнечный Колос"
L["Muheru the Weaver"] = "Мугеру Ткач"
L["Muuran"] = "Мууран"
L["Mycah"] = "Микаа"
L["Mythrin'dir"] = "Митрин'дир"
L["Naal Mistrunner"] = "Наал Вестник Туманов"
L["Nakodu"] = "Накоду"
L["Namdo Bizzfizzle"] = "Намдо Вклвыкл"
L["Nandar Branson"] = "Нандар Брансон"
L["Nardstrum Copperpinch"] = "Арман Меднокноп"
L["Narj Deepslice"] = "Нардж Ломтерез"
L["Narkk"] = "Наркк"
L["Nasmara Moonsong"] = "Назмара Песнь Луны"
L["Nata Dawnstrider"] = "Ната Рассветная Странница"
L["Neal Allen"] = "Нил Аллен"
L["Neii"] = "Нейи"
L["Nemiha"] = "Немина"
L["Nergal"] = "Нергал"
L["Nerrist"] = "Неррист"
L["Nessa Shadowsong"] = "Несса Песня Теней"
L["Nina Lightbrew"] = "Ниней Легковар"
L["Nioma"] = "Ниома"
L["Nula the Butcher"] = "Нула Мясник"
L["Nuri"] = "Нури"
L["Nyoma"] = "Ньома"
L["Ogg'marr"] = "Огг'марр"
L["Okuno"] = "Окуно"
L["Ontuvo"] = "Онтуво"
L["Otho Moji'ko"] = "Отхо Можи'ко"
L["Outfitter Eric"] = "Галантерейщик Эрик"
L["Paku Cloudchaser"] = "Паку Заоблачный Охотник"
L["Palehoof's Big Bag of Parts"] = "Большой мешок Бледного Копыта с детальками"
L["Paulsta'ats"] = "Пауласта'атс"
L["Penney Copperpinch"] = "Ликоста Меднокноп"
L["Phea"] = "Фэа"
L["Plugger Spazzring"] = "Штоппор Наливалс"
L["Poranna Snowbraid"] = "Поранна Снежная Коса"
L["Pratt McGrubben"] = "Пратт Макгруббен"
L["Prospector Khazgorm"] = "Геолог Хазгорм"
L["Provisioner Lorkran"] = "Поставщик Лоркран"
L["Provisioner Nasela"] = "Поставщик Несела"
L["Punra"] = "Пунра"
L["Qia"] = "Кийя"
L["Quartermaster Davian Vaclav"] = "Интендант Дэвиан Ваклав"
L["Quartermaster Endarin"] = "Интендант Эндарин"
L["Quartermaster Enuril"] = "Интендант Инурил"
L["Quartermaster Jaffrey Noreliqe"] = "Интендант Джеффри Норелик"
L["Quartermaster Miranda Breechlock"] = "Интендант Миранда Бричлок"
L["Quartermaster Urgronn"] = "Интендант Ургронн"
L["Quelis"] = "Келис"
L["Randah Songhorn"] = "Ранда Поющий Рог"
L["Ranik"] = "Раник"
L["Ranisa Whitebough"] = "Раниса Белая Ветвь"
L["Rann Flamespinner"] = "Ранн Пламепряд"
L["Rartar"] = "Рартар"
L["Rathis Tomber"] = "Ратис Могильщик"
L["Riha"] = "Риа"
L["Rikqiz"] = "Риккиз"
L["Rin'wosho the Trader"] = "Рин'вошо Торговец"
L["Rizz Loosebolt"] = "Ризз Болтень"
L["Rohok"] = "Рохок"
L["Ronald Burch"] = "Рональд Берч"
L["Rose Standish"] = "Роза Стендиш"
L["Rungor"] = "Рунгор"
L["Ruppo Zipcoil"] = "Руппо Свистопулькин"
L["Saenorion"] = "Санарион"
L["Sairuk"] = "Сайрук"
L["Sal Ferraga"] = "Сал Феррага"
L["Samuel Van Brunt"] = "Самуэль ван Брюнт"
L["Sara Lanner"] = "Сара Лэннер"
L["Sarah Lightbrew"] = "Сара Легковар"
L["Sassa Weldwell"] = "Сасса Крутоварка"
L["Sebastian Crane"] = "Себастьян Крейн"
L["Seer Janidi"] = "Ясновидящая Джаниди"
L["Seersa Copperpinch"] = "Лигерфа Меднокноп"
L["Senthii"] = "Сенти"
L["Sewa Mistrunner"] = "Сива Вестница Туманов"
L["Shaani"] = "Шаани"
L["Shadi Mistrunner"] = "Шади Вестница Туманов"
L["Shankys"] = "Шанкис"
L["Shay Pressler"] = "Шей Пресслер"
L["Shazdar"] = "Шаздар"
L["Sheendra Tallgrass"] = "Шиендра Высокая Трава"
L["Shen'dralar Provisioner"] = "Шен'драларский поставщик"
L["Sheri Zipstitch"] = "Шери Рваношов"
L["Sid Limbardi"] = "Сид Лимбарди"
L["Skreah"] = "Скреах"
L["Smudge Thunderwood"] = "Клякс Громодрев"
L["Soolie Berryfizz"] = "Сули Гонобобельзз"
L["Sovik"] = "Совик"
L["Steeg Haskell"] = "Стиг Хаскелл"
L["Stone Guard Mukar"] = "Каменный страж Мукар"
L["Stuart Fleming"] = "Стюарт Флеминг"
L["Suja"] = "Суджа"
L["Sumi"] = "Суми"
L["Super-Seller 680"] = "Робо-торговец 680"
L["Supply Officer Mills"] = "Снабженец Миллс"
L["Tamar"] = "Тамар"
L["Tanaika"] = "Танайка"
L["Tanak"] = "Танак"
L["Tansy Puddlefizz"] = "Танси Грязебульк"
L["Tarban Hearthgrain"] = "Тарбан Домашний Очаг"
L["Tarien Silverdew"] = "Тариэн Серебряная Роса"
L["Tari'qa"] = "Тарик'ка"
L["Taur Stonehoof"] = "Тавр Каменное Копыто"
L["Terrance Denman"] = "Терранс Денмен"
L["Thaddeus Webb"] = "Таддеус Уэбб"
L["Tharynn Bouden"] = "Таринн Боуден"
L["Thomas Yance"] = "Томас Янс"
L["Threm Blackscalp"] = "Трем Черночереп"
L["Thurgrum Deepforge"] = "Тургрум Подземная Кузня"
L["Tiffany Cartier"] = "Тиффани Картье"
L["Tilli Thistlefuzz"] = "Тилли Чертополуш"
L["Timothy Jones"] = "Тимоти Джонс"
L["Trader Narasu"] = "Торговец Нарасу"
L["Truk Wildbeard"] = "Трук Косматая Борода"
L["Tunkk"] = "Тункк"
L["Ulthaan"] = "Ультаан"
L["Ulthir"] = "Ультир"
L["Una Kobuna"] = "Уна Кобуна"
L["Uriku"] = "Урику"
L["Uthok"] = "Утхок"
L["Vaean"] = "Ваеан"
L["Valdaron"] = "Вальдарон"
L["Vanessa Sellers"] = "Ванесса Селлерс"
L["Vargus"] = "Варгус"
L["Veenix"] = "Виеникс"
L["Velia Moonbow"] = "Велия Лунная Радуга"
L["Vendor-Tron 1000"] = "Торготрон 1000"
L["Veteran Crusader Aliocha Segard"] = "Рыцарь-ветеран Алеча Сегард"
L["Vharr"] = "Вхарр"
L["Viggz Shinesparked"] = "Виггз Синеискр"
L["Vivianna"] = "Вивианна"
L["Vix Chromeblaster"] = "Vix Chromeblaster"
L["Vizna Bangwrench"] = "Визна Крутизнайка"
L["Vizzklick"] = "Визглик"
L["Vodesiin"] = "Водесиин"
L["Wenna Silkbeard"] = "Венна Шелкобород"
L["Werg Thickblade"] = "Верг Крепкий Клинок"
L["Wik'Tar"] = "Вик'Тар"
L["Wilmina Holbeck"] = "Вильмина Холбек"
L["Wind Trader Lathrai"] = "Латрай Торговец Ветром"
L["Wolgren Jinglepocket"] = "Черут Деньгозвон"
L["Worb Strongstitch"] = "Ворб Крепкий Шов"
L["Wrahk"] = "Ракх"
L["Wulan"] = "Вулан"
L["Wulmort Jinglepocket"] = "Карден Деньгозвон"
L["Wunna Darkmane"] = "Вунна Темная Грива"
L["Xandar Goodbeard"] = "Ксандар Добробород"
L["Xen'to"] = "Ксен'то"
L["Xerintha Ravenoak"] = "Зеринта Воронья Ольха"
L["Xizk Goodstitch"] = "Зиск Ладноскрой"
L["Xizzer Fizzbolt"] = "Ксиззер Шумоболт"
L["Yatheon"] = "Ятеон"
L["Yonada"] = "Йонада"
L["Ythyar"] = "Айтар"
L["Yuka Screwspigot"] = "Юка Крутипроб"
L["Yurial Soulwater"] = "Юриал Душа Воды"
L["Zan Shivsproket"] = "Зан Кругореззик"
L["Zannok Hidepiercer"] = "Заннок Проткни-Шкуру"
L["Zansoa"] = "Зансоа"
L["Zaralda"] = "Заральда"
L["Zarena Cromwind"] = "Зарена Кромвинд"
L["Zargh"] = "Заргх"
L["Zido Helmbreaker"] = "Зидо Шлемоплав"
L["Zixil"] = "Зиксиль"
L["Zoey Wizzlespark"] = "Зои Звездовлоб"
L["Zorbin Fandazzle"] = "Зорбин Дребезгун"
L["Zurai"] = "Зурай"
L["Zurii"] = "Зурии"
RecipeRadar/locales/esES.lua New file
0,0 → 1,325
local L = LibStub("AceLocale-3.0"):NewLocale("RecipeRadar", "esES", false)
if not L then return end
 
L["Toggle Recipe Radar"] = "Barra de Recipe Radar"
L["Auto-map Contributive Vendors"] = "Recetas Disponibles de la Exhibición"
L["Auto-select Current Region"] = "Auto-seleccionar la región actual"
L["Check Availability for Alts"] = "Comprobar la disponibilidad en Alts"
L["Minimap Button Position"] = "Posición del Icono"
L["Show Minimap Button"] = "Mostrar botón en el Minimapa"
L["Options"] = "Opciones"
L["%d learnable"] = "%d disponible"
L["%d recipes"] = "%d recetas"
L["1 recipe"] = "1 receta"
L["Uncached Recipe"] = "Receta no descargada"
L["You may mouse over the"] = "Puede colocar el ratón sobre la icono"
L["icon to lookup this recipe."] = "para buscar la receta en el servidor."
L["Warning: if your server has"] = "Advertencia: ¡si tu servidor"
L["not yet seen this item, you"] = "todavía no dispone de este"
L["will be disconnected!"] = "artículo, te desconectarán!"
L["No recipes for sale in this region."] = "No hay recetas para la venta en esta región."
L["Shift-click a vendor to add or remove her location on the world map."] = "Haz Shift+Click en un vendedor para agregar o quitar su localización en el mapa del mundo."
L["Locate Vendor on Map"] = "Localizar a Vendedor en Mapa"
L["Factions"] = "Bandos"
L["Alchemy"] = "Alquimia"
L["Blacksmithing"] = "Herrería"
L["Cooking"] = "Cocina"
L["Enchanting"] = "Encantamiento"
L["Engineering"] = "Ingeniería"
L["First Aid"] = "Primeros auxilios"
L["Fishing"] = "Pesca"
L["Inscription"] = "Inscripción"
L["Jewelcrafting"] = "Joyería"
L["Leatherworking"] = "Peletería"
L["Tailoring"] = "Sastrería"
L["Professions"] = "Profesiones"
L["Already Known (Alts)"] = "Ya conocido (Alts)"
L["Already Known (Player)"] = "Ya conocido (Jugador)"
L["Available Now (Alts)"] = "Disponible (Alts)"
L["Available Now (Player)"] = "Disponible (Jugador)"
L["Future Prospect (Alts)"] = "Perspectiva Futura (Alts)"
L["Future Prospect (Player)"] = "Perspectiva Futura (Jugador)"
L["Inapplicable"] = "Inaplicable"
L["Availability"] = "Disponibilidad"
L["Already Known By:"] = "Ya conocido por:"
L["Future Prospect For:"] = "Perspectiva futura para:"
L["Available For:"] = "Disponible para:"
L["%d of %d"] = "%d de %d"
L["Intermittent"] = "Intermitente"
L["Quest"] = "Misión"
L["Roving"] = "Ambulante"
L["Seasonal"] = "Estacional"
L["%s Vendor"] = "%s Vendedor"
L["Argent Crusade"] = "Cruzada Argenta"
L["Ashtongue Deathsworn"] = "Juramorte Lengua de ceniza"
L["Cenarion Circle"] = "El Círculo Cenarion"
L["Cenarion Expedition"] = "Expedición Cenarion"
L["Explorers' League"] = "Liga de Expedicionarios"
L["Frenzyheart Tribe"] = "Tribu Corazón Frenético"
L["Honor Hold"] = "Bastión del Honor"
L["Keepers of Time"] = "Guardianes del Tiempo"
L["Knights of the Ebon Blade"] = "Caballeros de la Espada de Ébano"
L["Shattered Sun Offensive"] = "Ofensiva Sol Devastado"
L["The Consortium"] = "El consorcio"
L["The Frostborn"] = "Los Natoescarcha"
L["The Hand of Vengeance"] = "La Mano de la Venganza"
L["The Kalu'ak"] = "Los Kalu'ak"
L["The Mag'har"] = "El Mag’har"
L["The Oracles"] = "Los Oráculos"
L["The Scale of the Sands"] = "Escama de las Arenas"
L["The Scryers"] = "Los Arúspices"
L["The Sha'tar"] = "El Sha’tar"
L["The Silver Covenant"] = "El Pacto de Plata"
L["The Sons of Hodir"] = "Los Hijos de Hodir"
L["The Taunka"] = "Los taunka"
L["The Violet Eye"] = "El Ojo Violeta"
L["The Wyrmrest Accord"] = "El Acuerdo del Reposo del Dragón"
L["Thorium Brotherhood"] = "La Hermandad del Torio"
L["Valiance Expedition"] = "Expedición de Denuedo"
L["Warsong Offensive"] = "Ofensiva Grito de Guerra"
L["Zandalar Tribe"] = "Tribu de Zandalar"
L["Argent Dawn"] = "El Alba Argenta"
L["Rogue"] = "Pícaro"
L["Special"] = "Especial"
L["%s Only"] = "%s Sólamente"
L["Collapse"] = "Contraer"
L["Collapse All"] = "Contraer Todos"
L["Expand"] = "Ampliar"
L["Expand All"] = "Ampliar Todos"
L["Map Vendor"] = "Marcar a Vendedor"
L["Unmap Vendor"] = "Quitar a vendedor"
L["Goblin Engineer"] = "Ingeniero goblin"
L["Gnomish Engineer"] = "Ingeniero gnomo"
L["Eastern Kingdoms"] = "Reinos del Este"
L["Instances"] = "Instancias"
 
L["\"Chef\" Overheat"] = "\"Chef\" Quemadilla"
L["\"Cookie\" McWeaksauce"] = "\"Cocinitas\" MacSalsafloja"
L["Aendel Windspear"] = "Aendel Lanzavento"
L["Aged Dalaran Wizard"] = "Zahorí de Dalaran envejecido"
L["Ainderu Summerleaf"] = "Ainderu Hoja Estival"
L["Alchemist Finklestein"] = "Alquimista Finklestein"
L["Alchemist Gribble"] = "Alquimista Gribble"
L["Alchemist Pestlezugg"] = "Alquimista Morterozugg"
L["Alys Vol'tyr"] = "Alys Vol'tyr"
L["Andrion Darkspinner"] = "Andrion Giroscuro"
L["Apothecary Antonivich"] = "Boticario Antonivich"
L["Apprentice Darius"] = "Aprendiz Darius"
L["Apprentice of Estulan"] = "Aprendiz de Estulan"
L["Archmage Alvareaux"] = "Archimago Alvareaux"
L["Argent Quartermaster Hasana"] = "Intendente Argenta Hasana"
L["Argent Quartermaster Lightspark"] = "Intendente Argenta Chispillo"
L["Arille Azuregaze"] = "Arille Mirada Azur"
L["Aristaleon Sunweaver"] = "Aristaleon Tejesol"
L["Ayla Shadowstorm"] = "[Ayla Shadowstorm]"
L["Bale"] = "Fardo"
L["Banalash"] = "Banalash"
L["Blackwing"] = "[Blackwing]"
L["Blimo Gadgetspring"] = "Blimo Cacharretio"
L["Blixrez Goodstitch"] = "Blixrez Cortefino"
L["Blizrik Buckshot"] = "Blizrik Machobala"
L["Bombus Finespindle"] = "Bombus Bueneje"
L["Bountiful Barrel"] = "Barril generoso"
L["Bradley Towns"] = "Bradley Villas"
L["Braeg Stoutbeard"] = "Braeg Barbarrobusta"
L["Brienna Starglow"] = "Brienna Brillaestrella"
L["Brundall Chiselgut"] = "Brundall Tripacincel"
L["Buckslappy"] = "Bofetín"
L["Burbik Gearspanner"] = "Burbik Trazagranaje"
L["Captain Samir"] = "Capitán Samir"
L["Captured Gnome"] = "Gnomo capturado"
L["Chapman"] = "Buhonero"
L["Christoph Jeffcoat"] = "Christoph Jeffcoat"
L["Constance Brisboise"] = "Constance Brisboise"
L["Cookie One-Eye"] = "Cocinitas el Tuerto"
L["Corporal Bluth"] = "Cabo Bluth"
L["Cowardly Crosby"] = "Blandengue Crosby"
L["Crazk Sparks"] = "Craz Chispaz"
L["Cro Threadstrong"] = "Cro Hilofuerte"
L["Daggle Ironshaper"] = "Daggle Afilador"
L["Dalni Tallgrass"] = "Dalni Pastoalto"
L["Damek Bloombeard"] = "[Damek Bloombeard]"
L["Danielle Zipstitch"] = "Danielle Puntillas"
L["Dealer Malij"] = "Tratante Malij"
L["Defias Profiteer"] = "Especulador Defias"
L["Derak Nightfall"] = "Derak Ocaso"
L["Derek Odds"] = "Derek Cosillas"
L["Dirge Quikcleave"] = "Dirge Hojágil"
L["Doris Volanthius"] = "[Doris Volanthius]"
L["Drac Roughcut"] = "Drac Corteseco"
L["Drake Lindgren"] = "Draco Lindgren"
L["Drovnar Strongbrew"] = "Drovanar Brevaforte"
L["Duchess Mynx"] = "Duquesa Mynx"
L["Eebee Jinglepocket"] = "Eebee Calderilla"
L["Eldara Dawnrunner"] = "Eldara Correalba"
L["Enchantress Andiala"] = "Encantadora Andiala"
L["Evie Whirlbrew"] = "Evie Brebegira"
L["Fariel Starsong"] = "Fariel Cantoestelar"
L["Fedryen Swiftspear"] = "Fedryen Lanza Presta"
L["Fizzix Blastbolt"] = "Fizzix Cargarrayo"
L["Fradd Swiftgear"] = "Fradd Cambioveloz"
L["Frozo the Renowned"] = "Frozo el Renombrado"
L["Gagsprocket"] = "Dentolio"
L["Galley Chief Alunwea"] = "Jefa de galera Alunwea"
L["Galley Chief Gathers"] = "Jefe de galera Gaders"
L["Galley Chief Grace"] = "Jefa de galera Grace"
L["Galley Chief Halumvorea"] = "Jefa de galera Halumvorea"
L["Galley Chief Mariss"] = "Jefa de galera Mariss"
L["Galley Chief Steelbelly"] = "Jefe de galera Tripacero"
L["Gara Skullcrush"] = "Gara Rompecráneos"
L["Gearcutter Cogspinner"] = "Cortallave Volopiñón"
L["Gidge Spellweaver"] = "Gidge Tejehechizos"
L["Gigget Zipcoil"] = "Gigget Retramuelle"
L["Glyx Brewright"] = "Glyx Buenamezcla"
L["Gnaz Blunderflame"] = "Gnaz Flamerrada"
L["Grub"] = "Larva"
L["Harklan Moongrove"] = "Harklan Arboluna"
L["Harlon Thornguard"] = "Harlon Guardaspina"
L["Harlown Darkweave"] = "Harlown Tejeoscuro"
L["Harn Longcast"] = "Harn Tiralejo"
L["Haughty Modiste"] = "Modista Jactancia"
L["Heldan Galesong"] = "Heldan Sonmistral"
L["High Admiral \"Shelly\" Jorrik"] = "Alto almirante Jorrik \"el Concha\""
L["Hotoppik Copperpinch"] = "Hotoppik Cobrellizco"
L["Ikaneba Summerset"] = "Ikaneba Puesta de Sol"
L["Ildine Sorrowspear"] = "Ildine Lanzapena"
L["Innkeeper Biribi"] = "Tabernera Biribi"
L["Innkeeper Fizzgrimble"] = "Tabernero Fizzgrimble"
L["Innkeeper Grilka"] = "Tabernera Grilka"
L["Jangdor Swiftstrider"] = "Jangdor Zanco Veloz"
L["Jannos Ironwill"] = "Jannos Dolocerado"
L["Jennabink Powerseam"] = "Jennabink Costura Potente"
L["Jillian Tanner"] = "Jillian Peletero"
L["Jinky Twizzlefixxit"] = "Jinky Arreglatodo"
L["Jubie Gadgetspring"] = "Jubie Cacharretio"
L["Jungle Serpent"] = "Serpiente de la selva"
L["Kaita Deepforge"] = "Kaita Forjahonda"
L["Kalldan Felmoon"] = "Kalldan Lunavil"
L["Karizi Porkpatty"] = "Karizi Cerdopastel"
L["Kaye Toogie"] = "Kaye Estrecha"
L["Khara Deepwater"] = "Khara Aguahonda"
L["Khole Jinglepocket"] = "Khole Calderilla"
L["Kim Horn"] = "Kim Cuerno"
L["Kirembri Silvermane"] = "Kirembi Melenargenta"
L["Knaz Blunderflame"] = "Knaz Flamerrada"
L["Knight Dameron"] = "Caballero Dameron"
L["Krek Cragcrush"] = "Krek Muelerrisco"
L["Krinkle Goodsteel"] = "Krinkle Buenacero"
L["KTC Train-a-Tron Deluxe"] = "Entrenatrón Deluxe SCK"
L["Kul Inkspiller"] = "Kul Derramatinta"
L["Kuldar Steeltooth"] = "Kuldar Dienteacero"
L["Lady Palanseer"] = "[Lady Palanseer]"
L["Laha Farplain"] = "Laha Llanura Lejana"
L["Laida Gembold"] = "Laida Gemavistosa"
L["Lalla Brightweave"] = "Lalla Hilargénteo"
L["Larana Drome"] = "Larana Dromo"
L["Leeli Longhaggle"] = "Leeli Regateo"
L["Librarian Erickson"] = "Bibliotecaria Erickson"
L["Lieutenant General Andorov"] = "Teniente general Andorov"
L["Linna Bruder"] = "Linna Bruder"
L["Lizbeth Cromwell"] = "Lizbeth Cromwell"
L["Lizna Goldweaver"] = "Lizna Tejeoro"
L["Logistics Officer Brighton"] = "Oficial de logística Brighton"
L["Logistics Officer Silverstone"] = "Oficial de logística Platapiedra"
L["Logistics Officer Ulrike"] = "Oficial de logística Ulrike"
L["Lokhtos Darkbargainer"] = "Lokhtos Tratoscuro"
L["Lorelae Wintersong"] = "Lorelae Cantinvernal"
L["Madame Ruby"] = "Madame Rubí"
L["Magnus Frostwake"] = "Magnus Vespescarcha"
L["Mari Stonehand"] = "Mari Petramano"
L["Master Chef Mouldier"] = "Maestro cocinero Mouldier"
L["Master Craftsman Omarion"] = "Maestro artesano Omarion"
L["Mazk Snipeshot"] = "Mazk Tirocertero"
L["Mera Mistrunner"] = "Mera Correbruma"
L["Mirla Silverblaze"] = "Mirla Platardiente"
L["Misensi"] = "Misensi"
L["Misty Merriweather"] = "Misty Tiempoalegre"
L["Mixie Farshot"] = "Mixie Tirolejano"
L["Modoru"] = "Modoru"
L["Morgan Day"] = "Morgan Day"
L["Moro Sungrain"] = "Moro Granosol"
L["Muheru the Weaver"] = "Muheru el Tejedor"
L["Naal Mistrunner"] = "Naal Correbruma"
L["Namdo Bizzfizzle"] = "Namdo Silvabín"
L["Nardstrum Copperpinch"] = "Nardstrum Cobrellizco"
L["Narj Deepslice"] = "Narj Tajofondo"
L["Nasmara Moonsong"] = "Nasmara Canción de Luna"
L["Nata Dawnstrider"] = "Nata Caminalba"
L["Nessa Shadowsong"] = "Nessa Cantosombrío"
L["Nina Lightbrew"] = "Nina Burbuluz"
L["Nula the Butcher"] = "Nula la Carnicera"
L["Outfitter Eric"] = "Proveedor Eric"
L["Paku Cloudchaser"] = "[Paku Cloudchaser]"
L["Palehoof's Big Bag of Parts"] = "[Palehoof's Big Bag of Parts]"
L["Penney Copperpinch"] = "Penney Cobrellizco"
L["Phea"] = "Phia"
L["Plugger Spazzring"] = "Plugger Aropatoso"
L["Poranna Snowbraid"] = "Poranna Trenzanubes"
L["Provisioner Lorkran"] = "Proveedor Lorkran"
L["Provisioner Nasela"] = "Proveedora Nasela"
L["Quartermaster Davian Vaclav"] = "Intendente Davian Vaclav"
L["Quartermaster Endarin"] = "Intendente Endarin"
L["Quartermaster Enuril"] = "Intendente Enuril"
L["Quartermaster Jaffrey Noreliqe"] = "Intendente Jaffrey Noreliqe"
L["Quartermaster Miranda Breechlock"] = "Intendente Miranda Cerrobrecha"
L["Quartermaster Urgronn"] = "Intendente Urgronn"
L["Randah Songhorn"] = "Randah Cuernocanto"
L["Ranisa Whitebough"] = "Ranisa Rama Blanca"
L["Rann Flamespinner"] = "Rann Flamejes"
L["Rathis Tomber"] = "Rathis Sepulturero"
L["Riha"] = "[Riha]"
L["Rin'wosho the Trader"] = "Rin'wosho el Comerciante"
L["Rizz Loosebolt"] = "Rizz Tornillosuelto"
L["Ruppo Zipcoil"] = "Rupo Retramuelle"
L["Sarah Lightbrew"] = "Sarah Cerveligera"
L["Sassa Weldwell"] = "Sassa Soldabien"
L["Sebastian Crane"] = "Sebastian Grúa"
L["Seer Janidi"] = "Vidente Janidi"
L["Seersa Copperpinch"] = "Seersa Cobrellizco"
L["Sewa Mistrunner"] = "Seua Correbruma"
L["Shadi Mistrunner"] = "Shadi Correbruma"
L["Sheendra Tallgrass"] = "Sheendra Pastoalto"
L["Shen'dralar Provisioner"] = "Proveedor Shen'dralar"
L["Sheri Zipstitch"] = "Sheri Puntillas"
L["Smudge Thunderwood"] = "Borrón Truenedera"
L["Soolie Berryfizz"] = "Soolie Burbubaya"
L["Stone Guard Mukar"] = "Guardia de piedra Mutaha"
L["Super-Seller 680"] = "Supervendedor 680"
L["Supply Officer Mills"] = "Oficial de suministros Mills"
L["Tansy Puddlefizz"] = "Tansy Burbajea"
L["Tarban Hearthgrain"] = "Tarban Granogar"
L["Tarien Silverdew"] = "Tarien Alboradanívea"
L["Taur Stonehoof"] = "Taur Pezuña Pétrea"
L["Threm Blackscalp"] = "Threm Cabellera Negra"
L["Thurgrum Deepforge"] = "Thurgrum Forjahonda"
L["Tiffany Cartier"] = "Tiffany Cartier"
L["Tilli Thistlefuzz"] = "Tilli Cardopelusa"
L["Trader Narasu"] = "Comerciante Narasu"
L["Truk Wildbeard"] = "Truk Barbaje"
L["Vanessa Sellers"] = "Vanessa Comercios"
L["Velia Moonbow"] = "Velia Arcolunar"
L["Vendor-Tron 1000"] = "Vende-Tron 1000"
L["Veteran Crusader Aliocha Segard"] = "Cruzado veterano Aliocha Segard"
L["Viggz Shinesparked"] = "Viggz Brillochispa"
L["Vix Chromeblaster"] = "[Vix Chromeblaster]"
L["Vizna Bangwrench"] = "Vizna Llavestrépito"
L["Wenna Silkbeard"] = "Wenna Barbasedosa"
L["Werg Thickblade"] = "Werg Filo Grueso"
L["Wind Trader Lathrai"] = "Comerciante de viento Lathrai"
L["Wolgren Jinglepocket"] = "Wolgren Calderilla"
L["Worb Strongstitch"] = "Worb Puntofuerte"
L["Wulmort Jinglepocket"] = "Wulmort Calderilla"
L["Wunna Darkmane"] = "Wunna Crinoscura"
L["Xandar Goodbeard"] = "Xandar Bonbarba"
L["Xerintha Ravenoak"] = "Xerintha Roblecuervo"
L["Xizk Goodstitch"] = "Xizk Cortefino"
L["Xizzer Fizzbolt"] = "Xizzer Raybuja"
L["Yonada"] = "Ionada"
L["Yuka Screwspigot"] = "Yuka Llavenrosca"
L["Yurial Soulwater"] = "Yurial Agua de Alma"
L["Zan Shivsproket"] = "Zan Chafadento"
L["Zannok Hidepiercer"] = "Zannok Perforapieles"
L["Zarena Cromwind"] = "Zarena Cromvento"
L["Zido Helmbreaker"] = "Zido Rompeyelmos"
L["Zoey Wizzlespark"] = "Zoey Vistachispa"
L["Zorbin Fandazzle"] = "Zorbin Hipnoviento"
RecipeRadar/locales/frFR.lua New file
0,0 → 1,326
local L = LibStub("AceLocale-3.0"):NewLocale("RecipeRadar", "frFR", false)
if not L then return end
 
L["Toggle Recipe Radar"] = "Recipe Radar À bascule"
L["Recipe Radar Bindings"] = "Attaches De Recipe Radar"
L["Auto-map Contributive Vendors"] = "Recettes Disponibles d'affichage"
L["Auto-select Current Region"] = "Sélection automatique de la région courante"
L["Check Availability for Alts"] = "Examinez la disponibilité pour les alts"
L["Minimap Button Position"] = "Position du bouton sur la Minimap"
L["Show Minimap Button"] = "Montrez le Bouton sur la Minimap"
L["%d learnable"] = "%d utilisables"
L["%d recipes"] = "%d recettes"
L["1 recipe"] = "1 recette"
L["Uncached Recipe"] = "Recette Non présente"
L["You may mouse over the"] = "Vous devez passer la souris sur l'icône pour"
L["icon to lookup this recipe."] = "ajouter cette recette à votre base de donnèe."
L["Warning: if your server has"] = "Avertissement: si votre serveur n'a"
L["not yet seen this item, you"] = "pas encore vu cet article, vous serez"
L["will be disconnected!"] = "déconnecté!"
L["No recipes for sale in this region."] = "Aucune recette à vendre dans cette région."
L["Shift-click a vendor to add or remove her location on the world map."] = "Shift-clic sur un marchand pour ajouter ou enlever sa position sur la carte du monde."
L["Locate Vendor on Map"] = "Localiser le marchand"
L["Neutral"] = "Neutre"
L["Alchemy"] = "Alchimie"
L["Blacksmithing"] = "Forge"
L["Cooking"] = "Cuisine"
L["Enchanting"] = "Enchantement"
L["Engineering"] = "Ingénierie"
L["First Aid"] = "Secourisme"
L["Fishing"] = "Pêche"
L["Inscription"] = "Calligraphie"
L["Jewelcrafting"] = "Joaillerie"
L["Leatherworking"] = "Travail du cuir"
L["Tailoring"] = "Couture"
L["Professions"] = "Métiers"
L["Already Known (Alts)"] = "Déjà Connu (Alts)"
L["Already Known (Player)"] = "Déjà Connu (Joueur)"
L["Available Now (Alts)"] = "Disponible Maintenant (Alts)"
L["Available Now (Player)"] = "Disponible Maintenant (Joueur) "
L["Future Prospect (Alts)"] = "Bientôt disponible (Alts)"
L["Future Prospect (Player)"] = "Bientôt disponible (Joueur)"
L["Inapplicable"] = "Innaplicable"
L["Availability"] = "Disponibilité"
L["Already Known By:"] = "Déjà Connu Par:"
L["Future Prospect For:"] = "Bientôt disponible pour:"
L["Available For:"] = "Disponible Pour:"
L["%d of %d"] = "%d de %d"
L["Quest"] = "Quête"
L["Roving"] = "Boudinage"
L["Seasonal"] = "Saisonnier"
L["%s Vendor"] = "%s Marchand"
L["Argent Crusade"] = "La Croisade d'argent"
L["Ashtongue Deathsworn"] = "Ligemort cendrelangue"
L["Cenarion Circle"] = "Le Cercle de Cenarius"
L["Cenarion Expedition"] = "Expédition cénarienne"
L["Explorers' League"] = "Ligue des explorateurs"
L["Frenzyheart Tribe"] = "Tribu Frénécœur"
L["Honor Hold"] = "Bastion de l'Honneur"
L["Keepers of Time"] = "Gardiens du Temps"
L["Knights of the Ebon Blade"] = "Chevaliers de la Lame d'ébène"
L["Lower City"] = "Ville basse"
L["Shattered Sun Offensive"] = "Opération Soleil brisé"
L["The Aldor"] = "L'Aldor"
L["The Consortium"] = "Le Consortium"
L["The Frostborn"] = "Les Givre-nés"
L["The Hand of Vengeance"] = "La Main de la vengeance"
L["The Kalu'ak"] = "Les Kalu'aks"
L["The Mag'har"] = "Mag'har"
L["The Oracles"] = "Les Oracles"
L["The Scale of the Sands"] = "L'écaille des sables"
L["The Scryers"] = "Les Clairvoyants"
L["The Sha'tar"] = "Les Sha'tar"
L["The Silver Covenant"] = "Le Concordat argenté"
L["The Sons of Hodir"] = "Les Fils de Hodir"
L["The Taunka"] = "Les Taunkas"
L["The Violet Eye"] = "L'Œil pourpre"
L["The Wyrmrest Accord"] = "L'Accord de Repos du ver"
L["Thorium Brotherhood"] = "La Confrérie du thorium"
L["Timbermaw Hold"] = "Furbolgs Timbermaw"
L["Valiance Expedition"] = "Expédition de la Bravoure"
L["Warsong Offensive"] = "Offensive chanteguerre"
L["Zandalar Tribe"] = "Fournitures et réparations Zandalar"
L["Argent Dawn"] = "L'Aube d'argent"
L["Rogue"] = "Voleur"
L["Special"] = "Spécial"
L["%s Only"] = "%s Seulement"
L["Collapse"] = "Réduire"
L["Collapse All"] = "Réduire Tout"
L["Expand"] = "Etendre"
L["Expand All"] = "Etendre Tout"
L["Map Vendor"] = "Indique la position du marchand sur la carte"
L["Unmap Vendor"] = "Enlevez Marchand"
L["Armorsmith"] = "Fabricant d'armures"
L["Dragonscale Leatherworking"] = "Travail du cuir d'écailles de dragon"
L["Elemental Leatherworking"] = "Travail du cuir élémentaire"
L["Goblin Engineer"] = "Ingénieur gobelin"
L["Master Axesmith"] = "Maître fabricant de haches"
L["Master Hammersmith"] = "Maître Fabricant de marteaux"
L["Master Swordsmith"] = "Maître Fabricant d'épées"
L["Tribal Leatherworking"] = "Travail du cuir tribal"
L["Weaponsmith"] = "Fabricant d'armes"
L["Gnomish Engineer"] = "Ingénieur gnome"
L["Eastern Kingdoms"] = "Royaumes de l'est"
 
L["\"Chef\" Overheat"] = "« Chef » La Surchauffe"
L["\"Cookie\" McWeaksauce"] = "« Cuistot » McFadesauce"
L["Aendel Windspear"] = "Aendel Lancevent"
L["Aged Dalaran Wizard"] = "Sorcier de Dalaran âgé"
L["Ainderu Summerleaf"] = "Ainderu Feuille-d’Eté"
L["Alchemist Finklestein"] = "Alchimiste Finklestein"
L["Alchemist Gribble"] = "Alchimiste Limnorie"
L["Alchemist Pestlezugg"] = "Alchimiste Pilonzugg"
L["Alys Vol'tyr"] = "Alys Vol'tyr"
L["Andrion Darkspinner"] = "Andrion Sombrefileur"
L["Apothecary Antonivich"] = "Apothicaire Antonivitch"
L["Apprentice Darius"] = "Apprenti Darius"
L["Apprentice of Estulan"] = "Apprenti d'Estulan"
L["Archmage Alvareaux"] = "Archimage Alvareaux"
L["Argent Quartermaster Hasana"] = "Intendante de l'Aube d'argent Hasana"
L["Argent Quartermaster Lightspark"] = "Intendant de l'Aube d'argent Feuzopoudre"
L["Arille Azuregaze"] = "Arille Mirazur"
L["Aristaleon Sunweaver"] = "Aristaleon Tisse-Soleil"
L["Ayla Shadowstorm"] = "[Ayla Shadowstorm]"
L["Blackwing"] = "[Blackwing]"
L["Blimo Gadgetspring"] = "Blimo Gadgetaressort"
L["Blixrez Goodstitch"] = "Blixrez Beaupiqué"
L["Blizrik Buckshot"] = "Blizrik Chevrotine"
L["Bombus Finespindle"] = "Bombus Finfuseau"
L["Bountiful Barrel"] = "Baril des Bienfaits"
L["Bradley Towns"] = "Bradley Laville"
L["Braeg Stoutbeard"] = "Braeg Rudebarbe"
L["Brienna Starglow"] = "Brienna Luisétoile"
L["Bro'kin"] = "Fra'kas"
L["Brundall Chiselgut"] = "Brundall Cisentrailles"
L["Buckslappy"] = "Clakfrik"
L["Burbik Gearspanner"] = "Burbik Clépharnaüm"
L["Captain Samir"] = "Capitaine Samir"
L["Captured Gnome"] = "Gnome capturé"
L["Casandra Downs"] = "Cassandra Souilles"
L["Cookie One-Eye"] = "Qu'un-œil le cuistot"
L["Corporal Bluth"] = "Caporal Bluth"
L["Cowardly Crosby"] = "Crosby la Trouille"
L["Crazk Sparks"] = "Crazk Escarbilles"
L["Cro Threadstrong"] = "Cro Fermefil"
L["Daggle Ironshaper"] = "Détrempe Sculptefer"
L["Dalni Tallgrass"] = "Dalni Hautes-herbes"
L["Damek Bloombeard"] = "[Damek Bloombeard]"
L["Danielle Zipstitch"] = "Danielle Vivaiguille"
L["Dealer Malij"] = "Camelot Malij"
L["Defias Profiteer"] = "Profiteur défias"
L["Derak Nightfall"] = "Derak Tombenuit"
L["Derek Odds"] = "Derek Chance"
L["Dirge Quikcleave"] = "Dirge Hachillico"
L["Doris Volanthius"] = "[Doris Volanthius]"
L["Drac Roughcut"] = "Drac Taillebrute"
L["Drovnar Strongbrew"] = "Drovnar Fortebière"
L["Duchess Mynx"] = "Duchesse des Voyées"
L["Eebee Jinglepocket"] = "Eudé Tintinnabourse"
L["Eldara Dawnrunner"] = "Eldara Coursaurore"
L["Elizabeth Barker Winslow"] = "Elizabeth Aboi Winslow"
L["Enchantress Andiala"] = "Enchanteresse Andiala"
L["Evie Whirlbrew"] = "Evie Tourbouillon"
L["Fariel Starsong"] = "Fariel Chantétoile"
L["Fedryen Swiftspear"] = "Fedryen Vivelance"
L["Fizzix Blastbolt"] = "Fizzix Boumboulon"
L["Fradd Swiftgear"] = "Fradd Vifembraye"
L["Frozo the Renowned"] = "Frozo l'Illustre"
L["Gagsprocket"] = "Muserouage"
L["Galley Chief Alunwea"] = "Cambusière Alunwea"
L["Galley Chief Gathers"] = "Cambusier Lassemble"
L["Galley Chief Grace"] = "Cambusière Grace"
L["Galley Chief Halumvorea"] = "Cambusière Halumvorea"
L["Galley Chief Mariss"] = "Cambusière Mariss"
L["Galley Chief Steelbelly"] = "Cambusier Ventracier"
L["Gara Skullcrush"] = "Gara Brisetête"
L["Gearcutter Cogspinner"] = "Coupebraquet Tournepignon"
L["Gidge Spellweaver"] = "Gidge Tisse-sort"
L["Gigget Zipcoil"] = "Giguette Filebobine"
L["Glyx Brewright"] = "Glyx Bonbouilleur"
L["Gnaz Blunderflame"] = "Gnaz Bourdeflamme"
L["Grub"] = "Boustiff'"
L["Harklan Moongrove"] = "Harklan Bosquelune"
L["Harlon Thornguard"] = "Harlon Garderonce"
L["Harlown Darkweave"] = "Harlown Tisselombre"
L["Harn Longcast"] = "Harn Jette-loin"
L["Haughty Modiste"] = "Hautaine Lamodiste"
L["Heldan Galesong"] = "Heldan Chantetrombe"
L["High Admiral \"Shelly\" Jorrik"] = "Amiralissime « Shelly » Jorrik"
L["Hotoppik Copperpinch"] = "Niourok Chipsou"
L["Ikaneba Summerset"] = "Ikaneba Pirouette"
L["Ildine Sorrowspear"] = "Ildine Tristelance"
L["Innkeeper Biribi"] = "Aubergiste Biribi"
L["Innkeeper Fizzgrimble"] = "Aubergiste Rouspétille"
L["Innkeeper Grilka"] = "Aubergiste Grilka"
L["Jangdor Swiftstrider"] = "Jangdor Rôdeur-agile"
L["Jannos Ironwill"] = "Jannos Volonté-de-fer"
L["Jennabink Powerseam"] = "Jennabink Doublepiqûre"
L["Jillian Tanner"] = "Jillian Tanneur"
L["Jim Saltit"] = "Jim Poivressel"
L["Jinky Twizzlefixxit"] = "Jinky Rafistépingle"
L["Jubie Gadgetspring"] = "Jubie Gadgetaressort"
L["Jungle Serpent"] = "Serpent de la jungle"
L["Kaita Deepforge"] = "Kaita Forge-profonde"
L["Kalldan Felmoon"] = "Kalldan Gangrelune"
L["Karizi Porkpatty"] = "Karizi Porcadelle"
L["Khara Deepwater"] = "Khara Eau-profonde"
L["Khole Jinglepocket"] = "Samatiraine Tintinnabourse"
L["Kiknikle"] = "Piéniklé"
L["Kim Horn"] = "Kim Corne"
L["Kirembri Silvermane"] = "Kirembri Crins-d'argent"
L["Knaz Blunderflame"] = "Knaz Bourdeflamme"
L["Knight Dameron"] = "Chevalier Dameron"
L["Krek Cragcrush"] = "Krek Cassecombe"
L["Krinkle Goodsteel"] = "Froisse Bonnacier"
L["KTC Train-a-Tron Deluxe"] = "Entraînotron de luxe de la SCK"
L["Kul Inkspiller"] = "Kul Renverse-encre"
L["Kuldar Steeltooth"] = "Kuldar Dent-d'acier"
L["Lady Palanseer"] = "[Lady Palanseer]"
L["Laha Farplain"] = "Laha Plaine-lointaine"
L["Laida Gembold"] = "Laida Brave-Gemme"
L["Lalla Brightweave"] = "Lalla Richebrocart"
L["Leeli Longhaggle"] = "Leeli Longnégoce"
L["Librarian Erickson"] = "Bibliothécaire Erickson"
L["Lieutenant General Andorov"] = "Général de division Andorov"
L["Linna Bruder"] = "Linna Bruder"
L["Lizna Goldweaver"] = "Lizna Tisselor"
L["Logistics Officer Brighton"] = "Officier de logistique Brighton"
L["Logistics Officer Silverstone"] = "Officier de logistique Pierrargent"
L["Logistics Officer Ulrike"] = "Officier de logistique Ulrike"
L["Lokhtos Darkbargainer"] = "Lokhtos Sombrescompte"
L["Lorelae Wintersong"] = "Lorelae Chante-hiver"
L["Magnus Frostwake"] = "Magnus Givréveil"
L["Mallen Swain"] = "Mallen Legallant"
L["Mari Stonehand"] = "Mari Main-de-pierre"
L["Master Chef Mouldier"] = "Maître cuisinier Mouldier"
L["Master Craftsman Omarion"] = "Maître-artisan Omarion"
L["Mazk Snipeshot"] = "Mazk Tiraubut"
L["Mera Mistrunner"] = "Mera Cours-la-brume"
L["Mirla Silverblaze"] = "Mirla Brasargent"
L["Misensi"] = "Misensi"
L["Misty Merriweather"] = "Misty Bontemps"
L["Mixie Farshot"] = "Mixie Vise-loin"
L["Modoru"] = "Modoru"
L["Morgan Day"] = "Morgan Day"
L["Moro Sungrain"] = "Moro Blé-du-soleil"
L["Muheru the Weaver"] = "Muheru le Tisserand"
L["Naal Mistrunner"] = "Naal Cours-la-brume"
L["Namdo Bizzfizzle"] = "Namdo Ventaperte"
L["Nardstrum Copperpinch"] = "Prijunic Chipsou"
L["Narj Deepslice"] = "Narj Tranchefond"
L["Nasmara Moonsong"] = "Nasmara Lunechant"
L["Nata Dawnstrider"] = "Nata Aube-glorieuse"
L["Nessa Shadowsong"] = "Nessa Chantelombre"
L["Nina Lightbrew"] = "Nina Bouillelume"
L["Nula the Butcher"] = "Nula la Bouchère"
L["Outfitter Eric"] = "Eric le tailleur"
L["Paku Cloudchaser"] = "Paku Chasse-Nuage"
L["Palehoof's Big Bag of Parts"] = "Grand sac de pièces de Pâle-Sabot"
L["Penney Copperpinch"] = "Praintan Chipsou"
L["Plugger Spazzring"] = "Lanfiche Brouillecircuit"
L["Poranna Snowbraid"] = "Poranna Tresseneige"
L["Prospector Khazgorm"] = "Prospecteur Khazgorm"
L["Provisioner Lorkran"] = "Approvisionneur Lorkran"
L["Provisioner Nasela"] = "Approvisionneur Nasela"
L["Quartermaster Davian Vaclav"] = "Intendant Davian Vaclav"
L["Quartermaster Endarin"] = "Intendant Endarin"
L["Quartermaster Enuril"] = "Intendant Enuril"
L["Quartermaster Jaffrey Noreliqe"] = "Intendant Jaffrey Noreliqe"
L["Quartermaster Miranda Breechlock"] = "Intendante Miranda Coinceculasse"
L["Quartermaster Urgronn"] = "Intendant Urgronn"
L["Randah Songhorn"] = "Randah Chante-corne"
L["Ranisa Whitebough"] = "Ranisa Blanc-rameau"
L["Rann Flamespinner"] = "Rann Tisseflamme"
L["Rathis Tomber"] = "Rathis Tombal"
L["Rin'wosho the Trader"] = "Rin'wosho le marchand"
L["Rizz Loosebolt"] = "Rizz Court-boulon"
L["Ruppo Zipcoil"] = "Ruppo Filebobine"
L["Sarah Lightbrew"] = "Sarah Bouillelume"
L["Sassa Weldwell"] = "Sassa Belsoudure"
L["Seer Janidi"] = "Prophétesse Janidi"
L["Seersa Copperpinch"] = "Sokyriel Chipsou"
L["Sewa Mistrunner"] = "Sewa Cours-la-brume"
L["Shadi Mistrunner"] = "Shadi Cours-la-brume"
L["Sheendra Tallgrass"] = "Sheendra Hautes-herbes"
L["Shen'dralar Provisioner"] = "Approvisionneur Shen'dralar"
L["Sheri Zipstitch"] = "Sheri Vivaiguille"
L["Smudge Thunderwood"] = "Smudge Tonnebois"
L["Soolie Berryfizz"] = "Soolie Baiedesbulles"
L["Stone Guard Mukar"] = "Garde de pierre Mukar"
L["Super-Seller 680"] = "Super-Vendeur 680"
L["Supply Officer Mills"] = "Officier de ravitaillement Mills"
L["Tansy Puddlefizz"] = "Tansy Flaquabulle"
L["Tarban Hearthgrain"] = "Tarban Blé-du-foyer"
L["Tarien Silverdew"] = "Tarien Rosée-d’Argent"
L["Taur Stonehoof"] = "Taur Sabot-de-pierre"
L["Threm Blackscalp"] = "Threm Scalpenoir"
L["Thurgrum Deepforge"] = "Thurgrum Forge-profonde"
L["Tiffany Cartier"] = "Tiffany Kartier"
L["Tilli Thistlefuzz"] = "Tilli Duvechardon"
L["Trader Narasu"] = "Marchand Nasaru"
L["Truk Wildbeard"] = "Truk Barbe-hirsute"
L["Vanessa Sellers"] = "Vanessa Sellers"
L["Velia Moonbow"] = "Vélia Arquelune"
L["Vendor-Tron 1000"] = "Vendeur-o-tron 1000"
L["Veteran Crusader Aliocha Segard"] = "Croisé vétéran Aliocha Segard"
L["Viggz Shinesparked"] = "Viggz Fibriller"
L["Vix Chromeblaster"] = "[Vix Chromeblaster]"
L["Vizna Bangwrench"] = "Vizna Vrillebang"
L["Wenna Silkbeard"] = "Wenna Barbe-de-soie"
L["Werg Thickblade"] = "Werg Largelame"
L["Wind Trader Lathrai"] = "Marchand des vents Lathrai"
L["Wolgren Jinglepocket"] = "Céropha Tintinnabourse"
L["Worb Strongstitch"] = "Worb Point-solide"
L["Wulmort Jinglepocket"] = "Karfour Tintinnabourse"
L["Wunna Darkmane"] = "Wunna Sombre-crin"
L["Xandar Goodbeard"] = "Xandar Bonnebarbe"
L["Xerintha Ravenoak"] = "Xerintha Corvichêne"
L["Xizk Goodstitch"] = "Xizk Beaupiqué"
L["Xizzer Fizzbolt"] = "Xizzer Klaqueboulon"
L["Yuka Screwspigot"] = "Yuka Fermevanne"
L["Yurial Soulwater"] = "Yurial Âmeflot"
L["Zan Shivsproket"] = "Zan Tympeustache"
L["Zannok Hidepiercer"] = "Zannok Percecuir"
L["Zido Helmbreaker"] = "Zido Brisome"
L["Zoey Wizzlespark"] = "Zoey Leviétincelle"
L["Zorbin Fandazzle"] = "Zorbin Poudrozieu"
RecipeRadar/locales/deDE.lua New file
0,0 → 1,336
local L = LibStub("AceLocale-3.0"):NewLocale("RecipeRadar", "deDE", false)
if not L then return end
 
L["Toggle Recipe Radar"] = "Recipe Radar umschalten"
L["Recipe Radar Bindings"] = "Recipe Radar Tastenbelegung"
L["Auto-map Contributive Vendors"] = "Erlernbare Rezepte Automatisch Markieren"
L["Auto-select Current Region"] = "Automatisch aktuelle Zone wählen"
L["Check Availability for Alts"] = "Verwendbarkeit für Alts prüfen"
L["Minimap Button Position"] = "Position des Minimap-Button"
L["Show Minimap Button"] = "Minimap-Button anzeigen"
L["Options"] = "Optionen"
L["%d learnable"] = "%d lernbar"
L["%d recipes"] = "%d Rezepte"
L["1 recipe"] = "1 Rezept"
L["Uncached Recipe"] = "Rezept nicht im Cache"
L["You may mouse over the"] = "Bewege die Maus über das Symbol"
L["icon to lookup this recipe."] = "um dieses Rezept nachzuschlagen."
L["Warning: if your server has"] = "Warnung: wenn der Server dieses"
L["not yet seen this item, you"] = "Rezept noch nicht gesehen hat"
L["will be disconnected!"] = "wird die Verbindung getrennt!"
L["No recipes for sale in this region."] = "Keine Rezepte zum Verkauf in dieser Region."
L["Shift-click a vendor to add or remove her location on the world map."] = "Shift-Klicke einen Händler, um seine Position auf der Weltkarte und Minikarte hinzuzufügen oder zu entfernen."
L["Locate Vendor on Map"] = "Händler auf Karte zeigen"
L["Factions"] = "Parteien"
L["Alchemy"] = "Alchimie"
L["Blacksmithing"] = "Schmiedekunst"
L["Cooking"] = "Kochkunst"
L["Enchanting"] = "Verzauberkunst"
L["Engineering"] = "Ingenieurskunst"
L["First Aid"] = "Erste Hilfe"
L["Fishing"] = "Angeln"
L["Inscription"] = "Inschriftenkunde"
L["Jewelcrafting"] = "Juwelenschleifen"
L["Leatherworking"] = "Lederverarbeitung"
L["Tailoring"] = "Schneiderei"
L["Professions"] = "Berufe"
L["Already Known (Alts)"] = "Bereits bekannt (Alts)"
L["Already Known (Player)"] = "Bereits bekannt (Spieler)"
L["Available Now (Alts)"] = "Vorhanden jetzt (Alts)"
L["Available Now (Player)"] = "Vorhanden jetzt (Spieler)"
L["Future Prospect (Alts)"] = "Zukünftige Aussicht (Alts)"
L["Future Prospect (Player)"] = "Zukünftige Aussicht (Spieler)"
L["Inapplicable"] = "Nicht anwendbar"
L["Availability"] = "Verwendbarkeit"
L["Already Known By:"] = "Bereits bekannt für:"
L["Future Prospect For:"] = "Zukünftige Aussicht für:"
L["Available For:"] = "Vorhanden für:"
L["%d of %d"] = "%d von %d"
L["Intermittent"] = "Zeitweiliger"
L["Quest"] = "Quest"
L["Roving"] = "Wandernder"
L["Seasonal"] = "Saisonaler"
L["%s Vendor"] = "%s Händler"
L["Argent Crusade"] = "Argentumkreuzzug"
L["Ashtongue Deathsworn"] = "Die Todeshörigen"
L["Cenarion Circle"] = "Zirkel des Cenarius"
L["Cenarion Expedition"] = "Expedition des Cenarius"
L["Explorers' League"] = "Forscherliga"
L["Frenzyheart Tribe"] = "Stamm der Wildherzen"
L["Honor Hold"] = "Ehrenfeste"
L["Keepers of Time"] = "Hüter der Zeit"
L["Knights of the Ebon Blade"] = "Ritter der Schwarzen Klinge"
L["Lower City"] = "Unteres Viertel"
L["Netherwing"] = "Netherschwingen"
L["Shattered Sun Offensive"] = "Zerschmetterte Sonne"
L["The Aldor"] = "Die Aldor"
L["The Consortium"] = "Das Consortium"
L["The Frostborn"] = "Die Frosterben"
L["The Hand of Vengeance"] = "Die Hand der Rache"
L["The Kalu'ak"] = "Die Kalu'ak"
L["The Mag'har"] = "Die Mag'har"
L["The Oracles"] = "Die Orakel"
L["The Scale of the Sands"] = "Die Wächter der Sande"
L["The Scryers"] = "Die Seher"
L["The Sha'tar"] = "Die Sha'tar"
L["The Silver Covenant"] = "Der Silberbund"
L["The Sons of Hodir"] = "Die Söhne Hodirs"
L["The Taunka"] = "Die Taunka"
L["The Violet Eye"] = "Das Violette Auge"
L["The Wyrmrest Accord"] = "Der Wyrmruhpakt"
L["Thorium Brotherhood"] = "Thorium-Bruderschaft"
L["Timbermaw Hold"] = "Holzschlundfeste"
L["Valiance Expedition"] = "Expedition \"Valianz\""
L["Warsong Offensive"] = "Kriegshymnenoffensive"
L["Zandalar Tribe"] = "Zandalar"
L["Argent Dawn"] = "Argentumdämmerung"
L["Rogue"] = "Schurke"
L["Special"] = "Speziell"
L["%s Only"] = "Nur %s"
L["Collapse"] = "Einklappen"
L["Collapse All"] = "Alle einklappen"
L["Expand"] = "Ausklappen"
L["Expand All"] = "Alle ausklappen"
L["Map Vendor"] = "Händler auf Karte anzeigen"
L["Unmap Vendor"] = "Händler von Karte entfernen"
L["Armorsmith"] = "Rüstungsschmied"
L["Dragonscale Leatherworking"] = "Drachenschuppenlederverarbeitung"
L["Elemental Leatherworking"] = "Elementarlederverarbeitung"
L["Goblin Engineer"] = "Goblin-Ingenieur"
L["Master Axesmith"] = "Axtschmiedemeister"
L["Master Hammersmith"] = "Hammerschmiedemeister"
L["Master Swordsmith"] = "Schwertschmiedemeister"
L["Tribal Leatherworking"] = "Stammeslederverarbeitung"
L["Weaponsmith"] = "Waffenschmied"
L["Gnomish Engineer"] = "Gnomen-Ingenieur"
L["Eastern Kingdoms"] = "Östliche Königreiche"
L["Instances"] = "Instanzen"
 
L["\"Chef\" Overheat"] = "\"Koch\" Gluthitze"
L["\"Cookie\" McWeaksauce"] = "\"Kräcka\" Aschebäscha"
L["Aaron Hollman"] = "Aaron Hollmann"
L["Aendel Windspear"] = "Aendel Windspeer"
L["Aged Dalaran Wizard"] = "Gealterter Hexer von Dalaran"
L["Ainderu Summerleaf"] = "Ainderu Sommerblatt"
L["Alchemist Finklestein"] = "Alchemist Finkelstein"
L["Alchemist Gribble"] = "Alchemist Grabbel"
L["Alchemist Pestlezugg"] = "Alchemist Stößelbruch"
L["Alys Vol'tyr"] = "Alys Vol'tyr"
L["Andrion Darkspinner"] = "Andrion Dunkelweber"
L["Apothecary Antonivich"] = "Apotheker Antonivich"
L["Apprentice Darius"] = "Lehrling Darius"
L["Apprentice of Estulan"] = "Schüler von Estulan"
L["Archmage Alvareaux"] = "Erzmagier Alvareaux"
L["Argent Quartermaster Hasana"] = "Argentumrüstmeister Hasana"
L["Argent Quartermaster Lightspark"] = "Argentumrüstmeister Funkellicht"
L["Arille Azuregaze"] = "Arille Azurblick"
L["Aristaleon Sunweaver"] = "Aristaleon Sonnenweber"
L["Ayla Shadowstorm"] = "[Ayla Shadowstorm]"
L["Blackwing"] = "[Blackwing]"
L["Blimo Gadgetspring"] = "Blimo Federdings"
L["Blixrez Goodstitch"] = "Blixrez Gutstich"
L["Blizrik Buckshot"] = "Blizrik Bockschuss"
L["Bombus Finespindle"] = "Bombus Feinspindel"
L["Bountiful Barrel"] = "Reichhaltiges Fass"
L["Bradley Towns"] = "Bradley Städter"
L["Braeg Stoutbeard"] = "Braeg Starkbart"
L["Brienna Starglow"] = "Brienna Sternenglanz"
L["Brundall Chiselgut"] = "Brundall Meißelbauch"
L["Buckslappy"] = "Bockschlaps"
L["Burbik Gearspanner"] = "Burbik Ritzelspann"
L["Captain Samir"] = "Kapitän Samir"
L["Captured Gnome"] = "Gefangener Gnom"
L["Casandra Downs"] = "Kassandra Abwärts"
L["Christoph Jeffcoat"] = "Christoph Jeffkott"
L["Cookie One-Eye"] = "Kräcka Einauge"
L["Corporal Bluth"] = "Korporal Bluth"
L["Cowardly Crosby"] = "Feiger Crosby"
L["Crazk Sparks"] = "Crazk Funks"
L["Cro Threadstrong"] = "Cro Dickfädel"
L["Daggle Ironshaper"] = "Daggle Eisenformer"
L["Dalni Tallgrass"] = "Dalni Hochgras"
L["Damek Bloombeard"] = "[Damek Bloombeard]"
L["Danielle Zipstitch"] = "Danielle Stichelnaht"
L["Dealer Malij"] = "Händler Malij"
L["Defias Profiteer"] = "Schieber der Defias"
L["Derak Nightfall"] = "Derak Nachtlauer"
L["Derek Odds"] = "Derek Odds"
L["Dirge Quikcleave"] = "Dirge Schnetzelhack"
L["Doris Volanthius"] = "[Doris Volanthius]"
L["Drac Roughcut"] = "Drac Grobschnitt"
L["Drovnar Strongbrew"] = "Drovnar Starkbräu"
L["Duchess Mynx"] = "Herzogin Mynx"
L["Eebee Jinglepocket"] = "Eebee Klingeltasche"
L["Eldara Dawnrunner"] = "Eldara Dämmerflucht"
L["Elizabeth Barker Winslow"] = "Elizabeth Barker-Winslow"
L["Enchantress Andiala"] = "Verzauberin Andiala"
L["Evie Whirlbrew"] = "Evie Wirbelbräu"
L["Fariel Starsong"] = "Fariel Sternensang"
L["Fedryen Swiftspear"] = "Fedryen Flinkspeer"
L["Fizzix Blastbolt"] = "Fizzix Sprengbolz"
L["Fradd Swiftgear"] = "Fradd Schnellschalt"
L["Frozo the Renowned"] = "Frozo der Wohlbekannte"
L["Gagsprocket"] = "Quietschspross"
L["Galley Chief Alunwea"] = "Smutje Alunwea"
L["Galley Chief Gathers"] = "Smutje Schlaz"
L["Galley Chief Grace"] = "Smutje Gunzl"
L["Galley Chief Halumvorea"] = "Smutje Halumvorea"
L["Galley Chief Mariss"] = "Smutje Mariss"
L["Galley Chief Steelbelly"] = "Smutje Stahlbauch"
L["Gara Skullcrush"] = "Gara Schädelberster"
L["Gearcutter Cogspinner"] = "Ritzelschnitt Zahnrad"
L["Gidge Spellweaver"] = "Gidge Spruchwirker"
L["Gigget Zipcoil"] = "Gigget Reißspule"
L["Glyx Brewright"] = "Glyx Gutbräu"
L["Gnaz Blunderflame"] = "Gnaz Dusselflamm"
L["Harklan Moongrove"] = "Harklan Mondhain"
L["Harlon Thornguard"] = "Harlon Dornenwacht"
L["Harlown Darkweave"] = "Harlown Dunkelwirker"
L["Harn Longcast"] = "Harn Rutenwurf"
L["Haughty Modiste"] = "Eingebildete Modeschöpferin"
L["Heldan Galesong"] = "Heldan Sturmgesang"
L["High Admiral \"Shelly\" Jorrik"] = "Hochadmiral \"Shelly\" Jorrik"
L["Hotoppik Copperpinch"] = "Hotoppik Kupferzwick"
L["Ikaneba Summerset"] = "Ikaneba Spätsommer"
L["Ildine Sorrowspear"] = "Ildine Sorgenspeer"
L["Innkeeper Biribi"] = "Gastwirtin Biribi"
L["Innkeeper Fizzgrimble"] = "Gastwirt Zischgrimbel"
L["Innkeeper Grilka"] = "Gastwirtin Grilka"
L["Jabbey"] = "Stupser"
L["Jangdor Swiftstrider"] = "Jangdor Flinkschreiter"
L["Jannos Ironwill"] = "Jannos Eisenwill"
L["Jase Farlane"] = "Jase Langweg"
L["Jennabink Powerseam"] = "Jennabink Starksaum"
L["Jillian Tanner"] = "Jillian Gerber"
L["Jim Saltit"] = "Jim Salzit"
L["Jinky Twizzlefixxit"] = "Jinky Pfuschelfix"
L["Joseph Moore"] = "Joseph Moor"
L["Jubie Gadgetspring"] = "Jubie Federdings"
L["Jungle Serpent"] = "Dschungelschlange"
L["Kaita Deepforge"] = "Kaita Tiefenschmied"
L["Kalldan Felmoon"] = "Kalldan Teufelsmond"
L["Karizi Porkpatty"] = "Karizi Schwinshoxn"
L["Khara Deepwater"] = "Khara Tiefenwasser"
L["Khole Jinglepocket"] = "Khole Klingeltaschen"
L["Kirembri Silvermane"] = "Kirembri Silbermähne"
L["Knaz Blunderflame"] = "Knaz Dusselflamm"
L["Knight Dameron"] = "Ritter Dameron"
L["Krek Cragcrush"] = "Krek Schmetterfels"
L["Krinkle Goodsteel"] = "Krinkle Goldstahl"
L["KTC Train-a-Tron Deluxe"] = "HGK Ausbildomat Deluxe"
L["Kul Inkspiller"] = "Kul Tintenschütter"
L["Kuldar Steeltooth"] = "Kuldar Stahlzahn"
L["Lady Palanseer"] = "[Lady Palanseer]"
L["Laha Farplain"] = "Laha Grasland"
L["Lalla Brightweave"] = "Lalla Hellzwirn"
L["Leeli Longhaggle"] = "Leeli Langfeilsch"
L["Librarian Erickson"] = "Bibliothekar Erickson"
L["Lieutenant General Andorov"] = "Generalleutnant Andorov"
L["Linna Bruder"] = "Linna Bruder"
L["Lizbeth Cromwell"] = "Lizbeth Kromwell"
L["Lizna Goldweaver"] = "Lizna Goldflechter"
L["Logistics Officer Brighton"] = "Logistikoffizier Heller"
L["Logistics Officer Silverstone"] = "Logistikoffizier Silberstein"
L["Logistics Officer Ulrike"] = "Nachschuboffizier Ulrike"
L["Lokhtos Darkbargainer"] = "Lokhtos Düsterfeilsch"
L["Lorelae Wintersong"] = "Lorelae Winterklang"
L["Madame Ruby"] = "Madame Rubin"
L["Magnus Frostwake"] = "Magnus Frostrufer"
L["Mallen Swain"] = "Mallen Knab"
L["Mari Stonehand"] = "Mari Steinhand"
L["Martine Tramblay"] = "Martine Tramblei"
L["Master Chef Mouldier"] = "Meisterkoch Mouldier"
L["Master Craftsman Omarion"] = "Meisterhandwerker Omarion"
L["Mazk Snipeshot"] = "Mazk Zielschuss"
L["Mera Mistrunner"] = "Mera Nebelläufer"
L["Mirla Silverblaze"] = "Mirla Silberstreif"
L["Misensi"] = "Misensi"
L["Misty Merriweather"] = "Misty Heiterhimmel"
L["Mixie Farshot"] = "Mixie Weitschuss"
L["Modoru"] = "Modoru"
L["Morgan Day"] = "Morgan Day"
L["Moro Sungrain"] = "Moro Sonnenkorn"
L["Muheru the Weaver"] = "Muheru der Weber"
L["Naal Mistrunner"] = "Naal Nebelläufer"
L["Namdo Bizzfizzle"] = "Namdo Blitzzischel"
L["Nardstrum Copperpinch"] = "Nardstrum Kupferzwick"
L["Narj Deepslice"] = "Narj Schnitzelschnitt"
L["Nasmara Moonsong"] = "Nasmara Mondweise"
L["Nata Dawnstrider"] = "Nata Morgenwandler"
L["Nessa Shadowsong"] = "Nessa Schattensang"
L["Nina Lightbrew"] = "Nina Brauleicht"
L["Nula the Butcher"] = "Nula die Metzgerin"
L["Outfitter Eric"] = "Ausstatter Eric"
L["Paku Cloudchaser"] = "Paku Wolkenjäger"
L["Palehoof's Big Bag of Parts"] = "Bleichhufs großer Ersatzteilbeutel"
L["Penney Copperpinch"] = "Penney Kupferzwick"
L["Plugger Spazzring"] = "Stöpsel Zapfring"
L["Poranna Snowbraid"] = "Poranna Schneezopf"
L["Prospector Khazgorm"] = "Ausgrabungsleiter Khazgorm"
L["Provisioner Lorkran"] = "Versorger Lorkran"
L["Provisioner Nasela"] = "Versorgerin Nasela"
L["Quartermaster Davian Vaclav"] = "Rüstmeister Davian Watzlav"
L["Quartermaster Endarin"] = "Rüstmeister Endarin"
L["Quartermaster Enuril"] = "Rüstmeister Enuril"
L["Quartermaster Jaffrey Noreliqe"] = "Rüstmeister Jaffrey Keinespuhr"
L["Quartermaster Miranda Breechlock"] = "Rüstmeisterin Miranda Knackschloss"
L["Quartermaster Urgronn"] = "Rüstmeister Urgronn"
L["Randah Songhorn"] = "Randah Liedhorn"
L["Ranisa Whitebough"] = "Ranisa Weißblatt"
L["Rann Flamespinner"] = "Rann Flammenweber"
L["Rin'wosho the Trader"] = "Rin'wosho der Händler"
L["Rizz Loosebolt"] = "Rizz Wackelbolz"
L["Ruppo Zipcoil"] = "Ruppo Reißspule"
L["Sarah Lightbrew"] = "Sarah Brauleicht"
L["Sassa Weldwell"] = "Sassa Nahtgut"
L["Sebastian Crane"] = "Sebastian Kranich"
L["Seer Janidi"] = "Seherin Janidi"
L["Seersa Copperpinch"] = "Seersa Kupferzwick"
L["Sewa Mistrunner"] = "Sewa Nebelläufer"
L["Shadi Mistrunner"] = "Shadi Nebelläufer"
L["Sheendra Tallgrass"] = "Sheendra Hochschilf"
L["Shen'dralar Provisioner"] = "Versorger der Shen'dralar"
L["Sheri Zipstitch"] = "Sheri Stichelnaht"
L["Smudge Thunderwood"] = "Smudge Donnerholz"
L["Soolie Berryfizz"] = "Soolie Brausefitz"
L["Stone Guard Mukar"] = "Steingardist Mutaha"
L["Super-Seller 680"] = "Superverkaufomat 680"
L["Supply Officer Mills"] = "Versorgungsoffizier Mühlens"
L["Tansy Puddlefizz"] = "Tansy Pfützplatsch"
L["Tarban Hearthgrain"] = "Tarban Kornbäcker"
L["Tarien Silverdew"] = "Tarien Silbertau"
L["Taur Stonehoof"] = "Taur Steinhuf"
L["Thaddeus Webb"] = "Thaddeus Webner"
L["Threm Blackscalp"] = "Threm Dunkelschopf"
L["Thurgrum Deepforge"] = "Thurgrum Tiefenschmied"
L["Tiffany Cartier"] = "Tiffany Cartier"
L["Tilli Thistlefuzz"] = "Tilli Distelflaum"
L["Timothy Jones"] = "Jonas Timotheus"
L["Trader Narasu"] = "Händler Narasu"
L["Truk Wildbeard"] = "Truk Wildbart"
L["Vanessa Sellers"] = "Vanessa Kaufmann"
L["Velia Moonbow"] = "Velia Mondbogen"
L["Vendor-Tron 1000"] = "Kaufotron 1000"
L["Veteran Crusader Aliocha Segard"] = "Kreuzfahrerveteran Aliocha Segard"
L["Viggz Shinesparked"] = "Viggz Funkenschimmer"
L["Vix Chromeblaster"] = "[Vix Chromeblaster]"
L["Vizna Bangwrench"] = "Vizna Schlagzang"
L["Wenna Silkbeard"] = "Wenna Seidenbart"
L["Werg Thickblade"] = "Werg Breitklinge"
L["Wind Trader Lathrai"] = "Windhändler Lathrai"
L["Wolgren Jinglepocket"] = "Wolgren Klingeltaschen"
L["Worb Strongstitch"] = "Worb Starkahle"
L["Wulmort Jinglepocket"] = "Wulmort Klingeltaschen"
L["Wunna Darkmane"] = "Wunna Dunkelmähne"
L["Xandar Goodbeard"] = "Xandar Gutbart"
L["Xerintha Ravenoak"] = "Xerintha Rabeneiche"
L["Xizk Goodstitch"] = "Xizk Gutstich"
L["Xizzer Fizzbolt"] = "Xizzer Zischbolz"
L["Yuka Screwspigot"] = "Yuka Schraubstutz"
L["Yurial Soulwater"] = "Yurial Seelenwasser"
L["Zan Shivsproket"] = "Zan Messerritzel"
L["Zannok Hidepiercer"] = "Zannok Ledernaht"
L["Zarena Cromwind"] = "Zarena Stahlwind"
L["Zido Helmbreaker"] = "Zido Helmbrecher"
L["Zoey Wizzlespark"] = "Zoey Wizzelfunk"
L["Zorbin Fandazzle"] = "Zorbin von Schiller"
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua New file
0,0 → 1,69
--[[-----------------------------------------------------------------------------
SimpleGroup Container
Simple container widget that just groups widgets.
-------------------------------------------------------------------------------]]
local Type, Version = "SimpleGroup", 20
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local pairs = pairs
 
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
 
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:SetWidth(300)
self:SetHeight(100)
end,
 
-- ["OnRelease"] = nil,
 
["LayoutFinished"] = function(self, width, height)
if self.noAutoHeight then return end
self:SetHeight(height or 0)
end,
 
["OnWidthSet"] = function(self, width)
local content = self.content
content:SetWidth(width)
content.width = width
end,
 
["OnHeightSet"] = function(self, height)
local content = self.content
content:SetHeight(height)
content.height = height
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
 
--Container Support
local content = CreateFrame("Frame", nil, frame)
content:SetPoint("TOPLEFT")
content:SetPoint("BOTTOMRIGHT")
 
local widget = {
frame = frame,
content = content,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
 
return AceGUI:RegisterAsContainer(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua New file
0,0 → 1,331
local AceGUI = LibStub("AceGUI-3.0")
 
-- Lua APIs
local pairs, assert, type = pairs, assert, type
 
-- WoW APIs
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: GameFontNormal
 
----------------
-- Main Frame --
----------------
--[[
Events :
OnClose
 
]]
do
local Type = "Window"
local Version = 4
 
local function frameOnClose(this)
this.obj:Fire("OnClose")
end
 
local function closeOnClick(this)
PlaySound("gsTitleOptionExit")
this.obj:Hide()
end
 
local function frameOnMouseDown(this)
AceGUI:ClearFocus()
end
 
local function titleOnMouseDown(this)
this:GetParent():StartMoving()
AceGUI:ClearFocus()
end
 
local function frameOnMouseUp(this)
local frame = this:GetParent()
frame:StopMovingOrSizing()
local self = frame.obj
local status = self.status or self.localstatus
status.width = frame:GetWidth()
status.height = frame:GetHeight()
status.top = frame:GetTop()
status.left = frame:GetLeft()
end
 
local function sizerseOnMouseDown(this)
this:GetParent():StartSizing("BOTTOMRIGHT")
AceGUI:ClearFocus()
end
 
local function sizersOnMouseDown(this)
this:GetParent():StartSizing("BOTTOM")
AceGUI:ClearFocus()
end
 
local function sizereOnMouseDown(this)
this:GetParent():StartSizing("RIGHT")
AceGUI:ClearFocus()
end
 
local function sizerOnMouseUp(this)
this:GetParent():StopMovingOrSizing()
end
 
local function SetTitle(self,title)
self.titletext:SetText(title)
end
 
local function SetStatusText(self,text)
-- self.statustext:SetText(text)
end
 
local function Hide(self)
self.frame:Hide()
end
 
local function Show(self)
self.frame:Show()
end
 
local function OnAcquire(self)
self.frame:SetParent(UIParent)
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
self:ApplyStatus()
self:EnableResize(true)
self:Show()
end
 
local function OnRelease(self)
self.status = nil
for k in pairs(self.localstatus) do
self.localstatus[k] = nil
end
end
 
-- called to set an external table to store status in
local function SetStatusTable(self, status)
assert(type(status) == "table")
self.status = status
self:ApplyStatus()
end
 
local function ApplyStatus(self)
local status = self.status or self.localstatus
local frame = self.frame
self:SetWidth(status.width or 700)
self:SetHeight(status.height or 500)
if status.top and status.left then
frame:SetPoint("TOP",UIParent,"BOTTOM",0,status.top)
frame:SetPoint("LEFT",UIParent,"LEFT",status.left,0)
else
frame:SetPoint("CENTER",UIParent,"CENTER")
end
end
 
local function OnWidthSet(self, width)
local content = self.content
local contentwidth = width - 34
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
end
 
 
local function OnHeightSet(self, height)
local content = self.content
local contentheight = height - 57
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end
 
local function EnableResize(self, state)
local func = state and "Show" or "Hide"
self.sizer_se[func](self.sizer_se)
self.sizer_s[func](self.sizer_s)
self.sizer_e[func](self.sizer_e)
end
 
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = "Window"
 
self.Hide = Hide
self.Show = Show
self.SetTitle = SetTitle
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
self.SetStatusText = SetStatusText
self.SetStatusTable = SetStatusTable
self.ApplyStatus = ApplyStatus
self.OnWidthSet = OnWidthSet
self.OnHeightSet = OnHeightSet
self.EnableResize = EnableResize
 
self.localstatus = {}
 
self.frame = frame
frame.obj = self
frame:SetWidth(700)
frame:SetHeight(500)
frame:SetPoint("CENTER",UIParent,"CENTER",0,0)
frame:EnableMouse()
frame:SetMovable(true)
frame:SetResizable(true)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetScript("OnMouseDown", frameOnMouseDown)
 
frame:SetScript("OnHide",frameOnClose)
frame:SetMinResize(240,240)
frame:SetToplevel(true)
 
local titlebg = frame:CreateTexture(nil, "BACKGROUND")
titlebg:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Title-Background]])
titlebg:SetPoint("TOPLEFT", 9, -6)
titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24)
 
local dialogbg = frame:CreateTexture(nil, "BACKGROUND")
dialogbg:SetTexture([[Interface\Tooltips\UI-Tooltip-Background]])
dialogbg:SetPoint("TOPLEFT", 8, -24)
dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
dialogbg:SetVertexColor(0, 0, 0, .75)
 
local topleft = frame:CreateTexture(nil, "BORDER")
topleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
topleft:SetWidth(64)
topleft:SetHeight(64)
topleft:SetPoint("TOPLEFT")
topleft:SetTexCoord(0.501953125, 0.625, 0, 1)
 
local topright = frame:CreateTexture(nil, "BORDER")
topright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
topright:SetWidth(64)
topright:SetHeight(64)
topright:SetPoint("TOPRIGHT")
topright:SetTexCoord(0.625, 0.75, 0, 1)
 
local top = frame:CreateTexture(nil, "BORDER")
top:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
top:SetHeight(64)
top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
top:SetTexCoord(0.25, 0.369140625, 0, 1)
 
local bottomleft = frame:CreateTexture(nil, "BORDER")
bottomleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
bottomleft:SetWidth(64)
bottomleft:SetHeight(64)
bottomleft:SetPoint("BOTTOMLEFT")
bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)
 
local bottomright = frame:CreateTexture(nil, "BORDER")
bottomright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
bottomright:SetWidth(64)
bottomright:SetHeight(64)
bottomright:SetPoint("BOTTOMRIGHT")
bottomright:SetTexCoord(0.875, 1, 0, 1)
 
local bottom = frame:CreateTexture(nil, "BORDER")
bottom:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
bottom:SetHeight(64)
bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)
 
local left = frame:CreateTexture(nil, "BORDER")
left:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
left:SetWidth(64)
left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
left:SetTexCoord(0.001953125, 0.125, 0, 1)
 
local right = frame:CreateTexture(nil, "BORDER")
right:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
right:SetWidth(64)
right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
right:SetTexCoord(0.1171875, 0.2421875, 0, 1)
 
local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
close:SetPoint("TOPRIGHT", 2, 1)
close:SetScript("OnClick", closeOnClick)
self.closebutton = close
close.obj = self
 
local titletext = frame:CreateFontString(nil, "ARTWORK")
titletext:SetFontObject(GameFontNormal)
titletext:SetPoint("TOPLEFT", 12, -8)
titletext:SetPoint("TOPRIGHT", -32, -8)
self.titletext = titletext
 
local title = CreateFrame("Button", nil, frame)
title:SetPoint("TOPLEFT", titlebg)
title:SetPoint("BOTTOMRIGHT", titlebg)
title:EnableMouse()
title:SetScript("OnMouseDown",titleOnMouseDown)
title:SetScript("OnMouseUp", frameOnMouseUp)
self.title = title
 
local sizer_se = CreateFrame("Frame",nil,frame)
sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
sizer_se:SetWidth(25)
sizer_se:SetHeight(25)
sizer_se:EnableMouse()
sizer_se:SetScript("OnMouseDown",sizerseOnMouseDown)
sizer_se:SetScript("OnMouseUp", sizerOnMouseUp)
self.sizer_se = sizer_se
 
local line1 = sizer_se:CreateTexture(nil, "BACKGROUND")
self.line1 = line1
line1:SetWidth(14)
line1:SetHeight(14)
line1:SetPoint("BOTTOMRIGHT", -8, 8)
line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
local x = 0.1 * 14/17
line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
 
local line2 = sizer_se:CreateTexture(nil, "BACKGROUND")
self.line2 = line2
line2:SetWidth(8)
line2:SetHeight(8)
line2:SetPoint("BOTTOMRIGHT", -8, 8)
line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
local x = 0.1 * 8/17
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
 
local sizer_s = CreateFrame("Frame",nil,frame)
sizer_s:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-25,0)
sizer_s:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
sizer_s:SetHeight(25)
sizer_s:EnableMouse()
sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
self.sizer_s = sizer_s
 
local sizer_e = CreateFrame("Frame",nil,frame)
sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
sizer_e:SetWidth(25)
sizer_e:EnableMouse()
sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
self.sizer_e = sizer_e
 
--Container Support
local content = CreateFrame("Frame",nil,frame)
self.content = content
content.obj = self
content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
 
AceGUI:RegisterAsContainer(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua New file
0,0 → 1,203
--[[-----------------------------------------------------------------------------
ScrollFrame Container
Plain container that scrolls its content and doesn't grow in height.
-------------------------------------------------------------------------------]]
local Type, Version = "ScrollFrame", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local pairs, assert, type = pairs, assert, type
local min, max, floor, abs = math.min, math.max, math.floor, math.abs
 
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
 
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
local function FixScrollOnUpdate(frame)
frame:SetScript("OnUpdate", nil)
frame.obj:FixScroll()
end
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function ScrollFrame_OnMouseWheel(frame, value)
frame.obj:MoveScroll(value)
end
 
local function ScrollFrame_OnSizeChanged(frame)
frame:SetScript("OnUpdate", FixScrollOnUpdate)
end
 
local function ScrollBar_OnScrollValueChanged(frame, value)
frame.obj:SetScroll(value)
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:SetScroll(0)
end,
 
["OnRelease"] = function(self)
self.status = nil
for k in pairs(self.localstatus) do
self.localstatus[k] = nil
end
self.scrollframe:SetPoint("BOTTOMRIGHT")
self.scrollbar:Hide()
self.scrollBarShown = nil
self.content.height, self.content.width = nil, nil
end,
 
["SetScroll"] = function(self, value)
local status = self.status or self.localstatus
local viewheight = self.scrollframe:GetHeight()
local height = self.content:GetHeight()
local offset
 
if viewheight > height then
offset = 0
else
offset = floor((height - viewheight) / 1000.0 * value)
end
self.content:ClearAllPoints()
self.content:SetPoint("TOPLEFT", 0, offset)
self.content:SetPoint("TOPRIGHT", 0, offset)
status.offset = offset
status.scrollvalue = value
end,
 
["MoveScroll"] = function(self, value)
local status = self.status or self.localstatus
local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
 
if self.scrollBarShown then
local diff = height - viewheight
local delta = 1
if value < 0 then
delta = -1
end
self.scrollbar:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
end
end,
 
["FixScroll"] = function(self)
if self.updateLock then return end
self.updateLock = true
local status = self.status or self.localstatus
local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
local offset = status.offset or 0
local curvalue = self.scrollbar:GetValue()
-- Give us a margin of error of 2 pixels to stop some conditions that i would blame on floating point inaccuracys
-- No-one is going to miss 2 pixels at the bottom of the frame, anyhow!
if viewheight < height + 2 then
if self.scrollBarShown then
self.scrollBarShown = nil
self.scrollbar:Hide()
self.scrollbar:SetValue(0)
self.scrollframe:SetPoint("BOTTOMRIGHT")
self:DoLayout()
end
else
if not self.scrollBarShown then
self.scrollBarShown = true
self.scrollbar:Show()
self.scrollframe:SetPoint("BOTTOMRIGHT", -20, 0)
self:DoLayout()
end
local value = (offset / (viewheight - height) * 1000)
if value > 1000 then value = 1000 end
self.scrollbar:SetValue(value)
self:SetScroll(value)
if value < 1000 then
self.content:ClearAllPoints()
self.content:SetPoint("TOPLEFT", 0, offset)
self.content:SetPoint("TOPRIGHT", 0, offset)
status.offset = offset
end
end
self.updateLock = nil
end,
 
["LayoutFinished"] = function(self, width, height)
self.content:SetHeight(height or 0 + 20)
self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
end,
 
["SetStatusTable"] = function(self, status)
assert(type(status) == "table")
self.status = status
if not status.scrollvalue then
status.scrollvalue = 0
end
end,
 
["OnWidthSet"] = function(self, width)
local content = self.content
content.width = width
end,
 
["OnHeightSet"] = function(self, height)
local content = self.content
content.height = height
end
}
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent)
local num = AceGUI:GetNextWidgetNum(Type)
 
local scrollframe = CreateFrame("ScrollFrame", nil, frame)
scrollframe:SetPoint("TOPLEFT")
scrollframe:SetPoint("BOTTOMRIGHT")
scrollframe:EnableMouseWheel(true)
scrollframe:SetScript("OnMouseWheel", ScrollFrame_OnMouseWheel)
scrollframe:SetScript("OnSizeChanged", ScrollFrame_OnSizeChanged)
 
local scrollbar = CreateFrame("Slider", ("AceConfigDialogScrollFrame%dScrollBar"):format(num), scrollframe, "UIPanelScrollBarTemplate")
scrollbar:SetPoint("TOPLEFT", scrollframe, "TOPRIGHT", 4, -16)
scrollbar:SetPoint("BOTTOMLEFT", scrollframe, "BOTTOMRIGHT", 4, 16)
scrollbar:SetMinMaxValues(0, 1000)
scrollbar:SetValueStep(1)
scrollbar:SetValue(0)
scrollbar:SetWidth(16)
scrollbar:Hide()
-- set the script as the last step, so it doesn't fire yet
scrollbar:SetScript("OnValueChanged", ScrollBar_OnScrollValueChanged)
 
local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
scrollbg:SetAllPoints(scrollbar)
scrollbg:SetTexture(0, 0, 0, 0.4)
 
--Container Support
local content = CreateFrame("Frame", nil, scrollframe)
content:SetPoint("TOPLEFT")
content:SetPoint("TOPRIGHT")
content:SetHeight(400)
scrollframe:SetScrollChild(content)
 
local widget = {
localstatus = { scrollvalue = 0 },
scrollframe = scrollframe,
scrollbar = scrollbar,
content = content,
frame = frame,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
scrollframe.obj, scrollbar.obj = widget, widget
 
return AceGUI:RegisterAsContainer(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua New file
0,0 → 1,157
--[[-----------------------------------------------------------------------------
DropdownGroup Container
Container controlled by a dropdown on the top.
-------------------------------------------------------------------------------]]
local Type, Version = "DropdownGroup", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local assert, pairs, type = assert, pairs, type
 
-- WoW APIs
local CreateFrame = CreateFrame
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function SelectedGroup(self, event, value)
local group = self.parentgroup
local status = group.status or group.localstatus
status.selected = value
self.parentgroup:Fire("OnGroupSelected", value)
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self.dropdown:SetText("")
self:SetDropdownWidth(200)
self:SetTitle("")
end,
 
["OnRelease"] = function(self)
self.dropdown.list = nil
self.status = nil
for k in pairs(self.localstatus) do
self.localstatus[k] = nil
end
end,
 
["SetTitle"] = function(self, title)
self.titletext:SetText(title)
self.dropdown.frame:ClearAllPoints()
if title and title ~= "" then
self.dropdown.frame:SetPoint("TOPRIGHT", -2, 0)
else
self.dropdown.frame:SetPoint("TOPLEFT", -1, 0)
end
end,
 
["SetGroupList"] = function(self,list,order)
self.dropdown:SetList(list,order)
end,
 
["SetStatusTable"] = function(self, status)
assert(type(status) == "table")
self.status = status
end,
 
["SetGroup"] = function(self,group)
self.dropdown:SetValue(group)
local status = self.status or self.localstatus
status.selected = group
self:Fire("OnGroupSelected", group)
end,
 
["OnWidthSet"] = function(self, width)
local content = self.content
local contentwidth = width - 26
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
end,
 
["OnHeightSet"] = function(self, height)
local content = self.content
local contentheight = height - 63
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end,
 
["LayoutFinished"] = function(self, width, height)
self:SetHeight((height or 0) + 63)
end,
 
["SetDropdownWidth"] = function(self, width)
self.dropdown:SetWidth(width)
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local PaneBackdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
 
local function Constructor()
local frame = CreateFrame("Frame")
frame:SetHeight(100)
frame:SetWidth(100)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
 
local titletext = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
titletext:SetPoint("TOPLEFT", 4, -5)
titletext:SetPoint("TOPRIGHT", -4, -5)
titletext:SetJustifyH("LEFT")
titletext:SetHeight(18)
 
local dropdown = AceGUI:Create("Dropdown")
dropdown.frame:SetParent(frame)
dropdown.frame:SetFrameLevel(dropdown.frame:GetFrameLevel() + 2)
dropdown:SetCallback("OnValueChanged", SelectedGroup)
dropdown.frame:SetPoint("TOPLEFT", -1, 0)
dropdown.frame:Show()
dropdown:SetLabel("")
 
local border = CreateFrame("Frame", nil, frame)
border:SetPoint("TOPLEFT", 0, -26)
border:SetPoint("BOTTOMRIGHT", 0, 3)
border:SetBackdrop(PaneBackdrop)
border:SetBackdropColor(0.1,0.1,0.1,0.5)
border:SetBackdropBorderColor(0.4,0.4,0.4)
 
--Container Support
local content = CreateFrame("Frame", nil, border)
content:SetPoint("TOPLEFT", 10, -10)
content:SetPoint("BOTTOMRIGHT", -10, 10)
 
local widget = {
frame = frame,
localstatus = {},
titletext = titletext,
dropdown = dropdown,
border = border,
content = content,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
dropdown.parentgroup = widget
 
return AceGUI:RegisterAsContainer(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua New file
0,0 → 1,471
--[[ $Id: AceGUIWidget-DropDown-Items.lua 996 2010-12-01 18:34:17Z nevcairiel $ ]]--
 
local AceGUI = LibStub("AceGUI-3.0")
 
-- Lua APIs
local select, assert = select, assert
 
-- WoW APIs
local PlaySound = PlaySound
local CreateFrame = CreateFrame
 
local function fixlevels(parent,...)
local i = 1
local child = select(i, ...)
while child do
child:SetFrameLevel(parent:GetFrameLevel()+1)
fixlevels(child, child:GetChildren())
i = i + 1
child = select(i, ...)
end
end
 
local function fixstrata(strata, parent, ...)
local i = 1
local child = select(i, ...)
parent:SetFrameStrata(strata)
while child do
fixstrata(strata, child, child:GetChildren())
i = i + 1
child = select(i, ...)
end
end
 
-- ItemBase is the base "class" for all dropdown items.
-- Each item has to use ItemBase.Create(widgetType) to
-- create an initial 'self' value.
-- ItemBase will add common functions and ui event handlers.
-- Be sure to keep basic usage when you override functions.
 
local ItemBase = {
-- NOTE: The ItemBase version is added to each item's version number
-- to ensure proper updates on ItemBase changes.
-- Use at least 1000er steps.
version = 1000,
counter = 0,
}
 
function ItemBase.Frame_OnEnter(this)
local self = this.obj
 
if self.useHighlight then
self.highlight:Show()
end
self:Fire("OnEnter")
 
if self.specialOnEnter then
self.specialOnEnter(self)
end
end
 
function ItemBase.Frame_OnLeave(this)
local self = this.obj
 
self.highlight:Hide()
self:Fire("OnLeave")
 
if self.specialOnLeave then
self.specialOnLeave(self)
end
end
 
-- exported, AceGUI callback
function ItemBase.OnAcquire(self)
self.frame:SetToplevel(true)
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
end
 
-- exported, AceGUI callback
function ItemBase.OnRelease(self)
self:SetDisabled(false)
self.pullout = nil
self.frame:SetParent(nil)
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
-- exported
-- NOTE: this is called by a Dropdown-Pullout.
-- Do not call this method directly
function ItemBase.SetPullout(self, pullout)
self.pullout = pullout
 
self.frame:SetParent(nil)
self.frame:SetParent(pullout.itemFrame)
self.parent = pullout.itemFrame
fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren())
end
 
-- exported
function ItemBase.SetText(self, text)
self.text:SetText(text or "")
end
 
-- exported
function ItemBase.GetText(self)
return self.text:GetText()
end
 
-- exported
function ItemBase.SetPoint(self, ...)
self.frame:SetPoint(...)
end
 
-- exported
function ItemBase.Show(self)
self.frame:Show()
end
 
-- exported
function ItemBase.Hide(self)
self.frame:Hide()
end
 
-- exported
function ItemBase.SetDisabled(self, disabled)
self.disabled = disabled
if disabled then
self.useHighlight = false
self.text:SetTextColor(.5, .5, .5)
else
self.useHighlight = true
self.text:SetTextColor(1, 1, 1)
end
end
 
-- exported
-- NOTE: this is called by a Dropdown-Pullout.
-- Do not call this method directly
function ItemBase.SetOnLeave(self, func)
self.specialOnLeave = func
end
 
-- exported
-- NOTE: this is called by a Dropdown-Pullout.
-- Do not call this method directly
function ItemBase.SetOnEnter(self, func)
self.specialOnEnter = func
end
 
function ItemBase.Create(type)
-- NOTE: Most of the following code is copied from AceGUI-3.0/Dropdown widget
local count = AceGUI:GetNextWidgetNum(type)
local frame = CreateFrame("Button", "AceGUI30DropDownItem"..count)
local self = {}
self.frame = frame
frame.obj = self
self.type = type
 
self.useHighlight = true
 
frame:SetHeight(17)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
 
local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
text:SetTextColor(1,1,1)
text:SetJustifyH("LEFT")
text:SetPoint("TOPLEFT",frame,"TOPLEFT",18,0)
text:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-8,0)
self.text = text
 
local highlight = frame:CreateTexture(nil, "OVERLAY")
highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
highlight:SetBlendMode("ADD")
highlight:SetHeight(14)
highlight:ClearAllPoints()
highlight:SetPoint("RIGHT",frame,"RIGHT",-3,0)
highlight:SetPoint("LEFT",frame,"LEFT",5,0)
highlight:Hide()
self.highlight = highlight
 
local check = frame:CreateTexture("OVERLAY")
check:SetWidth(16)
check:SetHeight(16)
check:SetPoint("LEFT",frame,"LEFT",3,-1)
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
check:Hide()
self.check = check
 
local sub = frame:CreateTexture("OVERLAY")
sub:SetWidth(16)
sub:SetHeight(16)
sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
sub:Hide()
self.sub = sub
 
frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
 
self.OnAcquire = ItemBase.OnAcquire
self.OnRelease = ItemBase.OnRelease
 
self.SetPullout = ItemBase.SetPullout
self.GetText = ItemBase.GetText
self.SetText = ItemBase.SetText
self.SetDisabled = ItemBase.SetDisabled
 
self.SetPoint = ItemBase.SetPoint
self.Show = ItemBase.Show
self.Hide = ItemBase.Hide
 
self.SetOnLeave = ItemBase.SetOnLeave
self.SetOnEnter = ItemBase.SetOnEnter
 
return self
end
 
-- Register a dummy LibStub library to retrieve the ItemBase, so other addons can use it.
local IBLib = LibStub:NewLibrary("AceGUI-3.0-DropDown-ItemBase", ItemBase.version)
if IBLib then
IBLib.GetItemBase = function() return ItemBase end
end
 
--[[
Template for items:
 
-- Item:
--
do
local widgetType = "Dropdown-Item-"
local widgetVersion = 1
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
--]]
 
-- Item: Header
-- A single text entry.
-- Special: Different text color and no highlight
do
local widgetType = "Dropdown-Item-Header"
local widgetVersion = 1
 
local function OnEnter(this)
local self = this.obj
self:Fire("OnEnter")
 
if self.specialOnEnter then
self.specialOnEnter(self)
end
end
 
local function OnLeave(this)
local self = this.obj
self:Fire("OnLeave")
 
if self.specialOnLeave then
self.specialOnLeave(self)
end
end
 
-- exported, override
local function SetDisabled(self, disabled)
ItemBase.SetDisabled(self, disabled)
if not disabled then
self.text:SetTextColor(1, 1, 0)
end
end
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
self.SetDisabled = SetDisabled
 
self.frame:SetScript("OnEnter", OnEnter)
self.frame:SetScript("OnLeave", OnLeave)
 
self.text:SetTextColor(1, 1, 0)
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
-- Item: Execute
-- A simple button
do
local widgetType = "Dropdown-Item-Execute"
local widgetVersion = 1
 
local function Frame_OnClick(this, button)
local self = this.obj
if self.disabled then return end
self:Fire("OnClick")
if self.pullout then
self.pullout:Close()
end
end
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
self.frame:SetScript("OnClick", Frame_OnClick)
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
-- Item: Toggle
-- Some sort of checkbox for dropdown menus.
-- Does not close the pullout on click.
do
local widgetType = "Dropdown-Item-Toggle"
local widgetVersion = 3
 
local function UpdateToggle(self)
if self.value then
self.check:Show()
else
self.check:Hide()
end
end
 
local function OnRelease(self)
ItemBase.OnRelease(self)
self:SetValue(nil)
end
 
local function Frame_OnClick(this, button)
local self = this.obj
if self.disabled then return end
self.value = not self.value
if self.value then
PlaySound("igMainMenuOptionCheckBoxOn")
else
PlaySound("igMainMenuOptionCheckBoxOff")
end
UpdateToggle(self)
self:Fire("OnValueChanged", self.value)
end
 
-- exported
local function SetValue(self, value)
self.value = value
UpdateToggle(self)
end
 
-- exported
local function GetValue(self)
return self.value
end
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
self.frame:SetScript("OnClick", Frame_OnClick)
 
self.SetValue = SetValue
self.GetValue = GetValue
self.OnRelease = OnRelease
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
-- Item: Menu
-- Shows a submenu on mouse over
-- Does not close the pullout on click
do
local widgetType = "Dropdown-Item-Menu"
local widgetVersion = 2
 
local function OnEnter(this)
local self = this.obj
self:Fire("OnEnter")
 
if self.specialOnEnter then
self.specialOnEnter(self)
end
 
self.highlight:Show()
 
if not self.disabled and self.submenu then
self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
end
end
 
local function OnHide(this)
local self = this.obj
if self.submenu then
self.submenu:Close()
end
end
 
-- exported
local function SetMenu(self, menu)
assert(menu.type == "Dropdown-Pullout")
self.submenu = menu
end
 
-- exported
local function CloseMenu(self)
self.submenu:Close()
end
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
self.sub:Show()
 
self.frame:SetScript("OnEnter", OnEnter)
self.frame:SetScript("OnHide", OnHide)
 
self.SetMenu = SetMenu
self.CloseMenu = CloseMenu
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
-- Item: Separator
-- A single line to separate items
do
local widgetType = "Dropdown-Item-Separator"
local widgetVersion = 1
 
-- exported, override
local function SetDisabled(self, disabled)
ItemBase.SetDisabled(self, disabled)
self.useHighlight = false
end
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
self.SetDisabled = SetDisabled
 
local line = self.frame:CreateTexture(nil, "OVERLAY")
line:SetHeight(1)
line:SetTexture(.5, .5, .5)
line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
 
self.text:Hide()
 
self.useHighlight = false
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua New file
0,0 → 1,92
--[[-----------------------------------------------------------------------------
Button Widget
Graphical Button.
-------------------------------------------------------------------------------]]
local Type, Version = "Button", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local pairs = pairs
 
-- WoW APIs
local _G = _G
local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Button_OnClick(frame, ...)
AceGUI:ClearFocus()
PlaySound("igMainMenuOption")
frame.obj:Fire("OnClick", ...)
end
 
local function Control_OnEnter(frame)
frame.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(frame)
frame.obj:Fire("OnLeave")
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
-- restore default values
self:SetHeight(24)
self:SetWidth(200)
self:SetDisabled(false)
self:SetText()
end,
 
-- ["OnRelease"] = nil,
 
["SetText"] = function(self, text)
self.text:SetText(text)
end,
 
["SetDisabled"] = function(self, disabled)
self.disabled = disabled
if disabled then
self.frame:Disable()
else
self.frame:Enable()
end
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate2")
frame:Hide()
 
frame:EnableMouse(true)
frame:SetScript("OnClick", Button_OnClick)
frame:SetScript("OnEnter", Control_OnEnter)
frame:SetScript("OnLeave", Control_OnLeave)
 
local text = frame:GetFontString()
text:ClearAllPoints()
text:SetPoint("TOPLEFT", 15, -1)
text:SetPoint("BOTTOMRIGHT", -15, 1)
text:SetJustifyV("MIDDLE")
 
local widget = {
text = text,
frame = frame,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
 
return AceGUI:RegisterAsWidget(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua New file
0,0 → 1,678
--[[-----------------------------------------------------------------------------
TreeGroup Container
Container that uses a tree control to switch between groups.
-------------------------------------------------------------------------------]]
local Type, Version = "TreeGroup", 33
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
local math_min, math_max, floor = math.min, math.max, floor
local select, tremove, unpack = select, table.remove, unpack
 
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: GameTooltip, FONT_COLOR_CODE_CLOSE
 
-- Recycling functions
local new, del
do
local pool = setmetatable({},{__mode='k'})
function new()
local t = next(pool)
if t then
pool[t] = nil
return t
else
return {}
end
end
function del(t)
for k in pairs(t) do
t[k] = nil
end
pool[t] = true
end
end
 
local DEFAULT_TREE_WIDTH = 175
local DEFAULT_TREE_SIZABLE = true
 
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
local function GetButtonUniqueValue(line)
local parent = line.parent
if parent and parent.value then
return GetButtonUniqueValue(parent).."\001"..line.value
else
return line.value
end
end
 
local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
local self = button.obj
local toggle = button.toggle
local frame = self.frame
local text = treeline.text or ""
local icon = treeline.icon
local iconCoords = treeline.iconCoords
local level = treeline.level
local value = treeline.value
local uniquevalue = treeline.uniquevalue
local disabled = treeline.disabled
 
button.treeline = treeline
button.value = value
button.uniquevalue = uniquevalue
if selected then
button:LockHighlight()
button.selected = true
else
button:UnlockHighlight()
button.selected = false
end
local normalTexture = button:GetNormalTexture()
local line = button.line
button.level = level
if ( level == 1 ) then
button:SetNormalFontObject("GameFontNormal")
button:SetHighlightFontObject("GameFontHighlight")
button.text:SetPoint("LEFT", (icon and 16 or 0) + 8, 2)
else
button:SetNormalFontObject("GameFontHighlightSmall")
button:SetHighlightFontObject("GameFontHighlightSmall")
button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
end
 
if disabled then
button:EnableMouse(false)
button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
else
button.text:SetText(text)
button:EnableMouse(true)
end
 
if icon then
button.icon:SetTexture(icon)
button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
else
button.icon:SetTexture(nil)
end
 
if iconCoords then
button.icon:SetTexCoord(unpack(iconCoords))
else
button.icon:SetTexCoord(0, 1, 0, 1)
end
 
if canExpand then
if not isExpanded then
toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP")
toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-DOWN")
else
toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP")
toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN")
end
toggle:Show()
else
toggle:Hide()
end
end
 
local function ShouldDisplayLevel(tree)
local result = false
for k, v in ipairs(tree) do
if v.children == nil and v.visible ~= false then
result = true
elseif v.children then
result = result or ShouldDisplayLevel(v.children)
end
if result then return result end
end
return false
end
 
local function addLine(self, v, tree, level, parent)
local line = new()
line.value = v.value
line.text = v.text
line.icon = v.icon
line.iconCoords = v.iconCoords
line.disabled = v.disabled
line.tree = tree
line.level = level
line.parent = parent
line.visible = v.visible
line.uniquevalue = GetButtonUniqueValue(line)
if v.children then
line.hasChildren = true
else
line.hasChildren = nil
end
self.lines[#self.lines+1] = line
return line
end
 
--fire an update after one frame to catch the treeframes height
local function FirstFrameUpdate(frame)
local self = frame.obj
frame:SetScript("OnUpdate", nil)
self:RefreshTree()
end
 
local function BuildUniqueValue(...)
local n = select('#', ...)
if n == 1 then
return ...
else
return (...).."\001"..BuildUniqueValue(select(2,...))
end
end
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Expand_OnClick(frame)
local button = frame.button
local self = button.obj
local status = (self.status or self.localstatus).groups
status[button.uniquevalue] = not status[button.uniquevalue]
self:RefreshTree()
end
 
local function Button_OnClick(frame)
local self = frame.obj
self:Fire("OnClick", frame.uniquevalue, frame.selected)
if not frame.selected then
self:SetSelected(frame.uniquevalue)
frame.selected = true
frame:LockHighlight()
self:RefreshTree()
end
AceGUI:ClearFocus()
end
 
local function Button_OnDoubleClick(button)
local self = button.obj
local status = self.status or self.localstatus
local status = (self.status or self.localstatus).groups
status[button.uniquevalue] = not status[button.uniquevalue]
self:RefreshTree()
end
 
local function Button_OnEnter(frame)
local self = frame.obj
self:Fire("OnButtonEnter", frame.uniquevalue, frame)
 
if self.enabletooltips then
GameTooltip:SetOwner(frame, "ANCHOR_NONE")
GameTooltip:SetPoint("LEFT",frame,"RIGHT")
GameTooltip:SetText(frame.text:GetText() or "", 1, .82, 0, 1)
 
GameTooltip:Show()
end
end
 
local function Button_OnLeave(frame)
local self = frame.obj
self:Fire("OnButtonLeave", frame.uniquevalue, frame)
 
if self.enabletooltips then
GameTooltip:Hide()
end
end
 
local function OnScrollValueChanged(frame, value)
if frame.obj.noupdate then return end
local self = frame.obj
local status = self.status or self.localstatus
status.scrollvalue = value
self:RefreshTree()
AceGUI:ClearFocus()
end
 
local function Tree_OnSizeChanged(frame)
frame.obj:RefreshTree()
end
 
local function Tree_OnMouseWheel(frame, delta)
local self = frame.obj
if self.showscroll then
local scrollbar = self.scrollbar
local min, max = scrollbar:GetMinMaxValues()
local value = scrollbar:GetValue()
local newvalue = math_min(max,math_max(min,value - delta))
if value ~= newvalue then
scrollbar:SetValue(newvalue)
end
end
end
 
local function Dragger_OnLeave(frame)
frame:SetBackdropColor(1, 1, 1, 0)
end
 
local function Dragger_OnEnter(frame)
frame:SetBackdropColor(1, 1, 1, 0.8)
end
 
local function Dragger_OnMouseDown(frame)
local treeframe = frame:GetParent()
treeframe:StartSizing("RIGHT")
end
 
local function Dragger_OnMouseUp(frame)
local treeframe = frame:GetParent()
local self = treeframe.obj
local frame = treeframe:GetParent()
treeframe:StopMovingOrSizing()
--treeframe:SetScript("OnUpdate", nil)
treeframe:SetUserPlaced(false)
--Without this :GetHeight will get stuck on the current height, causing the tree contents to not resize
treeframe:SetHeight(0)
treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0)
treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
 
local status = self.status or self.localstatus
status.treewidth = treeframe:GetWidth()
 
treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
-- recalculate the content width
treeframe.obj:OnWidthSet(status.fullwidth)
-- update the layout of the content
treeframe.obj:DoLayout()
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:SetTreeWidth(DEFAULT_TREE_WIDTH, DEFAULT_TREE_SIZABLE)
self:EnableButtonTooltips(true)
end,
 
["OnRelease"] = function(self)
self.status = nil
for k, v in pairs(self.localstatus) do
if k == "groups" then
for k2 in pairs(v) do
v[k2] = nil
end
else
self.localstatus[k] = nil
end
end
self.localstatus.scrollvalue = 0
self.localstatus.treewidth = DEFAULT_TREE_WIDTH
self.localstatus.treesizable = DEFAULT_TREE_SIZABLE
end,
 
["EnableButtonTooltips"] = function(self, enable)
self.enabletooltips = enable
end,
 
["CreateButton"] = function(self)
local num = AceGUI:GetNextWidgetNum("TreeGroupButton")
local button = CreateFrame("Button", ("AceGUI30TreeButton%d"):format(num), self.treeframe, "OptionsListButtonTemplate")
button.obj = self
 
local icon = button:CreateTexture(nil, "OVERLAY")
icon:SetWidth(14)
icon:SetHeight(14)
button.icon = icon
 
button:SetScript("OnClick",Button_OnClick)
button:SetScript("OnDoubleClick", Button_OnDoubleClick)
button:SetScript("OnEnter",Button_OnEnter)
button:SetScript("OnLeave",Button_OnLeave)
 
button.toggle.button = button
button.toggle:SetScript("OnClick",Expand_OnClick)
 
return button
end,
 
["SetStatusTable"] = function(self, status)
assert(type(status) == "table")
self.status = status
if not status.groups then
status.groups = {}
end
if not status.scrollvalue then
status.scrollvalue = 0
end
if not status.treewidth then
status.treewidth = DEFAULT_TREE_WIDTH
end
if status.treesizable == nil then
status.treesizable = DEFAULT_TREE_SIZABLE
end
self:SetTreeWidth(status.treewidth,status.treesizable)
self:RefreshTree()
end,
 
--sets the tree to be displayed
["SetTree"] = function(self, tree, filter)
self.filter = filter
if tree then
assert(type(tree) == "table")
end
self.tree = tree
self:RefreshTree()
end,
 
["BuildLevel"] = function(self, tree, level, parent)
local groups = (self.status or self.localstatus).groups
local hasChildren = self.hasChildren
 
for i, v in ipairs(tree) do
if v.children then
if not self.filter or ShouldDisplayLevel(v.children) then
local line = addLine(self, v, tree, level, parent)
if groups[line.uniquevalue] then
self:BuildLevel(v.children, level+1, line)
end
end
elseif v.visible ~= false or not self.filter then
addLine(self, v, tree, level, parent)
end
end
end,
 
["RefreshTree"] = function(self)
local buttons = self.buttons
local lines = self.lines
 
for i, v in ipairs(buttons) do
v:Hide()
end
while lines[1] do
local t = tremove(lines)
for k in pairs(t) do
t[k] = nil
end
del(t)
end
 
if not self.tree then return end
--Build the list of visible entries from the tree and status tables
local status = self.status or self.localstatus
local groupstatus = status.groups
local tree = self.tree
 
local treeframe = self.treeframe
 
self:BuildLevel(tree, 1)
 
local numlines = #lines
 
local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
if maxlines <= 0 then return end
 
local first, last
 
if numlines <= maxlines then
--the whole tree fits in the frame
status.scrollvalue = 0
self:ShowScroll(false)
first, last = 1, numlines
else
self:ShowScroll(true)
--scrolling will be needed
self.noupdate = true
self.scrollbar:SetMinMaxValues(0, numlines - maxlines)
--check if we are scrolled down too far
if numlines - status.scrollvalue < maxlines then
status.scrollvalue = numlines - maxlines
end
if self.scrollbar:GetValue() ~= status.scrollvalue then
self.scrollbar:SetValue(status.scrollvalue)
end
self.noupdate = nil
first, last = status.scrollvalue+1, status.scrollvalue + maxlines
end
 
local buttonnum = 1
for i = first, last do
local line = lines[i]
local button = buttons[buttonnum]
if not button then
button = self:CreateButton()
 
buttons[buttonnum] = button
button:SetParent(treeframe)
button:SetFrameLevel(treeframe:GetFrameLevel()+1)
button:ClearAllPoints()
if buttonnum == 1 then
if self.showscroll then
button:SetPoint("TOPRIGHT", -22, -10)
button:SetPoint("TOPLEFT", 0, -10)
else
button:SetPoint("TOPRIGHT", 0, -10)
button:SetPoint("TOPLEFT", 0, -10)
end
else
button:SetPoint("TOPRIGHT", buttons[buttonnum-1], "BOTTOMRIGHT",0,0)
button:SetPoint("TOPLEFT", buttons[buttonnum-1], "BOTTOMLEFT",0,0)
end
end
 
UpdateButton(button, line, status.selected == line.uniquevalue, line.hasChildren, groupstatus[line.uniquevalue] )
button:Show()
buttonnum = buttonnum + 1
end
end,
 
["SetSelected"] = function(self, value)
local status = self.status or self.localstatus
if status.selected ~= value then
status.selected = value
self:Fire("OnGroupSelected", value)
end
end,
 
["Select"] = function(self, uniquevalue, ...)
self.filter = false
local status = self.status or self.localstatus
local groups = status.groups
for i = 1, select('#', ...) do
groups[BuildUniqueValue(select(i, ...))] = true
end
status.selected = uniquevalue
self:RefreshTree()
self:Fire("OnGroupSelected", uniquevalue)
end,
 
["SelectByPath"] = function(self, ...)
self:Select(BuildUniqueValue(...), ...)
end,
 
["SelectByValue"] = function(self, uniquevalue)
self:Select(uniquevalue, ("\001"):split(uniquevalue))
end,
 
["ShowScroll"] = function(self, show)
self.showscroll = show
if show then
self.scrollbar:Show()
if self.buttons[1] then
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
end
else
self.scrollbar:Hide()
if self.buttons[1] then
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
end
end
end,
 
["OnWidthSet"] = function(self, width)
local content = self.content
local treeframe = self.treeframe
local status = self.status or self.localstatus
status.fullwidth = width
 
local contentwidth = width - status.treewidth - 20
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
 
local maxtreewidth = math_min(400, width - 50)
 
if maxtreewidth > 100 and status.treewidth > maxtreewidth then
self:SetTreeWidth(maxtreewidth, status.treesizable)
end
treeframe:SetMaxResize(maxtreewidth, 1600)
end,
 
["OnHeightSet"] = function(self, height)
local content = self.content
local contentheight = height - 20
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end,
 
["SetTreeWidth"] = function(self, treewidth, resizable)
if not resizable then
if type(treewidth) == 'number' then
resizable = false
elseif type(treewidth) == 'boolean' then
resizable = treewidth
treewidth = DEFAULT_TREE_WIDTH
else
resizable = false
treewidth = DEFAULT_TREE_WIDTH
end
end
self.treeframe:SetWidth(treewidth)
self.dragger:EnableMouse(resizable)
 
local status = self.status or self.localstatus
status.treewidth = treewidth
status.treesizable = resizable
 
-- recalculate the content width
if status.fullwidth then
self:OnWidthSet(status.fullwidth)
end
end,
 
["GetTreeWidth"] = function(self)
local status = self.status or self.localstatus
return status.treewidth or DEFAULT_TREE_WIDTH
end,
 
["LayoutFinished"] = function(self, width, height)
if self.noAutoHeight then return end
self:SetHeight((height or 0) + 20)
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local PaneBackdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
 
local DraggerBackdrop = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = nil,
tile = true, tileSize = 16, edgeSize = 0,
insets = { left = 3, right = 3, top = 7, bottom = 7 }
}
 
local function Constructor()
local num = AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Frame", nil, UIParent)
 
local treeframe = CreateFrame("Frame", nil, frame)
treeframe:SetPoint("TOPLEFT")
treeframe:SetPoint("BOTTOMLEFT")
treeframe:SetWidth(DEFAULT_TREE_WIDTH)
treeframe:EnableMouseWheel(true)
treeframe:SetBackdrop(PaneBackdrop)
treeframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
treeframe:SetBackdropBorderColor(0.4, 0.4, 0.4)
treeframe:SetResizable(true)
treeframe:SetMinResize(100, 1)
treeframe:SetMaxResize(400, 1600)
treeframe:SetScript("OnUpdate", FirstFrameUpdate)
treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)
 
local dragger = CreateFrame("Frame", nil, treeframe)
dragger:SetWidth(8)
dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
dragger:SetBackdrop(DraggerBackdrop)
dragger:SetBackdropColor(1, 1, 1, 0)
dragger:SetScript("OnEnter", Dragger_OnEnter)
dragger:SetScript("OnLeave", Dragger_OnLeave)
dragger:SetScript("OnMouseDown", Dragger_OnMouseDown)
dragger:SetScript("OnMouseUp", Dragger_OnMouseUp)
 
local scrollbar = CreateFrame("Slider", ("AceConfigDialogTreeGroup%dScrollBar"):format(num), treeframe, "UIPanelScrollBarTemplate")
scrollbar:SetScript("OnValueChanged", nil)
scrollbar:SetPoint("TOPRIGHT", -10, -26)
scrollbar:SetPoint("BOTTOMRIGHT", -10, 26)
scrollbar:SetMinMaxValues(0,0)
scrollbar:SetValueStep(1)
scrollbar:SetValue(0)
scrollbar:SetWidth(16)
scrollbar:SetScript("OnValueChanged", OnScrollValueChanged)
 
local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
scrollbg:SetAllPoints(scrollbar)
scrollbg:SetTexture(0,0,0,0.4)
 
local border = CreateFrame("Frame",nil,frame)
border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
border:SetPoint("BOTTOMRIGHT")
border:SetBackdrop(PaneBackdrop)
border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
border:SetBackdropBorderColor(0.4, 0.4, 0.4)
 
--Container Support
local content = CreateFrame("Frame", nil, border)
content:SetPoint("TOPLEFT", 10, -10)
content:SetPoint("BOTTOMRIGHT", -10, 10)
 
local widget = {
frame = frame,
lines = {},
levels = {},
buttons = {},
hasChildren = {},
localstatus = { groups = {}, scrollvalue = 0 },
filter = false,
treeframe = treeframe,
dragger = dragger,
scrollbar = scrollbar,
border = border,
content = content,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
treeframe.obj, dragger.obj, scrollbar.obj = widget, widget, widget
 
return AceGUI:RegisterAsContainer(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua New file
0,0 → 1,186
--[[-----------------------------------------------------------------------------
ColorPicker Widget
-------------------------------------------------------------------------------]]
local Type, Version = "ColorPicker", 20
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local pairs = pairs
 
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame
 
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
local function ColorCallback(self, r, g, b, a, isAlpha)
if not self.HasAlpha then
a = 1
end
self:SetColor(r, g, b, a)
if ColorPickerFrame:IsVisible() then
--colorpicker is still open
self:Fire("OnValueChanged", r, g, b, a)
else
--colorpicker is closed, color callback is first, ignore it,
--alpha callback is the final call after it closes so confirm now
if isAlpha then
self:Fire("OnValueConfirmed", r, g, b, a)
end
end
end
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Control_OnEnter(frame)
frame.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(frame)
frame.obj:Fire("OnLeave")
end
 
local function ColorSwatch_OnClick(frame)
HideUIPanel(ColorPickerFrame)
local self = frame.obj
if not self.disabled then
ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
 
ColorPickerFrame.func = function()
local r, g, b = ColorPickerFrame:GetColorRGB()
local a = 1 - OpacitySliderFrame:GetValue()
ColorCallback(self, r, g, b, a)
end
 
ColorPickerFrame.hasOpacity = self.HasAlpha
ColorPickerFrame.opacityFunc = function()
local r, g, b = ColorPickerFrame:GetColorRGB()
local a = 1 - OpacitySliderFrame:GetValue()
ColorCallback(self, r, g, b, a, true)
end
 
local r, g, b, a = self.r, self.g, self.b, self.a
if self.HasAlpha then
ColorPickerFrame.opacity = 1 - (a or 0)
end
ColorPickerFrame:SetColorRGB(r, g, b)
 
ColorPickerFrame.cancelFunc = function()
ColorCallback(self, r, g, b, a, true)
end
 
ShowUIPanel(ColorPickerFrame)
end
AceGUI:ClearFocus()
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:SetHeight(24)
self:SetWidth(200)
self:SetHasAlpha(false)
self:SetColor(0, 0, 0, 1)
self:SetDisabled(nil)
self:SetLabel(nil)
end,
 
-- ["OnRelease"] = nil,
 
["SetLabel"] = function(self, text)
self.text:SetText(text)
end,
 
["SetColor"] = function(self, r, g, b, a)
self.r = r
self.g = g
self.b = b
self.a = a or 1
self.colorSwatch:SetVertexColor(r, g, b, a)
end,
 
["SetHasAlpha"] = function(self, HasAlpha)
self.HasAlpha = HasAlpha
end,
 
["SetDisabled"] = function(self, disabled)
self.disabled = disabled
if self.disabled then
self.frame:Disable()
self.text:SetTextColor(0.5, 0.5, 0.5)
else
self.frame:Enable()
self.text:SetTextColor(1, 1, 1)
end
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local frame = CreateFrame("Button", nil, UIParent)
frame:Hide()
 
frame:EnableMouse(true)
frame:SetScript("OnEnter", Control_OnEnter)
frame:SetScript("OnLeave", Control_OnLeave)
frame:SetScript("OnClick", ColorSwatch_OnClick)
 
local colorSwatch = frame:CreateTexture(nil, "OVERLAY")
colorSwatch:SetWidth(19)
colorSwatch:SetHeight(19)
colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch")
colorSwatch:SetPoint("LEFT")
 
local texture = frame:CreateTexture(nil, "BACKGROUND")
texture:SetWidth(16)
texture:SetHeight(16)
texture:SetTexture(1, 1, 1)
texture:SetPoint("CENTER", colorSwatch)
texture:Show()
 
local checkers = frame:CreateTexture(nil, "BACKGROUND")
checkers:SetWidth(14)
checkers:SetHeight(14)
checkers:SetTexture("Tileset\\Generic\\Checkers")
checkers:SetTexCoord(.25, 0, 0.5, .25)
checkers:SetDesaturated(true)
checkers:SetVertexColor(1, 1, 1, 0.75)
checkers:SetPoint("CENTER", colorSwatch)
checkers:Show()
 
local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlight")
text:SetHeight(24)
text:SetJustifyH("LEFT")
text:SetTextColor(1, 1, 1)
text:SetPoint("LEFT", colorSwatch, "RIGHT", 2, 0)
text:SetPoint("RIGHT")
 
--local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
--highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
--highlight:SetBlendMode("ADD")
--highlight:SetAllPoints(frame)
 
local widget = {
colorSwatch = colorSwatch,
text = text,
frame = frame,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
 
return AceGUI:RegisterAsWidget(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua New file
0,0 → 1,101
--[[-----------------------------------------------------------------------------
InteractiveLabel Widget
-------------------------------------------------------------------------------]]
local Type, Version = "InteractiveLabel", 20
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local select, pairs = select, pairs
 
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: GameFontHighlightSmall
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Control_OnEnter(frame)
frame.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(frame)
frame.obj:Fire("OnLeave")
end
 
local function Label_OnClick(frame, button)
frame.obj:Fire("OnClick", button)
AceGUI:ClearFocus()
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:LabelOnAcquire()
self:SetHighlight()
self:SetHighlightTexCoord()
self:SetDisabled(false)
end,
 
-- ["OnRelease"] = nil,
 
["SetHighlight"] = function(self, ...)
self.highlight:SetTexture(...)
end,
 
["SetHighlightTexCoord"] = function(self, ...)
local c = select("#", ...)
if c == 4 or c == 8 then
self.highlight:SetTexCoord(...)
else
self.highlight:SetTexCoord(0, 1, 0, 1)
end
end,
 
["SetDisabled"] = function(self,disabled)
self.disabled = disabled
if disabled then
self.frame:EnableMouse(false)
self.label:SetTextColor(0.5, 0.5, 0.5)
else
self.frame:EnableMouse(true)
self.label:SetTextColor(1, 1, 1)
end
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
-- create a Label type that we will hijack
local label = AceGUI:Create("Label")
 
local frame = label.frame
frame:EnableMouse(true)
frame:SetScript("OnEnter", Control_OnEnter)
frame:SetScript("OnLeave", Control_OnLeave)
frame:SetScript("OnMouseDown", Label_OnClick)
 
local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
highlight:SetTexture(nil)
highlight:SetAllPoints()
highlight:SetBlendMode("ADD")
 
label.highlight = highlight
label.type = Type
label.LabelOnAcquire = label.OnAcquire
for method, func in pairs(methods) do
label[method] = func
end
 
return label
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
 
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua New file
0,0 → 1,162
--[[-----------------------------------------------------------------------------
Label Widget
Displays text and optionally an icon.
-------------------------------------------------------------------------------]]
local Type, Version = "Label", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local max, select, pairs = math.max, select, pairs
 
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: GameFontHighlightSmall
 
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
 
local function UpdateImageAnchor(self)
if self.resizing then return end
local frame = self.frame
local width = frame.width or frame:GetWidth() or 0
local image = self.image
local label = self.label
local height
 
label:ClearAllPoints()
image:ClearAllPoints()
 
if self.imageshown then
local imagewidth = image:GetWidth()
if (width - imagewidth) < 200 or (label:GetText() or "") == "" then
-- image goes on top centered when less than 200 width for the text, or if there is no text
image:SetPoint("TOP")
label:SetPoint("TOP", image, "BOTTOM")
label:SetPoint("LEFT")
label:SetWidth(width)
height = image:GetHeight() + label:GetHeight()
else
-- image on the left
image:SetPoint("TOPLEFT")
label:SetPoint("TOPLEFT", image, "TOPRIGHT", 4, 0)
label:SetWidth(width - imagewidth - 4)
height = max(image:GetHeight(), label:GetHeight())
end
else
-- no image shown
label:SetPoint("TOPLEFT")
label:SetWidth(width)
height = label:GetHeight()
end
 
self.resizing = true
frame:SetHeight(height)
frame.height = height
self.resizing = nil
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
-- set the flag to stop constant size updates
self.resizing = true
-- height is set dynamically by the text and image size
self:SetWidth(200)
self:SetText()
self:SetImage(nil)
self:SetImageSize(16, 16)
self:SetColor()
self:SetFontObject()
 
-- reset the flag
self.resizing = nil
-- run the update explicitly
UpdateImageAnchor(self)
end,
 
-- ["OnRelease"] = nil,
 
["OnWidthSet"] = function(self, width)
UpdateImageAnchor(self)
end,
 
["SetText"] = function(self, text)
self.label:SetText(text)
UpdateImageAnchor(self)
end,
 
["SetColor"] = function(self, r, g, b)
if not (r and g and b) then
r, g, b = 1, 1, 1
end
self.label:SetVertexColor(r, g, b)
end,
 
["SetImage"] = function(self, path, ...)
local image = self.image
image:SetTexture(path)
 
if image:GetTexture() then
self.imageshown = true
local n = select("#", ...)
if n == 4 or n == 8 then
image:SetTexCoord(...)
else
image:SetTexCoord(0, 1, 0, 1)
end
else
self.imageshown = nil
end
UpdateImageAnchor(self)
end,
 
["SetFont"] = function(self, font, height, flags)
self.label:SetFont(font, height, flags)
end,
 
["SetFontObject"] = function(self, font)
self:SetFont((font or GameFontHighlightSmall):GetFont())
end,
 
["SetImageSize"] = function(self, width, height)
self.image:SetWidth(width)
self.image:SetHeight(height)
UpdateImageAnchor(self)
end,
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent)
frame:Hide()
 
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlightSmall")
label:SetJustifyH("LEFT")
label:SetJustifyV("TOP")
 
local image = frame:CreateTexture(nil, "BACKGROUND")
 
-- create widget
local widget = {
label = label,
image = image,
frame = frame,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
 
return AceGUI:RegisterAsWidget(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua New file
0,0 → 1,333
local Type, Version = "MultiLineEditBox", 25
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local pairs = pairs
 
-- WoW APIs
local GetCursorInfo, GetSpellInfo, ClearCursor = GetCursorInfo, GetSpellInfo, ClearCursor
local CreateFrame, UIParent = CreateFrame, UIParent
local _G = _G
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: ACCEPT, ChatFontNormal
 
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
local function Layout(self)
self:SetHeight(self.numlines * 14 + (self.disablebutton and 19 or 41) + self.labelHeight)
 
if self.labelHeight == 0 then
self.scrollBar:SetPoint("TOP", self.frame, "TOP", 0, -23)
else
self.scrollBar:SetPoint("TOP", self.label, "BOTTOM", 0, -19)
end
 
if self.disablebutton then
self.scrollBar:SetPoint("BOTTOM", self.frame, "BOTTOM", 0, 21)
self.scrollBG:SetPoint("BOTTOMLEFT", 0, 4)
else
self.scrollBar:SetPoint("BOTTOM", self.button, "TOP", 0, 18)
self.scrollBG:SetPoint("BOTTOMLEFT", self.button, "TOPLEFT")
end
end
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function OnClick(self) -- Button
self = self.obj
self.editBox:ClearFocus()
if not self:Fire("OnEnterPressed", self.editBox:GetText()) then
self.button:Disable()
end
end
 
local function OnCursorChanged(self, _, y, _, cursorHeight) -- EditBox
self, y = self.obj.scrollFrame, -y
local offset = self:GetVerticalScroll()
if y < offset then
self:SetVerticalScroll(y)
else
y = y + cursorHeight - self:GetHeight()
if y > offset then
self:SetVerticalScroll(y)
end
end
end
 
local function OnEditFocusLost(self) -- EditBox
self:HighlightText(0, 0)
end
 
local function OnEnter(self) -- EditBox / ScrollFrame
self = self.obj
if not self.entered then
self.entered = true
self:Fire("OnEnter")
end
end
 
local function OnLeave(self) -- EditBox / ScrollFrame
self = self.obj
if self.entered then
self.entered = nil
self:Fire("OnLeave")
end
end
 
local function OnMouseUp(self) -- ScrollFrame
self = self.obj.editBox
self:SetFocus()
self:SetCursorPosition(self:GetNumLetters())
end
 
local function OnReceiveDrag(self) -- EditBox / ScrollFrame
local type, id, info = GetCursorInfo()
if type == "spell" then
info = GetSpellInfo(id, info)
elseif type ~= "item" then
return
end
ClearCursor()
self = self.obj
local editBox = self.editBox
if not editBox:HasFocus() then
editBox:SetFocus()
editBox:SetCursorPosition(editBox:GetNumLetters())
end
editBox:Insert(info)
self.button:Enable()
end
 
local function OnSizeChanged(self, width, height) -- ScrollFrame
self.obj.editBox:SetWidth(width)
end
 
local function OnTextChanged(self, userInput) -- EditBox
if userInput then
self = self.obj
self:Fire("OnTextChanged", self.editBox:GetText())
self.button:Enable()
end
end
 
local function OnTextSet(self) -- EditBox
self:HighlightText(0, 0)
self:SetCursorPosition(self:GetNumLetters())
self:SetCursorPosition(0)
self.obj.button:Disable()
end
 
local function OnVerticalScroll(self, offset) -- ScrollFrame
local editBox = self.obj.editBox
editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight())
end
 
local function OnShowFocus(frame)
frame.obj.editBox:SetFocus()
frame:SetScript("OnShow", nil)
end
 
local function OnFocusGained(frame)
AceGUI:SetFocus(frame.obj)
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self.editBox:SetText("")
self:SetDisabled(false)
self:SetWidth(200)
self:DisableButton(false)
self:SetNumLines()
self.entered = nil
self:SetMaxLetters(0)
end,
 
["OnRelease"] = function(self)
self:ClearFocus()
end,
 
["SetDisabled"] = function(self, disabled)
local editBox = self.editBox
if disabled then
editBox:ClearFocus()
editBox:EnableMouse(false)
editBox:SetTextColor(0.5, 0.5, 0.5)
self.label:SetTextColor(0.5, 0.5, 0.5)
self.scrollFrame:EnableMouse(false)
self.button:Disable()
else
editBox:EnableMouse(true)
editBox:SetTextColor(1, 1, 1)
self.label:SetTextColor(1, 0.82, 0)
self.scrollFrame:EnableMouse(true)
end
end,
 
["SetLabel"] = function(self, text)
if text and text ~= "" then
self.label:SetText(text)
if self.labelHeight ~= 10 then
self.labelHeight = 10
self.label:Show()
end
elseif self.labelHeight ~= 0 then
self.labelHeight = 0
self.label:Hide()
end
Layout(self)
end,
 
["SetNumLines"] = function(self, value)
if not value or value < 4 then
value = 4
end
self.numlines = value
Layout(self)
end,
 
["SetText"] = function(self, text)
self.editBox:SetText(text)
end,
 
["GetText"] = function(self)
return self.editBox:GetText()
end,
 
["SetMaxLetters"] = function (self, num)
self.editBox:SetMaxLetters(num or 0)
end,
 
["DisableButton"] = function(self, disabled)
self.disablebutton = disabled
if disabled then
self.button:Hide()
else
self.button:Show()
end
Layout(self)
end,
 
["ClearFocus"] = function(self)
self.editBox:ClearFocus()
self.frame:SetScript("OnShow", nil)
end,
 
["SetFocus"] = function(self)
self.editBox:SetFocus()
if not self.frame:IsShown() then
self.frame:SetScript("OnShow", OnShowFocus)
end
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local backdrop = {
bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], edgeSize = 16,
insets = { left = 4, right = 3, top = 4, bottom = 3 }
}
 
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent)
frame:Hide()
 
local widgetNum = AceGUI:GetNextWidgetNum(Type)
 
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
label:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, -4)
label:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, -4)
label:SetJustifyH("LEFT")
label:SetText(ACCEPT)
label:SetHeight(10)
 
local button = CreateFrame("Button", ("%s%dButton"):format(Type, widgetNum), frame, "UIPanelButtonTemplate2")
button:SetPoint("BOTTOMLEFT", 0, 4)
button:SetHeight(22)
button:SetWidth(label:GetStringWidth() + 24)
button:SetText(ACCEPT)
button:SetScript("OnClick", OnClick)
button:Disable()
 
local text = button:GetFontString()
text:ClearAllPoints()
text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
text:SetJustifyV("MIDDLE")
 
local scrollBG = CreateFrame("Frame", nil, frame)
scrollBG:SetBackdrop(backdrop)
scrollBG:SetBackdropColor(0, 0, 0)
scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
 
local scrollFrame = CreateFrame("ScrollFrame", ("%s%dScrollFrame"):format(Type, widgetNum), frame, "UIPanelScrollFrameTemplate")
 
local scrollBar = _G[scrollFrame:GetName() .. "ScrollBar"]
scrollBar:ClearAllPoints()
scrollBar:SetPoint("TOP", label, "BOTTOM", 0, -19)
scrollBar:SetPoint("BOTTOM", button, "TOP", 0, 18)
scrollBar:SetPoint("RIGHT", frame, "RIGHT")
 
scrollBG:SetPoint("TOPRIGHT", scrollBar, "TOPLEFT", 0, 19)
scrollBG:SetPoint("BOTTOMLEFT", button, "TOPLEFT")
 
scrollFrame:SetPoint("TOPLEFT", scrollBG, "TOPLEFT", 5, -6)
scrollFrame:SetPoint("BOTTOMRIGHT", scrollBG, "BOTTOMRIGHT", -4, 4)
scrollFrame:SetScript("OnEnter", OnEnter)
scrollFrame:SetScript("OnLeave", OnLeave)
scrollFrame:SetScript("OnMouseUp", OnMouseUp)
scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag)
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll)
 
local editBox = CreateFrame("EditBox", nil, scrollFrame)
editBox:SetAllPoints()
editBox:SetFontObject(ChatFontNormal)
editBox:SetMultiLine(true)
editBox:EnableMouse(true)
editBox:SetAutoFocus(false)
editBox:SetCountInvisibleLetters(false)
editBox:SetScript("OnCursorChanged", OnCursorChanged)
editBox:SetScript("OnEditFocusLost", OnEditFocusLost)
editBox:SetScript("OnEnter", OnEnter)
editBox:SetScript("OnEscapePressed", editBox.ClearFocus)
editBox:SetScript("OnLeave", OnLeave)
editBox:SetScript("OnMouseDown", OnReceiveDrag)
editBox:SetScript("OnReceiveDrag", OnReceiveDrag)
editBox:SetScript("OnTextChanged", OnTextChanged)
editBox:SetScript("OnTextSet", OnTextSet)
editBox:SetScript("OnEditFocusGained", OnFocusGained)
 
 
scrollFrame:SetScrollChild(editBox)
 
local widget = {
button = button,
editBox = editBox,
frame = frame,
label = label,
labelHeight = 10,
numlines = 4,
scrollBar = scrollBar,
scrollBG = scrollBG,
scrollFrame = scrollFrame,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
button.obj, editBox.obj, scrollFrame.obj = widget, widget, widget
 
return AceGUI:RegisterAsWidget(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua New file
0,0 → 1,281
--[[-----------------------------------------------------------------------------
Slider Widget
Graphical Slider, like, for Range values.
-------------------------------------------------------------------------------]]
local Type, Version = "Slider", 20
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local min, max, floor = math.min, math.max, math.floor
local tonumber, pairs = tonumber, pairs
 
-- WoW APIs
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: GameFontHighlightSmall
 
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
local function UpdateText(self)
local value = self.value or 0
if self.ispercent then
self.editbox:SetText(("%s%%"):format(floor(value * 1000 + 0.5) / 10))
else
self.editbox:SetText(floor(value * 100 + 0.5) / 100)
end
end
 
local function UpdateLabels(self)
local min, max = (self.min or 0), (self.max or 100)
if self.ispercent then
self.lowtext:SetFormattedText("%s%%", (min * 100))
self.hightext:SetFormattedText("%s%%", (max * 100))
else
self.lowtext:SetText(min)
self.hightext:SetText(max)
end
end
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Control_OnEnter(frame)
frame.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(frame)
frame.obj:Fire("OnLeave")
end
 
local function Frame_OnMouseDown(frame)
frame.obj.slider:EnableMouseWheel(true)
AceGUI:ClearFocus()
end
 
local function Slider_OnValueChanged(frame)
local self = frame.obj
if not frame.setup then
local newvalue = frame:GetValue()
if newvalue ~= self.value and not self.disabled then
self.value = newvalue
self:Fire("OnValueChanged", newvalue)
end
if self.value then
UpdateText(self)
end
end
end
 
local function Slider_OnMouseUp(frame)
local self = frame.obj
self:Fire("OnMouseUp", self.value)
end
 
local function Slider_OnMouseWheel(frame, v)
local self = frame.obj
if not self.disabled then
local value = self.value
if v > 0 then
value = min(value + (self.step or 1), self.max)
else
value = max(value - (self.step or 1), self.min)
end
self.slider:SetValue(value)
end
end
 
local function EditBox_OnEscapePressed(frame)
frame:ClearFocus()
end
 
local function EditBox_OnEnterPressed(frame)
local self = frame.obj
local value = frame:GetText()
if self.ispercent then
value = value:gsub('%%', '')
value = tonumber(value) / 100
else
value = tonumber(value)
end
 
if value then
PlaySound("igMainMenuOptionCheckBoxOn")
self.slider:SetValue(value)
self:Fire("OnMouseUp", value)
end
end
 
local function EditBox_OnEnter(frame)
frame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
end
 
local function EditBox_OnLeave(frame)
frame:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8)
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:SetWidth(200)
self:SetHeight(44)
self:SetDisabled(false)
self:SetIsPercent(nil)
self:SetSliderValues(0,100,1)
self:SetValue(0)
self.slider:EnableMouseWheel(false)
end,
 
-- ["OnRelease"] = nil,
 
["SetDisabled"] = function(self, disabled)
self.disabled = disabled
if disabled then
self.slider:EnableMouse(false)
self.label:SetTextColor(.5, .5, .5)
self.hightext:SetTextColor(.5, .5, .5)
self.lowtext:SetTextColor(.5, .5, .5)
--self.valuetext:SetTextColor(.5, .5, .5)
self.editbox:SetTextColor(.5, .5, .5)
self.editbox:EnableMouse(false)
self.editbox:ClearFocus()
else
self.slider:EnableMouse(true)
self.label:SetTextColor(1, .82, 0)
self.hightext:SetTextColor(1, 1, 1)
self.lowtext:SetTextColor(1, 1, 1)
--self.valuetext:SetTextColor(1, 1, 1)
self.editbox:SetTextColor(1, 1, 1)
self.editbox:EnableMouse(true)
end
end,
 
["SetValue"] = function(self, value)
self.slider.setup = true
self.slider:SetValue(value)
self.value = value
UpdateText(self)
self.slider.setup = nil
end,
 
["GetValue"] = function(self)
return self.value
end,
 
["SetLabel"] = function(self, text)
self.label:SetText(text)
end,
 
["SetSliderValues"] = function(self, min, max, step)
local frame = self.slider
frame.setup = true
self.min = min
self.max = max
self.step = step
frame:SetMinMaxValues(min or 0,max or 100)
UpdateLabels(self)
frame:SetValueStep(step or 1)
if self.value then
frame:SetValue(self.value)
end
frame.setup = nil
end,
 
["SetIsPercent"] = function(self, value)
self.ispercent = value
UpdateLabels(self)
UpdateText(self)
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local SliderBackdrop = {
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
tile = true, tileSize = 8, edgeSize = 8,
insets = { left = 3, right = 3, top = 6, bottom = 6 }
}
 
local ManualBackdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\ChatFrame\\ChatFrameBackground",
tile = true, edgeSize = 1, tileSize = 5,
}
 
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent)
 
frame:EnableMouse(true)
frame:SetScript("OnMouseDown", Frame_OnMouseDown)
 
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
label:SetPoint("TOPLEFT")
label:SetPoint("TOPRIGHT")
label:SetJustifyH("CENTER")
label:SetHeight(15)
 
local slider = CreateFrame("Slider", nil, frame)
slider:SetOrientation("HORIZONTAL")
slider:SetHeight(15)
slider:SetHitRectInsets(0, 0, -10, 0)
slider:SetBackdrop(SliderBackdrop)
slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Horizontal")
slider:SetPoint("TOP", label, "BOTTOM")
slider:SetPoint("LEFT", 3, 0)
slider:SetPoint("RIGHT", -3, 0)
slider:SetValue(0)
slider:SetScript("OnValueChanged",Slider_OnValueChanged)
slider:SetScript("OnEnter", Control_OnEnter)
slider:SetScript("OnLeave", Control_OnLeave)
slider:SetScript("OnMouseUp", Slider_OnMouseUp)
slider:SetScript("OnMouseWheel", Slider_OnMouseWheel)
 
local lowtext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
lowtext:SetPoint("TOPLEFT", slider, "BOTTOMLEFT", 2, 3)
 
local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3)
 
local editbox = CreateFrame("EditBox", nil, frame)
editbox:SetAutoFocus(false)
editbox:SetFontObject(GameFontHighlightSmall)
editbox:SetPoint("TOP", slider, "BOTTOM")
editbox:SetHeight(14)
editbox:SetWidth(70)
editbox:SetJustifyH("CENTER")
editbox:EnableMouse(true)
editbox:SetBackdrop(ManualBackdrop)
editbox:SetBackdropColor(0, 0, 0, 0.5)
editbox:SetBackdropBorderColor(0.3, 0.3, 0.30, 0.80)
editbox:SetScript("OnEnter", EditBox_OnEnter)
editbox:SetScript("OnLeave", EditBox_OnLeave)
editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed)
editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed)
 
local widget = {
label = label,
slider = slider,
lowtext = lowtext,
hightext = hightext,
editbox = editbox,
alignoffset = 25,
frame = frame,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
slider.obj, editbox.obj = widget, widget
 
return AceGUI:RegisterAsWidget(widget)
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua New file
0,0 → 1,365
--[[-----------------------------------------------------------------------------
TabGroup Container
Container that uses tabs on top to switch between groups.
-------------------------------------------------------------------------------]]
local Type, Version = "TabGroup", 32
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe
 
-- WoW APIs
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent
local _G = _G
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: PanelTemplates_TabResize, PanelTemplates_SetDisabledTabState, PanelTemplates_SelectTab, PanelTemplates_DeselectTab
 
-- local upvalue storage used by BuildTabs
local widths = {}
local rowwidths = {}
local rowends = {}
 
-- Determine if we're on WoW 4.0.6 or not.
local wow_406
do
local _,wow_build = GetBuildInfo()
wow_406 = tonumber(wow_build) >= 13596
end
 
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
local function UpdateTabLook(frame)
if frame.disabled then
PanelTemplates_SetDisabledTabState(frame)
elseif frame.selected then
PanelTemplates_SelectTab(frame)
else
PanelTemplates_DeselectTab(frame)
end
end
 
local function Tab_SetText(frame, text)
frame:_SetText(text)
local width = frame.obj.frame.width or frame.obj.frame:GetWidth() or 0
if wow_406 then
PanelTemplates_TabResize(frame, 0, nil, nil, width)
else
PanelTemplates_TabResize(frame, 0, nil, width)
end
end
 
local function Tab_SetSelected(frame, selected)
frame.selected = selected
UpdateTabLook(frame)
end
 
local function Tab_SetDisabled(frame, disabled)
frame.disabled = disabled
UpdateTabLook(frame)
end
 
local function BuildTabsOnUpdate(frame)
local self = frame.obj
self:BuildTabs()
frame:SetScript("OnUpdate", nil)
end
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Tab_OnClick(frame)
if not (frame.selected or frame.disabled) then
PlaySound("igCharacterInfoTab")
frame.obj:SelectTab(frame.value)
end
end
 
local function Tab_OnEnter(frame)
local self = frame.obj
self:Fire("OnTabEnter", self.tabs[frame.id].value, frame)
end
 
local function Tab_OnLeave(frame)
local self = frame.obj
self:Fire("OnTabLeave", self.tabs[frame.id].value, frame)
end
 
local function Tab_OnShow(frame)
_G[frame:GetName().."HighlightTexture"]:SetWidth(frame:GetTextWidth() + 30)
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:SetTitle()
end,
 
["OnRelease"] = function(self)
self.status = nil
for k in pairs(self.localstatus) do
self.localstatus[k] = nil
end
self.tablist = nil
for _, tab in pairs(self.tabs) do
tab:Hide()
end
end,
 
["CreateTab"] = function(self, id)
local tabname = ("AceGUITabGroup%dTab%d"):format(self.num, id)
local tab = CreateFrame("Button", tabname, self.border, "OptionsFrameTabButtonTemplate")
tab.obj = self
tab.id = id
 
tab.text = _G[tabname .. "Text"]
tab.text:ClearAllPoints()
tab.text:SetPoint("LEFT", 14, -3)
tab.text:SetPoint("RIGHT", -12, -3)
 
tab:SetScript("OnClick", Tab_OnClick)
tab:SetScript("OnEnter", Tab_OnEnter)
tab:SetScript("OnLeave", Tab_OnLeave)
tab:SetScript("OnShow", Tab_OnShow)
 
tab._SetText = tab.SetText
tab.SetText = Tab_SetText
tab.SetSelected = Tab_SetSelected
tab.SetDisabled = Tab_SetDisabled
 
return tab
end,
 
["SetTitle"] = function(self, text)
self.titletext:SetText(text or "")
if text and text ~= "" then
self.alignoffset = 25
else
self.alignoffset = 18
end
self:BuildTabs()
end,
 
["SetStatusTable"] = function(self, status)
assert(type(status) == "table")
self.status = status
end,
 
["SelectTab"] = function(self, value)
local status = self.status or self.localstatus
local found
for i, v in ipairs(self.tabs) do
if v.value == value then
v:SetSelected(true)
found = true
else
v:SetSelected(false)
end
end
status.selected = value
if found then
self:Fire("OnGroupSelected",value)
end
end,
 
["SetTabs"] = function(self, tabs)
self.tablist = tabs
self:BuildTabs()
end,
 
 
["BuildTabs"] = function(self)
local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
local status = self.status or self.localstatus
local tablist = self.tablist
local tabs = self.tabs
 
if not tablist then return end
 
local width = self.frame.width or self.frame:GetWidth() or 0
 
wipe(widths)
wipe(rowwidths)
wipe(rowends)
 
--Place Text into tabs and get thier initial width
for i, v in ipairs(tablist) do
local tab = tabs[i]
if not tab then
tab = self:CreateTab(i)
tabs[i] = tab
end
 
tab:Show()
tab:SetText(v.text)
tab:SetDisabled(v.disabled)
tab.value = v.value
 
widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text
end
 
for i = (#tablist)+1, #tabs, 1 do
tabs[i]:Hide()
end
 
--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
local numtabs = #tablist
local numrows = 1
local usedwidth = 0
 
for i = 1, #tablist do
--If this is not the first tab of a row and there isn't room for it
if usedwidth ~= 0 and (width - usedwidth - widths[i]) < 0 then
rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
rowends[numrows] = i - 1
numrows = numrows + 1
usedwidth = 0
end
usedwidth = usedwidth + widths[i]
end
rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
rowends[numrows] = #tablist
 
--Fix for single tabs being left on the last row, move a tab from the row above if applicable
if numrows > 1 then
--if the last row has only one tab
if rowends[numrows-1] == numtabs-1 then
--if there are more than 2 tabs in the 2nd last row
if (numrows == 2 and rowends[numrows-1] > 2) or (rowends[numrows] - rowends[numrows-1] > 2) then
--move 1 tab from the second last row to the last, if there is enough space
if (rowwidths[numrows] + widths[numtabs-1]) <= width then
rowends[numrows-1] = rowends[numrows-1] - 1
rowwidths[numrows] = rowwidths[numrows] + widths[numtabs-1]
rowwidths[numrows-1] = rowwidths[numrows-1] - widths[numtabs-1]
end
end
end
end
 
--anchor the rows as defined and resize tabs to fill thier row
local starttab = 1
for row, endtab in ipairs(rowends) do
local first = true
for tabno = starttab, endtab do
local tab = tabs[tabno]
tab:ClearAllPoints()
if first then
tab:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 0, -(hastitle and 14 or 7)-(row-1)*20 )
first = false
else
tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
end
end
 
-- equal padding for each tab to fill the available width,
-- if the used space is above 75% already
-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
-- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't
local padding = 0
if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then
padding = (width - rowwidths[row]) / (endtab - starttab+1)
end
 
for i = starttab, endtab do
if wow_406 then
PanelTemplates_TabResize(tabs[i], padding + 4, nil, nil, width)
else
PanelTemplates_TabResize(tabs[i], padding + 4, nil, width)
end
end
starttab = endtab + 1
end
 
self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
self.border:SetPoint("TOPLEFT", 1, -self.borderoffset)
end,
 
["OnWidthSet"] = function(self, width)
local content = self.content
local contentwidth = width - 60
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
self:BuildTabs(self)
self.frame:SetScript("OnUpdate", BuildTabsOnUpdate)
end,
 
["OnHeightSet"] = function(self, height)
local content = self.content
local contentheight = height - (self.borderoffset + 23)
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end,
 
["LayoutFinished"] = function(self, width, height)
if self.noAutoHeight then return end
self:SetHeight((height or 0) + (self.borderoffset + 23))
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local PaneBackdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
 
local function Constructor()
local num = AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Frame",nil,UIParent)
frame:SetHeight(100)
frame:SetWidth(100)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
 
local titletext = frame:CreateFontString(nil,"OVERLAY","GameFontNormal")
titletext:SetPoint("TOPLEFT", 14, 0)
titletext:SetPoint("TOPRIGHT", -14, 0)
titletext:SetJustifyH("LEFT")
titletext:SetHeight(18)
titletext:SetText("")
 
local border = CreateFrame("Frame", nil, frame)
border:SetPoint("TOPLEFT", 1, -27)
border:SetPoint("BOTTOMRIGHT", -1, 3)
border:SetBackdrop(PaneBackdrop)
border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
border:SetBackdropBorderColor(0.4, 0.4, 0.4)
 
local content = CreateFrame("Frame", nil, border)
content:SetPoint("TOPLEFT", 10, -7)
content:SetPoint("BOTTOMRIGHT", -10, 7)
 
local widget = {
num = num,
frame = frame,
localstatus = {},
alignoffset = 18,
titletext = titletext,
border = border,
borderoffset = 27,
tabs = {},
content = content,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
 
return AceGUI:RegisterAsContainer(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua New file
0,0 → 1,232
--[[-----------------------------------------------------------------------------
Keybinding Widget
Set Keybindings in the Config UI.
-------------------------------------------------------------------------------]]
local Type, Version = "Keybinding", 22
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local pairs = pairs
 
-- WoW APIs
local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
local CreateFrame, UIParent = CreateFrame, UIParent
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: NOT_BOUND
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
 
local function Control_OnEnter(frame)
frame.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(frame)
frame.obj:Fire("OnLeave")
end
 
local function Keybinding_OnClick(frame, button)
if button == "LeftButton" or button == "RightButton" then
local self = frame.obj
if self.waitingForKey then
frame:EnableKeyboard(false)
self.msgframe:Hide()
frame:UnlockHighlight()
self.waitingForKey = nil
else
frame:EnableKeyboard(true)
self.msgframe:Show()
frame:LockHighlight()
self.waitingForKey = true
end
end
AceGUI:ClearFocus()
end
 
local ignoreKeys = {
["BUTTON1"] = true, ["BUTTON2"] = true,
["UNKNOWN"] = true,
["LSHIFT"] = true, ["LCTRL"] = true, ["LALT"] = true,
["RSHIFT"] = true, ["RCTRL"] = true, ["RALT"] = true,
}
local function Keybinding_OnKeyDown(frame, key)
local self = frame.obj
if self.waitingForKey then
local keyPressed = key
if keyPressed == "ESCAPE" then
keyPressed = ""
else
if ignoreKeys[keyPressed] then return end
if IsShiftKeyDown() then
keyPressed = "SHIFT-"..keyPressed
end
if IsControlKeyDown() then
keyPressed = "CTRL-"..keyPressed
end
if IsAltKeyDown() then
keyPressed = "ALT-"..keyPressed
end
end
 
frame:EnableKeyboard(false)
self.msgframe:Hide()
frame:UnlockHighlight()
self.waitingForKey = nil
 
if not self.disabled then
self:SetKey(keyPressed)
self:Fire("OnKeyChanged", keyPressed)
end
end
end
 
local function Keybinding_OnMouseDown(frame, button)
if button == "LeftButton" or button == "RightButton" then
return
elseif button == "MiddleButton" then
button = "BUTTON3"
elseif button == "Button4" then
button = "BUTTON4"
elseif button == "Button5" then
button = "BUTTON5"
end
Keybinding_OnKeyDown(frame, button)
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:SetWidth(200)
self:SetLabel("")
self:SetKey("")
self.waitingForKey = nil
self.msgframe:Hide()
self:SetDisabled(false)
self.button:EnableKeyboard(false)
end,
 
-- ["OnRelease"] = nil,
 
["SetDisabled"] = function(self, disabled)
self.disabled = disabled
if disabled then
self.button:Disable()
self.label:SetTextColor(0.5,0.5,0.5)
else
self.button:Enable()
self.label:SetTextColor(1,1,1)
end
end,
 
["SetKey"] = function(self, key)
if (key or "") == "" then
self.button:SetText(NOT_BOUND)
self.button:SetNormalFontObject("GameFontNormal")
else
self.button:SetText(key)
self.button:SetNormalFontObject("GameFontHighlight")
end
end,
 
["GetKey"] = function(self)
local key = self.button:GetText()
if key == NOT_BOUND then
key = nil
end
return key
end,
 
["SetLabel"] = function(self, label)
self.label:SetText(label or "")
if (label or "") == "" then
self.alignoffset = nil
self:SetHeight(24)
else
self.alignoffset = 30
self:SetHeight(44)
end
end,
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
 
local ControlBackdrop = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 3, bottom = 3 }
}
 
local function keybindingMsgFixWidth(frame)
frame:SetWidth(frame.msg:GetWidth() + 10)
frame:SetScript("OnUpdate", nil)
end
 
local function Constructor()
local name = "AceGUI30KeybindingButton" .. AceGUI:GetNextWidgetNum(Type)
 
local frame = CreateFrame("Frame", nil, UIParent)
local button = CreateFrame("Button", name, frame, "UIPanelButtonTemplate2")
 
button:EnableMouse(true)
button:RegisterForClicks("AnyDown")
button:SetScript("OnEnter", Control_OnEnter)
button:SetScript("OnLeave", Control_OnLeave)
button:SetScript("OnClick", Keybinding_OnClick)
button:SetScript("OnKeyDown", Keybinding_OnKeyDown)
button:SetScript("OnMouseDown", Keybinding_OnMouseDown)
button:SetPoint("BOTTOMLEFT")
button:SetPoint("BOTTOMRIGHT")
button:SetHeight(24)
button:EnableKeyboard(false)
 
local text = button:GetFontString()
text:SetPoint("LEFT", 7, 0)
text:SetPoint("RIGHT", -7, 0)
 
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
label:SetPoint("TOPLEFT")
label:SetPoint("TOPRIGHT")
label:SetJustifyH("CENTER")
label:SetHeight(18)
 
local msgframe = CreateFrame("Frame", nil, UIParent)
msgframe:SetHeight(30)
msgframe:SetBackdrop(ControlBackdrop)
msgframe:SetBackdropColor(0,0,0)
msgframe:SetFrameStrata("FULLSCREEN_DIALOG")
msgframe:SetFrameLevel(1000)
 
local msg = msgframe:CreateFontString(nil, "OVERLAY", "GameFontNormal")
msg:SetText("Press a key to bind, ESC to clear the binding or click the button again to cancel.")
msgframe.msg = msg
msg:SetPoint("TOPLEFT", 5, -5)
msgframe:SetScript("OnUpdate", keybindingMsgFixWidth)
msgframe:SetPoint("BOTTOM", button, "TOP")
msgframe:Hide()
 
local widget = {
button = button,
label = label,
msgframe = msgframe,
frame = frame,
alignoffset = 30,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
button.obj = widget
 
return AceGUI:RegisterAsWidget(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua New file
0,0 → 1,289
--[[-----------------------------------------------------------------------------
Checkbox Widget
-------------------------------------------------------------------------------]]
local Type, Version = "CheckBox", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local select, pairs = select, pairs
 
-- WoW APIs
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: SetDesaturation, GameFontHighlight
 
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
local function AlignImage(self)
local img = self.image:GetTexture()
self.text:ClearAllPoints()
if not img then
self.text:SetPoint("LEFT", self.checkbg, "RIGHT")
self.text:SetPoint("RIGHT")
else
self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0)
self.text:SetPoint("RIGHT")
end
end
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Control_OnEnter(frame)
frame.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(frame)
frame.obj:Fire("OnLeave")
end
 
local function CheckBox_OnMouseDown(frame)
local self = frame.obj
if not self.disabled then
if self.image:GetTexture() then
self.text:SetPoint("LEFT", self.image,"RIGHT", 2, -1)
else
self.text:SetPoint("LEFT", self.checkbg, "RIGHT", 1, -1)
end
end
AceGUI:ClearFocus()
end
 
local function CheckBox_OnMouseUp(frame)
local self = frame.obj
if not self.disabled then
self:ToggleChecked()
 
if self.checked then
PlaySound("igMainMenuOptionCheckBoxOn")
else -- for both nil and false (tristate)
PlaySound("igMainMenuOptionCheckBoxOff")
end
 
self:Fire("OnValueChanged", self.checked)
AlignImage(self)
end
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:SetType()
self:SetValue(false)
self:SetTriState(nil)
-- height is calculated from the width and required space for the description
self:SetWidth(200)
self:SetImage()
self:SetDisabled(nil)
self:SetDescription(nil)
end,
 
-- ["OnRelease"] = nil,
 
["OnWidthSet"] = function(self, width)
if self.desc then
self.desc:SetWidth(width - 30)
if self.desc:GetText() and self.desc:GetText() ~= "" then
self:SetHeight(28 + self.desc:GetHeight())
end
end
end,
 
["SetDisabled"] = function(self, disabled)
self.disabled = disabled
if disabled then
self.frame:Disable()
self.text:SetTextColor(0.5, 0.5, 0.5)
SetDesaturation(self.check, true)
else
self.frame:Enable()
self.text:SetTextColor(1, 1, 1)
if self.tristate and self.checked == nil then
SetDesaturation(self.check, true)
else
SetDesaturation(self.check, false)
end
end
end,
 
["SetValue"] = function(self,value)
local check = self.check
self.checked = value
if value then
SetDesaturation(self.check, false)
self.check:Show()
else
--Nil is the unknown tristate value
if self.tristate and value == nil then
SetDesaturation(self.check, true)
self.check:Show()
else
SetDesaturation(self.check, false)
self.check:Hide()
end
end
self:SetDisabled(self.disabled)
end,
 
["GetValue"] = function(self)
return self.checked
end,
 
["SetTriState"] = function(self, enabled)
self.tristate = enabled
self:SetValue(self:GetValue())
end,
 
["SetType"] = function(self, type)
local checkbg = self.checkbg
local check = self.check
local highlight = self.highlight
 
local size
if type == "radio" then
size = 16
checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
checkbg:SetTexCoord(0, 0.25, 0, 1)
check:SetTexture("Interface\\Buttons\\UI-RadioButton")
check:SetTexCoord(0.25, 0.5, 0, 1)
check:SetBlendMode("ADD")
highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
highlight:SetTexCoord(0.5, 0.75, 0, 1)
else
size = 24
checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
checkbg:SetTexCoord(0, 1, 0, 1)
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
check:SetTexCoord(0, 1, 0, 1)
check:SetBlendMode("BLEND")
highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
highlight:SetTexCoord(0, 1, 0, 1)
end
checkbg:SetHeight(size)
checkbg:SetWidth(size)
end,
 
["ToggleChecked"] = function(self)
local value = self:GetValue()
if self.tristate then
--cycle in true, nil, false order
if value then
self:SetValue(nil)
elseif value == nil then
self:SetValue(false)
else
self:SetValue(true)
end
else
self:SetValue(not self:GetValue())
end
end,
 
["SetLabel"] = function(self, label)
self.text:SetText(label)
end,
 
["SetDescription"] = function(self, desc)
if desc then
if not self.desc then
local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
desc:ClearAllPoints()
desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
desc:SetWidth(self.frame.width - 30)
desc:SetJustifyH("LEFT")
desc:SetJustifyV("TOP")
self.desc = desc
end
self.desc:Show()
--self.text:SetFontObject(GameFontNormal)
self.desc:SetText(desc)
self:SetHeight(28 + self.desc:GetHeight())
else
if self.desc then
self.desc:SetText("")
self.desc:Hide()
end
--self.text:SetFontObject(GameFontHighlight)
self:SetHeight(24)
end
end,
 
["SetImage"] = function(self, path, ...)
local image = self.image
image:SetTexture(path)
 
if image:GetTexture() then
local n = select("#", ...)
if n == 4 or n == 8 then
image:SetTexCoord(...)
else
image:SetTexCoord(0, 1, 0, 1)
end
end
AlignImage(self)
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local frame = CreateFrame("Button", nil, UIParent)
frame:Hide()
 
frame:EnableMouse(true)
frame:SetScript("OnEnter", Control_OnEnter)
frame:SetScript("OnLeave", Control_OnLeave)
frame:SetScript("OnMouseDown", CheckBox_OnMouseDown)
frame:SetScript("OnMouseUp", CheckBox_OnMouseUp)
 
local checkbg = frame:CreateTexture(nil, "ARTWORK")
checkbg:SetWidth(24)
checkbg:SetHeight(24)
checkbg:SetPoint("TOPLEFT")
checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
 
local check = frame:CreateTexture(nil, "OVERLAY")
check:SetAllPoints(checkbg)
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
 
local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
text:SetJustifyH("LEFT")
text:SetHeight(18)
text:SetPoint("LEFT", checkbg, "RIGHT")
text:SetPoint("RIGHT")
 
local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
highlight:SetBlendMode("ADD")
highlight:SetAllPoints(checkbg)
 
local image = frame:CreateTexture(nil, "OVERLAY")
image:SetHeight(16)
image:SetWidth(16)
image:SetPoint("LEFT", checkbg, "RIGHT", 1, 0)
 
local widget = {
checkbg = checkbg,
check = check,
text = text,
highlight = highlight,
image = image,
frame = frame,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
 
return AceGUI:RegisterAsWidget(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua New file
0,0 → 1,144
--[[-----------------------------------------------------------------------------
Icon Widget
-------------------------------------------------------------------------------]]
local Type, Version = "Icon", 21
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local select, pairs, print = select, pairs, print
 
-- WoW APIs
local CreateFrame, UIParent, GetBuildInfo = CreateFrame, UIParent, GetBuildInfo
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Control_OnEnter(frame)
frame.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(frame)
frame.obj:Fire("OnLeave")
end
 
local function Button_OnClick(frame, button)
frame.obj:Fire("OnClick", button)
AceGUI:ClearFocus()
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:SetHeight(110)
self:SetWidth(110)
self:SetLabel()
self:SetImage(nil)
self:SetImageSize(64, 64)
self:SetDisabled(false)
end,
 
-- ["OnRelease"] = nil,
 
["SetLabel"] = function(self, text)
if text and text ~= "" then
self.label:Show()
self.label:SetText(text)
self:SetHeight(self.image:GetHeight() + 25)
else
self.label:Hide()
self:SetHeight(self.image:GetHeight() + 10)
end
end,
 
["SetImage"] = function(self, path, ...)
local image = self.image
image:SetTexture(path)
 
if image:GetTexture() then
local n = select("#", ...)
if n == 4 or n == 8 then
image:SetTexCoord(...)
else
image:SetTexCoord(0, 1, 0, 1)
end
end
end,
 
["SetImageSize"] = function(self, width, height)
self.image:SetWidth(width)
self.image:SetHeight(height)
--self.frame:SetWidth(width + 30)
if self.label:IsShown() then
self:SetHeight(height + 25)
else
self:SetHeight(height + 10)
end
end,
 
["SetDisabled"] = function(self, disabled)
self.disabled = disabled
if disabled then
self.frame:Disable()
self.label:SetTextColor(0.5, 0.5, 0.5)
self.image:SetVertexColor(0.5, 0.5, 0.5, 0.5)
else
self.frame:Enable()
self.label:SetTextColor(1, 1, 1)
self.image:SetVertexColor(1, 1, 1, 1)
end
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local frame = CreateFrame("Button", nil, UIParent)
frame:Hide()
 
frame:EnableMouse(true)
frame:SetScript("OnEnter", Control_OnEnter)
frame:SetScript("OnLeave", Control_OnLeave)
frame:SetScript("OnClick", Button_OnClick)
 
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlight")
label:SetPoint("BOTTOMLEFT")
label:SetPoint("BOTTOMRIGHT")
label:SetJustifyH("CENTER")
label:SetJustifyV("TOP")
label:SetHeight(18)
 
local image = frame:CreateTexture(nil, "BACKGROUND")
image:SetWidth(64)
image:SetHeight(64)
image:SetPoint("TOP", 0, -5)
 
local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
highlight:SetAllPoints(image)
highlight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight")
highlight:SetTexCoord(0, 1, 0.23, 0.77)
highlight:SetBlendMode("ADD")
 
local widget = {
label = label,
image = image,
frame = frame,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
-- SetText is deprecated, but keep it around for a while. (say, to WoW 4.0)
if (select(4, GetBuildInfo()) < 40000) then
widget.SetText = widget.SetLabel
else
widget.SetText = function(self, ...) print("AceGUI-3.0-Icon: SetText is deprecated! Use SetLabel instead!"); self:SetLabel(...) end
end
 
return AceGUI:RegisterAsWidget(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua New file
0,0 → 1,133
--[[-----------------------------------------------------------------------------
BlizOptionsGroup Container
Simple container widget for the integration of AceGUI into the Blizzard Interface Options
-------------------------------------------------------------------------------]]
local Type, Version = "BlizOptionsGroup", 20
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local pairs = pairs
 
-- WoW APIs
local CreateFrame = CreateFrame
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
 
local function OnShow(frame)
frame.obj:Fire("OnShow")
end
 
local function OnHide(frame)
frame.obj:Fire("OnHide")
end
 
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
 
local function okay(frame)
frame.obj:Fire("okay")
end
 
local function cancel(frame)
frame.obj:Fire("cancel")
end
 
local function defaults(frame)
frame.obj:Fire("defaults")
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
 
local methods = {
["OnAcquire"] = function(self)
self:SetName()
self:SetTitle()
end,
 
-- ["OnRelease"] = nil,
 
["OnWidthSet"] = function(self, width)
local content = self.content
local contentwidth = width - 63
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
end,
 
["OnHeightSet"] = function(self, height)
local content = self.content
local contentheight = height - 26
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end,
 
["SetName"] = function(self, name, parent)
self.frame.name = name
self.frame.parent = parent
end,
 
["SetTitle"] = function(self, title)
local content = self.content
content:ClearAllPoints()
if not title or title == "" then
content:SetPoint("TOPLEFT", 10, -10)
self.label:SetText("")
else
content:SetPoint("TOPLEFT", 10, -40)
self.label:SetText(title)
end
content:SetPoint("BOTTOMRIGHT", -10, 10)
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local frame = CreateFrame("Frame")
frame:Hide()
 
-- support functions for the Blizzard Interface Options
frame.okay = okay
frame.cancel = cancel
frame.defaults = defaults
 
frame:SetScript("OnHide", OnHide)
frame:SetScript("OnShow", OnShow)
 
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
label:SetPoint("TOPLEFT", 10, -15)
label:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", 10, -45)
label:SetJustifyH("LEFT")
label:SetJustifyV("TOP")
 
--Container Support
local content = CreateFrame("Frame", nil, frame)
content:SetPoint("TOPLEFT", 10, -10)
content:SetPoint("BOTTOMRIGHT", -10, 10)
 
local widget = {
label = label,
frame = frame,
content = content,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
 
return AceGUI:RegisterAsContainer(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua New file
0,0 → 1,300
--[[-----------------------------------------------------------------------------
Frame Container
-------------------------------------------------------------------------------]]
local Type, Version = "Frame", 22
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local pairs, assert, type = pairs, assert, type
local wipe = table.wipe
 
-- WoW APIs
local PlaySound = PlaySound
local CreateFrame, UIParent = CreateFrame, UIParent
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: CLOSE
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Button_OnClick(frame)
PlaySound("gsTitleOptionExit")
frame.obj:Hide()
end
 
local function Frame_OnClose(frame)
frame.obj:Fire("OnClose")
end
 
local function Frame_OnMouseDown(frame)
AceGUI:ClearFocus()
end
 
local function Title_OnMouseDown(frame)
frame:GetParent():StartMoving()
AceGUI:ClearFocus()
end
 
local function MoverSizer_OnMouseUp(mover)
local frame = mover:GetParent()
frame:StopMovingOrSizing()
local self = frame.obj
local status = self.status or self.localstatus
status.width = frame:GetWidth()
status.height = frame:GetHeight()
status.top = frame:GetTop()
status.left = frame:GetLeft()
end
 
local function SizerSE_OnMouseDown(frame)
frame:GetParent():StartSizing("BOTTOMRIGHT")
AceGUI:ClearFocus()
end
 
local function SizerS_OnMouseDown(frame)
frame:GetParent():StartSizing("BOTTOM")
AceGUI:ClearFocus()
end
 
local function SizerE_OnMouseDown(frame)
frame:GetParent():StartSizing("RIGHT")
AceGUI:ClearFocus()
end
 
local function StatusBar_OnEnter(frame)
frame.obj:Fire("OnEnterStatusBar")
end
 
local function StatusBar_OnLeave(frame)
frame.obj:Fire("OnLeaveStatusBar")
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self.frame:SetParent(UIParent)
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
self:SetTitle()
self:SetStatusText()
self:ApplyStatus()
self:Show()
end,
 
["OnRelease"] = function(self)
self.status = nil
wipe(self.localstatus)
end,
 
["OnWidthSet"] = function(self, width)
local content = self.content
local contentwidth = width - 34
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
end,
 
["OnHeightSet"] = function(self, height)
local content = self.content
local contentheight = height - 57
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end,
 
["SetTitle"] = function(self, title)
self.titletext:SetText(title)
self.titlebg:SetWidth((self.titletext:GetWidth() or 0) + 10)
end,
 
["SetStatusText"] = function(self, text)
self.statustext:SetText(text)
end,
 
["Hide"] = function(self)
self.frame:Hide()
end,
 
["Show"] = function(self)
self.frame:Show()
end,
 
-- called to set an external table to store status in
["SetStatusTable"] = function(self, status)
assert(type(status) == "table")
self.status = status
self:ApplyStatus()
end,
 
["ApplyStatus"] = function(self)
local status = self.status or self.localstatus
local frame = self.frame
self:SetWidth(status.width or 700)
self:SetHeight(status.height or 500)
frame:ClearAllPoints()
if status.top and status.left then
frame:SetPoint("TOP", UIParent, "BOTTOM", 0, status.top)
frame:SetPoint("LEFT", UIParent, "LEFT", status.left, 0)
else
frame:SetPoint("CENTER")
end
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local FrameBackdrop = {
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
tile = true, tileSize = 32, edgeSize = 32,
insets = { left = 8, right = 8, top = 8, bottom = 8 }
}
 
local PaneBackdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
 
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent)
frame:Hide()
 
frame:EnableMouse(true)
frame:SetMovable(true)
frame:SetResizable(true)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetBackdrop(FrameBackdrop)
frame:SetBackdropColor(0, 0, 0, 1)
frame:SetMinResize(400, 200)
frame:SetToplevel(true)
frame:SetScript("OnHide", Frame_OnClose)
frame:SetScript("OnMouseDown", Frame_OnMouseDown)
 
local closebutton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
closebutton:SetScript("OnClick", Button_OnClick)
closebutton:SetPoint("BOTTOMRIGHT", -27, 17)
closebutton:SetHeight(20)
closebutton:SetWidth(100)
closebutton:SetText(CLOSE)
 
local statusbg = CreateFrame("Button", nil, frame)
statusbg:SetPoint("BOTTOMLEFT", 15, 15)
statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
statusbg:SetHeight(24)
statusbg:SetBackdrop(PaneBackdrop)
statusbg:SetBackdropColor(0.1,0.1,0.1)
statusbg:SetBackdropBorderColor(0.4,0.4,0.4)
statusbg:SetScript("OnEnter", StatusBar_OnEnter)
statusbg:SetScript("OnLeave", StatusBar_OnLeave)
 
local statustext = statusbg:CreateFontString(nil, "OVERLAY", "GameFontNormal")
statustext:SetPoint("TOPLEFT", 7, -2)
statustext:SetPoint("BOTTOMRIGHT", -7, 2)
statustext:SetHeight(20)
statustext:SetJustifyH("LEFT")
statustext:SetText("")
 
local titlebg = frame:CreateTexture(nil, "OVERLAY")
titlebg:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
titlebg:SetTexCoord(0.31, 0.67, 0, 0.63)
titlebg:SetPoint("TOP", 0, 12)
titlebg:SetWidth(100)
titlebg:SetHeight(40)
 
local title = CreateFrame("Frame", nil, frame)
title:EnableMouse(true)
title:SetScript("OnMouseDown", Title_OnMouseDown)
title:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
title:SetAllPoints(titlebg)
 
local titletext = title:CreateFontString(nil, "OVERLAY", "GameFontNormal")
titletext:SetPoint("TOP", titlebg, "TOP", 0, -14)
 
local titlebg_l = frame:CreateTexture(nil, "OVERLAY")
titlebg_l:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
titlebg_l:SetTexCoord(0.21, 0.31, 0, 0.63)
titlebg_l:SetPoint("RIGHT", titlebg, "LEFT")
titlebg_l:SetWidth(30)
titlebg_l:SetHeight(40)
 
local titlebg_r = frame:CreateTexture(nil, "OVERLAY")
titlebg_r:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
titlebg_r:SetTexCoord(0.67, 0.77, 0, 0.63)
titlebg_r:SetPoint("LEFT", titlebg, "RIGHT")
titlebg_r:SetWidth(30)
titlebg_r:SetHeight(40)
 
local sizer_se = CreateFrame("Frame", nil, frame)
sizer_se:SetPoint("BOTTOMRIGHT")
sizer_se:SetWidth(25)
sizer_se:SetHeight(25)
sizer_se:EnableMouse()
sizer_se:SetScript("OnMouseDown",SizerSE_OnMouseDown)
sizer_se:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
 
local line1 = sizer_se:CreateTexture(nil, "BACKGROUND")
line1:SetWidth(14)
line1:SetHeight(14)
line1:SetPoint("BOTTOMRIGHT", -8, 8)
line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
local x = 0.1 * 14/17
line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
 
local line2 = sizer_se:CreateTexture(nil, "BACKGROUND")
line2:SetWidth(8)
line2:SetHeight(8)
line2:SetPoint("BOTTOMRIGHT", -8, 8)
line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
local x = 0.1 * 8/17
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
 
local sizer_s = CreateFrame("Frame", nil, frame)
sizer_s:SetPoint("BOTTOMRIGHT", -25, 0)
sizer_s:SetPoint("BOTTOMLEFT")
sizer_s:SetHeight(25)
sizer_s:EnableMouse(true)
sizer_s:SetScript("OnMouseDown", SizerS_OnMouseDown)
sizer_s:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
 
local sizer_e = CreateFrame("Frame", nil, frame)
sizer_e:SetPoint("BOTTOMRIGHT", 0, 25)
sizer_e:SetPoint("TOPRIGHT")
sizer_e:SetWidth(25)
sizer_e:EnableMouse(true)
sizer_e:SetScript("OnMouseDown", SizerE_OnMouseDown)
sizer_e:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
 
--Container Support
local content = CreateFrame("Frame", nil, frame)
content:SetPoint("TOPLEFT", 17, -27)
content:SetPoint("BOTTOMRIGHT", -17, 40)
 
local widget = {
localstatus = {},
titletext = titletext,
statustext = statustext,
titlebg = titlebg,
content = content,
frame = frame,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
closebutton.obj, statusbg.obj = widget, widget
 
return AceGUI:RegisterAsContainer(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua New file
0,0 → 1,102
--[[-----------------------------------------------------------------------------
InlineGroup Container
Simple container widget that creates a visible "box" with an optional title.
-------------------------------------------------------------------------------]]
local Type, Version = "InlineGroup", 20
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local pairs = pairs
 
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:SetWidth(300)
self:SetHeight(100)
end,
 
-- ["OnRelease"] = nil,
 
["SetTitle"] = function(self,title)
self.titletext:SetText(title)
end,
 
 
["LayoutFinished"] = function(self, width, height)
if self.noAutoHeight then return end
self:SetHeight((height or 0) + 40)
end,
 
["OnWidthSet"] = function(self, width)
local content = self.content
local contentwidth = width - 20
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
end,
 
["OnHeightSet"] = function(self, height)
local content = self.content
local contentheight = height - 20
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local PaneBackdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
 
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
 
local titletext = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
titletext:SetPoint("TOPLEFT", 14, 0)
titletext:SetPoint("TOPRIGHT", -14, 0)
titletext:SetJustifyH("LEFT")
titletext:SetHeight(18)
 
local border = CreateFrame("Frame", nil, frame)
border:SetPoint("TOPLEFT", 0, -17)
border:SetPoint("BOTTOMRIGHT", -1, 3)
border:SetBackdrop(PaneBackdrop)
border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
border:SetBackdropBorderColor(0.4, 0.4, 0.4)
 
--Container Support
local content = CreateFrame("Frame", nil, border)
content:SetPoint("TOPLEFT", 10, -10)
content:SetPoint("BOTTOMRIGHT", -10, 10)
 
local widget = {
frame = frame,
content = content,
titletext = titletext,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
 
return AceGUI:RegisterAsContainer(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua New file
0,0 → 1,717
--[[ $Id: AceGUIWidget-DropDown.lua 997 2010-12-01 18:36:28Z nevcairiel $ ]]--
local AceGUI = LibStub("AceGUI-3.0")
 
-- Lua APIs
local min, max, floor = math.min, math.max, math.floor
local select, pairs, ipairs, type = select, pairs, ipairs, type
local tsort = table.sort
 
-- WoW APIs
local PlaySound = PlaySound
local UIParent, CreateFrame = UIParent, CreateFrame
local _G = _G
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: CLOSE
 
local function fixlevels(parent,...)
local i = 1
local child = select(i, ...)
while child do
child:SetFrameLevel(parent:GetFrameLevel()+1)
fixlevels(child, child:GetChildren())
i = i + 1
child = select(i, ...)
end
end
 
local function fixstrata(strata, parent, ...)
local i = 1
local child = select(i, ...)
parent:SetFrameStrata(strata)
while child do
fixstrata(strata, child, child:GetChildren())
i = i + 1
child = select(i, ...)
end
end
 
do
local widgetType = "Dropdown-Pullout"
local widgetVersion = 3
 
--[[ Static data ]]--
 
local backdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
edgeSize = 32,
tileSize = 32,
tile = true,
insets = { left = 11, right = 12, top = 12, bottom = 11 },
}
local sliderBackdrop = {
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
tile = true, tileSize = 8, edgeSize = 8,
insets = { left = 3, right = 3, top = 3, bottom = 3 }
}
 
local defaultWidth = 200
local defaultMaxHeight = 600
 
--[[ UI Event Handlers ]]--
 
-- HACK: This should be no part of the pullout, but there
-- is no other 'clean' way to response to any item-OnEnter
-- Used to close Submenus when an other item is entered
local function OnEnter(item)
local self = item.pullout
for k, v in ipairs(self.items) do
if v.CloseMenu and v ~= item then
v:CloseMenu()
end
end
end
 
-- See the note in Constructor() for each scroll related function
local function OnMouseWheel(this, value)
this.obj:MoveScroll(value)
end
 
local function OnScrollValueChanged(this, value)
this.obj:SetScroll(value)
end
 
local function OnSizeChanged(this)
this.obj:FixScroll()
end
 
--[[ Exported methods ]]--
 
-- exported
local function SetScroll(self, value)
local status = self.scrollStatus
local frame, child = self.scrollFrame, self.itemFrame
local height, viewheight = frame:GetHeight(), child:GetHeight()
 
local offset
if height > viewheight then
offset = 0
else
offset = floor((viewheight - height) / 1000 * value)
end
child:ClearAllPoints()
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
status.offset = offset
status.scrollvalue = value
end
 
-- exported
local function MoveScroll(self, value)
local status = self.scrollStatus
local frame, child = self.scrollFrame, self.itemFrame
local height, viewheight = frame:GetHeight(), child:GetHeight()
 
if height > viewheight then
self.slider:Hide()
else
self.slider:Show()
local diff = height - viewheight
local delta = 1
if value < 0 then
delta = -1
end
self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
end
end
 
-- exported
local function FixScroll(self)
local status = self.scrollStatus
local frame, child = self.scrollFrame, self.itemFrame
local height, viewheight = frame:GetHeight(), child:GetHeight()
local offset = status.offset or 0
 
if viewheight < height then
self.slider:Hide()
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
self.slider:SetValue(0)
else
self.slider:Show()
local value = (offset / (viewheight - height) * 1000)
if value > 1000 then value = 1000 end
self.slider:SetValue(value)
self:SetScroll(value)
if value < 1000 then
child:ClearAllPoints()
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -12, offset)
status.offset = offset
end
end
end
 
-- exported, AceGUI callback
local function OnAcquire(self)
self.frame:SetParent(UIParent)
--self.itemFrame:SetToplevel(true)
end
 
-- exported, AceGUI callback
local function OnRelease(self)
self:Clear()
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
-- exported
local function AddItem(self, item)
self.items[#self.items + 1] = item
 
local h = #self.items * 16
self.itemFrame:SetHeight(h)
self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
 
item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
 
item:SetPullout(self)
item:SetOnEnter(OnEnter)
end
 
-- exported
local function Open(self, point, relFrame, relPoint, x, y)
local items = self.items
local frame = self.frame
local itemFrame = self.itemFrame
 
frame:SetPoint(point, relFrame, relPoint, x, y)
 
 
local height = 8
for i, item in pairs(items) do
if i == 1 then
item:SetPoint("TOP", itemFrame, "TOP", 0, -2)
else
item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
end
 
item:Show()
 
height = height + 16
end
itemFrame:SetHeight(height)
fixstrata("TOOLTIP", frame, frame:GetChildren())
frame:Show()
self:Fire("OnOpen")
end
 
-- exported
local function Close(self)
self.frame:Hide()
self:Fire("OnClose")
end
 
-- exported
local function Clear(self)
local items = self.items
for i, item in pairs(items) do
AceGUI:Release(item)
items[i] = nil
end
end
 
-- exported
local function IterateItems(self)
return ipairs(self.items)
end
 
-- exported
local function SetHideOnLeave(self, val)
self.hideOnLeave = val
end
 
-- exported
local function SetMaxHeight(self, height)
self.maxHeight = height or defaultMaxHeight
if self.frame:GetHeight() > height then
self.frame:SetHeight(height)
elseif (self.itemFrame:GetHeight() + 34) < height then
self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
end
end
 
-- exported
local function GetRightBorderWidth(self)
return 6 + (self.slider:IsShown() and 12 or 0)
end
 
-- exported
local function GetLeftBorderWidth(self)
return 6
end
 
--[[ Constructor ]]--
 
local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType)
local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
local self = {}
self.count = count
self.type = widgetType
self.frame = frame
frame.obj = self
 
self.OnAcquire = OnAcquire
self.OnRelease = OnRelease
 
self.AddItem = AddItem
self.Open = Open
self.Close = Close
self.Clear = Clear
self.IterateItems = IterateItems
self.SetHideOnLeave = SetHideOnLeave
 
self.SetScroll = SetScroll
self.MoveScroll = MoveScroll
self.FixScroll = FixScroll
 
self.SetMaxHeight = SetMaxHeight
self.GetRightBorderWidth = GetRightBorderWidth
self.GetLeftBorderWidth = GetLeftBorderWidth
 
self.items = {}
 
self.scrollStatus = {
scrollvalue = 0,
}
 
self.maxHeight = defaultMaxHeight
 
frame:SetBackdrop(backdrop)
frame:SetBackdropColor(0, 0, 0)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetClampedToScreen(true)
frame:SetWidth(defaultWidth)
frame:SetHeight(self.maxHeight)
--frame:SetToplevel(true)
 
-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
local itemFrame = CreateFrame("Frame", nil, scrollFrame)
 
self.scrollFrame = scrollFrame
self.itemFrame = itemFrame
 
scrollFrame.obj = self
itemFrame.obj = self
 
local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
slider:SetOrientation("VERTICAL")
slider:SetHitRectInsets(0, 0, -10, 0)
slider:SetBackdrop(sliderBackdrop)
slider:SetWidth(8)
slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Vertical")
slider:SetFrameStrata("FULLSCREEN_DIALOG")
self.slider = slider
slider.obj = self
 
scrollFrame:SetScrollChild(itemFrame)
scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
scrollFrame:EnableMouseWheel(true)
scrollFrame:SetScript("OnMouseWheel", OnMouseWheel)
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
scrollFrame:SetToplevel(true)
scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
 
itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
itemFrame:SetHeight(400)
itemFrame:SetToplevel(true)
itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
 
slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
slider:SetScript("OnValueChanged", OnScrollValueChanged)
slider:SetMinMaxValues(0, 1000)
slider:SetValueStep(1)
slider:SetValue(0)
 
scrollFrame:Show()
itemFrame:Show()
slider:Hide()
 
self:FixScroll()
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
end
 
do
local widgetType = "Dropdown"
local widgetVersion = 24
 
--[[ Static data ]]--
 
--[[ UI event handler ]]--
 
local function Control_OnEnter(this)
this.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(this)
this.obj:Fire("OnLeave")
end
 
local function Dropdown_OnHide(this)
local self = this.obj
if self.open then
self.pullout:Close()
end
end
 
local function Dropdown_TogglePullout(this)
local self = this.obj
PlaySound("igMainMenuOptionCheckBoxOn") -- missleading name, but the Blizzard code uses this sound
if self.open then
self.open = nil
self.pullout:Close()
AceGUI:ClearFocus()
else
self.open = true
self.pullout:SetWidth(self.frame:GetWidth())
self.pullout:Open("TOPLEFT", self.frame, "BOTTOMLEFT", 0, self.label:IsShown() and -2 or 0)
AceGUI:SetFocus(self)
end
end
 
local function OnPulloutOpen(this)
local self = this.userdata.obj
local value = self.value
 
if not self.multiselect then
for i, item in this:IterateItems() do
item:SetValue(item.userdata.value == value)
end
end
 
self.open = true
end
 
local function OnPulloutClose(this)
local self = this.userdata.obj
self.open = nil
self:Fire("OnClosed")
end
 
local function ShowMultiText(self)
local text
for i, widget in self.pullout:IterateItems() do
if widget.type == "Dropdown-Item-Toggle" then
if widget:GetValue() then
if text then
text = text..", "..widget:GetText()
else
text = widget:GetText()
end
end
end
end
self:SetText(text)
end
 
local function OnItemValueChanged(this, event, checked)
local self = this.userdata.obj
 
if self.multiselect then
self:Fire("OnValueChanged", this.userdata.value, checked)
ShowMultiText(self)
else
if checked then
self:SetValue(this.userdata.value)
self:Fire("OnValueChanged", this.userdata.value)
else
this:SetValue(true)
end
if self.open then
self.pullout:Close()
end
end
end
 
--[[ Exported methods ]]--
 
-- exported, AceGUI callback
local function OnAcquire(self)
local pullout = AceGUI:Create("Dropdown-Pullout")
self.pullout = pullout
pullout.userdata.obj = self
pullout:SetCallback("OnClose", OnPulloutClose)
pullout:SetCallback("OnOpen", OnPulloutOpen)
self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
 
self:SetHeight(44)
self:SetWidth(200)
end
 
-- exported, AceGUI callback
local function OnRelease(self)
if self.open then
self.pullout:Close()
end
AceGUI:Release(self.pullout)
self.pullout = nil
 
self:SetText("")
self:SetLabel("")
self:SetDisabled(false)
self:SetMultiselect(false)
 
self.value = nil
self.list = nil
self.open = nil
self.hasClose = nil
 
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
-- exported
local function SetDisabled(self, disabled)
self.disabled = disabled
if disabled then
self.text:SetTextColor(0.5,0.5,0.5)
self.button:Disable()
self.label:SetTextColor(0.5,0.5,0.5)
else
self.button:Enable()
self.label:SetTextColor(1,.82,0)
self.text:SetTextColor(1,1,1)
end
end
 
-- exported
local function ClearFocus(self)
if self.open then
self.pullout:Close()
end
end
 
-- exported
local function SetText(self, text)
self.text:SetText(text or "")
end
 
-- exported
local function SetLabel(self, text)
if text and text ~= "" then
self.label:SetText(text)
self.label:Show()
self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,-18)
self.frame:SetHeight(44)
else
self.label:SetText("")
self.label:Hide()
self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,0)
self.frame:SetHeight(26)
end
end
 
-- exported
local function SetValue(self, value)
if self.list then
self:SetText(self.list[value] or "")
end
self.value = value
end
 
-- exported
local function GetValue(self)
return self.value
end
 
-- exported
local function SetItemValue(self, item, value)
if not self.multiselect then return end
for i, widget in self.pullout:IterateItems() do
if widget.userdata.value == item then
if widget.SetValue then
widget:SetValue(value)
end
end
end
ShowMultiText(self)
end
 
-- exported
local function SetItemDisabled(self, item, disabled)
for i, widget in self.pullout:IterateItems() do
if widget.userdata.value == item then
widget:SetDisabled(disabled)
end
end
end
 
local function AddListItem(self, value, text, itemType)
if not itemType then itemType = "Dropdown-Item-Toggle" end
local exists = AceGUI:GetWidgetVersion(itemType)
if not exists then error(("The given item type, %q, does not exist within AceGUI-3.0"):format(tostring(itemType)), 2) end
 
local item = AceGUI:Create(itemType)
item:SetText(text)
item.userdata.obj = self
item.userdata.value = value
item:SetCallback("OnValueChanged", OnItemValueChanged)
self.pullout:AddItem(item)
end
 
local function AddCloseButton(self)
if not self.hasClose then
local close = AceGUI:Create("Dropdown-Item-Execute")
close:SetText(CLOSE)
self.pullout:AddItem(close)
self.hasClose = true
end
end
 
-- exported
local sortlist = {}
local function SetList(self, list, order, itemType)
self.list = list
self.pullout:Clear()
self.hasClose = nil
if not list then return end
 
if type(order) ~= "table" then
for v in pairs(list) do
sortlist[#sortlist + 1] = v
end
tsort(sortlist)
 
for i, key in ipairs(sortlist) do
AddListItem(self, key, list[key], itemType)
sortlist[i] = nil
end
else
for i, key in ipairs(order) do
AddListItem(self, key, list[key], itemType)
end
end
if self.multiselect then
ShowMultiText(self)
AddCloseButton(self)
end
end
 
-- exported
local function AddItem(self, value, text, itemType)
if self.list then
self.list[value] = text
AddListItem(self, value, text, itemType)
end
end
 
-- exported
local function SetMultiselect(self, multi)
self.multiselect = multi
if multi then
ShowMultiText(self)
AddCloseButton(self)
end
end
 
-- exported
local function GetMultiselect(self)
return self.multiselect
end
 
--[[ Constructor ]]--
 
local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType)
local frame = CreateFrame("Frame", nil, UIParent)
local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
 
local self = {}
self.type = widgetType
self.frame = frame
self.dropdown = dropdown
self.count = count
frame.obj = self
dropdown.obj = self
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
self.ClearFocus = ClearFocus
 
self.SetText = SetText
self.SetValue = SetValue
self.GetValue = GetValue
self.SetList = SetList
self.SetLabel = SetLabel
self.SetDisabled = SetDisabled
self.AddItem = AddItem
self.SetMultiselect = SetMultiselect
self.GetMultiselect = GetMultiselect
self.SetItemValue = SetItemValue
self.SetItemDisabled = SetItemDisabled
 
self.alignoffset = 31
 
frame:SetHeight(44)
frame:SetWidth(200)
frame:SetScript("OnHide",Dropdown_OnHide)
 
dropdown:ClearAllPoints()
dropdown:SetPoint("TOPLEFT",frame,"TOPLEFT",-15,0)
dropdown:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",17,0)
dropdown:SetScript("OnHide", nil)
 
local left = _G[dropdown:GetName() .. "Left"]
local middle = _G[dropdown:GetName() .. "Middle"]
local right = _G[dropdown:GetName() .. "Right"]
 
middle:ClearAllPoints()
right:ClearAllPoints()
 
middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
 
local button = _G[dropdown:GetName() .. "Button"]
self.button = button
button.obj = self
button:SetScript("OnEnter",Control_OnEnter)
button:SetScript("OnLeave",Control_OnLeave)
button:SetScript("OnClick",Dropdown_TogglePullout)
 
local text = _G[dropdown:GetName() .. "Text"]
self.text = text
text.obj = self
text:ClearAllPoints()
text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
text:SetPoint("LEFT", left, "LEFT", 25, 2)
 
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
label:SetJustifyH("LEFT")
label:SetHeight(18)
label:Hide()
self.label = label
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
end
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua New file
0,0 → 1,256
--[[-----------------------------------------------------------------------------
EditBox Widget
-------------------------------------------------------------------------------]]
local Type, Version = "EditBox", 24
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local tostring, pairs = tostring, pairs
 
-- WoW APIs
local PlaySound = PlaySound
local GetCursorInfo, ClearCursor, GetSpellInfo = GetCursorInfo, ClearCursor, GetSpellInfo
local CreateFrame, UIParent = CreateFrame, UIParent
local _G = _G
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: AceGUIEditBoxInsertLink, ChatFontNormal, OKAY
 
--[[-----------------------------------------------------------------------------
Support functions
-------------------------------------------------------------------------------]]
if not AceGUIEditBoxInsertLink then
-- upgradeable hook
hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIEditBoxInsertLink(...) end)
end
 
function _G.AceGUIEditBoxInsertLink(text)
for i = 1, AceGUI:GetWidgetCount(Type) do
local editbox = _G["AceGUI-3.0EditBox"..i]
if editbox and editbox:IsVisible() and editbox:HasFocus() then
editbox:Insert(text)
return true
end
end
end
 
local function ShowButton(self)
if not self.disablebutton then
self.button:Show()
self.editbox:SetTextInsets(0, 20, 3, 3)
end
end
 
local function HideButton(self)
self.button:Hide()
self.editbox:SetTextInsets(0, 0, 3, 3)
end
 
--[[-----------------------------------------------------------------------------
Scripts
-------------------------------------------------------------------------------]]
local function Control_OnEnter(frame)
frame.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(frame)
frame.obj:Fire("OnLeave")
end
 
local function Frame_OnShowFocus(frame)
frame.obj.editbox:SetFocus()
frame:SetScript("OnShow", nil)
end
 
local function EditBox_OnEscapePressed(frame)
AceGUI:ClearFocus()
end
 
local function EditBox_OnEnterPressed(frame)
local self = frame.obj
local value = frame:GetText()
local cancel = self:Fire("OnEnterPressed", value)
if not cancel then
PlaySound("igMainMenuOptionCheckBoxOn")
HideButton(self)
end
end
 
local function EditBox_OnReceiveDrag(frame)
local self = frame.obj
local type, id, info = GetCursorInfo()
if type == "item" then
self:SetText(info)
self:Fire("OnEnterPressed", info)
ClearCursor()
elseif type == "spell" then
local name = GetSpellInfo(id, info)
self:SetText(name)
self:Fire("OnEnterPressed", name)
ClearCursor()
end
HideButton(self)
AceGUI:ClearFocus()
end
 
local function EditBox_OnTextChanged(frame)
local self = frame.obj
local value = frame:GetText()
if tostring(value) ~= tostring(self.lasttext) then
self:Fire("OnTextChanged", value)
self.lasttext = value
ShowButton(self)
end
end
 
local function EditBox_OnFocusGained(frame)
AceGUI:SetFocus(frame.obj)
end
 
local function Button_OnClick(frame)
local editbox = frame.obj.editbox
editbox:ClearFocus()
EditBox_OnEnterPressed(editbox)
end
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
-- height is controlled by SetLabel
self:SetWidth(200)
self:SetDisabled(false)
self:SetLabel()
self:SetText()
self:DisableButton(false)
self:SetMaxLetters(0)
end,
 
["OnRelease"] = function(self)
self:ClearFocus()
end,
 
["SetDisabled"] = function(self, disabled)
self.disabled = disabled
if disabled then
self.editbox:EnableMouse(false)
self.editbox:ClearFocus()
self.editbox:SetTextColor(0.5,0.5,0.5)
self.label:SetTextColor(0.5,0.5,0.5)
else
self.editbox:EnableMouse(true)
self.editbox:SetTextColor(1,1,1)
self.label:SetTextColor(1,.82,0)
end
end,
 
["SetText"] = function(self, text)
self.lasttext = text or ""
self.editbox:SetText(text or "")
self.editbox:SetCursorPosition(0)
HideButton(self)
end,
 
["GetText"] = function(self, text)
return self.editbox:GetText()
end,
 
["SetLabel"] = function(self, text)
if text and text ~= "" then
self.label:SetText(text)
self.label:Show()
self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,-18)
self:SetHeight(44)
self.alignoffset = 30
else
self.label:SetText("")
self.label:Hide()
self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,0)
self:SetHeight(26)
self.alignoffset = 12
end
end,
 
["DisableButton"] = function(self, disabled)
self.disablebutton = disabled
if disabled then
HideButton(self)
end
end,
 
["SetMaxLetters"] = function (self, num)
self.editbox:SetMaxLetters(num or 0)
end,
 
["ClearFocus"] = function(self)
self.editbox:ClearFocus()
self.frame:SetScript("OnShow", nil)
end,
 
["SetFocus"] = function(self)
self.editbox:SetFocus()
if not self.frame:IsShown() then
self.frame:SetScript("OnShow", Frame_OnShowFocus)
end
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local num = AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Frame", nil, UIParent)
frame:Hide()
 
local editbox = CreateFrame("EditBox", "AceGUI-3.0EditBox"..num, frame, "InputBoxTemplate")
editbox:SetAutoFocus(false)
editbox:SetFontObject(ChatFontNormal)
editbox:SetScript("OnEnter", Control_OnEnter)
editbox:SetScript("OnLeave", Control_OnLeave)
editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed)
editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed)
editbox:SetScript("OnTextChanged", EditBox_OnTextChanged)
editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag)
editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag)
editbox:SetScript("OnEditFocusGained", EditBox_OnFocusGained)
editbox:SetTextInsets(0, 0, 3, 3)
editbox:SetMaxLetters(256)
editbox:SetPoint("BOTTOMLEFT", 6, 0)
editbox:SetPoint("BOTTOMRIGHT")
editbox:SetHeight(19)
 
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
label:SetPoint("TOPLEFT", 0, -2)
label:SetPoint("TOPRIGHT", 0, -2)
label:SetJustifyH("LEFT")
label:SetHeight(18)
 
local button = CreateFrame("Button", nil, editbox, "UIPanelButtonTemplate")
button:SetWidth(40)
button:SetHeight(20)
button:SetPoint("RIGHT", -2, 0)
button:SetText(OKAY)
button:SetScript("OnClick", Button_OnClick)
button:Hide()
 
local widget = {
alignoffset = 30,
editbox = editbox,
label = label,
button = button,
frame = frame,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
editbox.obj, button.obj = widget, widget
 
return AceGUI:RegisterAsWidget(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua New file
0,0 → 1,78
--[[-----------------------------------------------------------------------------
Heading Widget
-------------------------------------------------------------------------------]]
local Type, Version = "Heading", 20
local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 
-- Lua APIs
local pairs = pairs
 
-- WoW APIs
local CreateFrame, UIParent = CreateFrame, UIParent
 
--[[-----------------------------------------------------------------------------
Methods
-------------------------------------------------------------------------------]]
local methods = {
["OnAcquire"] = function(self)
self:SetText()
self:SetFullWidth()
self:SetHeight(18)
end,
 
-- ["OnRelease"] = nil,
 
["SetText"] = function(self, text)
self.label:SetText(text or "")
if text and text ~= "" then
self.left:SetPoint("RIGHT", self.label, "LEFT", -5, 0)
self.right:Show()
else
self.left:SetPoint("RIGHT", -3, 0)
self.right:Hide()
end
end
}
 
--[[-----------------------------------------------------------------------------
Constructor
-------------------------------------------------------------------------------]]
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent)
frame:Hide()
 
local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontNormal")
label:SetPoint("TOP")
label:SetPoint("BOTTOM")
label:SetJustifyH("CENTER")
 
local left = frame:CreateTexture(nil, "BACKGROUND")
left:SetHeight(8)
left:SetPoint("LEFT", 3, 0)
left:SetPoint("RIGHT", label, "LEFT", -5, 0)
left:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
left:SetTexCoord(0.81, 0.94, 0.5, 1)
 
local right = frame:CreateTexture(nil, "BACKGROUND")
right:SetHeight(8)
right:SetPoint("RIGHT", -3, 0)
right:SetPoint("LEFT", label, "RIGHT", 5, 0)
right:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
right:SetTexCoord(0.81, 0.94, 0.5, 1)
 
local widget = {
label = label,
left = left,
right = right,
frame = frame,
type = Type
}
for method, func in pairs(methods) do
widget[method] = func
end
 
return AceGUI:RegisterAsWidget(widget)
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
RecipeRadar/libs/AceGUI-3.0/AceGUI-3.0.xml New file
0,0 → 1,28
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceGUI-3.0.lua"/>
<!-- Container -->
<Script file="widgets\AceGUIContainer-BlizOptionsGroup.lua"/>
<Script file="widgets\AceGUIContainer-DropDownGroup.lua"/>
<Script file="widgets\AceGUIContainer-Frame.lua"/>
<Script file="widgets\AceGUIContainer-InlineGroup.lua"/>
<Script file="widgets\AceGUIContainer-ScrollFrame.lua"/>
<Script file="widgets\AceGUIContainer-SimpleGroup.lua"/>
<Script file="widgets\AceGUIContainer-TabGroup.lua"/>
<Script file="widgets\AceGUIContainer-TreeGroup.lua"/>
<Script file="widgets\AceGUIContainer-Window.lua"/>
<!-- Widgets -->
<Script file="widgets\AceGUIWidget-Button.lua"/>
<Script file="widgets\AceGUIWidget-CheckBox.lua"/>
<Script file="widgets\AceGUIWidget-ColorPicker.lua"/>
<Script file="widgets\AceGUIWidget-DropDown.lua"/>
<Script file="widgets\AceGUIWidget-DropDown-Items.lua"/>
<Script file="widgets\AceGUIWidget-EditBox.lua"/>
<Script file="widgets\AceGUIWidget-Heading.lua"/>
<Script file="widgets\AceGUIWidget-Icon.lua"/>
<Script file="widgets\AceGUIWidget-InteractiveLabel.lua"/>
<Script file="widgets\AceGUIWidget-Keybinding.lua"/>
<Script file="widgets\AceGUIWidget-Label.lua"/>
<Script file="widgets\AceGUIWidget-MultiLineEditBox.lua"/>
<Script file="widgets\AceGUIWidget-Slider.lua"/>
</Ui>
RecipeRadar/libs/AceGUI-3.0/AceGUI-3.0.lua New file
0,0 → 1,805
--- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs.
-- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself
-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
-- stand-alone distribution.
--
-- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
-- as any "unknown" change to the widgets will cause addons that get your widget out of the widget pool
-- to misbehave. If you think some part of a widget should be modifiable, please open a ticket, and we"ll
-- implement a proper API to modify it.
-- @usage
-- local AceGUI = LibStub("AceGUI-3.0")
-- -- Create a container frame
-- local f = AceGUI:Create("Frame")
-- f:SetCallback("OnClose",function(widget) AceGUI:Release(widget) end)
-- f:SetTitle("AceGUI-3.0 Example")
-- f:SetStatusText("Status Bar")
-- f:SetLayout("Flow")
-- -- Create a button
-- local btn = AceGUI:Create("Button")
-- btn:SetWidth(170)
-- btn:SetText("Button !")
-- btn:SetCallback("OnClick", function() print("Click!") end)
-- -- Add the button to the container
-- f:AddChild(btn)
-- @class file
-- @name AceGUI-3.0
-- @release $Id: AceGUI-3.0.lua 924 2010-05-13 15:12:20Z nevcairiel $
local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 33
local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
 
if not AceGUI then return end -- No upgrade needed
 
-- Lua APIs
local tconcat, tremove, tinsert = table.concat, table.remove, table.insert
local select, pairs, next, type = select, pairs, next, type
local error, assert, loadstring = error, assert, loadstring
local setmetatable, rawget, rawset = setmetatable, rawget, rawset
local math_max = math.max
 
-- WoW APIs
local UIParent = UIParent
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: geterrorhandler, LibStub
 
--local con = LibStub("AceConsole-3.0",true)
 
AceGUI.WidgetRegistry = AceGUI.WidgetRegistry or {}
AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
AceGUI.WidgetBase = AceGUI.WidgetBase or {}
AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
 
-- local upvalues
local WidgetRegistry = AceGUI.WidgetRegistry
local LayoutRegistry = AceGUI.LayoutRegistry
local WidgetVersions = AceGUI.WidgetVersions
 
--[[
xpcall safecall implementation
]]
local xpcall = xpcall
 
local function errorhandler(err)
return geterrorhandler()(err)
end
 
local function CreateDispatcher(argCount)
local code = [[
local xpcall, eh = ...
local method, ARGS
local function call() return method(ARGS) end
 
local function dispatch(func, ...)
method = func
if not method then return end
ARGS = ...
return xpcall(call, eh)
end
 
return dispatch
]]
 
local ARGS = {}
for i = 1, argCount do ARGS[i] = "arg"..i end
code = code:gsub("ARGS", tconcat(ARGS, ", "))
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
end
 
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
local dispatcher = CreateDispatcher(argCount)
rawset(self, argCount, dispatcher)
return dispatcher
end})
Dispatchers[0] = function(func)
return xpcall(func, errorhandler)
end
 
local function safecall(func, ...)
return Dispatchers[select("#", ...)](func, ...)
end
 
-- Recycling functions
local newWidget, delWidget
do
-- Version Upgrade in Minor 29
-- Internal Storage of the objects changed, from an array table
-- to a hash table, and additionally we introduced versioning on
-- the widgets which would discard all widgets from a pre-29 version
-- anyway, so we just clear the storage now, and don't try to
-- convert the storage tables to the new format.
-- This should generally not cause *many* widgets to end up in trash,
-- since once dialogs are opened, all addons should be loaded already
-- and AceGUI should be on the latest version available on the users
-- setup.
-- -- nevcairiel - Nov 2nd, 2009
if oldminor and oldminor < 29 and AceGUI.objPools then
AceGUI.objPools = nil
end
 
AceGUI.objPools = AceGUI.objPools or {}
local objPools = AceGUI.objPools
--Returns a new instance, if none are available either returns a new table or calls the given contructor
function newWidget(type)
if not WidgetRegistry[type] then
error("Attempt to instantiate unknown widget type", 2)
end
 
if not objPools[type] then
objPools[type] = {}
end
 
local newObj = next(objPools[type])
if not newObj then
newObj = WidgetRegistry[type]()
newObj.AceGUIWidgetVersion = WidgetVersions[type]
else
objPools[type][newObj] = nil
-- if the widget is older then the latest, don't even try to reuse it
-- just forget about it, and grab a new one.
if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[type] then
return newWidget(type)
end
end
return newObj
end
-- Releases an instance to the Pool
function delWidget(obj,type)
if not objPools[type] then
objPools[type] = {}
end
if objPools[type][obj] then
error("Attempt to Release Widget that is already released", 2)
end
objPools[type][obj] = true
end
end
 
 
-------------------
-- API Functions --
-------------------
 
-- Gets a widget Object
 
--- Create a new Widget of the given type.
-- This function will instantiate a new widget (or use one from the widget pool), and call the
-- OnAcquire function on it, before returning.
-- @param type The type of the widget.
-- @return The newly created widget.
function AceGUI:Create(type)
if WidgetRegistry[type] then
local widget = newWidget(type)
 
if rawget(widget, "Acquire") then
widget.OnAcquire = widget.Acquire
widget.Acquire = nil
elseif rawget(widget, "Aquire") then
widget.OnAcquire = widget.Aquire
widget.Aquire = nil
end
 
if rawget(widget, "Release") then
widget.OnRelease = rawget(widget, "Release")
widget.Release = nil
end
 
if widget.OnAcquire then
widget:OnAcquire()
else
error(("Widget type %s doesn't supply an OnAcquire Function"):format(type))
end
-- Set the default Layout ("List")
safecall(widget.SetLayout, widget, "List")
safecall(widget.ResumeLayout, widget)
return widget
end
end
 
--- Releases a widget Object.
-- This function calls OnRelease on the widget and places it back in the widget pool.
-- Any data on the widget is being erased, and the widget will be hidden.\\
-- If this widget is a Container-Widget, all of its Child-Widgets will be releases as well.
-- @param widget The widget to release
function AceGUI:Release(widget)
safecall(widget.PauseLayout, widget)
widget:Fire("OnRelease")
safecall(widget.ReleaseChildren, widget)
 
if widget.OnRelease then
widget:OnRelease()
-- else
-- error(("Widget type %s doesn't supply an OnRelease Function"):format(widget.type))
end
for k in pairs(widget.userdata) do
widget.userdata[k] = nil
end
for k in pairs(widget.events) do
widget.events[k] = nil
end
widget.width = nil
widget.relWidth = nil
widget.height = nil
widget.relHeight = nil
widget.noAutoHeight = nil
widget.frame:ClearAllPoints()
widget.frame:Hide()
widget.frame:SetParent(UIParent)
widget.frame.width = nil
widget.frame.height = nil
if widget.content then
widget.content.width = nil
widget.content.height = nil
end
delWidget(widget, widget.type)
end
 
-----------
-- Focus --
-----------
 
 
--- Called when a widget has taken focus.
-- e.g. Dropdowns opening, Editboxes gaining kb focus
-- @param widget The widget that should be focused
function AceGUI:SetFocus(widget)
if self.FocusedWidget and self.FocusedWidget ~= widget then
safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
end
self.FocusedWidget = widget
end
 
 
--- Called when something has happened that could cause widgets with focus to drop it
-- e.g. titlebar of a frame being clicked
function AceGUI:ClearFocus()
if self.FocusedWidget then
safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
self.FocusedWidget = nil
end
end
 
-------------
-- Widgets --
-------------
--[[
Widgets must provide the following functions
OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
 
And the following members
frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
type - the type of the object, same as the name given to :RegisterWidget()
 
Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
It will be cleared automatically when a widget is released
Placing values directly into a widget object should be avoided
 
If the Widget can act as a container for other Widgets the following
content - frame or derivitive that children will be anchored to
 
The Widget can supply the following Optional Members
:OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data
:OnWidthSet(width) - Called when the width of the widget is changed
:OnHeightSet(height) - Called when the height of the widget is changed
Widgets should not use the OnSizeChanged events of thier frame or content members, use these methods instead
AceGUI already sets a handler to the event
:LayoutFinished(width, height) - called after a layout has finished, the width and height will be the width and height of the
area used for controls. These can be nil if the layout used the existing size to layout the controls.
 
]]
 
--------------------------
-- Widget Base Template --
--------------------------
do
local WidgetBase = AceGUI.WidgetBase
 
WidgetBase.SetParent = function(self, parent)
local frame = self.frame
frame:SetParent(nil)
frame:SetParent(parent.content)
self.parent = parent
end
 
WidgetBase.SetCallback = function(self, name, func)
if type(func) == "function" then
self.events[name] = func
end
end
 
WidgetBase.Fire = function(self, name, ...)
if self.events[name] then
local success, ret = safecall(self.events[name], self, name, ...)
if success then
return ret
end
end
end
 
WidgetBase.SetWidth = function(self, width)
self.frame:SetWidth(width)
self.frame.width = width
if self.OnWidthSet then
self:OnWidthSet(width)
end
end
 
WidgetBase.SetRelativeWidth = function(self, width)
if width <= 0 or width > 1 then
error(":SetRelativeWidth(width): Invalid relative width.", 2)
end
self.relWidth = width
self.width = "relative"
end
 
WidgetBase.SetHeight = function(self, height)
self.frame:SetHeight(height)
self.frame.height = height
if self.OnHeightSet then
self:OnHeightSet(height)
end
end
 
--[[ WidgetBase.SetRelativeHeight = function(self, height)
if height <= 0 or height > 1 then
error(":SetRelativeHeight(height): Invalid relative height.", 2)
end
self.relHeight = height
self.height = "relative"
end ]]
 
WidgetBase.IsVisible = function(self)
return self.frame:IsVisible()
end
 
WidgetBase.IsShown= function(self)
return self.frame:IsShown()
end
 
WidgetBase.Release = function(self)
AceGUI:Release(self)
end
 
WidgetBase.SetPoint = function(self, ...)
return self.frame:SetPoint(...)
end
 
WidgetBase.ClearAllPoints = function(self)
return self.frame:ClearAllPoints()
end
 
WidgetBase.GetNumPoints = function(self)
return self.frame:GetNumPoints()
end
 
WidgetBase.GetPoint = function(self, ...)
return self.frame:GetPoint(...)
end
 
WidgetBase.GetUserDataTable = function(self)
return self.userdata
end
 
WidgetBase.SetUserData = function(self, key, value)
self.userdata[key] = value
end
 
WidgetBase.GetUserData = function(self, key)
return self.userdata[key]
end
 
WidgetBase.IsFullHeight = function(self)
return self.height == "fill"
end
 
WidgetBase.SetFullHeight = function(self, isFull)
if isFull then
self.height = "fill"
else
self.height = nil
end
end
 
WidgetBase.IsFullWidth = function(self)
return self.width == "fill"
end
 
WidgetBase.SetFullWidth = function(self, isFull)
if isFull then
self.width = "fill"
else
self.width = nil
end
end
 
-- local function LayoutOnUpdate(this)
-- this:SetScript("OnUpdate",nil)
-- this.obj:PerformLayout()
-- end
 
local WidgetContainerBase = AceGUI.WidgetContainerBase
 
WidgetContainerBase.PauseLayout = function(self)
self.LayoutPaused = true
end
 
WidgetContainerBase.ResumeLayout = function(self)
self.LayoutPaused = nil
end
 
WidgetContainerBase.PerformLayout = function(self)
if self.LayoutPaused then
return
end
safecall(self.LayoutFunc, self.content, self.children)
end
 
--call this function to layout, makes sure layed out objects get a frame to get sizes etc
WidgetContainerBase.DoLayout = function(self)
self:PerformLayout()
-- if not self.parent then
-- self.frame:SetScript("OnUpdate", LayoutOnUpdate)
-- end
end
 
WidgetContainerBase.AddChild = function(self, child, beforeWidget)
if beforeWidget then
local siblingIndex = 1
for _, widget in pairs(self.children) do
if widget == beforeWidget then
break
end
siblingIndex = siblingIndex + 1
end
tinsert(self.children, siblingIndex, child)
else
tinsert(self.children, child)
end
child:SetParent(self)
child.frame:Show()
self:DoLayout()
end
 
WidgetContainerBase.AddChildren = function(self, ...)
for i = 1, select("#", ...) do
local child = select(i, ...)
tinsert(self.children, child)
child:SetParent(self)
child.frame:Show()
end
self:DoLayout()
end
 
WidgetContainerBase.ReleaseChildren = function(self)
local children = self.children
for i = 1,#children do
AceGUI:Release(children[i])
children[i] = nil
end
end
 
WidgetContainerBase.SetLayout = function(self, Layout)
self.LayoutFunc = AceGUI:GetLayout(Layout)
end
 
WidgetContainerBase.SetAutoAdjustHeight = function(self, adjust)
if adjust then
self.noAutoHeight = nil
else
self.noAutoHeight = true
end
end
 
local function FrameResize(this)
local self = this.obj
if this:GetWidth() and this:GetHeight() then
if self.OnWidthSet then
self:OnWidthSet(this:GetWidth())
end
if self.OnHeightSet then
self:OnHeightSet(this:GetHeight())
end
end
end
 
local function ContentResize(this)
if this:GetWidth() and this:GetHeight() then
this.width = this:GetWidth()
this.height = this:GetHeight()
this.obj:DoLayout()
end
end
 
setmetatable(WidgetContainerBase, {__index=WidgetBase})
 
--One of these function should be called on each Widget Instance as part of its creation process
 
--- Register a widget-class as a container for newly created widgets.
-- @param widget The widget class
function AceGUI:RegisterAsContainer(widget)
widget.children = {}
widget.userdata = {}
widget.events = {}
widget.base = WidgetContainerBase
widget.content.obj = widget
widget.frame.obj = widget
widget.content:SetScript("OnSizeChanged", ContentResize)
widget.frame:SetScript("OnSizeChanged", FrameResize)
setmetatable(widget, {__index = WidgetContainerBase})
widget:SetLayout("List")
return widget
end
 
--- Register a widget-class as a widget.
-- @param widget The widget class
function AceGUI:RegisterAsWidget(widget)
widget.userdata = {}
widget.events = {}
widget.base = WidgetBase
widget.frame.obj = widget
widget.frame:SetScript("OnSizeChanged", FrameResize)
setmetatable(widget, {__index = WidgetBase})
return widget
end
end
 
 
 
 
------------------
-- Widget API --
------------------
 
--- Registers a widget Constructor, this function returns a new instance of the Widget
-- @param Name The name of the widget
-- @param Constructor The widget constructor function
-- @param Version The version of the widget
function AceGUI:RegisterWidgetType(Name, Constructor, Version)
assert(type(Constructor) == "function")
assert(type(Version) == "number")
 
local oldVersion = WidgetVersions[Name]
if oldVersion and oldVersion >= Version then return end
 
WidgetVersions[Name] = Version
WidgetRegistry[Name] = Constructor
end
 
--- Registers a Layout Function
-- @param Name The name of the layout
-- @param LayoutFunc Reference to the layout function
function AceGUI:RegisterLayout(Name, LayoutFunc)
assert(type(LayoutFunc) == "function")
if type(Name) == "string" then
Name = Name:upper()
end
LayoutRegistry[Name] = LayoutFunc
end
 
--- Get a Layout Function from the registry
-- @param Name The name of the layout
function AceGUI:GetLayout(Name)
if type(Name) == "string" then
Name = Name:upper()
end
return LayoutRegistry[Name]
end
 
AceGUI.counts = AceGUI.counts or {}
 
--- A type-based counter to count the number of widgets created.
-- This is used by widgets that require a named frame, e.g. when a Blizzard
-- Template requires it.
-- @param type The widget type
function AceGUI:GetNextWidgetNum(type)
if not self.counts[type] then
self.counts[type] = 0
end
self.counts[type] = self.counts[type] + 1
return self.counts[type]
end
 
--- Return the number of created widgets for this type.
-- In contrast to GetNextWidgetNum, the number is not incremented.
-- @param type The widget type
function AceGUI:GetWidgetCount(type)
return self.counts[type] or 0
end
 
--- Return the version of the currently registered widget type.
-- @param type The widget type
function AceGUI:GetWidgetVersion(type)
return WidgetVersions[type]
end
 
-------------
-- Layouts --
-------------
 
--[[
A Layout is a func that takes 2 parameters
content - the frame that widgets will be placed inside
children - a table containing the widgets to layout
]]
 
-- Very simple Layout, Children are stacked on top of each other down the left side
AceGUI:RegisterLayout("List",
function(content, children)
local height = 0
local width = content.width or content:GetWidth() or 0
for i = 1, #children do
local child = children[i]
 
local frame = child.frame
frame:ClearAllPoints()
frame:Show()
if i == 1 then
frame:SetPoint("TOPLEFT", content)
else
frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
end
 
if child.width == "fill" then
child:SetWidth(width)
frame:SetPoint("RIGHT", content)
 
if child.DoLayout then
child:DoLayout()
end
elseif child.width == "relative" then
child:SetWidth(width * child.relWidth)
 
if child.DoLayout then
child:DoLayout()
end
end
 
height = height + (frame.height or frame:GetHeight() or 0)
end
safecall(content.obj.LayoutFinished, content.obj, nil, height)
end)
 
-- A single control fills the whole content area
AceGUI:RegisterLayout("Fill",
function(content, children)
if children[1] then
children[1]:SetWidth(content:GetWidth() or 0)
children[1]:SetHeight(content:GetHeight() or 0)
children[1].frame:SetAllPoints(content)
children[1].frame:Show()
safecall(content.obj.LayoutFinished, content.obj, nil, children[1].frame:GetHeight())
end
end)
 
AceGUI:RegisterLayout("Flow",
function(content, children)
--used height so far
local height = 0
--width used in the current row
local usedwidth = 0
--height of the current row
local rowheight = 0
local rowoffset = 0
local lastrowoffset
 
local width = content.width or content:GetWidth() or 0
 
--control at the start of the row
local rowstart
local rowstartoffset
local lastrowstart
local isfullheight
 
local frameoffset
local lastframeoffset
local oversize
for i = 1, #children do
local child = children[i]
oversize = nil
local frame = child.frame
local frameheight = frame.height or frame:GetHeight() or 0
local framewidth = frame.width or frame:GetWidth() or 0
lastframeoffset = frameoffset
-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
-- That was moving all widgets half the widgets size down, is that intended?
-- Actually, it seems to be neccessary for many cases, we'll leave it in for now.
-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
-- TODO: Investigate moar!
frameoffset = child.alignoffset or (frameheight / 2)
 
if child.width == "relative" then
framewidth = width * child.relWidth
end
 
frame:Show()
frame:ClearAllPoints()
if i == 1 then
-- anchor the first control to the top left
frame:SetPoint("TOPLEFT", content)
rowheight = frameheight
rowoffset = frameoffset
rowstart = frame
rowstartoffset = frameoffset
usedwidth = framewidth
if usedwidth > width then
oversize = true
end
else
-- if there isn't available width for the control start a new row
-- if a control is "fill" it will be on a row of its own full width
if usedwidth == 0 or ((framewidth) + usedwidth > width) or child.width == "fill" then
if isfullheight then
-- a previous row has already filled the entire height, there's nothing we can usefully do anymore
-- (maybe error/warn about this?)
break
end
--anchor the previous row, we will now know its height and offset
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
height = height + rowheight + 3
--save this as the rowstart so we can anchor it after the row is complete and we have the max height and offset of controls in it
rowstart = frame
rowstartoffset = frameoffset
rowheight = frameheight
rowoffset = frameoffset
usedwidth = framewidth
if usedwidth > width then
oversize = true
end
-- put the control on the current row, adding it to the width and checking if the height needs to be increased
else
--handles cases where the new height is higher than either control because of the offsets
--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
 
--offset is always the larger of the two offsets
rowoffset = math_max(rowoffset, frameoffset)
rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
 
frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
usedwidth = framewidth + usedwidth
end
end
 
if child.width == "fill" then
child:SetWidth(width)
frame:SetPoint("RIGHT", content)
 
usedwidth = 0
rowstart = frame
rowstartoffset = frameoffset
 
if child.DoLayout then
child:DoLayout()
end
rowheight = frame.height or frame:GetHeight() or 0
rowoffset = child.alignoffset or (rowheight / 2)
rowstartoffset = rowoffset
elseif child.width == "relative" then
child:SetWidth(width * child.relWidth)
 
if child.DoLayout then
child:DoLayout()
end
elseif oversize then
if width > 1 then
frame:SetPoint("RIGHT", content)
end
end
 
if child.height == "fill" then
frame:SetPoint("BOTTOM", content)
isfullheight = true
end
end
 
--anchor the last row, if its full height needs a special case since its height has just been changed by the anchor
if isfullheight then
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
elseif rowstart then
rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
end
 
height = height + rowheight + 3
safecall(content.obj.LayoutFinished, content.obj, nil, height)
end)
RecipeRadar/libs/AceAddon-3.0/AceAddon-3.0.xml New file
0,0 → 1,4
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceAddon-3.0.lua"/>
</Ui>
\ No newline at end of file
RecipeRadar/libs/AceAddon-3.0/AceAddon-3.0.lua New file
0,0 → 1,658
--- **AceAddon-3.0** provides a template for creating addon objects.
-- It'll provide you with a set of callback functions that allow you to simplify the loading
-- process of your addon.\\
-- Callbacks provided are:\\
-- * **OnInitialize**, which is called directly after the addon is fully loaded.
-- * **OnEnable** which gets called during the PLAYER_LOGIN event, when most of the data provided by the game is already present.
-- * **OnDisable**, which is only called when your addon is manually being disabled.
-- @usage
-- -- A small (but complete) addon, that doesn't do anything,
-- -- but shows usage of the callbacks.
-- local MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
--
-- function MyAddon:OnInitialize()
-- -- do init tasks here, like loading the Saved Variables,
-- -- or setting up slash commands.
-- end
--
-- function MyAddon:OnEnable()
-- -- Do more initialization here, that really enables the use of your addon.
-- -- Register Events, Hook functions, Create Frames, Get information from
-- -- the game that wasn't available in OnInitialize
-- end
--
-- function MyAddon:OnDisable()
-- -- Unhook, Unregister Events, Hide frames that you created.
-- -- You would probably only use an OnDisable if you want to
-- -- build a "standby" mode, or be able to toggle modules on/off.
-- end
-- @class file
-- @name AceAddon-3.0.lua
-- @release $Id: AceAddon-3.0.lua 980 2010-10-27 14:20:11Z nevcairiel $
 
local MAJOR, MINOR = "AceAddon-3.0", 10
local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceAddon then return end -- No Upgrade needed.
 
AceAddon.frame = AceAddon.frame or CreateFrame("Frame", "AceAddon30Frame") -- Our very own frame
AceAddon.addons = AceAddon.addons or {} -- addons in general
AceAddon.statuses = AceAddon.statuses or {} -- statuses of addon.
AceAddon.initializequeue = AceAddon.initializequeue or {} -- addons that are new and not initialized
AceAddon.enablequeue = AceAddon.enablequeue or {} -- addons that are initialized and waiting to be enabled
AceAddon.embeds = AceAddon.embeds or setmetatable({}, {__index = function(tbl, key) tbl[key] = {} return tbl[key] end }) -- contains a list of libraries embedded in an addon
 
-- Lua APIs
local tinsert, tconcat, tremove = table.insert, table.concat, table.remove
local fmt, tostring = string.format, tostring
local select, pairs, next, type, unpack = select, pairs, next, type, unpack
local loadstring, assert, error = loadstring, assert, error
local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: LibStub, IsLoggedIn, geterrorhandler
 
--[[
xpcall safecall implementation
]]
local xpcall = xpcall
 
local function errorhandler(err)
return geterrorhandler()(err)
end
 
local function CreateDispatcher(argCount)
local code = [[
local xpcall, eh = ...
local method, ARGS
local function call() return method(ARGS) end
 
local function dispatch(func, ...)
method = func
if not method then return end
ARGS = ...
return xpcall(call, eh)
end
 
return dispatch
]]
 
local ARGS = {}
for i = 1, argCount do ARGS[i] = "arg"..i end
code = code:gsub("ARGS", tconcat(ARGS, ", "))
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
end
 
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
local dispatcher = CreateDispatcher(argCount)
rawset(self, argCount, dispatcher)
return dispatcher
end})
Dispatchers[0] = function(func)
return xpcall(func, errorhandler)
end
 
local function safecall(func, ...)
-- we check to see if the func is passed is actually a function here and don't error when it isn't
-- this safecall is used for optional functions like OnInitialize OnEnable etc. When they are not
-- present execution should continue without hinderance
if type(func) == "function" then
return Dispatchers[select('#', ...)](func, ...)
end
end
 
-- local functions that will be implemented further down
local Enable, Disable, EnableModule, DisableModule, Embed, NewModule, GetModule, GetName, SetDefaultModuleState, SetDefaultModuleLibraries, SetEnabledState, SetDefaultModulePrototype
 
-- used in the addon metatable
local function addontostring( self ) return self.name end
 
--- Create a new AceAddon-3.0 addon.
-- Any libraries you specified will be embeded, and the addon will be scheduled for
-- its OnInitialize and OnEnable callbacks.
-- The final addon object, with all libraries embeded, will be returned.
-- @paramsig [object ,]name[, lib, ...]
-- @param object Table to use as a base for the addon (optional)
-- @param name Name of the addon object to create
-- @param lib List of libraries to embed into the addon
-- @usage
-- -- Create a simple addon object
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceEvent-3.0")
--
-- -- Create a Addon object based on the table of a frame
-- local MyFrame = CreateFrame("Frame")
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon(MyFrame, "MyAddon", "AceEvent-3.0")
function AceAddon:NewAddon(objectorname, ...)
local object,name
local i=1
if type(objectorname)=="table" then
object=objectorname
name=...
i=2
else
name=objectorname
end
if type(name)~="string" then
error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2)
end
if self.addons[name] then
error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - Addon '%s' already exists."):format(name), 2)
end
 
object = object or {}
object.name = name
 
local addonmeta = {}
local oldmeta = getmetatable(object)
if oldmeta then
for k, v in pairs(oldmeta) do addonmeta[k] = v end
end
addonmeta.__tostring = addontostring
 
setmetatable( object, addonmeta )
self.addons[name] = object
object.modules = {}
object.orderedModules = {}
object.defaultModuleLibraries = {}
Embed( object ) -- embed NewModule, GetModule methods
self:EmbedLibraries(object, select(i,...))
 
-- add to queue of addons to be initialized upon ADDON_LOADED
tinsert(self.initializequeue, object)
return object
end
 
 
--- Get the addon object by its name from the internal AceAddon registry.
-- Throws an error if the addon object cannot be found (except if silent is set).
-- @param name unique name of the addon object
-- @param silent if true, the addon is optional, silently return nil if its not found
-- @usage
-- -- Get the Addon
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
function AceAddon:GetAddon(name, silent)
if not silent and not self.addons[name] then
error(("Usage: GetAddon(name): 'name' - Cannot find an AceAddon '%s'."):format(tostring(name)), 2)
end
return self.addons[name]
end
 
-- - Embed a list of libraries into the specified addon.
-- This function will try to embed all of the listed libraries into the addon
-- and error if a single one fails.
--
-- **Note:** This function is for internal use by :NewAddon/:NewModule
-- @paramsig addon, [lib, ...]
-- @param addon addon object to embed the libs in
-- @param lib List of libraries to embed into the addon
function AceAddon:EmbedLibraries(addon, ...)
for i=1,select("#", ... ) do
local libname = select(i, ...)
self:EmbedLibrary(addon, libname, false, 4)
end
end
 
-- - Embed a library into the addon object.
-- This function will check if the specified library is registered with LibStub
-- and if it has a :Embed function to call. It'll error if any of those conditions
-- fails.
--
-- **Note:** This function is for internal use by :EmbedLibraries
-- @paramsig addon, libname[, silent[, offset]]
-- @param addon addon object to embed the library in
-- @param libname name of the library to embed
-- @param silent marks an embed to fail silently if the library doesn't exist (optional)
-- @param offset will push the error messages back to said offset, defaults to 2 (optional)
function AceAddon:EmbedLibrary(addon, libname, silent, offset)
local lib = LibStub:GetLibrary(libname, true)
if not lib and not silent then
error(("Usage: EmbedLibrary(addon, libname, silent, offset): 'libname' - Cannot find a library instance of %q."):format(tostring(libname)), offset or 2)
elseif lib and type(lib.Embed) == "function" then
lib:Embed(addon)
tinsert(self.embeds[addon], libname)
return true
elseif lib then
error(("Usage: EmbedLibrary(addon, libname, silent, offset): 'libname' - Library '%s' is not Embed capable"):format(libname), offset or 2)
end
end
 
--- Return the specified module from an addon object.
-- Throws an error if the addon object cannot be found (except if silent is set)
-- @name //addon//:GetModule
-- @paramsig name[, silent]
-- @param name unique name of the module
-- @param silent if true, the module is optional, silently return nil if its not found (optional)
-- @usage
-- -- Get the Addon
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- -- Get the Module
-- MyModule = MyAddon:GetModule("MyModule")
function GetModule(self, name, silent)
if not self.modules[name] and not silent then
error(("Usage: GetModule(name, silent): 'name' - Cannot find module '%s'."):format(tostring(name)), 2)
end
return self.modules[name]
end
 
local function IsModuleTrue(self) return true end
 
--- Create a new module for the addon.
-- The new module can have its own embeded libraries and/or use a module prototype to be mixed into the module.\\
-- A module has the same functionality as a real addon, it can have modules of its own, and has the same API as
-- an addon object.
-- @name //addon//:NewModule
-- @paramsig name[, prototype|lib[, lib, ...]]
-- @param name unique name of the module
-- @param prototype object to derive this module from, methods and values from this table will be mixed into the module (optional)
-- @param lib List of libraries to embed into the addon
-- @usage
-- -- Create a module with some embeded libraries
-- MyModule = MyAddon:NewModule("MyModule", "AceEvent-3.0", "AceHook-3.0")
--
-- -- Create a module with a prototype
-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
-- MyModule = MyAddon:NewModule("MyModule", prototype, "AceEvent-3.0", "AceHook-3.0")
function NewModule(self, name, prototype, ...)
if type(name) ~= "string" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2) end
if type(prototype) ~= "string" and type(prototype) ~= "table" and type(prototype) ~= "nil" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'prototype' - table (prototype), string (lib) or nil expected got '%s'."):format(type(prototype)), 2) end
 
if self.modules[name] then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - Module '%s' already exists."):format(name), 2) end
 
-- modules are basically addons. We treat them as such. They will be added to the initializequeue properly as well.
-- NewModule can only be called after the parent addon is present thus the modules will be initialized after their parent is.
local module = AceAddon:NewAddon(fmt("%s_%s", self.name or tostring(self), name))
 
module.IsModule = IsModuleTrue
module:SetEnabledState(self.defaultModuleState)
module.moduleName = name
 
if type(prototype) == "string" then
AceAddon:EmbedLibraries(module, prototype, ...)
else
AceAddon:EmbedLibraries(module, ...)
end
AceAddon:EmbedLibraries(module, unpack(self.defaultModuleLibraries))
 
if not prototype or type(prototype) == "string" then
prototype = self.defaultModulePrototype or nil
end
 
if type(prototype) == "table" then
local mt = getmetatable(module)
mt.__index = prototype
setmetatable(module, mt) -- More of a Base class type feel.
end
 
safecall(self.OnModuleCreated, self, module) -- Was in Ace2 and I think it could be a cool thing to have handy.
self.modules[name] = module
tinsert(self.orderedModules, module)
 
return module
end
 
--- Returns the real name of the addon or module, without any prefix.
-- @name //addon//:GetName
-- @paramsig
-- @usage
-- print(MyAddon:GetName())
-- -- prints "MyAddon"
function GetName(self)
return self.moduleName or self.name
end
 
--- Enables the Addon, if possible, return true or false depending on success.
-- This internally calls AceAddon:EnableAddon(), thus dispatching a OnEnable callback
-- and enabling all modules of the addon (unless explicitly disabled).\\
-- :Enable() also sets the internal `enableState` variable to true
-- @name //addon//:Enable
-- @paramsig
-- @usage
-- -- Enable MyModule
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyModule = MyAddon:GetModule("MyModule")
-- MyModule:Enable()
function Enable(self)
self:SetEnabledState(true)
return AceAddon:EnableAddon(self)
end
 
--- Disables the Addon, if possible, return true or false depending on success.
-- This internally calls AceAddon:DisableAddon(), thus dispatching a OnDisable callback
-- and disabling all modules of the addon.\\
-- :Disable() also sets the internal `enableState` variable to false
-- @name //addon//:Disable
-- @paramsig
-- @usage
-- -- Disable MyAddon
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyAddon:Disable()
function Disable(self)
self:SetEnabledState(false)
return AceAddon:DisableAddon(self)
end
 
--- Enables the Module, if possible, return true or false depending on success.
-- Short-hand function that retrieves the module via `:GetModule` and calls `:Enable` on the module object.
-- @name //addon//:EnableModule
-- @paramsig name
-- @usage
-- -- Enable MyModule using :GetModule
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyModule = MyAddon:GetModule("MyModule")
-- MyModule:Enable()
--
-- -- Enable MyModule using the short-hand
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyAddon:EnableModule("MyModule")
function EnableModule(self, name)
local module = self:GetModule( name )
return module:Enable()
end
 
--- Disables the Module, if possible, return true or false depending on success.
-- Short-hand function that retrieves the module via `:GetModule` and calls `:Disable` on the module object.
-- @name //addon//:DisableModule
-- @paramsig name
-- @usage
-- -- Disable MyModule using :GetModule
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyModule = MyAddon:GetModule("MyModule")
-- MyModule:Disable()
--
-- -- Disable MyModule using the short-hand
-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
-- MyAddon:DisableModule("MyModule")
function DisableModule(self, name)
local module = self:GetModule( name )
return module:Disable()
end
 
--- Set the default libraries to be mixed into all modules created by this object.
-- Note that you can only change the default module libraries before any module is created.
-- @name //addon//:SetDefaultModuleLibraries
-- @paramsig lib[, lib, ...]
-- @param lib List of libraries to embed into the addon
-- @usage
-- -- Create the addon object
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
-- -- Configure default libraries for modules (all modules need AceEvent-3.0)
-- MyAddon:SetDefaultModuleLibraries("AceEvent-3.0")
-- -- Create a module
-- MyModule = MyAddon:NewModule("MyModule")
function SetDefaultModuleLibraries(self, ...)
if next(self.modules) then
error("Usage: SetDefaultModuleLibraries(...): cannot change the module defaults after a module has been registered.", 2)
end
self.defaultModuleLibraries = {...}
end
 
--- Set the default state in which new modules are being created.
-- Note that you can only change the default state before any module is created.
-- @name //addon//:SetDefaultModuleState
-- @paramsig state
-- @param state Default state for new modules, true for enabled, false for disabled
-- @usage
-- -- Create the addon object
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
-- -- Set the default state to "disabled"
-- MyAddon:SetDefaultModuleState(false)
-- -- Create a module and explicilty enable it
-- MyModule = MyAddon:NewModule("MyModule")
-- MyModule:Enable()
function SetDefaultModuleState(self, state)
if next(self.modules) then
error("Usage: SetDefaultModuleState(state): cannot change the module defaults after a module has been registered.", 2)
end
self.defaultModuleState = state
end
 
--- Set the default prototype to use for new modules on creation.
-- Note that you can only change the default prototype before any module is created.
-- @name //addon//:SetDefaultModulePrototype
-- @paramsig prototype
-- @param prototype Default prototype for the new modules (table)
-- @usage
-- -- Define a prototype
-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
-- -- Set the default prototype
-- MyAddon:SetDefaultModulePrototype(prototype)
-- -- Create a module and explicitly Enable it
-- MyModule = MyAddon:NewModule("MyModule")
-- MyModule:Enable()
-- -- should print "OnEnable called!" now
-- @see NewModule
function SetDefaultModulePrototype(self, prototype)
if next(self.modules) then
error("Usage: SetDefaultModulePrototype(prototype): cannot change the module defaults after a module has been registered.", 2)
end
if type(prototype) ~= "table" then
error(("Usage: SetDefaultModulePrototype(prototype): 'prototype' - table expected got '%s'."):format(type(prototype)), 2)
end
self.defaultModulePrototype = prototype
end
 
--- Set the state of an addon or module
-- This should only be called before any enabling actually happend, e.g. in/before OnInitialize.
-- @name //addon//:SetEnabledState
-- @paramsig state
-- @param state the state of an addon or module (enabled=true, disabled=false)
function SetEnabledState(self, state)
self.enabledState = state
end
 
 
--- Return an iterator of all modules associated to the addon.
-- @name //addon//:IterateModules
-- @paramsig
-- @usage
-- -- Enable all modules
-- for name, module in MyAddon:IterateModules() do
-- module:Enable()
-- end
local function IterateModules(self) return pairs(self.modules) end
 
-- Returns an iterator of all embeds in the addon
-- @name //addon//:IterateEmbeds
-- @paramsig
local function IterateEmbeds(self) return pairs(AceAddon.embeds[self]) end
 
--- Query the enabledState of an addon.
-- @name //addon//:IsEnabled
-- @paramsig
-- @usage
-- if MyAddon:IsEnabled() then
-- MyAddon:Disable()
-- end
local function IsEnabled(self) return self.enabledState end
local mixins = {
NewModule = NewModule,
GetModule = GetModule,
Enable = Enable,
Disable = Disable,
EnableModule = EnableModule,
DisableModule = DisableModule,
IsEnabled = IsEnabled,
SetDefaultModuleLibraries = SetDefaultModuleLibraries,
SetDefaultModuleState = SetDefaultModuleState,
SetDefaultModulePrototype = SetDefaultModulePrototype,
SetEnabledState = SetEnabledState,
IterateModules = IterateModules,
IterateEmbeds = IterateEmbeds,
GetName = GetName,
}
local function IsModule(self) return false end
local pmixins = {
defaultModuleState = true,
enabledState = true,
IsModule = IsModule,
}
-- Embed( target )
-- target (object) - target object to embed aceaddon in
--
-- this is a local function specifically since it's meant to be only called internally
function Embed(target, skipPMixins)
for k, v in pairs(mixins) do
target[k] = v
end
if not skipPMixins then
for k, v in pairs(pmixins) do
target[k] = target[k] or v
end
end
end
 
 
-- - Initialize the addon after creation.
-- This function is only used internally during the ADDON_LOADED event
-- It will call the **OnInitialize** function on the addon object (if present),
-- and the **OnEmbedInitialize** function on all embeded libraries.
--
-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
-- @param addon addon object to intialize
function AceAddon:InitializeAddon(addon)
safecall(addon.OnInitialize, addon)
 
local embeds = self.embeds[addon]
for i = 1, #embeds do
local lib = LibStub:GetLibrary(embeds[i], true)
if lib then safecall(lib.OnEmbedInitialize, lib, addon) end
end
 
-- we don't call InitializeAddon on modules specifically, this is handled
-- from the event handler and only done _once_
end
 
-- - Enable the addon after creation.
-- Note: This function is only used internally during the PLAYER_LOGIN event, or during ADDON_LOADED,
-- if IsLoggedIn() already returns true at that point, e.g. for LoD Addons.
-- It will call the **OnEnable** function on the addon object (if present),
-- and the **OnEmbedEnable** function on all embeded libraries.\\
-- This function does not toggle the enable state of the addon itself, and will return early if the addon is disabled.
--
-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
-- Use :Enable on the addon itself instead.
-- @param addon addon object to enable
function AceAddon:EnableAddon(addon)
if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
if self.statuses[addon.name] or not addon.enabledState then return false end
 
-- set the statuses first, before calling the OnEnable. this allows for Disabling of the addon in OnEnable.
self.statuses[addon.name] = true
 
safecall(addon.OnEnable, addon)
 
-- make sure we're still enabled before continueing
if self.statuses[addon.name] then
local embeds = self.embeds[addon]
for i = 1, #embeds do
local lib = LibStub:GetLibrary(embeds[i], true)
if lib then safecall(lib.OnEmbedEnable, lib, addon) end
end
 
-- enable possible modules.
local modules = addon.orderedModules
for i = 1, #modules do
self:EnableAddon(modules[i])
end
end
return self.statuses[addon.name] -- return true if we're disabled
end
 
-- - Disable the addon
-- Note: This function is only used internally.
-- It will call the **OnDisable** function on the addon object (if present),
-- and the **OnEmbedDisable** function on all embeded libraries.\\
-- This function does not toggle the enable state of the addon itself, and will return early if the addon is still enabled.
--
-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
-- Use :Disable on the addon itself instead.
-- @param addon addon object to enable
function AceAddon:DisableAddon(addon)
if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
if not self.statuses[addon.name] then return false end
 
-- set statuses first before calling OnDisable, this allows for aborting the disable in OnDisable.
self.statuses[addon.name] = false
 
safecall( addon.OnDisable, addon )
 
-- make sure we're still disabling...
if not self.statuses[addon.name] then
local embeds = self.embeds[addon]
for i = 1, #embeds do
local lib = LibStub:GetLibrary(embeds[i], true)
if lib then safecall(lib.OnEmbedDisable, lib, addon) end
end
-- disable possible modules.
local modules = addon.orderedModules
for i = 1, #modules do
self:DisableAddon(modules[i])
end
end
 
return not self.statuses[addon.name] -- return true if we're disabled
end
 
--- Get an iterator over all registered addons.
-- @usage
-- -- Print a list of all installed AceAddon's
-- for name, addon in AceAddon:IterateAddons() do
-- print("Addon: " .. name)
-- end
function AceAddon:IterateAddons() return pairs(self.addons) end
 
--- Get an iterator over the internal status registry.
-- @usage
-- -- Print a list of all enabled addons
-- for name, status in AceAddon:IterateAddonStatus() do
-- if status then
-- print("EnabledAddon: " .. name)
-- end
-- end
function AceAddon:IterateAddonStatus() return pairs(self.statuses) end
 
-- Following Iterators are deprecated, and their addon specific versions should be used
-- e.g. addon:IterateEmbeds() instead of :IterateEmbedsOnAddon(addon)
function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end
function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end
 
-- Event Handling
local function onEvent(this, event, arg1)
if event == "ADDON_LOADED" or event == "PLAYER_LOGIN" then
-- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration
while(#AceAddon.initializequeue > 0) do
local addon = tremove(AceAddon.initializequeue, 1)
-- this might be an issue with recursion - TODO: validate
if event == "ADDON_LOADED" then addon.baseName = arg1 end
AceAddon:InitializeAddon(addon)
tinsert(AceAddon.enablequeue, addon)
end
 
if IsLoggedIn() then
while(#AceAddon.enablequeue > 0) do
local addon = tremove(AceAddon.enablequeue, 1)
AceAddon:EnableAddon(addon)
end
end
end
end
 
AceAddon.frame:RegisterEvent("ADDON_LOADED")
AceAddon.frame:RegisterEvent("PLAYER_LOGIN")
AceAddon.frame:SetScript("OnEvent", onEvent)
 
-- upgrade embeded
for name, addon in pairs(AceAddon.addons) do
Embed(addon, true)
end
 
-- 2010-10-27 nevcairiel - add new "orderedModules" table
if oldminor and oldminor < 10 then
for name, addon in pairs(AceAddon.addons) do
addon.orderedModules = {}
for module_name, module in pairs(addon.modules) do
tinsert(addon.orderedModules, module)
end
end
end
RecipeRadar/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml New file
0,0 → 1,4
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceConfigRegistry-3.0.lua"/>
</Ui>
\ No newline at end of file
RecipeRadar/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua New file
0,0 → 1,347
--- AceConfigRegistry-3.0 handles central registration of options tables in use by addons and modules.\\
-- Options tables can be registered as raw tables, OR as function refs that return a table.\\
-- Such functions receive three arguments: "uiType", "uiName", "appName". \\
-- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\
-- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\
-- * The **appName** field is the options table name as given at registration time \\
--
-- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
-- @class file
-- @name AceConfigRegistry-3.0
-- @release $Id: AceConfigRegistry-3.0.lua 998 2010-12-01 18:39:53Z nevcairiel $
local MAJOR, MINOR = "AceConfigRegistry-3.0", 13
local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceConfigRegistry then return end
 
AceConfigRegistry.tables = AceConfigRegistry.tables or {}
 
local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
 
if not AceConfigRegistry.callbacks then
AceConfigRegistry.callbacks = CallbackHandler:New(AceConfigRegistry)
end
 
-- Lua APIs
local tinsert, tconcat = table.insert, table.concat
local strfind, strmatch = string.find, string.match
local type, tostring, select, pairs = type, tostring, select, pairs
local error, assert = error, assert
 
-----------------------------------------------------------------------
-- Validating options table consistency:
 
 
AceConfigRegistry.validated = {
-- list of options table names ran through :ValidateOptionsTable automatically.
-- CLEARED ON PURPOSE, since newer versions may have newer validators
cmd = {},
dropdown = {},
dialog = {},
}
 
 
 
local function err(msg, errlvl, ...)
local t = {}
for i=select("#",...),1,-1 do
tinsert(t, (select(i, ...)))
end
error(MAJOR..":ValidateOptionsTable(): "..tconcat(t,".")..msg, errlvl+2)
end
 
 
local isstring={["string"]=true, _="string"}
local isstringfunc={["string"]=true,["function"]=true, _="string or funcref"}
local istable={["table"]=true, _="table"}
local ismethodtable={["table"]=true,["string"]=true,["function"]=true, _="methodname, funcref or table"}
local optstring={["nil"]=true,["string"]=true, _="string"}
local optstringfunc={["nil"]=true,["string"]=true,["function"]=true, _="string or funcref"}
local optnumber={["nil"]=true,["number"]=true, _="number"}
local optmethod={["nil"]=true,["string"]=true,["function"]=true, _="methodname or funcref"}
local optmethodfalse={["nil"]=true,["string"]=true,["function"]=true,["boolean"]={[false]=true}, _="methodname, funcref or false"}
local optmethodnumber={["nil"]=true,["string"]=true,["function"]=true,["number"]=true, _="methodname, funcref or number"}
local optmethodtable={["nil"]=true,["string"]=true,["function"]=true,["table"]=true, _="methodname, funcref or table"}
local optmethodbool={["nil"]=true,["string"]=true,["function"]=true,["boolean"]=true, _="methodname, funcref or boolean"}
local opttable={["nil"]=true,["table"]=true, _="table"}
local optbool={["nil"]=true,["boolean"]=true, _="boolean"}
local optboolnumber={["nil"]=true,["boolean"]=true,["number"]=true, _="boolean or number"}
 
local basekeys={
type=isstring,
name=isstringfunc,
desc=optstringfunc,
descStyle=optstring,
order=optmethodnumber,
validate=optmethodfalse,
confirm=optmethodbool,
confirmText=optstring,
disabled=optmethodbool,
hidden=optmethodbool,
guiHidden=optmethodbool,
dialogHidden=optmethodbool,
dropdownHidden=optmethodbool,
cmdHidden=optmethodbool,
icon=optstringfunc,
iconCoords=optmethodtable,
handler=opttable,
get=optmethodfalse,
set=optmethodfalse,
func=optmethodfalse,
arg={["*"]=true},
width=optstring,
}
 
local typedkeys={
header={},
description={
image=optstringfunc,
imageCoords=optmethodtable,
imageHeight=optnumber,
imageWidth=optnumber,
fontSize=optstringfunc,
},
group={
args=istable,
plugins=opttable,
inline=optbool,
cmdInline=optbool,
guiInline=optbool,
dropdownInline=optbool,
dialogInline=optbool,
childGroups=optstring,
},
execute={
image=optstringfunc,
imageCoords=optmethodtable,
imageHeight=optnumber,
imageWidth=optnumber,
},
input={
pattern=optstring,
usage=optstring,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
multiline=optboolnumber,
},
toggle={
tristate=optbool,
image=optstringfunc,
imageCoords=optmethodtable,
},
tristate={
},
range={
min=optnumber,
softMin=optnumber,
max=optnumber,
softMax=optnumber,
step=optnumber,
bigStep=optnumber,
isPercent=optbool,
},
select={
values=ismethodtable,
style={
["nil"]=true,
["string"]={dropdown=true,radio=true},
_="string: 'dropdown' or 'radio'"
},
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
itemControl=optstring,
},
multiselect={
values=ismethodtable,
style=optstring,
tristate=optbool,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
},
color={
hasAlpha=optbool,
},
keybinding={
-- TODO
},
}
 
local function validateKey(k,errlvl,...)
errlvl=(errlvl or 0)+1
if type(k)~="string" then
err("["..tostring(k).."] - key is not a string", errlvl,...)
end
if strfind(k, "[%c\127]") then
err("["..tostring(k).."] - key name contained control characters", errlvl,...)
end
end
 
local function validateVal(v, oktypes, errlvl,...)
errlvl=(errlvl or 0)+1
local isok=oktypes[type(v)] or oktypes["*"]
 
if not isok then
err(": expected a "..oktypes._..", got '"..tostring(v).."'", errlvl,...)
end
if type(isok)=="table" then -- isok was a table containing specific values to be tested for!
if not isok[v] then
err(": did not expect "..type(v).." value '"..tostring(v).."'", errlvl,...)
end
end
end
 
local function validate(options,errlvl,...)
errlvl=(errlvl or 0)+1
-- basic consistency
if type(options)~="table" then
err(": expected a table, got a "..type(options), errlvl,...)
end
if type(options.type)~="string" then
err(".type: expected a string, got a "..type(options.type), errlvl,...)
end
 
-- get type and 'typedkeys' member
local tk = typedkeys[options.type]
if not tk then
err(".type: unknown type '"..options.type.."'", errlvl,...)
end
 
-- make sure that all options[] are known parameters
for k,v in pairs(options) do
if not (tk[k] or basekeys[k]) then
err(": unknown parameter", errlvl,tostring(k),...)
end
end
 
-- verify that required params are there, and that everything is the right type
for k,oktypes in pairs(basekeys) do
validateVal(options[k], oktypes, errlvl,k,...)
end
for k,oktypes in pairs(tk) do
validateVal(options[k], oktypes, errlvl,k,...)
end
 
-- extra logic for groups
if options.type=="group" then
for k,v in pairs(options.args) do
validateKey(k,errlvl,"args",...)
validate(v, errlvl,k,"args",...)
end
if options.plugins then
for plugname,plugin in pairs(options.plugins) do
if type(plugin)~="table" then
err(": expected a table, got '"..tostring(plugin).."'", errlvl,tostring(plugname),"plugins",...)
end
for k,v in pairs(plugin) do
validateKey(k,errlvl,tostring(plugname),"plugins",...)
validate(v, errlvl,k,tostring(plugname),"plugins",...)
end
end
end
end
end
 
 
--- Validates basic structure and integrity of an options table \\
-- Does NOT verify that get/set etc actually exist, since they can be defined at any depth
-- @param options The table to be validated
-- @param name The name of the table to be validated (shown in any error message)
-- @param errlvl (optional number) error level offset, default 0 (=errors point to the function calling :ValidateOptionsTable)
function AceConfigRegistry:ValidateOptionsTable(options,name,errlvl)
errlvl=(errlvl or 0)+1
name = name or "Optionstable"
if not options.name then
options.name=name -- bit of a hack, the root level doesn't really need a .name :-/
end
validate(options,errlvl,name)
end
 
--- Fires a "ConfigTableChange" callback for those listening in on it, allowing config GUIs to refresh.
-- You should call this function if your options table changed from any outside event, like a game event
-- or a timer.
-- @param appName The application name as given to `:RegisterOptionsTable()`
function AceConfigRegistry:NotifyChange(appName)
if not AceConfigRegistry.tables[appName] then return end
AceConfigRegistry.callbacks:Fire("ConfigTableChange", appName)
end
 
-- -------------------------------------------------------------------
-- Registering and retreiving options tables:
 
 
-- validateGetterArgs: helper function for :GetOptionsTable (or, rather, the getter functions returned by it)
 
local function validateGetterArgs(uiType, uiName, errlvl)
errlvl=(errlvl or 0)+2
if uiType~="cmd" and uiType~="dropdown" and uiType~="dialog" then
error(MAJOR..": Requesting options table: 'uiType' - invalid configuration UI type, expected 'cmd', 'dropdown' or 'dialog'", errlvl)
end
if not strmatch(uiName, "[A-Za-z]%-[0-9]") then -- Expecting e.g. "MyLib-1.2"
error(MAJOR..": Requesting options table: 'uiName' - badly formatted or missing version number. Expected e.g. 'MyLib-1.2'", errlvl)
end
end
 
--- Register an options table with the config registry.
-- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param options The options table, OR a function reference that generates it on demand. \\
-- See the top of the page for info on arguments passed to such functions.
function AceConfigRegistry:RegisterOptionsTable(appName, options)
if type(options)=="table" then
if options.type~="group" then -- quick sanity checker
error(MAJOR..": RegisterOptionsTable(appName, options): 'options' - missing type='group' member in root group", 2)
end
AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
errlvl=(errlvl or 0)+1
validateGetterArgs(uiType, uiName, errlvl)
if not AceConfigRegistry.validated[uiType][appName] then
AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl) -- upgradable
AceConfigRegistry.validated[uiType][appName] = true
end
return options
end
elseif type(options)=="function" then
AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
errlvl=(errlvl or 0)+1
validateGetterArgs(uiType, uiName, errlvl)
local tab = assert(options(uiType, uiName, appName))
if not AceConfigRegistry.validated[uiType][appName] then
AceConfigRegistry:ValidateOptionsTable(tab, appName, errlvl) -- upgradable
AceConfigRegistry.validated[uiType][appName] = true
end
return tab
end
else
error(MAJOR..": RegisterOptionsTable(appName, options): 'options' - expected table or function reference", 2)
end
end
 
--- Returns an iterator of ["appName"]=funcref pairs
function AceConfigRegistry:IterateOptionsTables()
return pairs(AceConfigRegistry.tables)
end
 
 
 
 
--- Query the registry for a specific options table.
-- If only appName is given, a function is returned which you
-- can call with (uiType,uiName) to get the table.\\
-- If uiType&uiName are given, the table is returned.
-- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param uiType The type of UI to get the table for, one of "cmd", "dropdown", "dialog"
-- @param uiName The name of the library/addon querying for the table, e.g. "MyLib-1.0"
function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName)
local f = AceConfigRegistry.tables[appName]
if not f then
return nil
end
 
if uiType then
return f(uiType,uiName,1) -- get the table for us
else
return f -- return the function
end
end
RecipeRadar/libs/AceConfig-3.0/AceConfig-3.0.xml New file
0,0 → 1,8
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Include file="AceConfigRegistry-3.0\AceConfigRegistry-3.0.xml"/>
<Include file="AceConfigCmd-3.0\AceConfigCmd-3.0.xml"/>
<Include file="AceConfigDialog-3.0\AceConfigDialog-3.0.xml"/>
<!--<Include file="AceConfigDropdown-3.0\AceConfigDropdown-3.0.xml"/>-->
<Script file="AceConfig-3.0.lua"/>
</Ui>
\ No newline at end of file
RecipeRadar/libs/AceConfig-3.0/AceConfig-3.0.lua New file
0,0 → 1,57
--- AceConfig-3.0 wrapper library.
-- Provides an API to register an options table with the config registry,
-- as well as associate it with a slash command.
-- @class file
-- @name AceConfig-3.0
-- @release $Id: AceConfig-3.0.lua 969 2010-10-07 02:11:48Z shefki $
 
--[[
AceConfig-3.0
 
Very light wrapper library that combines all the AceConfig subcomponents into one more easily used whole.
 
]]
 
local MAJOR, MINOR = "AceConfig-3.0", 2
local AceConfig = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceConfig then return end
 
local cfgreg = LibStub("AceConfigRegistry-3.0")
local cfgcmd = LibStub("AceConfigCmd-3.0")
--TODO: local cfgdlg = LibStub("AceConfigDialog-3.0", true)
--TODO: local cfgdrp = LibStub("AceConfigDropdown-3.0", true)
 
-- Lua APIs
local pcall, error, type, pairs = pcall, error, type, pairs
 
-- -------------------------------------------------------------------
-- :RegisterOptionsTable(appName, options, slashcmd, persist)
--
-- - appName - (string) application name
-- - options - table or function ref, see AceConfigRegistry
-- - slashcmd - slash command (string) or table with commands, or nil to NOT create a slash command
 
--- Register a option table with the AceConfig registry.
-- You can supply a slash command (or a table of slash commands) to register with AceConfigCmd directly.
-- @paramsig appName, options [, slashcmd]
-- @param appName The application name for the config table.
-- @param options The option table (or a function to generate one on demand). http://www.wowace.com/addons/ace3/pages/ace-config-3-0-options-tables/
-- @param slashcmd A slash command to register for the option table, or a table of slash commands.
-- @usage
-- local AceConfig = LibStub("AceConfig-3.0")
-- AceConfig:RegisterOptionsTable("MyAddon", myOptions, {"/myslash", "/my"})
function AceConfig:RegisterOptionsTable(appName, options, slashcmd)
local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
if not ok then error(msg, 2) end
 
if slashcmd then
if type(slashcmd) == "table" then
for _,cmd in pairs(slashcmd) do
cfgcmd:CreateChatCommand(cmd, appName)
end
else
cfgcmd:CreateChatCommand(slashcmd, appName)
end
end
end
RecipeRadar/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml New file
0,0 → 1,4
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceConfigDialog-3.0.lua"/>
</Ui>
\ No newline at end of file
RecipeRadar/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua New file
0,0 → 1,1940
--- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables.
-- @class file
-- @name AceConfigDialog-3.0
-- @release $Id: AceConfigDialog-3.0.lua 998 2010-12-01 18:39:53Z nevcairiel $
 
local LibStub = LibStub
local MAJOR, MINOR = "AceConfigDialog-3.0", 54
local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceConfigDialog then return end
 
AceConfigDialog.OpenFrames = AceConfigDialog.OpenFrames or {}
AceConfigDialog.Status = AceConfigDialog.Status or {}
AceConfigDialog.frame = AceConfigDialog.frame or CreateFrame("Frame")
 
AceConfigDialog.frame.apps = AceConfigDialog.frame.apps or {}
AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {}
AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {}
 
local gui = LibStub("AceGUI-3.0")
local reg = LibStub("AceConfigRegistry-3.0")
 
-- Lua APIs
local tconcat, tinsert, tsort, tremove = table.concat, table.insert, table.sort, table.remove
local strmatch, format = string.match, string.format
local assert, loadstring, error = assert, loadstring, error
local pairs, next, select, type, unpack, wipe = pairs, next, select, type, unpack, wipe
local rawset, tostring, tonumber = rawset, tostring, tonumber
local math_min, math_max, math_floor = math.min, math.max, math.floor
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: NORMAL_FONT_COLOR, GameTooltip, StaticPopupDialogs, ACCEPT, CANCEL, StaticPopup_Show
-- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge
-- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler
 
local emptyTbl = {}
 
--[[
xpcall safecall implementation
]]
local xpcall = xpcall
 
local function errorhandler(err)
return geterrorhandler()(err)
end
 
local function CreateDispatcher(argCount)
local code = [[
local xpcall, eh = ...
local method, ARGS
local function call() return method(ARGS) end
 
local function dispatch(func, ...)
method = func
if not method then return end
ARGS = ...
return xpcall(call, eh)
end
 
return dispatch
]]
 
local ARGS = {}
for i = 1, argCount do ARGS[i] = "arg"..i end
code = code:gsub("ARGS", tconcat(ARGS, ", "))
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
end
 
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
local dispatcher = CreateDispatcher(argCount)
rawset(self, argCount, dispatcher)
return dispatcher
end})
Dispatchers[0] = function(func)
return xpcall(func, errorhandler)
end
 
local function safecall(func, ...)
return Dispatchers[select("#", ...)](func, ...)
end
 
local width_multiplier = 170
 
--[[
Group Types
Tree - All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree
- Descendant Groups with inline=true and thier children will not become nodes
 
Tab - Direct Child Groups will become tabs, direct child options will appear above the tab control
- Grandchild groups will default to inline unless specified otherwise
 
Select- Same as Tab but with entries in a dropdown rather than tabs
 
 
Inline Groups
- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
- If declared on a direct child of a root node of a select group, they will appear above the group container control
- When a group is displayed inline, all descendants will also be inline members of the group
 
]]
 
-- Recycling functions
local new, del, copy
--newcount, delcount,createdcount,cached = 0,0,0
do
local pool = setmetatable({},{__mode="k"})
function new()
--newcount = newcount + 1
local t = next(pool)
if t then
pool[t] = nil
return t
else
--createdcount = createdcount + 1
return {}
end
end
function copy(t)
local c = new()
for k, v in pairs(t) do
c[k] = v
end
return c
end
function del(t)
--delcount = delcount + 1
wipe(t)
pool[t] = true
end
-- function cached()
-- local n = 0
-- for k in pairs(pool) do
-- n = n + 1
-- end
-- return n
-- end
end
 
-- picks the first non-nil value and returns it
local function pickfirstset(...)
for i=1,select("#",...) do
if select(i,...)~=nil then
return select(i,...)
end
end
end
 
--gets an option from a given group, checking plugins
local function GetSubOption(group, key)
if group.plugins then
for plugin, t in pairs(group.plugins) do
if t[key] then
return t[key]
end
end
end
 
return group.args[key]
end
 
--Option member type definitions, used to decide how to access it
 
--Is the member Inherited from parent options
local isInherited = {
set = true,
get = true,
func = true,
confirm = true,
validate = true,
disabled = true,
hidden = true
}
 
--Does a string type mean a literal value, instead of the default of a method of the handler
local stringIsLiteral = {
name = true,
desc = true,
icon = true,
usage = true,
width = true,
image = true,
fontSize = true,
}
 
--Is Never a function or method
local allIsLiteral = {
type = true,
descStyle = true,
imageWidth = true,
imageHeight = true,
}
 
--gets the value for a member that could be a function
--function refs are called with an info arg
--every other type is returned
local function GetOptionsMemberValue(membername, option, options, path, appName, ...)
--get definition for the member
local inherits = isInherited[membername]
 
 
--get the member of the option, traversing the tree if it can be inherited
local member
 
if inherits then
local group = options
if group[membername] ~= nil then
member = group[membername]
end
for i = 1, #path do
group = GetSubOption(group, path[i])
if group[membername] ~= nil then
member = group[membername]
end
end
else
member = option[membername]
end
 
--check if we need to call a functon, or if we have a literal value
if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then
--We have a function to call
local info = new()
--traverse the options table, picking up the handler and filling the info with the path
local handler
local group = options
handler = group.handler or handler
 
for i = 1, #path do
group = GetSubOption(group, path[i])
info[i] = path[i]
handler = group.handler or handler
end
 
info.options = options
info.appName = appName
info[0] = appName
info.arg = option.arg
info.handler = handler
info.option = option
info.type = option.type
info.uiType = "dialog"
info.uiName = MAJOR
 
local a, b, c ,d
--using 4 returns for the get of a color type, increase if a type needs more
if type(member) == "function" then
--Call the function
a,b,c,d = member(info, ...)
else
--Call the method
if handler and handler[member] then
a,b,c,d = handler[member](handler, info, ...)
else
error(format("Method %s doesn't exist in handler for type %s", member, membername))
end
end
del(info)
return a,b,c,d
else
--The value isnt a function to call, return it
return member
end
end
 
--[[calls an options function that could be inherited, method name or function ref
local function CallOptionsFunction(funcname ,option, options, path, appName, ...)
local info = new()
 
local func
local group = options
local handler
 
--build the info table containing the path
-- pick up functions while traversing the tree
if group[funcname] ~= nil then
func = group[funcname]
end
handler = group.handler or handler
 
for i, v in ipairs(path) do
group = GetSubOption(group, v)
info[i] = v
if group[funcname] ~= nil then
func = group[funcname]
end
handler = group.handler or handler
end
 
info.options = options
info[0] = appName
info.arg = option.arg
 
local a, b, c ,d
if type(func) == "string" then
if handler and handler[func] then
a,b,c,d = handler[func](handler, info, ...)
else
error(string.format("Method %s doesn't exist in handler for type func", func))
end
elseif type(func) == "function" then
a,b,c,d = func(info, ...)
end
del(info)
return a,b,c,d
end
--]]
 
--tables to hold orders and names for options being sorted, will be created with new()
--prevents needing to call functions repeatedly while sorting
local tempOrders
local tempNames
 
local function compareOptions(a,b)
if not a then
return true
end
if not b then
return false
end
local OrderA, OrderB = tempOrders[a] or 100, tempOrders[b] or 100
if OrderA == OrderB then
local NameA = (type(tempNames[a]) == "string") and tempNames[a] or ""
local NameB = (type(tempNames[b]) == "string") and tempNames[b] or ""
return NameA:upper() < NameB:upper()
end
if OrderA < 0 then
if OrderB > 0 then
return false
end
else
if OrderB < 0 then
return true
end
end
return OrderA < OrderB
end
 
 
 
--builds 2 tables out of an options group
-- keySort, sorted keys
-- opts, combined options from .plugins and args
local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
tempOrders = new()
tempNames = new()
 
if group.plugins then
for plugin, t in pairs(group.plugins) do
for k, v in pairs(t) do
if not opts[k] then
tinsert(keySort, k)
opts[k] = v
 
path[#path+1] = k
tempOrders[k] = GetOptionsMemberValue("order", v, options, path, appName)
tempNames[k] = GetOptionsMemberValue("name", v, options, path, appName)
path[#path] = nil
end
end
end
end
 
for k, v in pairs(group.args) do
if not opts[k] then
tinsert(keySort, k)
opts[k] = v
 
path[#path+1] = k
tempOrders[k] = GetOptionsMemberValue("order", v, options, path, appName)
tempNames[k] = GetOptionsMemberValue("name", v, options, path, appName)
path[#path] = nil
end
end
 
tsort(keySort, compareOptions)
 
del(tempOrders)
del(tempNames)
end
 
local function DelTree(tree)
if tree.children then
local childs = tree.children
for i = 1, #childs do
DelTree(childs[i])
del(childs[i])
end
del(childs)
end
end
 
local function CleanUserData(widget, event)
 
local user = widget:GetUserDataTable()
 
if user.path then
del(user.path)
end
 
if widget.type == "TreeGroup" then
local tree = user.tree
widget:SetTree(nil)
if tree then
for i = 1, #tree do
DelTree(tree[i])
del(tree[i])
end
del(tree)
end
end
 
if widget.type == "TabGroup" then
widget:SetTabs(nil)
if user.tablist then
del(user.tablist)
end
end
 
if widget.type == "DropdownGroup" then
widget:SetGroupList(nil)
if user.grouplist then
del(user.grouplist)
end
if user.orderlist then
del(user.orderlist)
end
end
end
 
-- - Gets a status table for the given appname and options path.
-- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param path The path to the options (a table with all group keys)
-- @return
function AceConfigDialog:GetStatusTable(appName, path)
local status = self.Status
 
if not status[appName] then
status[appName] = {}
status[appName].status = {}
status[appName].children = {}
end
 
status = status[appName]
 
if path then
for i = 1, #path do
local v = path[i]
if not status.children[v] then
status.children[v] = {}
status.children[v].status = {}
status.children[v].children = {}
end
status = status.children[v]
end
end
 
return status.status
end
 
--- Selects the specified path in the options window.
-- The path specified has to match the keys of the groups in the table.
-- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param ... The path to the key that should be selected
function AceConfigDialog:SelectGroup(appName, ...)
local path = new()
 
 
local app = reg:GetOptionsTable(appName)
if not app then
error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
end
local options = app("dialog", MAJOR)
local group = options
local status = self:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
end
status = status.groups
local treevalue
local treestatus
 
for n = 1, select("#",...) do
local key = select(n, ...)
 
if group.childGroups == "tab" or group.childGroups == "select" then
--if this is a tab or select group, select the group
status.selected = key
--children of this group are no longer extra levels of a tree
treevalue = nil
else
--tree group by default
if treevalue then
--this is an extra level of a tree group, build a uniquevalue for it
treevalue = treevalue.."\001"..key
else
--this is the top level of a tree group, the uniquevalue is the same as the key
treevalue = key
if not status.groups then
status.groups = {}
end
--save this trees status table for any extra levels or groups
treestatus = status
end
--make sure that the tree entry is open, and select it.
--the selected group will be overwritten if a child is the final target but still needs to be open
treestatus.selected = treevalue
treestatus.groups[treevalue] = true
 
end
 
--move to the next group in the path
group = GetSubOption(group, key)
if not group then
break
end
tinsert(path, key)
status = self:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
end
status = status.groups
end
 
del(path)
reg:NotifyChange(appName)
end
 
local function OptionOnMouseOver(widget, event)
--show a tooltip/set the status bar to the desc text
local user = widget:GetUserDataTable()
local opt = user.option
local options = user.options
local path = user.path
local appName = user.appName
 
GameTooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT")
local name = GetOptionsMemberValue("name", opt, options, path, appName)
local desc = GetOptionsMemberValue("desc", opt, options, path, appName)
local usage = GetOptionsMemberValue("usage", opt, options, path, appName)
local descStyle = opt.descStyle
 
if descStyle and descStyle ~= "tooltip" then return end
 
GameTooltip:SetText(name, 1, .82, 0, 1)
 
if opt.type == "multiselect" then
GameTooltip:AddLine(user.text,0.5, 0.5, 0.8, 1)
end
if type(desc) == "string" then
GameTooltip:AddLine(desc, 1, 1, 1, 1)
end
if type(usage) == "string" then
GameTooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1)
end
 
GameTooltip:Show()
end
 
local function OptionOnMouseLeave(widget, event)
GameTooltip:Hide()
end
 
local function GetFuncName(option)
local type = option.type
if type == "execute" then
return "func"
else
return "set"
end
end
local function confirmPopup(appName, rootframe, basepath, info, message, func, ...)
if not StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] then
StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] = {}
end
local t = StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"]
for k in pairs(t) do
t[k] = nil
end
t.text = message
t.button1 = ACCEPT
t.button2 = CANCEL
local dialog, oldstrata
t.OnAccept = function()
safecall(func, unpack(t))
if dialog and oldstrata then
dialog:SetFrameStrata(oldstrata)
end
AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
del(info)
end
t.OnCancel = function()
if dialog and oldstrata then
dialog:SetFrameStrata(oldstrata)
end
AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
del(info)
end
for i = 1, select("#", ...) do
t[i] = select(i, ...) or false
end
t.timeout = 0
t.whileDead = 1
t.hideOnEscape = 1
 
dialog = StaticPopup_Show("ACECONFIGDIALOG30_CONFIRM_DIALOG")
if dialog then
oldstrata = dialog:GetFrameStrata()
dialog:SetFrameStrata("TOOLTIP")
end
end
 
local function ActivateControl(widget, event, ...)
--This function will call the set / execute handler for the widget
--widget:GetUserDataTable() contains the needed info
local user = widget:GetUserDataTable()
local option = user.option
local options = user.options
local path = user.path
local info = new()
 
local func
local group = options
local funcname = GetFuncName(option)
local handler
local confirm
local validate
--build the info table containing the path
-- pick up functions while traversing the tree
if group[funcname] ~= nil then
func = group[funcname]
end
handler = group.handler or handler
confirm = group.confirm
validate = group.validate
for i = 1, #path do
local v = path[i]
group = GetSubOption(group, v)
info[i] = v
if group[funcname] ~= nil then
func = group[funcname]
end
handler = group.handler or handler
if group.confirm ~= nil then
confirm = group.confirm
end
if group.validate ~= nil then
validate = group.validate
end
end
 
info.options = options
info.appName = user.appName
info.arg = option.arg
info.handler = handler
info.option = option
info.type = option.type
info.uiType = "dialog"
info.uiName = MAJOR
 
local name
if type(option.name) == "function" then
name = option.name(info)
elseif type(option.name) == "string" then
name = option.name
else
name = ""
end
local usage = option.usage
local pattern = option.pattern
 
local validated = true
 
if option.type == "input" then
if type(pattern)=="string" then
if not strmatch(..., pattern) then
validated = false
end
end
end
 
local success
if validated and option.type ~= "execute" then
if type(validate) == "string" then
if handler and handler[validate] then
success, validated = safecall(handler[validate], handler, info, ...)
if not success then validated = false end
else
error(format("Method %s doesn't exist in handler for type execute", validate))
end
elseif type(validate) == "function" then
success, validated = safecall(validate, info, ...)
if not success then validated = false end
end
end
 
local rootframe = user.rootframe
if type(validated) == "string" then
--validate function returned a message to display
if rootframe.SetStatusText then
rootframe:SetStatusText(validated)
else
-- TODO: do something else.
end
PlaySound("igPlayerInviteDecline")
del(info)
return true
elseif not validated then
--validate returned false
if rootframe.SetStatusText then
if usage then
rootframe:SetStatusText(name..": "..usage)
else
if pattern then
rootframe:SetStatusText(name..": Expected "..pattern)
else
rootframe:SetStatusText(name..": Invalid Value")
end
end
else
-- TODO: do something else
end
PlaySound("igPlayerInviteDecline")
del(info)
return true
else
 
local confirmText = option.confirmText
--call confirm func/method
if type(confirm) == "string" then
if handler and handler[confirm] then
success, confirm = safecall(handler[confirm], handler, info, ...)
if success and type(confirm) == "string" then
confirmText = confirm
confirm = true
elseif not success then
confirm = false
end
else
error(format("Method %s doesn't exist in handler for type confirm", confirm))
end
elseif type(confirm) == "function" then
success, confirm = safecall(confirm, info, ...)
if success and type(confirm) == "string" then
confirmText = confirm
confirm = true
elseif not success then
confirm = false
end
end
 
--confirm if needed
if type(confirm) == "boolean" then
if confirm then
if not confirmText then
local name, desc = option.name, option.desc
if type(name) == "function" then
name = name(info)
end
if type(desc) == "function" then
desc = desc(info)
end
confirmText = name
if desc then
confirmText = confirmText.." - "..desc
end
end
 
local iscustom = user.rootframe:GetUserData("iscustom")
local rootframe
 
if iscustom then
rootframe = user.rootframe
end
local basepath = user.rootframe:GetUserData("basepath")
if type(func) == "string" then
if handler and handler[func] then
confirmPopup(user.appName, rootframe, basepath, info, confirmText, handler[func], handler, info, ...)
else
error(format("Method %s doesn't exist in handler for type func", func))
end
elseif type(func) == "function" then
confirmPopup(user.appName, rootframe, basepath, info, confirmText, func, info, ...)
end
--func will be called and info deleted when the confirm dialog is responded to
return
end
end
 
--call the function
if type(func) == "string" then
if handler and handler[func] then
safecall(handler[func],handler, info, ...)
else
error(format("Method %s doesn't exist in handler for type func", func))
end
elseif type(func) == "function" then
safecall(func,info, ...)
end
 
 
 
local iscustom = user.rootframe:GetUserData("iscustom")
local basepath = user.rootframe:GetUserData("basepath") or emptyTbl
--full refresh of the frame, some controls dont cause this on all events
if option.type == "color" then
if event == "OnValueConfirmed" then
 
if iscustom then
AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
else
AceConfigDialog:Open(user.appName, unpack(basepath))
end
end
elseif option.type == "range" then
if event == "OnMouseUp" then
if iscustom then
AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
else
AceConfigDialog:Open(user.appName, unpack(basepath))
end
end
--multiselects don't cause a refresh on 'OnValueChanged' only 'OnClosed'
elseif option.type == "multiselect" then
user.valuechanged = true
else
if iscustom then
AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
else
AceConfigDialog:Open(user.appName, unpack(basepath))
end
end
 
end
del(info)
end
 
local function ActivateSlider(widget, event, value)
local option = widget:GetUserData("option")
local min, max, step = option.min or (not option.softMin and 0 or nil), option.max or (not option.softMax and 100 or nil), option.step
if min then
if step then
value = math_floor((value - min) / step + 0.5) * step + min
end
value = math_max(value, min)
end
if max then
value = math_min(value, max)
end
ActivateControl(widget,event,value)
end
 
--called from a checkbox that is part of an internally created multiselect group
--this type is safe to refresh on activation of one control
local function ActivateMultiControl(widget, event, ...)
ActivateControl(widget, event, widget:GetUserData("value"), ...)
local user = widget:GetUserDataTable()
local iscustom = user.rootframe:GetUserData("iscustom")
local basepath = user.rootframe:GetUserData("basepath") or emptyTbl
if iscustom then
AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
else
AceConfigDialog:Open(user.appName, unpack(basepath))
end
end
 
local function MultiControlOnClosed(widget, event, ...)
local user = widget:GetUserDataTable()
if user.valuechanged then
local iscustom = user.rootframe:GetUserData("iscustom")
local basepath = user.rootframe:GetUserData("basepath") or emptyTbl
if iscustom then
AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
else
AceConfigDialog:Open(user.appName, unpack(basepath))
end
end
end
 
local function FrameOnClose(widget, event)
local appName = widget:GetUserData("appName")
AceConfigDialog.OpenFrames[appName] = nil
gui:Release(widget)
end
 
local function CheckOptionHidden(option, options, path, appName)
--check for a specific boolean option
local hidden = pickfirstset(option.dialogHidden,option.guiHidden)
if hidden ~= nil then
return hidden
end
 
return GetOptionsMemberValue("hidden", option, options, path, appName)
end
 
local function CheckOptionDisabled(option, options, path, appName)
--check for a specific boolean option
local disabled = pickfirstset(option.dialogDisabled,option.guiDisabled)
if disabled ~= nil then
return disabled
end
 
return GetOptionsMemberValue("disabled", option, options, path, appName)
end
--[[
local function BuildTabs(group, options, path, appName)
local tabs = new()
local text = new()
local keySort = new()
local opts = new()
 
BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 
for i = 1, #keySort do
local k = keySort[i]
local v = opts[k]
if v.type == "group" then
path[#path+1] = k
local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
local hidden = CheckOptionHidden(v, options, path, appName)
if not inline and not hidden then
tinsert(tabs, k)
text[k] = GetOptionsMemberValue("name", v, options, path, appName)
end
path[#path] = nil
end
end
 
del(keySort)
del(opts)
 
return tabs, text
end
]]
local function BuildSelect(group, options, path, appName)
local groups = new()
local order = new()
local keySort = new()
local opts = new()
 
BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 
for i = 1, #keySort do
local k = keySort[i]
local v = opts[k]
if v.type == "group" then
path[#path+1] = k
local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
local hidden = CheckOptionHidden(v, options, path, appName)
if not inline and not hidden then
groups[k] = GetOptionsMemberValue("name", v, options, path, appName)
tinsert(order, k)
end
path[#path] = nil
end
end
 
del(opts)
del(keySort)
 
return groups, order
end
 
local function BuildSubGroups(group, tree, options, path, appName)
local keySort = new()
local opts = new()
 
BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 
for i = 1, #keySort do
local k = keySort[i]
local v = opts[k]
if v.type == "group" then
path[#path+1] = k
local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
local hidden = CheckOptionHidden(v, options, path, appName)
if not inline and not hidden then
local entry = new()
entry.value = k
entry.text = GetOptionsMemberValue("name", v, options, path, appName)
entry.icon = GetOptionsMemberValue("icon", v, options, path, appName)
entry.iconCoords = GetOptionsMemberValue("iconCoords", v, options, path, appName)
entry.disabled = CheckOptionDisabled(v, options, path, appName)
if not tree.children then tree.children = new() end
tinsert(tree.children,entry)
if (v.childGroups or "tree") == "tree" then
BuildSubGroups(v,entry, options, path, appName)
end
end
path[#path] = nil
end
end
 
del(keySort)
del(opts)
end
 
local function BuildGroups(group, options, path, appName, recurse)
local tree = new()
local keySort = new()
local opts = new()
 
BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 
for i = 1, #keySort do
local k = keySort[i]
local v = opts[k]
if v.type == "group" then
path[#path+1] = k
local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
local hidden = CheckOptionHidden(v, options, path, appName)
if not inline and not hidden then
local entry = new()
entry.value = k
entry.text = GetOptionsMemberValue("name", v, options, path, appName)
entry.icon = GetOptionsMemberValue("icon", v, options, path, appName)
entry.disabled = CheckOptionDisabled(v, options, path, appName)
tinsert(tree,entry)
if recurse and (v.childGroups or "tree") == "tree" then
BuildSubGroups(v,entry, options, path, appName)
end
end
path[#path] = nil
end
end
del(keySort)
del(opts)
return tree
end
 
local function InjectInfo(control, options, option, path, rootframe, appName)
local user = control:GetUserDataTable()
for i = 1, #path do
user[i] = path[i]
end
user.rootframe = rootframe
user.option = option
user.options = options
user.path = copy(path)
user.appName = appName
control:SetCallback("OnRelease", CleanUserData)
control:SetCallback("OnLeave", OptionOnMouseLeave)
control:SetCallback("OnEnter", OptionOnMouseOver)
end
 
 
--[[
options - root of the options table being fed
container - widget that controls will be placed in
rootframe - Frame object the options are in
path - table with the keys to get to the group being fed
--]]
 
local function FeedOptions(appName, options,container,rootframe,path,group,inline)
local keySort = new()
local opts = new()
 
BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 
for i = 1, #keySort do
local k = keySort[i]
local v = opts[k]
tinsert(path, k)
local hidden = CheckOptionHidden(v, options, path, appName)
local name = GetOptionsMemberValue("name", v, options, path, appName)
if not hidden then
if v.type == "group" then
if inline or pickfirstset(v.dialogInline,v.guiInline,v.inline, false) then
--Inline group
local GroupContainer
if name and name ~= "" then
GroupContainer = gui:Create("InlineGroup")
GroupContainer:SetTitle(name or "")
else
GroupContainer = gui:Create("SimpleGroup")
end
 
GroupContainer.width = "fill"
GroupContainer:SetLayout("flow")
container:AddChild(GroupContainer)
FeedOptions(appName,options,GroupContainer,rootframe,path,v,true)
end
else
--Control to feed
local control
 
local name = GetOptionsMemberValue("name", v, options, path, appName)
 
if v.type == "execute" then
 
local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
 
if type(image) == "string" then
control = gui:Create("Icon")
if not width then
width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
end
if not height then
height = GetOptionsMemberValue("imageHeight",v, options, path, appName)
end
if type(imageCoords) == "table" then
control:SetImage(image, unpack(imageCoords))
else
control:SetImage(image)
end
if type(width) ~= "number" then
width = 32
end
if type(height) ~= "number" then
height = 32
end
control:SetImageSize(width, height)
control:SetLabel(name)
else
control = gui:Create("Button")
control:SetText(name)
end
control:SetCallback("OnClick",ActivateControl)
 
elseif v.type == "input" then
local controlType = v.dialogControl or v.control or (v.multiline and "MultiLineEditBox") or "EditBox"
control = gui:Create(controlType)
if not control then
geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
control = gui:Create(v.multiline and "MultiLineEditBox" or "EditBox")
end
 
if v.multiline and control.SetNumLines then
control:SetNumLines(tonumber(v.multiline) or 4)
end
control:SetLabel(name)
control:SetCallback("OnEnterPressed",ActivateControl)
local text = GetOptionsMemberValue("get",v, options, path, appName)
if type(text) ~= "string" then
text = ""
end
control:SetText(text)
 
elseif v.type == "toggle" then
control = gui:Create("CheckBox")
control:SetLabel(name)
control:SetTriState(v.tristate)
local value = GetOptionsMemberValue("get",v, options, path, appName)
control:SetValue(value)
control:SetCallback("OnValueChanged",ActivateControl)
 
if v.descStyle == "inline" then
local desc = GetOptionsMemberValue("desc", v, options, path, appName)
control:SetDescription(desc)
end
 
local image = GetOptionsMemberValue("image", v, options, path, appName)
local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName)
 
if type(image) == "string" then
if type(imageCoords) == "table" then
control:SetImage(image, unpack(imageCoords))
else
control:SetImage(image)
end
end
elseif v.type == "range" then
control = gui:Create("Slider")
control:SetLabel(name)
control:SetSliderValues(v.softMin or v.min or 0, v.softMax or v.max or 100, v.bigStep or v.step or 0)
control:SetIsPercent(v.isPercent)
local value = GetOptionsMemberValue("get",v, options, path, appName)
if type(value) ~= "number" then
value = 0
end
control:SetValue(value)
control:SetCallback("OnValueChanged",ActivateSlider)
control:SetCallback("OnMouseUp",ActivateSlider)
 
elseif v.type == "select" then
local values = GetOptionsMemberValue("values", v, options, path, appName)
if v.style == "radio" then
local disabled = CheckOptionDisabled(v, options, path, appName)
local width = GetOptionsMemberValue("width",v,options,path,appName)
control = gui:Create("InlineGroup")
control:SetLayout("Flow")
control:SetTitle(name)
control.width = "fill"
 
control:PauseLayout()
local optionValue = GetOptionsMemberValue("get",v, options, path, appName, value)
for value, text in pairs(values) do
local radio = gui:Create("CheckBox")
radio:SetLabel(text)
radio:SetUserData("value", value)
radio:SetUserData("text", text)
radio:SetDisabled(disabled)
radio:SetType("radio")
radio:SetValue(optionValue == value)
radio:SetCallback("OnValueChanged", ActivateMultiControl)
InjectInfo(radio, options, v, path, rootframe, appName)
control:AddChild(radio)
if width == "double" then
radio:SetWidth(width_multiplier * 2)
elseif width == "half" then
radio:SetWidth(width_multiplier / 2)
elseif width == "full" then
radio.width = "fill"
else
radio:SetWidth(width_multiplier)
end
end
control:ResumeLayout()
control:DoLayout()
else
local controlType = v.dialogControl or v.control or "Dropdown"
control = gui:Create(controlType)
if not control then
geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
control = gui:Create("Dropdown")
end
local itemType = v.itemControl
if itemType and not gui:GetWidgetVersion(itemType) then
geterrorhandler()(("Invalid Custom Item Type - %s"):format(tostring(itemType)))
itemType = nil
end
control:SetLabel(name)
control:SetList(values, nil, itemType)
local value = GetOptionsMemberValue("get",v, options, path, appName)
if not values[value] then
value = nil
end
control:SetValue(value)
control:SetCallback("OnValueChanged", ActivateControl)
end
 
elseif v.type == "multiselect" then
local values = GetOptionsMemberValue("values", v, options, path, appName)
local disabled = CheckOptionDisabled(v, options, path, appName)
 
local controlType = v.dialogControl or v.control
 
local valuesort = new()
if values then
for value, text in pairs(values) do
tinsert(valuesort, value)
end
end
tsort(valuesort)
 
if controlType then
control = gui:Create(controlType)
if not control then
geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
end
end
if control then
control:SetMultiselect(true)
control:SetLabel(name)
control:SetList(values)
control:SetDisabled(disabled)
control:SetCallback("OnValueChanged",ActivateControl)
control:SetCallback("OnClosed", MultiControlOnClosed)
local width = GetOptionsMemberValue("width",v,options,path,appName)
if width == "double" then
control:SetWidth(width_multiplier * 2)
elseif width == "half" then
control:SetWidth(width_multiplier / 2)
elseif width == "full" then
control.width = "fill"
else
control:SetWidth(width_multiplier)
end
--check:SetTriState(v.tristate)
for i = 1, #valuesort do
local key = valuesort[i]
local value = GetOptionsMemberValue("get",v, options, path, appName, key)
control:SetItemValue(key,value)
end
else
control = gui:Create("InlineGroup")
control:SetLayout("Flow")
control:SetTitle(name)
control.width = "fill"
 
control:PauseLayout()
local width = GetOptionsMemberValue("width",v,options,path,appName)
for i = 1, #valuesort do
local value = valuesort[i]
local text = values[value]
local check = gui:Create("CheckBox")
check:SetLabel(text)
check:SetUserData("value", value)
check:SetUserData("text", text)
check:SetDisabled(disabled)
check:SetTriState(v.tristate)
check:SetValue(GetOptionsMemberValue("get",v, options, path, appName, value))
check:SetCallback("OnValueChanged",ActivateMultiControl)
InjectInfo(check, options, v, path, rootframe, appName)
control:AddChild(check)
if width == "double" then
check:SetWidth(width_multiplier * 2)
elseif width == "half" then
check:SetWidth(width_multiplier / 2)
elseif width == "full" then
check.width = "fill"
else
check:SetWidth(width_multiplier)
end
end
control:ResumeLayout()
control:DoLayout()
 
 
end
 
del(valuesort)
 
elseif v.type == "color" then
control = gui:Create("ColorPicker")
control:SetLabel(name)
control:SetHasAlpha(v.hasAlpha)
control:SetColor(GetOptionsMemberValue("get",v, options, path, appName))
control:SetCallback("OnValueChanged",ActivateControl)
control:SetCallback("OnValueConfirmed",ActivateControl)
 
elseif v.type == "keybinding" then
control = gui:Create("Keybinding")
control:SetLabel(name)
control:SetKey(GetOptionsMemberValue("get",v, options, path, appName))
control:SetCallback("OnKeyChanged",ActivateControl)
 
elseif v.type == "header" then
control = gui:Create("Heading")
control:SetText(name)
control.width = "fill"
 
elseif v.type == "description" then
control = gui:Create("Label")
control:SetText(name)
 
local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName)
if fontSize == "medium" then
control:SetFontObject(GameFontHighlight)
elseif fontSize == "large" then
control:SetFontObject(GameFontHighlightLarge)
else -- small or invalid
control:SetFontObject(GameFontHighlightSmall)
end
 
local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
 
if type(image) == "string" then
if not width then
width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
end
if not height then
height = GetOptionsMemberValue("imageHeight",v, options, path, appName)
end
if type(imageCoords) == "table" then
control:SetImage(image, unpack(imageCoords))
else
control:SetImage(image)
end
if type(width) ~= "number" then
width = 32
end
if type(height) ~= "number" then
height = 32
end
control:SetImageSize(width, height)
end
local width = GetOptionsMemberValue("width",v,options,path,appName)
control.width = not width and "fill"
end
 
--Common Init
if control then
if control.width ~= "fill" then
local width = GetOptionsMemberValue("width",v,options,path,appName)
if width == "double" then
control:SetWidth(width_multiplier * 2)
elseif width == "half" then
control:SetWidth(width_multiplier / 2)
elseif width == "full" then
control.width = "fill"
else
control:SetWidth(width_multiplier)
end
end
if control.SetDisabled then
local disabled = CheckOptionDisabled(v, options, path, appName)
control:SetDisabled(disabled)
end
 
InjectInfo(control, options, v, path, rootframe, appName)
container:AddChild(control)
end
 
end
end
tremove(path)
end
container:ResumeLayout()
container:DoLayout()
del(keySort)
del(opts)
end
 
local function BuildPath(path, ...)
for i = 1, select("#",...) do
tinsert(path, (select(i,...)))
end
end
 
 
local function TreeOnButtonEnter(widget, event, uniquevalue, button)
local user = widget:GetUserDataTable()
if not user then return end
local options = user.options
local option = user.option
local path = user.path
local appName = user.appName
 
local feedpath = new()
for i = 1, #path do
feedpath[i] = path[i]
end
 
BuildPath(feedpath, ("\001"):split(uniquevalue))
local group = options
for i = 1, #feedpath do
if not group then return end
group = GetSubOption(group, feedpath[i])
end
 
local name = GetOptionsMemberValue("name", group, options, feedpath, appName)
local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName)
 
GameTooltip:SetOwner(button, "ANCHOR_NONE")
if widget.type == "TabGroup" then
GameTooltip:SetPoint("BOTTOM",button,"TOP")
else
GameTooltip:SetPoint("LEFT",button,"RIGHT")
end
 
GameTooltip:SetText(name, 1, .82, 0, 1)
 
if type(desc) == "string" then
GameTooltip:AddLine(desc, 1, 1, 1, 1)
end
 
GameTooltip:Show()
end
 
local function TreeOnButtonLeave(widget, event, value, button)
GameTooltip:Hide()
end
 
 
local function GroupExists(appName, options, path, uniquevalue)
if not uniquevalue then return false end
 
local feedpath = new()
local temppath = new()
for i = 1, #path do
feedpath[i] = path[i]
end
 
BuildPath(feedpath, ("\001"):split(uniquevalue))
 
local group = options
for i = 1, #feedpath do
local v = feedpath[i]
temppath[i] = v
group = GetSubOption(group, v)
 
if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
del(feedpath)
del(temppath)
return false
end
end
del(feedpath)
del(temppath)
return true
end
 
local function GroupSelected(widget, event, uniquevalue)
 
local user = widget:GetUserDataTable()
 
local options = user.options
local option = user.option
local path = user.path
local rootframe = user.rootframe
 
local feedpath = new()
for i = 1, #path do
feedpath[i] = path[i]
end
 
BuildPath(feedpath, ("\001"):split(uniquevalue))
local group = options
for i = 1, #feedpath do
group = GetSubOption(group, feedpath[i])
end
widget:ReleaseChildren()
AceConfigDialog:FeedGroup(user.appName,options,widget,rootframe,feedpath)
 
del(feedpath)
end
 
 
 
--[[
-- INTERNAL --
This function will feed one group, and any inline child groups into the given container
Select Groups will only have the selection control (tree, tabs, dropdown) fed in
and have a group selected, this event will trigger the feeding of child groups
 
Rules:
If the group is Inline, FeedOptions
If the group has no child groups, FeedOptions
 
If the group is a tab or select group, FeedOptions then add the Group Control
If the group is a tree group FeedOptions then
its parent isnt a tree group: then add the tree control containing this and all child tree groups
if its parent is a tree group, its already a node on a tree
--]]
 
function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isRoot)
local group = options
--follow the path to get to the curent group
local inline
local grouptype, parenttype = options.childGroups, "none"
 
 
for i = 1, #path do
local v = path[i]
group = GetSubOption(group, v)
inline = inline or pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
parenttype = grouptype
grouptype = group.childGroups
end
 
if not parenttype then
parenttype = "tree"
end
 
--check if the group has child groups
local hasChildGroups
for k, v in pairs(group.args) do
if v.type == "group" and not pickfirstset(v.dialogInline,v.guiInline,v.inline, false) and not CheckOptionHidden(v, options, path, appName) then
hasChildGroups = true
end
end
if group.plugins then
for plugin, t in pairs(group.plugins) do
for k, v in pairs(t) do
if v.type == "group" and not pickfirstset(v.dialogInline,v.guiInline,v.inline, false) and not CheckOptionHidden(v, options, path, appName) then
hasChildGroups = true
end
end
end
end
 
container:SetLayout("flow")
local scroll
 
--Add a scrollframe if we are not going to add a group control, this is the inverse of the conditions for that later on
if (not (hasChildGroups and not inline)) or (grouptype ~= "tab" and grouptype ~= "select" and (parenttype == "tree" and not isRoot)) then
if container.type ~= "InlineGroup" and container.type ~= "SimpleGroup" then
scroll = gui:Create("ScrollFrame")
scroll:SetLayout("flow")
scroll.width = "fill"
scroll.height = "fill"
container:SetLayout("fill")
container:AddChild(scroll)
container = scroll
end
end
 
FeedOptions(appName,options,container,rootframe,path,group,nil)
 
if scroll then
container:PerformLayout()
local status = self:GetStatusTable(appName, path)
if not status.scroll then
status.scroll = {}
end
scroll:SetStatusTable(status.scroll)
end
 
if hasChildGroups and not inline then
local name = GetOptionsMemberValue("name", group, options, path, appName)
if grouptype == "tab" then
 
local tab = gui:Create("TabGroup")
InjectInfo(tab, options, group, path, rootframe, appName)
tab:SetCallback("OnGroupSelected", GroupSelected)
tab:SetCallback("OnTabEnter", TreeOnButtonEnter)
tab:SetCallback("OnTabLeave", TreeOnButtonLeave)
 
local status = AceConfigDialog:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
end
tab:SetStatusTable(status.groups)
tab.width = "fill"
tab.height = "fill"
 
local tabs = BuildGroups(group, options, path, appName)
tab:SetTabs(tabs)
tab:SetUserData("tablist", tabs)
 
for i = 1, #tabs do
local entry = tabs[i]
if not entry.disabled then
tab:SelectTab((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or entry.value)
break
end
end
 
container:AddChild(tab)
 
elseif grouptype == "select" then
 
local select = gui:Create("DropdownGroup")
select:SetTitle(name)
InjectInfo(select, options, group, path, rootframe, appName)
select:SetCallback("OnGroupSelected", GroupSelected)
local status = AceConfigDialog:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
end
select:SetStatusTable(status.groups)
local grouplist, orderlist = BuildSelect(group, options, path, appName)
select:SetGroupList(grouplist, orderlist)
select:SetUserData("grouplist", grouplist)
select:SetUserData("orderlist", orderlist)
 
local firstgroup = orderlist[1]
if firstgroup then
select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
end
 
select.width = "fill"
select.height = "fill"
 
container:AddChild(select)
 
--assume tree group by default
--if parenttype is tree then this group is already a node on that tree
elseif (parenttype ~= "tree") or isRoot then
local tree = gui:Create("TreeGroup")
InjectInfo(tree, options, group, path, rootframe, appName)
tree:EnableButtonTooltips(false)
 
tree.width = "fill"
tree.height = "fill"
 
tree:SetCallback("OnGroupSelected", GroupSelected)
tree:SetCallback("OnButtonEnter", TreeOnButtonEnter)
tree:SetCallback("OnButtonLeave", TreeOnButtonLeave)
 
local status = AceConfigDialog:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
end
local treedefinition = BuildGroups(group, options, path, appName, true)
tree:SetStatusTable(status.groups)
 
tree:SetTree(treedefinition)
tree:SetUserData("tree",treedefinition)
 
for i = 1, #treedefinition do
local entry = treedefinition[i]
if not entry.disabled then
tree:SelectByValue((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or entry.value)
break
end
end
 
container:AddChild(tree)
end
end
end
 
local old_CloseSpecialWindows
 
 
local function RefreshOnUpdate(this)
for appName in pairs(this.closing) do
if AceConfigDialog.OpenFrames[appName] then
AceConfigDialog.OpenFrames[appName]:Hide()
end
if AceConfigDialog.BlizOptions and AceConfigDialog.BlizOptions[appName] then
for key, widget in pairs(AceConfigDialog.BlizOptions[appName]) do
if not widget:IsVisible() then
widget:ReleaseChildren()
end
end
end
this.closing[appName] = nil
end
 
if this.closeAll then
for k, v in pairs(AceConfigDialog.OpenFrames) do
if not this.closeAllOverride[k] then
v:Hide()
end
end
this.closeAll = nil
wipe(this.closeAllOverride)
end
 
for appName in pairs(this.apps) do
if AceConfigDialog.OpenFrames[appName] then
local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable()
AceConfigDialog:Open(appName, unpack(user.basepath or emptyTbl))
end
if AceConfigDialog.BlizOptions and AceConfigDialog.BlizOptions[appName] then
for key, widget in pairs(AceConfigDialog.BlizOptions[appName]) do
local user = widget:GetUserDataTable()
if widget:IsVisible() then
AceConfigDialog:Open(widget:GetUserData("appName"), widget, unpack(user.basepath or emptyTbl))
end
end
end
this.apps[appName] = nil
end
this:SetScript("OnUpdate", nil)
end
 
-- Upgrade the OnUpdate script as well, if needed.
if AceConfigDialog.frame:GetScript("OnUpdate") then
AceConfigDialog.frame:SetScript("OnUpdate", RefreshOnUpdate)
end
 
--- Close all open options windows
function AceConfigDialog:CloseAll()
AceConfigDialog.frame.closeAll = true
AceConfigDialog.frame:SetScript("OnUpdate", RefreshOnUpdate)
if next(self.OpenFrames) then
return true
end
end
 
--- Close a specific options window.
-- @param appName The application name as given to `:RegisterOptionsTable()`
function AceConfigDialog:Close(appName)
if self.OpenFrames[appName] then
AceConfigDialog.frame.closing[appName] = true
AceConfigDialog.frame:SetScript("OnUpdate", RefreshOnUpdate)
return true
end
end
 
-- Internal -- Called by AceConfigRegistry
function AceConfigDialog:ConfigTableChanged(event, appName)
AceConfigDialog.frame.apps[appName] = true
AceConfigDialog.frame:SetScript("OnUpdate", RefreshOnUpdate)
end
 
reg.RegisterCallback(AceConfigDialog, "ConfigTableChange", "ConfigTableChanged")
 
--- Sets the default size of the options window for a specific application.
-- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param width The default width
-- @param height The default height
function AceConfigDialog:SetDefaultSize(appName, width, height)
local status = AceConfigDialog:GetStatusTable(appName)
if type(width) == "number" and type(height) == "number" then
status.width = width
status.height = height
end
end
 
--- Open an option window at the specified path (if any).
-- This function can optionally feed the group into a pre-created container
-- instead of creating a new container frame.
-- @paramsig appName [, container][, ...]
-- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param container An optional container frame to feed the options into
-- @param ... The path to open after creating the options window (see `:SelectGroup` for details)
function AceConfigDialog:Open(appName, container, ...)
if not old_CloseSpecialWindows then
old_CloseSpecialWindows = CloseSpecialWindows
CloseSpecialWindows = function()
local found = old_CloseSpecialWindows()
return self:CloseAll() or found
end
end
local app = reg:GetOptionsTable(appName)
if not app then
error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
end
local options = app("dialog", MAJOR)
 
local f
 
local path = new()
local name = GetOptionsMemberValue("name", options, options, path, appName)
 
--If an optional path is specified add it to the path table before feeding the options
--as container is optional as well it may contain the first element of the path
if type(container) == "string" then
tinsert(path, container)
container = nil
end
for n = 1, select("#",...) do
tinsert(path, (select(n, ...)))
end
 
--if a container is given feed into that
if container then
f = container
f:ReleaseChildren()
f:SetUserData("appName", appName)
f:SetUserData("iscustom", true)
if #path > 0 then
f:SetUserData("basepath", copy(path))
end
local status = AceConfigDialog:GetStatusTable(appName)
if not status.width then
status.width = 700
end
if not status.height then
status.height = 500
end
if f.SetStatusTable then
f:SetStatusTable(status)
end
if f.SetTitle then
f:SetTitle(name or "")
end
else
if not self.OpenFrames[appName] then
f = gui:Create("Frame")
self.OpenFrames[appName] = f
else
f = self.OpenFrames[appName]
end
f:ReleaseChildren()
f:SetCallback("OnClose", FrameOnClose)
f:SetUserData("appName", appName)
if #path > 0 then
f:SetUserData("basepath", copy(path))
end
f:SetTitle(name or "")
local status = AceConfigDialog:GetStatusTable(appName)
f:SetStatusTable(status)
end
 
self:FeedGroup(appName,options,f,f,path,true)
if f.Show then
f:Show()
end
del(path)
 
if AceConfigDialog.frame.closeAll then
-- close all is set, but thats not good, since we're just opening here, so force it
AceConfigDialog.frame.closeAllOverride[appName] = true
end
end
 
-- convert pre-39 BlizOptions structure to the new format
if oldminor and oldminor < 39 and AceConfigDialog.BlizOptions then
local old = AceConfigDialog.BlizOptions
local new = {}
for key, widget in pairs(old) do
local appName = widget:GetUserData("appName")
if not new[appName] then new[appName] = {} end
new[appName][key] = widget
end
AceConfigDialog.BlizOptions = new
else
AceConfigDialog.BlizOptions = AceConfigDialog.BlizOptions or {}
end
 
local function FeedToBlizPanel(widget, event)
local path = widget:GetUserData("path")
AceConfigDialog:Open(widget:GetUserData("appName"), widget, unpack(path or emptyTbl))
end
 
local function ClearBlizPanel(widget, event)
local appName = widget:GetUserData("appName")
AceConfigDialog.frame.closing[appName] = true
AceConfigDialog.frame:SetScript("OnUpdate", RefreshOnUpdate)
end
 
--- Add an option table into the Blizzard Interface Options panel.
-- You can optionally supply a descriptive name to use and a parent frame to use,
-- as well as a path in the options table.\\
-- If no name is specified, the appName will be used instead.
--
-- If you specify a proper `parent` (by name), the interface options will generate a
-- tree layout. Note that only one level of children is supported, so the parent always
-- has to be a head-level note.
--
-- This function returns a reference to the container frame registered with the Interface
-- Options. You can use this reference to open the options with the API function
-- `InterfaceOptionsFrame_OpenToCategory`.
-- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param name A descriptive name to display in the options tree (defaults to appName)
-- @param parent The parent to use in the interface options tree.
-- @param ... The path in the options table to feed into the interface options panel.
-- @return The reference to the frame registered into the Interface Options.
function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
local BlizOptions = AceConfigDialog.BlizOptions
 
local key = appName
for n = 1, select("#", ...) do
key = key.."\001"..select(n, ...)
end
 
if not BlizOptions[appName] then
BlizOptions[appName] = {}
end
 
if not BlizOptions[appName][key] then
local group = gui:Create("BlizOptionsGroup")
BlizOptions[appName][key] = group
group:SetName(name or appName, parent)
 
group:SetTitle(name or appName)
group:SetUserData("appName", appName)
if select("#", ...) > 0 then
local path = {}
for n = 1, select("#",...) do
tinsert(path, (select(n, ...)))
end
group:SetUserData("path", path)
end
group:SetCallback("OnShow", FeedToBlizPanel)
group:SetCallback("OnHide", ClearBlizPanel)
InterfaceOptions_AddCategory(group.frame)
return group.frame
else
error(("%s has already been added to the Blizzard Options Window with the given path"):format(appName), 2)
end
end
RecipeRadar/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml New file
0,0 → 1,4
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceConfigCmd-3.0.lua"/>
</Ui>
\ No newline at end of file
RecipeRadar/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua New file
0,0 → 1,787
--- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
-- @class file
-- @name AceConfigCmd-3.0
-- @release $Id: AceConfigCmd-3.0.lua 904 2009-12-13 11:56:37Z nevcairiel $
 
--[[
AceConfigCmd-3.0
 
Handles commandline optionstable access
 
REQUIRES: AceConsole-3.0 for command registration (loaded on demand)
 
]]
 
-- TODO: plugin args
 
 
local MAJOR, MINOR = "AceConfigCmd-3.0", 12
local AceConfigCmd = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceConfigCmd then return end
 
AceConfigCmd.commands = AceConfigCmd.commands or {}
local commands = AceConfigCmd.commands
 
local cfgreg = LibStub("AceConfigRegistry-3.0")
local AceConsole -- LoD
local AceConsoleName = "AceConsole-3.0"
 
-- Lua APIs
local strsub, strsplit, strlower, strmatch, strtrim = string.sub, string.split, string.lower, string.match, string.trim
local format, tonumber, tostring = string.format, tonumber, tostring
local tsort, tinsert = table.sort, table.insert
local select, pairs, next, type = select, pairs, next, type
local error, assert = error, assert
 
-- WoW APIs
local _G = _G
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: LibStub, SELECTED_CHAT_FRAME, DEFAULT_CHAT_FRAME
 
 
local L = setmetatable({}, { -- TODO: replace with proper locale
__index = function(self,k) return k end
})
 
 
 
local function print(msg)
(SELECTED_CHAT_FRAME or DEFAULT_CHAT_FRAME):AddMessage(msg)
end
 
-- constants used by getparam() calls below
 
local handlertypes = {["table"]=true}
local handlermsg = "expected a table"
 
local functypes = {["function"]=true, ["string"]=true}
local funcmsg = "expected function or member name"
 
 
-- pickfirstset() - picks the first non-nil value and returns it
 
local function pickfirstset(...)
for i=1,select("#",...) do
if select(i,...)~=nil then
return select(i,...)
end
end
end
 
 
-- err() - produce real error() regarding malformed options tables etc
 
local function err(info,inputpos,msg )
local cmdstr=" "..strsub(info.input, 1, inputpos-1)
error(MAJOR..": /" ..info[0] ..cmdstr ..": "..(msg or "malformed options table"), 2)
end
 
 
-- usererr() - produce chatframe message regarding bad slash syntax etc
 
local function usererr(info,inputpos,msg )
local cmdstr=strsub(info.input, 1, inputpos-1);
print("/" ..info[0] .. " "..cmdstr ..": "..(msg or "malformed options table"))
end
 
 
-- callmethod() - call a given named method (e.g. "get", "set") with given arguments
 
local function callmethod(info, inputpos, tab, methodtype, ...)
local method = info[methodtype]
if not method then
err(info, inputpos, "'"..methodtype.."': not set")
end
 
info.arg = tab.arg
info.option = tab
info.type = tab.type
 
if type(method)=="function" then
return method(info, ...)
elseif type(method)=="string" then
if type(info.handler[method])~="function" then
err(info, inputpos, "'"..methodtype.."': '"..method.."' is not a member function of "..tostring(info.handler))
end
return info.handler[method](info.handler, info, ...)
else
assert(false) -- type should have already been checked on read
end
end
 
-- callfunction() - call a given named function (e.g. "name", "desc") with given arguments
 
local function callfunction(info, tab, methodtype, ...)
local method = tab[methodtype]
 
info.arg = tab.arg
info.option = tab
info.type = tab.type
 
if type(method)=="function" then
return method(info, ...)
else
assert(false) -- type should have already been checked on read
end
end
 
-- do_final() - do the final step (set/execute) along with validation and confirmation
 
local function do_final(info, inputpos, tab, methodtype, ...)
if info.validate then
local res = callmethod(info,inputpos,tab,"validate",...)
if type(res)=="string" then
usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
return
end
end
-- console ignores .confirm
 
callmethod(info,inputpos,tab,methodtype, ...)
end
 
 
-- getparam() - used by handle() to retreive and store "handler", "get", "set", etc
 
local function getparam(info, inputpos, tab, depth, paramname, types, errormsg)
local old,oldat = info[paramname], info[paramname.."_at"]
local val=tab[paramname]
if val~=nil then
if val==false then
val=nil
elseif not types[type(val)] then
err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
end
info[paramname] = val
info[paramname.."_at"] = depth
end
return old,oldat
end
 
 
-- iterateargs(tab) - custom iterator that iterates both t.args and t.plugins.*
local dummytable={}
 
local function iterateargs(tab)
if not tab.plugins then
return pairs(tab.args)
end
 
local argtabkey,argtab=next(tab.plugins)
local v
 
return function(_, k)
while argtab do
k,v = next(argtab, k)
if k then return k,v end
if argtab==tab.args then
argtab=nil
else
argtabkey,argtab = next(tab.plugins, argtabkey)
if not argtabkey then
argtab=tab.args
end
end
end
end
end
 
local function checkhidden(info, inputpos, tab)
if tab.cmdHidden~=nil then
return tab.cmdHidden
end
local hidden = tab.hidden
if type(hidden) == "function" or type(hidden) == "string" then
info.hidden = hidden
hidden = callmethod(info, inputpos, tab, 'hidden')
info.hidden = nil
end
return hidden
end
 
local function showhelp(info, inputpos, tab, depth, noHead)
if not noHead then
print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
end
 
local sortTbl = {} -- [1..n]=name
local refTbl = {} -- [name]=tableref
 
for k,v in iterateargs(tab) do
if not refTbl[k] then -- a plugin overriding something in .args
tinsert(sortTbl, k)
refTbl[k] = v
end
end
 
tsort(sortTbl, function(one, two)
local o1 = refTbl[one].order or 100
local o2 = refTbl[two].order or 100
if type(o1) == "function" or type(o1) == "string" then
info.order = o1
info[#info+1] = one
o1 = callmethod(info, inputpos, refTbl[one], "order")
info[#info] = nil
info.order = nil
end
if type(o2) == "function" or type(o1) == "string" then
info.order = o2
info[#info+1] = two
o2 = callmethod(info, inputpos, refTbl[two], "order")
info[#info] = nil
info.order = nil
end
if o1<0 and o2<0 then return o1<o2 end
if o2<0 then return true end
if o1<0 then return false end
if o1==o2 then return tostring(one)<tostring(two) end -- compare names
return o1<o2
end)
 
for i = 1, #sortTbl do
local k = sortTbl[i]
local v = refTbl[k]
if not checkhidden(info, inputpos, v) then
if v.type ~= "description" and v.type ~= "header" then
-- recursively show all inline groups
local name, desc = v.name, v.desc
if type(name) == "function" then
name = callfunction(info, v, 'name')
end
if type(desc) == "function" then
desc = callfunction(info, v, 'desc')
end
if v.type == "group" and pickfirstset(v.cmdInline, v.inline, false) then
print(" "..(desc or name)..":")
local oldhandler,oldhandler_at = getparam(info, inputpos, v, depth, "handler", handlertypes, handlermsg)
showhelp(info, inputpos, v, depth, true)
info.handler,info.handler_at = oldhandler,oldhandler_at
else
local key = k:gsub(" ", "_")
print(" |cffffff78"..key.."|r - "..(desc or name or ""))
end
end
end
end
end
 
 
local function keybindingValidateFunc(text)
if text == nil or text == "NONE" then
return nil
end
text = text:upper()
local shift, ctrl, alt
local modifier
while true do
if text == "-" then
break
end
modifier, text = strsplit('-', text, 2)
if text then
if modifier ~= "SHIFT" and modifier ~= "CTRL" and modifier ~= "ALT" then
return false
end
if modifier == "SHIFT" then
if shift then
return false
end
shift = true
end
if modifier == "CTRL" then
if ctrl then
return false
end
ctrl = true
end
if modifier == "ALT" then
if alt then
return false
end
alt = true
end
else
text = modifier
break
end
end
if text == "" then
return false
end
if not text:find("^F%d+$") and text ~= "CAPSLOCK" and text:len() ~= 1 and (text:byte() < 128 or text:len() > 4) and not _G["KEY_" .. text] then
return false
end
local s = text
if shift then
s = "SHIFT-" .. s
end
if ctrl then
s = "CTRL-" .. s
end
if alt then
s = "ALT-" .. s
end
return s
end
 
-- handle() - selfrecursing function that processes input->optiontable
-- - depth - starts at 0
-- - retfalse - return false rather than produce error if a match is not found (used by inlined groups)
 
local function handle(info, inputpos, tab, depth, retfalse)
 
if not(type(tab)=="table" and type(tab.type)=="string") then err(info,inputpos) end
 
-------------------------------------------------------------------
-- Grab hold of handler,set,get,func,etc if set (and remember old ones)
-- Note that we do NOT validate if method names are correct at this stage,
-- the handler may change before they're actually used!
 
local oldhandler,oldhandler_at = getparam(info,inputpos,tab,depth,"handler",handlertypes,handlermsg)
local oldset,oldset_at = getparam(info,inputpos,tab,depth,"set",functypes,funcmsg)
local oldget,oldget_at = getparam(info,inputpos,tab,depth,"get",functypes,funcmsg)
local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg)
local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg)
--local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
 
-------------------------------------------------------------------
-- Act according to .type of this table
 
if tab.type=="group" then
------------ group --------------------------------------------
 
if type(tab.args)~="table" then err(info, inputpos) end
if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
 
-- grab next arg from input
local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos)
if not arg then
showhelp(info, inputpos, tab, depth)
return
end
nextpos=nextpos+1
 
-- loop .args and try to find a key with a matching name
for k,v in iterateargs(tab) do
if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end
 
-- is this child an inline group? if so, traverse into it
if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
info[depth+1] = k
if handle(info, inputpos, v, depth+1, true)==false then
info[depth+1] = nil
-- wasn't found in there, but that's ok, we just keep looking down here
else
return -- done, name was found in inline group
end
-- matching name and not a inline group
elseif strlower(arg)==strlower(k:gsub(" ", "_")) then
info[depth+1] = k
return handle(info,nextpos,v,depth+1)
end
end
 
-- no match
if retfalse then
-- restore old infotable members and return false to indicate failure
info.handler,info.handler_at = oldhandler,oldhandler_at
info.set,info.set_at = oldset,oldset_at
info.get,info.get_at = oldget,oldget_at
info.func,info.func_at = oldfunc,oldfunc_at
info.validate,info.validate_at = oldvalidate,oldvalidate_at
--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
return false
end
 
-- couldn't find the command, display error
usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
return
end
 
local str = strsub(info.input,inputpos);
 
if tab.type=="execute" then
------------ execute --------------------------------------------
do_final(info, inputpos, tab, "func")
 
 
 
elseif tab.type=="input" then
------------ input --------------------------------------------
 
local res = true
if tab.pattern then
if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
if not strmatch(str, tab.pattern) then
usererr(info, inputpos, "'"..str.."' - " .. L["invalid input"])
return
end
end
 
do_final(info, inputpos, tab, "set", str)
 
 
 
elseif tab.type=="toggle" then
------------ toggle --------------------------------------------
local b
local str = strtrim(strlower(str))
if str=="" then
b = callmethod(info, inputpos, tab, "get")
 
if tab.tristate then
--cycle in true, nil, false order
if b then
b = nil
elseif b == nil then
b = false
else
b = true
end
else
b = not b
end
 
elseif str==L["on"] then
b = true
elseif str==L["off"] then
b = false
elseif tab.tristate and str==L["default"] then
b = nil
else
if tab.tristate then
usererr(info, inputpos, format(L["'%s' - expected 'on', 'off' or 'default', or no argument to toggle."], str))
else
usererr(info, inputpos, format(L["'%s' - expected 'on' or 'off', or no argument to toggle."], str))
end
return
end
 
do_final(info, inputpos, tab, "set", b)
 
 
elseif tab.type=="range" then
------------ range --------------------------------------------
local val = tonumber(str)
if not val then
usererr(info, inputpos, "'"..str.."' - "..L["expected number"])
return
end
if type(info.step)=="number" then
val = val- (val % info.step)
end
if type(info.min)=="number" and val<info.min then
usererr(info, inputpos, val.." - "..format(L["must be equal to or higher than %s"], tostring(info.min)) )
return
end
if type(info.max)=="number" and val>info.max then
usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
return
end
 
do_final(info, inputpos, tab, "set", val)
 
 
elseif tab.type=="select" then
------------ select ------------------------------------
local str = strtrim(strlower(str))
 
local values = tab.values
if type(values) == "function" or type(values) == "string" then
info.values = values
values = callmethod(info, inputpos, tab, "values")
info.values = nil
end
 
if str == "" then
local b = callmethod(info, inputpos, tab, "get")
local fmt = "|cffffff78- [%s]|r %s"
local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
print(L["Options for |cffffff78"..info[#info].."|r:"])
for k, v in pairs(values) do
if b == k then
print(fmt_sel:format(k, v))
else
print(fmt:format(k, v))
end
end
return
end
 
local ok
for k,v in pairs(values) do
if strlower(k)==str then
str = k -- overwrite with key (in case of case mismatches)
ok = true
break
end
end
if not ok then
usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
return
end
 
do_final(info, inputpos, tab, "set", str)
 
elseif tab.type=="multiselect" then
------------ multiselect -------------------------------------------
local str = strtrim(strlower(str))
 
local values = tab.values
if type(values) == "function" or type(values) == "string" then
info.values = values
values = callmethod(info, inputpos, tab, "values")
info.values = nil
end
 
if str == "" then
local fmt = "|cffffff78- [%s]|r %s"
local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
print(L["Options for |cffffff78"..info[#info].."|r (multiple possible):"])
for k, v in pairs(values) do
if callmethod(info, inputpos, tab, "get", k) then
print(fmt_sel:format(k, v))
else
print(fmt:format(k, v))
end
end
return
end
 
--build a table of the selections, checking that they exist
--parse for =on =off =default in the process
--table will be key = true for options that should toggle, key = [on|off|default] for options to be set
local sels = {}
for v in str:gmatch("[^ ]+") do
--parse option=on etc
local opt, val = v:match('(.+)=(.+)')
--get option if toggling
if not opt then
opt = v
end
 
--check that the opt is valid
local ok
for k,v in pairs(values) do
if strlower(k)==opt then
opt = k -- overwrite with key (in case of case mismatches)
ok = true
break
end
end
 
if not ok then
usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
return
end
 
--check that if val was supplied it is valid
if val then
if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then
--val is valid insert it
sels[opt] = val
else
if tab.tristate then
usererr(info, inputpos, format(L["'%s' '%s' - expected 'on', 'off' or 'default', or no argument to toggle."], v, val))
else
usererr(info, inputpos, format(L["'%s' '%s' - expected 'on' or 'off', or no argument to toggle."], v, val))
end
return
end
else
-- no val supplied, toggle
sels[opt] = true
end
end
 
for opt, val in pairs(sels) do
local newval
 
if (val == true) then
--toggle the option
local b = callmethod(info, inputpos, tab, "get", opt)
 
if tab.tristate then
--cycle in true, nil, false order
if b then
b = nil
elseif b == nil then
b = false
else
b = true
end
else
b = not b
end
newval = b
else
--set the option as specified
if val==L["on"] then
newval = true
elseif val==L["off"] then
newval = false
elseif val==L["default"] then
newval = nil
end
end
 
do_final(info, inputpos, tab, "set", opt, newval)
end
 
 
elseif tab.type=="color" then
------------ color --------------------------------------------
local str = strtrim(strlower(str))
if str == "" then
--TODO: Show current value
return
end
 
local r, g, b, a
 
if tab.hasAlpha then
if str:len() == 8 and str:find("^%x*$") then
--parse a hex string
r,g,b,a = tonumber(str:sub(1, 2), 16) / 255, tonumber(str:sub(3, 4), 16) / 255, tonumber(str:sub(5, 6), 16) / 255, tonumber(str:sub(7, 8), 16) / 255
else
--parse seperate values
r,g,b,a = str:match("^([%d%.]+) ([%d%.]+) ([%d%.]+) ([%d%.]+)$")
r,g,b,a = tonumber(r), tonumber(g), tonumber(b), tonumber(a)
end
if not (r and g and b and a) then
usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
return
end
 
if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then
--values are valid
elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then
--values are valid 0..255, convert to 0..1
r = r / 255
g = g / 255
b = b / 255
a = a / 255
else
--values are invalid
usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0..1 or 0..255."], str))
end
else
a = 1.0
if str:len() == 6 and str:find("^%x*$") then
--parse a hex string
r,g,b = tonumber(str:sub(1, 2), 16) / 255, tonumber(str:sub(3, 4), 16) / 255, tonumber(str:sub(5, 6), 16) / 255
else
--parse seperate values
r,g,b = str:match("^([%d%.]+) ([%d%.]+) ([%d%.]+)$")
r,g,b = tonumber(r), tonumber(g), tonumber(b)
end
if not (r and g and b) then
usererr(info, inputpos, format(L["'%s' - expected 'RRGGBB' or 'r g b'."], str))
return
end
if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 then
--values are valid
elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 then
--values are valid 0..255, convert to 0..1
r = r / 255
g = g / 255
b = b / 255
else
--values are invalid
usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
end
end
 
do_final(info, inputpos, tab, "set", r,g,b,a)
 
elseif tab.type=="keybinding" then
------------ keybinding --------------------------------------------
local str = strtrim(strlower(str))
if str == "" then
--TODO: Show current value
return
end
local value = keybindingValidateFunc(str:upper())
if value == false then
usererr(info, inputpos, format(L["'%s' - Invalid Keybinding."], str))
return
end
 
do_final(info, inputpos, tab, "set", value)
 
elseif tab.type=="description" then
------------ description --------------------
-- ignore description, GUI config only
else
err(info, inputpos, "unknown options table item type '"..tostring(tab.type).."'")
end
end
 
--- Handle the chat command.
-- This is usually called from a chat command handler to parse the command input as operations on an aceoptions table.\\
-- AceConfigCmd uses this function internally when a slash command is registered with `:CreateChatCommand`
-- @param slashcmd The slash command WITHOUT leading slash (only used for error output)
-- @param appName The application name as given to `:RegisterOptionsTable()`
-- @param input The commandline input (as given by the WoW handler, i.e. without the command itself)
-- @usage
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0")
-- -- Use AceConsole-3.0 to register a Chat Command
-- MyAddon:RegisterChatCommand("mychat", "ChatCommand")
--
-- -- Show the GUI if no input is supplied, otherwise handle the chat input.
-- function MyAddon:ChatCommand(input)
-- -- Assuming "MyOptions" is the appName of a valid options table
-- if not input or input:trim() == "" then
-- LibStub("AceConfigDialog-3.0"):Open("MyOptions")
-- else
-- LibStub("AceConfigCmd-3.0").HandleCommand(MyAddon, "mychat", "MyOptions", input)
-- end
-- end
function AceConfigCmd:HandleCommand(slashcmd, appName, input)
 
local optgetter = cfgreg:GetOptionsTable(appName)
if not optgetter then
error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
end
local options = assert( optgetter("cmd", MAJOR) )
 
local info = { -- Don't try to recycle this, it gets handed off to callbacks and whatnot
[0] = slashcmd,
appName = appName,
options = options,
input = input,
self = self,
handler = self,
uiType = "cmd",
uiName = MAJOR,
}
 
handle(info, 1, options, 0) -- (info, inputpos, table, depth)
end
 
--- Utility function to create a slash command handler.
-- Also registers tab completion with AceTab
-- @param slashcmd The slash command WITHOUT leading slash (only used for error output)
-- @param appName The application name as given to `:RegisterOptionsTable()`
function AceConfigCmd:CreateChatCommand(slashcmd, appName)
if not AceConsole then
AceConsole = LibStub(AceConsoleName)
end
if AceConsole.RegisterChatCommand(self, slashcmd, function(input)
AceConfigCmd.HandleCommand(self, slashcmd, appName, input) -- upgradable
end,
true) then -- succesfully registered so lets get the command -> app table in
commands[slashcmd] = appName
end
end
 
--- Utility function that returns the options table that belongs to a slashcommand.
-- Designed to be used for the AceTab interface.
-- @param slashcmd The slash command WITHOUT leading slash (only used for error output)
-- @return The options table associated with the slash command (or nil if the slash command was not registered)
function AceConfigCmd:GetChatCommandOptions(slashcmd)
return commands[slashcmd]
end
RecipeRadar/libs/AceDB-3.0/AceDB-3.0.xml New file
0,0 → 1,4
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceDB-3.0.lua"/>
</Ui>
\ No newline at end of file
RecipeRadar/libs/AceDB-3.0/AceDB-3.0.lua New file
0,0 → 1,728
--- **AceDB-3.0** manages the SavedVariables of your addon.
-- It offers profile management, smart defaults and namespaces for modules.\\
-- Data can be saved in different data-types, depending on its intended usage.
-- The most common data-type is the `profile` type, which allows the user to choose
-- the active profile, and manage the profiles of all of his characters.\\
-- The following data types are available:
-- * **char** Character-specific data. Every character has its own database.
-- * **realm** Realm-specific data. All of the players characters on the same realm share this database.
-- * **class** Class-specific data. All of the players characters of the same class share this database.
-- * **race** Race-specific data. All of the players characters of the same race share this database.
-- * **faction** Faction-specific data. All of the players characters of the same faction share this database.
-- * **factionrealm** Faction and realm specific data. All of the players characters on the same realm and of the same faction share this database.
-- * **global** Global Data. All characters on the same account share this database.
-- * **profile** Profile-specific data. All characters using the same profile share this database. The user can control which profile should be used.
--
-- Creating a new Database using the `:New` function will return a new DBObject. A database will inherit all functions
-- of the DBObjectLib listed here. \\
-- If you create a new namespaced child-database (`:RegisterNamespace`), you'll get a DBObject as well, but note
-- that the child-databases cannot individually change their profile, and are linked to their parents profile - and because of that,
-- the profile related APIs are not available. Only `:RegisterDefaults` and `:ResetProfile` are available on child-databases.
--
-- For more details on how to use AceDB-3.0, see the [[AceDB-3.0 Tutorial]].
--
-- You may also be interested in [[libdualspec-1-0|LibDualSpec-1.0]] to do profile switching automatically when switching specs.
--
-- @usage
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("DBExample")
--
-- -- declare defaults to be used in the DB
-- local defaults = {
-- profile = {
-- setting = true,
-- }
-- }
--
-- function MyAddon:OnInitialize()
-- -- Assuming the .toc says ## SavedVariables: MyAddonDB
-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
-- end
-- @class file
-- @name AceDB-3.0.lua
-- @release $Id: AceDB-3.0.lua 940 2010-06-19 08:01:47Z nevcairiel $
local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 21
local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
 
if not AceDB then return end -- No upgrade needed
 
-- Lua APIs
local type, pairs, next, error = type, pairs, next, error
local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
 
-- WoW APIs
local _G = _G
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: LibStub
 
AceDB.db_registry = AceDB.db_registry or {}
AceDB.frame = AceDB.frame or CreateFrame("Frame")
 
local CallbackHandler
local CallbackDummy = { Fire = function() end }
 
local DBObjectLib = {}
 
--[[-------------------------------------------------------------------------
AceDB Utility Functions
---------------------------------------------------------------------------]]
 
-- Simple shallow copy for copying defaults
local function copyTable(src, dest)
if type(dest) ~= "table" then dest = {} end
if type(src) == "table" then
for k,v in pairs(src) do
if type(v) == "table" then
-- try to index the key first so that the metatable creates the defaults, if set, and use that table
v = copyTable(v, dest[k])
end
dest[k] = v
end
end
return dest
end
 
-- Called to add defaults to a section of the database
--
-- When a ["*"] default section is indexed with a new key, a table is returned
-- and set in the host table. These tables must be cleaned up by removeDefaults
-- in order to ensure we don't write empty default tables.
local function copyDefaults(dest, src)
-- this happens if some value in the SV overwrites our default value with a non-table
--if type(dest) ~= "table" then return end
for k, v in pairs(src) do
if k == "*" or k == "**" then
if type(v) == "table" then
-- This is a metatable used for table defaults
local mt = {
-- This handles the lookup and creation of new subtables
__index = function(t,k)
if k == nil then return nil end
local tbl = {}
copyDefaults(tbl, v)
rawset(t, k, tbl)
return tbl
end,
}
setmetatable(dest, mt)
-- handle already existing tables in the SV
for dk, dv in pairs(dest) do
if not rawget(src, dk) and type(dv) == "table" then
copyDefaults(dv, v)
end
end
else
-- Values are not tables, so this is just a simple return
local mt = {__index = function(t,k) return k~=nil and v or nil end}
setmetatable(dest, mt)
end
elseif type(v) == "table" then
if not rawget(dest, k) then rawset(dest, k, {}) end
if type(dest[k]) == "table" then
copyDefaults(dest[k], v)
if src['**'] then
copyDefaults(dest[k], src['**'])
end
end
else
if rawget(dest, k) == nil then
rawset(dest, k, v)
end
end
end
end
 
-- Called to remove all defaults in the default table from the database
local function removeDefaults(db, defaults, blocker)
-- remove all metatables from the db, so we don't accidentally create new sub-tables through them
setmetatable(db, nil)
-- loop through the defaults and remove their content
for k,v in pairs(defaults) do
if k == "*" or k == "**" then
if type(v) == "table" then
-- Loop through all the actual k,v pairs and remove
for key, value in pairs(db) do
if type(value) == "table" then
-- if the key was not explicitly specified in the defaults table, just strip everything from * and ** tables
if defaults[key] == nil and (not blocker or blocker[key] == nil) then
removeDefaults(value, v)
-- if the table is empty afterwards, remove it
if next(value) == nil then
db[key] = nil
end
-- if it was specified, only strip ** content, but block values which were set in the key table
elseif k == "**" then
removeDefaults(value, v, defaults[key])
end
end
end
elseif k == "*" then
-- check for non-table default
for key, value in pairs(db) do
if defaults[key] == nil and v == value then
db[key] = nil
end
end
end
elseif type(v) == "table" and type(db[k]) == "table" then
-- if a blocker was set, dive into it, to allow multi-level defaults
removeDefaults(db[k], v, blocker and blocker[k])
if next(db[k]) == nil then
db[k] = nil
end
else
-- check if the current value matches the default, and that its not blocked by another defaults table
if db[k] == defaults[k] and (not blocker or blocker[k] == nil) then
db[k] = nil
end
end
end
end
 
-- This is called when a table section is first accessed, to set up the defaults
local function initSection(db, section, svstore, key, defaults)
local sv = rawget(db, "sv")
 
local tableCreated
if not sv[svstore] then sv[svstore] = {} end
if not sv[svstore][key] then
sv[svstore][key] = {}
tableCreated = true
end
 
local tbl = sv[svstore][key]
 
if defaults then
copyDefaults(tbl, defaults)
end
rawset(db, section, tbl)
 
return tableCreated, tbl
end
 
-- Metatable to handle the dynamic creation of sections and copying of sections.
local dbmt = {
__index = function(t, section)
local keys = rawget(t, "keys")
local key = keys[section]
if key then
local defaultTbl = rawget(t, "defaults")
local defaults = defaultTbl and defaultTbl[section]
 
if section == "profile" then
local new = initSection(t, section, "profiles", key, defaults)
if new then
-- Callback: OnNewProfile, database, newProfileKey
t.callbacks:Fire("OnNewProfile", t, key)
end
elseif section == "profiles" then
local sv = rawget(t, "sv")
if not sv.profiles then sv.profiles = {} end
rawset(t, "profiles", sv.profiles)
elseif section == "global" then
local sv = rawget(t, "sv")
if not sv.global then sv.global = {} end
if defaults then
copyDefaults(sv.global, defaults)
end
rawset(t, section, sv.global)
else
initSection(t, section, section, key, defaults)
end
end
 
return rawget(t, section)
end
}
 
local function validateDefaults(defaults, keyTbl, offset)
if not defaults then return end
offset = offset or 0
for k in pairs(defaults) do
if not keyTbl[k] or k == "profiles" then
error(("Usage: AceDBObject:RegisterDefaults(defaults): '%s' is not a valid datatype."):format(k), 3 + offset)
end
end
end
 
local preserve_keys = {
["callbacks"] = true,
["RegisterCallback"] = true,
["UnregisterCallback"] = true,
["UnregisterAllCallbacks"] = true,
["children"] = true,
}
 
local realmKey = GetRealmName()
local charKey = UnitName("player") .. " - " .. realmKey
local _, classKey = UnitClass("player")
local _, raceKey = UnitRace("player")
local factionKey = UnitFactionGroup("player")
local factionrealmKey = factionKey .. " - " .. realmKey
-- Actual database initialization function
local function initdb(sv, defaults, defaultProfile, olddb, parent)
-- Generate the database keys for each section
 
-- map "true" to our "Default" profile
if defaultProfile == true then defaultProfile = "Default" end
 
local profileKey
if not parent then
-- Make a container for profile keys
if not sv.profileKeys then sv.profileKeys = {} end
 
-- Try to get the profile selected from the char db
profileKey = sv.profileKeys[charKey] or defaultProfile or charKey
 
-- save the selected profile for later
sv.profileKeys[charKey] = profileKey
else
-- Use the profile of the parents DB
profileKey = parent.keys.profile or defaultProfile or charKey
 
-- clear the profileKeys in the DB, namespaces don't need to store them
sv.profileKeys = nil
end
 
-- This table contains keys that enable the dynamic creation
-- of each section of the table. The 'global' and 'profiles'
-- have a key of true, since they are handled in a special case
local keyTbl= {
["char"] = charKey,
["realm"] = realmKey,
["class"] = classKey,
["race"] = raceKey,
["faction"] = factionKey,
["factionrealm"] = factionrealmKey,
["profile"] = profileKey,
["global"] = true,
["profiles"] = true,
}
 
validateDefaults(defaults, keyTbl, 1)
 
-- This allows us to use this function to reset an entire database
-- Clear out the old database
if olddb then
for k,v in pairs(olddb) do if not preserve_keys[k] then olddb[k] = nil end end
end
 
-- Give this database the metatable so it initializes dynamically
local db = setmetatable(olddb or {}, dbmt)
 
if not rawget(db, "callbacks") then
-- try to load CallbackHandler-1.0 if it loaded after our library
if not CallbackHandler then CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0", true) end
db.callbacks = CallbackHandler and CallbackHandler:New(db) or CallbackDummy
end
 
-- Copy methods locally into the database object, to avoid hitting
-- the metatable when calling methods
 
if not parent then
for name, func in pairs(DBObjectLib) do
db[name] = func
end
else
-- hack this one in
db.RegisterDefaults = DBObjectLib.RegisterDefaults
db.ResetProfile = DBObjectLib.ResetProfile
end
 
-- Set some properties in the database object
db.profiles = sv.profiles
db.keys = keyTbl
db.sv = sv
--db.sv_name = name
db.defaults = defaults
db.parent = parent
 
-- store the DB in the registry
AceDB.db_registry[db] = true
 
return db
end
 
-- handle PLAYER_LOGOUT
-- strip all defaults from all databases
-- and cleans up empty sections
local function logoutHandler(frame, event)
if event == "PLAYER_LOGOUT" then
for db in pairs(AceDB.db_registry) do
db.callbacks:Fire("OnDatabaseShutdown", db)
db:RegisterDefaults(nil)
 
-- cleanup sections that are empty without defaults
local sv = rawget(db, "sv")
for section in pairs(db.keys) do
if rawget(sv, section) then
-- global is special, all other sections have sub-entrys
-- also don't delete empty profiles on main dbs, only on namespaces
if section ~= "global" and (section ~= "profiles" or rawget(db, "parent")) then
for key in pairs(sv[section]) do
if not next(sv[section][key]) then
sv[section][key] = nil
end
end
end
if not next(sv[section]) then
sv[section] = nil
end
end
end
end
end
end
 
AceDB.frame:RegisterEvent("PLAYER_LOGOUT")
AceDB.frame:SetScript("OnEvent", logoutHandler)
 
 
--[[-------------------------------------------------------------------------
AceDB Object Method Definitions
---------------------------------------------------------------------------]]
 
--- Sets the defaults table for the given database object by clearing any
-- that are currently set, and then setting the new defaults.
-- @param defaults A table of defaults for this database
function DBObjectLib:RegisterDefaults(defaults)
if defaults and type(defaults) ~= "table" then
error("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected.", 2)
end
 
validateDefaults(defaults, self.keys)
 
-- Remove any currently set defaults
if self.defaults then
for section,key in pairs(self.keys) do
if self.defaults[section] and rawget(self, section) then
removeDefaults(self[section], self.defaults[section])
end
end
end
 
-- Set the DBObject.defaults table
self.defaults = defaults
 
-- Copy in any defaults, only touching those sections already created
if defaults then
for section,key in pairs(self.keys) do
if defaults[section] and rawget(self, section) then
copyDefaults(self[section], defaults[section])
end
end
end
end
 
--- Changes the profile of the database and all of it's namespaces to the
-- supplied named profile
-- @param name The name of the profile to set as the current profile
function DBObjectLib:SetProfile(name)
if type(name) ~= "string" then
error("Usage: AceDBObject:SetProfile(name): 'name' - string expected.", 2)
end
 
-- changing to the same profile, dont do anything
if name == self.keys.profile then return end
 
local oldProfile = self.profile
local defaults = self.defaults and self.defaults.profile
 
-- Callback: OnProfileShutdown, database
self.callbacks:Fire("OnProfileShutdown", self)
 
if oldProfile and defaults then
-- Remove the defaults from the old profile
removeDefaults(oldProfile, defaults)
end
 
self.profile = nil
self.keys["profile"] = name
 
-- if the storage exists, save the new profile
-- this won't exist on namespaces.
if self.sv.profileKeys then
self.sv.profileKeys[charKey] = name
end
 
-- populate to child namespaces
if self.children then
for _, db in pairs(self.children) do
DBObjectLib.SetProfile(db, name)
end
end
 
-- Callback: OnProfileChanged, database, newProfileKey
self.callbacks:Fire("OnProfileChanged", self, name)
end
 
--- Returns a table with the names of the existing profiles in the database.
-- You can optionally supply a table to re-use for this purpose.
-- @param tbl A table to store the profile names in (optional)
function DBObjectLib:GetProfiles(tbl)
if tbl and type(tbl) ~= "table" then
error("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected.", 2)
end
 
-- Clear the container table
if tbl then
for k,v in pairs(tbl) do tbl[k] = nil end
else
tbl = {}
end
 
local curProfile = self.keys.profile
 
local i = 0
for profileKey in pairs(self.profiles) do
i = i + 1
tbl[i] = profileKey
if curProfile and profileKey == curProfile then curProfile = nil end
end
 
-- Add the current profile, if it hasn't been created yet
if curProfile then
i = i + 1
tbl[i] = curProfile
end
 
return tbl, i
end
 
--- Returns the current profile name used by the database
function DBObjectLib:GetCurrentProfile()
return self.keys.profile
end
 
--- Deletes a named profile. This profile must not be the active profile.
-- @param name The name of the profile to be deleted
-- @param silent If true, do not raise an error when the profile does not exist
function DBObjectLib:DeleteProfile(name, silent)
if type(name) ~= "string" then
error("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected.", 2)
end
 
if self.keys.profile == name then
error("Cannot delete the active profile in an AceDBObject.", 2)
end
 
if not rawget(self.profiles, name) and not silent then
error("Cannot delete profile '" .. name .. "'. It does not exist.", 2)
end
 
self.profiles[name] = nil
 
-- populate to child namespaces
if self.children then
for _, db in pairs(self.children) do
DBObjectLib.DeleteProfile(db, name, true)
end
end
 
-- Callback: OnProfileDeleted, database, profileKey
self.callbacks:Fire("OnProfileDeleted", self, name)
end
 
--- Copies a named profile into the current profile, overwriting any conflicting
-- settings.
-- @param name The name of the profile to be copied into the current profile
-- @param silent If true, do not raise an error when the profile does not exist
function DBObjectLib:CopyProfile(name, silent)
if type(name) ~= "string" then
error("Usage: AceDBObject:CopyProfile(name): 'name' - string expected.", 2)
end
 
if name == self.keys.profile then
error("Cannot have the same source and destination profiles.", 2)
end
 
if not rawget(self.profiles, name) and not silent then
error("Cannot copy profile '" .. name .. "'. It does not exist.", 2)
end
 
-- Reset the profile before copying
DBObjectLib.ResetProfile(self, nil, true)
 
local profile = self.profile
local source = self.profiles[name]
 
copyTable(source, profile)
 
-- populate to child namespaces
if self.children then
for _, db in pairs(self.children) do
DBObjectLib.CopyProfile(db, name, true)
end
end
 
-- Callback: OnProfileCopied, database, sourceProfileKey
self.callbacks:Fire("OnProfileCopied", self, name)
end
 
--- Resets the current profile to the default values (if specified).
-- @param noChildren if set to true, the reset will not be populated to the child namespaces of this DB object
-- @param noCallbacks if set to true, won't fire the OnProfileReset callback
function DBObjectLib:ResetProfile(noChildren, noCallbacks)
local profile = self.profile
 
for k,v in pairs(profile) do
profile[k] = nil
end
 
local defaults = self.defaults and self.defaults.profile
if defaults then
copyDefaults(profile, defaults)
end
 
-- populate to child namespaces
if self.children and not noChildren then
for _, db in pairs(self.children) do
DBObjectLib.ResetProfile(db, nil, noCallbacks)
end
end
 
-- Callback: OnProfileReset, database
if not noCallbacks then
self.callbacks:Fire("OnProfileReset", self)
end
end
 
--- Resets the entire database, using the string defaultProfile as the new default
-- profile.
-- @param defaultProfile The profile name to use as the default
function DBObjectLib:ResetDB(defaultProfile)
if defaultProfile and type(defaultProfile) ~= "string" then
error("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected.", 2)
end
 
local sv = self.sv
for k,v in pairs(sv) do
sv[k] = nil
end
 
local parent = self.parent
 
initdb(sv, self.defaults, defaultProfile, self)
 
-- fix the child namespaces
if self.children then
if not sv.namespaces then sv.namespaces = {} end
for name, db in pairs(self.children) do
if not sv.namespaces[name] then sv.namespaces[name] = {} end
initdb(sv.namespaces[name], db.defaults, self.keys.profile, db, self)
end
end
 
-- Callback: OnDatabaseReset, database
self.callbacks:Fire("OnDatabaseReset", self)
-- Callback: OnProfileChanged, database, profileKey
self.callbacks:Fire("OnProfileChanged", self, self.keys["profile"])
 
return self
end
 
--- Creates a new database namespace, directly tied to the database. This
-- is a full scale database in it's own rights other than the fact that
-- it cannot control its profile individually
-- @param name The name of the new namespace
-- @param defaults A table of values to use as defaults
function DBObjectLib:RegisterNamespace(name, defaults)
if type(name) ~= "string" then
error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected.", 2)
end
if defaults and type(defaults) ~= "table" then
error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected.", 2)
end
if self.children and self.children[name] then
error ("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace with that name already exists.", 2)
end
 
local sv = self.sv
if not sv.namespaces then sv.namespaces = {} end
if not sv.namespaces[name] then
sv.namespaces[name] = {}
end
 
local newDB = initdb(sv.namespaces[name], defaults, self.keys.profile, nil, self)
 
if not self.children then self.children = {} end
self.children[name] = newDB
return newDB
end
 
--- Returns an already existing namespace from the database object.
-- @param name The name of the new namespace
-- @param silent if true, the addon is optional, silently return nil if its not found
-- @usage
-- local namespace = self.db:GetNamespace('namespace')
-- @return the namespace object if found
function DBObjectLib:GetNamespace(name, silent)
if type(name) ~= "string" then
error("Usage: AceDBObject:GetNamespace(name): 'name' - string expected.", 2)
end
if not silent and not (self.children and self.children[name]) then
error ("Usage: AceDBObject:GetNamespace(name): 'name' - namespace does not exist.", 2)
end
if not self.children then self.children = {} end
return self.children[name]
end
 
--[[-------------------------------------------------------------------------
AceDB Exposed Methods
---------------------------------------------------------------------------]]
 
--- Creates a new database object that can be used to handle database settings and profiles.
-- By default, an empty DB is created, using a character specific profile.
--
-- You can override the default profile used by passing any profile name as the third argument,
-- or by passing //true// as the third argument to use a globally shared profile called "Default".
--
-- Note that there is no token replacement in the default profile name, passing a defaultProfile as "char"
-- will use a profile named "char", and not a character-specific profile.
-- @param tbl The name of variable, or table to use for the database
-- @param defaults A table of database defaults
-- @param defaultProfile The name of the default profile. If not set, a character specific profile will be used as the default.
-- You can also pass //true// to use a shared global profile called "Default".
-- @usage
-- -- Create an empty DB using a character-specific default profile.
-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB")
-- @usage
-- -- Create a DB using defaults and using a shared default profile
-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
function AceDB:New(tbl, defaults, defaultProfile)
if type(tbl) == "string" then
local name = tbl
tbl = _G[name]
if not tbl then
tbl = {}
_G[name] = tbl
end
end
 
if type(tbl) ~= "table" then
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected.", 2)
end
 
if defaults and type(defaults) ~= "table" then
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected.", 2)
end
 
if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected.", 2)
end
 
return initdb(tbl, defaults, defaultProfile)
end
 
-- upgrade existing databases
for db in pairs(AceDB.db_registry) do
if not db.parent then
for name,func in pairs(DBObjectLib) do
db[name] = func
end
else
db.RegisterDefaults = DBObjectLib.RegisterDefaults
db.ResetProfile = DBObjectLib.ResetProfile
end
end
RecipeRadar/libs/LibBabble-Faction-3.0/LibBabble-3.0.lua New file
0,0 → 1,292
-- LibBabble-3.0 is hereby placed in the Public Domain
-- Credits: ckknight
local LIBBABBLE_MAJOR, LIBBABBLE_MINOR = "LibBabble-3.0", 2
 
local LibBabble = LibStub:NewLibrary(LIBBABBLE_MAJOR, LIBBABBLE_MINOR)
if not LibBabble then
return
end
 
local data = LibBabble.data or {}
for k,v in pairs(LibBabble) do
LibBabble[k] = nil
end
LibBabble.data = data
 
local tablesToDB = {}
for namespace, db in pairs(data) do
for k,v in pairs(db) do
tablesToDB[v] = db
end
end
 
local function warn(message)
local _, ret = pcall(error, message, 3)
geterrorhandler()(ret)
end
 
local lookup_mt = { __index = function(self, key)
local db = tablesToDB[self]
local current_key = db.current[key]
if current_key then
self[key] = current_key
return current_key
end
local base_key = db.base[key]
local real_MAJOR_VERSION
for k,v in pairs(data) do
if v == db then
real_MAJOR_VERSION = k
break
end
end
if not real_MAJOR_VERSION then
real_MAJOR_VERSION = LIBBABBLE_MAJOR
end
if base_key then
warn(("%s: Translation %q not found for locale %q"):format(real_MAJOR_VERSION, key, GetLocale()))
rawset(self, key, base_key)
return base_key
end
warn(("%s: Translation %q not found."):format(real_MAJOR_VERSION, key))
rawset(self, key, key)
return key
end }
 
local function initLookup(module, lookup)
local db = tablesToDB[module]
for k in pairs(lookup) do
lookup[k] = nil
end
setmetatable(lookup, lookup_mt)
tablesToDB[lookup] = db
db.lookup = lookup
return lookup
end
 
local function initReverse(module, reverse)
local db = tablesToDB[module]
for k in pairs(reverse) do
reverse[k] = nil
end
for k,v in pairs(db.current) do
reverse[v] = k
end
tablesToDB[reverse] = db
db.reverse = reverse
db.reverseIterators = nil
return reverse
end
 
local prototype = {}
local prototype_mt = {__index = prototype}
 
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will warn but allow the code to pass through.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BL = B:GetLookupTable()
assert(BL["Some english word"] == "Some localized word")
DoSomething(BL["Some english word that doesn't exist"]) -- warning!
-----------------------------------------------------------------------------]]
function prototype:GetLookupTable()
local db = tablesToDB[self]
 
local lookup = db.lookup
if lookup then
return lookup
end
return initLookup(self, {})
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_has = B:GetUnstrictLookupTable()
assert(B_has["Some english word"] == "Some localized word")
assert(B_has["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetUnstrictLookupTable()
local db = tablesToDB[self]
 
return db.current
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This is useful for checking if the base (English) table has a key, even if the localized one does not have it registered.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_hasBase = B:GetBaseLookupTable()
assert(B_hasBase["Some english word"] == "Some english word")
assert(B_hasBase["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetBaseLookupTable()
local db = tablesToDB[self]
 
return db.base
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This will return only one English word that it maps to, if there are more than one to check, see :GetReverseIterator("word")
Returns:
A lookup table for localized to english words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BR = B:GetReverseLookupTable()
assert(BR["Some localized word"] == "Some english word")
assert(BR["Some localized word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetReverseLookupTable()
local db = tablesToDB[self]
 
local reverse = db.reverse
if reverse then
return reverse
end
return initReverse(self, {})
end
local blank = {}
local weakVal = {__mode='v'}
--[[---------------------------------------------------------------------------
Arguments:
string - the localized word to chek for.
Returns:
An iterator to traverse all English words that map to the given key
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for word in B:GetReverseIterator("Some localized word") do
DoSomething(word)
end
-----------------------------------------------------------------------------]]
function prototype:GetReverseIterator(key)
local db = tablesToDB[self]
local reverseIterators = db.reverseIterators
if not reverseIterators then
reverseIterators = setmetatable({}, weakVal)
db.reverseIterators = reverseIterators
elseif reverseIterators[key] then
return pairs(reverseIterators[key])
end
local t
for k,v in pairs(db.current) do
if v == key then
if not t then
t = {}
end
t[k] = true
end
end
reverseIterators[key] = t or blank
return pairs(reverseIterators[key])
end
--[[---------------------------------------------------------------------------
Returns:
An iterator to traverse all translations English to localized.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for english, localized in B:Iterate() do
DoSomething(english, localized)
end
-----------------------------------------------------------------------------]]
function prototype:Iterate()
local db = tablesToDB[self]
 
return pairs(db.current)
end
 
-- #NODOC
-- modules need to call this to set the base table
function prototype:SetBaseTranslations(base)
local db = tablesToDB[self]
local oldBase = db.base
if oldBase then
for k in pairs(oldBase) do
oldBase[k] = nil
end
for k, v in pairs(base) do
oldBase[k] = v
end
base = oldBase
else
db.base = base
end
for k,v in pairs(base) do
if v == true then
base[k] = k
end
end
end
 
local function init(module)
local db = tablesToDB[module]
if db.lookup then
initLookup(module, db.lookup)
end
if db.reverse then
initReverse(module, db.reverse)
end
db.reverseIterators = nil
end
 
-- #NODOC
-- modules need to call this to set the current table. if current is true, use the base table.
function prototype:SetCurrentTranslations(current)
local db = tablesToDB[self]
if current == true then
db.current = db.base
else
local oldCurrent = db.current
if oldCurrent then
for k in pairs(oldCurrent) do
oldCurrent[k] = nil
end
for k, v in pairs(current) do
oldCurrent[k] = v
end
current = oldCurrent
else
db.current = current
end
end
init(self)
end
 
for namespace, db in pairs(data) do
setmetatable(db.module, prototype_mt)
init(db.module)
end
 
-- #NODOC
-- modules need to call this to create a new namespace.
function LibBabble:New(namespace, minor)
local module, oldminor = LibStub:NewLibrary(namespace, minor)
if not module then
return
end
 
if not oldminor then
local db = {
module = module,
}
data[namespace] = db
tablesToDB[module] = db
else
for k,v in pairs(module) do
module[k] = nil
end
end
 
setmetatable(module, prototype_mt)
 
return module
end
RecipeRadar/libs/LibBabble-Faction-3.0/LibBabble-Faction-3.0.lua New file
0,0 → 1,900
--[[
Name: LibBabble-Faction-3.0
Revision: $Rev: 142 $
Maintainers: ckknight, nevcairiel, Ackis
Website: http://www.wowace.com/projects/libbabble-faction-3-0/
Dependencies: None
License: MIT
]]
 
local MAJOR_VERSION = "LibBabble-Faction-3.0"
local MINOR_VERSION = 90000 + tonumber(("$Rev: 143 $"):match("%d+"))
 
if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
local lib = LibStub("LibBabble-3.0"):New(MAJOR_VERSION, MINOR_VERSION)
if not lib then return end
 
local GAME_LOCALE = GetLocale()
 
lib:SetBaseTranslations {
Alliance = "Alliance",
["Alliance Vanguard"] = "Alliance Vanguard",
["Argent Crusade"] = "Argent Crusade",
["Argent Dawn"] = "Argent Dawn",
["Ashtongue Deathsworn"] = "Ashtongue Deathsworn",
["Avengers of Hyjal"] = "Avengers of Hyjal",
["Baradin's Wardens"] = "Baradin's Wardens",
["Bilgewater Cartel"] = "Bilgewater Cartel",
["Bloodsail Buccaneers"] = "Bloodsail Buccaneers",
["Booty Bay"] = "Booty Bay",
["Brood of Nozdormu"] = "Brood of Nozdormu",
["Cenarion Circle"] = "Cenarion Circle",
["Cenarion Expedition"] = "Cenarion Expedition",
["Darkmoon Faire"] = "Darkmoon Faire",
["Darkspear Trolls"] = "Darkspear Trolls",
Darnassus = "Darnassus",
["Dragonmaw Clan"] = "Dragonmaw Clan",
Everlook = "Everlook",
Exalted = "Exalted",
Exodar = "Exodar",
["Explorers' League"] = "Explorers' League",
["Frenzyheart Tribe"] = "Frenzyheart Tribe",
Friendly = "Friendly",
["Frostwolf Clan"] = "Frostwolf Clan",
Gadgetzan = "Gadgetzan",
["Gelkis Clan Centaur"] = "Gelkis Clan Centaur",
Gilneas = "Gilneas",
Gnomeregan = "Gnomeregan",
["Gnomeregan Exiles"] = "Gnomeregan Exiles",
["Guardians of Hyjal"] = "Guardians of Hyjal",
Guild = "Guild",
["Hellscream's Reach"] = "Hellscream's Reach",
["Honor Hold"] = "Honor Hold",
Honored = "Honored",
Horde = "Horde",
["Horde Expedition"] = "Horde Expedition",
["Hydraxian Waterlords"] = "Hydraxian Waterlords",
Ironforge = "Ironforge",
["Keepers of Time"] = "Keepers of Time",
["Kirin Tor"] = "Kirin Tor",
["Knights of the Ebon Blade"] = "Knights of the Ebon Blade",
Kurenai = "Kurenai",
["Lower City"] = "Lower City",
["Magram Clan Centaur"] = "Magram Clan Centaur",
Netherwing = "Netherwing",
Neutral = "Neutral",
["Ogri'la"] = "Ogri'la",
Orgrimmar = "Orgrimmar",
Ramkahen = "Ramkahen",
Ratchet = "Ratchet",
Ravenholdt = "Ravenholdt",
Revered = "Revered",
["Sha'tari Skyguard"] = "Sha'tari Skyguard",
["Shattered Sun Offensive"] = "Shattered Sun Offensive",
["Shen'dralar"] = "Shen'dralar",
["Silvermoon City"] = "Silvermoon City",
["Silverwing Sentinels"] = "Silverwing Sentinels",
Sporeggar = "Sporeggar",
["Stormpike Guard"] = "Stormpike Guard",
Stormwind = "Stormwind",
Syndicate = "Syndicate",
["The Aldor"] = "The Aldor",
["The Ashen Verdict"] = "The Ashen Verdict",
["The Consortium"] = "The Consortium",
["The Defilers"] = "The Defilers",
["The Earthen Ring"] = "The Earthen Ring",
["The Frostborn"] = "The Frostborn",
["The Hand of Vengeance"] = "The Hand of Vengeance",
["The Kalu'ak"] = "The Kalu'ak",
["The League of Arathor"] = "The League of Arathor",
["The Mag'har"] = "The Mag'har",
["The Oracles"] = "The Oracles",
["The Scale of the Sands"] = "The Scale of the Sands",
["The Scryers"] = "The Scryers",
["The Sha'tar"] = "The Sha'tar",
["The Silver Covenant"] = "The Silver Covenant",
["The Sons of Hodir"] = "The Sons of Hodir",
["The Sunreavers"] = "The Sunreavers",
["The Taunka"] = "The Taunka",
["The Violet Eye"] = "The Violet Eye",
["The Wyrmrest Accord"] = "The Wyrmrest Accord",
Therazane = "Therazane",
["Thorium Brotherhood"] = "Thorium Brotherhood",
Thrallmar = "Thrallmar",
["Thunder Bluff"] = "Thunder Bluff",
["Timbermaw Hold"] = "Timbermaw Hold",
Tranquillien = "Tranquillien",
Undercity = "Undercity",
["Valiance Expedition"] = "Valiance Expedition",
["Warsong Offensive"] = "Warsong Offensive",
["Warsong Outriders"] = "Warsong Outriders",
["Wildhammer Clan"] = "Wildhammer Clan",
["Winterfin Retreat"] = "Winterfin Retreat",
["Wintersaber Trainers"] = "Wintersaber Trainers",
["Zandalar Tribe"] = "Zandalar Tribe",
}
 
 
if GAME_LOCALE == "enUS" then
lib:SetCurrentTranslations(true)
elseif GAME_LOCALE == "deDE" then
lib:SetCurrentTranslations {
Alliance = "Allianz",
["Alliance Vanguard"] = "Vorposten der Allianz",
["Argent Crusade"] = "Argentumkreuzzug",
["Argent Dawn"] = "Argentumdämmerung",
["Ashtongue Deathsworn"] = "Die Todeshörigen",
["Avengers of Hyjal"] = "Rächer des Hyjal",
["Baradin's Wardens"] = "Wächter von Baradin",
["Bilgewater Cartel"] = "Bilgewasserkartell",
["Bloodsail Buccaneers"] = "Blutsegelbukaniere",
["Booty Bay"] = "Beutebucht",
["Brood of Nozdormu"] = "Brut Nozdormus",
["Cenarion Circle"] = "Zirkel des Cenarius",
["Cenarion Expedition"] = "Expedition des Cenarius",
["Darkmoon Faire"] = "Dunkelmond-Jahrmarkt",
["Darkspear Trolls"] = "Dunkelspeertrolle",
Darnassus = "Darnassus",
["Dragonmaw Clan"] = "Drachenmalklan",
Everlook = "Ewige Warte",
Exalted = "Ehrfürchtig",
Exodar = "Die Exodar",
["Explorers' League"] = "Forscherliga",
["Frenzyheart Tribe"] = "Stamm der Wildherzen",
Friendly = "Freundlich",
["Frostwolf Clan"] = "Frostwolfklan",
Gadgetzan = "Gadgetzan",
["Gelkis Clan Centaur"] = "Gelkisklan",
Gilneas = "Gilneas",
Gnomeregan = "Gnomeregan",
["Gnomeregan Exiles"] = "Gnomeregangnome",
["Guardians of Hyjal"] = "Wächter des Hyjal",
["Hellscream's Reach"] = "Höllschreis Hand",
["Honor Hold"] = "Ehrenfeste",
Honored = "Wohlwollend",
Horde = "Horde",
["Horde Expedition"] = "Expedition der Horde",
["Hydraxian Waterlords"] = "Hydraxianer",
Ironforge = "Eisenschmiede",
["Keepers of Time"] = "Hüter der Zeit",
["Kirin Tor"] = "Kirin Tor",
["Knights of the Ebon Blade"] = "Ritter der Schwarzen Klinge",
Kurenai = "Kurenai",
["Lower City"] = "Unteres Viertel",
["Magram Clan Centaur"] = "Magramklan",
Netherwing = "Netherschwingen",
Neutral = "Neutral",
["Ogri'la"] = "Ogri'la",
Orgrimmar = "Orgrimmar",
Ramkahen = "Ramkahen",
Ratchet = "Ratschet",
Ravenholdt = "Rabenholdt",
Revered = "Respektvoll",
["Sha'tari Skyguard"] = "Himmelswache der Sha'tari",
["Shattered Sun Offensive"] = "Offensive der Zerschmetterten Sonne",
["Shen'dralar"] = "Shen'dralar",
["Silvermoon City"] = "Silbermond",
["Silverwing Sentinels"] = "Silberschwingen",
Sporeggar = "Sporeggar",
["Stormpike Guard"] = "Sturmlanzengarde",
Stormwind = "Sturmwind",
Syndicate = "Syndikat",
["The Aldor"] = "Die Aldor",
["The Ashen Verdict"] = "Das Äscherne Verdikt",
["The Consortium"] = "Das Konsortium",
["The Defilers"] = "Die Entweihten",
["The Earthen Ring"] = "Der Irdene Ring",
["The Frostborn"] = "Die Frosterben",
["The Hand of Vengeance"] = "Die Hand der Rache",
["The Kalu'ak"] = "Die Kalu'ak",
["The League of Arathor"] = "Der Bund von Arathor",
["The Mag'har"] = "Die Mag'har",
["The Oracles"] = "Die Orakel",
["The Scale of the Sands"] = "Die Wächter der Sande",
["The Scryers"] = "Die Seher",
["The Sha'tar"] = "Die Sha'tar",
["The Silver Covenant"] = "Der Silberbund",
["The Sons of Hodir"] = "Die Söhne Hodirs",
["The Sunreavers"] = "Die Sonnenhäscher",
["The Taunka"] = "Die Taunka",
["The Violet Eye"] = "Das Violette Auge",
["The Wyrmrest Accord"] = "Der Wyrmruhpakt",
Therazane = "Therazane",
["Thorium Brotherhood"] = "Thoriumbruderschaft",
Thrallmar = "Thrallmar",
["Thunder Bluff"] = "Donnerfels",
["Timbermaw Hold"] = "Holzschlundfeste",
Tranquillien = "Tristessa",
Undercity = "Unterstadt",
["Valiance Expedition"] = "Expedition Valianz",
["Warsong Offensive"] = "Kriegshymnenoffensive",
["Warsong Outriders"] = "Vorhut des Kriegshymnenklan",
["Wildhammer Clan"] = "Wildhammerklan",
["Winterfin Retreat"] = "Zuflucht der Winterflossen",
["Wintersaber Trainers"] = "Wintersäblerausbilder",
["Zandalar Tribe"] = "Stamm der Zandalari",
}
elseif GAME_LOCALE == "frFR" then
lib:SetCurrentTranslations {
Alliance = "Alliance",
["Alliance Vanguard"] = "Avant-garde de l'Alliance",
["Argent Crusade"] = "La Croisade d'argent",
["Argent Dawn"] = "Aube d'argent",
["Ashtongue Deathsworn"] = "Ligemort cendrelangue",
["Avengers of Hyjal"] = "Vengeurs d’Hyjal", -- Needs review
["Baradin's Wardens"] = "Gardiens de Baradin",
["Bilgewater Cartel"] = "Cartel Baille-fonds",
["Bloodsail Buccaneers"] = "La Voile sanglante",
["Booty Bay"] = "Baie-du-Butin",
["Brood of Nozdormu"] = "Progéniture de Nozdormu",
["Cenarion Circle"] = "Cercle cénarien",
["Cenarion Expedition"] = "Expédition cénarienne",
["Darkmoon Faire"] = "Foire de Sombrelune",
["Darkspear Trolls"] = "Trolls Sombrelance",
Darnassus = "Darnassus",
["Dragonmaw Clan"] = "Clan Gueule-de-dragon",
Everlook = "Long-guet",
Exalted = "Exalté",
Exodar = "Exodar",
["Explorers' League"] = "Ligue des explorateurs",
["Frenzyheart Tribe"] = "La tribu Frénécœur",
Friendly = "Amical",
["Frostwolf Clan"] = "Clan Loup-de-givre",
Gadgetzan = "Gadgetzan",
["Gelkis Clan Centaur"] = "Centaures (Gelkis)",
Gilneas = "Gilnéas",
Gnomeregan = "Gnomeregan",
["Gnomeregan Exiles"] = "Exilés de Gnomeregan",
["Guardians of Hyjal"] = "Gardiens d'Hyjal",
["Hellscream's Reach"] = "Poing de Hurlenfer",
["Honor Hold"] = "Bastion de l'Honneur",
Honored = "Honoré",
Horde = "Horde",
["Horde Expedition"] = "Expédition de la Horde",
["Hydraxian Waterlords"] = "Les Hydraxiens",
Ironforge = "Forgefer",
["Keepers of Time"] = "Gardiens du Temps",
["Kirin Tor"] = "Kirin Tor",
["Knights of the Ebon Blade"] = "Chevaliers de la Lame d'ébène",
Kurenai = "Kurenaï",
["Lower City"] = "Ville basse",
["Magram Clan Centaur"] = "Centaures (Magram)",
Netherwing = "Aile-du-Néant",
Neutral = "Neutre",
["Ogri'la"] = "Ogri'la",
Orgrimmar = "Orgrimmar",
Ramkahen = "Ramkahen",
Ratchet = "Cabestan",
Ravenholdt = "Ravenholdt",
Revered = "Révéré",
["Sha'tari Skyguard"] = "Garde-ciel sha'tari",
["Shattered Sun Offensive"] = "Opération Soleil brisé",
["Shen'dralar"] = "Shen'dralar",
["Silvermoon City"] = "Lune-d'argent",
["Silverwing Sentinels"] = "Sentinelles d'Aile-argent",
Sporeggar = "Sporeggar",
["Stormpike Guard"] = "Garde Foudrepique",
Stormwind = "Hurlevent",
Syndicate = "Syndicat",
["The Aldor"] = "L'Aldor",
["The Ashen Verdict"] = "Le Verdict des cendres",
["The Consortium"] = "Le Consortium",
["The Defilers"] = "Les Profanateurs",
["The Earthen Ring"] = "Le Cercle terrestre",
["The Frostborn"] = "Les Givre-nés",
["The Hand of Vengeance"] = "La Main de la vengeance",
["The Kalu'ak"] = "Les Kalu'aks",
["The League of Arathor"] = "La Ligue d'Arathor",
["The Mag'har"] = "Les Mag'har",
["The Oracles"] = "Les Oracles",
["The Scale of the Sands"] = "La Balance des sables",
["The Scryers"] = "Les Clairvoyants",
["The Sha'tar"] = "Les Sha'tar",
["The Silver Covenant"] = "Le Concordat argenté",
["The Sons of Hodir"] = "Les Fils de Hodir",
["The Sunreavers"] = "Les Saccage-soleil",
["The Taunka"] = "Les Taunkas",
["The Violet Eye"] = "L'Œil pourpre",
["The Wyrmrest Accord"] = "L'Accord du Repos du ver",
Therazane = "Therazane",
["Thorium Brotherhood"] = "Confrérie du thorium",
Thrallmar = "Thrallmar",
["Thunder Bluff"] = "Les Pitons du Tonnerre",
["Timbermaw Hold"] = "Les Grumegueules",
Tranquillien = "Tranquillien",
Undercity = "Fossoyeuse",
["Valiance Expedition"] = "Expédition de la Bravoure",
["Warsong Offensive"] = "Offensive chanteguerre",
["Warsong Outriders"] = "Voltigeurs Chanteguerre",
["Wildhammer Clan"] = "Clan Marteau-hardi",
["Winterfin Retreat"] = "Retraite des Ailerons-d'hiver",
["Wintersaber Trainers"] = "Éleveurs de sabres-d'hiver",
["Zandalar Tribe"] = "Tribu Zandalar",
}
elseif GAME_LOCALE == "koKR" then
lib:SetCurrentTranslations {
Alliance = "얼라이언스",
["Alliance Vanguard"] = "얼라이언스 선봉대",
["Argent Crusade"] = "은빛십자군",
["Argent Dawn"] = "은빛 여명회",
["Ashtongue Deathsworn"] = "잿빛혓바닥 결사단",
["Avengers of Hyjal"] = "하이잘의 복수자",
["Baradin's Wardens"] = "바라딘 집행단",
["Bilgewater Cartel"] = "빌지워터 무역회사",
["Bloodsail Buccaneers"] = "붉은 해적단",
["Booty Bay"] = "무법항",
["Brood of Nozdormu"] = "노즈도르무 혈족",
["Cenarion Circle"] = "세나리온 의회",
["Cenarion Expedition"] = "세나리온 원정대",
["Darkmoon Faire"] = "다크문 유랑단",
["Darkspear Trolls"] = "검은창 트롤",
Darnassus = "다르나서스",
["Dragonmaw Clan"] = "용아귀 부족",
Everlook = "눈망루 마을",
Exalted = "확고한 동맹",
Exodar = "엑소다르",
["Explorers' League"] = "탐험가 연맹",
["Frenzyheart Tribe"] = "광란심장 일족",
Friendly = "약간 우호적",
["Frostwolf Clan"] = "서리늑대 부족",
Gadgetzan = "가젯잔",
["Gelkis Clan Centaur"] = "겔키스 부족 켄타로우스",
Gilneas = "길니아스",
Gnomeregan = "놈리건",
["Gnomeregan Exiles"] = "놈리건",
["Guardians of Hyjal"] = "하이잘의 수호자",
["Hellscream's Reach"] = "헬스크림 세력단",
["Honor Hold"] = "명예의 요새",
Honored = "우호적",
Horde = "호드",
["Horde Expedition"] = "호드 원정대",
["Hydraxian Waterlords"] = "히드락시안 물의 군주",
Ironforge = "아이언포지",
["Keepers of Time"] = "시간의 수호자",
["Kirin Tor"] = "키린 토",
["Knights of the Ebon Blade"] = "칠흑의 기사단",
Kurenai = "쿠레나이",
["Lower City"] = "고난의 거리",
["Magram Clan Centaur"] = "마그람 부족 켄타로우스",
Netherwing = "황천의 용군단",
Neutral = "중립적",
["Ogri'la"] = "오그릴라",
Orgrimmar = "오그리마",
Ramkahen = "람카헨",
Ratchet = "톱니항",
Ravenholdt = "라벤홀트",
Revered = "매우 우호적",
["Sha'tari Skyguard"] = "샤타리 하늘경비대",
["Shattered Sun Offensive"] = "무너진 태양 공격대",
["Shen'dralar"] = "센드렐라",
["Silvermoon City"] = "실버문",
["Silverwing Sentinels"] = "은빛날개 파수대",
Sporeggar = "스포어가르",
["Stormpike Guard"] = "스톰파이크 경비대",
Stormwind = "스톰윈드",
Syndicate = "비밀결사대",
["The Aldor"] = "알도르 사제회",
["The Ashen Verdict"] = "잿빛 선고단",
["The Consortium"] = "무역연합",
["The Defilers"] = "포세이큰 파멸단",
["The Earthen Ring"] = "대지 고리회",
["The Frostborn"] = "서릿결부족 드워프",
["The Hand of Vengeance"] = "복수의 대리인",
["The Kalu'ak"] = "칼루아크",
["The League of Arathor"] = "아라소르 연맹",
["The Mag'har"] = "마그하르",
["The Oracles"] = "점쟁이 조합",
["The Scale of the Sands"] = "시간의 중재자",
["The Scryers"] = "점술가 길드",
["The Sha'tar"] = "샤타르",
["The Silver Covenant"] = "은빛 서약단",
["The Sons of Hodir"] = "호디르의 후예",
["The Sunreavers"] = "선리버",
["The Taunka"] = "타운카",
["The Violet Eye"] = "보랏빛 눈의 감시자",
["The Wyrmrest Accord"] = "고룡쉼터 사원 용군단",
Therazane = "테라제인",
["Thorium Brotherhood"] = "토륨 대장조합 ",
Thrallmar = "스랄마",
["Thunder Bluff"] = "썬더 블러프",
["Timbermaw Hold"] = "나무구렁 요새",
Tranquillien = "트랜퀼리엔",
Undercity = "언더시티",
["Valiance Expedition"] = "용맹의 원정대",
["Warsong Offensive"] = "전쟁노래 공격대",
["Warsong Outriders"] = "전쟁노래 정찰대",
["Wildhammer Clan"] = "와일드해머 부족",
["Winterfin Retreat"] = "겨울지느러미 은신처",
["Wintersaber Trainers"] = "눈호랑이 조련사",
["Zandalar Tribe"] = "잔달라 부족",
}
elseif GAME_LOCALE == "esES" then
lib:SetCurrentTranslations {
Alliance = "Alianza",
["Alliance Vanguard"] = "Vanguardia de la Alianza",
["Argent Crusade"] = "Cruzada Argenta",
["Argent Dawn"] = "El Alba Argenta",
["Ashtongue Deathsworn"] = "Juramorte Lengua de ceniza",
["Avengers of Hyjal"] = "Vengadores de Hyjal", -- Needs review
["Baradin's Wardens"] = "Celadores de Baradin",
["Bilgewater Cartel"] = "Cártel Pantoque",
["Bloodsail Buccaneers"] = "Bucaneros Velasangre",
["Booty Bay"] = "Bahía del Botín",
["Brood of Nozdormu"] = "Linaje de Nozdormu",
["Cenarion Circle"] = "Círculo Cenarion",
["Cenarion Expedition"] = "Expedición Cenarion",
["Darkmoon Faire"] = "Feria de la Luna Negra",
["Darkspear Trolls"] = "Trols Lanza Negra",
Darnassus = "Darnassus",
["Dragonmaw Clan"] = "Clan Faucedraco",
Everlook = "Vista Eterna",
Exalted = "Exaltado",
Exodar = "El Exodar",
["Explorers' League"] = "Liga de Expedicionarios",
["Frenzyheart Tribe"] = "Tribu Corazón Frenético",
Friendly = "Amistoso",
["Frostwolf Clan"] = "Clan Lobo Gélido",
Gadgetzan = "Gadgetzan",
["Gelkis Clan Centaur"] = "Centauros del clan Gelkis",
Gilneas = "Gilneas",
Gnomeregan = "Gnomeran",
["Gnomeregan Exiles"] = "Exiliados de Gnomeregan",
["Guardians of Hyjal"] = "Guardianes de Hyjal",
["Hellscream's Reach"] = "Mando Grito Infernal",
["Honor Hold"] = "Bastión del Honor",
Honored = "Honorable",
Horde = "Horda",
["Horde Expedition"] = "Expedición de la Horda",
["Hydraxian Waterlords"] = "Srs. del Agua de Hydraxis",
Ironforge = "Forjaz",
["Keepers of Time"] = "Vigilantes del Tiempo",
["Kirin Tor"] = "Kirin Tor",
["Knights of the Ebon Blade"] = "Caballeros de la Espada de Ébano",
Kurenai = "Kurenai",
["Lower City"] = "Bajo Arrabal",
["Magram Clan Centaur"] = "Centauros del clan Magram",
Netherwing = "Ala Abisal",
Neutral = "Neutral",
["Ogri'la"] = "Ogri'la",
Orgrimmar = "Orgrimmar",
Ramkahen = "Ramkahen",
Ratchet = "Trinquete",
Ravenholdt = "Ravenholdt",
Revered = "Reverenciado",
["Sha'tari Skyguard"] = "Guardia del cielo Sha'tari",
["Shattered Sun Offensive"] = "Ofensiva Sol Devastado",
["Shen'dralar"] = "Shen'dralar",
["Silvermoon City"] = "Ciudad de Lunargenta",
["Silverwing Sentinels"] = "Centinelas Ala de Plata",
Sporeggar = "Esporaggar",
["Stormpike Guard"] = "Guardia Pico Tormenta",
Stormwind = "Ventormenta",
Syndicate = "La Hermandad",
["The Aldor"] = "Los Aldor",
["The Ashen Verdict"] = "El Veredicto Cinéreo",
["The Consortium"] = "El Consorcio",
["The Defilers"] = "Los Rapiñadores",
["The Earthen Ring"] = "Anillo de la Tierra",
["The Frostborn"] = "Los Natoescarcha",
["The Hand of Vengeance"] = "La Mano de la Venganza",
["The Kalu'ak"] = "Los Kalu'ak",
["The League of Arathor"] = "Liga de Arathor",
["The Mag'har"] = "Los Mag'har",
["The Oracles"] = "Los Oráculos",
["The Scale of the Sands"] = "La Escama de las Arenas",
["The Scryers"] = "Los Arúspices",
["The Sha'tar"] = "Los Sha'tar",
["The Silver Covenant"] = "El Pacto de Plata",
["The Sons of Hodir"] = "Los Hijos de Hodir",
["The Sunreavers"] = "Los Atracasol",
["The Taunka"] = "Los Taunka",
["The Violet Eye"] = "El Ojo Violeta",
["The Wyrmrest Accord"] = "El Acuerdo del Reposo del Dragón",
Therazane = "Therazane",
["Thorium Brotherhood"] = "Hermandad del Torio",
Thrallmar = "Thrallmar",
["Thunder Bluff"] = "Cima del Trueno",
["Timbermaw Hold"] = "Bastión Fauces de Madera",
Tranquillien = "Tranquillien",
Undercity = "Entrañas",
["Valiance Expedition"] = "Expedición de Denuedo",
["Warsong Offensive"] = "Ofensiva Grito de Guerra",
["Warsong Outriders"] = "Escoltas Grito de Guerra",
["Wildhammer Clan"] = "Clan Martillo Salvaje",
["Winterfin Retreat"] = "Retiro Aleta Invernal",
["Wintersaber Trainers"] = "Instructores de Sableinvernales",
["Zandalar Tribe"] = "Tribu Zandalar",
}
elseif GAME_LOCALE == "esMX" then
lib:SetCurrentTranslations {
Alliance = "Alianza",
["Alliance Vanguard"] = "Vanguardia de la Alianza",
["Argent Crusade"] = "Cruzada Argenta",
["Argent Dawn"] = "El Alba Argenta",
["Ashtongue Deathsworn"] = "Juramorte Lengua de ceniza",
["Avengers of Hyjal"] = "Vengadores de Hyjal", -- Needs review
["Baradin's Wardens"] = "Celadores de Baradin",
["Bilgewater Cartel"] = "Cártel Pantoque",
["Bloodsail Buccaneers"] = "Bucaneros Velasangre",
["Booty Bay"] = "Bahía del Botín",
["Brood of Nozdormu"] = "Linaje de Nozdormu",
["Cenarion Circle"] = "Círculo Cenarion",
["Cenarion Expedition"] = "Expedición Cenarion",
["Darkmoon Faire"] = "Feria de la Luna Negra",
["Darkspear Trolls"] = "Trols Lanza Negra",
Darnassus = "Darnassus",
["Dragonmaw Clan"] = "Clan Faucedraco",
Everlook = "Vista Eterna",
Exalted = "Exaltado",
Exodar = "El Exodar",
["Explorers' League"] = "Liga de Expedicionarios",
["Frenzyheart Tribe"] = "Tribu Corazón Frenético",
Friendly = "Amistoso",
["Frostwolf Clan"] = "Clan Lobo Gélido",
Gadgetzan = "Gadgetzan",
["Gelkis Clan Centaur"] = "Centauros del clan Gelkis",
Gilneas = "Gilneas", -- Needs review
Gnomeregan = "Gnomeregan", -- Needs review
["Gnomeregan Exiles"] = "Exiliados de Gnomeregan",
["Guardians of Hyjal"] = "Guardianes de Hyjal",
["Hellscream's Reach"] = "Mando Grito Infernal",
["Honor Hold"] = "Bastión del Honor",
Honored = "Honorable",
Horde = "Horda",
["Horde Expedition"] = "Expedición de la Horda",
["Hydraxian Waterlords"] = "Srs. del Agua de Hydraxis",
Ironforge = "Forjaz",
["Keepers of Time"] = "Vigilantes del Tiempo",
["Kirin Tor"] = "Kirin Tor",
["Knights of the Ebon Blade"] = "Caballeros de la Espada de Ébano",
Kurenai = "Kurenai",
["Lower City"] = "Bajo Arrabal",
["Magram Clan Centaur"] = "Centauros del clan Magram",
Netherwing = "Ala Abisal",
Neutral = "Neutral",
["Ogri'la"] = "Ogri'la",
Orgrimmar = "Orgrimmar",
Ramkahen = "Ramkahen", -- Needs review
Ratchet = "Trinquete",
Ravenholdt = "Ravenholdt",
Revered = "Reverenciado",
["Sha'tari Skyguard"] = "Guardia del cielo Sha'tari",
["Shattered Sun Offensive"] = "Ofensiva Sol Devastado",
["Shen'dralar"] = "Shen'dralar",
["Silvermoon City"] = "Ciudad de Lunargenta",
["Silverwing Sentinels"] = "Centinelas Ala de Plata",
Sporeggar = "Esporaggar",
["Stormpike Guard"] = "Guardia Pico Tormenta",
Stormwind = "Ventormenta",
Syndicate = "La Hermandad",
["The Aldor"] = "Los Aldor",
["The Ashen Verdict"] = "El Veredicto Cinéreo",
["The Consortium"] = "El Consorcio",
["The Defilers"] = "Los Rapiñadores",
["The Earthen Ring"] = "El Anillo de la Tierra",
["The Frostborn"] = "Los Natoescarcha",
["The Hand of Vengeance"] = "La Mano de la Venganza",
["The Kalu'ak"] = "Los Kalu'ak",
["The League of Arathor"] = "Liga de Arathor",
["The Mag'har"] = "Los Mag'har",
["The Oracles"] = "Los Oráculos",
["The Scale of the Sands"] = "La Escama de las Arenas",
["The Scryers"] = "Los Arúspices",
["The Sha'tar"] = "Los Sha'tar",
["The Silver Covenant"] = "El Pacto de Plata",
["The Sons of Hodir"] = "Los Hijos de Hodir",
["The Sunreavers"] = "Los Atracasol",
["The Taunka"] = "Los taunka",
["The Violet Eye"] = "El Ojo Violeta",
["The Wyrmrest Accord"] = "El Acuerdo del Reposo del Dragón",
Therazane = "Therazane", -- Needs review
["Thorium Brotherhood"] = "Hermandad del Torio",
Thrallmar = "Thrallmar",
["Thunder Bluff"] = "Cima del Trueno",
["Timbermaw Hold"] = "Bastión Fauces de Madera",
Tranquillien = "Tranquillien",
Undercity = "Entrañas",
["Valiance Expedition"] = "Expedición de Denuedo",
["Warsong Offensive"] = "Ofensiva Grito de Guerra",
["Warsong Outriders"] = "Escoltas Grito de Guerra",
["Wildhammer Clan"] = "Clan Martillo Salvaje",
["Winterfin Retreat"] = "Retiro Aleta Invernal",
["Wintersaber Trainers"] = "Instructores de sableinvernales",
["Zandalar Tribe"] = "Tribu Zandalar",
}
elseif GAME_LOCALE == "ruRU" then
lib:SetCurrentTranslations {
Alliance = "Альянс",
["Alliance Vanguard"] = "Авангард Альянса",
["Argent Crusade"] = "Серебряный Авангард",
["Argent Dawn"] = "Серебряный Рассвет",
["Ashtongue Deathsworn"] = "Пеплоусты-служители",
["Avengers of Hyjal"] = "Хиджальские мстители", -- Needs review
["Baradin's Wardens"] = "Защитники Тол Барада",
["Bilgewater Cartel"] = "Картель Трюмных Вод",
["Bloodsail Buccaneers"] = "Пираты Кровавого Паруса",
["Booty Bay"] = "Пиратская бухта",
["Brood of Nozdormu"] = "Род Ноздорму",
["Cenarion Circle"] = "Круг Кенария",
["Cenarion Expedition"] = "Экспедиция Ценариона",
["Darkmoon Faire"] = "Ярмарка Новолуния",
["Darkspear Trolls"] = "Тролли Черного Копья",
Darnassus = "Дарнас",
["Dragonmaw Clan"] = "Клан Драконьей Пасти",
Everlook = "Круговзор",
Exalted = "Превознесение",
Exodar = "Экзодар",
["Explorers' League"] = "Лига исследователей",
["Frenzyheart Tribe"] = "Племя Мятежного Сердца",
Friendly = "Дружелюбие",
["Frostwolf Clan"] = "Клан Северного Волка",
Gadgetzan = "Прибамбасск",
["Gelkis Clan Centaur"] = "Кентавры из племени Гелкис",
Gilneas = "Гилнеас",
Gnomeregan = "Гномреган",
["Gnomeregan Exiles"] = "Изгнанники Гномрегана",
["Guardians of Hyjal"] = "Стражи Хиджала",
Guild = "Гильдия",
["Hellscream's Reach"] = "Батальон Адского Крика",
["Honor Hold"] = "Оплот Чести",
Honored = "Уважение",
Horde = "Орда",
["Horde Expedition"] = "Экспедиция Орды",
["Hydraxian Waterlords"] = "Гидраксианские Повелители Вод",
Ironforge = "Стальгорн",
["Keepers of Time"] = "Хранители Времени",
["Kirin Tor"] = "Кирин-Тор",
["Knights of the Ebon Blade"] = "Рыцари Черного Клинка",
Kurenai = "Куренай",
["Lower City"] = "Нижний Город",
["Magram Clan Centaur"] = "Кентавры из племени Маграм",
Netherwing = "Крылья Пустоты",
Neutral = "Равнодушие",
["Ogri'la"] = "Огри'ла",
Orgrimmar = "Оргриммар",
Ramkahen = "Рамкахены",
Ratchet = "Кабестан",
Ravenholdt = "Черный Ворон",
Revered = "Почтение",
["Sha'tari Skyguard"] = "Стражи Небес Ша'тар",
["Shattered Sun Offensive"] = "Армия Расколотого Солнца",
["Shen'dralar"] = "Шен'дралар",
["Silvermoon City"] = "Луносвет",
["Silverwing Sentinels"] = "Среброкрылые Часовые",
Sporeggar = "Спореггар",
["Stormpike Guard"] = "Стража Грозовой Вершины",
Stormwind = "Штормград",
Syndicate = "Синдикат",
["The Aldor"] = "Алдоры",
["The Ashen Verdict"] = "Пепельный союз",
["The Consortium"] = "Консорциум",
["The Defilers"] = "Осквернители",
["The Earthen Ring"] = "Служители Земли",
["The Frostborn"] = "Зиморожденные",
["The Hand of Vengeance"] = "Карающая длань",
["The Kalu'ak"] = "Калу'ак",
["The League of Arathor"] = "Лига Аратора",
["The Mag'har"] = "Маг'хары",
["The Oracles"] = "Оракулы",
["The Scale of the Sands"] = "Песчаная Чешуя",
["The Scryers"] = "Провидцы",
["The Sha'tar"] = "Ша'тар",
["The Silver Covenant"] = "Серебряный Союз",
["The Sons of Hodir"] = "Сыновья Ходира",
["The Sunreavers"] = "Похитители солнца",
["The Taunka"] = "Таунка",
["The Violet Eye"] = "Аметистовое Око",
["The Wyrmrest Accord"] = "Драконий союз",
Therazane = "Теразан",
["Thorium Brotherhood"] = "Братство Тория",
Thrallmar = "Траллмар",
["Thunder Bluff"] = "Громовой Утес",
["Timbermaw Hold"] = "Древобрюхи",
Tranquillien = "Транквиллион",
Undercity = "Подгород",
["Valiance Expedition"] = "Экспедиция Отважных",
["Warsong Offensive"] = "Армия Песни Войны",
["Warsong Outriders"] = "Всадники Песни Войны",
["Wildhammer Clan"] = "Неистовый Молот",
["Winterfin Retreat"] = "Холодный Плавник",
["Wintersaber Trainers"] = "Укротители ледопардов",
["Zandalar Tribe"] = "Племя Зандалар",
}
elseif GAME_LOCALE == "zhCN" then
lib:SetCurrentTranslations {
Alliance = "联盟",
["Alliance Vanguard"] = "联盟先遣军",
["Argent Crusade"] = "银色北伐军",
["Argent Dawn"] = "银色黎明",
["Ashtongue Deathsworn"] = "灰舌死誓者",
["Avengers of Hyjal"] = "Avengers of Hyjal", -- Needs review
["Baradin's Wardens"] = "巴拉丁典狱官",
["Bilgewater Cartel"] = "锈水财阀",
["Bloodsail Buccaneers"] = "血帆海盗",
["Booty Bay"] = "藏宝海湾",
["Brood of Nozdormu"] = "诺兹多姆的子嗣",
["Cenarion Circle"] = "塞纳里奥议会",
["Cenarion Expedition"] = "塞纳里奥远征队",
["Darkmoon Faire"] = "暗月马戏团",
["Darkspear Trolls"] = "暗矛巨魔",
Darnassus = "达纳苏斯",
["Dragonmaw Clan"] = "龙喉氏族",
Everlook = "永望镇",
Exalted = "崇拜",
Exodar = "埃索达",
["Explorers' League"] = "探险者协会",
["Frenzyheart Tribe"] = "狂心氏族",
Friendly = "友善",
["Frostwolf Clan"] = "霜狼氏族",
Gadgetzan = "加基森",
["Gelkis Clan Centaur"] = "吉尔吉斯半人马",
Gilneas = "吉尔尼斯",
Gnomeregan = "诺莫瑞根",
["Gnomeregan Exiles"] = "诺莫瑞根流亡者",
["Guardians of Hyjal"] = "海加尔守护者",
["Hellscream's Reach"] = "地狱咆哮近卫军",
["Honor Hold"] = "荣耀堡",
Honored = "尊敬",
Horde = "部落",
["Horde Expedition"] = "部落先遣军",
["Hydraxian Waterlords"] = "海达希亚水元素",
Ironforge = "铁炉堡",
["Keepers of Time"] = "时光守护者",
["Kirin Tor"] = "肯瑞托",
["Knights of the Ebon Blade"] = "黑锋骑士团",
Kurenai = "库雷尼",
["Lower City"] = "贫民窟",
["Magram Clan Centaur"] = "玛格拉姆半人马",
Netherwing = "灵翼之龙",
Neutral = "中立",
["Ogri'la"] = "奥格瑞拉",
Orgrimmar = "奥格瑞玛",
Ramkahen = "拉穆卡恒",
Ratchet = "棘齿城",
Ravenholdt = "拉文霍德",
Revered = "崇敬",
["Sha'tari Skyguard"] = "沙塔尔天空卫士",
["Shattered Sun Offensive"] = "破碎残阳",
["Shen'dralar"] = "辛德拉",
["Silvermoon City"] = "银月城",
["Silverwing Sentinels"] = "银翼哨兵",
Sporeggar = "孢子村",
["Stormpike Guard"] = "雷矛卫队",
Stormwind = "暴风城",
Syndicate = "辛迪加",
["The Aldor"] = "奥尔多",
["The Ashen Verdict"] = "灰烬审判军",
["The Consortium"] = "星界财团",
["The Defilers"] = "污染者",
["The Earthen Ring"] = "大地之环",
["The Frostborn"] = "霜脉矮人",
["The Hand of Vengeance"] = "复仇之手",
["The Kalu'ak"] = "卡鲁亚克",
["The League of Arathor"] = "阿拉索联军",
["The Mag'har"] = "玛格汉",
["The Oracles"] = "神谕者",
["The Scale of the Sands"] = "流沙之鳞",
["The Scryers"] = "占星者",
["The Sha'tar"] = "沙塔尔",
["The Silver Covenant"] = "银色盟约",
["The Sons of Hodir"] = "霍迪尔之子",
["The Sunreavers"] = "夺日者",
["The Taunka"] = "牦牛人",
["The Violet Eye"] = "紫罗兰之眼",
["The Wyrmrest Accord"] = "龙眠联军",
Therazane = "塞拉赞恩",
["Thorium Brotherhood"] = "瑟银兄弟会",
Thrallmar = "萨尔玛",
["Thunder Bluff"] = "雷霆崖",
["Timbermaw Hold"] = "木喉要塞",
Tranquillien = "塔奎林",
Undercity = "幽暗城",
["Valiance Expedition"] = "无畏远征军",
["Warsong Offensive"] = "战歌远征军",
["Warsong Outriders"] = "战歌侦察骑兵",
["Wildhammer Clan"] = "蛮锤部族",
["Winterfin Retreat"] = "冬鳞避难所",
["Wintersaber Trainers"] = "冬刃豹训练师",
["Zandalar Tribe"] = "赞达拉部族",
}
elseif GAME_LOCALE == "zhTW" then
lib:SetCurrentTranslations {
Alliance = "聯盟",
["Alliance Vanguard"] = "聯盟先鋒",
["Argent Crusade"] = "銀白十字軍",
["Argent Dawn"] = "銀色黎明",
["Ashtongue Deathsworn"] = "灰舌死亡誓言者",
["Avengers of Hyjal"] = "海加爾復仇者",
["Baradin's Wardens"] = "巴拉丁鐵衛",
["Bilgewater Cartel"] = "污水企業聯合",
["Bloodsail Buccaneers"] = "血帆海盜",
["Booty Bay"] = "藏寶海灣",
["Brood of Nozdormu"] = "諾茲多姆的子嗣",
["Cenarion Circle"] = "塞納里奧議會",
["Cenarion Expedition"] = "塞納里奧遠征隊",
["Darkmoon Faire"] = "暗月馬戲團",
["Darkspear Trolls"] = "暗矛食人妖",
Darnassus = "達納蘇斯",
["Dragonmaw Clan"] = "龍喉氏族",
Everlook = "永望鎮",
Exalted = "崇拜",
Exodar = "艾克索達",
["Explorers' League"] = "探險者協會",
["Frenzyheart Tribe"] = "狂心部族",
Friendly = "友好",
["Frostwolf Clan"] = "霜狼氏族",
Gadgetzan = "加基森",
["Gelkis Clan Centaur"] = "吉爾吉斯半人馬",
Gilneas = "吉爾尼斯",
Gnomeregan = "諾姆瑞根",
["Gnomeregan Exiles"] = "諾姆瑞根流亡者",
["Guardians of Hyjal"] = "海加爾守護者",
["Hellscream's Reach"] = "地獄吼先鋒",
["Honor Hold"] = "榮譽堡",
Honored = "尊敬",
Horde = "部落",
["Horde Expedition"] = "部落遠征軍",
["Hydraxian Waterlords"] = "海達希亞水元素",
Ironforge = "鐵爐堡",
["Keepers of Time"] = "時光守望者",
["Kirin Tor"] = "祈倫托",
["Knights of the Ebon Blade"] = "黯刃騎士團",
Kurenai = "卡爾奈",
["Lower City"] = "陰鬱城",
["Magram Clan Centaur"] = "瑪格拉姆半人馬",
Netherwing = "虛空之翼",
Neutral = "中立",
["Ogri'la"] = "歐格利拉",
Orgrimmar = "奧格瑪",
Ramkahen = "蘭姆卡韓",
Ratchet = "棘齒城",
Ravenholdt = "拉文霍德",
Revered = "崇敬",
["Sha'tari Skyguard"] = "薩塔禦天者",
["Shattered Sun Offensive"] = "破碎之日進攻部隊",
["Shen'dralar"] = "辛德拉",
["Silvermoon City"] = "銀月城",
["Silverwing Sentinels"] = "銀翼哨兵",
Sporeggar = "斯博格爾",
["Stormpike Guard"] = "雷矛衛隊",
Stormwind = "暴風城",
Syndicate = "辛迪加",
["The Aldor"] = "奧多爾",
["The Ashen Verdict"] = "灰燼裁決軍",
["The Consortium"] = "聯合團",
["The Defilers"] = "污染者",
["The Earthen Ring"] = "陶土議會",
["The Frostborn"] = "霜誕矮人",
["The Hand of Vengeance"] = "復仇之手",
["The Kalu'ak"] = "卡魯耶克",
["The League of Arathor"] = "阿拉索聯軍",
["The Mag'har"] = "瑪格哈",
["The Oracles"] = "神諭者",
["The Scale of the Sands"] = "流沙之鱗",
["The Scryers"] = "占卜者",
["The Sha'tar"] = "薩塔",
["The Silver Covenant"] = "白銀誓盟",
["The Sons of Hodir"] = "霍迪爾之子",
["The Sunreavers"] = "奪日者",
["The Taunka"] = "坦卡族",
["The Violet Eye"] = "紫羅蘭之眼",
["The Wyrmrest Accord"] = "龍眠協調者",
Therazane = "瑟拉贊恩",
["Thorium Brotherhood"] = "瑟銀兄弟會",
Thrallmar = "索爾瑪",
["Thunder Bluff"] = "雷霆崖",
["Timbermaw Hold"] = "木喉要塞",
Tranquillien = "安寧地",
Undercity = "幽暗城",
["Valiance Expedition"] = "驍勇遠征軍",
["Warsong Offensive"] = "戰歌進攻部隊",
["Warsong Outriders"] = "戰歌先遣騎",
["Wildhammer Clan"] = "蠻錘氏族",
["Winterfin Retreat"] = "冬鰭避居地",
["Wintersaber Trainers"] = "冬刃豹訓練師",
["Zandalar Tribe"] = "贊達拉部族",
}
 
else
error(("%s: Locale %q not supported"):format(MAJOR_VERSION, GAME_LOCALE))
end
RecipeRadar/libs/LibBabble-Faction-3.0/LibBabble-Faction-3.0.toc New file
0,0 → 1,22
## Interface: 40200
## LoadOnDemand: 1
## Title: Lib: Babble-Faction-3.0
## Notes: A library to help with localization of factions.
## Notes-zhCN: 为本地化服务的支持库[声望阵营]
## Notes-zhTW: 為本地化服務的函式庫[聲望陣營]
## Notes-deDE: BabbleLib ist eine Bibliothek, die bei der Lokalisierung helfen soll.
## Notes-frFR: Une bibliothèque d'aide à la localisation.
## Notes-esES: Una biblioteca para ayudar con las localizaciones.
## Notes-ruRU: Библиотека для локализации аддонов.
## Author: Daviesh
## X-eMail: oma_daviesh@hotmail.com
## X-Category: Library
## X-License: MIT
## X-Curse-Packaged-Version: r142
## X-Curse-Project-Name: LibBabble-Faction-3.0
## X-Curse-Project-ID: libbabble-faction-3-0
## X-Curse-Repository-ID: wow/libbabble-faction-3-0/mainline
 
LibStub\LibStub.lua
lib.xml
 
RecipeRadar/libs/LibBabble-Faction-3.0/LibStub/tests/test.lua New file
0,0 → 1,41
debugstack = debug.traceback
strmatch = string.match
 
loadfile("../LibStub.lua")()
 
local lib, oldMinor = LibStub:NewLibrary("Pants", 1) -- make a new thingy
assert(lib) -- should return the library table
assert(not oldMinor) -- should not return the old minor, since it didn't exist
 
-- the following is to create data and then be able to check if the same data exists after the fact
function lib:MyMethod()
end
local MyMethod = lib.MyMethod
lib.MyTable = {}
local MyTable = lib.MyTable
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 1) -- try to register a library with the same version, should silently fail
assert(not newLib) -- should not return since out of date
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 0) -- try to register a library with a previous, should silently fail
assert(not newLib) -- should not return since out of date
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 2) -- register a new version
assert(newLib) -- library table
assert(rawequal(newLib, lib)) -- should be the same reference as the previous
assert(newOldMinor == 1) -- should return the minor version of the previous version
 
assert(rawequal(lib.MyMethod, MyMethod)) -- verify that values were saved
assert(rawequal(lib.MyTable, MyTable)) -- verify that values were saved
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", "Blah 3 Blah") -- register a new version with a string minor version (instead of a number)
assert(newLib) -- library table
assert(newOldMinor == 2) -- previous version was 2
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", "Blah 4 and please ignore 15 Blah") -- register a new version with a string minor version (instead of a number)
assert(newLib)
assert(newOldMinor == 3) -- previous version was 3 (even though it gave a string)
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 5) -- register a new library, using a normal number instead of a string
assert(newLib)
assert(newOldMinor == 4) -- previous version was 4 (even though it gave a string)
\ No newline at end of file
RecipeRadar/libs/LibBabble-Faction-3.0/LibStub/tests/test2.lua New file
0,0 → 1,27
debugstack = debug.traceback
strmatch = string.match
 
loadfile("../LibStub.lua")()
 
for major, library in LibStub:IterateLibraries() do
-- check that MyLib doesn't exist yet, by iterating through all the libraries
assert(major ~= "MyLib")
end
 
assert(not LibStub:GetLibrary("MyLib", true)) -- check that MyLib doesn't exist yet by direct checking
assert(not pcall(LibStub.GetLibrary, LibStub, "MyLib")) -- don't silently fail, thus it should raise an error.
local lib = LibStub:NewLibrary("MyLib", 1) -- create the lib
assert(lib) -- check it exists
assert(rawequal(LibStub:GetLibrary("MyLib"), lib)) -- verify that :GetLibrary("MyLib") properly equals the lib reference
 
assert(LibStub:NewLibrary("MyLib", 2)) -- create a new version
 
local count=0
for major, library in LibStub:IterateLibraries() do
-- check that MyLib exists somewhere in the libraries, by iterating through all the libraries
if major == "MyLib" then -- we found it!
count = count +1
assert(rawequal(library, lib)) -- verify that the references are equal
end
end
assert(count == 1) -- verify that we actually found it, and only once
RecipeRadar/libs/LibBabble-Faction-3.0/LibStub/tests/test3.lua New file
0,0 → 1,14
debugstack = debug.traceback
strmatch = string.match
 
loadfile("../LibStub.lua")()
 
local proxy = newproxy() -- non-string
 
assert(not pcall(LibStub.NewLibrary, LibStub, proxy, 1)) -- should error, proxy is not a string, it's userdata
local success, ret = pcall(LibStub.GetLibrary, proxy, true)
assert(not success or not ret) -- either error because proxy is not a string or because it's not actually registered.
 
assert(not pcall(LibStub.NewLibrary, LibStub, "Something", "No number in here")) -- should error, minor has no string in it.
 
assert(not LibStub:GetLibrary("Something", true)) -- shouldn't've created it from the above statement
\ No newline at end of file
RecipeRadar/libs/LibBabble-Faction-3.0/LibStub/tests/test4.lua New file
0,0 → 1,41
debugstack = debug.traceback
strmatch = string.match
 
loadfile("../LibStub.lua")()
 
 
-- Pretend like loaded libstub is old and doesn't have :IterateLibraries
assert(LibStub.minor)
LibStub.minor = LibStub.minor - 0.0001
LibStub.IterateLibraries = nil
 
loadfile("../LibStub.lua")()
 
assert(type(LibStub.IterateLibraries)=="function")
 
 
-- Now pretend that we're the same version -- :IterateLibraries should NOT be re-created
LibStub.IterateLibraries = 123
 
loadfile("../LibStub.lua")()
 
assert(LibStub.IterateLibraries == 123)
 
 
-- Now pretend that a newer version is loaded -- :IterateLibraries should NOT be re-created
LibStub.minor = LibStub.minor + 0.0001
 
loadfile("../LibStub.lua")()
 
assert(LibStub.IterateLibraries == 123)
 
 
-- Again with a huge number
LibStub.minor = LibStub.minor + 1234567890
 
loadfile("../LibStub.lua")()
 
assert(LibStub.IterateLibraries == 123)
 
 
print("OK")
\ No newline at end of file
RecipeRadar/libs/LibBabble-Faction-3.0/LibStub/LibStub.lua New file
0,0 → 1,51
-- $Id: LibStub.lua 76 2007-09-03 01:50:17Z mikk $
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain
-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
 
-- Check to see is this version of the stub is obsolete
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
 
-- LibStub:NewLibrary(major, minor)
-- major (string) - the major version of the library
-- minor (string or number ) - the minor version of the library
--
-- returns nil if a newer or same version of the lib is already present
-- returns empty library object or old library object if upgrade is needed
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
 
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
 
-- LibStub:GetLibrary(major, [silent])
-- major (string) - the major version of the library
-- silent (boolean) - if true, library is optional, silently return nil if its not found
--
-- throws an error if the library can not be found (except silent is set)
-- returns the library object if found
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
 
-- LibStub:IterateLibraries()
--
-- Returns an iterator for the currently registered libraries
function LibStub:IterateLibraries()
return pairs(self.libs)
end
 
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
RecipeRadar/libs/LibBabble-Faction-3.0/LibStub/LibStub.toc New file
0,0 → 1,13
## Interface: 40000
## Title: Lib: LibStub
## Notes: Universal Library Stub
## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
## X-Website: http://jira.wowace.com/browse/LS
## X-Category: Library
## X-License: Public Domain
## X-Curse-Packaged-Version: 1.0.1
## X-Curse-Project-Name: LibStub
## X-Curse-Project-ID: libstub
## X-Curse-Repository-ID: wow/libstub/mainline
 
LibStub.lua
RecipeRadar/libs/LibBabble-Faction-3.0/lib.xml New file
0,0 → 1,5
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="LibBabble-3.0.lua" />
<Script file="LibBabble-Faction-3.0.lua" />
</Ui>
RecipeRadar/libs/LibStub/LibStub.lua New file
0,0 → 1,30
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
 
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
 
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
 
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
 
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
 
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
RecipeRadar/libs/LibStub/LibStub.toc New file
0,0 → 1,13
## Interface: 20400
## Title: Lib: LibStub
## Notes: Universal Library Stub
## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
## X-Website: http://jira.wowace.com/browse/LS
## X-Category: Library
## X-License: Public Domain
## X-Curse-Packaged-Version: 1.0
## X-Curse-Project-Name: LibStub
## X-Curse-Project-ID: libstub
## X-Curse-Repository-ID: wow/libstub/mainline
 
LibStub.lua
RecipeRadar/libs/LibBabble-Zone-3.0/LibStub/tests/test.lua New file
0,0 → 1,41
debugstack = debug.traceback
strmatch = string.match
 
loadfile("../LibStub.lua")()
 
local lib, oldMinor = LibStub:NewLibrary("Pants", 1) -- make a new thingy
assert(lib) -- should return the library table
assert(not oldMinor) -- should not return the old minor, since it didn't exist
 
-- the following is to create data and then be able to check if the same data exists after the fact
function lib:MyMethod()
end
local MyMethod = lib.MyMethod
lib.MyTable = {}
local MyTable = lib.MyTable
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 1) -- try to register a library with the same version, should silently fail
assert(not newLib) -- should not return since out of date
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 0) -- try to register a library with a previous, should silently fail
assert(not newLib) -- should not return since out of date
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 2) -- register a new version
assert(newLib) -- library table
assert(rawequal(newLib, lib)) -- should be the same reference as the previous
assert(newOldMinor == 1) -- should return the minor version of the previous version
 
assert(rawequal(lib.MyMethod, MyMethod)) -- verify that values were saved
assert(rawequal(lib.MyTable, MyTable)) -- verify that values were saved
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", "Blah 3 Blah") -- register a new version with a string minor version (instead of a number)
assert(newLib) -- library table
assert(newOldMinor == 2) -- previous version was 2
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", "Blah 4 and please ignore 15 Blah") -- register a new version with a string minor version (instead of a number)
assert(newLib)
assert(newOldMinor == 3) -- previous version was 3 (even though it gave a string)
 
local newLib, newOldMinor = LibStub:NewLibrary("Pants", 5) -- register a new library, using a normal number instead of a string
assert(newLib)
assert(newOldMinor == 4) -- previous version was 4 (even though it gave a string)
\ No newline at end of file
RecipeRadar/libs/LibBabble-Zone-3.0/LibStub/tests/test2.lua New file
0,0 → 1,27
debugstack = debug.traceback
strmatch = string.match
 
loadfile("../LibStub.lua")()
 
for major, library in LibStub:IterateLibraries() do
-- check that MyLib doesn't exist yet, by iterating through all the libraries
assert(major ~= "MyLib")
end
 
assert(not LibStub:GetLibrary("MyLib", true)) -- check that MyLib doesn't exist yet by direct checking
assert(not pcall(LibStub.GetLibrary, LibStub, "MyLib")) -- don't silently fail, thus it should raise an error.
local lib = LibStub:NewLibrary("MyLib", 1) -- create the lib
assert(lib) -- check it exists
assert(rawequal(LibStub:GetLibrary("MyLib"), lib)) -- verify that :GetLibrary("MyLib") properly equals the lib reference
 
assert(LibStub:NewLibrary("MyLib", 2)) -- create a new version
 
local count=0
for major, library in LibStub:IterateLibraries() do
-- check that MyLib exists somewhere in the libraries, by iterating through all the libraries
if major == "MyLib" then -- we found it!
count = count +1
assert(rawequal(library, lib)) -- verify that the references are equal
end
end
assert(count == 1) -- verify that we actually found it, and only once
RecipeRadar/libs/LibBabble-Zone-3.0/LibStub/tests/test3.lua New file
0,0 → 1,14
debugstack = debug.traceback
strmatch = string.match
 
loadfile("../LibStub.lua")()
 
local proxy = newproxy() -- non-string
 
assert(not pcall(LibStub.NewLibrary, LibStub, proxy, 1)) -- should error, proxy is not a string, it's userdata
local success, ret = pcall(LibStub.GetLibrary, proxy, true)
assert(not success or not ret) -- either error because proxy is not a string or because it's not actually registered.
 
assert(not pcall(LibStub.NewLibrary, LibStub, "Something", "No number in here")) -- should error, minor has no string in it.
 
assert(not LibStub:GetLibrary("Something", true)) -- shouldn't've created it from the above statement
\ No newline at end of file
RecipeRadar/libs/LibBabble-Zone-3.0/LibStub/tests/test4.lua New file
0,0 → 1,41
debugstack = debug.traceback
strmatch = string.match
 
loadfile("../LibStub.lua")()
 
 
-- Pretend like loaded libstub is old and doesn't have :IterateLibraries
assert(LibStub.minor)
LibStub.minor = LibStub.minor - 0.0001
LibStub.IterateLibraries = nil
 
loadfile("../LibStub.lua")()
 
assert(type(LibStub.IterateLibraries)=="function")
 
 
-- Now pretend that we're the same version -- :IterateLibraries should NOT be re-created
LibStub.IterateLibraries = 123
 
loadfile("../LibStub.lua")()
 
assert(LibStub.IterateLibraries == 123)
 
 
-- Now pretend that a newer version is loaded -- :IterateLibraries should NOT be re-created
LibStub.minor = LibStub.minor + 0.0001
 
loadfile("../LibStub.lua")()
 
assert(LibStub.IterateLibraries == 123)
 
 
-- Again with a huge number
LibStub.minor = LibStub.minor + 1234567890
 
loadfile("../LibStub.lua")()
 
assert(LibStub.IterateLibraries == 123)
 
 
print("OK")
\ No newline at end of file
RecipeRadar/libs/LibBabble-Zone-3.0/LibStub/LibStub.lua New file
0,0 → 1,51
-- $Id: LibStub.lua 76 2007-09-03 01:50:17Z mikk $
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info
-- LibStub is hereby placed in the Public Domain
-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
local LibStub = _G[LIBSTUB_MAJOR]
 
-- Check to see is this version of the stub is obsolete
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
 
-- LibStub:NewLibrary(major, minor)
-- major (string) - the major version of the library
-- minor (string or number ) - the minor version of the library
--
-- returns nil if a newer or same version of the lib is already present
-- returns empty library object or old library object if upgrade is needed
function LibStub:NewLibrary(major, minor)
assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
 
local oldminor = self.minors[major]
if oldminor and oldminor >= minor then return nil end
self.minors[major], self.libs[major] = minor, self.libs[major] or {}
return self.libs[major], oldminor
end
 
-- LibStub:GetLibrary(major, [silent])
-- major (string) - the major version of the library
-- silent (boolean) - if true, library is optional, silently return nil if its not found
--
-- throws an error if the library can not be found (except silent is set)
-- returns the library object if found
function LibStub:GetLibrary(major, silent)
if not self.libs[major] and not silent then
error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
end
return self.libs[major], self.minors[major]
end
 
-- LibStub:IterateLibraries()
--
-- Returns an iterator for the currently registered libraries
function LibStub:IterateLibraries()
return pairs(self.libs)
end
 
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
RecipeRadar/libs/LibBabble-Zone-3.0/LibStub/LibStub.toc New file
0,0 → 1,13
## Interface: 40000
## Title: Lib: LibStub
## Notes: Universal Library Stub
## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
## X-Website: http://jira.wowace.com/browse/LS
## X-Category: Library
## X-License: Public Domain
## X-Curse-Packaged-Version: 1.0.1
## X-Curse-Project-Name: LibStub
## X-Curse-Project-ID: libstub
## X-Curse-Repository-ID: wow/libstub/mainline
 
LibStub.lua
RecipeRadar/libs/LibBabble-Zone-3.0/LibBabble-Zone-3.0.lua New file
0,0 → 1,2671
--[[
Name: LibBabble-Zone-3.0
Revision: $Rev: 325 $
Maintainers: ckknight, nevcairiel, Ackis
Website: http://www.wowace.com/projects/libbabble-zone-3-0/
Dependencies: None
License: MIT
]]
 
local MAJOR_VERSION = "LibBabble-Zone-3.0"
local MINOR_VERSION = 90000 + tonumber(("$Rev: 325 $"):match("%d+"))
 
if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
local lib = LibStub("LibBabble-3.0"):New(MAJOR_VERSION, MINOR_VERSION)
if not lib then return end
 
local GAME_LOCALE = GetLocale()
 
lib:SetBaseTranslations {
["Abyssal Depths"] = "Abyssal Depths",
["Ahn'Qiraj"] = "Ahn'Qiraj",
["Ahn'Qiraj: The Fallen Kingdom"] = "Ahn'Qiraj: The Fallen Kingdom",
["Ahn'kahet: The Old Kingdom"] = "Ahn'kahet: The Old Kingdom",
["Alliance Base"] = "Alliance Base",
["Alterac Mountains"] = "Alterac Mountains",
["Alterac Valley"] = "Alterac Valley",
["Amani Pass"] = "Amani Pass",
["Arathi Basin"] = "Arathi Basin",
["Arathi Highlands"] = "Arathi Highlands",
Armory = "Armory",
Ashenvale = "Ashenvale",
Auberdine = "Auberdine",
["Auchenai Crypts"] = "Auchenai Crypts",
Auchindoun = "Auchindoun",
Azeroth = "Azeroth",
["Azjol-Nerub"] = "Azjol-Nerub",
Azshara = "Azshara",
["Azuremyst Isle"] = "Azuremyst Isle",
Badlands = "Badlands",
["Baradin Hold"] = "Baradin Hold",
["Bash'ir Landing"] = "Bash'ir Landing",
["Battle for Gilneas"] = "Battle for Gilneas",
["Black Temple"] = "Black Temple",
["Blackfathom Deeps"] = "Blackfathom Deeps",
["Blackrock Caverns"] = "Blackrock Caverns",
["Blackrock Depths"] = "Blackrock Depths",
["Blackrock Mountain"] = "Blackrock Mountain",
["Blackrock Spire"] = "Blackrock Spire",
["Blackwind Lake"] = "Blackwind Lake",
["Blackwing Descent"] = "Blackwing Descent",
["Blackwing Lair"] = "Blackwing Lair",
["Blade's Edge Arena"] = "Blade's Edge Arena",
["Blade's Edge Mountains"] = "Blade's Edge Mountains",
["Blasted Lands"] = "Blasted Lands",
["Bloodmyst Isle"] = "Bloodmyst Isle",
["Booty Bay"] = "Booty Bay",
["Borean Tundra"] = "Borean Tundra",
["Burning Steppes"] = "Burning Steppes",
Cathedral = "Cathedral",
["Caverns of Time"] = "Caverns of Time",
["Champions' Hall"] = "Champions' Hall",
["Coilfang Reservoir"] = "Coilfang Reservoir",
Coldarra = "Coldarra",
["Cosmic map"] = "Cosmic map",
["Crystal Spine"] = "Crystal Spine",
["Crystalsong Forest"] = "Crystalsong Forest",
Dalaran = "Dalaran",
["Dalaran Arena"] = "Dalaran Arena",
["Dalaran Sewers"] = "Dalaran Sewers",
["Darkmoon Faire"] = "Darkmoon Faire",
Darkshore = "Darkshore",
Darnassus = "Darnassus",
Deadmines = "Deadmines",
["Deadwind Pass"] = "Deadwind Pass",
Deepholm = "Deepholm",
["Deeprun Tram"] = "Deeprun Tram",
Desolace = "Desolace",
["Dire Maul"] = "Dire Maul",
["Dire Maul (East)"] = "Dire Maul (East)",
["Dire Maul (North)"] = "Dire Maul (North)",
["Dire Maul (West)"] = "Dire Maul (West)",
Dragonblight = "Dragonblight",
["Drak'Tharon Keep"] = "Drak'Tharon Keep",
["Dun Morogh"] = "Dun Morogh",
Durotar = "Durotar",
Duskwood = "Duskwood",
["Dustwallow Marsh"] = "Dustwallow Marsh",
["Eastern Kingdoms"] = "Eastern Kingdoms",
["Eastern Plaguelands"] = "Eastern Plaguelands",
["Elwynn Forest"] = "Elwynn Forest",
Everlook = "Everlook",
["Eversong Woods"] = "Eversong Woods",
["Eye of the Storm"] = "Eye of the Storm",
Felwood = "Felwood",
Feralas = "Feralas",
Firelands = "Firelands",
["Forge Camp: Terror"] = "Forge Camp: Terror",
["Forge Camp: Wrath"] = "Forge Camp: Wrath",
["Frostwyrm Lair"] = "Frostwyrm Lair",
["Furywing's Perch"] = "Furywing's Perch",
Gadgetzan = "Gadgetzan",
["Gates of Ahn'Qiraj"] = "Gates of Ahn'Qiraj",
Ghostlands = "Ghostlands",
Gilneas = "Gilneas",
["Gilneas City"] = "Gilneas City",
Gnomeregan = "Gnomeregan",
Graveyard = "Graveyard",
["Grim Batol"] = "Grim Batol",
["Grizzly Hills"] = "Grizzly Hills",
["Grom'gol Base Camp"] = "Grom'gol Base Camp",
["Gruul's Lair"] = "Gruul's Lair",
Gundrak = "Gundrak",
["Hall of Champions"] = "Hall of Champions",
["Hall of Legends"] = "Hall of Legends",
["Halls of Lightning"] = "Halls of Lightning",
["Halls of Origination"] = "Halls of Origination",
["Halls of Reflection"] = "Halls of Reflection",
["Halls of Stone"] = "Halls of Stone",
["Hellfire Citadel"] = "Hellfire Citadel",
["Hellfire Peninsula"] = "Hellfire Peninsula",
["Hellfire Ramparts"] = "Hellfire Ramparts",
["Hillsbrad Foothills"] = "Hillsbrad Foothills",
["Horde Encampment"] = "Horde Encampment",
["Howling Fjord"] = "Howling Fjord",
["Hrothgar's Landing"] = "Hrothgar's Landing",
Hyjal = "Hyjal",
["Hyjal Summit"] = "Hyjal Summit",
Icecrown = "Icecrown",
["Icecrown Citadel"] = "Icecrown Citadel",
["Insidion's Perch"] = "Insidion's Perch",
Ironforge = "Ironforge",
["Isle of Conquest"] = "Isle of Conquest",
["Isle of Quel'Danas"] = "Isle of Quel'Danas",
Kalimdor = "Kalimdor",
Karazhan = "Karazhan",
["Kelp'thar Forest"] = "Kelp'thar Forest",
Kezan = "Kezan",
["Krasus' Landing"] = "Krasus' Landing",
Library = "Library",
["Loch Modan"] = "Loch Modan",
["Lost City of the Tol'vir"] = "Lost City of the Tol'vir",
["Lower Blackrock Spire"] = "Lower Blackrock Spire",
["Magisters' Terrace"] = "Magisters' Terrace",
["Magtheridon's Lair"] = "Magtheridon's Lair",
["Mana-Tombs"] = "Mana-Tombs",
Maraudon = "Maraudon",
["Marshlight Lake"] = "Marshlight Lake",
["Menethil Harbor"] = "Menethil Harbor",
["Molten Core"] = "Molten Core",
["Molten Front"] = "Molten Front",
Moonglade = "Moonglade",
["Mount Hyjal"] = "Mount Hyjal",
Mulgore = "Mulgore",
Nagrand = "Nagrand",
["Nagrand Arena"] = "Nagrand Arena",
Naxxramas = "Naxxramas",
Netherstorm = "Netherstorm",
["Night Elf Village"] = "Night Elf Village",
["Northern Barrens"] = "Northern Barrens",
["Northern Stranglethorn"] = "Northern Stranglethorn",
Northrend = "Northrend",
["Obsidia's Perch"] = "Obsidia's Perch",
["Ogri'la"] = "Ogri'la",
["Old Hillsbrad Foothills"] = "Old Hillsbrad Foothills",
["Old Stratholme"] = "Old Stratholme",
["Onyxia's Lair"] = "Onyxia's Lair",
Orgrimmar = "Orgrimmar",
Outland = "Outland",
["Pit of Saron"] = "Pit of Saron",
["Plaguelands: The Scarlet Enclave"] = "Plaguelands: The Scarlet Enclave",
Plaguewood = "Plaguewood",
["Quel'thalas"] = "Quel'thalas",
["Ragefire Chasm"] = "Ragefire Chasm",
Ratchet = "Ratchet",
["Razorfen Downs"] = "Razorfen Downs",
["Razorfen Kraul"] = "Razorfen Kraul",
["Redridge Mountains"] = "Redridge Mountains",
["Ring of Observance"] = "Ring of Observance",
["Rivendark's Perch"] = "Rivendark's Perch",
["Ruins of Ahn'Qiraj"] = "Ruins of Ahn'Qiraj",
["Ruins of Gilneas"] = "Ruins of Gilneas",
["Ruins of Gilneas City"] = "Ruins of Gilneas City",
["Ruins of Lordaeron"] = "Ruins of Lordaeron",
["Scalebeard's Cave"] = "Scalebeard's Cave",
["Scarlet Monastery"] = "Scarlet Monastery",
Scholomance = "Scholomance",
["Searing Gorge"] = "Searing Gorge",
["Serpent Lake"] = "Serpent Lake",
["Serpentshrine Cavern"] = "Serpentshrine Cavern",
["Sethekk Halls"] = "Sethekk Halls",
["Shadow Labyrinth"] = "Shadow Labyrinth",
["Shadowfang Keep"] = "Shadowfang Keep",
["Shadowmoon Valley"] = "Shadowmoon Valley",
["Shartuul's Transporter"] = "Shartuul's Transporter",
Shattrath = "Shattrath",
["Shattrath City"] = "Shattrath City",
["Shimmering Expanse"] = "Shimmering Expanse",
["Sholazar Basin"] = "Sholazar Basin",
Silithus = "Silithus",
["Silvermoon City"] = "Silvermoon City",
["Silverpine Forest"] = "Silverpine Forest",
["Skyguard Outpost"] = "Skyguard Outpost",
["Skysong Lake"] = "Skysong Lake",
["Southern Barrens"] = "Southern Barrens",
["Sporewind Lake"] = "Sporewind Lake",
Stonard = "Stonard",
["Stonetalon Mountains"] = "Stonetalon Mountains",
Stormwind = "Stormwind",
["Stormwind City"] = "Stormwind City",
["Strand of the Ancients"] = "Strand of the Ancients",
["Stranglethorn Vale"] = "Stranglethorn Vale",
Stratholme = "Stratholme",
["Sunken Temple"] = "Sunken Temple",
["Sunwell Plateau"] = "Sunwell Plateau",
["Swamp of Sorrows"] = "Swamp of Sorrows",
Tanaris = "Tanaris",
Teldrassil = "Teldrassil",
["Tempest Keep"] = "Tempest Keep",
["Temple of Ahn'Qiraj"] = "Temple of Ahn'Qiraj",
["Terokk's Rest"] = "Terokk's Rest",
["Terokkar Forest"] = "Terokkar Forest",
["The Arachnid Quarter"] = "The Arachnid Quarter",
["The Arcatraz"] = "The Arcatraz",
["The Argent Coliseum"] = "The Argent Coliseum",
["The Barrens"] = "The Barrens",
["The Bastion of Twilight"] = "The Bastion of Twilight",
["The Battle for Gilneas"] = "The Battle for Gilneas",
["The Black Morass"] = "The Black Morass",
["The Blood Furnace"] = "The Blood Furnace",
["The Bone Wastes"] = "The Bone Wastes",
["The Botanica"] = "The Botanica",
["The Cape of Stranglethorn"] = "The Cape of Stranglethorn",
["The Construct Quarter"] = "The Construct Quarter",
["The Culling of Stratholme"] = "The Culling of Stratholme",
["The Dark Portal"] = "The Dark Portal",
["The Deadmines"] = "The Deadmines",
["The Descent into Madness"] = "The Descent into Madness",
["The Exodar"] = "The Exodar",
["The Eye"] = "The Eye",
["The Eye of Eternity"] = "The Eye of Eternity",
["The Forbidding Sea"] = "The Forbidding Sea",
["The Forge of Souls"] = "The Forge of Souls",
["The Frozen Halls"] = "The Frozen Halls",
["The Frozen Sea"] = "The Frozen Sea",
["The Great Sea"] = "The Great Sea",
["The Halls of Winter"] = "The Halls of Winter",
["The Hinterlands"] = "The Hinterlands",
["The Lost Isles"] = "The Lost Isles",
["The Maelstrom"] = "The Maelstrom",
["The Mechanar"] = "The Mechanar",
["The Military Quarter"] = "The Military Quarter",
["The Nexus"] = "The Nexus",
["The North Sea"] = "The North Sea",
["The Obsidian Sanctum"] = "The Obsidian Sanctum",
["The Oculus"] = "The Oculus",
["The Plague Quarter"] = "The Plague Quarter",
["The Prison of Yogg-Saron"] = "The Prison of Yogg-Saron",
["The Ring of Valor"] = "The Ring of Valor",
["The Ruby Sanctum"] = "The Ruby Sanctum",
["The Scarlet Enclave"] = "The Scarlet Enclave",
["The Shattered Halls"] = "The Shattered Halls",
["The Slave Pens"] = "The Slave Pens",
["The Spark of Imagination"] = "The Spark of Imagination",
["The Steamvault"] = "The Steamvault",
["The Stockade"] = "The Stockade",
["The Stonecore"] = "The Stonecore",
["The Storm Peaks"] = "The Storm Peaks",
["The Temple of Atal'Hakkar"] = "The Temple of Atal'Hakkar",
["The Underbog"] = "The Underbog",
["The Veiled Sea"] = "The Veiled Sea",
["The Violet Hold"] = "The Violet Hold",
["The Vortex Pinnacle"] = "The Vortex Pinnacle",
["Theramore Isle"] = "Theramore Isle",
["Thousand Needles"] = "Thousand Needles",
["Throne of the Four Winds"] = "Throne of the Four Winds",
["Throne of the Tides"] = "Throne of the Tides",
["Thunder Bluff"] = "Thunder Bluff",
Tirisfal = "Tirisfal",
["Tirisfal Glades"] = "Tirisfal Glades",
["Tol Barad"] = "Tol Barad",
["Tol Barad Peninsula"] = "Tol Barad Peninsula",
["Trial of the Champion"] = "Trial of the Champion",
["Trial of the Crusader"] = "Trial of the Crusader",
["Twilight Highlands"] = "Twilight Highlands",
["Twin Peaks"] = "Twin Peaks",
["Twisting Nether"] = "Twisting Nether",
Uldaman = "Uldaman",
Ulduar = "Ulduar",
Uldum = "Uldum",
["Un'Goro Crater"] = "Un'Goro Crater",
Undercity = "Undercity",
["Upper Blackrock Spire"] = "Upper Blackrock Spire",
["Utgarde Keep"] = "Utgarde Keep",
["Utgarde Pinnacle"] = "Utgarde Pinnacle",
["Vashj'ir"] = "Vashj'ir",
["Vault of Archavon"] = "Vault of Archavon",
["Vortex Pinnacle"] = "Vortex Pinnacle",
["Wailing Caverns"] = "Wailing Caverns",
["Warsong Gulch"] = "Warsong Gulch",
["Western Plaguelands"] = "Western Plaguelands",
Westfall = "Westfall",
Wetlands = "Wetlands",
Wintergrasp = "Wintergrasp",
Winterspring = "Winterspring",
["Wyrmrest Temple"] = "Wyrmrest Temple",
Zangarmarsh = "Zangarmarsh",
["Zul'Aman"] = "Zul'Aman",
["Zul'Drak"] = "Zul'Drak",
["Zul'Farrak"] = "Zul'Farrak",
["Zul'Gurub"] = "Zul'Gurub",
}
 
 
if GAME_LOCALE == "enUS" then
lib:SetCurrentTranslations(true)
elseif GAME_LOCALE == "deDE" then
lib:SetCurrentTranslations {
["Abyssal Depths"] = "Abyssische Tiefen",
["Ahn'Qiraj"] = "Ahn'Qiraj",
["Ahn'Qiraj: The Fallen Kingdom"] = "Ahn'Qiray: Das Gefallene Königreich",
["Ahn'kahet: The Old Kingdom"] = "Ahn'kahet: Das Alte Königreich",
["Alliance Base"] = "Basis der Allianz",
["Alterac Mountains"] = "Alteracgebirge",
["Alterac Valley"] = "Alteractal",
["Amani Pass"] = "Amanipass",
["Arathi Basin"] = "Arathibecken",
["Arathi Highlands"] = "Arathihochland",
Armory = "Waffenkammer",
Ashenvale = "Eschental",
Auberdine = "Auberdine",
["Auchenai Crypts"] = "Auchenaikrypta",
Auchindoun = "Auchindoun",
Azeroth = "Azeroth",
["Azjol-Nerub"] = "Azjol-Nerub",
Azshara = "Azshara",
["Azuremyst Isle"] = "Azurmythosinsel",
Badlands = "Ödland",
["Baradin Hold"] = "Baradinfestung",
["Bash'ir Landing"] = "Landeplatz von Bash'ir",
["Battle for Gilneas"] = "Schlacht um Gilneas",
["Black Temple"] = "Der Schwarze Tempel",
["Blackfathom Deeps"] = "Tiefschwarze Grotte",
["Blackrock Caverns"] = "Schwarzfelshöhlen",
["Blackrock Depths"] = "Schwarzfelstiefen",
["Blackrock Mountain"] = "Der Schwarzfels",
["Blackrock Spire"] = "Schwarzfelsspitze",
["Blackwind Lake"] = "Schattenwindsee",
["Blackwing Descent"] = "Pechschwingenabstieg",
["Blackwing Lair"] = "Pechschwingenhort",
["Blade's Edge Arena"] = "Arena des Schergrats",
["Blade's Edge Mountains"] = "Schergrat",
["Blasted Lands"] = "Verwüstete Lande",
["Bloodmyst Isle"] = "Blutmythosinsel",
["Booty Bay"] = "Beutebucht",
["Borean Tundra"] = "Boreanische Tundra",
["Burning Steppes"] = "Brennende Steppe",
Cathedral = "Kathedrale",
["Caverns of Time"] = "Höhlen der Zeit",
["Champions' Hall"] = "Halle der Champions",
["Coilfang Reservoir"] = "Der Echsenkessel",
Coldarra = "Kaltarra",
["Cosmic map"] = "Kosmische Karte",
["Crystal Spine"] = "Kristallrücken",
["Crystalsong Forest"] = "Kristallsangwald",
Dalaran = "Dalaran",
["Dalaran Arena"] = "Arena von Dalaran",
["Dalaran Sewers"] = "Arena von Dalaran",
["Darkmoon Faire"] = "Dunkelmond-Jahrmarkt",
Darkshore = "Dunkelküste",
Darnassus = "Darnassus",
Deadmines = "Todesminen",
["Deadwind Pass"] = "Gebirgspass der Totenwinde",
Deepholm = "Tiefenheim",
["Deeprun Tram"] = "Die Tiefenbahn",
Desolace = "Desolace",
["Dire Maul"] = "Düsterbruch",
["Dire Maul (East)"] = "Düsterbruch (Ost)",
["Dire Maul (North)"] = "Düsterbruch (Nord)",
["Dire Maul (West)"] = "Düsterbruch (West)",
Dragonblight = "Drachenöde",
["Drak'Tharon Keep"] = "Feste Drak'Tharon",
["Dun Morogh"] = "Dun Morogh",
Durotar = "Durotar",
Duskwood = "Dämmerwald",
["Dustwallow Marsh"] = "Düstermarschen",
["Eastern Kingdoms"] = "Östliche Königreiche",
["Eastern Plaguelands"] = "Östliche Pestländer",
["Elwynn Forest"] = "Wald von Elwynn",
Everlook = "Ewige Warte",
["Eversong Woods"] = "Immersangwald",
["Eye of the Storm"] = "Auge des Sturms",
Felwood = "Teufelswald",
Feralas = "Feralas",
Firelands = "Feuerlande",
["Forge Camp: Terror"] = "Konstruktionslager: Terror",
["Forge Camp: Wrath"] = "Konstruktionslager: Wut",
["Frostwyrm Lair"] = "Frostwyrmbau",
["Furywing's Perch"] = "Isidions Hort",
Gadgetzan = "Gadgetzan",
["Gates of Ahn'Qiraj"] = "Tore von Ahn'Qiraj",
Ghostlands = "Geisterlande",
Gilneas = "Gilneas",
["Gilneas City"] = "Gilneas",
Gnomeregan = "Gnomeregan",
Graveyard = "Friedhof",
["Grim Batol"] = "Grim Batol",
["Grizzly Hills"] = "Grizzlyhügel",
["Grom'gol Base Camp"] = "Basislager von Grom'gol",
["Gruul's Lair"] = "Gruuls Unterschlupf",
Gundrak = "Gundrak",
["Hall of Champions"] = "Halle der Champions",
["Hall of Legends"] = "Halle der Legenden",
["Halls of Lightning"] = "Die Hallen der Blitze",
["Halls of Origination"] = "Hallen des Ursprungs",
["Halls of Reflection"] = "Hallen der Reflexion",
["Halls of Stone"] = "Die Hallen des Steins",
["Hellfire Citadel"] = "Höllenfeuerzitadelle",
["Hellfire Peninsula"] = "Höllenfeuerhalbinsel",
["Hellfire Ramparts"] = "Höllenfeuerbollwerk",
["Hillsbrad Foothills"] = "Vorgebirge des Hügellands",
["Horde Encampment"] = "Lager der Horde",
["Howling Fjord"] = "Der Heulende Fjord",
["Hrothgar's Landing"] = "Hrothgars Landestelle",
Hyjal = "Hyjal",
["Hyjal Summit"] = "Hyjalgipfel",
Icecrown = "Eiskrone",
["Icecrown Citadel"] = "Eiskronenzitadelle",
["Insidion's Perch"] = "Isidions Hort",
Ironforge = "Eisenschmiede",
["Isle of Conquest"] = "Insel der Eroberung",
["Isle of Quel'Danas"] = "Insel von Quel'Danas",
Kalimdor = "Kalimdor",
Karazhan = "Karazhan",
["Kelp'thar Forest"] = "Tang'tharwald",
Kezan = "Kezan",
["Krasus' Landing"] = "Krasus' Landeplatz",
Library = "Bibliothek",
["Loch Modan"] = "Loch Modan",
["Lost City of the Tol'vir"] = "Die Verlorene Stadt der Tol'vir",
["Lower Blackrock Spire"] = "Untere Schwarzfelsspitze",
["Magisters' Terrace"] = "Terrasse der Magister",
["Magtheridon's Lair"] = "Magtheridons Kammer",
["Mana-Tombs"] = "Managruft",
Maraudon = "Maraudon",
["Marshlight Lake"] = "Sumpflichtsee",
["Menethil Harbor"] = "Hafen von Menethil",
["Molten Core"] = "Geschmolzener Kern",
["Molten Front"] = "Geschmolzene Front",
Moonglade = "Mondlichtung",
["Mount Hyjal"] = "Hyjal",
Mulgore = "Mulgore",
Nagrand = "Nagrand",
["Nagrand Arena"] = "Arena von Nagrand",
Naxxramas = "Naxxramas",
Netherstorm = "Nethersturm",
["Night Elf Village"] = "Nachtelfen Dorf",
["Northern Barrens"] = "Nördliches Brachland",
["Northern Stranglethorn"] = "Nördliches Schlingendorntal",
Northrend = "Nordend",
["Obsidia's Perch"] = "Obsidias Hort",
["Ogri'la"] = "Ogri'la",
["Old Hillsbrad Foothills"] = "Vorgebirge des Alten Hügellands",
["Old Stratholme"] = "Alt-Stratholme",
["Onyxia's Lair"] = "Onyxias Hort",
Orgrimmar = "Orgrimmar",
Outland = "Scherbenwelt",
["Pit of Saron"] = "Grube von Saron",
["Plaguelands: The Scarlet Enclave"] = "Pestländer: Die Scharlachrote Enklave",
Plaguewood = "Seuchenwald",
["Quel'thalas"] = "Quel'Thalas",
["Ragefire Chasm"] = "Der Flammenschlund",
Ratchet = "Ratschet",
["Razorfen Downs"] = "Hügel der Klingenhauer",
["Razorfen Kraul"] = "Kral der Klingenhauer",
["Redridge Mountains"] = "Rotkammgebirge",
["Ring of Observance"] = "Ring der Beobachtung",
["Rivendark's Perch"] = "Nachtreißers Hort",
["Ruins of Ahn'Qiraj"] = "Ruinen von Ahn'Qiraj",
["Ruins of Gilneas"] = "Ruinen von Gilneas",
["Ruins of Gilneas City"] = "Ruinen von Gilneas",
["Ruins of Lordaeron"] = "Ruinen von Lordaeron",
["Scalebeard's Cave"] = "Schuppenbarts Höhle",
["Scarlet Monastery"] = "Das Scharlachrote Kloster",
Scholomance = "Scholomance",
["Searing Gorge"] = "Sengende Schlucht",
["Serpent Lake"] = "Schlangensee",
["Serpentshrine Cavern"] = "Höhle des Schlangenschreins",
["Sethekk Halls"] = "Sethekkhallen",
["Shadow Labyrinth"] = "Schattenlabyrinth",
["Shadowfang Keep"] = "Burg Schattenfang",
["Shadowmoon Valley"] = "Schattenmondtal",
["Shartuul's Transporter"] = "Shartuuls Transporter",
Shattrath = "Shattrath",
["Shattrath City"] = "Shattrath",
["Shimmering Expanse"] = "Schimmernde Weiten",
["Sholazar Basin"] = "Sholazarbecken",
Silithus = "Silithus",
["Silvermoon City"] = "Silbermond",
["Silverpine Forest"] = "Silberwald",
["Skyguard Outpost"] = "Außenposten der Himmelswache",
["Skysong Lake"] = "Himmelsweisensee",
["Southern Barrens"] = "Südliches Brachland",
["Sporewind Lake"] = "Sporenwindsee",
Stonard = "Steinard",
["Stonetalon Mountains"] = "Steinkrallengebirge",
Stormwind = "Sturmwind",
["Stormwind City"] = "Sturmwind",
["Strand of the Ancients"] = "Strand der Uralten",
["Stranglethorn Vale"] = "Schlingendorntal",
Stratholme = "Stratholme",
["Sunken Temple"] = "Versunkener Tempel",
["Sunwell Plateau"] = "Sonnenbrunnenplateau",
["Swamp of Sorrows"] = "Sümpfe des Elends",
Tanaris = "Tanaris",
Teldrassil = "Teldrassil",
["Tempest Keep"] = "Festung der Stürme",
["Temple of Ahn'Qiraj"] = "Tempel von Ahn'Qiraj",
["Terokk's Rest"] = "Terokks Ruh",
["Terokkar Forest"] = "Wälder von Terokkar",
["The Arachnid Quarter"] = "Das Arachnidenviertel",
["The Arcatraz"] = "Die Arkatraz",
["The Argent Coliseum"] = "Das Kolosseum der Kreuzfahrer",
["The Barrens"] = "Brachland",
["The Bastion of Twilight"] = "Die Bastion des Zwielichts",
["The Battle for Gilneas"] = "Die Schlacht um Gilneas",
["The Black Morass"] = "Der schwarze Morast",
["The Blood Furnace"] = "Der Blutkessel",
["The Bone Wastes"] = "Die Knochenwüste",
["The Botanica"] = "Die Botanika",
["The Cape of Stranglethorn"] = "Das Schlingendornkap",
["The Construct Quarter"] = "Das Konstruktviertel",
["The Culling of Stratholme"] = "Das Ausmerzen von Stratholme",
["The Dark Portal"] = "Das Dunkle Portal",
["The Deadmines"] = "Die Todesminen",
["The Descent into Madness"] = "Der Abstieg in den Wahnsinn",
["The Exodar"] = "Die Exodar",
["The Eye"] = "Das Auge",
["The Eye of Eternity"] = "Das Auge der Ewigkeit",
["The Forbidding Sea"] = "Das verbotene Meer",
["The Forge of Souls"] = "Die Schmiede der Seelen",
["The Frozen Halls"] = "Die gefrorenen Hallen",
["The Frozen Sea"] = "Die gefrorene See",
["The Great Sea"] = "Das große Meer",
["The Halls of Winter"] = "Die Hallen des Winters",
["The Hinterlands"] = "Hinterland",
["The Lost Isles"] = "Die Verlorenen Inseln",
["The Maelstrom"] = "Der Mahlstrom",
["The Mechanar"] = "Die Mechanar",
["The Military Quarter"] = "Das Militärviertel",
["The Nexus"] = "Der Nexus",
["The North Sea"] = "Das nördliche Meer",
["The Obsidian Sanctum"] = "Das Obsidiansanktum",
["The Oculus"] = "Das Oculus",
["The Plague Quarter"] = "Das Seuchenviertel",
["The Prison of Yogg-Saron"] = "Das Gefängnis von Yogg-Saron",
["The Ring of Valor"] = "Der Ring der Ehre",
["The Ruby Sanctum"] = "Das Rubinsanktum",
["The Scarlet Enclave"] = "Die Scharlachrote Enklave",
["The Shattered Halls"] = "Die zerschmetterten Hallen",
["The Slave Pens"] = "Die Sklavenunterkünfte",
["The Spark of Imagination"] = "Der Funke der Imagination",
["The Steamvault"] = "Die Dampfkammer",
["The Stockade"] = "Das Verlies",
["The Stonecore"] = "Der Steinerne Kern",
["The Storm Peaks"] = "Die Sturmgipfel",
["The Temple of Atal'Hakkar"] = "Der Tempel von Atal'Hakkar",
["The Underbog"] = "Der Tiefensumpf",
["The Veiled Sea"] = "Das verhüllte Meer",
["The Violet Hold"] = "Die Violette Festung",
["The Vortex Pinnacle"] = "Der Vortexgipfel",
["Theramore Isle"] = "Insel Theramore",
["Thousand Needles"] = "Tausend Nadeln",
["Throne of the Four Winds"] = "Thron der Vier Winde",
["Throne of the Tides"] = "Thron der Gezeiten",
["Thunder Bluff"] = "Donnerfels",
Tirisfal = "Tirisfal",
["Tirisfal Glades"] = "Tirisfal",
["Tol Barad"] = "Tol Barad",
["Tol Barad Peninsula"] = "Halbinsel von Tol Barad",
["Trial of the Champion"] = "Prüfung des Champions",
["Trial of the Crusader"] = "Prüfung des Kreuzfahrers",
["Twilight Highlands"] = "Schattenhochland",
["Twin Peaks"] = "Zwillingsgipfel",
["Twisting Nether"] = "Wirbelnder Nether",
Uldaman = "Uldaman",
Ulduar = "Ulduar",
Uldum = "Uldum",
["Un'Goro Crater"] = "Krater von Un'Goro",
Undercity = "Unterstadt",
["Upper Blackrock Spire"] = "Obere Schwarzfelsspitze",
["Utgarde Keep"] = "Burg Utgarde",
["Utgarde Pinnacle"] = "Turm Utgarde",
["Vashj'ir"] = "Vashj'ir",
["Vault of Archavon"] = "Archavons Kammer",
["Vortex Pinnacle"] = "Vortexgipfel",
["Wailing Caverns"] = "Die Höhlen des Wehklagens",
["Warsong Gulch"] = "Kriegshymnenschlucht",
["Western Plaguelands"] = "Westliche Pestländer",
Westfall = "Westfall",
Wetlands = "Sumpfland",
Wintergrasp = "Tausendwintersee",
Winterspring = "Winterquell",
["Wyrmrest Temple"] = "Wyrmruhtempel",
Zangarmarsh = "Zangarmarschen",
["Zul'Aman"] = "Zul'Aman",
["Zul'Drak"] = "Zul'Drak",
["Zul'Farrak"] = "Zul'Farrak",
["Zul'Gurub"] = "Zul'Gurub",
}
elseif GAME_LOCALE == "frFR" then
lib:SetCurrentTranslations {
["Abyssal Depths"] = "Profondeurs Abyssales",
["Ahn'Qiraj"] = "Ahn'Qiraj",
["Ahn'Qiraj: The Fallen Kingdom"] = "Ahn'Qiraj : le royaume Déchu",
["Ahn'kahet: The Old Kingdom"] = "Ahn'kahet : l'Ancien royaume",
["Alliance Base"] = "Base de l'Alliance",
["Alterac Mountains"] = "Montagnes d'Alterac",
["Alterac Valley"] = "Vallée d'Alterac",
["Amani Pass"] = "Passage des Amani",
["Arathi Basin"] = "Bassin Arathi",
["Arathi Highlands"] = "Hautes-terres Arathies",
Armory = "Armurerie",
Ashenvale = "Orneval",
Auberdine = "Auberdine",
["Auchenai Crypts"] = "Cryptes Auchenaï",
Auchindoun = "Auchindoun",
Azeroth = "Azeroth",
["Azjol-Nerub"] = "Azjol-Nérub",
Azshara = "Azshara",
["Azuremyst Isle"] = "Île de Brume-Azur",
Badlands = "Terres Ingrates",
["Baradin Hold"] = "Bastion de Baradin",
["Bash'ir Landing"] = "Point d'ancrage de Bash'ir",
["Battle for Gilneas"] = "Bataille de Gilnéas",
["Black Temple"] = "Temple noir",
["Blackfathom Deeps"] = "Profondeurs de Brassenoire",
["Blackrock Caverns"] = "Cavernes de Rochenoire",
["Blackrock Depths"] = "Profondeurs de Rochenoire",
["Blackrock Mountain"] = "Mont Rochenoire",
["Blackrock Spire"] = "Pic Rochenoire",
["Blackwind Lake"] = "Lac Noirvent",
["Blackwing Descent"] = "Descente de l'Aile noire",
["Blackwing Lair"] = "Repaire de l'Aile noire",
["Blade's Edge Arena"] = "Arène des Tranchantes",
["Blade's Edge Mountains"] = "Les Tranchantes",
["Blasted Lands"] = "Terres Foudroyées",
["Bloodmyst Isle"] = "Île de Brume-Sang",
["Booty Bay"] = "Baie-du-Butin",
["Borean Tundra"] = "Toundra Boréenne",
["Burning Steppes"] = "Steppes Ardentes",
Cathedral = "Cathédrale",
["Caverns of Time"] = "Grottes du temps",
["Champions' Hall"] = "Hall des Champions",
["Coilfang Reservoir"] = "Réservoir de Glissecroc",
Coldarra = "Frimarra",
["Cosmic map"] = "Carte cosmique",
["Crystal Spine"] = "Éperon de cristal",
["Crystalsong Forest"] = "Forêt du Chant de cristal",
Dalaran = "Dalaran",
["Dalaran Arena"] = "Arène de Dalaran",
["Dalaran Sewers"] = "Égouts de Dalaran",
["Darkmoon Faire"] = "Foire de Sombrelune",
Darkshore = "Sombrivage",
Darnassus = "Darnassus",
Deadmines = "Mortemines",
["Deadwind Pass"] = "Défilé de Deuillevent",
Deepholm = "Le Tréfonds",
["Deeprun Tram"] = "Tram des profondeurs",
Desolace = "Désolace",
["Dire Maul"] = "Hache-tripes",
["Dire Maul (East)"] = "Hache-tripes (Est)",
["Dire Maul (North)"] = "Hache-tripes (Nord)",
["Dire Maul (West)"] = "Hache-tripes (Ouest)",
Dragonblight = "Désolation des dragons",
["Drak'Tharon Keep"] = "Donjon de Drak'Tharon",
["Dun Morogh"] = "Dun Morogh",
Durotar = "Durotar",
Duskwood = "Bois de la Pénombre",
["Dustwallow Marsh"] = "Marécage d'Âprefange",
["Eastern Kingdoms"] = "Royaumes de l'est",
["Eastern Plaguelands"] = "Maleterres de l'Est",
["Elwynn Forest"] = "Forêt d'Elwynn",
Everlook = "Long-guet",
["Eversong Woods"] = "Bois des Chants éternels",
["Eye of the Storm"] = "L'Œil du cyclone",
Felwood = "Gangrebois",
Feralas = "Féralas",
Firelands = "Terres de Feu", -- Needs review
["Forge Camp: Terror"] = "Camp de forge : Terreur",
["Forge Camp: Wrath"] = "Camp de forge : Courroux",
["Frostwyrm Lair"] = "Repaire du wyrm de givre",
["Furywing's Perch"] = "Perchoir d'Aile-furie",
Gadgetzan = "Gadgetzan",
["Gates of Ahn'Qiraj"] = "Portes d'Ahn'Qiraj",
Ghostlands = "Les terres Fantômes",
Gilneas = "Gilnéas",
["Gilneas City"] = "Gilnéas",
Gnomeregan = "Gnomeregan",
Graveyard = "Cimetière",
["Grim Batol"] = "Grim Batol",
["Grizzly Hills"] = "Les Grisonnes",
["Grom'gol Base Camp"] = "Campement Grom'gol",
["Gruul's Lair"] = "Repaire de Gruul",
Gundrak = "Gundrak",
["Hall of Champions"] = "Hall des Champions",
["Hall of Legends"] = "Hall des Légendes",
["Halls of Lightning"] = "Les salles de Foudre",
["Halls of Origination"] = "Salles de l'Origine",
["Halls of Reflection"] = "Les salles des Reflets",
["Halls of Stone"] = "Les salles de Pierre",
["Hellfire Citadel"] = "Citadelle des Flammes infernales",
["Hellfire Peninsula"] = "Péninsule des Flammes infernales",
["Hellfire Ramparts"] = "Remparts des Flammes infernales",
["Hillsbrad Foothills"] = "Contreforts de Hautebrande",
["Horde Encampment"] = "Campement de la Horde",
["Howling Fjord"] = "Fjord Hurlant",
["Hrothgar's Landing"] = "Accostage de Hrothgar",
Hyjal = "Hyjal",
["Hyjal Summit"] = "Sommet d'Hyjal",
Icecrown = "La Couronne de glace",
["Icecrown Citadel"] = "Citadelle de la Couronne de glace",
["Insidion's Perch"] = "Perchoir d'Insidion",
Ironforge = "Forgefer",
["Isle of Conquest"] = "Île des Conquérants",
["Isle of Quel'Danas"] = "Île de Quel'Danas",
Kalimdor = "Kalimdor",
Karazhan = "Karazhan",
["Kelp'thar Forest"] = "Forêt de Varech'thar",
Kezan = "Kezan",
["Krasus' Landing"] = "Aire de Krasus",
Library = "Bibliothèque",
["Loch Modan"] = "Loch Modan",
["Lost City of the Tol'vir"] = "Cité perdue des Tol'vir",
["Lower Blackrock Spire"] = "Pic de Rochenoire inférieur",
["Magisters' Terrace"] = "Terrasse des Magistères",
["Magtheridon's Lair"] = "Le repaire de Magtheridon",
["Mana-Tombs"] = "Tombes-mana",
Maraudon = "Maraudon",
["Marshlight Lake"] = "Lac des furoles",
["Menethil Harbor"] = "Port de Menethil",
["Molten Core"] = "Cœur du Magma",
["Molten Front"] = "Front du Magma", -- Needs review
Moonglade = "Reflet-de-Lune",
["Mount Hyjal"] = "Mont Hyjal",
Mulgore = "Mulgore",
Nagrand = "Nagrand",
["Nagrand Arena"] = "Arène de Nagrand",
Naxxramas = "Naxxramas",
Netherstorm = "Raz-de-Néant",
["Night Elf Village"] = "Village elfe de la nuit",
["Northern Barrens"] = "Tarides du Nord",
["Northern Stranglethorn"] = "Strangleronce septentrionale",
Northrend = "Norfendre",
["Obsidia's Perch"] = "Perchoir d'Obsidia",
["Ogri'la"] = "Ogri'la",
["Old Hillsbrad Foothills"] = "Contreforts de Hautebrande d'antan",
["Old Stratholme"] = "L'Épuration de Stratholme",
["Onyxia's Lair"] = "Repaire d'Onyxia",
Orgrimmar = "Orgrimmar",
Outland = "Outreterre",
["Pit of Saron"] = "Fosse de Saron",
["Plaguelands: The Scarlet Enclave"] = "Maleterres : l'enclave Écarlate",
Plaguewood = "Pestebois",
["Quel'thalas"] = "Quel'thalas",
["Ragefire Chasm"] = "Gouffre de Ragefeu",
Ratchet = "Cabestan",
["Razorfen Downs"] = "Souilles de Tranchebauge",
["Razorfen Kraul"] = "Kraal de Tranchebauge",
["Redridge Mountains"] = "Les Carmines",
["Ring of Observance"] = "Cercle d'observance",
["Rivendark's Perch"] = "Perchoir de Clivenuit",
["Ruins of Ahn'Qiraj"] = "Ruines d'Ahn'Qiraj",
["Ruins of Gilneas"] = "Ruines de Gilnéas",
["Ruins of Gilneas City"] = "Ruines de Gilnéas (ville)",
["Ruins of Lordaeron"] = "Ruines de Lordaeron",
["Scalebeard's Cave"] = "Caverne de Barbe-d'écailles",
["Scarlet Monastery"] = "Monastère écarlate",
Scholomance = "Scholomance",
["Searing Gorge"] = "Gorge des Vents brûlants",
["Serpent Lake"] = "Lac des Serpents",
["Serpentshrine Cavern"] = "Caverne du sanctuaire du Serpent",
["Sethekk Halls"] = "Les salles des Sethekk",
["Shadow Labyrinth"] = "Labyrinthe des ombres",
["Shadowfang Keep"] = "Donjon d'Ombrecroc",
["Shadowmoon Valley"] = "Vallée d'Ombrelune",
["Shartuul's Transporter"] = "Transporteur de Shartuul",
Shattrath = "Shattrath",
["Shattrath City"] = "Shattrath",
["Shimmering Expanse"] = "Étendues Chatoyantes",
["Sholazar Basin"] = "Bassin de Sholazar",
Silithus = "Silithus",
["Silvermoon City"] = "Lune-d'argent",
["Silverpine Forest"] = "Forêt des Pins Argentés",
["Skyguard Outpost"] = "Avant-poste de la Garde-ciel",
["Skysong Lake"] = "Lac Chanteciel",
["Southern Barrens"] = "Tarides du Sud",
["Sporewind Lake"] = "Lac Ventespore",
Stonard = "Pierrêche",
["Stonetalon Mountains"] = "Les Serres-Rocheuses",
Stormwind = "Hurlevent",
["Stormwind City"] = "Hurlevent",
["Strand of the Ancients"] = "Rivage des anciens",
["Stranglethorn Vale"] = "Vallée de Strangleronce",
Stratholme = "Stratholme",
["Sunken Temple"] = "Temple englouti",
["Sunwell Plateau"] = "Plateau du Puits de soleil",
["Swamp of Sorrows"] = "Marais des Chagrins",
Tanaris = "Tanaris",
Teldrassil = "Teldrassil",
["Tempest Keep"] = "Donjon de la Tempête",
["Temple of Ahn'Qiraj"] = "Le temple d'Ahn'Qiraj",
["Terokk's Rest"] = "Repos de Terokk",
["Terokkar Forest"] = "Forêt de Terokkar",
["The Arachnid Quarter"] = "Le quartier des Arachnides",
["The Arcatraz"] = "L'Arcatraz",
["The Argent Coliseum"] = "Le colisée d'Argent",
["The Barrens"] = "Les Tarides",
["The Bastion of Twilight"] = "Le bastion du Crépuscule",
["The Battle for Gilneas"] = "La bataille de Gilnéas",
["The Black Morass"] = "Le Noir Marécage",
["The Blood Furnace"] = "La Fournaise du sang",
["The Bone Wastes"] = "Le désert des Ossements",
["The Botanica"] = "La Botanica",
["The Cape of Stranglethorn"] = "Cap Strangleronce",
["The Construct Quarter"] = "Le quartier des Assemblages",
["The Culling of Stratholme"] = "L'Épuration de Stratholme",
["The Dark Portal"] = "La Porte des ténèbres",
["The Deadmines"] = "Les Mortemines",
["The Descent into Madness"] = "La Descente dans la folie",
["The Exodar"] = "L'Exodar",
["The Eye"] = "L'Œil",
["The Eye of Eternity"] = "L'Œil de l'éternité",
["The Forbidding Sea"] = "La Mer interdite",
["The Forge of Souls"] = "La Forge des Âmes",
["The Frozen Halls"] = "Les salles Gelées",
["The Frozen Sea"] = "La mer Gelée",
["The Great Sea"] = "La Grande mer",
["The Halls of Winter"] = "Les salles de l'Hiver",
["The Hinterlands"] = "Les Hinterlands",
["The Lost Isles"] = "Les îles Perdues",
["The Maelstrom"] = "Le Maelström",
["The Mechanar"] = "Le Méchanar",
["The Military Quarter"] = "Le quartier Militaire",
["The Nexus"] = "Le Nexus",
["The North Sea"] = "La mer Boréale",
["The Obsidian Sanctum"] = "Le sanctum Obsidien",
["The Oculus"] = "L'Oculus",
["The Plague Quarter"] = "Le quartier de la Peste",
["The Prison of Yogg-Saron"] = "La prison de Yogg-Saron",
["The Ring of Valor"] = "L'Arène des valeureux",
["The Ruby Sanctum"] = "Le sanctum Rubis",
["The Scarlet Enclave"] = "L'enclave Écarlate",
["The Shattered Halls"] = "Les Salles brisées",
["The Slave Pens"] = "Les enclos aux esclaves",
["The Spark of Imagination"] = "L'Étincelle d'imagination",
["The Steamvault"] = "Le Caveau de la vapeur",
["The Stockade"] = "La Prison",
["The Stonecore"] = "Le Cœur-de-pierre",
["The Storm Peaks"] = "Les pics Foudroyés",
["The Temple of Atal'Hakkar"] = "Le temple d'Atal'Hakkar",
["The Underbog"] = "La Basse-tourbière",
["The Veiled Sea"] = "La Mer voilée",
["The Violet Hold"] = "Le fort Pourpre",
["The Vortex Pinnacle"] = "La cime du Vortex",
["Theramore Isle"] = "Île de Theramore",
["Thousand Needles"] = "Mille pointes",
["Throne of the Four Winds"] = "Trône des quatre vents",
["Throne of the Tides"] = "Trône des marées",
["Thunder Bluff"] = "Les Pitons-du-Tonnerre",
Tirisfal = "Tirisfal",
["Tirisfal Glades"] = "Clairières de Tirisfal",
["Tol Barad"] = "Tol Barad",
["Tol Barad Peninsula"] = "Péninsule de Tol Barad",
["Trial of the Champion"] = "L'épreuve du champion",
["Trial of the Crusader"] = "L'épreuve du croisé",
["Twilight Highlands"] = "Hautes-terres du Crépuscule",
["Twin Peaks"] = "Pics-Jumeaux",
["Twisting Nether"] = "Le Néant distordu",
Uldaman = "Uldaman",
Ulduar = "Ulduar",
Uldum = "Uldum",
["Un'Goro Crater"] = "Cratère d'Un'Goro",
Undercity = "Fossoyeuse",
["Upper Blackrock Spire"] = "Pic de Rochenoire supérieur",
["Utgarde Keep"] = "Donjon d'Utgarde",
["Utgarde Pinnacle"] = "Cime d'Utgarde",
["Vashj'ir"] = "Vashj'ir",
["Vault of Archavon"] = "Caveau d'Archavon",
["Vortex Pinnacle"] = "La cime du Vortex",
["Wailing Caverns"] = "Cavernes des lamentations",
["Warsong Gulch"] = "Goulet des Chanteguerres",
["Western Plaguelands"] = "Maleterres de l'Ouest",
Westfall = "Marche de l'Ouest",
Wetlands = "Les Paluns",
Wintergrasp = "Joug-d'hiver",
Winterspring = "Berceau-de-l'Hiver",
["Wyrmrest Temple"] = "Temple du Repos du ver",
Zangarmarsh = "Marécage de Zangar",
["Zul'Aman"] = "Zul'Aman",
["Zul'Drak"] = "Zul'Drak",
["Zul'Farrak"] = "Zul'Farrak",
["Zul'Gurub"] = "Zul'Gurub",
}
elseif GAME_LOCALE == "koKR" then
lib:SetCurrentTranslations {
["Abyssal Depths"] = "심연의 나락",
["Ahn'Qiraj"] = "안퀴라즈",
["Ahn'Qiraj: The Fallen Kingdom"] = "안퀴라즈: 무너진 왕국",
["Ahn'kahet: The Old Kingdom"] = "안카헤트: 고대 왕국",
["Alliance Base"] = "얼라이언스 주둔지",
["Alterac Mountains"] = "알터랙 산맥",
["Alterac Valley"] = "알터랙 계곡",
["Amani Pass"] = "아마니 고개",
["Arathi Basin"] = "아라시 분지",
["Arathi Highlands"] = "아라시 고원",
Armory = "무기고",
Ashenvale = "잿빛 골짜기",
Auberdine = "아우버다인",
["Auchenai Crypts"] = "아키나이 납골당",
Auchindoun = "아킨둔",
Azeroth = "아제로스",
["Azjol-Nerub"] = "아졸네룹",
Azshara = "아즈샤라",
["Azuremyst Isle"] = "하늘안개 섬",
Badlands = "황야의 땅",
["Baradin Hold"] = "바라딘 요새",
["Bash'ir Landing"] = "바쉬르 영지",
["Battle for Gilneas"] = "길니아스 전투",
["Black Temple"] = "검은 사원",
["Blackfathom Deeps"] = "검은심연의 나락",
["Blackrock Caverns"] = "검은바위 동굴",
["Blackrock Depths"] = "검은바위 나락",
["Blackrock Mountain"] = "검은바위 산",
["Blackrock Spire"] = "검은바위 첨탑",
["Blackwind Lake"] = "검은바람 호수",
["Blackwing Descent"] = "검은날개 강림지",
["Blackwing Lair"] = "검은날개 둥지",
["Blade's Edge Arena"] = "칼날 투기장",
["Blade's Edge Mountains"] = "칼날 산맥",
["Blasted Lands"] = "저주받은 땅",
["Bloodmyst Isle"] = "핏빛안개 섬",
["Booty Bay"] = "무법항",
["Borean Tundra"] = "북풍의 땅",
["Burning Steppes"] = "불타는 평원",
Cathedral = "대성당",
["Caverns of Time"] = "시간의 동굴",
["Champions' Hall"] = "용사의 전당",
["Coilfang Reservoir"] = "갈퀴송곳니 저수지",
Coldarra = "콜다라",
["Cosmic map"] = "세계 지도",
["Crystal Spine"] = "수정 돌기",
["Crystalsong Forest"] = "수정노래 숲",
Dalaran = "달라란",
["Dalaran Arena"] = "달라란 투기장",
["Dalaran Sewers"] = "달라란 하수도",
["Darkmoon Faire"] = "다크문 축제",
Darkshore = "어둠의 해안",
Darnassus = "다르나서스",
Deadmines = "죽음의 폐광",
["Deadwind Pass"] = "저승바람 고개",
Deepholm = "심원의 영지",
["Deeprun Tram"] = "깊은굴 지하철",
Desolace = "잊혀진 땅",
["Dire Maul"] = "혈투의 전장",
["Dire Maul (East)"] = "혈투의 전장 동부",
["Dire Maul (North)"] = "혈투의 전장 북부",
["Dire Maul (West)"] = "혈투의 전장 서부",
Dragonblight = "용의 안식처",
["Drak'Tharon Keep"] = "드락타론 성채",
["Dun Morogh"] = "던 모로",
Durotar = "듀로타",
Duskwood = "그늘숲",
["Dustwallow Marsh"] = "먼지진흙 습지대",
["Eastern Kingdoms"] = "동부 왕국",
["Eastern Plaguelands"] = "동부 역병지대",
["Elwynn Forest"] = "엘윈 숲",
Everlook = "눈망루 마을",
["Eversong Woods"] = "영원노래 숲",
["Eye of the Storm"] = "폭풍의 눈",
Felwood = "악령의 숲",
Feralas = "페랄라스",
Firelands = "불의 땅",
["Forge Camp: Terror"] = "공포의 괴철로 기지",
["Forge Camp: Wrath"] = "격노의 괴철로 기지",
["Frostwyrm Lair"] = "서리고룡의 방",
["Furywing's Perch"] = "퓨리윙의 둥지",
Gadgetzan = "가젯잔",
["Gates of Ahn'Qiraj"] = "안퀴라즈 성문",
Ghostlands = "유령의 땅",
Gilneas = "길니아스",
["Gilneas City"] = "길니아스 시",
Gnomeregan = "놈리건",
Graveyard = "묘지",
["Grim Batol"] = "그림 바톨",
["Grizzly Hills"] = "회색 구릉지",
["Grom'gol Base Camp"] = "그롬골 주둔지",
["Gruul's Lair"] = "그룰의 둥지",
Gundrak = "군드락",
["Hall of Champions"] = "용사의 전당",
["Hall of Legends"] = "전설의 전당",
["Halls of Lightning"] = "번개의 전당",
["Halls of Origination"] = "시초의 전당",
["Halls of Reflection"] = "투영의 전당",
["Halls of Stone"] = "돌의 전당",
["Hellfire Citadel"] = "지옥불 성채",
["Hellfire Peninsula"] = "지옥불 반도",
["Hellfire Ramparts"] = "지옥불 성루",
["Hillsbrad Foothills"] = "언덕마루 구릉지",
["Horde Encampment"] = "호드 야영지",
["Howling Fjord"] = "울부짖는 협만",
["Hrothgar's Landing"] = "흐로스가르 상륙지",
Hyjal = "하이잘",
["Hyjal Summit"] = "하이잘 정상",
Icecrown = "얼음왕관",
["Icecrown Citadel"] = "얼음왕관 성채",
["Insidion's Perch"] = "인시디온의 둥지",
Ironforge = "아이언포지",
["Isle of Conquest"] = "정복의 섬",
["Isle of Quel'Danas"] = "쿠엘다나스 섬",
Kalimdor = "칼림도어",
Karazhan = "카라잔",
["Kelp'thar Forest"] = "켈프타르 숲",
Kezan = "케잔",
["Krasus' Landing"] = "크라서스 착륙장",
Library = "도서관",
["Loch Modan"] = "모단 호수",
["Lost City of the Tol'vir"] = "톨비르의 잃어버린 도시",
["Lower Blackrock Spire"] = "검은바위 첨탑 하층",
["Magisters' Terrace"] = "마법학자의 정원",
["Magtheridon's Lair"] = "마그테리돈의 둥지",
["Mana-Tombs"] = "마나 무덤",
Maraudon = "마라우돈",
["Marshlight Lake"] = "수렁등불 호수",
["Menethil Harbor"] = "메네실 항구",
["Molten Core"] = "화산 심장부",
["Molten Front"] = "녹아내린 전초지", -- Needs review
Moonglade = "달의 숲",
["Mount Hyjal"] = "하이잘 산",
Mulgore = "멀고어",
Nagrand = "나그란드",
["Nagrand Arena"] = "나그란드 투기장",
Naxxramas = "낙스라마스",
Netherstorm = "황천의 폭풍",
["Night Elf Village"] = "나이트 엘프 마을",
["Northern Barrens"] = "북부 불모의 땅",
["Northern Stranglethorn"] = "북부 가시덤불",
Northrend = "노스렌드",
["Obsidia's Perch"] = "옵시디아의 둥지",
["Ogri'la"] = "오그릴라",
["Old Hillsbrad Foothills"] = "옛 힐스브래드 구릉지",
["Old Stratholme"] = "옛 스트라솔름",
["Onyxia's Lair"] = "오닉시아의 둥지",
Orgrimmar = "오그리마",
Outland = "아웃랜드",
["Pit of Saron"] = "사론의 구덩이",
["Plaguelands: The Scarlet Enclave"] = "동부 역병지대: 붉은십자군 초소",
Plaguewood = "역병의 숲",
["Quel'thalas"] = "쿠엘탈라스",
["Ragefire Chasm"] = "성난불길 협곡",
Ratchet = "톱니항",
["Razorfen Downs"] = "가시덩굴 구릉",
["Razorfen Kraul"] = "가시덩굴 우리",
["Redridge Mountains"] = "붉은마루 산맥",
["Ring of Observance"] = "규율의 광장",
["Rivendark's Perch"] = "리븐다크의 둥지",
["Ruins of Ahn'Qiraj"] = "안퀴라즈 폐허",
["Ruins of Gilneas"] = "길니아스 폐허",
["Ruins of Gilneas City"] = "길니아스 시 폐허",
["Ruins of Lordaeron"] = "로데론의 폐허",
["Scalebeard's Cave"] = "비늘수염 동굴",
["Scarlet Monastery"] = "붉은십자군 수도원",
Scholomance = "스칼로맨스",
["Searing Gorge"] = "이글거리는 협곡",
["Serpent Lake"] = "물갈퀴 호수",
["Serpentshrine Cavern"] = "불뱀 제단",
["Sethekk Halls"] = "세데크 전당",
["Shadow Labyrinth"] = "어둠의 미궁",
["Shadowfang Keep"] = "그림자송곳니 성채",
["Shadowmoon Valley"] = "어둠달 골짜기",
["Shartuul's Transporter"] = "샤툴의 순간이동기",
Shattrath = "샤트라스",
["Shattrath City"] = "샤트라스",
["Shimmering Expanse"] = "흐린빛 벌판",
["Sholazar Basin"] = "숄라자르 분지",
Silithus = "실리더스",
["Silvermoon City"] = "실버문",
["Silverpine Forest"] = "은빛소나무 숲",
["Skyguard Outpost"] = "하늘경비대 전초기지",
["Skysong Lake"] = "하늘노래 호수",
["Southern Barrens"] = "남부 불모의 땅",
["Sporewind Lake"] = "포자바람 호수",
Stonard = "스토나드",
["Stonetalon Mountains"] = "돌발톱 산맥",
Stormwind = "스톰윈드",
["Stormwind City"] = "스톰윈드",
["Strand of the Ancients"] = "고대의 해안",
["Stranglethorn Vale"] = "가시덤불 골짜기",
Stratholme = "스트라솔름",
["Sunken Temple"] = "가라앉은 사원",
["Sunwell Plateau"] = "태양샘 고원",
["Swamp of Sorrows"] = "슬픔의 늪",
Tanaris = "타나리스",
Teldrassil = "텔드랏실",
["Tempest Keep"] = "폭풍우 요새",
["Temple of Ahn'Qiraj"] = "안퀴라즈 사원",
["Terokk's Rest"] = "테로크의 안식처",
["Terokkar Forest"] = "테로카르 숲",
["The Arachnid Quarter"] = "거미 지구",
["The Arcatraz"] = "알카트라즈",
["The Argent Coliseum"] = "십자군 원형경기장",
["The Barrens"] = "불모의 땅",
["The Bastion of Twilight"] = "황혼의 요새",
["The Battle for Gilneas"] = "길니아스 전투지",
["The Black Morass"] = "검은늪",
["The Blood Furnace"] = "피의 용광로",
["The Bone Wastes"] = "해골 무덤",
["The Botanica"] = "신록의 정원",
["The Cape of Stranglethorn"] = "가시덤불 곶",
["The Construct Quarter"] = "피조물 지구",
["The Culling of Stratholme"] = "옛 스트라솔름",
["The Dark Portal"] = "어둠의 문",
["The Deadmines"] = "죽음의 폐광",
["The Descent into Madness"] = "광기의 내리막길",
["The Exodar"] = "엑소다르",
["The Eye"] = "눈",
["The Eye of Eternity"] = "영원의 눈",
["The Forbidding Sea"] = "성난폭풍 해안",
["The Forge of Souls"] = "영혼의 제련소",
["The Frozen Halls"] = "얼어붙은 전당",
["The Frozen Sea"] = "얼어붙은 바다",
["The Great Sea"] = "대해",
["The Halls of Winter"] = "겨울의 전당",
["The Hinterlands"] = "동부 내륙지",
["The Lost Isles"] = "잃어버린 섬",
["The Maelstrom"] = "혼돈의 소용돌이",
["The Mechanar"] = "메카나르",
["The Military Quarter"] = "군사 지구",
["The Nexus"] = "마력의 탑",
["The North Sea"] = "북해",
["The Obsidian Sanctum"] = "흑요석 성소",
["The Oculus"] = "마력의 눈",
["The Plague Quarter"] = "역병 지구",
["The Prison of Yogg-Saron"] = "요그사론의 감옥",
["The Ring of Valor"] = "용맹의 투기장",
["The Ruby Sanctum"] = "루비 성소",
["The Scarlet Enclave"] = "진홍빛 전당",
["The Shattered Halls"] = "으스러진 손의 전당",
["The Slave Pens"] = "강제 노역소",
["The Spark of Imagination"] = "상상의 작업실",
["The Steamvault"] = "증기 저장고",
["The Stockade"] = "스톰윈드 지하감옥",
["The Stonecore"] = "바위심장부",
["The Storm Peaks"] = "폭풍우 봉우리",
["The Temple of Atal'Hakkar"] = "아탈학카르 신전",
["The Underbog"] = "지하수렁",
["The Veiled Sea"] = "장막의 바다",
["The Violet Hold"] = "보랏빛 요새",
["The Vortex Pinnacle"] = "소용돌이 누각",
["Theramore Isle"] = "테라모어 섬",
["Thousand Needles"] = "버섯구름 봉우리",
["Throne of the Four Winds"] = "네 바람의 왕좌",
["Throne of the Tides"] = "파도의 왕좌",
["Thunder Bluff"] = "썬더 블러프",
Tirisfal = "티리스팔",
["Tirisfal Glades"] = "티리스팔 숲",
["Tol Barad"] = "톨 바라드",
["Tol Barad Peninsula"] = "톨 바라드 반도",
["Trial of the Champion"] = "용사의 시험장",
["Trial of the Crusader"] = "십자군의 시험장",
["Twilight Highlands"] = "황혼의 고원",
["Twin Peaks"] = "쌍둥이 봉우리",
["Twisting Nether"] = "뒤틀린 황천",
Uldaman = "울다만",
Ulduar = "울두아르",
Uldum = "울둠",
["Un'Goro Crater"] = "운고로 분화구",
Undercity = "언더시티",
["Upper Blackrock Spire"] = "검은바위 첨탑 상층",
["Utgarde Keep"] = "우트가드 성채",
["Utgarde Pinnacle"] = "우트가드 첨탑",
["Vashj'ir"] = "바쉬르",
["Vault of Archavon"] = "아카본 석실",
["Vortex Pinnacle"] = "소용돌이 누각 ",
["Wailing Caverns"] = "통곡의 동굴",
["Warsong Gulch"] = "전쟁노래 협곡",
["Western Plaguelands"] = "서부 역병지대",
Westfall = "서부 몰락지대",
Wetlands = "저습지",
Wintergrasp = "겨울손아귀 호수",
Winterspring = "여명의 설원",
["Wyrmrest Temple"] = "고룡쉼터 사원",
Zangarmarsh = "장가르 습지대",
["Zul'Aman"] = "줄아만",
["Zul'Drak"] = "줄드락",
["Zul'Farrak"] = "줄파락",
["Zul'Gurub"] = "줄구룹",
}
elseif GAME_LOCALE == "esES" then
lib:SetCurrentTranslations {
["Abyssal Depths"] = "Profundidades Abisales",
["Ahn'Qiraj"] = "Ahn'Qiraj",
["Ahn'Qiraj: The Fallen Kingdom"] = "Ahn'Qiraj: El Reino Caído",
["Ahn'kahet: The Old Kingdom"] = "Ahn'kahet: El Antiguo Reino",
["Alliance Base"] = "Base de la Alianza",
["Alterac Mountains"] = "Montañas de Alterac",
["Alterac Valley"] = "Valle de Alterac",
["Amani Pass"] = "Paso de Amani",
["Arathi Basin"] = "Cuenca de Arathi",
["Arathi Highlands"] = "Tierras Altas de Arathi",
Armory = "Armería",
Ashenvale = "Vallefresno",
Auberdine = "Auberdine",
["Auchenai Crypts"] = "Criptas Auchenai",
Auchindoun = "Auchindoun",
Azeroth = "Azeroth",
["Azjol-Nerub"] = "Azjol-Nerub",
Azshara = "Azshara",
["Azuremyst Isle"] = "Isla Bruma Azur",
Badlands = "Tierras Inhóspitas",
["Baradin Hold"] = "Bastión de Baradin",
["Bash'ir Landing"] = "Zona de aterrizaje Bash'ir",
["Battle for Gilneas"] = "La Batalla por Gilneas",
["Black Temple"] = "El Templo Oscuro",
["Blackfathom Deeps"] = "Cavernas de Brazanegra",
["Blackrock Caverns"] = "Cavernas Roca Negra",
["Blackrock Depths"] = "Profundidades de Roca Negra",
["Blackrock Mountain"] = "Montaña Roca Negra",
["Blackrock Spire"] = "Cumbre de Roca Negra",
["Blackwind Lake"] = "Lago Vientonegro",
["Blackwing Descent"] = "Descenso de Alanegra",
["Blackwing Lair"] = "Guarida Alanegra",
["Blade's Edge Arena"] = "Arena Filospada",
["Blade's Edge Mountains"] = "Montañas Filospada",
["Blasted Lands"] = "Las Tierras Devastadas",
["Bloodmyst Isle"] = "Isla Bruma de Sangre",
["Booty Bay"] = "Bahía del Botín",
["Borean Tundra"] = "Tundra Boreal",
["Burning Steppes"] = "Las Estepas Ardientes",
Cathedral = "Catedral",
["Caverns of Time"] = "Cavernas del Tiempo",
["Champions' Hall"] = "Sala de los Campeones",
["Coilfang Reservoir"] = "Reserva Colmillo Torcido",
Coldarra = "Gelidar",
["Cosmic map"] = "Mapa cósmico",
["Crystal Spine"] = "Espina de Cristal",
["Crystalsong Forest"] = "Bosque Canto de Cristal",
Dalaran = "Dalaran",
["Dalaran Arena"] = "Arena de Dalaran",
["Dalaran Sewers"] = "Cloacas de Dalaran",
["Darkmoon Faire"] = "Feria de la Luna Negra",
Darkshore = "Costa Oscura",
Darnassus = "Darnassus",
Deadmines = "Las Minas de la Muerte",
["Deadwind Pass"] = "Paso de la Muerte",
Deepholm = "Infralar",
["Deeprun Tram"] = "Tranvía Subterráneo",
Desolace = "Desolace",
["Dire Maul"] = "La Masacre",
["Dire Maul (East)"] = "La Masacre (Este)",
["Dire Maul (North)"] = "La Masacre (Norte)",
["Dire Maul (West)"] = "La Masacre (Oeste)",
Dragonblight = "Cementerio de Dragones",
["Drak'Tharon Keep"] = "Fortaleza de Drak'Tharon",
["Dun Morogh"] = "Dun Morogh",
Durotar = "Durotar",
Duskwood = "Bosque del Ocaso",
["Dustwallow Marsh"] = "Marjal Revolcafango",
["Eastern Kingdoms"] = "Reinos del Este",
["Eastern Plaguelands"] = "Tierras de la Peste del Este",
["Elwynn Forest"] = "Bosque de Elwynn",
Everlook = "Vista Eterna",
["Eversong Woods"] = "Bosque Canción Eterna",
["Eye of the Storm"] = "Ojo de la Tormenta",
Felwood = "Frondavil",
Feralas = "Feralas",
Firelands = "Tierras de Fuego", -- Needs review
["Forge Camp: Terror"] = "Campamento forja: Terror",
["Forge Camp: Wrath"] = "Campamento forja: Cólera",
["Frostwyrm Lair"] = "Guarida de Vermis de Escarcha",
["Furywing's Perch"] = "Nido de Alafuria",
Gadgetzan = "Gadgetzan",
["Gates of Ahn'Qiraj"] = "Puertas de Ahn'Qiraj",
Ghostlands = "Tierras Fantasma",
Gilneas = "Gilneas",
["Gilneas City"] = "Ciudad de Gilneas",
Gnomeregan = "Gnomeregan",
Graveyard = "Cementerio",
["Grim Batol"] = "Grim Batol",
["Grizzly Hills"] = "Colinas Pardas",
["Grom'gol Base Camp"] = "Campamento Grom'gol",
["Gruul's Lair"] = "Guarida de Gruul",
Gundrak = "Gundrak",
["Hall of Champions"] = "Sala de los Campeones",
["Hall of Legends"] = "Sala de las Leyendas",
["Halls of Lightning"] = "Cámaras de Relámpagos",
["Halls of Origination"] = "Cámaras de los Orígenes",
["Halls of Reflection"] = "Cámaras de Reflexión",
["Halls of Stone"] = "Cámaras de Piedra",
["Hellfire Citadel"] = "Ciudadela del Fuego Infernal",
["Hellfire Peninsula"] = "Península del Fuego Infernal",
["Hellfire Ramparts"] = "Murallas del Fuego Infernal",
["Hillsbrad Foothills"] = "Laderas de Trabalomas",
["Horde Encampment"] = "Campamento Horda",
["Howling Fjord"] = "Fiordo Aquilonal",
["Hrothgar's Landing"] = "Desembarco de Hrothgar",
Hyjal = "Hyjal",
["Hyjal Summit"] = "Cima Hyjal",
Icecrown = "Corona de Hielo",
["Icecrown Citadel"] = "Ciudadela de la Corona de Hielo",
["Insidion's Perch"] = "Nido de Insidion",
Ironforge = "Forjaz",
["Isle of Conquest"] = "Isla de la Conquista",
["Isle of Quel'Danas"] = "Isla de Quel'Danas",
Kalimdor = "Kalimdor",
Karazhan = "Karazhan",
["Kelp'thar Forest"] = "Bosque Kelp'thar",
Kezan = "Kezan",
["Krasus' Landing"] = "Krasus' Landing",
Library = "Biblioteca",
["Loch Modan"] = "Loch Modan",
["Lost City of the Tol'vir"] = "Ciudad Perdida de los Tol'vir",
["Lower Blackrock Spire"] = "Cumbre inferior de Roca Negra",
["Magisters' Terrace"] = "Bancal del Magister",
["Magtheridon's Lair"] = "Guarida de Magtheridon",
["Mana-Tombs"] = "Tumbas de Maná",
Maraudon = "Maraudon",
["Marshlight Lake"] = "Lago Luz Pantanosa",
["Menethil Harbor"] = "Puerto de Menethil",
["Molten Core"] = "Núcleo de Magma",
["Molten Front"] = "Frente de Magma", -- Needs review
Moonglade = "Claro de la Luna",
["Mount Hyjal"] = "Monte Hyjal",
Mulgore = "Mulgore",
Nagrand = "Nagrand",
["Nagrand Arena"] = "Arena de Nagrand",
Naxxramas = "Naxxramas",
Netherstorm = "Tormenta Abisal",
["Night Elf Village"] = "Poblado Elfo de la Noche",
["Northern Barrens"] = "Los Baldíos del Norte",
["Northern Stranglethorn"] = "Norte de la Vega de Tuercespina",
Northrend = "Rasganorte",
["Obsidia's Perch"] = "Nido de Obsidia",
["Ogri'la"] = "Ogri'la",
["Old Hillsbrad Foothills"] = "Antiguas Laderas de Trabalomas",
["Old Stratholme"] = "Stratholme en el pasado",
["Onyxia's Lair"] = "Guarida de Onyxia",
Orgrimmar = "Orgrimmar",
Outland = "Terrallende",
["Pit of Saron"] = "Foso de Saron",
["Plaguelands: The Scarlet Enclave"] = "Tierras de la Peste del Este: El Enclave Escarlata",
Plaguewood = "Bosque de la Plaga",
["Quel'thalas"] = "Quel'thalas",
["Ragefire Chasm"] = "Sima ígnea",
Ratchet = "Trinquete",
["Razorfen Downs"] = "Zahúrda Rajacieno",
["Razorfen Kraul"] = "Horado Rajacieno",
["Redridge Mountains"] = "Montañas Crestagrana",
["Ring of Observance"] = "Círculo de la Observancia",
["Rivendark's Perch"] = "Nido de Desgarro Oscuro",
["Ruins of Ahn'Qiraj"] = "Ruinas de Ahn'Qiraj",
["Ruins of Gilneas"] = "Ruinas de Gilneas",
["Ruins of Gilneas City"] = "Ruinas de la Ciudad de Gilneas",
["Ruins of Lordaeron"] = "Ruinas de Lordaeron",
["Scalebeard's Cave"] = "Cueva de Barbascamas",
["Scarlet Monastery"] = "Monasterio Escarlata",
Scholomance = "Scholomance",
["Searing Gorge"] = "La Garganta de Fuego",
["Serpent Lake"] = "Lago Serpiente",
["Serpentshrine Cavern"] = "Caverna Santuario Serpiente",
["Sethekk Halls"] = "Salas Sethekk",
["Shadow Labyrinth"] = "Laberinto de las Sombras",
["Shadowfang Keep"] = "Castillo de Colmillo Oscuro",
["Shadowmoon Valley"] = "Valle Sombraluna",
["Shartuul's Transporter"] = "Transportador de Shartuul",
Shattrath = "Shattrath",
["Shattrath City"] = "Ciudad de Shattrath",
["Shimmering Expanse"] = "Extensión Bruñida",
["Sholazar Basin"] = "Cuenca de Sholazar",
Silithus = "Silithus",
["Silvermoon City"] = "Ciudad de Lunargenta",
["Silverpine Forest"] = "Bosque de Argénteos",
["Skyguard Outpost"] = "Puesto de la Guardia de Cielo",
["Skysong Lake"] = "Lago Sol Celeste",
["Southern Barrens"] = "Los Baldíos del Sur",
["Sporewind Lake"] = "Lago Espora Volante",
Stonard = "Rocal",
["Stonetalon Mountains"] = "Sierra Espolón",
Stormwind = "Ventormenta",
["Stormwind City"] = "Ciudad de Ventormenta",
["Strand of the Ancients"] = "Playa de los Ancestros",
["Stranglethorn Vale"] = "Vega de Tuercespina",
Stratholme = "Stratholme",
["Sunken Temple"] = "El Templo Sumergido",
["Sunwell Plateau"] = "Meseta de la Fuente del Sol",
["Swamp of Sorrows"] = "Pantano de las Penas",
Tanaris = "Tanaris",
Teldrassil = "Teldrassil",
["Tempest Keep"] = "El Castillo de la Tempestad",
["Temple of Ahn'Qiraj"] = "El Templo de Ahn'Qiraj",
["Terokk's Rest"] = "Sosiego de Terokk",
["Terokkar Forest"] = "Bosque de Terokkar",
["The Arachnid Quarter"] = "Ala Arácnida",
["The Arcatraz"] = "El Alcatraz",
["The Argent Coliseum"] = "El Coliseo Argenta",
["The Barrens"] = "Los Baldíos",
["The Bastion of Twilight"] = "El Bastión del Crepúsculo",
["The Battle for Gilneas"] = "La Batalla por Gilneas",
["The Black Morass"] = "La Ciénaga Negra",
["The Blood Furnace"] = "El Horno de Sangre",
["The Bone Wastes"] = "El Vertedero de Huesos",
["The Botanica"] = "El Invernáculo",
["The Cape of Stranglethorn"] = "El Cabo de Tuercespina",
["The Construct Quarter"] = "Ala de Abominación",
["The Culling of Stratholme"] = "La Matanza de Stratholme",
["The Dark Portal"] = "El Portal Oscuro",
["The Deadmines"] = "Las Minas de la Muerte",
["The Descent into Madness"] = "Descenso a la Locura",
["The Exodar"] = "El Exodar",
["The Eye"] = "El Ojo",
["The Eye of Eternity"] = "El Ojo de la Eternidad",
["The Forbidding Sea"] = "Mar Adusto",
["The Forge of Souls"] = "La Forja de Almas",
["The Frozen Halls"] = "Las Cámaras Heladas",
["The Frozen Sea"] = "El Mar Gélido",
["The Great Sea"] = "Mare Magnum",
["The Halls of Winter"] = "Las Cámaras del Invierno",
["The Hinterlands"] = "Tierras del Interior",
["The Lost Isles"] = "Las Islas Perdidas",
["The Maelstrom"] = "La Vorágine",
["The Mechanar"] = "El Mechanar",
["The Military Quarter"] = "Ala Militar",
["The Nexus"] = "El Nexo",
["The North Sea"] = "El Mar del Norte",
["The Obsidian Sanctum"] = "El Sagrario Obsidiana",
["The Oculus"] = "El Oculus",
["The Plague Quarter"] = "Ala de la Plaga",
["The Prison of Yogg-Saron"] = "La Prisión de Yogg-Saron",
["The Ring of Valor"] = "El Anillo del Valor",
["The Ruby Sanctum"] = "El Sagrario Rubí",
["The Scarlet Enclave"] = "Tierras de la Peste: El Enclave Escarlata",
["The Shattered Halls"] = "Las Salas Arrasadas",
["The Slave Pens"] = "Recinto de los Esclavos",
["The Spark of Imagination"] = "Cámaras de la Invención",
["The Steamvault"] = "La Cámara de Vapor",
["The Stockade"] = "Las Mazmorras",
["The Stonecore"] = "El Núcleo Pétreo",
["The Storm Peaks"] = "Las Cumbres Tormentosas",
["The Temple of Atal'Hakkar"] = "El Templo de Atal'Hakkar",
["The Underbog"] = "La Sotiénaga",
["The Veiled Sea"] = "Mar de la Bruma",
["The Violet Hold"] = "El Bastión Violeta",
["The Vortex Pinnacle"] = "La Cumbre del Vórtice",
["Theramore Isle"] = "Isla Theramore",
["Thousand Needles"] = "Las Mil Agujas",
["Throne of the Four Winds"] = "Trono de los Cuatro Vientos",
["Throne of the Tides"] = "Trono de las Mareas",
["Thunder Bluff"] = "Cima del Trueno",
Tirisfal = "Tirisfal",
["Tirisfal Glades"] = "Claros de Tirisfal",
["Tol Barad"] = "Tol Barad",
["Tol Barad Peninsula"] = "Península de Tol Barad",
["Trial of the Champion"] = "Prueba del Cruzado",
["Trial of the Crusader"] = "Prueba del Cruzado",
["Twilight Highlands"] = "Tierras Altas Crepusculares",
["Twin Peaks"] = "Cumbres Gemelas",
["Twisting Nether"] = "El Vacío Abisal",
Uldaman = "Uldaman",
Ulduar = "Ulduar",
Uldum = "Uldum",
["Un'Goro Crater"] = "Cráter de Un'Goro",
Undercity = "Entrañas",
["Upper Blackrock Spire"] = "Cumbre de Roca Negra",
["Utgarde Keep"] = "Fortaleza de Utgarde",
["Utgarde Pinnacle"] = "Pináculo de Utgarde",
["Vashj'ir"] = "Vashj'ir",
["Vault of Archavon"] = "La Cámara de Archavon",
["Vortex Pinnacle"] = "La Cumbre del Vórtice",
["Wailing Caverns"] = "Cuevas de los Lamentos",
["Warsong Gulch"] = "Garganta Grito de Guerra",
["Western Plaguelands"] = "Tierras de la Peste del Oeste",
Westfall = "Páramos de Poniente",
Wetlands = "Los Humedales",
Wintergrasp = "Conquista del Invierno",
Winterspring = "Cuna del Invierno",
["Wyrmrest Temple"] = "Templo del Reposo del Dragón",
Zangarmarsh = "Marisma de Zangar",
["Zul'Aman"] = "Zul'Aman",
["Zul'Drak"] = "Zul'Drak",
["Zul'Farrak"] = "Zul'Farrak",
["Zul'Gurub"] = "Zul'Gurub",
}
elseif GAME_LOCALE == "esMX" then
lib:SetCurrentTranslations {
["Abyssal Depths"] = "Profundidades Abisales", -- Needs review
["Ahn'Qiraj"] = "Ahn'Qiraj",
["Ahn'Qiraj: The Fallen Kingdom"] = "Ahn'Qiraj: El Reino Caído", -- Needs review
["Ahn'kahet: The Old Kingdom"] = "Ahn'kahet: El Antiguo Reino",
["Alliance Base"] = "Base de la Alianza",
["Alterac Mountains"] = "Montañas de Alterac",
["Alterac Valley"] = "Valle de Alterac",
["Amani Pass"] = "Paso de Amani",
["Arathi Basin"] = "Cuenca de Arathi",
["Arathi Highlands"] = "Tierras Altas de Arathi",
Armory = "Armería",
Ashenvale = "Vallefresno",
Auberdine = "Auberdine",
["Auchenai Crypts"] = "Criptas Auchenai",
Auchindoun = "Auchindoun",
Azeroth = "Azeroth",
["Azjol-Nerub"] = "Azjol-Nerub",
Azshara = "Azshara",
["Azuremyst Isle"] = "Isla Bruma Azur",
Badlands = "Tierras Inhóspitas",
["Baradin Hold"] = "Bastión de Baradin", -- Needs review
["Bash'ir Landing"] = "Zona de aterrizaje Bash'ir",
["Battle for Gilneas"] = "La Batalla por Gilneas", -- Needs review
["Black Temple"] = "El Templo Oscuro",
["Blackfathom Deeps"] = "Cavernas de Brazanegra",
["Blackrock Caverns"] = "Cavernas Roca Negra", -- Needs review
["Blackrock Depths"] = "Profundidades de Roca Negra",
["Blackrock Mountain"] = "Montaña Roca Negra",
["Blackrock Spire"] = "Cumbre de Roca Negra",
["Blackwind Lake"] = "Lago Vientonegro",
["Blackwing Descent"] = "Descenso de Alanegra", -- Needs review
["Blackwing Lair"] = "Guarida Alanegra",
["Blade's Edge Arena"] = "Arena Filospada",
["Blade's Edge Mountains"] = "Montañas Filospada",
["Blasted Lands"] = "Las Tierras Devastadas",
["Bloodmyst Isle"] = "Isla Bruma de Sangre",
["Booty Bay"] = "Bahía del Botín",
["Borean Tundra"] = "Tundra Boreal",
["Burning Steppes"] = "Las Estepas Ardientes",
Cathedral = "Catedral",
["Caverns of Time"] = "Cavernas del Tiempo",
["Champions' Hall"] = "Sala de los Campeones",
["Coilfang Reservoir"] = "Reserva Colmillo Torcido",
Coldarra = "Gelidar",
["Cosmic map"] = "Mapa cósmico",
["Crystal Spine"] = "Espina de Cristal",
["Crystalsong Forest"] = "Bosque Canto de Cristal",
Dalaran = "Dalaran",
["Dalaran Arena"] = "Arena de Dalaran",
["Dalaran Sewers"] = "Cloacas de Dalaran",
["Darkmoon Faire"] = "Feria de la Luna Negra",
Darkshore = "Costa Oscura",
Darnassus = "Darnassus",
Deadmines = "Las Minas de la Muerte", -- Needs review
["Deadwind Pass"] = "Paso de la Muerte",
Deepholm = "Infralar", -- Needs review
["Deeprun Tram"] = "Tranvía Subterráneo",
Desolace = "Desolace",
["Dire Maul"] = "La Masacre",
["Dire Maul (East)"] = "La Masacre (Este)",
["Dire Maul (North)"] = "La Masacre (Norte)",
["Dire Maul (West)"] = "La Masacre (Oeste)",
Dragonblight = "Cementerio de Dragones",
["Drak'Tharon Keep"] = "Fortaleza de Drak'Tharon",
["Dun Morogh"] = "Dun Morogh",
Durotar = "Durotar",
Duskwood = "Bosque del Ocaso",
["Dustwallow Marsh"] = "Marjal Revolcafango",
["Eastern Kingdoms"] = "Reinos del Este",
["Eastern Plaguelands"] = "Tierras de la Peste del Este",
["Elwynn Forest"] = "Bosque de Elwynn",
Everlook = "Vista Eterna",
["Eversong Woods"] = "Bosque Canción Eterna",
["Eye of the Storm"] = "Ojo de la Tormenta",
Felwood = "Frondavil",
Feralas = "Feralas",
Firelands = "Tierras de Fuego", -- Needs review
["Forge Camp: Terror"] = "Campamento forja: Terror",
["Forge Camp: Wrath"] = "Campamento forja: Cólera",
["Frostwyrm Lair"] = "Guarida de Vermis de Escarcha",
["Furywing's Perch"] = "Nido de Alafuria",
Gadgetzan = "Gadgetzan",
["Gates of Ahn'Qiraj"] = "Puertas de Ahn'Qiraj",
Ghostlands = "Tierras Fantasma",
Gilneas = "Gilneas", -- Needs review
["Gilneas City"] = "Ciudad de Gilneas", -- Needs review
Gnomeregan = "Gnomeregan",
Graveyard = "Cementerio",
["Grim Batol"] = "Grim Batol", -- Needs review
["Grizzly Hills"] = "Colinas Pardas",
["Grom'gol Base Camp"] = "Campamento Grom'gol",
["Gruul's Lair"] = "Guarida de Gruul",
Gundrak = "Gundrak",
["Hall of Champions"] = "Sala de los Campeones",
["Hall of Legends"] = "Sala de las Leyendas",
["Halls of Lightning"] = "Cámaras de Relámpagos",
["Halls of Origination"] = "Cámaras de los Orígenes", -- Needs review
["Halls of Reflection"] = "Camáras de Reflexión",
["Halls of Stone"] = "Cámaras de Piedra",
["Hellfire Citadel"] = "Ciudadela del Fuego Infernal",
["Hellfire Peninsula"] = "Península del Fuego Infernal",
["Hellfire Ramparts"] = "Murallas del Fuego Infernal",
["Hillsbrad Foothills"] = "Laderas de Trabalomas",
["Horde Encampment"] = "Campamento Horda",
["Howling Fjord"] = "Fiordo Aquilonal",
["Hrothgar's Landing"] = "Desembarco de Hrothgar",
Hyjal = "Hyjal",
["Hyjal Summit"] = "Cima Hyjal",
Icecrown = "Corona de Hielo",
["Icecrown Citadel"] = "Ciudadela de la Corona de Hielo",
["Insidion's Perch"] = "Nido de Insidion",
Ironforge = "Forjaz",
["Isle of Conquest"] = "Isla de la Conquista",
["Isle of Quel'Danas"] = "Isla de Quel'Danas",
Kalimdor = "Kalimdor",
Karazhan = "Karazhan",
["Kelp'thar Forest"] = "Bosque Kelp'thar", -- Needs review
Kezan = "Kezan", -- Needs review
["Krasus' Landing"] = "Krasus' Landing",
Library = "Biblioteca",
["Loch Modan"] = "Loch Modan",
["Lost City of the Tol'vir"] = "Ciudad Perdida de los Tol'vir", -- Needs review
["Lower Blackrock Spire"] = "Cumbre inferior de Roca Negra",
["Magisters' Terrace"] = "Bancal Del Magister",
["Magtheridon's Lair"] = "Guarida de Magtheridon",
["Mana-Tombs"] = "Tumbas de Maná",
Maraudon = "Maraudon",
["Marshlight Lake"] = "Lago Luz Pantanosa",
["Menethil Harbor"] = "Puerto de Menethil",
["Molten Core"] = "Núcleo de Magma",
["Molten Front"] = "Frente de Magma", -- Needs review
Moonglade = "Claro de la Luna",
["Mount Hyjal"] = "Monte Hyjal", -- Needs review
Mulgore = "Mulgore",
Nagrand = "Nagrand",
["Nagrand Arena"] = "Arena de Nagrand",
Naxxramas = "Naxxramas",
Netherstorm = "Tormenta Abisal",
["Night Elf Village"] = "Poblado Elfo de la Noche",
["Northern Barrens"] = "Los Baldíos del Norte", -- Needs review
["Northern Stranglethorn"] = "Norte de la Vega de Tuercespina", -- Needs review
Northrend = "Rasganorte",
["Obsidia's Perch"] = "Nido de Obsidia",
["Ogri'la"] = "Ogri'la",
["Old Hillsbrad Foothills"] = "Antiguas Laderas de Trabalomas",
["Old Stratholme"] = "Stratholme en el pasado",
["Onyxia's Lair"] = "Guarida de Onyxia",
Orgrimmar = "Orgrimmar",
Outland = "Terrallende",
["Pit of Saron"] = "Foso de Saron",
["Plaguelands: The Scarlet Enclave"] = "Tierras de la Peste del Este: El Enclave Escarlata",
Plaguewood = "Bosque de la Plaga",
["Quel'thalas"] = "Quel'thalas",
["Ragefire Chasm"] = "Sima ígnea",
Ratchet = "Trinquete",
["Razorfen Downs"] = "Zahúrda Rajacieno",
["Razorfen Kraul"] = "Horado Rajacieno",
["Redridge Mountains"] = "Montañas Crestagrana",
["Ring of Observance"] = "Círculo de la Observancia",
["Rivendark's Perch"] = "Nido de Desgarro Oscuro",
["Ruins of Ahn'Qiraj"] = "Ruinas de Ahn'Qiraj",
["Ruins of Gilneas"] = "Ruinas de Gilneas", -- Needs review
["Ruins of Gilneas City"] = "Ruinas de la Ciudad de Gilneas", -- Needs review
["Ruins of Lordaeron"] = "Ruinas de Lordaeron",
["Scalebeard's Cave"] = "Cueva de Barbaescamas",
["Scarlet Monastery"] = "Monasterio Escarlata",
Scholomance = "Scholomance",
["Searing Gorge"] = "La Garganta de Fuego",
["Serpent Lake"] = "Lago Serpiente",
["Serpentshrine Cavern"] = "Caverna Santuario Serpiente",
["Sethekk Halls"] = "Salas Sethekk",
["Shadow Labyrinth"] = "Laberinto de las Sombras",
["Shadowfang Keep"] = "Castillo de Colmillo Oscuro",
["Shadowmoon Valley"] = "Valle Sombraluna",
["Shartuul's Transporter"] = "Transportador de Shartuul",
Shattrath = "Shattrath",
["Shattrath City"] = "Ciudad de Shattrath",
["Shimmering Expanse"] = "Extensión Bruñida", -- Needs review
["Sholazar Basin"] = "Cuenca de Sholazar",
Silithus = "Silithus",
["Silvermoon City"] = "Ciudad de Lunargenta",
["Silverpine Forest"] = "Bosque de Argénteos",
["Skyguard Outpost"] = "Puesto de la guardia de cielo",
["Skysong Lake"] = "Lago Son Celeste",
["Southern Barrens"] = "Los Baldíos del Sur", -- Needs review
["Sporewind Lake"] = "Lago Espora Volante",
Stonard = "Rocal",
["Stonetalon Mountains"] = "Sierra Espolón",
Stormwind = "Ventormenta",
["Stormwind City"] = "Ciudad de Ventormenta",
["Strand of the Ancients"] = "Playa de los Ancestros",
["Stranglethorn Vale"] = "Vega de Tuercespina",
Stratholme = "Stratholme",
["Sunken Temple"] = "El Templo Sumergido",
["Sunwell Plateau"] = "Meseta de la Fuente del Sol",
["Swamp of Sorrows"] = "Pantano de las Penas",
Tanaris = "Tanaris",
Teldrassil = "Teldrassil",
["Tempest Keep"] = "El Castillo de la Tempestad",
["Temple of Ahn'Qiraj"] = "El Templo de Ahn'Qiraj",
["Terokk's Rest"] = "Sosiego de Terokk",
["Terokkar Forest"] = "Bosque de Terokkar",
["The Arachnid Quarter"] = "Ala Arácnida",
["The Arcatraz"] = "El Alcatraz",
["The Argent Coliseum"] = "El Coliseo Argenta",
["The Barrens"] = "Los Baldíos",
["The Bastion of Twilight"] = "El Bastión del Crepúsculo", -- Needs review
["The Battle for Gilneas"] = "La Batalla por Gilneas", -- Needs review
["The Black Morass"] = "La Ciénaga Negra",
["The Blood Furnace"] = "El Horno de Sangre",
["The Bone Wastes"] = "El Vertedero de Huesos",
["The Botanica"] = "El Invernáculo",
["The Cape of Stranglethorn"] = "El Cabo de Tuercespina", -- Needs review
["The Construct Quarter"] = "Ala de Abominación",
["The Culling of Stratholme"] = "La Matanza de Stratholme",
["The Dark Portal"] = "El Portal Oscuro",
["The Deadmines"] = "Las Minas de la Muerte",
["The Descent into Madness"] = "Descenso a la Locura",
["The Exodar"] = "El Exodar",
["The Eye"] = "El Ojo",
["The Eye of Eternity"] = "El Ojo de la Eternidad",
["The Forbidding Sea"] = "Mar Adusto",
["The Forge of Souls"] = "La Forja de Almas",
["The Frozen Halls"] = "Las Salas Gélidas",
["The Frozen Sea"] = "El Mar Gélido",
["The Great Sea"] = "Mare Magnum",
["The Halls of Winter"] = "Las Cámaras del Invierno",
["The Hinterlands"] = "Tierras del Interior",
["The Lost Isles"] = "Las Islas Perdidas", -- Needs review
["The Maelstrom"] = "La Vorágine", -- Needs review
["The Mechanar"] = "El Mechanar",
["The Military Quarter"] = "Ala Militar",
["The Nexus"] = "El Nexo",
["The North Sea"] = "El Mar Norte",
["The Obsidian Sanctum"] = "El Sagrario Obsidiana",
["The Oculus"] = "El Oculus",
["The Plague Quarter"] = "Ala de la Plaga",
["The Prison of Yogg-Saron"] = "La Prisión de Yogg-Saron",
["The Ring of Valor"] = "El Anillo del Valor",
["The Ruby Sanctum"] = "El Sagrario Rubí", -- Needs review
["The Scarlet Enclave"] = "El Enclave Escarlata",
["The Shattered Halls"] = "Las Salas Arrasadas",
["The Slave Pens"] = "Recinto de los Esclavos",
["The Spark of Imagination"] = "Cámaras de la Invención",
["The Steamvault"] = "La Cámara de Vapor",
["The Stockade"] = "Las Mazmorras",
["The Stonecore"] = "El Núcleo Pétreo", -- Needs review
["The Storm Peaks"] = "Las Cumbres Tormentosas",
["The Temple of Atal'Hakkar"] = "El Templo de Atal'Hakkar",
["The Underbog"] = "La Sotiénaga",
["The Veiled Sea"] = "Mar de la Bruma",
["The Violet Hold"] = "El Bastión Violeta",
["The Vortex Pinnacle"] = "La Cumbre del Vórtice", -- Needs review
["Theramore Isle"] = "Isla Theramore",
["Thousand Needles"] = "Las Mil Agujas",
["Throne of the Four Winds"] = "Trono de los Cuatro Vientos", -- Needs review
["Throne of the Tides"] = "Trono de las Mareas", -- Needs review
["Thunder Bluff"] = "Cima del Trueno",
Tirisfal = "Tirisfal",
["Tirisfal Glades"] = "Claros de Tirisfal",
["Tol Barad"] = "Tol Barad", -- Needs review
["Tol Barad Peninsula"] = "Península de Tol Barad", -- Needs review
["Trial of the Champion"] = "Pueba del Campeon",
["Trial of the Crusader"] = "Prueba del Cruzado",
["Twilight Highlands"] = "Tierras Altas Crepusculares", -- Needs review
["Twin Peaks"] = "Cumbres Gemelas", -- Needs review
["Twisting Nether"] = "El Vacío Abisal",
Uldaman = "Uldaman",
Ulduar = "Ulduar",
Uldum = "Uldum", -- Needs review
["Un'Goro Crater"] = "Cráter de Un'Goro",
Undercity = "Entrañas",
["Upper Blackrock Spire"] = "Cumbre de Roca Negra",
["Utgarde Keep"] = "Fortaleza de Utgarde",
["Utgarde Pinnacle"] = "Pináculo de Utgarde",
["Vashj'ir"] = "Vashj'ir", -- Needs review
["Vault of Archavon"] = "La Cámara de Archavon",
["Vortex Pinnacle"] = "Pináculo del Vórtice",
["Wailing Caverns"] = "Cuevas de los Lamentos",
["Warsong Gulch"] = "Garganta Grito de Guerra",
["Western Plaguelands"] = "Tierras de la Peste del Oeste",
Westfall = "Páramos de Poniente",
Wetlands = "Los Humedales",
Wintergrasp = "Conquista del Invierno",
Winterspring = "Cuna del Invierno",
["Wyrmrest Temple"] = "Templo del Reposo del Dragón",
Zangarmarsh = "Marisma de Zangar",
["Zul'Aman"] = "Zul'Aman",
["Zul'Drak"] = "Zul'Drak",
["Zul'Farrak"] = "Zul'Farrak",
["Zul'Gurub"] = "Zul'Gurub",
}
elseif GAME_LOCALE == "ruRU" then
lib:SetCurrentTranslations {
["Abyssal Depths"] = "Бездонные глубины",
["Ahn'Qiraj"] = "Ан'Кираж",
["Ahn'Qiraj: The Fallen Kingdom"] = "Ан'Кираж: Павшее Королевство",
["Ahn'kahet: The Old Kingdom"] = "Ан'кахет: Старое Королевство",
["Alliance Base"] = "База Альянса",
["Alterac Mountains"] = "Альтеракские горы",
["Alterac Valley"] = "Альтеракская долина",
["Amani Pass"] = "Перевал Амани",
["Arathi Basin"] = "Низина Арати",
["Arathi Highlands"] = "Нагорье Арати",
Armory = "Оружейная",
Ashenvale = "Ясеневый лес",
Auberdine = "Аубердин",
["Auchenai Crypts"] = "Аукенайские гробницы",
Auchindoun = "Аукиндон",
Azeroth = "Азерот",
["Azjol-Nerub"] = "Азжол-Неруб",
Azshara = "Азшара",
["Azuremyst Isle"] = "Остров Лазурной Дымки",
Badlands = "Бесплодные земли",
["Baradin Hold"] = "Крепость Барадин",
["Bash'ir Landing"] = "Лагерь Баш'ира",
["Battle for Gilneas"] = "Битва за Гилнеас",
["Black Temple"] = "Черный храм",
["Blackfathom Deeps"] = "Непроглядная Пучина",
["Blackrock Caverns"] = "Пещеры Черной горы",
["Blackrock Depths"] = "Глубины Черной горы",
["Blackrock Mountain"] = "Черная гора",
["Blackrock Spire"] = "Пик Черной горы",
["Blackwind Lake"] = "Озеро Черного Ветра",
["Blackwing Descent"] = "Твердыня Крыла Тьмы",
["Blackwing Lair"] = "Логово Крыла Тьмы",
["Blade's Edge Arena"] = "Арена Острогорья",
["Blade's Edge Mountains"] = "Острогорье",
["Blasted Lands"] = "Выжженные земли",
["Bloodmyst Isle"] = "Остров Кровавой Дымки",
["Booty Bay"] = "Пиратская Бухта",
["Borean Tundra"] = "Борейская тундра",
["Burning Steppes"] = "Пылающие степи",
Cathedral = "Собор",
["Caverns of Time"] = "Пещеры Времени",
["Champions' Hall"] = "Зал Защитника",
["Coilfang Reservoir"] = "Резервуар Кривого Клыка",
Coldarra = "Хладарра",
["Cosmic map"] = "Карта Вселенной",
["Crystal Spine"] = "Хрустальное поле",
["Crystalsong Forest"] = "Лес Хрустальной Песни",
Dalaran = "Даларан",
["Dalaran Arena"] = "Арена Даларана",
["Dalaran Sewers"] = "Арена Даларана",
["Darkmoon Faire"] = "Ярмарка Новолуния",
Darkshore = "Темные берега",
Darnassus = "Дарнас",
Deadmines = "Мертвые копи",
["Deadwind Pass"] = "Перевал Мертвого Ветра",
Deepholm = "Подземье",
["Deeprun Tram"] = "Подземный поезд",
Desolace = "Пустоши",
["Dire Maul"] = "Забытый Город",
["Dire Maul (East)"] = "Забытый Город: Восток",
["Dire Maul (North)"] = "Забытый Город: Север",
["Dire Maul (West)"] = "Забытый Город: Запад",
Dragonblight = "Драконий Погост",
["Drak'Tharon Keep"] = "Крепость Драк'Тарон",
["Dun Morogh"] = "Дун Морог",
Durotar = "Дуротар",
Duskwood = "Сумеречный лес",
["Dustwallow Marsh"] = "Пылевые топи",
["Eastern Kingdoms"] = "Восточные королевства",
["Eastern Plaguelands"] = "Восточные Чумные земли",
["Elwynn Forest"] = "Элвиннский лес",
Everlook = "Круговзор",
["Eversong Woods"] = "Леса Вечной Песни",
["Eye of the Storm"] = "Око Бури",
Felwood = "Оскверненный лес",
Feralas = "Фералас",
Firelands = "Огненные просторы", -- Needs review
["Forge Camp: Terror"] = "Лагерь Легиона: Ужас",
["Forge Camp: Wrath"] = "Лагерь Легиона: Гнев",
["Frostwyrm Lair"] = "Логово Ледяного змея",
["Furywing's Perch"] = "Гнездовье Ярокрыла",
Gadgetzan = "Прибамбасск",
["Gates of Ahn'Qiraj"] = "Врата Ан'Киража",
Ghostlands = "Призрачные земли",
Gilneas = "Гилнеас",
["Gilneas City"] = "Гилнеас",
Gnomeregan = "Гномреган",
Graveyard = "Кладбище",
["Grim Batol"] = "Грим Батол",
["Grizzly Hills"] = "Седые холмы",
["Grom'gol Base Camp"] = "Лагерь Гром'гол",
["Gruul's Lair"] = "Логово Груула",
Gundrak = "Гундрак",
["Hall of Champions"] = "Чертог Защитников",
["Hall of Legends"] = "Зал Легенд",
["Halls of Lightning"] = "Чертоги Молний",
["Halls of Origination"] = "Чертоги Созидания",
["Halls of Reflection"] = "Залы Отражений",
["Halls of Stone"] = "Чертоги Камня",
["Hellfire Citadel"] = "Цитадель Адского Пламени",
["Hellfire Peninsula"] = "Полуостров Адского Пламени",
["Hellfire Ramparts"] = "Бастионы Адского Пламени",
["Hillsbrad Foothills"] = "Предгорья Хилсбрада",
["Horde Encampment"] = "Стоянка Орды",
["Howling Fjord"] = "Ревущий фьорд",
["Hrothgar's Landing"] = "Лагерь Хротгара",
Hyjal = "Хиджал",
["Hyjal Summit"] = "Вершина Хиджала",
Icecrown = "Ледяная Корона",
["Icecrown Citadel"] = "Цитадель Ледяной Короны",
["Insidion's Perch"] = "Гнездо Инсидиона",
Ironforge = "Стальгорн",
["Isle of Conquest"] = "Остров Завоеваний",
["Isle of Quel'Danas"] = "Остров Кель'Данас",
Kalimdor = "Калимдор",
Karazhan = "Каражан",
["Kelp'thar Forest"] = "Лес Келп’тар",
Kezan = "Кезан",
["Krasus' Landing"] = "Площадка Краса",
Library = "Библиотека",
["Loch Modan"] = "Лок Модан",
["Lost City of the Tol'vir"] = "Затерянный город Тол'вир",
["Lower Blackrock Spire"] = "Нижний ярус Черной горы",
["Magisters' Terrace"] = "Терраса Магистров",
["Magtheridon's Lair"] = "Логово Магтеридона",
["Mana-Tombs"] = "Гробницы Маны",
Maraudon = "Мародон",
["Marshlight Lake"] = "Озеро Болотных Огоньков",
["Menethil Harbor"] = "Гавань Менетилов",
["Molten Core"] = "Огненные Недра",
["Molten Front"] = "Огненная передовая", -- Needs review
Moonglade = "Лунная поляна",
["Mount Hyjal"] = "Хиджал",
Mulgore = "Мулгор",
Nagrand = "Награнд",
["Nagrand Arena"] = "Арена Награнда",
Naxxramas = "Наксрамас",
Netherstorm = "Пустоверть",
["Night Elf Village"] = "Деревня ночных эльфов",
["Northern Barrens"] = "Северные Степи",
["Northern Stranglethorn"] = "Северная Тернистая долина",
Northrend = "Нордскол",
["Obsidia's Perch"] = "Гнездо Обсидии",
["Ogri'la"] = "Огри'ла",
["Old Hillsbrad Foothills"] = "Старые предгорья Хилсбрада",
["Old Stratholme"] = "Старый Стратхольм",
["Onyxia's Lair"] = "Логово Ониксии",
Orgrimmar = "Оргриммар",
Outland = "Запределье",
["Pit of Saron"] = "Яма Сарона",
["Plaguelands: The Scarlet Enclave"] = "Чумные земли: Анклав Алого ордена",
Plaguewood = "Проклятый лес",
["Quel'thalas"] = "Кель'Талас",
["Ragefire Chasm"] = "Огненная пропасть",
Ratchet = "Кабестан",
["Razorfen Downs"] = "Курганы Иглошкурых",
["Razorfen Kraul"] = "Лабиринты Иглошкурых",
["Redridge Mountains"] = "Красногорье",
["Ring of Observance"] = "Ритуальный Круг",
["Rivendark's Perch"] = "Гнездо Чернокрыла",
["Ruins of Ahn'Qiraj"] = "Руины Ан'Киража",
["Ruins of Gilneas"] = "Руины Гилнеаса",
["Ruins of Gilneas City"] = "Руины Гилнеаса",
["Ruins of Lordaeron"] = "Руины Лордерона",
["Scalebeard's Cave"] = "Пещера Чешуеборода",
["Scarlet Monastery"] = "Монастырь Алого ордена",
Scholomance = "Некроситет",
["Searing Gorge"] = "Тлеющее ущелье",
["Serpent Lake"] = "Змеиное озеро",
["Serpentshrine Cavern"] = "Змеиное святилище",
["Sethekk Halls"] = "Сетеккские залы",
["Shadow Labyrinth"] = "Темный лабиринт",
["Shadowfang Keep"] = "Крепость Темного Клыка",
["Shadowmoon Valley"] = "Долина Призрачной Луны",
["Shartuul's Transporter"] = "Транспортер Шартуула",
Shattrath = "Шаттрат",
["Shattrath City"] = "Шаттрат",
["Shimmering Expanse"] = "Мерцающий простор",
["Sholazar Basin"] = "Низина Шолазар",
Silithus = "Силитус",
["Silvermoon City"] = "Луносвет",
["Silverpine Forest"] = "Серебряный бор",
["Skyguard Outpost"] = "Застава Стражи Небес",
["Skysong Lake"] = "Озеро Небесной Песни",
["Southern Barrens"] = "Южные Степи",
["Sporewind Lake"] = "Озеро Спороветра",
Stonard = "Каменор",
["Stonetalon Mountains"] = "Когтистые горы",
Stormwind = "Штормград",
["Stormwind City"] = "Штормград",
["Strand of the Ancients"] = "Берег Древних",
["Stranglethorn Vale"] = "Тернистая долина",
Stratholme = "Стратхольм",
["Sunken Temple"] = "Затонувший храм",
["Sunwell Plateau"] = "Плато Солнечного Колодца",
["Swamp of Sorrows"] = "Болото Печали",
Tanaris = "Танарис",
Teldrassil = "Тельдрассил",
["Tempest Keep"] = "Крепость Бурь",
["Temple of Ahn'Qiraj"] = "Храм Ан'Кираж",
["Terokk's Rest"] = "Покой Терокка",
["Terokkar Forest"] = "Лес Тероккар",
["The Arachnid Quarter"] = "Паучий квартал",
["The Arcatraz"] = "Аркатрац",
["The Argent Coliseum"] = "Испытание крестоносца",
["The Barrens"] = "Степи",
["The Bastion of Twilight"] = "Сумеречный бастион",
["The Battle for Gilneas"] = "Битва за Гилнеас",
["The Black Morass"] = "Черные топи",
["The Blood Furnace"] = "Кузня Крови",
["The Bone Wastes"] = "Костяные пустоши",
["The Botanica"] = "Ботаника",
["The Cape of Stranglethorn"] = "Мыс Тернистой долины",
["The Construct Quarter"] = "Квартал Мерзости",
["The Culling of Stratholme"] = "Очищение Стратхольма",
["The Dark Portal"] = "Темный портал",
["The Deadmines"] = "Мертвые копи",
["The Descent into Madness"] = "Провал Безумия",
["The Exodar"] = "Экзодар",
["The Eye"] = "Око",
["The Eye of Eternity"] = "Око Вечности",
["The Forbidding Sea"] = "Зловещее море",
["The Forge of Souls"] = "Кузня Душ",
["The Frozen Halls"] = "Ледяные залы",
["The Frozen Sea"] = "Ледяное море",
["The Great Sea"] = "Великое море",
["The Halls of Winter"] = "Залы Зимы",
["The Hinterlands"] = "Внутренние земли",
["The Lost Isles"] = "Затерянные острова",
["The Maelstrom"] = "Водоворот",
["The Mechanar"] = "Механар",
["The Military Quarter"] = "Военный квартал",
["The Nexus"] = "Нексус",
["The North Sea"] = "Северное море",
["The Obsidian Sanctum"] = "Обсидиановое святилище",
["The Oculus"] = "Окулус",
["The Plague Quarter"] = "Чумной квартал",
["The Prison of Yogg-Saron"] = "Темница Йогг-Сарона",
["The Ring of Valor"] = "Круг Доблести",
["The Ruby Sanctum"] = "Рубиновое святилище",
["The Scarlet Enclave"] = "Анклав Алого ордена",
["The Shattered Halls"] = "Разрушенные залы",
["The Slave Pens"] = "Узилище",
["The Spark of Imagination"] = "Искра Воображения",
["The Steamvault"] = "Паровое подземелье",
["The Stockade"] = "Тюрьма",
["The Stonecore"] = "Каменные Недра",
["The Storm Peaks"] = "Грозовая Гряда",
["The Temple of Atal'Hakkar"] = "Храм Атал'Хаккара",
["The Underbog"] = "Нижетопь",
["The Veiled Sea"] = "Сокрытое Море",
["The Violet Hold"] = "Аметистовая крепость",
["The Vortex Pinnacle"] = "Вершина смерча",
["Theramore Isle"] = "Остров Терамор",
["Thousand Needles"] = "Тысяча Игл",
["Throne of the Four Winds"] = "Трон Четырех Ветров",
["Throne of the Tides"] = "Трон Приливов",
["Thunder Bluff"] = "Громовой Утес",
Tirisfal = "Тирисфальские леса",
["Tirisfal Glades"] = "Тирисфальские леса",
["Tol Barad"] = "Тол Барад",
["Tol Barad Peninsula"] = "Полуостров Тол Барад",
["Trial of the Champion"] = "Испытание чемпиона",
["Trial of the Crusader"] = "Испытание крестоносца",
["Twilight Highlands"] = "Сумеречное нагорье",
["Twin Peaks"] = "Два Пика",
["Twisting Nether"] = "Круговерть Пустоты",
Uldaman = "Ульдаман",
Ulduar = "Ульдуар",
Uldum = "Ульдум",
["Un'Goro Crater"] = "Кратер Ун'Горо",
Undercity = "Подгород",
["Upper Blackrock Spire"] = "Верхний ярус Черной горы",
["Utgarde Keep"] = "Крепость Утгард",
["Utgarde Pinnacle"] = "Вершина Утгард",
["Vashj'ir"] = "Вайш'ир",
["Vault of Archavon"] = "Склеп Аркавона",
["Vortex Pinnacle"] = "Вершина смерча",
["Wailing Caverns"] = "Пещеры Стенаний",
["Warsong Gulch"] = "Ущелье Песни Войны",
["Western Plaguelands"] = "Западные Чумные земли",
Westfall = "Западный Край",
Wetlands = "Болотина",
Wintergrasp = "Озеро Ледяных Оков",
Winterspring = "Зимние Ключи",
["Wyrmrest Temple"] = "Храм Драконьего Покоя",
Zangarmarsh = "Зангартопь",
["Zul'Aman"] = "Зул'Аман",
["Zul'Drak"] = "Зул'Драк",
["Zul'Farrak"] = "Зул'Фаррак",
["Zul'Gurub"] = "Зул'Гуруб",
}
elseif GAME_LOCALE == "zhCN" then
lib:SetCurrentTranslations {
["Abyssal Depths"] = "无底海渊",
["Ahn'Qiraj"] = "安其拉",
["Ahn'Qiraj: The Fallen Kingdom"] = "安其拉:堕落王国",
["Ahn'kahet: The Old Kingdom"] = "安卡赫特:古代王国",
["Alliance Base"] = "联盟基地",
["Alterac Mountains"] = "奥特兰克山脉",
["Alterac Valley"] = "奥特兰克山谷",
["Amani Pass"] = "阿曼尼小径",
["Arathi Basin"] = "阿拉希盆地",
["Arathi Highlands"] = "阿拉希高地",
Armory = "军械库",
Ashenvale = "灰谷",
Auberdine = "奥伯丁",
["Auchenai Crypts"] = "奥金尼地穴",
Auchindoun = "奥金顿",
Azeroth = "艾泽拉斯",
["Azjol-Nerub"] = "艾卓-尼鲁布",
Azshara = "艾萨拉",
["Azuremyst Isle"] = "秘蓝岛",
Badlands = "荒芜之地",
["Baradin Hold"] = "巴拉丁监狱",
["Bash'ir Landing"] = "巴什伊尔码头",
["Battle for Gilneas"] = "吉尔尼斯之战",
["Black Temple"] = "黑暗神殿",
["Blackfathom Deeps"] = "黑暗深渊",
["Blackrock Caverns"] = "黑石岩窟",
["Blackrock Depths"] = "黑石深渊",
["Blackrock Mountain"] = "黑石山",
["Blackrock Spire"] = "黑石塔",
["Blackwind Lake"] = "黑风湖",
["Blackwing Descent"] = "黑翼血环",
["Blackwing Lair"] = "黑翼之巢",
["Blade's Edge Arena"] = "刀锋山竞技场",
["Blade's Edge Mountains"] = "刀锋山",
["Blasted Lands"] = "诅咒之地",
["Bloodmyst Isle"] = "秘血岛",
["Booty Bay"] = "藏宝海湾",
["Borean Tundra"] = "北风苔原",
["Burning Steppes"] = "燃烧平原",
Cathedral = "教堂",
["Caverns of Time"] = "时光之穴",
["Champions' Hall"] = "勇士大厅",
["Coilfang Reservoir"] = "盘牙水库",
Coldarra = "考达拉",
["Cosmic map"] = "全部地图",
["Crystal Spine"] = "水晶之脊",
["Crystalsong Forest"] = "晶歌森林",
Dalaran = "达拉然",
["Dalaran Arena"] = "达拉然竞技场",
["Dalaran Sewers"] = "达拉然下水道",
["Darkmoon Faire"] = "暗月马戏团",
Darkshore = "黑海岸",
Darnassus = "达纳苏斯",
Deadmines = "死亡矿井",
["Deadwind Pass"] = "逆风小径",
Deepholm = "深岩之洲",
["Deeprun Tram"] = "矿道地铁",
Desolace = "凄凉之地",
["Dire Maul"] = "厄运之槌",
["Dire Maul (East)"] = "厄运之槌(东)",
["Dire Maul (North)"] = "厄运之槌(北)",
["Dire Maul (West)"] = "厄运之槌(西)",
Dragonblight = "龙骨荒野",
["Drak'Tharon Keep"] = "达克萨隆要塞",
["Dun Morogh"] = "丹莫罗",
Durotar = "杜隆塔尔",
Duskwood = "暮色森林",
["Dustwallow Marsh"] = "尘泥沼泽",
["Eastern Kingdoms"] = "东部王国",
["Eastern Plaguelands"] = "东瘟疫之地",
["Elwynn Forest"] = "艾尔文森林",
Everlook = "永望镇",
["Eversong Woods"] = "永歌森林",
["Eye of the Storm"] = "风暴之眼",
Felwood = "费伍德森林",
Feralas = "菲拉斯",
Firelands = "火焰之地",
["Forge Camp: Terror"] = "铸魔营地:恐怖",
["Forge Camp: Wrath"] = "铸魔营地:天罚",
["Frostwyrm Lair"] = "冰霜巨龙的巢穴",
["Furywing's Perch"] = "弗雷文栖木",
Gadgetzan = "加基森",
["Gates of Ahn'Qiraj"] = "安其拉之门",
Ghostlands = "幽魂之地",
Gilneas = "吉尔尼斯",
["Gilneas City"] = "吉尔尼斯城",
Gnomeregan = "诺莫瑞根",
Graveyard = "墓地",
["Grim Batol"] = "格瑞姆巴托",
["Grizzly Hills"] = "灰熊丘陵",
["Grom'gol Base Camp"] = "格罗姆高营地",
["Gruul's Lair"] = "格鲁尔的巢穴",
Gundrak = "古达克",
["Hall of Champions"] = "勇士大厅",
["Hall of Legends"] = "传说大厅",
["Halls of Lightning"] = "闪电大厅",
["Halls of Origination"] = "起源大厅",
["Halls of Reflection"] = "映像大厅",
["Halls of Stone"] = "岩石大厅",
["Hellfire Citadel"] = "地狱火堡垒",
["Hellfire Peninsula"] = "地狱火半岛",
["Hellfire Ramparts"] = "地狱火城墙",
["Hillsbrad Foothills"] = "希尔斯布莱德丘陵",
["Horde Encampment"] = "部落营地",
["Howling Fjord"] = "嚎风峡湾",
["Hrothgar's Landing"] = "洛斯加尔登陆点",
Hyjal = "海加尔山",
["Hyjal Summit"] = "海加尔峰",
Icecrown = "冰冠冰川",
["Icecrown Citadel"] = "冰冠堡垒",
["Insidion's Perch"] = "因斯迪安栖木",
Ironforge = "铁炉堡",
["Isle of Conquest"] = "征服之岛",
["Isle of Quel'Danas"] = "奎尔丹纳斯岛",
Kalimdor = "卡利姆多",
Karazhan = "卡拉赞",
["Kelp'thar Forest"] = "柯尔普萨之森",
Kezan = "科赞",
["Krasus' Landing"] = "克拉苏斯平台",
Library = "图书馆",
["Loch Modan"] = "洛克莫丹",
["Lost City of the Tol'vir"] = "托维尔失落之城",
["Lower Blackrock Spire"] = "下层黑石塔",
["Magisters' Terrace"] = "魔导师平台",
["Magtheridon's Lair"] = "玛瑟里顿的巢穴",
["Mana-Tombs"] = "法力陵墓",
Maraudon = "玛拉顿",
["Marshlight Lake"] = "沼光湖",
["Menethil Harbor"] = "米奈希尔港",
["Molten Core"] = "熔火之心",
["Molten Front"] = "熔火前线",
Moonglade = "月光林地",
["Mount Hyjal"] = "海加尔",
Mulgore = "莫高雷",
Nagrand = "纳格兰",
["Nagrand Arena"] = "纳格兰竞技场",
Naxxramas = "纳克萨玛斯",
Netherstorm = "虚空风暴",
["Night Elf Village"] = "暗夜精灵村庄",
["Northern Barrens"] = "北贫瘠之地",
["Northern Stranglethorn"] = "北荆棘谷",
Northrend = "诺森德",
["Obsidia's Perch"] = "欧比斯迪栖木",
["Ogri'la"] = "奥格瑞拉",
["Old Hillsbrad Foothills"] = "旧希尔斯布莱德丘陵",
["Old Stratholme"] = "旧斯坦索姆",
["Onyxia's Lair"] = "奥妮克希亚的巢穴",
Orgrimmar = "奥格瑞玛",
Outland = "外域",
["Pit of Saron"] = "萨隆矿坑",
["Plaguelands: The Scarlet Enclave"] = "东瘟疫之地:血色领地",
Plaguewood = "病木林",
["Quel'thalas"] = "奎尔萨拉斯",
["Ragefire Chasm"] = "怒焰裂谷",
Ratchet = "棘齿城",
["Razorfen Downs"] = "剃刀高地",
["Razorfen Kraul"] = "剃刀沼泽",
["Redridge Mountains"] = "赤脊山",
["Ring of Observance"] = "仪式广场",
["Rivendark's Perch"] = "雷文达克栖木",
["Ruins of Ahn'Qiraj"] = "安其拉废墟",
["Ruins of Gilneas"] = "吉尔尼斯废墟",
["Ruins of Gilneas City"] = "吉尔尼斯城废墟",
["Ruins of Lordaeron"] = "洛丹伦废墟",
["Scalebeard's Cave"] = "鳞须海龟洞穴",
["Scarlet Monastery"] = "血色修道院",
Scholomance = "通灵学院",
["Searing Gorge"] = "灼热峡谷",
["Serpent Lake"] = "毒蛇湖",
["Serpentshrine Cavern"] = "毒蛇神殿",
["Sethekk Halls"] = "塞泰克大厅",
["Shadow Labyrinth"] = "暗影迷宫",
["Shadowfang Keep"] = "影牙城堡",
["Shadowmoon Valley"] = "影月谷",
["Shartuul's Transporter"] = "沙图尔的传送器",
Shattrath = "沙塔斯",
["Shattrath City"] = "沙塔斯城",
["Shimmering Expanse"] = "烁光海床",
["Sholazar Basin"] = "索拉查盆地",
Silithus = "希利苏斯",
["Silvermoon City"] = "银月城",
["Silverpine Forest"] = "银松森林",
["Skyguard Outpost"] = "天空卫队哨站",
["Skysong Lake"] = "天歌湖",
["Southern Barrens"] = "南贫瘠之地",
["Sporewind Lake"] = "孢子湖",
Stonard = "斯通纳德",
["Stonetalon Mountains"] = "石爪山脉",
Stormwind = "暴风城",
["Stormwind City"] = "暴风城",
["Strand of the Ancients"] = "远古海滩",
["Stranglethorn Vale"] = "荆棘谷",
Stratholme = "斯坦索姆",
["Sunken Temple"] = "沉没的神庙",
["Sunwell Plateau"] = "太阳之井高地",
["Swamp of Sorrows"] = "悲伤沼泽",
Tanaris = "塔纳利斯",
Teldrassil = "泰达希尔",
["Tempest Keep"] = "风暴要塞",
["Temple of Ahn'Qiraj"] = "安其拉神殿",
["Terokk's Rest"] = "泰罗克之墓",
["Terokkar Forest"] = "泰罗卡森林",
["The Arachnid Quarter"] = "蜘蛛区",
["The Arcatraz"] = "禁魔监狱",
["The Argent Coliseum"] = "银色试炼场",
["The Barrens"] = "贫瘠之地",
["The Bastion of Twilight"] = "暮光堡垒",
["The Battle for Gilneas"] = "吉尔尼斯之战",
["The Black Morass"] = "黑色沼泽",
["The Blood Furnace"] = "鲜血熔炉",
["The Bone Wastes"] = "白骨荒野",
["The Botanica"] = "生态船",
["The Cape of Stranglethorn"] = "荆棘谷海角",
["The Construct Quarter"] = "构造区",
["The Culling of Stratholme"] = "净化斯坦索姆",
["The Dark Portal"] = "黑暗之门",
["The Deadmines"] = "死亡矿井",
["The Descent into Madness"] = "疯狂阶梯",
["The Exodar"] = "埃索达",
["The Eye"] = "风暴要塞",
["The Eye of Eternity"] = "永恒之眼",
["The Forbidding Sea"] = "禁忌之海",
["The Forge of Souls"] = "灵魂洪炉",
["The Frozen Halls"] = "冰封大殿",
["The Frozen Sea"] = "冰冻之海",
["The Great Sea"] = "无尽之海",
["The Halls of Winter"] = "寒冬之厅",
["The Hinterlands"] = "辛特兰",
["The Lost Isles"] = "失落群岛",
["The Maelstrom"] = "大漩涡",
["The Mechanar"] = "能源舰",
["The Military Quarter"] = "军事区",
["The Nexus"] = "魔枢",
["The North Sea"] = "北海",
["The Obsidian Sanctum"] = "黑曜石圣殿",
["The Oculus"] = "魔环",
["The Plague Quarter"] = "瘟疫区",
["The Prison of Yogg-Saron"] = "尤格-萨隆的监狱",
["The Ring of Valor"] = "勇气竞技场",
["The Ruby Sanctum"] = "红玉圣殿",
["The Scarlet Enclave"] = "血色领地",
["The Shattered Halls"] = "破碎大厅",
["The Slave Pens"] = "奴隶围栏",
["The Spark of Imagination"] = "思想火花",
["The Steamvault"] = "蒸汽地窟",
["The Stockade"] = "监狱",
["The Stonecore"] = "巨石之核",
["The Storm Peaks"] = "风暴峭壁",
["The Temple of Atal'Hakkar"] = "阿塔哈卡神庙",
["The Underbog"] = "幽暗沼泽",
["The Veiled Sea"] = "迷雾之海",
["The Violet Hold"] = "紫罗兰监狱",
["The Vortex Pinnacle"] = "旋云之巅",
["Theramore Isle"] = "塞拉摩岛",
["Thousand Needles"] = "千针石林",
["Throne of the Four Winds"] = "风神王座",
["Throne of the Tides"] = "潮汐王座",
["Thunder Bluff"] = "雷霆崖",
Tirisfal = "提里斯法林地",
["Tirisfal Glades"] = "提瑞斯法林地",
["Tol Barad"] = "托尔巴拉德",
["Tol Barad Peninsula"] = "托尔巴拉德半岛",
["Trial of the Champion"] = "冠军的试炼",
["Trial of the Crusader"] = "十字军的试炼",
["Twilight Highlands"] = "暮光高地",
["Twin Peaks"] = "双子峰",
["Twisting Nether"] = "扭曲虚空",
Uldaman = "奥达曼",
Ulduar = "奥杜尔",
Uldum = "奥丹姆",
["Un'Goro Crater"] = "安戈洛环形山",
Undercity = "幽暗城",
["Upper Blackrock Spire"] = "上层黑石塔",
["Utgarde Keep"] = "乌特加德城堡",
["Utgarde Pinnacle"] = "乌特加德之巅",
["Vashj'ir"] = "瓦丝琪尔",
["Vault of Archavon"] = "阿尔卡冯的宝库",
["Vortex Pinnacle"] = "漩涡峰",
["Wailing Caverns"] = "哀嚎洞穴",
["Warsong Gulch"] = "战歌峡谷",
["Western Plaguelands"] = "西瘟疫之地",
Westfall = "西部荒野",
Wetlands = "湿地",
Wintergrasp = "冬拥湖",
Winterspring = "冬泉谷",
["Wyrmrest Temple"] = "龙眠神殿",
Zangarmarsh = "赞加沼泽",
["Zul'Aman"] = "祖阿曼",
["Zul'Drak"] = "祖达克",
["Zul'Farrak"] = "祖尔法拉克",
["Zul'Gurub"] = "祖尔格拉布",
}
elseif GAME_LOCALE == "zhTW" then
lib:SetCurrentTranslations {
["Abyssal Depths"] = "地獄深淵",
["Ahn'Qiraj"] = "安其拉",
["Ahn'Qiraj: The Fallen Kingdom"] = "安其拉: 沒落的王朝",
["Ahn'kahet: The Old Kingdom"] = "安卡罕特:古王國",
["Alliance Base"] = "聯盟營地",
["Alterac Mountains"] = "奧特蘭克山脈",
["Alterac Valley"] = "奧特蘭克山谷",
["Amani Pass"] = "阿曼尼小俓",
["Arathi Basin"] = "阿拉希盆地",
["Arathi Highlands"] = "阿拉希高地",
Armory = "軍械庫",
Ashenvale = "梣谷",
Auberdine = "奧伯丁",
["Auchenai Crypts"] = "奧奇奈地穴",
Auchindoun = "奧齊頓",
Azeroth = "艾澤拉斯",
["Azjol-Nerub"] = "阿茲歐-奈幽",
Azshara = "艾薩拉",
["Azuremyst Isle"] = "藍謎島",
Badlands = "荒蕪之地",
["Baradin Hold"] = "巴拉丁堡",
["Bash'ir Landing"] = "貝許爾平臺",
["Battle for Gilneas"] = "吉爾尼斯之戰",
["Black Temple"] = "黑暗神廟",
["Blackfathom Deeps"] = "黑暗深淵",
["Blackrock Caverns"] = "黑石洞穴",
["Blackrock Depths"] = "黑石深淵",
["Blackrock Mountain"] = "黑石山",
["Blackrock Spire"] = "黑石塔",
["Blackwind Lake"] = "黑風湖",
["Blackwing Descent"] = "黑翼陷窟",
["Blackwing Lair"] = "黑翼之巢",
["Blade's Edge Arena"] = "劍刃競技場",
["Blade's Edge Mountains"] = "劍刃山脈",
["Blasted Lands"] = "詛咒之地",
["Bloodmyst Isle"] = "血謎島",
["Booty Bay"] = "藏寶海灣",
["Borean Tundra"] = "北風凍原",
["Burning Steppes"] = "燃燒平原",
Cathedral = "教堂",
["Caverns of Time"] = "時光之穴",
["Champions' Hall"] = "勇士大廳",
["Coilfang Reservoir"] = "盤牙洞穴",
Coldarra = "凜懼島",
["Cosmic map"] = "宇宙地圖",
["Crystal Spine"] = "水晶背脊",
["Crystalsong Forest"] = "水晶之歌森林",
Dalaran = "達拉然",
["Dalaran Arena"] = "達拉然競技場",
["Dalaran Sewers"] = "達拉然下水道",
["Darkmoon Faire"] = "暗月馬戲團",
Darkshore = "黑海岸",
Darnassus = "達納蘇斯",
Deadmines = "死亡礦坑",
["Deadwind Pass"] = "逆風小徑",
Deepholm = "地深之源",
["Deeprun Tram"] = "礦道地鐵",
Desolace = "淒涼之地",
["Dire Maul"] = "厄運之槌",
["Dire Maul (East)"] = "厄運之槌 - 東",
["Dire Maul (North)"] = "厄運之槌 - 北",
["Dire Maul (West)"] = "厄運之槌 - 西",
Dragonblight = "龍骨荒野",
["Drak'Tharon Keep"] = "德拉克薩隆要塞",
["Dun Morogh"] = "丹莫洛",
Durotar = "杜洛塔",
Duskwood = "暮色森林",
["Dustwallow Marsh"] = "塵泥沼澤",
["Eastern Kingdoms"] = "東部王國",
["Eastern Plaguelands"] = "東瘟疫之地",
["Elwynn Forest"] = "艾爾文森林",
Everlook = "永望鎮",
["Eversong Woods"] = "永歌森林",
["Eye of the Storm"] = "暴風之眼",
Felwood = "費伍德森林",
Feralas = "菲拉斯",
Firelands = "火源之界",
["Forge Camp: Terror"] = "煉冶場:驚駭",
["Forge Camp: Wrath"] = "煉冶場:憤怒",
["Frostwyrm Lair"] = "冰霜巨龍的巢穴",
["Furywing's Perch"] = "狂怒之翼棲所",
Gadgetzan = "加基森",
["Gates of Ahn'Qiraj"] = "安其拉之門",
Ghostlands = "鬼魂之地",
Gilneas = "吉爾尼斯",
["Gilneas City"] = "吉爾尼斯城",
Gnomeregan = "諾姆瑞根",
Graveyard = "墓地",
["Grim Batol"] = "格瑞姆巴托",
["Grizzly Hills"] = "灰白之丘",
["Grom'gol Base Camp"] = "格羅姆高營地",
["Gruul's Lair"] = "戈魯爾之巢",
Gundrak = "剛德拉克",
["Hall of Champions"] = "勇士大廳",
["Hall of Legends"] = "傳說大廳",
["Halls of Lightning"] = "雷光大廳",
["Halls of Origination"] = "起源大廳",
["Halls of Reflection"] = "倒影大廳",
["Halls of Stone"] = "石之大廳",
["Hellfire Citadel"] = "地獄火堡壘",
["Hellfire Peninsula"] = "地獄火半島",
["Hellfire Ramparts"] = "地獄火壁壘",
["Hillsbrad Foothills"] = "希爾斯布萊德丘陵",
["Horde Encampment"] = "部落營地",
["Howling Fjord"] = "凜風峽灣",
["Hrothgar's Landing"] = "赫魯斯加臺地",
Hyjal = "海加爾山",
["Hyjal Summit"] = "海加爾山",
Icecrown = "寒冰皇冠",
["Icecrown Citadel"] = "冰冠城塞",
["Insidion's Perch"] = "印希迪恩棲所",
Ironforge = "鐵爐堡",
["Isle of Conquest"] = "征服之島",
["Isle of Quel'Danas"] = "奎爾達納斯之島",
Kalimdor = "卡林多",
Karazhan = "卡拉贊",
["Kelp'thar Forest"] = "凱波薩爾森林",
Kezan = "凱贊",
["Krasus' Landing"] = "卡薩斯平臺",
Library = "圖書館",
["Loch Modan"] = "洛克莫丹",
["Lost City of the Tol'vir"] = "托維爾的失落之城",
["Lower Blackrock Spire"] = "低階黑石塔",
["Magisters' Terrace"] = "博學者殿堂",
["Magtheridon's Lair"] = "瑪瑟里頓的巢穴",
["Mana-Tombs"] = "法力墓地",
Maraudon = "瑪拉頓",
["Marshlight Lake"] = "沼澤光之湖",
["Menethil Harbor"] = "米奈希爾港",
["Molten Core"] = "熔火之心",
["Molten Front"] = "熔岩前線",
Moonglade = "月光林地",
["Mount Hyjal"] = "海加爾山",
Mulgore = "莫高雷",
Nagrand = "納葛蘭",
["Nagrand Arena"] = "納葛蘭競技場",
Naxxramas = "納克薩瑪斯",
Netherstorm = "虛空風暴",
["Night Elf Village"] = "夜精靈村",
["Northern Barrens"] = "北貧瘠之地",
["Northern Stranglethorn"] = "北荊棘谷",
Northrend = "北裂境",
["Obsidia's Perch"] = "歐比希迪亞棲所",
["Ogri'la"] = "歐格利拉",
["Old Hillsbrad Foothills"] = "希爾斯布萊德丘陵舊址",
["Old Stratholme"] = "舊斯坦索姆",
["Onyxia's Lair"] = "奧妮克希亞的巢穴",
Orgrimmar = "奧格瑪",
Outland = "外域",
["Pit of Saron"] = "薩倫之淵",
["Plaguelands: The Scarlet Enclave"] = "東瘟疫之地: 血色領區",
Plaguewood = "病木林",
["Quel'thalas"] = "奎爾薩拉斯",
["Ragefire Chasm"] = "怒焰裂谷",
Ratchet = "棘齒城",
["Razorfen Downs"] = "剃刀高地",
["Razorfen Kraul"] = "剃刀沼澤",
["Redridge Mountains"] = "赤脊山",
["Ring of Observance"] = "儀式競技場",
["Rivendark's Perch"] = "瑞文達科棲所",
["Ruins of Ahn'Qiraj"] = "安其拉廢墟",
["Ruins of Gilneas"] = "吉爾尼斯廢墟",
["Ruins of Gilneas City"] = "吉爾尼斯城廢墟",
["Ruins of Lordaeron"] = "羅德隆廢墟",
["Scalebeard's Cave"] = "鱗鬚洞穴",
["Scarlet Monastery"] = "血色修道院",
Scholomance = "通靈學院",
["Searing Gorge"] = "灼熱峽谷",
["Serpent Lake"] = "毒蛇之湖",
["Serpentshrine Cavern"] = "毒蛇神殿洞穴",
["Sethekk Halls"] = "塞司克大廳",
["Shadow Labyrinth"] = "暗影迷宮",
["Shadowfang Keep"] = "影牙城堡",
["Shadowmoon Valley"] = "影月谷",
["Shartuul's Transporter"] = "夏圖歐的傳送門",
Shattrath = "撒塔斯城",
["Shattrath City"] = "撒塔斯城",
["Shimmering Expanse"] = "閃光瀚洋",
["Sholazar Basin"] = "休拉薩盆地",
Silithus = "希利蘇斯",
["Silvermoon City"] = "銀月城",
["Silverpine Forest"] = "銀松森林",
["Skyguard Outpost"] = "禦天者崗哨",
["Skysong Lake"] = "天歌湖",
["Southern Barrens"] = "南貧瘠之地",
["Sporewind Lake"] = "孢子風之湖",
Stonard = "斯通納德",
["Stonetalon Mountains"] = "石爪山脈",
Stormwind = "暴風城",
["Stormwind City"] = "暴風城",
["Strand of the Ancients"] = "遠祖灘頭",
["Stranglethorn Vale"] = "荊棘谷",
Stratholme = "斯坦索姆",
["Sunken Temple"] = "沉沒的神廟",
["Sunwell Plateau"] = "太陽之井高地",
["Swamp of Sorrows"] = "悲傷沼澤",
Tanaris = "塔納利斯",
Teldrassil = "泰達希爾",
["Tempest Keep"] = "風暴要塞",
["Temple of Ahn'Qiraj"] = "安其拉神廟",
["Terokk's Rest"] = "泰洛克之墓",
["Terokkar Forest"] = "泰洛卡森林",
["The Arachnid Quarter"] = "蜘蛛區",
["The Arcatraz"] = "亞克崔茲",
["The Argent Coliseum"] = "銀白大競技場",
["The Barrens"] = "貧瘠之地",
["The Bastion of Twilight"] = "暮光堡壘",
["The Battle for Gilneas"] = "吉爾尼斯之戰",
["The Black Morass"] = "黑色沼澤",
["The Blood Furnace"] = "血熔爐",
["The Bone Wastes"] = "白骨荒野",
["The Botanica"] = "波塔尼卡",
["The Cape of Stranglethorn"] = "荊棘谷海角",
["The Construct Quarter"] = "傀儡區",
["The Culling of Stratholme"] = "斯坦索姆的抉擇",
["The Dark Portal"] = "黑暗之門",
["The Deadmines"] = "死亡礦坑",
["The Descent into Madness"] = "驟狂斜廊",
["The Exodar"] = "艾克索達",
["The Eye"] = "風暴要塞",
["The Eye of Eternity"] = "永恆之眼",
["The Forbidding Sea"] = "禁忌之海",
["The Forge of Souls"] = "眾魂熔爐",
["The Frozen Halls"] = "冰封大廳",
["The Frozen Sea"] = "冰凍之海",
["The Great Sea"] = "無盡之海",
["The Halls of Winter"] = "凜冬之廳",
["The Hinterlands"] = "辛特蘭",
["The Lost Isles"] = "失落群島",
["The Maelstrom"] = "大漩渦",
["The Mechanar"] = "麥克納爾",
["The Military Quarter"] = "軍事區",
["The Nexus"] = "奧核之心",
["The North Sea"] = "北海",
["The Obsidian Sanctum"] = "黑曜聖所",
["The Oculus"] = "奧核之眼",
["The Plague Quarter"] = "瘟疫區",
["The Prison of Yogg-Saron"] = "尤格薩倫之獄",
["The Ring of Valor"] = "勇武之環",
["The Ruby Sanctum"] = "晶紅聖所",
["The Scarlet Enclave"] = "血色領區",
["The Shattered Halls"] = "破碎大廳",
["The Slave Pens"] = "奴隸監獄",
["The Spark of Imagination"] = "創思之廳",
["The Steamvault"] = "蒸汽洞窟",
["The Stockade"] = "監獄",
["The Stonecore"] = "石岩之心",
["The Storm Peaks"] = "風暴群山",
["The Temple of Atal'Hakkar"] = "阿塔哈卡神廟",
["The Underbog"] = "深幽泥沼",
["The Veiled Sea"] = "迷霧之海",
["The Violet Hold"] = "紫羅蘭堡",
["The Vortex Pinnacle"] = "漩渦尖塔",
["Theramore Isle"] = "塞拉摩島",
["Thousand Needles"] = "千針石林",
["Throne of the Four Winds"] = "四風王座",
["Throne of the Tides"] = "海潮王座",
["Thunder Bluff"] = "雷霆崖",
Tirisfal = "提里斯法林地",
["Tirisfal Glades"] = "提里斯法林地",
["Tol Barad"] = "托巴拉德",
["Tol Barad Peninsula"] = "托巴拉德半島",
["Trial of the Champion"] = "勇士試煉",
["Trial of the Crusader"] = "十字軍試煉",
["Twilight Highlands"] = "暮光高地",
["Twin Peaks"] = "雙子峰",
["Twisting Nether"] = "扭曲虛空",
Uldaman = "奧達曼",
Ulduar = "奧杜亞",
Uldum = "奧丹姆",
["Un'Goro Crater"] = "安戈洛環形山",
Undercity = "幽暗城",
["Upper Blackrock Spire"] = "黑石塔上層",
["Utgarde Keep"] = "俄特加德要塞",
["Utgarde Pinnacle"] = "俄特加德之巔",
["Vashj'ir"] = "瓦許伊爾",
["Vault of Archavon"] = "亞夏梵穹殿",
["Vortex Pinnacle"] = "漩渦尖塔",
["Wailing Caverns"] = "哀嚎洞穴",
["Warsong Gulch"] = "戰歌峽谷",
["Western Plaguelands"] = "西瘟疫之地",
Westfall = "西部荒野",
Wetlands = "濕地",
Wintergrasp = "冬握湖",
Winterspring = "冬泉谷",
["Wyrmrest Temple"] = "龍眠神殿",
Zangarmarsh = "贊格沼澤",
["Zul'Aman"] = "祖阿曼",
["Zul'Drak"] = "祖爾德拉克",
["Zul'Farrak"] = "祖爾法拉克",
["Zul'Gurub"] = "祖爾格拉布",
}
 
else
error(("%s: Locale %q not supported"):format(MAJOR_VERSION, GAME_LOCALE))
end
RecipeRadar/libs/LibBabble-Zone-3.0/lib.xml New file
0,0 → 1,5
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="LibBabble-3.0.lua" />
<Script file="LibBabble-Zone-3.0.lua" />
</Ui>
\ No newline at end of file
RecipeRadar/libs/LibBabble-Zone-3.0/LibBabble-Zone-3.0.toc New file
0,0 → 1,18
## Interface: 40200
## LoadOnDemand: 1
## Title: Lib: Babble-Zone-3.0
## Notes: A library to help with localization of Zones.
## Notes-deDE: BabbleLib ist eine Bibliothek, die bei der Lokalisierung helfen soll.
## Notes-frFR: Une bibliothèque d'aide à la localisation.
## Notes-esES: Una biblioteca para ayudar con las localizaciones.
## Author: ckknight
## X-eMail: ckknight@gmail.com
## X-Category: Library
## X-License: MIT
## X-Curse-Packaged-Version: r325
## X-Curse-Project-Name: LibBabble-Zone-3.0
## X-Curse-Project-ID: libbabble-zone-3-0
## X-Curse-Repository-ID: wow/libbabble-zone-3-0/mainline
 
LibStub\LibStub.lua
lib.xml
RecipeRadar/libs/LibBabble-Zone-3.0/LibBabble-3.0.lua New file
0,0 → 1,292
-- LibBabble-3.0 is hereby placed in the Public Domain
-- Credits: ckknight
local LIBBABBLE_MAJOR, LIBBABBLE_MINOR = "LibBabble-3.0", 2
 
local LibBabble = LibStub:NewLibrary(LIBBABBLE_MAJOR, LIBBABBLE_MINOR)
if not LibBabble then
return
end
 
local data = LibBabble.data or {}
for k,v in pairs(LibBabble) do
LibBabble[k] = nil
end
LibBabble.data = data
 
local tablesToDB = {}
for namespace, db in pairs(data) do
for k,v in pairs(db) do
tablesToDB[v] = db
end
end
 
local function warn(message)
local _, ret = pcall(error, message, 3)
geterrorhandler()(ret)
end
 
local lookup_mt = { __index = function(self, key)
local db = tablesToDB[self]
local current_key = db.current[key]
if current_key then
self[key] = current_key
return current_key
end
local base_key = db.base[key]
local real_MAJOR_VERSION
for k,v in pairs(data) do
if v == db then
real_MAJOR_VERSION = k
break
end
end
if not real_MAJOR_VERSION then
real_MAJOR_VERSION = LIBBABBLE_MAJOR
end
if base_key then
warn(("%s: Translation %q not found for locale %q"):format(real_MAJOR_VERSION, key, GetLocale()))
rawset(self, key, base_key)
return base_key
end
warn(("%s: Translation %q not found."):format(real_MAJOR_VERSION, key))
rawset(self, key, key)
return key
end }
 
local function initLookup(module, lookup)
local db = tablesToDB[module]
for k in pairs(lookup) do
lookup[k] = nil
end
setmetatable(lookup, lookup_mt)
tablesToDB[lookup] = db
db.lookup = lookup
return lookup
end
 
local function initReverse(module, reverse)
local db = tablesToDB[module]
for k in pairs(reverse) do
reverse[k] = nil
end
for k,v in pairs(db.current) do
reverse[v] = k
end
tablesToDB[reverse] = db
db.reverse = reverse
db.reverseIterators = nil
return reverse
end
 
local prototype = {}
local prototype_mt = {__index = prototype}
 
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will warn but allow the code to pass through.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BL = B:GetLookupTable()
assert(BL["Some english word"] == "Some localized word")
DoSomething(BL["Some english word that doesn't exist"]) -- warning!
-----------------------------------------------------------------------------]]
function prototype:GetLookupTable()
local db = tablesToDB[self]
 
local lookup = db.lookup
if lookup then
return lookup
end
return initLookup(self, {})
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_has = B:GetUnstrictLookupTable()
assert(B_has["Some english word"] == "Some localized word")
assert(B_has["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetUnstrictLookupTable()
local db = tablesToDB[self]
 
return db.current
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This is useful for checking if the base (English) table has a key, even if the localized one does not have it registered.
Returns:
A lookup table for english to localized words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local B_hasBase = B:GetBaseLookupTable()
assert(B_hasBase["Some english word"] == "Some english word")
assert(B_hasBase["Some english word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetBaseLookupTable()
local db = tablesToDB[self]
 
return db.base
end
--[[---------------------------------------------------------------------------
Notes:
* If you try to access a nonexistent key, it will return nil.
* This will return only one English word that it maps to, if there are more than one to check, see :GetReverseIterator("word")
Returns:
A lookup table for localized to english words.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
local BR = B:GetReverseLookupTable()
assert(BR["Some localized word"] == "Some english word")
assert(BR["Some localized word that doesn't exist"] == nil)
-----------------------------------------------------------------------------]]
function prototype:GetReverseLookupTable()
local db = tablesToDB[self]
 
local reverse = db.reverse
if reverse then
return reverse
end
return initReverse(self, {})
end
local blank = {}
local weakVal = {__mode='v'}
--[[---------------------------------------------------------------------------
Arguments:
string - the localized word to chek for.
Returns:
An iterator to traverse all English words that map to the given key
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for word in B:GetReverseIterator("Some localized word") do
DoSomething(word)
end
-----------------------------------------------------------------------------]]
function prototype:GetReverseIterator(key)
local db = tablesToDB[self]
local reverseIterators = db.reverseIterators
if not reverseIterators then
reverseIterators = setmetatable({}, weakVal)
db.reverseIterators = reverseIterators
elseif reverseIterators[key] then
return pairs(reverseIterators[key])
end
local t
for k,v in pairs(db.current) do
if v == key then
if not t then
t = {}
end
t[k] = true
end
end
reverseIterators[key] = t or blank
return pairs(reverseIterators[key])
end
--[[---------------------------------------------------------------------------
Returns:
An iterator to traverse all translations English to localized.
Example:
local B = LibStub("LibBabble-Module-3.0") -- where Module is what you want.
for english, localized in B:Iterate() do
DoSomething(english, localized)
end
-----------------------------------------------------------------------------]]
function prototype:Iterate()
local db = tablesToDB[self]
 
return pairs(db.current)
end
 
-- #NODOC
-- modules need to call this to set the base table
function prototype:SetBaseTranslations(base)
local db = tablesToDB[self]
local oldBase = db.base
if oldBase then
for k in pairs(oldBase) do
oldBase[k] = nil
end
for k, v in pairs(base) do
oldBase[k] = v
end
base = oldBase
else
db.base = base
end
for k,v in pairs(base) do
if v == true then
base[k] = k
end
end
end
 
local function init(module)
local db = tablesToDB[module]
if db.lookup then
initLookup(module, db.lookup)
end
if db.reverse then
initReverse(module, db.reverse)
end
db.reverseIterators = nil
end
 
-- #NODOC
-- modules need to call this to set the current table. if current is true, use the base table.
function prototype:SetCurrentTranslations(current)
local db = tablesToDB[self]
if current == true then
db.current = db.base
else
local oldCurrent = db.current
if oldCurrent then
for k in pairs(oldCurrent) do
oldCurrent[k] = nil
end
for k, v in pairs(current) do
oldCurrent[k] = v
end
current = oldCurrent
else
db.current = current
end
end
init(self)
end
 
for namespace, db in pairs(data) do
setmetatable(db.module, prototype_mt)
init(db.module)
end
 
-- #NODOC
-- modules need to call this to create a new namespace.
function LibBabble:New(namespace, minor)
local module, oldminor = LibStub:NewLibrary(namespace, minor)
if not module then
return
end
 
if not oldminor then
local db = {
module = module,
}
data[namespace] = db
tablesToDB[module] = db
else
for k,v in pairs(module) do
module[k] = nil
end
end
 
setmetatable(module, prototype_mt)
 
return module
end
RecipeRadar/libs/AceLocale-3.0/AceLocale-3.0.xml New file
0,0 → 1,4
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceLocale-3.0.lua"/>
</Ui>
\ No newline at end of file
RecipeRadar/libs/AceLocale-3.0/AceLocale-3.0.lua New file
0,0 → 1,137
--- **AceLocale-3.0** manages localization in addons, allowing for multiple locale to be registered with fallback to the base locale for untranslated strings.
-- @class file
-- @name AceLocale-3.0
-- @release $Id: AceLocale-3.0.lua 1005 2011-01-29 14:19:43Z mikk $
local MAJOR,MINOR = "AceLocale-3.0", 5
 
local AceLocale, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceLocale then return end -- no upgrade needed
 
-- Lua APIs
local assert, tostring, error = assert, tostring, error
local setmetatable, rawset, rawget = setmetatable, rawset, rawget
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: GAME_LOCALE, geterrorhandler
 
local gameLocale = GetLocale()
if gameLocale == "enGB" then
gameLocale = "enUS"
end
 
AceLocale.apps = AceLocale.apps or {} -- array of ["AppName"]=localetableref
AceLocale.appnames = AceLocale.appnames or {} -- array of [localetableref]="AppName"
 
-- This metatable is used on all tables returned from GetLocale
local readmeta = {
__index = function(self, key) -- requesting totally unknown entries: fire off a nonbreaking error and return key
rawset(self, key, key) -- only need to see the warning once, really
geterrorhandler()(MAJOR..": "..tostring(AceLocale.appnames[self])..": Missing entry for '"..tostring(key).."'")
return key
end
}
 
-- This metatable is used on all tables returned from GetLocale if the silent flag is true, it does not issue a warning on unknown keys
local readmetasilent = {
__index = function(self, key) -- requesting totally unknown entries: return key
rawset(self, key, key) -- only need to invoke this function once
return key
end
}
 
-- Remember the locale table being registered right now (it gets set by :NewLocale())
-- NOTE: Do never try to register 2 locale tables at once and mix their definition.
local registering
 
-- local assert false function
local assertfalse = function() assert(false) end
 
-- This metatable proxy is used when registering nondefault locales
local writeproxy = setmetatable({}, {
__newindex = function(self, key, value)
rawset(registering, key, value == true and key or value) -- assigning values: replace 'true' with key string
end,
__index = assertfalse
})
 
-- This metatable proxy is used when registering the default locale.
-- It refuses to overwrite existing values
-- Reason 1: Allows loading locales in any order
-- Reason 2: If 2 modules have the same string, but only the first one to be
-- loaded has a translation for the current locale, the translation
-- doesn't get overwritten.
--
local writedefaultproxy = setmetatable({}, {
__newindex = function(self, key, value)
if not rawget(registering, key) then
rawset(registering, key, value == true and key or value)
end
end,
__index = assertfalse
})
 
--- Register a new locale (or extend an existing one) for the specified application.
-- :NewLocale will return a table you can fill your locale into, or nil if the locale isn't needed for the players
-- game locale.
-- @paramsig application, locale[, isDefault[, silent]]
-- @param application Unique name of addon / module
-- @param locale Name of the locale to register, e.g. "enUS", "deDE", etc.
-- @param isDefault If this is the default locale being registered (your addon is written in this language, generally enUS)
-- @param silent If true, the locale will not issue warnings for missing keys. Must be set on the first locale registered. If set to "raw", nils will be returned for unknown keys (no metatable used).
-- @usage
-- -- enUS.lua
-- local L = LibStub("AceLocale-3.0"):NewLocale("TestLocale", "enUS", true)
-- L["string1"] = true
--
-- -- deDE.lua
-- local L = LibStub("AceLocale-3.0"):NewLocale("TestLocale", "deDE")
-- if not L then return end
-- L["string1"] = "Zeichenkette1"
-- @return Locale Table to add localizations to, or nil if the current locale is not required.
function AceLocale:NewLocale(application, locale, isDefault, silent)
 
-- GAME_LOCALE allows translators to test translations of addons without having that wow client installed
local gameLocale = GAME_LOCALE or gameLocale
 
local app = AceLocale.apps[application]
 
if silent and app then
geterrorhandler()("Usage: NewLocale(application, locale[, isDefault[, silent]]): 'silent' must be specified for the first locale registered")
end
 
if not app then
if silent=="raw" then
app = {}
else
app = setmetatable({}, silent and readmetasilent or readmeta)
end
AceLocale.apps[application] = app
AceLocale.appnames[app] = application
end
 
if locale ~= gameLocale and not isDefault then
return -- nop, we don't need these translations
end
 
registering = app -- remember globally for writeproxy and writedefaultproxy
 
if isDefault then
return writedefaultproxy
end
 
return writeproxy
end
 
--- Returns localizations for the current locale (or default locale if translations are missing).
-- Errors if nothing is registered (spank developer, not just a missing translation)
-- @param application Unique name of addon / module
-- @param silent If true, the locale is optional, silently return nil if it's not found (defaults to false, optional)
-- @return The locale table for the current language.
function AceLocale:GetLocale(application, silent)
if not silent and not AceLocale.apps[application] then
error("Usage: GetLocale(application[, silent]): 'application' - No locales registered for '"..tostring(application).."'", 2)
end
return AceLocale.apps[application]
end
RecipeRadar/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml New file
0,0 → 1,4
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="CallbackHandler-1.0.lua"/>
</Ui>
\ No newline at end of file
RecipeRadar/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua New file
0,0 → 1,240
--[[ $Id: CallbackHandler-1.0.lua 965 2010-08-09 00:47:52Z mikk $ ]]
local MAJOR, MINOR = "CallbackHandler-1.0", 6
local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
 
if not CallbackHandler then return end -- No upgrade needed
 
local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
 
-- Lua APIs
local tconcat = table.concat
local assert, error, loadstring = assert, error, loadstring
local setmetatable, rawset, rawget = setmetatable, rawset, rawget
local next, select, pairs, type, tostring = next, select, pairs, type, tostring
 
-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
-- List them here for Mikk's FindGlobals script
-- GLOBALS: geterrorhandler
 
local xpcall = xpcall
 
local function errorhandler(err)
return geterrorhandler()(err)
end
 
local function CreateDispatcher(argCount)
local code = [[
local next, xpcall, eh = ...
 
local method, ARGS
local function call() method(ARGS) end
 
local function dispatch(handlers, ...)
local index
index, method = next(handlers)
if not method then return end
local OLD_ARGS = ARGS
ARGS = ...
repeat
xpcall(call, eh)
index, method = next(handlers, index)
until not method
ARGS = OLD_ARGS
end
 
return dispatch
]]
 
local ARGS, OLD_ARGS = {}, {}
for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", "))
return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
end
 
local Dispatchers = setmetatable({}, {__index=function(self, argCount)
local dispatcher = CreateDispatcher(argCount)
rawset(self, argCount, dispatcher)
return dispatcher
end})
 
--------------------------------------------------------------------------
-- CallbackHandler:New
--
-- target - target object to embed public APIs in
-- RegisterName - name of the callback registration API, default "RegisterCallback"
-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback"
-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
 
function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused)
-- TODO: Remove this after beta has gone out
assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
 
RegisterName = RegisterName or "RegisterCallback"
UnregisterName = UnregisterName or "UnregisterCallback"
if UnregisterAllName==nil then -- false is used to indicate "don't want this method"
UnregisterAllName = "UnregisterAllCallbacks"
end
 
-- we declare all objects and exported APIs inside this closure to quickly gain access
-- to e.g. function names, the "target" parameter, etc
 
 
-- Create the registry object
local events = setmetatable({}, meta)
local registry = { recurse=0, events=events }
 
-- registry:Fire() - fires the given event/message into the registry
function registry:Fire(eventname, ...)
if not rawget(events, eventname) or not next(events[eventname]) then return end
local oldrecurse = registry.recurse
registry.recurse = oldrecurse + 1
 
Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
 
registry.recurse = oldrecurse
 
if registry.insertQueue and oldrecurse==0 then
-- Something in one of our callbacks wanted to register more callbacks; they got queued
for eventname,callbacks in pairs(registry.insertQueue) do
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
for self,func in pairs(callbacks) do
events[eventname][self] = func
-- fire OnUsed callback?
if first and registry.OnUsed then
registry.OnUsed(registry, target, eventname)
first = nil
end
end
end
registry.insertQueue = nil
end
end
 
-- Registration of a callback, handles:
-- self["method"], leads to self["method"](self, ...)
-- self with function ref, leads to functionref(...)
-- "addonId" (instead of self) with function ref, leads to functionref(...)
-- all with an optional arg, which, if present, gets passed as first argument (after self if present)
target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
if type(eventname) ~= "string" then
error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
end
 
method = method or eventname
 
local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten.
 
if type(method) ~= "string" and type(method) ~= "function" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
end
 
local regfunc
 
if type(method) == "string" then
-- self["method"] calling style
if type(self) ~= "table" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
elseif self==target then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
elseif type(self[method]) ~= "function" then
error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
end
 
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
local arg=select(1,...)
regfunc = function(...) self[method](self,arg,...) end
else
regfunc = function(...) self[method](self,...) end
end
else
-- function ref with self=object or self="addonId" or self=thread
if type(self)~="table" and type(self)~="string" and type(self)~="thread" then
error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2)
end
 
if select("#",...)>=1 then -- this is not the same as testing for arg==nil!
local arg=select(1,...)
regfunc = function(...) method(arg,...) end
else
regfunc = method
end
end
 
 
if events[eventname][self] or registry.recurse<1 then
-- if registry.recurse<1 then
-- we're overwriting an existing entry, or not currently recursing. just set it.
events[eventname][self] = regfunc
-- fire OnUsed callback?
if registry.OnUsed and first then
registry.OnUsed(registry, target, eventname)
end
else
-- we're currently processing a callback in this registry, so delay the registration of this new entry!
-- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
registry.insertQueue = registry.insertQueue or setmetatable({},meta)
registry.insertQueue[eventname][self] = regfunc
end
end
 
-- Unregister a callback
target[UnregisterName] = function(self, eventname)
if not self or self==target then
error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
end
if type(eventname) ~= "string" then
error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
end
if rawget(events, eventname) and events[eventname][self] then
events[eventname][self] = nil
-- Fire OnUnused callback?
if registry.OnUnused and not next(events[eventname]) then
registry.OnUnused(registry, target, eventname)
end
end
if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
registry.insertQueue[eventname][self] = nil
end
end
 
-- OPTIONAL: Unregister all callbacks for given selfs/addonIds
if UnregisterAllName then
target[UnregisterAllName] = function(...)
if select("#",...)<1 then
error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
end
if select("#",...)==1 and ...==target then
error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
end
 
 
for i=1,select("#",...) do
local self = select(i,...)
if registry.insertQueue then
for eventname, callbacks in pairs(registry.insertQueue) do
if callbacks[self] then
callbacks[self] = nil
end
end
end
for eventname, callbacks in pairs(events) do
if callbacks[self] then
callbacks[self] = nil
-- Fire OnUnused callback?
if registry.OnUnused and not next(callbacks) then
registry.OnUnused(registry, target, eventname)
end
end
end
end
end
end
 
return registry
end
 
 
-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
-- try to upgrade old implicit embeds since the system is selfcontained and
-- relies on closures to work.
 
RecipeRadar/libs/AceHook-3.0/AceHook-3.0.xml New file
0,0 → 1,4
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceHook-3.0.lua"/>
</Ui>
\ No newline at end of file
RecipeRadar/libs/AceHook-3.0/AceHook-3.0.lua New file
0,0 → 1,514
--- **AceHook-3.0** offers safe Hooking/Unhooking of functions, methods and frame scripts.
-- Using AceHook-3.0 is recommended when you need to unhook your hooks again, so the hook chain isn't broken
-- when you manually restore the original function.
--
-- **AceHook-3.0** can be embeded into your addon, either explicitly by calling AceHook:Embed(MyAddon) or by
-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
-- and can be accessed directly, without having to explicitly call AceHook itself.\\
-- It is recommended to embed AceHook, otherwise you'll have to specify a custom `self` on all calls you
-- make into AceHook.
-- @class file
-- @name AceHook-3.0
-- @release $Id: AceHook-3.0.lua 877 2009-11-02 15:56:50Z nevcairiel $
local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 5
local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR)
 
if not AceHook then return end -- No upgrade needed
 
AceHook.embeded = AceHook.embeded or {}
AceHook.registry = AceHook.registry or setmetatable({}, {__index = function(tbl, key) tbl[key] = {} return tbl[key] end })
AceHook.handlers = AceHook.handlers or {}
AceHook.actives = AceHook.actives or {}
AceHook.scripts = AceHook.scripts or {}
AceHook.onceSecure = AceHook.onceSecure or {}
AceHook.hooks = AceHook.hooks or {}
 
-- local upvalues
local registry = AceHook.registry
local handlers = AceHook.handlers
local actives = AceHook.actives
local scripts = AceHook.scripts
local onceSecure = AceHook.onceSecure
 
-- Lua APIs
local pairs, next, type = pairs, next, type
local format = string.format
local assert, error = assert, error
 
-- WoW APIs
local issecurevariable, hooksecurefunc = issecurevariable, hooksecurefunc
local _G = _G
 
-- functions for later definition
local donothing, createHook, hook
 
local protectedScripts = {
OnClick = true,
}
 
-- upgrading of embeded is done at the bottom of the file
 
local mixins = {
"Hook", "SecureHook",
"HookScript", "SecureHookScript",
"Unhook", "UnhookAll",
"IsHooked",
"RawHook", "RawHookScript"
}
 
-- AceHook:Embed( target )
-- target (object) - target object to embed AceHook in
--
-- Embeds AceEevent into the target object making the functions from the mixins list available on target:..
function AceHook:Embed( target )
for k, v in pairs( mixins ) do
target[v] = self[v]
end
self.embeded[target] = true
-- inject the hooks table safely
target.hooks = target.hooks or {}
return target
end
 
-- AceHook:OnEmbedDisable( target )
-- target (object) - target object that is being disabled
--
-- Unhooks all hooks when the target disables.
-- this method should be called by the target manually or by an addon framework
function AceHook:OnEmbedDisable( target )
target:UnhookAll()
end
 
function createHook(self, handler, orig, secure, failsafe)
local uid
local method = type(handler) == "string"
if failsafe and not secure then
-- failsafe hook creation
uid = function(...)
if actives[uid] then
if method then
self[handler](self, ...)
else
handler(...)
end
end
return orig(...)
end
-- /failsafe hook
else
-- all other hooks
uid = function(...)
if actives[uid] then
if method then
return self[handler](self, ...)
else
return handler(...)
end
elseif not secure then -- backup on non secure
return orig(...)
end
end
-- /hook
end
return uid
end
 
function donothing() end
 
function hook(self, obj, method, handler, script, secure, raw, forceSecure, usage)
if not handler then handler = method end
 
-- These asserts make sure AceHooks's devs play by the rules.
assert(not script or type(script) == "boolean")
assert(not secure or type(secure) == "boolean")
assert(not raw or type(raw) == "boolean")
assert(not forceSecure or type(forceSecure) == "boolean")
assert(usage)
 
-- Error checking Battery!
if obj and type(obj) ~= "table" then
error(format("%s: 'object' - nil or table expected got %s", usage, type(obj)), 3)
end
if type(method) ~= "string" then
error(format("%s: 'method' - string expected got %s", usage, type(method)), 3)
end
if type(handler) ~= "string" and type(handler) ~= "function" then
error(format("%s: 'handler' - nil, string, or function expected got %s", usage, type(handler)), 3)
end
if type(handler) == "string" and type(self[handler]) ~= "function" then
error(format("%s: 'handler' - Handler specified does not exist at self[handler]", usage), 3)
end
if script then
if not secure and obj:IsProtected() and protectedScripts[method] then
error(format("Cannot hook secure script %q; Use SecureHookScript(obj, method, [handler]) instead.", method), 3)
end
if not obj or not obj.GetScript or not obj:HasScript(method) then
error(format("%s: You can only hook a script on a frame object", usage), 3)
end
else
local issecure
if obj then
issecure = onceSecure[obj] and onceSecure[obj][method] or issecurevariable(obj, method)
else
issecure = onceSecure[method] or issecurevariable(method)
end
if issecure then
if forceSecure then
if obj then
onceSecure[obj] = onceSecure[obj] or {}
onceSecure[obj][method] = true
else
onceSecure[method] = true
end
elseif not secure then
error(format("%s: Attempt to hook secure function %s. Use `SecureHook' or add `true' to the argument list to override.", usage, method), 3)
end
end
end
 
local uid
if obj then
uid = registry[self][obj] and registry[self][obj][method]
else
uid = registry[self][method]
end
 
if uid then
if actives[uid] then
-- Only two sane choices exist here. We either a) error 100% of the time or b) always unhook and then hook
-- choice b would likely lead to odd debuging conditions or other mysteries so we're going with a.
error(format("Attempting to rehook already active hook %s.", method))
end
 
if handlers[uid] == handler then -- turn on a decative hook, note enclosures break this ability, small memory leak
actives[uid] = true
return
elseif obj then -- is there any reason not to call unhook instead of doing the following several lines?
if self.hooks and self.hooks[obj] then
self.hooks[obj][method] = nil
end
registry[self][obj][method] = nil
else
if self.hooks then
self.hooks[method] = nil
end
registry[self][method] = nil
end
handlers[uid], actives[uid], scripts[uid] = nil, nil, nil
uid = nil
end
 
local orig
if script then
orig = obj:GetScript(method) or donothing
elseif obj then
orig = obj[method]
else
orig = _G[method]
end
 
if not orig then
error(format("%s: Attempting to hook a non existing target", usage), 3)
end
 
uid = createHook(self, handler, orig, secure, not (raw or secure))
 
if obj then
self.hooks[obj] = self.hooks[obj] or {}
registry[self][obj] = registry[self][obj] or {}
registry[self][obj][method] = uid
 
if not secure then
self.hooks[obj][method] = orig
end
 
if script then
-- If the script is empty before, HookScript will not work, so use SetScript instead
-- This will make the hook insecure, but shouldnt matter, since it was empty before.
-- It does not taint the full frame.
if not secure or orig == donothing then
obj:SetScript(method, uid)
elseif secure then
obj:HookScript(method, uid)
end
else
if not secure then
obj[method] = uid
else
hooksecurefunc(obj, method, uid)
end
end
else
registry[self][method] = uid
 
if not secure then
_G[method] = uid
self.hooks[method] = orig
else
hooksecurefunc(method, uid)
end
end
 
actives[uid], handlers[uid], scripts[uid] = true, handler, script and true or nil
end
 
--- Hook a function or a method on an object.
-- The hook created will be a "safe hook", that means that your handler will be called
-- before the hooked function ("Pre-Hook"), and you don't have to call the original function yourself,
-- however you cannot stop the execution of the function, or modify any of the arguments/return values.\\
-- This type of hook is typically used if you need to know if some function got called, and don't want to modify it.
-- @paramsig [object], method, [handler], [hookSecure]
-- @param object The object to hook a method from
-- @param method If object was specified, the name of the method, or the name of the function to hook.
-- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked function)
-- @param hookSecure If true, AceHook will allow hooking of secure functions.
-- @usage
-- -- create an addon with AceHook embeded
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
--
-- function MyAddon:OnEnable()
-- -- Hook ActionButton_UpdateHotkeys, overwriting the secure status
-- self:Hook("ActionButton_UpdateHotkeys", true)
-- end
--
-- function MyAddon:ActionButton_UpdateHotkeys(button, type)
-- print(button:GetName() .. " is updating its HotKey")
-- end
function AceHook:Hook(object, method, handler, hookSecure)
if type(object) == "string" then
method, handler, hookSecure, object = object, method, handler, nil
end
 
if handler == true then
handler, hookSecure = nil, true
end
 
hook(self, object, method, handler, false, false, false, hookSecure or false, "Usage: Hook([object], method, [handler], [hookSecure])")
end
 
--- RawHook a function or a method on an object.
-- The hook created will be a "raw hook", that means that your handler will completly replace
-- the original function, and your handler has to call the original function (or not, depending on your intentions).\\
-- The original function will be stored in `self.hooks[object][method]` or `self.hooks[functionName]` respectively.\\
-- This type of hook can be used for all purposes, and is usually the most common case when you need to modify arguments
-- or want to control execution of the original function.
-- @paramsig [object], method, [handler], [hookSecure]
-- @param object The object to hook a method from
-- @param method If object was specified, the name of the method, or the name of the function to hook.
-- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked function)
-- @param hookSecure If true, AceHook will allow hooking of secure functions.
-- @usage
-- -- create an addon with AceHook embeded
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
--
-- function MyAddon:OnEnable()
-- -- Hook ActionButton_UpdateHotkeys, overwriting the secure status
-- self:RawHook("ActionButton_UpdateHotkeys", true)
-- end
--
-- function MyAddon:ActionButton_UpdateHotkeys(button, type)
-- if button:GetName() == "MyButton" then
-- -- do stuff here
-- else
-- self.hooks.ActionButton_UpdateHotkeys(button, type)
-- end
-- end
function AceHook:RawHook(object, method, handler, hookSecure)
if type(object) == "string" then
method, handler, hookSecure, object = object, method, handler, nil
end
 
if handler == true then
handler, hookSecure = nil, true
end
 
hook(self, object, method, handler, false, false, true, hookSecure or false, "Usage: RawHook([object], method, [handler], [hookSecure])")
end
 
--- SecureHook a function or a method on an object.
-- This function is a wrapper around the `hooksecurefunc` function in the WoW API. Using AceHook
-- extends the functionality of secure hooks, and adds the ability to unhook once the hook isn't
-- required anymore, or the addon is being disabled.\\
-- Secure Hooks should be used if the secure-status of the function is vital to its function,
-- and taint would block execution. Secure Hooks are always called after the original function was called
-- ("Post Hook"), and you cannot modify the arguments, return values or control the execution.
-- @paramsig [object], method, [handler]
-- @param object The object to hook a method from
-- @param method If object was specified, the name of the method, or the name of the function to hook.
-- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked function)
function AceHook:SecureHook(object, method, handler)
if type(object) == "string" then
method, handler, object = object, method, nil
end
 
hook(self, object, method, handler, false, true, false, false, "Usage: SecureHook([object], method, [handler])")
end
 
--- Hook a script handler on a frame.
-- The hook created will be a "safe hook", that means that your handler will be called
-- before the hooked script ("Pre-Hook"), and you don't have to call the original function yourself,
-- however you cannot stop the execution of the function, or modify any of the arguments/return values.\\
-- This is the frame script equivalent of the :Hook safe-hook. It would typically be used to be notified
-- when a certain event happens to a frame.
-- @paramsig frame, script, [handler]
-- @param frame The Frame to hook the script on
-- @param script The script to hook
-- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked script)
-- @usage
-- -- create an addon with AceHook embeded
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
--
-- function MyAddon:OnEnable()
-- -- Hook the OnShow of FriendsFrame
-- self:HookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow")
-- end
--
-- function MyAddon:FriendsFrameOnShow(frame)
-- print("The FriendsFrame was shown!")
-- end
function AceHook:HookScript(frame, script, handler)
hook(self, frame, script, handler, true, false, false, false, "Usage: HookScript(object, method, [handler])")
end
 
--- RawHook a script handler on a frame.
-- The hook created will be a "raw hook", that means that your handler will completly replace
-- the original script, and your handler has to call the original script (or not, depending on your intentions).\\
-- The original script will be stored in `self.hooks[frame][script]`.\\
-- This type of hook can be used for all purposes, and is usually the most common case when you need to modify arguments
-- or want to control execution of the original script.
-- @paramsig frame, script, [handler]
-- @param frame The Frame to hook the script on
-- @param script The script to hook
-- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked script)
-- @usage
-- -- create an addon with AceHook embeded
-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
--
-- function MyAddon:OnEnable()
-- -- Hook the OnShow of FriendsFrame
-- self:RawHookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow")
-- end
--
-- function MyAddon:FriendsFrameOnShow(frame)
-- -- Call the original function
-- self.hooks[frame].OnShow(frame)
-- -- Do our processing
-- -- .. stuff
-- end
function AceHook:RawHookScript(frame, script, handler)
hook(self, frame, script, handler, true, false, true, false, "Usage: RawHookScript(object, method, [handler])")
end
 
--- SecureHook a script handler on a frame.
-- This function is a wrapper around the `frame:HookScript` function in the WoW API. Using AceHook
-- extends the functionality of secure hooks, and adds the ability to unhook once the hook isn't
-- required anymore, or the addon is being disabled.\\
-- Secure Hooks should be used if the secure-status of the function is vital to its function,
-- and taint would block execution. Secure Hooks are always called after the original function was called
-- ("Post Hook"), and you cannot modify the arguments, return values or control the execution.
-- @paramsig frame, script, [handler]
-- @param frame The Frame to hook the script on
-- @param script The script to hook
-- @param handler The handler for the hook, a funcref or a method name. (Defaults to the name of the hooked script)
function AceHook:SecureHookScript(frame, script, handler)
hook(self, frame, script, handler, true, true, false, false, "Usage: SecureHookScript(object, method, [handler])")
end
 
--- Unhook from the specified function, method or script.
-- @paramsig [obj], method
-- @param obj The object or frame to unhook from
-- @param method The name of the method, function or script to unhook from.
function AceHook:Unhook(obj, method)
local usage = "Usage: Unhook([obj], method)"
if type(obj) == "string" then
method, obj = obj, nil
end
 
if obj and type(obj) ~= "table" then
error(format("%s: 'obj' - expecting nil or table got %s", usage, type(obj)), 2)
end
if type(method) ~= "string" then
error(format("%s: 'method' - expeting string got %s", usage, type(method)), 2)
end
 
local uid
if obj then
uid = registry[self][obj] and registry[self][obj][method]
else
uid = registry[self][method]
end
 
if not uid or not actives[uid] then
-- Declining to error on an unneeded unhook since the end effect is the same and this would just be annoying.
return false
end
 
actives[uid], handlers[uid] = nil, nil
 
if obj then
registry[self][obj][method] = nil
registry[self][obj] = next(registry[self][obj]) and registry[self][obj] or nil
 
-- if the hook reference doesnt exist, then its a secure hook, just bail out and dont do any unhooking
if not self.hooks[obj] or not self.hooks[obj][method] then return true end
 
if scripts[uid] and obj:GetScript(method) == uid then -- unhooks scripts
obj:SetScript(method, self.hooks[obj][method] ~= donothing and self.hooks[obj][method] or nil)
scripts[uid] = nil
elseif obj and self.hooks[obj] and self.hooks[obj][method] and obj[method] == uid then -- unhooks methods
obj[method] = self.hooks[obj][method]
end
 
self.hooks[obj][method] = nil
self.hooks[obj] = next(self.hooks[obj]) and self.hooks[obj] or nil
else
registry[self][method] = nil
 
-- if self.hooks[method] doesn't exist, then this is a SecureHook, just bail out
if not self.hooks[method] then return true end
 
if self.hooks[method] and _G[method] == uid then -- unhooks functions
_G[method] = self.hooks[method]
end
 
self.hooks[method] = nil
end
return true
end
 
--- Unhook all existing hooks for this addon.
function AceHook:UnhookAll()
for key, value in pairs(registry[self]) do
if type(key) == "table" then
for method in pairs(value) do
self:Unhook(key, method)
end
else
self:Unhook(key)
end
end
end
 
--- Check if the specific function, method or script is already hooked.
-- @paramsig [obj], method
-- @param obj The object or frame to unhook from
-- @param method The name of the method, function or script to unhook from.
function AceHook:IsHooked(obj, method)
-- we don't check if registry[self] exists, this is done by evil magicks in the metatable
if type(obj) == "string" then
if registry[self][obj] and actives[registry[self][obj]] then
return true, handlers[registry[self][obj]]
end
else
if registry[self][obj] and registry[self][obj][method] and actives[registry[self][obj][method]] then
return true, handlers[registry[self][obj][method]]
end
end
 
return false, nil
end
 
--- Upgrade our old embeded
for target, v in pairs( AceHook.embeded ) do
AceHook:Embed( target )
end
RecipeRadar/libs/AceEvent-3.0/AceEvent-3.0.xml New file
0,0 → 1,4
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
<Script file="AceEvent-3.0.lua"/>
</Ui>
\ No newline at end of file
RecipeRadar/libs/AceEvent-3.0/AceEvent-3.0.lua New file
0,0 → 1,126
--- AceEvent-3.0 provides event registration and secure dispatching.
-- All dispatching is done using **CallbackHandler-1.0**. AceEvent is a simple wrapper around
-- CallbackHandler, and dispatches all game events or addon message to the registrees.
--
-- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by
-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
-- and can be accessed directly, without having to explicitly call AceEvent itself.\\
-- It is recommended to embed AceEvent, otherwise you'll have to specify a custom `self` on all calls you
-- make into AceEvent.
-- @class file
-- @name AceEvent-3.0
-- @release $Id: AceEvent-3.0.lua 975 2010-10-23 11:26:18Z nevcairiel $
local MAJOR, MINOR = "AceEvent-3.0", 3
local AceEvent = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceEvent then return end
 
-- Lua APIs
local pairs = pairs
 
local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
 
AceEvent.frame = AceEvent.frame or CreateFrame("Frame", "AceEvent30Frame") -- our event frame
AceEvent.embeds = AceEvent.embeds or {} -- what objects embed this lib
 
-- APIs and registry for blizzard events, using CallbackHandler lib
if not AceEvent.events then
AceEvent.events = CallbackHandler:New(AceEvent,
"RegisterEvent", "UnregisterEvent", "UnregisterAllEvents")
end
 
function AceEvent.events:OnUsed(target, eventname)
AceEvent.frame:RegisterEvent(eventname)
end
 
function AceEvent.events:OnUnused(target, eventname)
AceEvent.frame:UnregisterEvent(eventname)
end
 
 
-- APIs and registry for IPC messages, using CallbackHandler lib
if not AceEvent.messages then
AceEvent.messages = CallbackHandler:New(AceEvent,
"RegisterMessage", "UnregisterMessage", "UnregisterAllMessages"
)
AceEvent.SendMessage = AceEvent.messages.Fire
end
 
--- embedding and embed handling
local mixins = {
"RegisterEvent", "UnregisterEvent",
"RegisterMessage", "UnregisterMessage",
"SendMessage",
"UnregisterAllEvents", "UnregisterAllMessages",
}
 
--- Register for a Blizzard Event.
-- The callback will be called with the optional `arg` as the first argument (if supplied), and the event name as the second (or first, if no arg was supplied)
-- Any arguments to the event will be passed on after that.
-- @name AceEvent:RegisterEvent
-- @class function
-- @paramsig event[, callback [, arg]]
-- @param event The event to register for
-- @param callback The callback function to call when the event is triggered (funcref or method, defaults to a method with the event name)
-- @param arg An optional argument to pass to the callback function
 
--- Unregister an event.
-- @name AceEvent:UnregisterEvent
-- @class function
-- @paramsig event
-- @param event The event to unregister
 
--- Register for a custom AceEvent-internal message.
-- The callback will be called with the optional `arg` as the first argument (if supplied), and the event name as the second (or first, if no arg was supplied)
-- Any arguments to the event will be passed on after that.
-- @name AceEvent:RegisterMessage
-- @class function
-- @paramsig message[, callback [, arg]]
-- @param message The message to register for
-- @param callback The callback function to call when the message is triggered (funcref or method, defaults to a method with the event name)
-- @param arg An optional argument to pass to the callback function
 
--- Unregister a message
-- @name AceEvent:UnregisterMessage
-- @class function
-- @paramsig message
-- @param message The message to unregister
 
--- Send a message over the AceEvent-3.0 internal message system to other addons registered for this message.
-- @name AceEvent:SendMessage
-- @class function
-- @paramsig message, ...
-- @param message The message to send
-- @param ... Any arguments to the message
 
 
-- Embeds AceEvent into the target object making the functions from the mixins list available on target:..
-- @param target target object to embed AceEvent in
function AceEvent:Embed(target)
for k, v in pairs(mixins) do
target[v] = self[v]
end
self.embeds[target] = true
return target
end
 
-- AceEvent:OnEmbedDisable( target )
-- target (object) - target object that is being disabled
--
-- Unregister all events messages etc when the target disables.
-- this method should be called by the target manually or by an addon framework
function AceEvent:OnEmbedDisable(target)
target:UnregisterAllEvents()
target:UnregisterAllMessages()
end
 
-- Script to fire blizzard events into the event listeners
local events = AceEvent.events
AceEvent.frame:SetScript("OnEvent", function(this, event, ...)
events:Fire(event, ...)
end)
 
--- Finally: upgrade our old embeds
for target, v in pairs(AceEvent.embeds) do
AceEvent:Embed(target)
end