Firmware update

This commit is contained in:
Tercio Jose
2023-02-27 11:50:35 -03:00
parent 6d43f0fb5c
commit edfe561dcc
5 changed files with 622 additions and 157 deletions
+40 -30
View File
@@ -15,7 +15,7 @@ local max = math.max
--api locals
local PixelUtil = PixelUtil or DFPixelUtil
local version = 14
local version = 16
local CONST_MENU_TYPE_MAINMENU = "main"
local CONST_MENU_TYPE_SUBMENU = "sub"
@@ -594,12 +594,12 @@ function DF:CreateCoolTip()
statusbar.subMenuArrow:SetTexture("Interface\\CHATFRAME\\ChatFrameExpandArrow")
statusbar.subMenuArrow:Hide()
statusbar.leftText = statusbar:CreateFontString("$parent_LeftText", "OVERLAY", "GameTooltipHeaderText")
statusbar.leftText = statusbar:CreateFontString("$parent_LeftText", "overlay", "GameFontNormal")
statusbar.leftText:SetJustifyH("LEFT")
statusbar.leftText:SetPoint("LEFT", statusbar.leftIcon, "RIGHT", 3, 0)
DF:SetFontSize(statusbar.leftText, 10)
statusbar.rightText = statusbar:CreateFontString("$parent_TextRight", "OVERLAY", "GameTooltipHeaderText")
statusbar.rightText = statusbar:CreateFontString("$parent_TextRight", "overlay", "GameFontNormal")
statusbar.rightText:SetJustifyH("RIGHT")
statusbar.rightText:SetPoint("RIGHT", statusbar.rightIcon, "LEFT", -3, 0)
DF:SetFontSize(statusbar.leftText, 10)
@@ -940,7 +940,24 @@ function DF:CreateCoolTip()
--set text
if (leftTextSettings) then
--font settings
local languageId = DF.Language.DetectLanguageId(leftTextSettings[1])
if (languageId ~= menuButton.leftText.languageId) then
local newFont = DF.Language.GetFontForLanguageID(languageId)
DF:SetFontFace(menuButton.leftText, newFont)
menuButton.leftText.languageId = languageId
local bIsLatinAlphabet = DF:IsLatinLanguage(languageId)
if (not bIsLatinAlphabet) then
menuButton.leftText.requiredFont = newFont
gameCooltip.OptionsTable.TextFont = newFont
else
menuButton.leftText.requiredFont = nil
end
end
menuButton.leftText:SetText(leftTextSettings[1])
local r, g, b, a = leftTextSettings[2], leftTextSettings[3], leftTextSettings[4], leftTextSettings[5]
if (r == 0 and g == 0 and b == 0 and a == 0) then
@@ -978,9 +995,10 @@ function DF:CreateCoolTip()
local _, size, flags = menuButton.leftText:GetFont()
flags = leftTextSettings[8] or gameCooltip.OptionsTable.TextShadow or nil
size = leftTextSettings[6] or gameCooltip.OptionsTable.TextSize or size
menuButton.leftText:SetFont(font, size, flags)
menuButton.leftText:SetFont(menuButton.leftText.requiredFont or font, size, flags)
end
--font settings
elseif (leftTextSettings[7]) then
if (_G[leftTextSettings[7]]) then
menuButton.leftText:SetFontObject(leftTextSettings[7])
@@ -1000,7 +1018,7 @@ function DF:CreateCoolTip()
menuButton.leftText:SetFont(gameCooltip.defaultFont, leftTextSettings[6] or gameCooltip.OptionsTable.TextSize or 10, leftTextSettings[8] or gameCooltip.OptionsTable.TextShadow)
end
local heightMod = gameCooltip.OptionsTable.TextHeightMod or 0
local heightMod = gameCooltip.OptionsTable.TextHeightMod or 0
menuButton.leftText:SetPoint("center", menuButton.leftIcon, "center", 0, 0 + heightMod)
menuButton.leftText:SetPoint("left", menuButton.leftIcon, "right", 3, 0 + heightMod)
else
@@ -1008,7 +1026,23 @@ function DF:CreateCoolTip()
end
if (rightTextSettings) then
local languageId = DF.Language.DetectLanguageId(rightTextSettings[1])
if (languageId ~= menuButton.rightText.languageId) then
local newFont = DF.Language.GetFontForLanguageID(languageId)
DF:SetFontFace(menuButton.rightText, newFont)
menuButton.rightText.languageId = languageId
local bIsLatinAlphabet = DF:IsLatinLanguage(languageId)
if (not bIsLatinAlphabet) then
menuButton.rightText.requiredFont = newFont
gameCooltip.OptionsTable.TextFont = newFont
else
menuButton.rightText.requiredFont = nil
end
end
menuButton.rightText:SetText(rightTextSettings[1])
local r, g, b, a = rightTextSettings[2], rightTextSettings[3], rightTextSettings[4], rightTextSettings[5]
if (r == 0 and g == 0 and b == 0 and a == 0) then
@@ -1043,7 +1077,7 @@ function DF:CreateCoolTip()
local _, fontSize, fontFlags = menuButton.rightText:GetFont()
fontFlags = rightTextSettings[8] or gameCooltip.OptionsTable.TextShadow or nil
fontSize = rightTextSettings[6] or gameCooltip.OptionsTable.TextSize or fontSize
menuButton.rightText:SetFont(fontFace, fontSize, fontFlags)
menuButton.rightText:SetFont(menuButton.leftText.requiredFont or fontFace, fontSize, fontFlags)
end
elseif (rightTextSettings[7]) then
@@ -3615,30 +3649,6 @@ function DF:CreateCoolTip()
end)
end
local cyrillic = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯЁЂЃЄЅІЇЈЉЊЋЌЎЏҐабвгдежзийклмнопрстуфхцчшщъыьэюяёђѓєѕіїјљњћќўџґАаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя"
local latin = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
local chinese = "ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑ하ᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵ"
local alphabetTable = {}
for letter in latin:gmatch(".") do
alphabetTable[letter] = "enUS"
end
for letter in cyrillic:gmatch(".") do
alphabetTable[letter] = "ruRU"
end
for letter in chinese:gmatch(".") do
alphabetTable[letter] = "zhCN"
end
function gameCooltip:DetectLanguageId(text)
for letter in text:gmatch(".") do
if (alphabetTable[letter]) then
return alphabetTable[letter]
end
end
end
return gameCooltip
end
+56 -13
View File
@@ -37,6 +37,7 @@ DF:Mixin(DropDownMetaFunctions, DF.SetPointMixin)
DF:Mixin(DropDownMetaFunctions, DF.FrameMixin)
DF:Mixin(DropDownMetaFunctions, DF.TooltipHandlerMixin)
DF:Mixin(DropDownMetaFunctions, DF.ScriptHookMixin)
DF:Mixin(DropDownMetaFunctions, DF.Language.LanguageMixin)
------------------------------------------------------------------------------------------------------------
--metatables
@@ -492,7 +493,28 @@ function DropDownMetaFunctions:Selected(thisOption)
self.last_select = thisOption
self:NoOption(false)
self.label:SetText(thisOption.label)
local addonId = self.addonId
local languageId = thisOption.languageId
local phraseId = thisOption.phraseId
local overrideFont
if (addonId) then
local thisLanguageId = languageId or DF.Language.GetLanguageIdForAddonId(addonId)
if (thisLanguageId) then
if (thisLanguageId ~= self.label.languageId) then
local newFont = DF.Language.GetFontForLanguageID(thisLanguageId)
self.label.languageId = thisLanguageId
overrideFont = newFont
end
end
end
if (addonId and phraseId) then
self.label:SetText(DF.Language.GetText(addonId, phraseId))
else
self.label:SetText(thisOption.label)
end
self.icon:SetTexture(thisOption.icon)
if (thisOption.icon) then
@@ -543,8 +565,12 @@ function DropDownMetaFunctions:Selected(thisOption)
self.label:SetTextColor(1, 1, 1, 1)
end
if (thisOption.font) then
if (overrideFont) then
self.label:SetFont(overrideFont, 10)
elseif (thisOption.font) then
self.label:SetFont(thisOption.font, 10)
else
self.label:SetFont("GameFontHighlightSmall", 10)
end
@@ -648,7 +674,7 @@ end
function DetailsFrameworkDropDownOnMouseDown(button, buttontype)
local object = button.MyObject
--click to open
--~click to open
if (not object.opened and not rawget(object, "lockdown")) then
local optionsTable = DF:Dispatch(object.func, object)
object.builtMenu = optionsTable
@@ -734,12 +760,6 @@ function DetailsFrameworkDropDownOnMouseDown(button, buttontype)
thisOptionFrame.icon:SetSize(thisOptionFrame:GetHeight()-6, thisOptionFrame:GetHeight()-6)
end
if (thisOption.font) then
thisOptionFrame.label:SetFont(thisOption.font, 10.5)
else
thisOptionFrame.label:SetFont("GameFontHighlightSmall", 10.5)
end
if (thisOption.statusbar) then
thisOptionFrame.statusbar:SetTexture(thisOption.statusbar)
if (thisOption.statusbarcolor) then
@@ -757,8 +777,35 @@ function DetailsFrameworkDropDownOnMouseDown(button, buttontype)
thisOptionFrame.rightButton:Hide()
end
local overrideFont
local languageId = thisOption.languageId
if (languageId) then
if (languageId ~= thisOptionFrame.label.languageId) then
local newFont = DF.Language.GetFontForLanguageID(languageId)
thisOptionFrame.label.languageId = languageId
overrideFont = newFont
end
else
languageId = DF.Language.DetectLanguageId(thisOption.label)
if (languageId ~= thisOptionFrame.label.languageId) then
local newFont = DF.Language.GetFontForLanguageID(languageId)
thisOptionFrame.label.languageId = languageId
overrideFont = newFont
end
end
thisOptionFrame.label:SetText(thisOption.label)
if (overrideFont) then
thisOptionFrame.label:SetFont(overrideFont, 10.5)
elseif (thisOption.font) then
thisOptionFrame.label:SetFont(thisOption.font, 10.5)
else
thisOptionFrame.label:SetFont("GameFontHighlightSmall", 10.5)
end
if (currentText and currentText == thisOption.label) then
if (thisOption.icon) then
selectedTexture:SetPoint("left", thisOptionFrame.icon, "left", -3, 0)
@@ -859,10 +906,6 @@ function DetailsFrameworkDropDownOnMouseDown(button, buttontype)
end
object:Open()
--scrollFrame:SetHeight(300)
--scrollChild:SetHeight(300)
--scrollBorder:SetHeight(300)
else
--clear menu
end
+158 -47
View File
@@ -1,6 +1,6 @@
local dversion = 415
local dversion = 416
local major, minor = "DetailsFramework-1.0", dversion
local DF, oldminor = LibStub:NewLibrary(major, minor)
@@ -827,7 +827,7 @@ function DF:SetFontFace(fontString, fontface)
end
local _, size, flags = fontString:GetFont()
fontString:SetFont(fontface, size, flags)
return fontString:SetFont(fontface, size, flags)
end
---get the FontString passed and set the font color
@@ -1085,6 +1085,8 @@ function DF:TruncateText(fontString, maxWidth)
fontString:SetText(text)
end
---@param text string
---@return string
function DF:CleanTruncateUTF8String(text)
if type(text) == "string" and text ~= "" then
local b1 = (#text > 0) and strbyte(strsub(text, #text, #text)) or nil
@@ -1676,6 +1678,17 @@ end
return widgetObject
end
--get the description phrase from the language table or use the .desc or .deschraseid
local getDescPhraseText = function(languageTable, widgetTable)
local descPhraseId = languageTable and (languageTable[widgetTable.descPhraseId] or languageTable[widgetTable.desc])
return descPhraseId or widgetTable.descPhraseId or widgetTable.desc or widgetTable.name or "-?-"
end
local getNamePhraseText = function(languageTable, widgetTable, useColon)
local namePhrase = languageTable and (languageTable[widgetTable.namePhraseId] or languageTable[widgetTable.name])
return namePhrase or formatOptionNameWithColon(widgetTable.name, useColon) or widgetTable.namePhraseId or widgetTable.name or "-?-"
end
--volatile menu can be called several times, each time all settings are reset and a new menu is built using the same widgets
function DF:BuildMenuVolatile(parent, menuOptions, xOffset, yOffset, height, useColon, textTemplate, dropdownTemplate, switchTemplate, switchIsCheckbox, sliderTemplate, buttonTemplate, valueChangeHook)
if (not parent.widget_list) then
@@ -1753,7 +1766,8 @@ end
local label = getMenuWidgetVolative(parent, "label", widgetIndexes)
widgetCreated = label
label.text = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.get and widgetTable.get() or widgetTable.text) or (widgetTable.namePhraseId) or ""
local namePhrase = (languageTable and (languageTable[widgetTable.namePhraseId] or languageTable[widgetTable.name])) or (widgetTable.get and widgetTable.get()) or widgetTable.text or (widgetTable.namePhraseId) or ""
label.text = namePhrase
label.color = widgetTable.color
if (widgetTable.font) then
@@ -1777,7 +1791,7 @@ end
--dropdowns
elseif (widgetTable.type == "select" or widgetTable.type == "dropdown") then
assert(widgetTable.get, "DetailsFramework:BuildMenu(): .get not found in the widget table for 'select'")
assert(widgetTable.get, "DetailsFramework:BuildMenu(): .get() not found in the widget table for 'select'")
local dropdown = getMenuWidgetVolative(parent, "dropdown", widgetIndexes)
widgetCreated = dropdown
@@ -1786,11 +1800,13 @@ end
dropdown:Select(widgetTable.get())
dropdown:SetTemplate(dropdownTemplate)
dropdown:SetTooltip((languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId))
local descPhrase = getDescPhraseText(languageTable, widgetTable)
dropdown:SetTooltip(descPhrase)
dropdown._get = widgetTable.get
dropdown.widget_type = "select"
dropdown.hasLabel.text = (languageTable and languageTable[widgetTable.namePhraseId]) or formatOptionNameWithColon(widgetTable.name, useColon) or widgetTable.namePhraseId or ""
local namePhrase = getNamePhraseText(languageTable, widgetTable, useColon)
dropdown.hasLabel.text = namePhrase
dropdown.hasLabel:SetTemplate(widgetTable.text_template or textTemplate)
dropdown:ClearAllPoints()
@@ -1828,7 +1844,8 @@ end
switch:SetTemplate(switchTemplate)
switch:SetAsCheckBox() --it's always a checkbox on volatile menu
switch:SetTooltip((languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId))
local descPhrase = getDescPhraseText(languageTable, widgetTable)
switch:SetTooltip(descPhrase)
switch._get = widgetTable.get
switch.widget_type = "toggle"
switch.OnSwitch = widgetTable.set
@@ -1851,7 +1868,8 @@ end
switch:SetHeight(widgetTable.height)
end
switch.hasLabel.text = (languageTable and languageTable[widgetTable.namePhraseId]) or formatOptionNameWithColon(widgetTable.name, useColon) or widgetTable.namePhraseId or ""
local namePhrase = getNamePhraseText(languageTable, widgetTable, useColon)
switch.hasLabel.text = namePhrase
switch.hasLabel:SetTemplate(widgetTable.text_template or textTemplate)
switch:ClearAllPoints()
@@ -1899,7 +1917,8 @@ end
slider:SetTemplate(sliderTemplate)
slider:SetTooltip((languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId))
local descPhrase = getDescPhraseText(languageTable, widgetTable)
slider:SetTooltip(descPhrase)
slider._get = widgetTable.get
slider.widget_type = "range"
slider:SetHook("OnValueChange", widgetTable.set)
@@ -1921,7 +1940,8 @@ end
end
end
slider.hasLabel.text = (languageTable and languageTable[widgetTable.namePhraseId]) or formatOptionNameWithColon(widgetTable.name, useColon) or widgetTable.namePhraseId or ""
local namePhrase = getNamePhraseText(languageTable, widgetTable, useColon)
slider.hasLabel.text = namePhrase
slider.hasLabel:SetTemplate(widgetTable.text_template or textTemplate)
slider:SetPoint("left", slider.hasLabel, "right", 2)
@@ -1945,7 +1965,8 @@ end
colorpick:SetTemplate(buttonTemplate)
colorpick:SetSize(18, 18)
colorpick:SetTooltip((languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId))
local descPhrase = getDescPhraseText(languageTable, widgetTable)
colorpick:SetTooltip(descPhrase)
colorpick._get = widgetTable.get
colorpick.widget_type = "color"
@@ -1968,7 +1989,9 @@ end
end
local label = colorpick.hasLabel
label.text = (languageTable and languageTable[widgetTable.namePhraseId]) or formatOptionNameWithColon(widgetTable.name, useColon) or widgetTable.namePhraseId or ""
local namePhrase = getNamePhraseText(languageTable, widgetTable, useColon)
label.text = namePhrase
label:SetTemplate(widgetTable.text_template or textTemplate)
label:ClearAllPoints()
@@ -2005,7 +2028,9 @@ end
button.textcolor = textTemplate.color
button.textfont = textTemplate.font
button.textsize = textTemplate.size
button.text = (languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.name) or (widgetTable.namePhraseId) or ""
local namePhrase = getNamePhraseText(languageTable, widgetTable, useColon)
button.text = namePhrase
if (widgetTable.inline) then
if (latestInlineWidget) then
@@ -2019,7 +2044,8 @@ end
button:SetPoint(currentXOffset, currentYOffset)
end
button:SetTooltip((languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId))
local descPhrase = getDescPhraseText(languageTable, widgetTable)
button:SetTooltip(descPhrase)
button.widget_type = "execute"
--hook list
@@ -2054,14 +2080,16 @@ end
textentry:SetTemplate(widgetTable.template or widgetTable.button_template or buttonTemplate)
textentry:SetSize(widgetTable.width or 120, widgetTable.height or 18)
textentry:SetTooltip((languageTable and languageTable[widgetTable.namePhraseId]) or (widgetTable.desc) or (widgetTable.namePhraseId))
local descPhrase = getDescPhraseText(languageTable, widgetTable)
textentry:SetTooltip(descPhrase)
textentry.text = widgetTable.get()
textentry._get = widgetTable.get
textentry.widget_type = "textentry"
textentry:SetHook("OnEnterPressed", widgetTable.func or widgetTable.set)
textentry:SetHook("OnEditFocusLost", widgetTable.func or widgetTable.set)
textentry.hasLabel.text = (languageTable and languageTable[widgetTable.namePhraseId]) or formatOptionNameWithColon(widgetTable.name, useColon) or widgetTable.namePhraseId or ""
local namePhrase = getNamePhraseText(languageTable, widgetTable, useColon)
textentry.hasLabel.text = namePhrase
textentry.hasLabel:SetTemplate(widgetTable.text_template or textTemplate)
textentry:SetPoint("left", textentry.hasLabel, "right", 2)
textentry.hasLabel:SetPoint(currentXOffset, currentYOffset)
@@ -2116,6 +2144,52 @@ end
DF.RefreshUnsafeOptionsWidgets()
end
local getDescripttionPhraseID = function(widgetTable, languageAddonId, languageTable)
if (widgetTable.descPhraseId) then
return widgetTable.descPhraseId
end
if (not languageTable) then
return
end
local hasValue = DF.Language.DoesPhraseIDExistsInDefaultLanguage(languageAddonId, widgetTable.desc)
if (not hasValue) then
return
end
return widgetTable.desc
end
local getNamePhraseID = function(widgetTable, languageAddonId, languageTable)
if (widgetTable.namePhraseId) then
return widgetTable.namePhraseId
end
if (not languageTable) then
return
end
local keyName = widgetTable.name
if (widgetTable.type == "label" and widgetTable.get) then
local key = widgetTable.get()
if (key and type(key) == "string") then
keyName = key
end
end
--embed key is when the phraseId is inside a string surounded by @
local embedPhraseId = keyName:match("@(.-)@")
local hasValue = DF.Language.DoesPhraseIDExistsInDefaultLanguage(languageAddonId, embedPhraseId or keyName)
if (not hasValue) then
return
end
return keyName
end
function DF:BuildMenu(parent, menuOptions, xOffset, yOffset, height, useColon, textTemplate, dropdownTemplate, switchTemplate, switchIsCheckbox, sliderTemplate, buttonTemplate, valueChangeHook)
if (not parent.widget_list) then
DF:SetAsOptionsPanel(parent)
@@ -2182,8 +2256,10 @@ end
label.widget_type = "label"
label:SetPoint(currentXOffset, currentYOffset)
if (widgetTable.namePhraseId) then
DetailsFramework.Language.RegisterFontString(languageAddonId, label.widget, widgetTable.namePhraseId)
local namePhraseId = getNamePhraseID(widgetTable, languageAddonId, languageTable)
if (namePhraseId) then
DetailsFramework.Language.RegisterObject(languageAddonId, label.widget, namePhraseId)
label.languageAddonId = languageAddonId
else
local textToSet = (widgetTable.get and widgetTable.get()) or widgetTable.text or ""
label:SetText(textToSet)
@@ -2203,13 +2279,21 @@ end
assert(widgetTable.get, "DetailsFramework:BuildMenu(): .get not found in the widget table for 'select'")
local dropdown = DF:NewDropDown(parent, nil, "$parentWidget" .. index, nil, 140, 18, widgetTable.values, widgetTable.get(), dropdownTemplate)
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, dropdown, "have_tooltip", widgetTable.descPhraseId, widgetTable.desc)
local descPhraseId = getDescripttionPhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, dropdown, "have_tooltip", descPhraseId, widgetTable.desc)
dropdown._get = widgetTable.get
dropdown.widget_type = "select"
local label = DF:NewLabel(parent, nil, "$parentLabel" .. index, nil, "", "GameFontNormal", widgetTable.text_template or textTemplate or 12)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, label.widget, widgetTable.namePhraseId, formatOptionNameWithColon(widgetTable.name, useColon))
local namePhraseId = getNamePhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, label.widget, namePhraseId, formatOptionNameWithColon(widgetTable.name, useColon))
dropdown.addonId = languageAddonId
if (languageAddonId) then
DF.Language.RegisterCallback(languageAddonId, function(addonId, languageId, ...) dropdown:Select(dropdown:GetValue()) end)
C_Timer.After(0.1, function() dropdown:Select(dropdown:GetValue()) end)
end
dropdown:SetPoint("left", label, "right", 2)
label:SetPoint(currentXOffset, currentYOffset)
@@ -2246,7 +2330,8 @@ end
elseif (widgetTable.type == "toggle") then
local switch = DF:NewSwitch(parent, nil, "$parentWidget" .. index, nil, 60, 20, nil, nil, widgetTable.get(), nil, nil, nil, nil, switchTemplate)
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, switch, "have_tooltip", widgetTable.descPhraseId, widgetTable.desc)
local descPhraseId = getDescripttionPhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, switch, "have_tooltip", descPhraseId, widgetTable.desc)
switch._get = widgetTable.get
switch.widget_type = "toggle"
@@ -2275,7 +2360,9 @@ end
end
local label = DF:NewLabel(parent, nil, "$parentLabel" .. index, nil, "", "GameFontNormal", widgetTable.text_template or textTemplate or 12)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, label.widget, widgetTable.namePhraseId, formatOptionNameWithColon(widgetTable.name, useColon))
local namePhraseId = getNamePhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, label.widget, namePhraseId, formatOptionNameWithColon(widgetTable.name, useColon))
if (widgetTable.boxfirst or useBoxFirstOnAllWidgets) then
switch:SetPoint(currentXOffset, currentYOffset)
@@ -2314,7 +2401,8 @@ end
local isDecimanls = widgetTable.usedecimals
local slider = DF:NewSlider(parent, nil, "$parentWidget" .. index, nil, 140, 20, widgetTable.min, widgetTable.max, widgetTable.step, widgetTable.get(), isDecimanls, nil, nil, sliderTemplate)
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, slider, "have_tooltip", widgetTable.descPhraseId, widgetTable.desc)
local descPhraseId = getDescripttionPhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, slider, "have_tooltip", descPhraseId, widgetTable.desc)
slider._get = widgetTable.get
slider.widget_type = "range"
@@ -2338,7 +2426,8 @@ end
end
local label = DF:NewLabel(parent, nil, "$parentLabel" .. index, nil, "", "GameFontNormal", widgetTable.text_template or textTemplate or 12)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, label.widget, widgetTable.namePhraseId, formatOptionNameWithColon(widgetTable.name, useColon))
local namePhraseId = getNamePhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, label.widget, namePhraseId, formatOptionNameWithColon(widgetTable.name, useColon))
slider:SetPoint("left", label, "right", 2)
label:SetPoint(currentXOffset, currentYOffset)
@@ -2364,7 +2453,8 @@ end
assert(widgetTable.get, "DetailsFramework:BuildMenu(): .get not found in the widget table for 'color'")
local colorpick = DF:NewColorPickButton(parent, "$parentWidget" .. index, nil, widgetTable.set, nil, buttonTemplate)
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, colorpick, "have_tooltip", widgetTable.descPhraseId, widgetTable.desc)
local descPhraseId = getDescripttionPhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, colorpick, "have_tooltip", descPhraseId, widgetTable.desc)
colorpick._get = widgetTable.get
colorpick.widget_type = "color"
@@ -2385,7 +2475,8 @@ end
end
local label = DF:NewLabel(parent, nil, "$parentLabel" .. index, nil, "", "GameFontNormal", widgetTable.text_template or textTemplate or 12)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, label.widget, widgetTable.namePhraseId, formatOptionNameWithColon(widgetTable.name, useColon))
local namePhraseId = getNamePhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, label.widget, namePhraseId, formatOptionNameWithColon(widgetTable.name, useColon))
if (widgetTable.boxfirst or useBoxFirstOnAllWidgets) then
label:SetPoint("left", colorpick, "right", 2)
@@ -2416,7 +2507,9 @@ end
elseif (widgetTable.type == "execute") then
local button = DF:NewButton(parent, nil, "$parentWidget" .. index, nil, 120, 18, widgetTable.func, widgetTable.param1, widgetTable.param2, nil, "", nil, buttonTemplate, textTemplate)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, button.widget, widgetTable.namePhraseId, widgetTable.name)
local namePhraseId = getNamePhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, button.widget, namePhraseId, widgetTable.name)
if (not buttonTemplate) then
button:InstallCustomTexture()
@@ -2434,7 +2527,8 @@ end
button:SetPoint(currentXOffset, currentYOffset)
end
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, button, "have_tooltip", widgetTable.descPhraseId, widgetTable.desc)
local descPhraseId = getDescripttionPhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, button, "have_tooltip", descPhraseId, widgetTable.desc)
button.widget_type = "execute"
@@ -2476,7 +2570,8 @@ end
elseif (widgetTable.type == "textentry") then
local textentry = DF:CreateTextEntry(parent, widgetTable.func or widgetTable.set, 120, 18, nil, "$parentWidget" .. index, nil, buttonTemplate)
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, textentry, "have_tooltip", widgetTable.descPhraseId, widgetTable.desc)
local descPhraseId = getDescripttionPhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterTableKeyWithDefault(languageAddonId, textentry, "have_tooltip", descPhraseId, widgetTable.desc)
textentry.text = widgetTable.get()
textentry._get = widgetTable.get
@@ -2485,7 +2580,9 @@ end
textentry:SetHook("OnEditFocusLost", widgetTable.func or widgetTable.set)
local label = DF:NewLabel(parent, nil, "$parentLabel" .. index, nil, "", "GameFontNormal", widgetTable.text_template or textTemplate or 12)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, label.widget, widgetTable.namePhraseId, formatOptionNameWithColon(widgetTable.name, useColon))
local namePhraseId = getNamePhraseID(widgetTable, languageAddonId, languageTable)
DetailsFramework.Language.RegisterObjectWithDefault(languageAddonId, label.widget, namePhraseId, formatOptionNameWithColon(widgetTable.name, useColon))
textentry:SetPoint("left", label, "right", 2)
label:SetPoint(currentXOffset, currentYOffset)
@@ -2652,7 +2749,7 @@ end
for _, widget in ipairs(self.widget_list) do
if (widget._get) then
if (widget.widget_type == "label") then
if (widget._get()) then
if (widget._get() and not widget.languageAddonId) then
widget:SetText(widget._get())
end
@@ -2816,6 +2913,16 @@ end
--~templates
local latinLanguageIds = {"enUS", "deDE", "esES", "esMX", "frFR", "itIT", "ptBR"}
local latinLanguageIdsMap = {
["enUS"] = true,
["deDE"] = true,
["esES"] = true,
["esMX"] = true,
["frFR"] = true,
["itIT"] = true,
["ptBR"] = true,
}
local alphbets = {
[latinLanguageIds] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"},
["zhCN"] = {},
@@ -2850,27 +2957,27 @@ function DF:GetClientRegion()
end
DF.registeredFontPaths = DF.registeredFontPaths or {}
function DF:GetBestFontPathForLanguage(locale)
local fontPath = DF.registeredFontPaths[locale]
-- ~language ~locale ~fontpath
function DF:GetBestFontPathForLanguage(languageId)
local fontPath = DF.registeredFontPaths[languageId]
if (fontPath) then
return fontPath
end
--font paths gotten from creating a FontString with template "GameFontNormal" and getting the font returned from FontString:GetFont()
if (locale == "enUS" or locale == "deDE" or locale == "esES" or locale == "esMX" or locale == "frFR" or locale == "itIT" or locale == "ptBR") then
if (languageId == "enUS" or languageId == "deDE" or languageId == "esES" or languageId == "esMX" or languageId == "frFR" or languageId == "itIT" or languageId == "ptBR") then
return [[Fonts\FRIZQT__.TTF]]
elseif (locale == "ruRU") then
elseif (languageId == "ruRU") then
return [[Fonts\FRIZQT___CYR.TTF]]
elseif (locale == "zhCN") then
elseif (languageId == "zhCN") then
return [[Fonts\ARKai_T.ttf]]
elseif (locale == "zhTW") then
elseif (languageId == "zhTW") then
return [[Fonts\blei00d.TTF]]
elseif (locale == "koKR") then
elseif (languageId == "koKR") then
return [[Fonts\2002.TTF]]
end
@@ -2878,25 +2985,29 @@ function DF:GetBestFontPathForLanguage(locale)
return [[Fonts\FRIZQT__.TTF]]
end
function DF:IsLatinLanguage(languageId)
return latinLanguageIdsMap[languageId]
end
--return the best font to use for the client language
function DF:GetBestFontForLanguage(language, western, cyrillic, china, korean, taiwan)
if (not language) then
language = DF.ClientLanguage
function DF:GetBestFontForLanguage(languageId, western, cyrillic, china, korean, taiwan)
if (not languageId) then
languageId = DF.ClientLanguage
end
if (language == "enUS" or language == "deDE" or language == "esES" or language == "esMX" or language == "frFR" or language == "itIT" or language == "ptBR") then
if (languageId == "enUS" or languageId == "deDE" or languageId == "esES" or languageId == "esMX" or languageId == "frFR" or languageId == "itIT" or languageId == "ptBR") then
return western or "Friz Quadrata TT"
elseif (language == "ruRU") then
elseif (languageId == "ruRU") then
return cyrillic or "Friz Quadrata TT"
elseif (language == "zhCN") then
elseif (languageId == "zhCN") then
return china or "AR CrystalzcuheiGBK Demibold"
elseif (language == "koKR") then
elseif (languageId == "koKR") then
return korean or "2002"
elseif (language == "zhTW") then
elseif (languageId == "zhTW") then
return taiwan or "AR CrystalzcuheiGBK Demibold"
end
end
+317 -36
View File
@@ -134,6 +134,10 @@
--]=]
---@class addonNamespaceTable : table store language settings for an addon
---@class fontPath : string font path for a font file on the hardware of the user
local DF = _G["DetailsFramework"]
if (not DF or not DetailsFrameworkCanLoad) then
return
@@ -188,11 +192,61 @@ local fontLanguageCompatibility = {
["ruRU"] = 4,
}
--this table contains all the registered languages with their name and fonts
--by default it has all languages the game supports
--it is used when the dropdown shows the languages available for an addon, it take from here the name and font
--new non-native game languages registered with DetailsFramework.Language.RegisterLanguage() will be added to this table
local languagesAvailable = {
deDE = {text = "Deutsch", font = "Fonts\\FRIZQT__.TTF"},
enUS = {text = "English (US)", font = "Fonts\\FRIZQT__.TTF"},
esES = {text = "Español (ES)", font = "Fonts\\FRIZQT__.TTF"},
esMX = {text = "Español (MX)", font = "Fonts\\FRIZQT__.TTF"},
frFR = {text = "Français", font = "Fonts\\FRIZQT__.TTF"},
itIT = {text = "Italiano", font = "Fonts\\FRIZQT__.TTF"},
koKR = {text = "한국어", font = [[Fonts\2002.TTF]]},
ptBR = {text = "Português (BR)", font = "Fonts\\FRIZQT__.TTF"},
ruRU = {text = "Русский", font = "Fonts\\FRIZQT___CYR.TTF"},
zhCN = {text = "简体中文", font = [[Fonts\ARKai_T.ttf]]},
zhTW = {text = "繁體中文", font = [[Fonts\blei00d.TTF]]},
}
local fontPathToLanguageId = {
["Fonts\\FRIZQT__.TTF"] = "enUS",
["Fonts\\FRIZQT___CYR.TTF"] = "ruRU",
}
local cyrillic = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯЁЂЃЄЅІЇЈЉЊЋЌЎЏҐабвгдежзийклмнопрстуфхцчшщъыьэюяёђѓєѕіїјљњћќўџґАаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя"
local latin = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
local zhCN = "的一是不了人有在他这与大为上们国我以要他时来用到也再说生去子到了地个用发当没成方主于作者我自以前从他者进过家对小多然些起主要只当从把以后看作者们进无对从以后就以于着个过去以及时日能够年月进天们动"
local zhTW = "ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑ하ᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵ"
local koKR = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ"
local arAR = "ءآأؤإئابتثجحخدذرزسشصضطظعغفقكلمنهويىًٌٍَُِّْٰ"
local alphabetTable = {}
for letter in latin:gmatch(".") do
alphabetTable[letter] = "enUS"
end
for letter in cyrillic:gmatch(".") do
alphabetTable[letter] = "ruRU"
end
for letter in zhCN:gmatch(".") do
alphabetTable[letter] = "zhCN"
end
for letter in zhTW:gmatch(".") do
alphabetTable[letter] = "zhTW"
end
for letter in koKR:gmatch(".") do
alphabetTable[letter] = "koKR"
end
for letter in arAR:gmatch(".") do
alphabetTable[letter] = "arAR"
end
local functionSignature = {
["RegisterLanguage"] = "RegisterLanguage(addonID, languageID[, gameLanguageOnly])",
@@ -281,6 +335,15 @@ local errorText = {
DF.Language = DF.Language or {version = 1}
DF.Language.RegisteredNamespaces = DF.Language.RegisteredNamespaces or {}
DF.Language.LanguageMixin = {
SetAddonID = function(self, addonId)
self.addonId = addonId
end,
GetAddonID = function(self, addonId)
return self.addonId
end,
}
--internal functions
local isValid_AddonID = function(addonId)
@@ -320,6 +383,9 @@ local getOrCreateAddonNamespace = function(addonId, languageId)
addonNamespaceTable = {
addonId = addonId,
--store registered functions to call when the language is changed
callbacks = {},
--by default, the current language is the first registered language
currentLanguageId = languageId,
languages = {},
@@ -349,16 +415,33 @@ local getOrCreateAddonNamespace = function(addonId, languageId)
return addonNamespaceTable
end
--just get the addon namespace returning nil if not registered yet
local getAddonNamespace = function(addonId)
return DF.Language.RegisteredNamespaces[addonId]
end
local triggerRegisteredCallbacksForAddonId = function(addonId)
local addonNamespaceTable = getAddonNamespace(addonId)
if (not addonNamespaceTable) then
return
end
local callbacks = addonNamespaceTable.callbacks
for i = 1, #callbacks do
local callback = callbacks[i]
--trigger a secure callback using xpcall
xpcall(callback.callback, _G["geterrorhandler"](), addonId, addonNamespaceTable.currentLanguageId, unpack(callback.payload))
end
end
--these two are only used for the dropdown create the change the language
--for custom callbacks use DF.Language.RegisterCallback()
local setLanguageChangedCallback = function(addonNamespaceTable, callback)
printDebug("setLanguageChangedCallback", "addonId:", addonNamespaceTable.addonId, "callbackType:", type(callback))
addonNamespaceTable.onLanguageChangeCallback = callback
end
local getLanguageChangedCallback = function(addonNamespaceTable)
return addonNamespaceTable.onLanguageChangeCallback
end
@@ -384,12 +467,6 @@ local setOption = function(addonNamespaceTable, optionId, value)
addonNamespaceTable.options[optionId] = value
end
--if invalid, the __index from the metatable get the value from the first registered table
--will return nil if the languageTable is from the first registered language
local getTextFromLangugeTable = function(languageTable, phraseId)
return languageTable[phraseId]
end
local getRegisteredObjects = function(addonNamespaceTable)
return addonNamespaceTable.registeredObjects
end
@@ -403,11 +480,20 @@ local getText = function(addonNamespaceTable, phraseId)
local text = phraseId
--embed phraseId is when the phraseId is within the string but is surrounded by @
local embedPhraseId = phraseId:match("@(.-)@")
--get the text from the current language table
if (languageTable) then
text = rawget(languageTable, phraseId)
text = rawget(languageTable, embedPhraseId or phraseId)
if (isValid_Text(text)) then
return text, currentLanguageId
if (embedPhraseId) then
--replace the embed phraseId with the translated text
text = phraseId:gsub("@" .. embedPhraseId .. "@", text)
return text, currentLanguageId
else
return text, currentLanguageId
end
end
end
@@ -417,9 +503,15 @@ local getText = function(addonNamespaceTable, phraseId)
if (currentLanguageId ~= clientLanguage) then
languageTable = getLanguageTable(addonNamespaceTable, clientLanguage)
if (languageTable) then
text = rawget(languageTable, phraseId)
text = rawget(languageTable, embedPhraseId or phraseId)
if (isValid_Text(text)) then
return text, clientLanguage
if (embedPhraseId) then
--replace the embed phraseId with the translated text
text = phraseId:gsub("@" .. embedPhraseId .. "@", text)
return text, currentLanguageId
else
return text, clientLanguage
end
end
end
end
@@ -428,10 +520,15 @@ local getText = function(addonNamespaceTable, phraseId)
if (currentLanguageId ~= CONST_LANGUAGEID_ENUS and clientLanguage ~= CONST_LANGUAGEID_ENUS) then
languageTable = getLanguageTable(addonNamespaceTable, CONST_LANGUAGEID_ENUS)
if (languageTable) then
--text = getTextFromLangugeTable(languageTable, phraseId)
text = rawget(languageTable, phraseId)
text = rawget(languageTable, embedPhraseId or phraseId)
if (isValid_Text(text)) then
return text, CONST_LANGUAGEID_ENUS
if (embedPhraseId) then
--replace the embed phraseId with the translated text
text = phraseId:gsub("@" .. embedPhraseId .. "@", text)
return text, CONST_LANGUAGEID_ENUS
else
return text, CONST_LANGUAGEID_ENUS
end
end
end
end
@@ -443,11 +540,25 @@ local setLanguageTableForLanguageId = function(addonNamespaceTable, languageId,
local isFirstLanguage = not next(addonNamespaceTable.languages)
if (isFirstLanguage) then
printDebug("setLanguageTableForLanguageId", "(first to be registered) addonId:", addonNamespaceTable.addonId, "languageId:", languageId, "languageTable:", languageTable, "languageIdType:", type(languageId), "languageTableType:", type(languageTable))
--defaultLanguageTable is constant
addonNamespaceTable.defaultLanguageTable = languageTable
else
printDebug("setLanguageTableForLanguageId", "addonId:", addonNamespaceTable.addonId, "languageId:", languageId, "languageTable:", languageTable, "languageIdType:", type(languageId), "languageTableType:", type(languageTable))
local defaultLanguageMetatable = {__index = function(table, key) return addonNamespaceTable.defaultLanguageTable[key] or key end}
local defaultLanguageMetatable = {__index = function(table, key)
local value = rawget(table, key)
if (value) then
return value
end
local defaultLanguageTable = addonNamespaceTable.defaultLanguageTable
value = defaultLanguageTable[key]
if (value) then
return value
end
return key
end}
setmetatable(languageTable, defaultLanguageMetatable)
end
@@ -463,8 +574,10 @@ local setCurrentLanguageId = function(addonNamespaceTable, languageId)
local callbackFunc = getLanguageChangedCallback(addonNamespaceTable)
if (callbackFunc) then
printDebug("setCurrentLanguageId", "addonId:", addonNamespaceTable.addonId, "calling callback", "callbackFuncType:", type(callbackFunc))
xpcall(callbackFunc, _G["geterrorhandler"](), languageId)
xpcall(callbackFunc, _G["geterrorhandler"](), languageId, addonNamespaceTable.addonId)
end
triggerRegisteredCallbacksForAddonId(addonNamespaceTable.addonId)
end
local parseArguments = function(...)
@@ -493,7 +606,11 @@ local updatePhraseInfo_Arguments = function(phraseInfoTable, ...)
phraseInfoTable.arguments = parseArguments(...)
end
local getFontForLanguageId = function(addonNamespaceTable, languageId)
---return the fontPath for the languageId or nil if the languageId is not registered for the addon
---@param addonNamespaceTable table
---@param languageId string
---@return fontPath|nil
local getFontForLanguageIdFromAddonNamespace = function(addonNamespaceTable, languageId)
return addonNamespaceTable.fonts[languageId]
end
@@ -508,19 +625,19 @@ local shouldChangeFontForNewLanguage = function(addonNamespaceTable, oldLanguage
else
if (addonNamespaceTable.options.ChangeOnlyRegisteredFont) then
--can change only if the font was previously registered with SetFontForLanguageId() or SetFontByAlphabetOrRegion()
local languageFontPath = getFontForLanguageId(addonNamespaceTable, newLanguageId)
local languageFontPath = getFontForLanguageIdFromAddonNamespace(addonNamespaceTable, newLanguageId)
if (languageFontPath) then
--the font is registered
return true, languageFontPath
end
else
local languageFontPath = getFontForLanguageId(addonNamespaceTable, newLanguageId)
local languageFontPath = getFontForLanguageIdFromAddonNamespace(addonNamespaceTable, newLanguageId)
if (languageFontPath) then
--the font is registered
return true, languageFontPath
else
--the font is not registered for this language, get the default font from the framework
languageFontPath = DF:GetBestFontPathForLanguage(newLanguageId)
languageFontPath = DF.Language.GetFontForLanguageID(newLanguageId)
return true, languageFontPath
end
end
@@ -551,13 +668,22 @@ local setObject_Text = function(addonNamespaceTable, object, phraseInfoTable, te
if (textLanguageId ~= object.__languageId) then
local bShouldChangeFont, fontPath = shouldChangeFontForNewLanguage(addonNamespaceTable, object.__languageId, textLanguageId)
if (bShouldChangeFont) then
local font, size, flags = object:GetFont()
object:SetFont(fontPath, size, flags)
if (object:GetObjectType() == "Button") then
local fontString = object:GetFontString()
if (fontString) then
local font, size, flags = fontString:GetFont()
fontString:SetFont(fontPath, size, flags)
end
else
local font, size, flags = object:GetFont()
object:SetFont(fontPath, size, flags)
end
setObject_InternalMembers(object, false, false, false, textLanguageId)
end
end
local formattedText = getFormattedText(phraseInfoTable, text)
object:SetText(formattedText)
end
@@ -661,7 +787,7 @@ local registerTableKeyTable = function(addonNamespaceTable, table, tableKeyTable
addonNamespaceTable.tableKeys[table] = tableKeyTable
end
local registerTableKey = function(addonNamespaceTable, table, key, phraseId, ...)
local registerTableKey = function(addonNamespaceTable, table, key, phraseId, ...) --~registerTableKey
local tableKeyTable = getTableKeyTable(addonNamespaceTable, table)
if (not tableKeyTable) then
tableKeyTable = {}
@@ -708,24 +834,142 @@ local setFontForLanguageId = function(addonNamespaceTable, languageId, fontPath)
end
end
---when the language has changed for an addon, call all callbacks registered for that addon
---the function will be called with the following parameters: callback(addonId, languageId, unpack(payload))
---@param addonId string
---@param callback function
---@vararg any
---@return boolean
function DF.Language.RegisterCallback(addonId, callback, ...)
if (not isValid_AddonID(addonId)) then
error("RegisterCallback() param #1 'addonId' must be a string or a table, got: " .. type(addonId) .. ".")
end
if (type(callback) ~= "function") then
error("RegisterCallback() param #2 'callback' must be a function, got: " .. type(callback) .. ".")
end
--create a language table within an addon namespace
--@addonId: an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater
--@languageId: game languages: "deDE", "enUS", "esES", "esMX", "frFR", "itIT", "koKR", "ptBR", "ruRU", "zhCN", "zhTW", or any other value if 'gameLanguageOnly' is false (default)
--@gameLanguageOnly: if true won't allow to register a language not supported by the game, a supported language is any language returnted by GetLocale()
--return value: return a languageTable, this table holds translations for the registered language
function DF.Language.RegisterLanguage(addonId, languageId, gameLanguageOnly)
local addonNamespaceTable = getAddonNamespace(addonId)
if (not addonNamespaceTable) then
return false
end
addonNamespaceTable.callbacks[#addonNamespaceTable.callbacks+1] = {callback = callback, payload = {...}}
return true
end
---unregister a registered addon callback
---@param addonId string
---@param callback function
---@return boolean
function DF.Language.UnregisterCallback(addonId, callback)
if (not isValid_AddonID(addonId)) then
error("UnregisterCallback() param #1 'addonId' must be a string or a table, got: " .. type(addonId) .. ".")
end
if (type(callback) ~= "function") then
error("UnregisterCallback() param #2 'callback' must be a function, got: " .. type(callback) .. ".")
end
local addonNamespaceTable = getAddonNamespace(addonId)
if (not addonNamespaceTable) then
return false
end
for i = 1, #addonNamespaceTable.callbacks do
local callbackTable = addonNamespaceTable.callbacks[i]
if (callbackTable.callback == callback) then
tremove(addonNamespaceTable.callbacks, i)
return true
end
end
return false
end
---return the languageId of the text passed, if not found return the default languageId (enUS)
---@param text string
---@return string
function DF.Language.DetectLanguageId(text)
for letter in text:gmatch(".") do
if (alphabetTable[letter]) then
return alphabetTable[letter]
end
end
return "enUS"
end
---get the languageId set to be used on an addon
---@param addonId string
---@return string
function DF.Language.GetLanguageIdForAddonId(addonId)
if (not isValid_AddonID(addonId)) then
error("GetLanguageIdForAddonId() param #1 'addonId' must be a string or a table, got: " .. type(addonId) .. ".")
end
local addonNamespaceTable = getAddonNamespace(addonId)
if (not addonNamespaceTable) then
return "enUS"
end
return addonNamespaceTable.currentLanguageId
end
---check if the key exists in the default language table for the addon
---@param addonId string
---@param key string
---@return boolean
function DF.Language.DoesPhraseIDExistsInDefaultLanguage(addonId, key) --~DoesPhraseIDExistsInDefaultLanguage
if (not isValid_AddonID(addonId)) then
error("DoesPhraseIDExistsInDefaultLanguage() param #1 'addonId' must be a string or a table, got: " .. type(addonId) .. ".")
end
local addonNamespaceTable = getAddonNamespace(addonId)
if (not addonNamespaceTable) then
return false
end
local defaultLanguageTable = addonNamespaceTable.defaultLanguageTable
if (not defaultLanguageTable) then
return false
end
return rawget(defaultLanguageTable, key) and true
end
---create a language table within an addon namespace
---if bIsNativeGameLanguage is true, languageName and languageFont are required
---@param addonId string an identifier, can be any table or string, will be used when getting the table with phrase translations, example: "DetailsLocalization", "Details", "PlaterLoc", _G.Plater
---@param languageId string game languages: "deDE", "enUS", "esES", "esMX", "frFR", "itIT", "koKR", "ptBR", "ruRU", "zhCN", "zhTW", or any other value if 'gameLanguageOnly' is false (default)
---@param bNotSupportedWoWLanguage boolean if true it indicates that this is not a native game language
---@return table: return a languageTable, this table holds translations for the registered language
function DF.Language.RegisterLanguage(addonId, languageId, bNotSupportedWoWLanguage, languageName, languageFont) --~RegisterLanguage
if (not isValid_AddonID(addonId)) then
error(functionCallPath["RegisterLanguage"] .. ": " .. format(errorText["AddonID"], 1) .. ", use: " .. functionSignature["RegisterLanguage"] .. ".")
elseif (gameLanguageOnly and not supportedGameLanguages[languageId]) then
elseif (not bNotSupportedWoWLanguage and not supportedGameLanguages[languageId]) then
error(functionCallPath["RegisterLanguage"] .. ": " .. format(errorText["LanguageID"], 2) .. ", use: " .. functionSignature["RegisterLanguage"] .. ".")
elseif (bNotSupportedWoWLanguage) then
if (not languageName) then
error(functionCallPath["RegisterLanguage"] .. ": " .. "Invalid Language Name" .. ", use: " .. functionSignature["RegisterLanguage"] .. ".")
end
if (not languageFont) then
error(functionCallPath["RegisterLanguage"] .. ": " .. "Invalid Language Font" .. ", use: " .. functionSignature["RegisterLanguage"] .. ".")
end
if (not supportedGameLanguages[languageId]) then
languagesAvailable[languageId] = {text = languageName, font = languageFont}
end
end
--get the language namespace, the namespace can be a string or a table.
--if the namespace isn't created yet, this function will create
local addonNamespaceTable = getOrCreateAddonNamespace(addonId, languageId)
if (bNotSupportedWoWLanguage) then
setFontForLanguageId(addonNamespaceTable, languageId, languageFont)
DF.registeredFontPaths[languageId] = languageFont
end
--create a table to hold traslations for this languageId
local languageTable = {}
setLanguageTableForLanguageId(addonNamespaceTable, languageId, languageTable)
@@ -1009,7 +1253,7 @@ end
--@phraseId: any string to identify the a translated text, example: token: "OPTIONS_FRAME_WIDTH" text: "Adjust the Width of the frame."
--@silent: if true won't error on invalid phrase text or table already registered, it will still error on invalid addonId, table, key and phraseId
--@vararg: arguments to pass for format(text, ...)
function DF.Language.RegisterTableKey(addonId, table, key, phraseId, silent, ...)
function DF.Language.RegisterTableKey(addonId, table, key, phraseId, silent, ...) --~RegisterTableKey
if (not isValid_AddonID(addonId)) then
error(functionCallPath["RegisterTableKey"] .. ": " .. format(errorText["AddonID"], 1) .. ", use: " .. functionSignature["RegisterTableKey"] .. ".")
end
@@ -1036,7 +1280,7 @@ function DF.Language.RegisterTableKey(addonId, table, key, phraseId, silent, ...
local text, textLanguageId = getText(addonNamespaceTable, phraseId)
if (not isValid_Text(text)) then
if (not silent) then
error(functionCallPath["RegisterTableKey"] .. ": " .. errorText["PhraseIDNotRegistered"] .. ", use: " .. functionSignature["GetLanguageTable"] .. "['PhraseID'] = 'translated text'.")
error(functionCallPath["RegisterTableKey"] .. ": " .. errorText["PhraseIDNotRegistered"] .. ": " .. phraseId .. ", use: " .. functionSignature["GetLanguageTable"] .. "['PhraseID'] = 'translated text'.")
else
text = phraseId
end
@@ -1087,7 +1331,7 @@ function DF.Language.UpdateTableKeyArguments(addonId, table, key, ...)
end
function DF.Language.RegisterTableKeyWithDefault(addonId, table, key, phraseId, defaultText, ...)
function DF.Language.RegisterTableKeyWithDefault(addonId, table, key, phraseId, defaultText, ...) --~RegisterTableKeyWithDefault
if (addonId and phraseId) then
DetailsFramework.Language.RegisterTableKey(addonId, table, key, phraseId, ...)
else
@@ -1299,19 +1543,56 @@ function DF.Language.CreateLanguageSelector(addonId, parent, callback, selectedL
local onSelectLanguage = function(self, addonId, languageId)
DF.Language.SetCurrentLanguage(addonId, languageId)
C_Timer.After(0.5, function()
self:Select(languageId)
end)
end
local buildOptionsFunc = function()
local resultTable = {}
for languageId in pairs(allLanguagesRegistered) do
resultTable[#resultTable+1] = {value = languageId, label = languageId, onclick = onSelectLanguage} --, icon = icon, iconcolor = iconcolor, iconsize = iconsize
local languageIdInfo = languagesAvailable[languageId]
resultTable[#resultTable+1] = {value = languageId, label = languageIdInfo.text, onclick = onSelectLanguage, font = languageIdInfo.font}
end
return resultTable
end
local languageSelector = DF:CreateDropDown(parent, buildOptionsFunc, selectedLanguage or getCurrentLanguageId(addonNamespaceTable), 80, 20, nil, nil, DF:GetTemplate("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
local languageSelector = DF:CreateDropDown(parent, buildOptionsFunc, selectedLanguage or getCurrentLanguageId(addonNamespaceTable), 120, 20, nil, nil, DF:GetTemplate("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
languageSelector:SetAddonID(addonId)
languageSelector:SetFixedParameter(addonId)
local languageLabel = DF:CreateLabel(parent, _G.LANGUAGE .. ":", 10, "silver")
languageLabel:SetPoint("right", languageSelector, "left", -3, 0)
return languageSelector
end
---return a font (path for a file) which works for the languageId passed, if the languageId is not registered, it'll return a compatible font registered by another addon or the default font
---@param languageId string
---@param addonId string
---@return string
function DF.Language.GetFontForLanguageID(languageId, addonId)
if (addonId) then
---@type addonNamespaceTable
local addonNamespaceTable = getAddonNamespace(addonId)
if (not addonNamespaceTable) then
error(functionCallPath["CreateLanguageSelector"] .. ": " .. errorText["AddonIDInvalidOrNotRegistered"] .. ", use: " .. functionSignature["RegisterLanguage"] .. ".")
end
--get the font from the addon namespace table
---@type fontPath|nil
local fontPath = getFontForLanguageIdFromAddonNamespace(addonNamespaceTable, languageId)
if (fontPath) then
return fontPath
end
end
local languageIdInfo = languagesAvailable[languageId]
if (languageIdInfo) then
return languageIdInfo.font
end
return "Fonts\\FRIZQT__.TTF"
end
+51 -31
View File
@@ -3517,24 +3517,24 @@ local tab_container_on_show = function(self)
self.SelectIndex (self.AllButtons[index], nil, index)
end
function detailsFramework:CreateTabContainer (parent, title, frame_name, frameList, options_table, hookList)
function detailsFramework:CreateTabContainer (parent, title, frameName, frameList, optionsTable, hookList, languageInfo)
local options_text_template = detailsFramework:GetTemplate("font", "OPTIONS_FONT_TEMPLATE")
local options_dropdown_template = detailsFramework:GetTemplate("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")
local options_switch_template = detailsFramework:GetTemplate("switch", "OPTIONS_CHECKBOX_TEMPLATE")
local options_slider_template = detailsFramework:GetTemplate("slider", "OPTIONS_SLIDER_TEMPLATE")
local options_button_template = detailsFramework:GetTemplate("button", "OPTIONS_BUTTON_TEMPLATE")
options_table = options_table or {}
optionsTable = optionsTable or {}
local parentFrameWidth = parent:GetWidth()
local y_offset = options_table.y_offset or 0
local buttonWidth = options_table.button_width or 160
local buttonHeight = options_table.button_height or 20
local buttonAnchorX = options_table.button_x or 230
local buttonAnchorY = options_table.button_y or -32
local button_text_size = options_table.button_text_size or 10
local containerWidthOffset = options_table.container_width_offset or 0
local y_offset = optionsTable.y_offset or 0
local buttonWidth = optionsTable.button_width or 160
local buttonHeight = optionsTable.button_height or 20
local buttonAnchorX = optionsTable.button_x or 230
local buttonAnchorY = optionsTable.button_y or -32
local button_text_size = optionsTable.button_text_size or 10
local containerWidthOffset = optionsTable.container_width_offset or 0
local mainFrame = CreateFrame("frame", frame_name, parent.widget or parent, "BackdropTemplate")
local mainFrame = CreateFrame("frame", frameName, parent.widget or parent, "BackdropTemplate")
mainFrame:SetAllPoints()
detailsFramework:Mixin(mainFrame, detailsFramework.TabContainerFunctions)
mainFrame.hookList = hookList or {}
@@ -3548,50 +3548,69 @@ function detailsFramework:CreateTabContainer (parent, title, frame_name, frameLi
mainFrame.AllButtons = {}
mainFrame.CurrentIndex = 1
mainFrame.IsContainer = true
mainFrame.ButtonSelectedBorderColor = options_table.button_selected_border_color or {1, 1, 0, 1}
mainFrame.ButtonNotSelectedBorderColor = options_table.button_border_color or {0, 0, 0, 0}
mainFrame.ButtonSelectedBorderColor = optionsTable.button_selected_border_color or {1, 1, 0, 1}
mainFrame.ButtonNotSelectedBorderColor = optionsTable.button_border_color or {0, 0, 0, 0}
if (options_table.right_click_interact ~= nil) then
mainFrame.CanCloseWithRightClick = options_table.right_click_interact
if (optionsTable.right_click_interact ~= nil) then
mainFrame.CanCloseWithRightClick = optionsTable.right_click_interact
else
mainFrame.CanCloseWithRightClick = true
end
for i, frame in ipairs(frameList) do
local f = CreateFrame("frame", "$parent" .. frame.name, mainFrame, "BackdropTemplate")
--languageInfo
local addonId = languageInfo.language_addonId
local languageTable = DetailsFramework.Language.GetLanguageTable(addonId)
for i, frameInfo in ipairs(frameList) do
local f = CreateFrame("frame", "$parent" .. frameInfo.name, mainFrame, "BackdropTemplate")
f:SetAllPoints()
f:SetFrameLevel(210)
f:Hide()
local title = detailsFramework:CreateLabel(f, frame.title, 16, "silver")
--attempt to get the localized text from the language system using the addonId and the frameInfo.title
local phraseId = frameInfo.title
local bIsLanguagePrahseID = detailsFramework.Language.DoesPhraseIDExistsInDefaultLanguage(addonId, phraseId)
local title = detailsFramework:CreateLabel(f, "", 16, "silver")
if (bIsLanguagePrahseID) then
DetailsFramework.Language.RegisterObjectWithDefault(addonId, title.widget, frameInfo.title, frameInfo.title)
else
title:SetText(frameInfo.title)
end
title:SetPoint("topleft", mainTitle, "bottomleft", 0, 0)
f.titleText = title
local tabButton = detailsFramework:CreateButton(mainFrame, detailsFramework.TabContainerFunctions.SelectIndex, buttonWidth, buttonHeight, frame.title, i, nil, nil, nil, "$parentTabButton" .. frame.name, false, button_tab_template)
local tabButton = detailsFramework:CreateButton(mainFrame, detailsFramework.TabContainerFunctions.SelectIndex, buttonWidth, buttonHeight, frameInfo.title, i, nil, nil, nil, "$parentTabButton" .. frameInfo.name, false, button_tab_template)
if (bIsLanguagePrahseID) then
DetailsFramework.Language.RegisterObjectWithDefault(addonId, tabButton.widget, frameInfo.title, frameInfo.title)
end
PixelUtil.SetSize(tabButton, buttonWidth, buttonHeight)
tabButton:SetFrameLevel(220)
tabButton.textsize = button_text_size
tabButton.mainFrame = mainFrame
detailsFramework.TabContainerFunctions.CreateUnderlineGlow (tabButton)
detailsFramework.TabContainerFunctions.CreateUnderlineGlow(tabButton)
local right_click_to_back
if (i == 1 or options_table.rightbutton_always_close) then
right_click_to_back = detailsFramework:CreateLabel(f, "right click to close", 10, "gray")
right_click_to_back:SetPoint("bottomright", f, "bottomright", -1, options_table.right_click_y or 0)
if (options_table.close_text_alpha) then
right_click_to_back:SetAlpha(options_table.close_text_alpha)
local rightClickToBack
if (i == 1 or optionsTable.rightbutton_always_close) then
rightClickToBack = detailsFramework:CreateLabel(f, "right click to close", 10, "gray")
rightClickToBack:SetPoint("bottomright", f, "bottomright", -1, optionsTable.right_click_y or 0)
if (optionsTable.close_text_alpha) then
rightClickToBack:SetAlpha(optionsTable.close_text_alpha)
end
f.IsFrontPage = true
else
right_click_to_back = detailsFramework:CreateLabel(f, "right click to go back to main menu", 10, "gray")
right_click_to_back:SetPoint("bottomright", f, "bottomright", -1, options_table.right_click_y or 0)
if (options_table.close_text_alpha) then
right_click_to_back:SetAlpha(options_table.close_text_alpha)
rightClickToBack = detailsFramework:CreateLabel(f, "right click to go back to main menu", 10, "gray")
rightClickToBack:SetPoint("bottomright", f, "bottomright", -1, optionsTable.right_click_y or 0)
if (optionsTable.close_text_alpha) then
rightClickToBack:SetAlpha(optionsTable.close_text_alpha)
end
end
if (options_table.hide_click_label) then
right_click_to_back:Hide()
if (optionsTable.hide_click_label) then
rightClickToBack:Hide()
end
f:SetScript("OnMouseDown", detailsFramework.TabContainerFunctions.OnMouseDown)
@@ -3628,6 +3647,7 @@ function detailsFramework:CreateTabContainer (parent, title, frame_name, frameLi
--select the first frame
mainFrame.SelectIndex (mainFrame.AllButtons[1], nil, 1)
print()
return mainFrame
end