<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://deadlock.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84.71.17.99</id>
	<title>The Deadlock Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://deadlock.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84.71.17.99"/>
	<link rel="alternate" type="text/html" href="https://deadlock.wiki/Special:Contributions/84.71.17.99"/>
	<updated>2026-09-14T18:17:16Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://deadlock.wiki/Module:Lang?diff=25668</id>
		<title>Module:Lang</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:Lang?diff=25668"/>
		<updated>2025-05-09T11:14:48Z</updated>

		<summary type="html">&lt;p&gt;84.71.17.99: Fixed issue with coloring of spirit icon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
local util_module = require(&amp;quot;Module:Utilities&amp;quot;)&lt;br /&gt;
local lang_codes_set = mw.loadJsonData(&amp;quot;Data:LangCodes.json&amp;quot;)&lt;br /&gt;
local dictionary_module = require(&amp;quot;Module:Dictionary&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Overrides applied to searches by key. Designed to handle edge cases where&lt;br /&gt;
-- the expected key does not have a localization entry&lt;br /&gt;
local KEY_OVERRIDES = {&lt;br /&gt;
    MoveSlowPercent_label = &#039;MovementSlow_label&#039;,&lt;br /&gt;
    BonusHealthRegen_label = &#039;HealthRegen_label&#039;,&lt;br /&gt;
    BarbedWireRadius_label = &#039;Radius_label&#039;,&lt;br /&gt;
    BarbedWireDamagePerMeter_label = &#039;DamagePerMeter_label&#039;,&lt;br /&gt;
    BuildUpDuration_label = &#039;BuildupDuration_label&#039;,&lt;br /&gt;
    TechArmorDamageReduction_label = &#039;TechArmorDamageReduction_Label&#039;,&lt;br /&gt;
    DamageAbsorb_label = &#039;DamageAbsorb_Label&#039;,&lt;br /&gt;
    InvisRegen_label = &#039;InvisRegen_Label&#039;,&lt;br /&gt;
    EvasionChance_label = &#039;EvasionChance_Label&#039;,&lt;br /&gt;
    DelayBetweenShots_label = &#039;DelayBetweenShots_Label&#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function get_lang_file(lang_code)&lt;br /&gt;
    local file_name = string.format(&amp;quot;Data:Lang_%s.json&amp;quot;, lang_code)&lt;br /&gt;
    local success, data = pcall(mw.loadJsonData, file_name)&lt;br /&gt;
    if success then&lt;br /&gt;
        return data&lt;br /&gt;
    else&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function process_newlines(text)&lt;br /&gt;
    if not text or type(text) ~= &amp;quot;string&amp;quot; then return text end&lt;br /&gt;
    -- Replace &amp;quot;n with newline character&lt;br /&gt;
    return text:gsub(&#039;&amp;quot;n&#039;, &#039;\n&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function process_html_tags(text, frame)&lt;br /&gt;
    if not text or type(text) ~= &amp;quot;string&amp;quot; then return text end&lt;br /&gt;
&lt;br /&gt;
    text = text:gsub(&amp;quot;{g:citadel_inline_attribute:&#039;SpiritDamage&#039;}&amp;quot;, &amp;quot;{{Monster_Domosed/Sandbox|color=purple}}&amp;quot; .. &#039; &amp;lt;span style=&amp;quot;color:#bc8ee8;&amp;quot;&amp;gt;spirit damage&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
&lt;br /&gt;
    text = text:gsub(&#039;&amp;lt;span class=&amp;quot;highlight&amp;quot;&amp;gt;(.-)&amp;lt;/span&amp;gt;&#039;, &amp;quot;&#039;&#039;&#039;%1&#039;&#039;&#039;&amp;quot;)&lt;br /&gt;
    text = text:gsub(&#039;&amp;lt;span class=&amp;quot;diminish&amp;quot;&amp;gt;(.-)&amp;lt;/span&amp;gt;&#039;, &#039;&amp;lt;span style=&amp;quot;color:#777777&amp;quot;&amp;gt;%1&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
    text = text:gsub(&#039;&amp;lt;span class=&amp;quot;.-&amp;quot;&amp;gt;(.-)&amp;lt;/span&amp;gt;&#039;, &#039;%1&#039;)&lt;br /&gt;
&lt;br /&gt;
    return frame:preprocess(text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.get_string(key, lang_code_override, fallback_str, remove_var_index)&lt;br /&gt;
    -- Get frame object (either passed directly or via first argument)&lt;br /&gt;
    local frame&lt;br /&gt;
    if type(key) == &amp;quot;table&amp;quot; and key.args then&lt;br /&gt;
        frame = key&lt;br /&gt;
        key = frame.args[1]&lt;br /&gt;
        lang_code_override = frame.args[&amp;quot;lang_code_override&amp;quot;]&lt;br /&gt;
        fallback_str = frame.args[&amp;quot;fallback_str&amp;quot;]&lt;br /&gt;
        remove_var_index = frame.args[&amp;quot;remove_var_index&amp;quot;]&lt;br /&gt;
    else&lt;br /&gt;
        frame = mw.getCurrentFrame()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Determine lang_code if not overridden&lt;br /&gt;
    local lang_code = lang_code_override&lt;br /&gt;
    if (lang_code == &#039;&#039; or lang_code == nil) then&lt;br /&gt;
        lang_code = p.get_lang_code()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Retrieve lang data&lt;br /&gt;
    local data = get_lang_file(lang_code)&lt;br /&gt;
    if (data == nil) then&lt;br /&gt;
        return string.format(&amp;quot;Lang code &#039;%s&#039; does not have a json file&amp;quot;, lang_code)    &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Localize&lt;br /&gt;
    local label = data[KEY_OVERRIDES[key] or key]&lt;br /&gt;
    if (label == nil) then&lt;br /&gt;
        -- Apply fallback (without HTML processing for fallback)&lt;br /&gt;
        local fallback_tooltip = frame:expandTemplate{title = &amp;quot;MissingValveTranslationTooltip&amp;quot;}&lt;br /&gt;
        local fallback&lt;br /&gt;
        if (fallback_str == &#039;en&#039;) then&lt;br /&gt;
            fallback = p.get_string(key, &#039;en&#039;, key .. fallback_tooltip, remove_var_index)&lt;br /&gt;
        elseif fallback_str == &#039;dictionary&#039; then&lt;br /&gt;
            return dictionary_module.translate(key, lang_code_override)&lt;br /&gt;
        elseif fallback_str ~= nil then&lt;br /&gt;
            fallback = fallback_str&lt;br /&gt;
        else&lt;br /&gt;
            return &#039;&#039;&lt;br /&gt;
        end&lt;br /&gt;
        return fallback .. fallback_tooltip&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Apply remove_var&lt;br /&gt;
    if (remove_var_index ~= nil) then &lt;br /&gt;
        label = util_module.remove_var(label, remove_var_index)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Process HTML and return as &amp;quot;raw&amp;quot; HTML&lt;br /&gt;
    label = process_newlines(label)&lt;br /&gt;
    label = process_html_tags(label, frame)&lt;br /&gt;
    -- Create HTML object for safe output&lt;br /&gt;
    local html = mw.html.create()&lt;br /&gt;
    html:wikitext(label)&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Search for a localized string using its English label&lt;br /&gt;
p.search_string = function(frame)&lt;br /&gt;
    local label = frame.args[1]&lt;br /&gt;
    local lang_code_override = frame.args[2]&lt;br /&gt;
&lt;br /&gt;
    local result = p._search_string(label, lang_code_override)&lt;br /&gt;
    result = process_newlines(result)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- search_string, but for internal use by other modules&lt;br /&gt;
p._search_string = function(label, lang_code_override)&lt;br /&gt;
    lang_code = lang_code_override&lt;br /&gt;
    if (lang_code == &#039;&#039; or lang_code == nil) then&lt;br /&gt;
        lang_code = p.get_lang_code()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Load the language files&lt;br /&gt;
    local data_en = get_lang_file(&#039;en&#039;)  -- English data&lt;br /&gt;
    local data_lang = get_lang_file(lang_code)  -- Target language data&lt;br /&gt;
&lt;br /&gt;
    if (data_lang == nil) then&lt;br /&gt;
        error(&amp;quot;Lang code &#039;%s&#039; does not have a json file&amp;quot;, lang_code)    &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Search for the key in the English data&lt;br /&gt;
    local key = nil&lt;br /&gt;
    for k, v in pairs(data_en) do&lt;br /&gt;
        if v == label then&lt;br /&gt;
            key = k  -- Find the key corresponding to the label&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Default to input label if localized string is not found&lt;br /&gt;
    if (key == nil) then&lt;br /&gt;
        return label&lt;br /&gt;
    end&lt;br /&gt;
    if (data_lang[key] == nil) then&lt;br /&gt;
        return label&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return data_lang[key]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.get_lang_code = function()&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
    local lang_code = title.fullText:match(&amp;quot;.*/(.*)$&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    if lang_code == nil or lang_codes_set[lang_code] == nil then&lt;br /&gt;
        return &#039;en&#039;    &lt;br /&gt;
    end&lt;br /&gt;
        &lt;br /&gt;
    return lang_code&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>84.71.17.99</name></author>
	</entry>
</feed>