vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        Localization
                Embeddable addon for selecting a global localization for addons.
        
        By: AnduinLothar
        
        Based on inspiration from Babylonian code by norganna and MentalPower.
        Brought to you without any real xml thanks to Iriel's VirtualFrames.
        
        To use as an embeddable addon:
        - Put the Localization folder inside your Interface/AddOns/<YourAddonName>/ folder.
        - Add Localization\Localization.xml to your toc or load it in your xml before your localization files.
        - Add Localization to the OptionalDeps in your toc
        
        To use as an addon library:
        - Put the Localization folder inside your Interface/AddOns/ folder.
        - Add Localization to the Dependencies in your toc
        
        Note: The AddonName passed to most functions must be identical to the AddonName as returned by arg1 of ADDON_LOADED for Load on Demand addons.
        
        $Id: Localization.lua 3547 2006-05-16 02:35:13Z karlkfi $
        $Rev: 3547 $
        $LastChangedBy: karlkfi $
        $Date: 2006-05-15 19:35:13 -0700 (Mon, 15 May 2006) $
]]--

local LOCALIZATION_NAME                 = "Localization"
local LOCALIZATION_VERSION              = 0.06
local LOCALIZATION_LAST_UPDATED = "May 4, 2006"
local LOCALIZATION_AUTHOR               = "AnduinLothar"
local LOCALIZATION_EMAIL                = "karlkfi@cosmosui.org"
local LOCALIZATION_WEBSITE              = "http://www.wowwiki.com/Localization_Lib"

------------------------------------------------------------------------------
--[[ Embedded Sub-Library Load Algorithm ]]--
------------------------------------------------------------------------------

if (not Localization) then
        Localization = {}
        RegisterCVar("PreferedLocale", "")
        RegisterCVar("RemoveUnusedLocales", 'false')
end
local isBetterInstanceLoaded = ( Localization.version and Localization.version >= LOCALIZATION_VERSION )

