Module:Lang: Difference between revisionsGive feedback
Jump to navigation
Jump to search
m Default search string to input label if none is found |
Parse "n as newline |
||
| Line 20: | Line 20: | ||
function get_lang_file(lang_code) | 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) | local success, data = pcall(mw.loadJsonData, file_name) | ||
if success then | if success then | ||
| Line 27: | Line 27: | ||
return nil | return nil | ||
end | end | ||
end | |||
-- Helper function to handle newline conversion | |||
local function process_newlines(text) | |||
if not text then return text end | |||
-- Replace "n with newline character | |||
text = text:gsub('"n', '\n') | |||
return text | |||
end | end | ||
-- Get a localized string by the raw key | -- Get a localized string by the raw key | ||
p.get_string = function(key, lang_code_override, fallback_str, remove_var_index) | p.get_string = function(key, lang_code_override, fallback_str, remove_var_index) | ||
-- Get frame object (either passed directly or via first argument) | |||
local frame | |||
if type(key) == "table" and key.args then | if type(key) == "table" and key.args then | ||
frame = key | |||
key = frame.args[1] | key = frame.args[1] | ||
lang_code_override = frame.args["lang_code_override"] | lang_code_override = frame.args["lang_code_override"] | ||
fallback_str = frame.args["fallback_str"] | fallback_str = frame.args["fallback_str"] | ||
remove_var_index = frame.args["remove_var_index"] | remove_var_index = frame.args["remove_var_index"] | ||
else | |||
frame = mw.getCurrentFrame() | |||
end | 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 = frame:expandTemplate{title = "MissingValveTranslationTooltip"} | |||
local fallback | |||
if (fallback_str == 'en') then | |||
fallback = p.get_string(key, 'en', key .. fallback_tooltip, remove_var_index) | |||
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 | |||
-- Process newlines and return | |||
label = process_newlines(label) | |||
return label | |||
end | end | ||
-- Search for a localized string using its English label | -- Search for a localized string using its English label | ||
p.search_string = function(frame) | p.search_string = function(frame) | ||
local label = frame.args[1] | |||
local lang_code_override = frame.args[2] | |||
local result = p._search_string(label, lang_code_override) | |||
result = process_newlines(result) | |||
return result | |||
end | end | ||
-- search_string, but for internal use by other modules | -- search_string, but for internal use by other modules | ||
p._search_string = function(label, lang_code_override) | 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 label | |||
end | |||
if (data_lang[key] == nil) then | |||
return label | |||
end | |||
return data_lang[key] | |||
end | end | ||
| Line 128: | Line 140: | ||
local lang_code = title.fullText:match(".*/(.*)$") | local lang_code = title.fullText:match(".*/(.*)$") | ||
if lang_code == nil or lang_codes_set[lang_code] == nil then | |||
return 'en' | |||
end | |||
return lang_code | return lang_code | ||
end | end | ||
return p | return p | ||