Module:Engvar
This module implements {{engvar }}. It allows templates to show national varieties of English , when |engvar=
is passed by each article.
For example, one template can display "football" for |engvar=en-UK
articles, and "soccer" for |engvar=en-US
articles.
Parameter list
Template
{{#invoke:engvar|variants | defaultWord = | defaultLang = | engvar = <!-- Pass-through the editor's choice, set to 'auto' to automatically detect --> | en-XX = <!-- add country code for XX, and the nation language word --> | en-YY = <!-- add more varieties as might be needed --> | engvarCat = <!-- '=no' will suppress message category in article page --> | fallback = <!-- set to 'true' to allow commonwealth languages to fallback to 'en-GB'. False by default unless engvar='auto'. --> }}
Article
{{example | engvar = | engvarCat = }}
Maintenance category
Articles with an invalid |engvar=
will be placed in the hidden maintenance category Category:Articles using an unknown Template:Engvar option. Articles listed may need editing.
An article's requested |engvar=
may be unspecified in the template. For example, if an article uses {{example|engvar=South African English}}
but the template has no |en-ZA=
, then the template will return |defaultWord=default color name
. The category will not be used.
- When this categorization is not desired for a whole template, set
|engvarCat=no
in the template - Otherwise pass-through this setting from the article:
|engvarCat={{{engvarCat|yes}}}
. This allows the editor to switch categorization off per article.
Articles are sorted by |engvarCatSort=
or {{pagename}} by default. Note that other templates will fill this category. Set this parameter like |engvarCatSort=Personal prefs
in a template to group its listings under "P".
List of English varieties
In the template, use the exact ISO-code as the parameter name like |en-GB=vapour
. Write |en-US=soccer
not |American English=soccer
. Needed varieties have articles using the template and words differing from the default.
English variety | ISO-code |
---|---|
American English | en-US
|
Australian English | en-AU
|
British English | en-GB
|
Canadian English | en-CA
|
Hiberno-English (Irish English) | en-EI
|
Hong Kong English | en-HK
|
Indian English | en-IN
|
Jamaican English | en-JM
|
Malawian English | en-MW
|
New Zealand English | en-NZ
|
Nigerian English | en-NG
|
Pakistani English | en-PK
|
Philippine English | en-PH
|
Scottish English | en-SCO
|
Singapore English | en-SG
|
South African English | en-ZA
|
Trinidadian English | en-TT
|
British English Oxford spelling British (Oxford) English Oxford English Dictionary (OED) |
en-OED
|
IUPAC spelling | en-IUPAC
|
There is backwards compatibility for leeway in articles. |engvar=en-US
, |engvar=United States
, |engvar=US
can all show the |en-US=football
variety.
See also
- HELP:ENGVAR
- Category:Articles using an unknown Template:Engvar option
- ISO 3166-1 alpha-2 -- The 2-letter country code
- {{#invoke:Engvar|explain|...}} - debugging
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Subpages of this module.
-- This module implements Template:Engvar. -- Template:Engvar is to be build into the template (like an infobox), with default & variant spellings defined. -- That template should also allow parameter '|engvar=' for the editor (article page). -- The module/template Engvar then returns the spelling variant as is set in that article (for example '|engvar=en-GB'). -- The defaultWord is returned, unless the engvar input hits on a defined (en-XX) variant word. local p = {} local getArgs = require('Module:Arguments').getArgs local yesno = require('Module:Yesno') local gsub = string.gsub local lower = string.lower local upper = string.upper function p.variants(frame) local args = getArgs(frame) return p._variants(args) end local function fallback(args, useLang) local cwealthLangs = { ['en-OED'] = 1, ['en-IUPAC'] = 1, ['en-AU'] = 1, ['en-CA'] = 1, ['en-EI'] = 1, ['en-HK'] = 1, ['en-IN'] = 1, ['en-JM'] = 1, ['en-NZ'] = 1, ['en-PK'] = 1, ['en-SCO'] = 1, ['en-SG'] = 1, ['en-ZA'] = 1 } if (useLang == 'en-IUPAC' or useLang == 'en-OED') and (args['en-OED'] or args['en-CA']) then return args['en-OED'] or args['en-CA'] elseif useLang == 'en-CA' and (args['en-OED'] or args['en-US']) then return args['en-OED'] or args['en-US'] elseif cwealthLangs[useLang] and args['en-GB'] then return args['en-GB'] end return args.defaultWord or '' end function p._variants(args) local returnWord = nil local auto = false local defaultWord = args.defaultWord or '' local engvar = args.engvar if (lower(engvar or '') == 'auto') then engvar = require('Module:Engvar/detect').detect() auto = true end if engvar == nil then -- Nothing to look for; use defaultWord right away returnWord = defaultWord elseif args.defaultLang == gsub(lower(engvar), '^en%-(%w%w)$', formatISO) then -- By the defaultLang, the defaultWord is asked returnWord = defaultWord else returnWord = args[gsub(lower(engvar), '^en%-(%w%w)$', formatISO)] end if returnWord == nil then -- No hit so far. Search by words in the engvar entered, checking the list local useLang = engvarLang(engvar) if useLang == nil then returnWord = defaultWord .. addMaintCat(args) elseif args[useLang] then returnWord = args[useLang] elseif yesno(args.fallback or auto, auto) then --default to fallback if auto, otherwise default to no fallback returnWord = fallback(args, useLang) else returnWord = defaultWord end end return returnWord end -- Returns arguments and intermediate result. Plus the template result, in front. function p.explain(frame) local args = getArgs(frame) local ret = {} local engvar = args.engvar or '' table.insert(ret, '\n\n: Settings:') table.insert(ret, 'defaultWord=' .. (args.defaultWord or '') .. '; ') table.insert(ret, 'defaultLang=' .. (args.defaultLang or '') .. '; ') table.insert(ret, 'engvarCat=' .. (args.engvarCat or '[default:yes]') .. '; ') table.insert(ret, 'engvarCatSort=' .. (args.engvarCatSort or '')) table.insert(ret, 'fallback=' .. (args.fallback or '')) table.insert(ret, '\n\n: engvar=' .. engvar .. ' [input] ') if (lower(engvar) == 'auto') then engvar = require('Module:Engvar/detect').detect() or '' table.insert(ret, 'engvar=' .. engvar .. ' [detected] ') end local useLang = engvarLang(engvar) table.insert(ret, ' => Engvar code [used]: >' .. (useLang or '') .. '<.') for k, v in pairs(args) do if k == 'en-UK' then table.insert(ret, k .. ' ? better: use "en-GB"; ') elseif k == 'en-SA' then table.insert(ret, k .. ' ? misleading; use "en-ZA"; ') end if k == 'defaultWord' then elseif k == 'defaultLang' then elseif k == 'engvar' then elseif k == 'engvarcat' then elseif k == gsub(lower(k), '^en%-(%w%w)$', formatISO) then table.insert(ret, k .. '=' .. v .. '; ') else table.insert(ret, k .. ' [not standard:]=' .. v .. '; ') end end return engvar .. ' => ' .. p._variants(args) .. table.concat(ret, ' ') end -- Turn a match into pattern 'en-XX' function formatISO(country) return ('en-' .. upper(country) or '') end function engvarLang(searchEngvar) -- Search verbose language identifiers to ISO-format 'en-XX' -- Assumed: not a blank string '' to search local match = string.match local langs = { us = 'US', usa = 'US', au = 'AU', aus = 'AU', gb = 'GB', gbr = 'GB', uk = 'GB', ca = 'CA', can = 'CA', ei = 'EI', irl = 'EI', hk = 'HK', hkg = 'HK', ['in'] = 'IN', ind = 'IN', --'in' is a reserved keyword and needs to be in quotes jm = 'JM', jam = 'JM', mw = 'MW', mwi = 'MW', nz = 'NZ', nzl = 'NZ', ng = 'NG', nga = 'NG', pk = 'PK', pak = 'PK', ph = 'PH', phl = 'PH', sco = 'SCO', sg = 'SG', sgp = 'SG', za = 'ZA', zaf = 'ZA', tt = 'TT', tto = 'TT', oed = 'OED'}; searchEngvar = gsub(searchEngvar, '^%s*en%-(.*)', '%1') -- rm any opening 'en-'. searchEngvar = gsub(lower(searchEngvar), '[%s%(%)%-]', '') -- To lc, remove all: (, ) , ws, hyphen. --normalize language codes so we don't trigger the maintenence category on valid codes local useLang = langs[searchEngvar] if useLang then return 'en-'..useLang --Special codes elseif match(searchEngvar, 'oxford') then useLang = 'OED' -- 'oxford' to catch before anyting 'british' elseif match(searchEngvar, 'iupac') then useLang = 'IUPAC' -- chemistry -- Very often used elseif match(searchEngvar, 'british') then useLang = 'GB' elseif match(searchEngvar, 'unitedstates') or match(searchEngvar, 'american') then useLang = 'US' elseif match(searchEngvar, 'australia') then useLang = 'AU' -- Often used elseif match(searchEngvar, 'india') then useLang = 'IN' elseif match(searchEngvar, 'newzealand') then useLang = 'NZ' elseif match(searchEngvar, 'southafrica') then -- not: SA useLang = 'ZA' elseif match(searchEngvar, 'canad') then --'canada' or 'canadian' useLang = 'CA' elseif match(searchEngvar, 'hiberno') or match(searchEngvar, 'ireland') or match(searchEngvar, 'irish') then useLang = 'EI' elseif match(searchEngvar, 'hongkong') then useLang = 'HK' -- Less often used elseif match(searchEngvar, 'jamaica') then useLang = 'JM' elseif match(searchEngvar, 'malawi') then useLang = 'MW' elseif match(searchEngvar, 'nigeria') then useLang = 'NG' elseif match(searchEngvar, 'pakistan') then useLang = 'PK' elseif match(searchEngvar, 'philippine') then useLang = 'PH' elseif match(searchEngvar, 'scotland') or match(searchEngvar, 'scottish') then useLang = 'SCO' -- Has no alpha-2 code; not 'scotch' elseif match(searchEngvar, 'singapore') then useLang = 'SG' elseif match(searchEngvar, 'trinidad') or match(searchEngvar, 'tobago') then useLang = 'TT' end return useLang and 'en-'..useLang end function addMaintCat(args) local catMaintenance if args.engvarCat ~= 'no' then local title = mw.title.getCurrentTitle() if title:inNamespaces(0) then -- 0=main, 10=templ, 828=module if args.engvarCatSort then catMaintenance = '|' .. args.engvarCatSort .. ', ' .. title.text end catMaintenance = '[[Category:Articles using an unknown Template:Engvar option' .. (catMaintenance or '') .. ']]' end end return catMaintenance or '' end return p