Module:Dictionary: Difference between revisions
m translate_embed initial |
m bugfix for previous |
||
(9 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 | ||
needs_translation_expand = mw.getCurrentFrame():expandTemplate{title = 'NeedsTranslationTooltip'} | -- Determine the appended tooltip | ||
local needs_translation_expand = '' | |||
if ( | 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 | 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 | translation = translation .. needs_translation_expand | ||
end | end | ||
end | end | ||
Line 39: | Line 65: | ||
end | end | ||
function p.translate_embed(frame) | 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 | -- Retrieve the translation string using the provided key | ||
Line 50: | Line 94: | ||
end | 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