Module:Sandbox: Difference between revisionsGive feedback
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local | local util_module = require("Module:Utilities") | ||
local lang_codes_set = mw.loadJsonData("Data:LangCodes.json") | |||
local dictionary_module = require("Module:Dictionary") | |||
-- | -- Overrides applied to searches by key. Designed to handle edge cases where | ||
local | -- the expected key does not have a localization entry | ||
local KEY_OVERRIDES = { | |||
MoveSlowPercent_label = 'MovementSlow_label', | |||
BonusHealthRegen_label = 'HealthRegen_label', | |||
BarbedWireRadius_label = 'Radius_label', | |||
return | BarbedWireDamagePerMeter_label = 'DamagePerMeter_label', | ||
BuildUpDuration_label = 'BuildupDuration_label', | |||
TechArmorDamageReduction_label = 'TechArmorDamageReduction_Label', | |||
DamageAbsorb_label = 'DamageAbsorb_Label', | |||
InvisRegen_label = 'InvisRegen_Label', | |||
EvasionChance_label = 'EvasionChance_Label', | |||
DelayBetweenShots_label = 'DelayBetweenShots_Label', | |||
} | |||
function get_lang_file(lang_code) | |||
local file_name = string.format("Data:Lang_%s.json", lang_code) | |||
local success, data = pcall(mw.loadJsonData, file_name) | |||
if success then | |||
return data | |||
else | |||
return nil | |||
end | end | ||
end | end | ||
-- | -- Helper function to replace \"n with newlines | ||
local function | local function process_newlines(str) | ||
return | if str then | ||
return str:gsub('\\"n', '\n') | |||
end | |||
return str | |||
end | end | ||
-- | -- Get a localized string by the raw key | ||
p.get_string = function(key, lang_code_override, fallback_str, remove_var_index) | |||
-- If called internally (direct Lua call), args will be passed directly. | |||
-- If called from wikitext, `key` will be the `frame` object, and we get args from `frame.args`. | |||
-- Handle the case where it's called via #invoke (i.e., from wikitext) | |||
if type(key) == "table" and key.args then | |||
local frame = key | |||
key = frame.args[1] | |||
lang_code_override = frame.args["lang_code_override"] | |||
fallback_str = frame.args["fallback_str"] | |||
remove_var_index = frame.args["remove_var_index"] | |||
end | end | ||
-- | -- Determine lang_code if not overridden | ||
local lang_code = lang_code_override | |||
local | if (lang_code == '' or lang_code == nil) then | ||
lang_code = get_lang_code() | |||
end | end | ||
-- | -- Retrieve lang data | ||
local | local data = get_lang_file(lang_code) | ||
if (data == nil) then | |||
return string.format("Lang code '%s' does not have a json file", lang_code) | |||
if | |||
return string.format(" | |||
end | end | ||
-- | -- Localize | ||
local | local label = data[KEY_OVERRIDES[key] or key] | ||
if (label == nil) then | |||
-- Apply fallback | |||
local fallback_tooltip = mw.getCurrentFrame():expandTemplate{title = "MissingValveTranslationTooltip"} | |||
local fallback | |||
if (fallback_str == 'en') then | |||
fallback = p.get_string(key, 'en', key .. fallback_tooltip, remove_var_index, upper_lower) | |||
elseif fallback_str == 'dictionary' then | |||
return dictionary_module.translate(key, lang_code_override) | |||
elseif fallback_str ~= nil then | |||
fallback = fallback_str | |||
else | |||
return '' | |||
end | |||
return process_newlines(fallback) .. fallback_tooltip | |||
end | end | ||
-- | -- Apply remove_var | ||
if (remove_var_index ~= nil) then | |||
label = util_module.remove_var(label, remove_var_index) | |||
end | end | ||
return process_newlines(label) | |||
return | |||
end | end | ||
-- | -- Search for a localized string using its English label | ||
p. | p.search_string = function(frame) | ||
local | local label = frame.args[1] | ||
local | local lang_code_override = frame.args[2] | ||
if | return p._search_string(label, lang_code_override) | ||
end | |||
-- search_string, but for internal use by other modules | |||
p._search_string = function(label, lang_code_override) | |||
lang_code = lang_code_override | |||
if (lang_code == '' or lang_code == nil) then | |||
lang_code = get_lang_code() | |||
end | end | ||
-- | -- Load the language files | ||
local | local data_en = get_lang_file('en') -- English data | ||
local data_lang = get_lang_file(lang_code) -- Target language data | |||
if (data_lang == nil) then | |||
error("Lang code '%s' does not have a json file", lang_code) | |||
end | end | ||
-- Search for the key in the English data | |||
local key = nil | |||
for k, v in pairs(data_en) do | |||
if v == label then | |||
key = k -- Find the key corresponding to the label | |||
break | |||
end | end | ||
end | end | ||
-- | -- Default to input label if localized string is not found | ||
if (key == nil) then | |||
return process_newlines(label) | |||
end | end | ||
if (data_lang[key] == nil) then | |||
return process_newlines(label) | |||
end | end | ||
return process_newlines(data_lang[key]) | |||
end | |||
function get_lang_code() | |||
local title = mw.title.getCurrentTitle() | |||
local lang_code = title.fullText:match(".*/(.*)$") | |||
if lang_code == nil or lang_codes_set[lang_code] == nil then | |||
return 'en' | |||
end | end | ||
return lang_code | |||
return | |||
end | end | ||
return p | return p | ||
Revision as of 19:20, 1 April 2025
Documentation for this module may be created at Module:Sandbox/doc
local p = {}
local util_module = require("Module:Utilities")
local lang_codes_set = mw.loadJsonData("Data:LangCodes.json")
local dictionary_module = require("Module:Dictionary")
-- Overrides applied to searches by key. Designed to handle edge cases where
-- the expected key does not have a localization entry
local KEY_OVERRIDES = {
MoveSlowPercent_label = 'MovementSlow_label',
BonusHealthRegen_label = 'HealthRegen_label',
BarbedWireRadius_label = 'Radius_label',
BarbedWireDamagePerMeter_label = 'DamagePerMeter_label',
BuildUpDuration_label = 'BuildupDuration_label',
TechArmorDamageReduction_label = 'TechArmorDamageReduction_Label',
DamageAbsorb_label = 'DamageAbsorb_Label',
InvisRegen_label = 'InvisRegen_Label',
EvasionChance_label = 'EvasionChance_Label',
DelayBetweenShots_label = 'DelayBetweenShots_Label',
}
function get_lang_file(lang_code)
local file_name = string.format("Data:Lang_%s.json", lang_code)
local success, data = pcall(mw.loadJsonData, file_name)
if success then
return data
else
return nil
end
end
-- Helper function to replace \"n with newlines
local function process_newlines(str)
if str then
return str:gsub('\\"n', '\n')
end
return str
end
-- Get a localized string by the raw key
p.get_string = function(key, lang_code_override, fallback_str, remove_var_index)
-- If called internally (direct Lua call), args will be passed directly.
-- If called from wikitext, `key` will be the `frame` object, and we get args from `frame.args`.
-- Handle the case where it's called via #invoke (i.e., from wikitext)
if type(key) == "table" and key.args then
local frame = key
key = frame.args[1]
lang_code_override = frame.args["lang_code_override"]
fallback_str = frame.args["fallback_str"]
remove_var_index = frame.args["remove_var_index"]
end
-- Determine lang_code if not overridden
local lang_code = lang_code_override
if (lang_code == '' or lang_code == nil) then
lang_code = get_lang_code()
end
-- Retrieve lang data
local data = get_lang_file(lang_code)
if (data == nil) then
return string.format("Lang code '%s' does not have a json file", lang_code)
end
-- Localize
local label = data[KEY_OVERRIDES[key] or key]
if (label == nil) then
-- Apply fallback
local fallback_tooltip = mw.getCurrentFrame():expandTemplate{title = "MissingValveTranslationTooltip"}
local fallback
if (fallback_str == 'en') then
fallback = p.get_string(key, 'en', key .. fallback_tooltip, remove_var_index, upper_lower)
elseif fallback_str == 'dictionary' then
return dictionary_module.translate(key, lang_code_override)
elseif fallback_str ~= nil then
fallback = fallback_str
else
return ''
end
return process_newlines(fallback) .. fallback_tooltip
end
-- Apply remove_var
if (remove_var_index ~= nil) then
label = util_module.remove_var(label, remove_var_index)
end
return process_newlines(label)
end
-- Search for a localized string using its English label
p.search_string = function(frame)
local label = frame.args[1]
local lang_code_override = frame.args[2]
return p._search_string(label, lang_code_override)
end
-- search_string, but for internal use by other modules
p._search_string = function(label, lang_code_override)
lang_code = lang_code_override
if (lang_code == '' or lang_code == nil) then
lang_code = get_lang_code()
end
-- Load the language files
local data_en = get_lang_file('en') -- English data
local data_lang = get_lang_file(lang_code) -- Target language data
if (data_lang == nil) then
error("Lang code '%s' does not have a json file", lang_code)
end
-- Search for the key in the English data
local key = nil
for k, v in pairs(data_en) do
if v == label then
key = k -- Find the key corresponding to the label
break
end
end
-- Default to input label if localized string is not found
if (key == nil) then
return process_newlines(label)
end
if (data_lang[key] == nil) then
return process_newlines(label)
end
return process_newlines(data_lang[key])
end
function get_lang_code()
local title = mw.title.getCurrentTitle()
local lang_code = title.fullText:match(".*/(.*)$")
if lang_code == nil or lang_codes_set[lang_code] == nil then
return 'en'
end
return lang_code
end
return p