Module:Dictionary: Difference between revisions

From Deadlock Wiki
Jump to navigation Jump to search
Sur (talk | contribs)
m fix to prevent infinite loop if the nt/vt translations are missing
Sur (talk | contribs)
m bugfix for previous
 
(8 intermediate revisions by the same user not shown)
Line 5: Line 5:


-- Get a localized string by the raw key
-- Get a localized string by the raw key
p.translate = function(key, lang_code_override)
p.translate = function(key, lang_code_override, fallback_str, show_needs_translation)
-- If called internally (direct Lua call), args will be passed directly.
-- 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`.
     -- If called from wikitext, `key` will be the `frame` object, and we get args from `frame.args`.
Line 14: Line 14:
         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"]
        show_needs_translation = frame.args["show_needs_translation"]
    end
   
    --default to showing needs translation
    if (show_needs_translation == nil) then
    show_needs_translation = 'true'
     end
     end
      
      
Line 26: Line 33:
translation = translations[lang_code]
translation = translations[lang_code]
if (translation == nil) then
if (translation == nil) then
translation = translations["en"]
-- Determine the appended tooltip
if (key ~= 'MissingValveTranslationTooltip' and key ~= 'NeedsTranslationTooltip') then
local needs_translation_expand = ''
needs_translation_expand = mw.getCurrentFrame():expandTemplate{title = 'NeedsTranslationTooltip'}
if (show_needs_translation == 'true' and key ~= 'MissingValveTranslationTooltip' and key ~= 'NeedsTranslationTooltip' and key ~= 'NotesNeedsTranslation') then
local template_args = {}
if key == 'Notes' then
template_args[1] = 'NotesNeedsTranslation'
end
needs_translation_expand = mw.getCurrentFrame():expandTemplate{title = 'NeedsTranslationTooltip', args=template_args}
end
-- Determine the fallback string to use
--default to english fallback if none specified or if en specified
if (fallback_str == 'en' or fallback_str == nil) then
translation = translations["en"]
else
translation = fallback_str
 
-- If english translation is missing, default to the key instead of blank string
if (translation == nil) then
if (translation == nil) then
translation = key .. needs_translation_expand
translation = key
else
end
translation = translation .. needs_translation_expand
end
end
-- Add the tooltip
if (translation ~= '' and translation ~= nil) then
translation = translation .. needs_translation_expand
end
end
end
end
Line 40: Line 65:
end
end


function p.translate_embed(frame)
function p.translate_embed(key, var1, var2, var3, var4, var5)
     -- Get the key from the frame (first argument)
    -- If called internally (direct Lua call), args will be passed directly.
    local key = frame.args[1]
    -- If called from wikitext, `key` will be the `frame` object, and we get args from `frame.args`.
 
local vars
    -- 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]
       
        -- Collect all the variables from the frame (starting from the second argument)
    vars = {}
    local i = 2
    while frame.args[i] do
        table.insert(vars, frame.args[i])
        i = i + 1
    end
else
vars = {[1] = var1, [2] = var2, [3] = var3, [4] = var4, [5] = var5}
    end
   
      
      
     -- Retrieve the translation string using the provided key
     -- Retrieve the translation string using the provided key
Line 51: Line 94:
     end
     end


    -- Collect all the variables from the frame (starting from the second argument)
    local vars = {}
    local i = 2
    while frame.args[i] do
        table.insert(vars, frame.args[i])
        i = i + 1
    end
 
     -- Now we use string.format to insert variables into the translation string
     -- Now we use string.format to insert variables into the translation string
     local formatted_translation = string.format(translation, unpack(vars))
     local formatted_translation = string.format(translation, unpack(vars))

Latest revision as of 20:40, 14 October 2024

Overview[edit source]

See Template:Translate for how/when to use and more documentation. See Data:Dictionary/sources for list of where each translation is used. This may be particularly helpful for reading on the context of the phrase that needs translation.

Functions[edit source]

translate[edit source]

Translates a given key using Data:Dictionary.

Parameters[edit source]

  • key - key to translate
  • lang_code_override (OPTIONAL, Named parameter) - language code that overrides current language. See supported list at Data:LangCodes.json.
  • fallback_str (OPTIONAL, Named parameter) - string to return if key cannot be translated. Defaults to the english translation. Use a blank string or nil for easier catching of missed translations, where the needs translation tooltip will also not be added.
  • show_needs_translation (OPTIONAL, Named parameter) - boolean that determines if the [nt] is appended when its unable to be translated. Defaults to 'true'

Example[edit source]

Example where translation does exist
{{#invoke:Dictionary|translate|Update history|lang_code_override=en}}

Outputs

Update history


Example where translation does not yet exist
{{#invoke:Dictionary|translate|Update history|lang_code_override=es}}

Outputs

Update history[nt]


Example where translation does not yet exist but displaying the tooltip is off
{{#invoke:Dictionary|translate|Update history|lang_code_override=es|show_needs_translation=false}}

Outputs

Update history

Example where translation does not yet exist and the fallback is an empty string
{{#invoke:Dictionary|translate|Update history|lang_code_override=es|fallback_str=}}

Outputs



Example where translation does not yet exist and the fallback is another text
{{#invoke:Dictionary|translate|Update history|lang_code_override=es|fallback_str=My custom fallback text}}

Outputs

My custom fallback text[nt]

translate_embed[edit source]

Translates a given key then replaces %s in the string with extra parameters

Parameters[edit source]

  • key - key to translate
  • var1 - first variable to embed in the string
  • var2 - second
  • varN - Nth

Ensure the number of variables passed matches the number of instances of %s in the translated string.

Examples[edit source]

Without embedment: {{#invoke:Dictionary|translate|NeedsTranslationTooltip}}

Outputs

This needs translation to English. To help translate it, visit %s.

With embedment:

{{#invoke:Dictionary|translate_embed
|1=NeedsTranslationTooltip
|2=Template:Translate
}}

Outputs

This needs translation to English. To help translate it, visit Template:Translate.

Notes[edit source]

  • The parameters do not need to be prefixed with "1=", "2=", etc., they are used in the above example because the 4th parameter contains an equal sign (=) in it, where it would be read as a named parameter rather than a ordinal parameter.
  • Ensure the number of passed variables (other than the key) matches the number of %s used in the translated string.

local p = {}
local dictionary_data = mw.loadJsonData("Data:Dictionary")
local lang_codes_set = mw.loadJsonData("Data:LangCodes.json")
--Used by [[Template:Translate]], see documentation there

-- Get a localized string by the raw key
p.translate = function(key, lang_code_override, fallback_str, show_needs_translation)
	-- 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"]
        show_needs_translation = frame.args["show_needs_translation"]
    end
    
    --default to showing needs translation
    if (show_needs_translation == nil) then
    	show_needs_translation = 'true' 
    end
    
	local lang_code = lang_code_override
	if (lang_code == '' or lang_code == nil) then
    	lang_code = get_lang_code()
	end
	
	local translations = dictionary_data[key]
	if (translations == nil) then return string.format("Key '%s' is not in Data:Dictionary", key) end
	
	translation = translations[lang_code]
	if (translation == nil) then
		-- Determine the appended tooltip
		local needs_translation_expand = ''
		if (show_needs_translation == 'true' and key ~= 'MissingValveTranslationTooltip' and key ~= 'NeedsTranslationTooltip' and key ~= 'NotesNeedsTranslation') then
			local template_args = {}
			if key == 'Notes' then
				template_args[1] = 'NotesNeedsTranslation'
			end
			needs_translation_expand = mw.getCurrentFrame():expandTemplate{title = 'NeedsTranslationTooltip', args=template_args}
		end
		
		-- Determine the fallback string to use
		--default to english fallback if none specified or if en specified
		if (fallback_str == 'en' or fallback_str == nil) then
			translation = translations["en"]
		else
			translation = fallback_str

			-- If english translation is missing, default to the key instead of blank string
			if (translation == nil) then
				translation = key
			end
		end
		
		-- Add the tooltip
		if (translation ~= '' and translation ~= nil) then
			translation = translation .. needs_translation_expand
		end
	end
	
	return translation
end

function p.translate_embed(key, var1, var2, var3, var4, var5)
    -- 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`.

	local vars
    -- 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]
        
        -- Collect all the variables from the frame (starting from the second argument)
	    vars = {}
	    local i = 2
	    while frame.args[i] do
	        table.insert(vars, frame.args[i])
	        i = i + 1
	    end
	else
		vars = {[1] = var1, [2] = var2, [3] = var3, [4] = var4, [5] = var5}
    end
    
    
    -- Retrieve the translation string using the provided key
    local translation = p.translate(key)
    
    if not translation then
        return string.format("No translation found for key '%s'", key)
    end

    -- Now we use string.format to insert variables into the translation string
    local formatted_translation = string.format(translation, unpack(vars))

    -- Return the final string with embedded variables
    return formatted_translation
end

function get_lang_code()
    local title = mw.title.getCurrentTitle()
    local lang_code = title.fullText:match(".*/(.*)$")
	
	-- if the last part the url is not two letters, then its not a lang code,
	-- so default to english
	if (lang_code == nil or lang_codes_set[lang_code] == nil) then
		return 'en'	
	end
		
    return lang_code
end



return p