|
|
| (27 intermediate revisions by 4 users not shown) |
| Line 1: |
Line 1: |
| local p = {}
| | This page is protected from editing. Please see [[Deadlock:User pages]]. |
| 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 preprocess text with proper newline handling
| |
| local function preprocess_text(text)
| |
| if not text then return text end
| |
| -- First replace \"n with actual newlines
| |
| text = text:gsub('\\"n', '\n')
| |
| -- Then let MediaWiki's preprocess handle the newlines and other wikitext
| |
| return mw.text.preprocess(text)
| |
| 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 fallback .. fallback_tooltip
| |
| end
| |
|
| |
| -- Apply remove_var
| |
| if (remove_var_index ~= nil) then
| |
| label = util_module.remove_var(label, remove_var_index)
| |
| end
| |
|
| |
| -- Preprocess the text (handles newlines and other wikitext)
| |
| return preprocess_text(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 preprocess_text(label)
| |
| end
| |
| if (data_lang[key] == nil) then
| |
| return preprocess_text(label)
| |
| end
| |
| | |
| -- Preprocess the text (handles newlines and other wikitext)
| |
| return preprocess_text(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
| |