Article snapshot taken from Wikipedia with creative commons attribution-sharealike license.
Give it a read and then ask your questions in the chat.
We can research this topic together.
This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected.
This module is used by {{Wikt-lang}}. It is inspired by the templates {{m}} and {{l}} and their associated modules on Wiktionary. It has a Wiktionary link function that links to the correct section of the Wiktionary entry, and applies correct language formatting and italics. The language-tagging function does most of what {{Lang}} does, except that italics can't be customized and categories aren't added.
The module uses Module:Wikt-lang/data to retrieve the language name for a language code, and to perform the necessary entry-name replacements (for instance, removing macrons from Latin entry names). These are unfortunately not automatically retrieved from Wiktionary's Wikt-lang data modules. For language codes that do not have a name value in this module, the language name is fetched with mw.language.fetchLanguage. When mw.language.fetchLanguage does not fetch the correct language name (or any language name at all), please add it to Module:Wikt-lang/data, and similarly when the correct entry name is not generated, please add the entry name replacements to the module.
require('Module:No globals')
local m_data = mw.loadData("Module:Language/data/sandbox")
local langData = m_data.languages or m_data
local strings = {
= "Reconstruction:%s/%s",
= "Appendix:%s/%s",
= "]",
= "]",
= "<i lang=\"%s\" xml:lang=\"%s\"%s>%s</i>",
= "<span lang=\"%s\" xml:lang=\"%s\"%s>%s</span>",
}
local error_messages = {
= "No language code.",
= "No Wiktionary entry.",
= "The language name for the language code <code>%s</code> was not found.",
}
local tracking_categories = {
= "]",
= "]",
= "]",
}
local activeTrackingCategories = {}
local p = {}
local function get_error_message(message)
return string.format('<span style="font-size:100%%; font-style:normal;" class="error">Error: %s</span>', message) .. tracking_categories
end
local function getCodes(code, text)
local redirect_code = m_data.redirects
if redirect_code then
code = redirect_code
table.insert(activeTrackingCategories, tracking_categories)
end
local langModule = require('Module:Lang/sandbox').get_ietf_parts
local languageCode, script, region, variant, private, errorText = langModule(code)
-- Temp code to handle custom private codes until added properly to Module:Lang.
if errorText and m_data.languages.private then
languageCode = code
errorText = nil
end
if not script or script == "" then
script = require("Module:Unicode data").is_Latin(text) and "Latn" or "unknown"
end
return languageCode, script, errorText
end
local function cleanWiktionaryText(wiktionaryText, languageCode)
local data = langData
wiktionaryText = tostring(wiktionaryText)
-- Remove bold and italics, so that words that contain bolding or emphasis can be linked without piping.
wiktionaryText = wiktionaryText:gsub("\'\'\'", "")
wiktionaryText = wiktionaryText:gsub("\'\'", "")
-- If the language is not found, return wiktionaryText.
if data == nil then
return wiktionaryText
end
-- If the language does not have diacritics, return wiktionaryText.
local replacements = data and data
if replacements == nil then
return wiktionaryText
end
-- Decompose so that the diacritics of characters such
-- as á can be removed in one go.
-- No need to compose at the end, because the MediaWiki software
-- will handle that.
local ugsub = mw.ustring.gsub
if replacements.decompose then
wiktionaryText = mw.ustring.toNFD(wiktionaryText)
for i, from in ipairs(replacements.from) do
wiktionaryText = ugsub(wiktionaryText, from, replacements.to and replacements.to or "")
end
else
for regex, replacement in pairs(replacements) do
wiktionaryText = ugsub(wiktionaryText, regex, replacement)
end
end
return wiktionaryText
end
local function createWiktionaryLink(wiktionaryText, linkText, languageCode)
if languageCode then
local data = langData
local name
if data and data.name then
name = data.name
else
-- On other languages' wikis, use mw.getContentLanguage():getCode(),
-- or replace 'en' with that wiki's language code.
-- name = mw.language.fetchLanguageName(languageCode, mw.getContentLanguage():getCode())
name = mw.language.fetchLanguageName(languageCode, 'en')
end
if name == "" then
return get_error_message(string.format(error_messages, languageCode))
end
if wiktionaryText:sub(1, 1) == "*" then
wiktionaryText = string.format(strings, name, wiktionaryText:sub(2))
elseif data and data.type == "reconstructed" then
-- Track reconstructed entries with no asterisk by transcluding
table.insert(activeTrackingCategories, tracking_categories)
wiktionaryText = string.format(strings, name, wiktionaryText)
elseif data and data.type == "appendix" then
wiktionaryText = string.format(strings, name, wiktionaryText)
end
return string.format(strings, wiktionaryText, name, linkText)
else
return string.format(strings, wiktionaryText, linkText)
end
end
-- TODO: see if all or some of the logic can be handled by ]
local function tag(wiktionaryLink, languageCode, script, italics)
local data = langData
local textDirectionMarkers = {"", "", ""}
if data and data == "rtl" then
textDirectionMarkers = {' dir="rtl"', '‏', '‎'}
end
local out = {textDirectionMarkers}
-- Use Misplaced Pages code if it has been given: for instance,
-- Proto-Indo-European has the Wiktionary code "ine-pro" but the Misplaced Pages
-- code "ine-x-proto".
languageCode = data and data.Wikipedia_code or languageCode
local italicize = script == "Latn" and italics
if italicize then
table.insert(out, string.format(strings, languageCode, languageCode, textDirectionMarkers, wiktionaryLink))
else
table.insert(out, string.format(strings, languageCode, languageCode, textDirectionMarkers, wiktionaryLink))
end
table.insert(out, textDirectionMarkers)
return table.concat(out)
end
function p.wikt(frame)
frame = true
return p.wiktlang(frame)
end
function p.wiktlang(frame)
local getArgs = require('Module:Arguments').getArgs
local args = getArgs(frame)
local code = args and mw.text.trim(args)
if not code then
return get_error_message(error_messages)
end
local wiktionaryText = args
if not wiktionaryText then
return get_error_message(error_messages)
end
local displayText = args
local languageCode, scriptCode, errorMessage = getCodes(code, displayText or wiktionaryText)
-- TODO: "languageCode" not used as "code" is used instead.
if errorMessage then
return get_error_message(errorMessage)
end
local italics = args.italics or args.i
italics = not (italics == "n" or italics == "-")
local wiktionaryTextCleaned = cleanWiktionaryText(wiktionaryText, code)
local linkText
if displayText then
linkText = displayText
else
linkText = wiktionaryText
end
local wiktionaryLink = createWiktionaryLink(wiktionaryTextCleaned, linkText, code)
if not args then
wiktionaryLink = tag(wiktionaryLink, code, scriptCode, italics)
end
return wiktionaryLink .. table.concat(activeTrackingCategories)
end
return p