if (not isBetterInstanceLoaded) then
        
        ------------------------------------------------------------------------------
        --[[ Variables ]]--
        ------------------------------------------------------------------------------
        
        Localization.version = LOCALIZATION_VERSION
        Localization.clientLocale = GetLocale()
        if (not Localization.preferedLocale) then
                local pref = GetCVar("PreferedLocale")
                if (pref and pref ~= "") then
                        Localization.preferedLocale = pref
                else
                        Localization.preferedLocale = Localization.clientLocale
                        --Localization.promptForPrefrence = true
                end
        end
        if (not Localization.callbacks) then
                Localization.callbacks = {}
        end
        if (not Localization.localizedStrings) then
                Localization.localizedStrings = {}
        end
        if (not Localization.localizedGlobalStrings) then
                Localization.localizedGlobalStrings = {}
        end
        if (not Localization.protected) then
                Localization.protected = {}
        end
        
        ------------------------------------------------------------------------------
        --[[ User Addon Functions ]]--
        ------------------------------------------------------------------------------
        
        function Localization.RegisterAddonStrings(locale, addon, stringTable, eraseOrig, protect)
                -- Registers strings with the global database by addon and locale
                -- 'eraseOrig' will remove all previously registered strings for this addon in this locale
                -- 'protect' will not allow this information to be deleted by RemoveUnusedLocales. For internal use only. Used to protect the language selection screen text.
                -- This method is highly prefered over RegisterGlobalAddonStrings so as not to pollute the global namespace.
                if (not locale) then
                        DEFAULT_CHAT_FRAME:AddMessage("[Localization] WARNING: locale for RegisterAddonStrings invalid.")
                        return
                end
                if (not addon) then
                        DEFAULT_CHAT_FRAME:AddMessage("[Localization] WARNING: addon for RegisterAddonStrings invalid.")
                end
                if (not Localization.localizedStrings[locale]) then
                        Localization.localizedStrings[locale] = {}
                end
                local lang = Localization.localizedStrings[locale]
                if (eraseOrig or not lang[addon]) then
                        lang[addon] = stringTable
                else
                        lang = lang[addon]
                        for key, text in stringTable do
                                lang[key] = text
                        end
                end
                
                --protection
                if (not Localization.protected[locale]) then
                        Localization.protected[locale] = {}
                end
                if (protect and not Localization.protected[locale][addon]) then
                        Localization.protected[locale][addon] = true;
                end
        end
        
        function Localization.RegisterGlobalAddonStrings(locale, addon, stringTable, eraseOrig, protect)
                -- Registers strings with the global database by addon and locale
                -- 'eraseOrig' will remove all previously registered strings for this addon in this locale
                -- 'protect' will not allow this information to be deleted by RemoveUnusedLocales. For internal use only. Used to protect the language selection screen text.
                -- This method may be useful if the strings are called frequently or are used in bindings.
                if (not locale) then
                        DEFAULT_CHAT_FRAME:AddMessage("[Localization] WARNING: locale for RegisterGlobalAddonStrings invalid.")
                        return
                end
                if (not addon) then
                        DEFAULT_CHAT_FRAME:AddMessage("[Localization] WARNING: addon for RegisterGlobalAddonStrings invalid.")
                end
                if (not Localization.localizedGlobalStrings[locale]) then
                        Localization.localizedGlobalStrings[locale] = {}
                end
                local lang = Localization.localizedGlobalStrings[locale]
                if (eraseOrig or not lang[addon]) then
                        lang[addon] = stringTable
                else
                        lang = lang[addon]
                        for key, text in stringTable do
                                lang[key] = text
                        end
                end
                
                --protection
                if (not Localization.protected[locale]) then
                        Localization.protected[locale] = {}
                end
                if (protect and not Localization.protected[locale][addon]) then
                        Localization.protected[locale][addon] = true;
                end
        end
        
        function Localization.SetAddonDefault(addon, locale)
                -- Sets required Addon default locale.  It should have values for all availible strings.
                if (not Localization.defaults) then
                        Localization.defaults = {}
                end
                Localization.defaults[addon] = locale
        end
        
        function Localization.RegisterCallback(key, callback, silent)
                -- Registers optional callback function to update your addon's strings when the prefered locale is changed
                if (not silent) then
                        if (not key) then
                                DEFAULT_CHAT_FRAME:AddMessage("[Localization] WARNING: key for RegisterCallback invalid.")
                                return
                        end
                        if (not callback) then
                                DEFAULT_CHAT_FRAME:AddMessage("[Localization] WARNING: callback for RegisterCallback invalid.")
                        end
                        if (Localization.callbacks[key]) then
                                DEFAULT_CHAT_FRAME:AddMessage("[Localization] WARNING: callback allready exists for key: " .. key)
                        end
                end
                Localization.callbacks[key] = callback
        end

        function Localization.GetString(addon, stringKey)
                -- returns the globally prefered localization, else client locale, else addon default
                -- It is recommended you make an addon file local refrence to shorten this call in your code:
                -- local function TEXT(key) return Localization.GetString("YourAddonName", key) end
                local lang;
                if (Localization.preferedLocale) then
                        lang = Localization.localizedStrings[Localization.preferedLocale]
                        if (lang[addon] and lang[addon][stringKey]) then
                                return lang[addon][stringKey]
                        elseif (Localization.preferedLocale == "enGB") then
                                -- enGB falls back on enUS
                                lang = Localization.localizedStrings["enUS"]
                                if (lang and lang[addon] and lang[addon][stringKey]) then
                                        return lang[addon][stringKey]
                                end
                        end
                end
                lang = Localization.localizedStrings[Localization.clientLocale]
                if (lang[addon] and lang[addon][stringKey]) then
                        return lang[addon][stringKey]
                elseif (Localization.clientLocale == "enGB") then
                        -- enGB falls back on enUS
                        lang = Localization.localizedStrings["enUS"]
                        if (lang and lang[addon] and lang[addon][stringKey]) then
                                return lang[addon][stringKey]
                        end
                end
                
                return Localization.localizedStrings[Localization.defaults[addon]][addon][stringKey]
        end
        
        function Localization.GetClientString(addon, stringKey)
                -- returns the client localization, else addon default
                local lang = Localization.localizedStrings[Localization.clientLocale]
                if (lang[addon] and lang[addon][stringKey]) then
                        return lang[addon][stringKey]
                elseif (Localization.clientLocale == "enGB") then
                        -- enGB falls back on enUS
                        lang = Localization.localizedStrings["enUS"]
                        if (lang and lang[addon] and lang[addon][stringKey]) then
                                return lang[addon][stringKey]
                        end
                end
                
                return Localization.localizedStrings[Localization.defaults[addon]][addon][stringKey]
        end
        
        function Localization.GetSpecificString(language, addon, stringKey)
                if (Localization.localizedStrings[language] and Localization.localizedStrings[language][addon]) then
                        return Localization.localizedStrings[language][addon][stringKey]
                end
        end
        
        function Localization.AssignAddonGlobalStrings(addon)
                -- Assigns global values to the keys of the global String database
                -- First choice is prefered localization, else client locale, else addon default
                -- This function must be called in your addon after SetAddonDefault and before the global strings can be used.
                local prefLang = Localization.preferedLocale and Localization.localizedGlobalStrings[Localization.preferedLocale] and Localization.localizedGlobalStrings[Localization.preferedLocale][addon]
                local clientLang = Localization.clientLocale and Localization.localizedGlobalStrings[Localization.clientLocale] and Localization.localizedGlobalStrings[Localization.clientLocale][addon]
                local preferedIsGB = (Localization.preferedLocale == "enGB")
                local enUSLang = Localization.localizedGlobalStrings["enUS"] and Localization.localizedGlobalStrings["enUS"][addon]
                local defaultLang = Localization.localizedGlobalStrings[Localization.defaults[addon]][addon]
                
                for key, text in defaultLang do
                        if (prefLang and prefLang[key]) then
                                setglobal(key, prefLang[key])
                        elseif (preferedIsGB and enUSLang and enUSLang[key]) then
                                setglobal(key, enUSLang[key])
                        elseif (clientLang and clientLang[key]) then
                                setglobal(key, clientLang[key])
                        else
                                setglobal(key, text)
                        end
                end

        end
        
        ------------------------------------------------------------------------------
        --[[ Internal Functions ]]--
        ------------------------------------------------------------------------------
        
        local function TEXT(key) return Localization.GetString("Localization", key) end
        
        function Localization.SetGlobalPreference(localization)
                if (type(localization) ~= "string") then
                        return
                end
                -- Global preference will be used for GetString
                Localization.preferedLocale = localization
                SetCVar("PreferedLocale", localization)
                for key, func in Localization.callbacks do
                        func(localization)
                end
        end
        
        function Localization.GetGlobalPreference()
                return GetCVar("PreferedLocale")
        end
        
        function Localization.RemoveUnusedLocales()
                -- Keeps current prefered and client Localizations as well as addon defaults, removes all else from memory
                -- reloadui to get back deleted localized strings
                for locale, addonTable in Localization.localizedStrings do
                        if (locale ~= Localization.clientLocale and locale ~= Localization.preferedLocale) then
                                local used;
                                for addon, default in Localization.defaults do
                                        if (locale == default or Localization.protected[locale][addon]) then
                                                used = true
                                        else
                                                Localization.localizedStrings[locale][addon] = nil 
                                        end
                                end
                                if (not used) then
                                        Localization.localizedStrings[locale] = nil
                                end
                        end
                end
        end
        
        function Localization.AssignAllGlobalStrings()
                -- Assigns global values to the keys of the global String database
                -- First choice is prefered localization, else client locale, else addon default
                -- This function is called when the Global preference is updated
                local prefLang = Localization.preferedLocale and Localization.localizedGlobalStrings[Localization.preferedLocale]
                local clientLang = Localization.clientLocale and Localization.localizedGlobalStrings[Localization.clientLocale]
                local preferedIsGB = (Localization.preferedLocale == "enGB")
                local enUSLang = Localization.localizedGlobalStrings["enUS"]
                
                for addon, locale in Localization.defaults do
                        local lang = Localization.localizedGlobalStrings[locale]
                        if (lang and lang[addon]) then
                                -- If there aren't any default global strings for this local or addon, don't bother trying to assign any from other locales
                                for key, text in lang[addon] do
                                        if (prefLang and prefLang[addon] and prefLang[addon][key]) then
                                                setglobal(key, prefLang[addon][key])
                                        elseif (preferedIsGB and enUSLang and enUSLang[addon] and enUSLang[addon][key]) then
                                                setglobal(key, enUSLang[addon][key])
                                        elseif (clientLang and clientLang[addon] and clientLang[addon][key]) then
                                                setglobal(key, clientLang[addon][key])
                                        else
                                                setglobal(key, text)
                                        end
                                end
                        end
                end

        end
        
        ------------------------------------------------------------------------------
        --[[ Frame Scripts ]]--
        ------------------------------------------------------------------------------
        
        function Localization.Prompt()
                --Show Frame with dropdown asking for prefered language
                LanguageSelectionFrame:Show()
                --Have option checkbox for removing unused languages
                --Select options and then click Confirm/Cancil
                
                --will Khaos need an update?
        end
        
        function Localization.UpdatePrompt()
                LanguageSelectionFrameConfigurationSelectText:SetText(TEXT(Localization.preferedLocale));
                LanguageSelectionFrameText:SetText(TEXT("SelectPreferred"))
                LanguageSelectionFrameCheckBoxText:SetText(TEXT("RemoveUnused"))
                LanguageSelectionFrameLeftButton:SetText(TEXT("Confirm"))
                LanguageSelectionFrameRightButton:SetText(TEXT("Cancel"))
        end
        
        function Localization.OnEvent()
                if (event == "VARIABLES_LOADED" or (Localization.variablesHaveLoaded and event == "ADDON_LOADED")) then
                        Localization.variablesHaveLoaded = true
                        if (not LanguageSelectionFrame:IsShown()) then
                                if (Localization.promptForPrefrence) then
                                        Localization.Prompt()
                                else
                                        Localization.SetGlobalPreference(Localization.preferedLocale)
                                        if (GetCVar("RemoveUnusedLocales") == 'true') then
                                                Localization.RemoveUnusedLocales()
                                        end
                                        --[[
                                        if (arg1) then
                                                -- ADDON_LOADED passed Addon Name as arg1
                                                if (Localization.defaults[arg1]) then
                                                        Localization.AssignAllGlobalStrings(arg1)
                                                end
                                        else
                                                Localization.AssignAllGlobalStrings()
                                        end
                                        ]]--
                                end
                        end
                end
                if (not Localization.earthButtonLoaded) then
                        Localization.earthButtonLoaded = true
                        if(EarthFeature_AddButton) then
                                EarthFeature_AddButton(
                                        {
                                                id = LOCALIZATION_NAME;
                                                name = function() return TEXT("Localization") end;
                                                subtext = function() return TEXT("ShowPrompt") end;
                                                tooltip = function() return TEXT("EarthTooltip") end;
                                                icon = "Interface\\Icons\\INV_Misc_Book_06";
                                                callback = Localization.Prompt;
                                        }
                                );
                        end
                        if(CT_RegisterMod) then
                                -- This will only work for whatever language is prefered when it's run.
                                -- It would require substantial hacking to force it to update when the locale changes.
                                CT_RegisterMod(
                                        LOCALIZATION_NAME,
                                        TEXT("ShowPrompt"),
                                        5,
                                        "Interface\\Icons\\INV_Misc_Book_06",
                                        TEXT("EarthTooltip"),
                                        "on",
                                        "",
                                        Localization.Prompt
                                );
                        end
                        if(myAddOnsFrame_Register) then
                                myAddOnsFrame_Register(
                                        {
                                                name = LOCALIZATION_NAME;
                                                version = Localization.version;
                                                releaseDate = LOCALIZATION_LAST_UPDATED;
                                                author = LOCALIZATION_AUTHOR;
                                                email = LOCALIZATION_EMAIL;
                                                website = LOCALIZATION_WEBSITE;
                                                category = MYADDONS_CATEGORY_OTHERS;
                                                optionsframe = "LanguageSelectionFrame";
                                        }
                                );
                        end
                end
        end
        
        function Localization.SellectionFrame_OnShow()
                if (not Localization.preferedLocale) then
                        Localization.SetGlobalPreference(Localization.clientLocale)
                else
                        Localization.UpdatePrompt()
                end
                LanguageSelectionFrame.oldLocalePref = Localization.preferedLocale
                LanguageSelectionFrameCheckBox:SetChecked( GetCVar("RemoveUnusedLocales") == 'true' )
        end
        
        function Localization.ConfirmPreference()
                if (LanguageSelectionFrameCheckBox:GetChecked()) then
                        SetCVar("RemoveUnusedLocales", 'true')
                        Localization.RemoveUnusedLocales()
                else
                        SetCVar("RemoveUnusedLocales", 'false')
                end
                this:GetParent():Hide()
        end
        
        function Localization.CancelPreference()
                Localization.SetGlobalPreference(LanguageSelectionFrame.oldLocalePref)
                this:GetParent():Hide()
        end
        
        ------------------------------------------------------------------------------
        --[[ Menu Functions ]]--
        ------------------------------------------------------------------------------
        
        function Localization.LoadDropDownMenu()
                
                -- Title
                local info = {}
                info.text = TEXT("AvailLangs")
                info.notClickable = 1
                info.isTitle = 1
                UIDropDownMenu_AddButton(info, 1)
                
                -- Client Locale at top
                local info = {}
                info.value = Localization.clientLocale
                info.text = TEXT(info.value)
                if (Localization.preferedLocale == info.value) then
                        info.checked = true
                end
                info.func = function()
                        Localization.SetGlobalPreference(info.value)
                end
                UIDropDownMenu_AddButton(info, 1)
                
                -- Note that the current menu frame will only allow for 32 objects, 31 locales + title
                for locale, AddonList in Localization.localizedStrings do
                        if (locale ~= Localization.clientLocale) then
                                local info = {}
                                info.value = locale
                                info.text = TEXT(info.value)
                                if (not Localization.GetSpecificString(info.value, "Localization", info.value)) then
                                        -- If that local isn't localized inot a language name, use the locale string
                                        info.text = info.value
                                end
                                if (Localization.preferedLocale == info.value) then
                                        info.checked = true
                                end
                                info.func = function()
                                        Localization.SetGlobalPreference(info.value)
                                end
                                UIDropDownMenu_AddButton(info, 1)
                        end
                end
                
                -- Set the width of the menu to the size of the dropdown bar
                Localization.SetDropDownWidth(1, 200)
                
                -- nil the displayMode so that the rest of ToggleDropDownMenu doesn't error on the fake frame
                LanguageDropDown.displayMode = nil
        end
        
        function Localization.SetDropDownWidth(id, width)
                local dropdown = getglobal("DropDownList"..id)
                dropdown:SetWidth(width)
                local i = 1
                local button = getglobal("DropDownList"..id.."Button"..i)
                while (button) do
                        -- Left is aligned by default, align the right side too.
                        button:SetPoint("RIGHT", dropdown, "RIGHT", -10,0)
                        i = i + 1
                        button = getglobal("DropDownList"..id.."Button"..i)
                end
                dropdown.noResize = 1
        end
        
        function Localization.ShowDropDown()
                LanguageDropDown.displayMode = "MENU"
                ToggleDropDownMenu(1, nil, LanguageDropDown, this:GetName(), 0, 0, "TOPLEFT")
                PlaySound("igMainMenuOptionCheckBoxOn")
        end

        ------------------------------------------------------------------------------
        --[[ Frame Templates - Requires Iriel's VirtualFrames package ]]--
        ------------------------------------------------------------------------------
        
        local VF = IrielVirtualFrames:GetInstance("KarlPrototype-2-dev")
        
        VF:Register("EarthCheckButtonTemplate", {
                type = "CheckButton";
                name = "EarthCheckButtonTemplate";
                Size = { 32, 32, };
                NormalTexture = {
                        type = "Texture";
                        name = "$parentNormalTexture";
                        Texture = "Interface\\Buttons\\UI-CheckBox-Up";
                };
                PushedTexture = {
                        type = "Texture";
                        name = "$parentPushedTexture";
                        Texture = "Interface\\Buttons\\UI-CheckBox-Down";
                };
                HighlightTexture = {
                        type = "Texture";
                        name = "$parentHighlightTexture";
                        Texture = "Interface\\Buttons\\UI-CheckBox-Highlight";
                        AlphaMode = "ADD";
                };
                CheckedTexture = {
                        type = "Texture";
                        name = "$parentCheckedTexture";
                        Texture = "Interface\\Buttons\\UI-CheckBox-Check";
                };
                DisabledCheckedTexture = {
                        type = "Texture";
                        name = "$parentDisabledCheckedTexture";
                        Texture = "Interface\\Buttons\\UI-CheckBox-Check-Disabled";
                };
                -- Regions
                {
                        type = "FontString";
                        name = "$parentText";
                        inherits = "GameFontNormalSmall";
                        DrawLayer = "ARTWORK";
                        Anchors = {
                                {"LEFT", nil, "RIGHT", -2, 0, };
                        };
                };
        });
        
        VF:Register("EarthPanelButtonUpTexture", {
                type = "Texture";
                name = "EarthPanelButtonUpTexture";
                Texture = "Interface\\Buttons\\UI-Panel-Button-Up";
                TexCoords = { left = 0, right = 0.625, top = 0, bottom = 0.6875, };
        });
        
        VF:Register("EarthPanelButtonDownTexture", {
                type = "Texture";
                name = "EarthPanelButtonDownTexture";
                Texture = "Interface\\Buttons\\UI-Panel-Button-Down";
                TexCoords = { left = 0, right = 0.625, top = 0, bottom = 0.6875, };
        });
        
        VF:Register("EarthPanelButtonDisabledTexture", {
                type = "Texture";
                name = "EarthPanelButtonDisabledTexture";
                Texture = "Interface\\Buttons\\UI-Panel-Button-Disabled";
                TexCoords = { left = 0, right = 0.625, top = 0, bottom = 0.6875, };
        });
        
        VF:Register("EarthPanelButtonDisabledDownTexture", {
                type = "Texture";
                name = "EarthPanelButtonDisabledDownTexture";
                Texture = "Interface\\Buttons\\UI-Panel-Button-Disabled-Down";
                TexCoords = { left = 0, right = 0.625, top = 0, bottom = 0.6875, };
        });
        
        VF:Register("EarthPanelButtonHighlightTexture", {
                type = "Texture";
                name = "EarthPanelButtonHighlightTexture";
                Texture = "Interface\\Buttons\\UI-Panel-Button-Highlight";
                AlphaMode = "ADD";
                TexCoords = { left = 0, right = 0.625, top = 0, bottom = 0.6875, };
        });
        
        VF:Register("EarthPanelButtonTemplate", {
                type = "Button";
                name = "EarthPanelButtonTemplate";
                NormalText = {
                        type = "Font";
                        name = "$parentText";
                        inherits = "GameFontNormal";
                };
                DisabledText = {
                        type = "Font";
                        inherits = "GameFontDisable";
                };
                HighlightText = {
                        type = "Font";
                        inherits = "GameFontHighlight";
                };
                NormalTexture = {
                        type = "Texture";
                        inherits = "EarthPanelButtonUpTexture";
                };
                PushedTexture = {
                        type = "Texture";
                        inherits = "EarthPanelButtonDownTexture";
                };
                DisabledTexture = {
                        type = "Texture";
                        inherits = "EarthPanelButtonDisabledTexture";
                };
                HighlightTexture = {
                        type = "Texture";
                        inherits = "EarthPanelButtonHighlightTexture";
                };
        });
        
        VF:Register("LoginSelectionFrameTemplate", {
                type = "Frame";
                Hidden = true;
                Parent = "UIParent";
                Size = { 300, 150, };
                Anchors = {
                        {"CENTER", "$parent", "CENTER", 0, 40, };
                };
                Backdrop = {
                        bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
                        edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
                        tile = true, tileSize = 16, edgeSize = 16, -- misc values
                        insets = { left = 4, right = 4, top = 4, bottom = 4, },
                };
                -- Regions
                {
                        type = "FontString";
                        name = "$parentText";
                        inherits = "GameFontNormal";
                        --DrawLayer = "LOW";
                        --MaxLines = 12;
                        Size = { 0, 10, };
                        Anchors = {
                                {"TOP", "$parent", "TOP", 0, -20, };
                        };
                };
                -- Children
                {
                        type = "Frame";
                        name = "$parentConfigurationSelect";
                        Size = { 220, 32, };
                        Anchors = {
                                {"CENTER", "$parent", "CENTER", 0, 10, };
                        };
                        -- Regions
                        {
                                type = "Texture";
                                name = "$parentLeft";
                                DrawLayer = "ARTWORK";
                                Texture = "Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame";
                                Size = { 25, 64, };
                                Anchors = {
                                        {"TOPLEFT", nil, "TOPLEFT", 0, 17, };
                                };
                                TexCoords = { left = 0, right = 0.1953125, top = 0, bottom = 1, };
                        };
                        {
                                type = "Texture";
                                name = "$parentMiddle";
                                DrawLayer = "ARTWORK";
                                Texture = "Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame";
                                Size = { 180, 64, };
                                Anchors = {
                                        {"LEFT", "$parentLeft", "RIGHT"};
                                };
                                TexCoords = { left = 0.1953125, right = 0.8046875, top = 0, bottom = 1, };
                        };
                        {
                                type = "Texture";
                                name = "$parentRight";
                                DrawLayer = "ARTWORK";
                                Texture = "Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame";
                                Size = { 25, 64, };
                                Anchors = {
                                        {"LEFT", "$parentMiddle", "RIGHT"};
                                };
                                TexCoords = { left = 0.8046875, right = 1, top = 0, bottom = 1, };
                        };
                        {
                                type = "FontString";
                                name = "$parentText";
                                inherits = "GameFontHighlightSmall";
                                DrawLayer = "ARTWORK";
                                JustifyH = "RIGHT";
                                Size = { 0, 10, };
                                Anchors = {
                                        {"RIGHT", "$parentRight", "RIGHT", -43, 2, };
                                };
                        };
                        -- Children
                        {
                                type = "Button";
                                name = "$parentButton";
                                Size = { 24, 24, };
                                Anchors = {
                                        {"TOPLEFT", "$parentLeft", "TOPLEFT", 16, -19, };
                                };
                                NormalTexture = {
                                        type = "Texture";
                                        name = "$parentNormalTexture";
                                        Texture = "Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Up";
                                        Size = { 24, 24, };
                                        Anchors = {
                                                {"RIGHT", nil, "RIGHT"};
                                        };
                                };
                                PushedTexture = {
                                        type = "Texture";
                                        name = "$parentPushedTexture";
                                        Texture = "Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Down";
                                        Size = { 24, 24, };
                                        Anchors = {
                                                {"RIGHT", nil, "RIGHT"};
                                        };
                                };
                                DisabledTexture = {
                                        type = "Texture";
                                        name = "$parentDisabledTexture";
                                        Texture = "Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Disabled";
                                        Size = { 24, 24, };
                                        Anchors = {
                                                {"RIGHT", nil, "RIGHT"};
                                        };
                                };
                                HighlightTexture = {
                                        type = "Texture";
                                        name = "$parentHighlightTexture";
                                        Texture = "Interface\\Buttons\\UI-Common-MouseHilight";
                                        AlphaMode = "ADD";
                                        Size = { 24, 24, };
                                        Anchors = {
                                                {"RIGHT", nil, "RIGHT"};
                                        };
                                };
                        };
                };
                {
                        type = "CheckButton";
                        name = "$parentCheckBox";
                        inherits = "EarthCheckButtonTemplate";
                        Size = { 32, 32, };
                        Anchors = {
                                {"TOPLEFT", "$parent", "LEFT", 16, -8, };
                        };
                };
                {
                        type = "Button";
                        name = "$parentLeftButton";
                        inherits = "EarthPanelButtonTemplate";
                        Size = { 96, 24, };
                        Anchors = {
                                {"TOP", "$parent", "CENTER", -64, -38, };
                        };
                };
                {
                        type = "Button";
                        name = "$parentRightButton";
                        inherits = "EarthPanelButtonTemplate";
                        Size = { 96, 24, };
                        Anchors = {
                                {"TOP", "$parent", "CENTER", 64, -38, };
                        };
                };
        });
        
        ------------------------------------------------------------------------------
        --[[ Frame Instantiations ]]--
        ------------------------------------------------------------------------------
        
        VF:Instantiate("LoginSelectionFrameTemplate", "LanguageSelectionFrame", "UIParent")
        
        -- Fake menu frame.... who says you need a frame, bah!
        LanguageDropDown = {
                initialize = Localization.LoadDropDownMenu;
                GetName = function() return "LanguageDropDown" end;
                SetHeight = function() end;
        }
        
        ------------------------------------------------------------------------------
        --[[ Frame Script Assignment ]]--
        ------------------------------------------------------------------------------
        
        LanguageSelectionFrame:RegisterEvent("VARIABLES_LOADED")
        LanguageSelectionFrame:RegisterEvent("ADDON_LOADED")
        
        LanguageSelectionFrame:SetScript("OnEvent", Localization.OnEvent)
        LanguageSelectionFrame:SetScript("OnShow", Localization.SellectionFrame_OnShow)
        LanguageSelectionFrameConfigurationSelectButton:SetScript("OnClick", Localization.ShowDropDown)
        LanguageSelectionFrameLeftButton:SetScript("OnClick", Localization.ConfirmPreference)
        LanguageSelectionFrameRightButton:SetScript("OnClick", Localization.CancelPreference)
        
        ------------------------------------------------------------------------------
        --[[ Slash Command ]]--
        ------------------------------------------------------------------------------
        
        SLASH_LOCALIZATION1 = "/locale"
        SlashCmdList["LOCALIZATION"] = Localization.Prompt      
        
        ------------------------------------------------------------------------------
        --[[ Direct Execution ]]--
        ------------------------------------------------------------------------------
        
        Localization.SetAddonDefault("Localization", "enUS")
        Localization.RegisterCallback("AssignAllGlobalStrings", Localization.AssignAllGlobalStrings)
        Localization.RegisterCallback("LocalizationPrompt", Localization.UpdatePrompt)
        
        -- Leave frame text updating until after the localization files have been loaded
        
end