Module:Lang: Difference between revisions
Added localization key overrides |
Added support for lang codes longer than 2 characters |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
-- Set of valid language codes | |||
local lang_codes_set = { | |||
en = true, | |||
es = true, | |||
['zh-hant'] = true | |||
} | |||
-- Overrides applied to searches by key. Designed to handle edge cases where | -- Overrides applied to searches by key. Designed to handle edge cases where | ||
Line 160: | Line 167: | ||
local lang_code = title.fullText:match(".*/(.*)$") | local lang_code = title.fullText:match(".*/(.*)$") | ||
if (lang_code == nil or lang_codes_set[lang_code]) == nil then | |||
if (lang_code == nil or | |||
return 'en' | return 'en' | ||
end | end |
Revision as of 10:01, 10 October 2024
Overview
overview
Functions
get_string
Localizes a given string to the current language, i.e. Data:Lang_en.json for english.
Parameters
- key - Key string to localize
- lang_code_override (OPTIONAL) - Overrides the current language to a specific language code
- fallback_str (OPTIONAL) - Passing
en
causes it to return the english localization if it can't be localized to the current language. Passing any other string causes it to return that string if it can't be localized. Both have Template:MissingValveTranslationTooltip appended. Use this very often as some keys are not yet localized in every language by the game. Passingdictionary
causes it to return the translation via Data:Dictionary if it can't be localized. If parsing the fallback_str from lua and is computationally expensive (i.e. add_space_before_cap), consider using fallback outside this function so it only computes when needed. - remove_var_index (OPTIONAL) - Removes %variables% from the resulting string. -1 also removes the character prefixing %variables%, while 1 removes the postfixed character, and 0 removes only the %variables%.
NOTE: Optional parameters are ideally named when not all parameters are provided, though named parameters can only be passed by invoke, and not internal lua calls.
Examples
Invokes from wikitext:
{{#invoke:Lang|get_string|CitadelHeroStats_Weapon_Falloff}}
Lua error at line 26: bad argument #2 to 'format' (string expected, got nil).
{{#invoke:Lang|get_string|CitadelHeroStats_Weapon_Falloff|lang_code_override=es}}
Lua error at line 26: bad argument #2 to 'format' (string expected, got nil).
Examples for fallback_str
{{#invoke:Lang|get_string|StatDesc_CritDamageBonusScale|lang_code_override=es}}
Lua error at line 26: bad argument #2 to 'format' (string expected, got nil).
{{#invoke:Lang|get_string|StatDesc_CritDamageBonusScale|lang_code_override=es|fallback_str=en}}
Lua error at line 26: bad argument #2 to 'format' (string expected, got nil).
{{#invoke:Lang|get_string|StatDesc_CritDamageBonusScale|lang_code_override=es|fallback_str=Crit Damage Bonus Scale}}
Lua error at line 26: bad argument #2 to 'format' (string expected, got nil).
{{#invoke:Lang|get_string|Tech Items|fallback_str=dictionary}}
Lua error at line 26: bad argument #2 to 'format' (string expected, got nil).
Examples for remove_var_index
{{#invoke:Lang|get_string|Citadel_HeroBuilds_DefaultHeroBuild}}
Lua error at line 26: bad argument #2 to 'format' (string expected, got nil).
TODO: Debug why is =0 still removing that extra space? Doesn't matter yet I suppose, no use cases for 0 yet
{{#invoke:Lang|get_string|Citadel_HeroBuilds_DefaultHeroBuild|remove_var_index=0}}
Lua error at line 26: bad argument #2 to 'format' (string expected, got nil).
{{#invoke:Lang|get_string|Citadel_HeroBuilds_DefaultHeroBuild|remove_var_index=-1}}
Lua error at line 26: bad argument #2 to 'format' (string expected, got nil).
When calling by internal modules, the parameters cannot be named, and therefore have to be in order. Unused parameters before the last used parameter should be nil
. Such as, .get_string('hero_atlas', nil, 'en')
search_string
Searches for the unlocalized key corresponding to a given english string, then localizes it to the current language. NOTE: Use sparingly, always use get_string instead where plausible, as it has time complexity O(1) compared to search_string's O(10,000).
Parameters
- string - English string to search for
Examples
From wikitext:
{{#invoke:Lang|search_string|Abrams}}
Lua error at line 26: bad argument #2 to 'format' (string expected, got nil).
local p = {}
-- Set of valid language codes
local lang_codes_set = {
en = true,
es = true,
['zh-hant'] = true
}
-- 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
-- Get a localized string by the raw key
p.get_string = function(frame)
local key = frame.args[1]
local lang_code_override = frame.args[2]
local lang_code = lang_code_override
if (lang_code == '' or lang_code == nil) then
lang_code = get_lang_code()
end
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
local label = data[KEY_OVERRIDES[key] or key]
if (label == nil) then
return ''
end
return label
end
-- Get a localized string by the raw key, return fallback string if unable to be localized
p.get_string_fallback = function(frame)
local key = frame.args[1]
local fallback = frame.args[2]
local lang_code = get_lang_code()
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
local label = data[key]
if (label == nil) then
return fallback
end
return label
end
-- get_string, but for internal use by other modules
p._get_string = function(key, lang_override)
lang_code = get_lang_code()
local data = get_lang_file(lang_override or lang_code)
if (data == nil) then
return nil
end
local label = data[KEY_OVERRIDES[key] or key]
if (label == nil) then
return nil
end
return 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]
local 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
return string.format("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
if (key == nil) then
return string.format("English label '%s' not found", label)
end
if (data_lang[key] == nil) then
return string.format("Key '%s' not found in for lang code '%s'", key, lang_code)
end
return data_lang[key]
end
-- search_string, but for internal use by other modules
p._search_string = function(label)
lang_code = get_lang_code()
-- 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
return string.format("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
if (key == nil) then
return string.format("English label '%s' not found", label)
end
if (data_lang[key] == nil) then
return string.format("Key '%s' not found in for lang code '%s'", key, lang_code)
end
return 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