Module:ISO 3166
Template:Module rating Template:High risk
This module returns a country's or subdivision's code (alpha-2, alpha-3, numeric) or name (ISO, non-ISO) from ISO 3166 from a variety of inputs (alpha-2, alpha-3, numeric, name, ISO-name, alternative names). The module also removes junk from the input.
Examples
Countries (ISO 3166-1)
All three types of ISO 3166-1 codes (alpha-2, alpha-3 and numeric) work as inputs to name
, as well as to code
(which can therefore also be used to convert between different code types). Use Template:Para to output alpha-3 or numeric codes in code
instead of the default alpha-2 codes.
Name
To get the common name use the name function
- Template:Tnull → United Kingdom
- Template:Tnull → United Kingdom
- Template:Tnull → United Kingdom
ISO Name
To get the common name use the name function with isoname = yes
- Template:Tnull → United Kingdom of Great Britain and Northern Ireland
- Template:Tnull → United Kingdom of Great Britain and Northern Ireland
- Template:Tnull → United Kingdom of Great Britain and Northern Ireland
Alpha-2
To get the alpha 2 code use the code function
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
Alpha-3
To get the alpha 3 code use the code function with codetype = 3
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
Numeric
To get the numeric code use the code function with codetype = numeric or use the numeric function
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
Subdivisions (ISO 3166-2)
Inputs to name
must be valid ISO 3166-2 codes, i.e. the country's alpha-2 code for the first part, and up to three alphanumeric characters for the second part. They may be given normally (with a hyphen between the parts), or split between two unnamed parameters. For code
, the first parameter is the country name (or any of its three codes, like above), and the second the subdivision name.
Code (alpha-2)
To get the alpha-2 code of a subdivision use the code function with parameter 1 being the country and parameter 2 being the subdivision
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
Name
To get the name of a subdivision use the name function with parameter 1 being the country and parameter 2 being the subdivsion or parameter 1 being the subdivsion code
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
Template:Para works for subnational entities as well; keep in mind that ISO 3166-2 uses (transliterations of) local names that may differ from English ones. Set Template:Para to a language code to switch between different languages for entities that have multiple ISO names. The default language for multilingual entities can be set on the country's data page.
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
- Template:Tnull → Lua error: Internal error: The interpreter has terminated with signal "24".
Tracking categories
See also
- Wikipedia:Templates for discussion/Log/2015 November 12#Template:ISO 3166 name DE-HB – discussion of replacement of template-based system with Lua
- Wikipedia:Templates_for_discussion/Log/2018_September_10#Template:ISO_3166_code-3_AD – discussion of full removal of template-based system
- {{ISO 3166 name}} – (ISO name)
- {{Country name}} – (Standard name)
- {{ISO 3166 code}} – (Code)
- {{ISO 3166 code-3}} – (3 letter code)
- {{ISO 3166 numeric}} – (numeric code)
- Module:ISO 3166/data – the data subpages used by this module
Subpages
- ISO 3166/data
- ISO 3166/data/AD
- ISO 3166/data/AE
- ISO 3166/data/AF
- ISO 3166/data/AG
- ISO 3166/data/AI
- ISO 3166/data/AL
- ISO 3166/data/AM
- ISO 3166/data/AO
- ISO 3166/data/AQ
- ISO 3166/data/AR
- ISO 3166/data/AS
- ISO 3166/data/AT
- ISO 3166/data/AU
- ISO 3166/data/AW
- ISO 3166/data/AX
- ISO 3166/data/AZ
- ISO 3166/data/BA
- ISO 3166/data/BB
- ISO 3166/data/BD
- ISO 3166/data/BE
- ISO 3166/data/BF
- ISO 3166/data/BG
- ISO 3166/data/BH
- ISO 3166/data/BI
- ISO 3166/data/BJ
- ISO 3166/data/BL
- ISO 3166/data/BM
- ISO 3166/data/BN
- ISO 3166/data/BO
- ISO 3166/data/BQ
- ISO 3166/data/BR
- ISO 3166/data/BS
- ISO 3166/data/BT
- ISO 3166/data/BV
- ISO 3166/data/BW
- ISO 3166/data/BY
- ISO 3166/data/BZ
- ISO 3166/data/CA
- ISO 3166/data/CC
- ISO 3166/data/CD
- ISO 3166/data/CF
- ISO 3166/data/CG
- ISO 3166/data/CH
- ISO 3166/data/CI
- ISO 3166/data/CK
- ISO 3166/data/CL
- ISO 3166/data/CM
- ISO 3166/data/CN
- ISO 3166/data/CO
- ISO 3166/data/CR
- ISO 3166/data/CU
- ISO 3166/data/CV
- ISO 3166/data/CW
- ISO 3166/data/CX
- ISO 3166/data/CY
- ISO 3166/data/CZ
- ISO 3166/data/DE
- ISO 3166/data/DJ
- ISO 3166/data/DK
- ISO 3166/data/DM
- ISO 3166/data/DO
- ISO 3166/data/DZ
- ISO 3166/data/EC
- ISO 3166/data/EE
- ISO 3166/data/EG
- ISO 3166/data/EH
- ISO 3166/data/ER
- ISO 3166/data/ES
- ISO 3166/data/ET
- ISO 3166/data/FI
- ISO 3166/data/FJ
- ISO 3166/data/FK
- ISO 3166/data/FM
- ISO 3166/data/FO
- ISO 3166/data/FR
- ISO 3166/data/GA
- ISO 3166/data/GB
- ISO 3166/data/GD
- ISO 3166/data/GE
- ISO 3166/data/GF
- ISO 3166/data/GG
- ISO 3166/data/GH
- ISO 3166/data/GI
- ISO 3166/data/GL
- ISO 3166/data/GM
- ISO 3166/data/GN
- ISO 3166/data/GP
- ISO 3166/data/GQ
- ISO 3166/data/GR
- ISO 3166/data/GS
- ISO 3166/data/GT
- ISO 3166/data/GU
- ISO 3166/data/GW
- ISO 3166/data/GY
- ISO 3166/data/HK
- ISO 3166/data/HM
- ISO 3166/data/HN
- ISO 3166/data/HR
- ISO 3166/data/HT
- ISO 3166/data/HU
- ISO 3166/data/ID
- ISO 3166/data/IE
- ISO 3166/data/IL
- ISO 3166/data/IM
- ISO 3166/data/IN
- ISO 3166/data/IO
- ISO 3166/data/IQ
- ISO 3166/data/IR
- ISO 3166/data/IS
- ISO 3166/data/IT
- ISO 3166/data/JE
- ISO 3166/data/JM
- ISO 3166/data/JO
- ISO 3166/data/JP
- ISO 3166/data/KE
- ISO 3166/data/KG
- ISO 3166/data/KH
- ISO 3166/data/KI
- ISO 3166/data/KM
- ISO 3166/data/KN
- ISO 3166/data/KP
- ISO 3166/data/KR
- ISO 3166/data/KW
- ISO 3166/data/KY
- ISO 3166/data/KZ
- ISO 3166/data/LA
- ISO 3166/data/LB
- ISO 3166/data/LC
- ISO 3166/data/LI
- ISO 3166/data/LK
- ISO 3166/data/LR
- ISO 3166/data/LS
- ISO 3166/data/LT
- ISO 3166/data/LU
- ISO 3166/data/LV
- ISO 3166/data/LY
- ISO 3166/data/MA
- ISO 3166/data/MC
- ISO 3166/data/MD
- ISO 3166/data/ME
- ISO 3166/data/MF
- ISO 3166/data/MG
- ISO 3166/data/MH
- ISO 3166/data/MK
- ISO 3166/data/ML
- ISO 3166/data/MM
- ISO 3166/data/MN
- ISO 3166/data/MO
- ISO 3166/data/MP
- ISO 3166/data/MQ
- ISO 3166/data/MR
- ISO 3166/data/MS
- ISO 3166/data/MT
- ISO 3166/data/MU
- ISO 3166/data/MV
- ISO 3166/data/MW
- ISO 3166/data/MX
- ISO 3166/data/MY
- ISO 3166/data/MZ
- ISO 3166/data/NA
- ISO 3166/data/NC
- ISO 3166/data/NE
- ISO 3166/data/NF
- ISO 3166/data/NG
- ISO 3166/data/NI
- ISO 3166/data/NL
- ISO 3166/data/NO
- ISO 3166/data/NP
- ISO 3166/data/NR
- ISO 3166/data/NU
- ISO 3166/data/NZ
- ISO 3166/data/National
- ISO 3166/data/OM
- ISO 3166/data/PA
- ISO 3166/data/PE
- ISO 3166/data/PF
- ISO 3166/data/PG
- ISO 3166/data/PH
- ISO 3166/data/PK
- ISO 3166/data/PL
- ISO 3166/data/PM
- ISO 3166/data/PN
- ISO 3166/data/PR
- ISO 3166/data/PS
- ISO 3166/data/PT
- ISO 3166/data/PW
- ISO 3166/data/PY
- ISO 3166/data/QA
- ISO 3166/data/RE
- ISO 3166/data/RO
- ISO 3166/data/RS
- ISO 3166/data/RU
- ISO 3166/data/RW
- ISO 3166/data/SA
- ISO 3166/data/SB
- ISO 3166/data/SC
- ISO 3166/data/SD
- ISO 3166/data/SE
- ISO 3166/data/SG
- ISO 3166/data/SH
- ISO 3166/data/SI
- ISO 3166/data/SJ
- ISO 3166/data/SK
- ISO 3166/data/SL
- ISO 3166/data/SM
- ISO 3166/data/SN
- ISO 3166/data/SO
- ISO 3166/data/SR
- ISO 3166/data/SS
- ISO 3166/data/ST
- ISO 3166/data/SV
- ISO 3166/data/SX
- ISO 3166/data/SY
- ISO 3166/data/SZ
- ISO 3166/data/TC
- ISO 3166/data/TD
- ISO 3166/data/TF
- ISO 3166/data/TG
- ISO 3166/data/TH
- ISO 3166/data/TJ
- ISO 3166/data/TK
- ISO 3166/data/TL
- ISO 3166/data/TM
- ISO 3166/data/TN
- ISO 3166/data/TO
- ISO 3166/data/TR
- ISO 3166/data/TT
- ISO 3166/data/TV
- ISO 3166/data/TW
- ISO 3166/data/TZ
- ISO 3166/data/UA
- ISO 3166/data/UG
- ISO 3166/data/UM
- ISO 3166/data/US
- ISO 3166/data/UY
- ISO 3166/data/UZ
- ISO 3166/data/VA
- ISO 3166/data/VC
- ISO 3166/data/VE
- ISO 3166/data/VG
- ISO 3166/data/VI
- ISO 3166/data/VN
- ISO 3166/data/VU
- ISO 3166/data/WF
- ISO 3166/data/WS
- ISO 3166/data/YE
- ISO 3166/data/YT
- ISO 3166/data/ZA
- ISO 3166/data/ZM
- ISO 3166/data/ZW
- ISO 3166/data/doc
- ISO 3166/doc
-- to enable us to replicate the current functioning of Country extract, we need to deal with: -- 2 {{<name>}} DONE! -- 3 [[<name>]] DONE! -- 4 [[<name>|<junk>]] DONE! -- 5 [[image:flag of <country>.[svg|gif|png|jpg]|\d+px]] DONE! local p = {} local getArgs = require("Module:Arguments").getArgs local data = mw.loadData("Module:ISO 3166/data/National") --[[----------F I N D N A M E----------]]-- -- Finds the name in the database local function findname(code,cdata,qry) local sqry = p.strip(qry) if cdata["name"] and sqry==p.strip(cdata["name"]) or cdata["isoname"] and sqry==p.strip(cdata["isoname"]) or not cdata["nocode"] and sqry==code or sqry==cdata["alpha3"] or sqry==cdata["numeric"] then return true end for _,tname in pairs(cdata["isonames"] or {}) do if sqry==p.strip(tname) then return true end end for _,tname in pairs(cdata["altnames"] or {}) do if sqry==p.strip(tname) then return true end end return false end --[[----------I S O N A M E----------]]-- -- Find the ISO name of a country/region local function isoname(data,code,lang) if data[code]["isonames"] then local name = data[code]["isodisplaynames"] and data[code]["isodisplaynames"][lang] or data[code]["isonames"][lang] or data[code]["isodisplaynames"] and data[code]["isodisplaynames"][data[code]["defaultlang"] or data["defaultlang"]] or data[code]["isonames"][data[code]["defaultlang"] or data["defaultlang"]] or data[code]["isodisplaynames"] and data[code]["isodisplaynames"]["en"] or data[code]["isonames"]["en"] if name then return name end for _,iname in pairs(data[code]["isonames"]) do return iname end return data[code]["isodisplayname"] or data[code]["isoname"] else return data[code]["isodisplayname"] or data[code]["isoname"] end end --[[----------S T R I P----------]]-- -- Removes junk from the input function p.strip(text) local accents = {["À"]="A",["Á"]="A",["Â"]="A",["Ã"]="A", -- accent list ["Ä"]="A",["Å"]="A",["Ç"]="C",["È"]="E",["É"]="E", ["Ê"]="E",["Ë"]="E",["Ì"]="I",["Í"]="I",["Î"]="I", ["Ï"]="I",["Ñ"]="N",["Ò"]="O",["Ó"]="O",["Ô"]="O", ["Õ"]="O",["Ö"]="O",["Ø"]="O",["Ù"]="U",["Ú"]="U", ["Û"]="U",["Ü"]="U",["Ý"]="Y" } local remove = {"NATION OF","COUNTRY OF","TERRITORY OF", -- text to be removed list "FLAG OF","FLAG","KINGDOM OF","STATE OF"," STATE ", "PROVINCE OF","PROVINCE","TERRITORY" } local patterns = {[".+:"]="",["|.+"]="",["%(.-%)"]="", -- patterns to follow (order may matter) ["%..*"]="",["^THE "]="",["%_"]=" ",["%-"]=" ", ["%d%d?%d?PX"]="", } text = mw.ustring.upper(text) -- Case insensitivity text = mw.ustring.gsub(text,"[À-Ý]",accents) -- Deaccent for pattern,value in pairs(patterns) do -- Follow patterns text = mw.ustring.gsub(text,pattern,value) end for _,words in pairs(remove) do -- Remove unneeded words text = mw.ustring.gsub(text,words,"") end text = mw.ustring.gsub(text,"%W","") -- Remove non alpha-numeric return text end --[[----------P . C A L L S T R I P ---------]]-- -- Calls P.strip but using Module:Arguments function p.callstrip(frame) local args = getArgs(frame) return p.strip(args[1]) or "" end --[[----------P . L U A C O D E---------]]-- -- Makes the ISO code of a country function p.luacode(args) if string.find(args[1] or '',"%-") then args[1], args[2] = string.match(args[1] or '',"^([^%-]*)%-(.*)$") end if args[1] then args[1] = p.strip(args[1]) end if args[2] then args[2] = p.strip(args[2]) end if args["codetype"]=="3" then args["codetype"]="alpha3" end local eot = args.error or "" local catnocountry = (args.nocat and args.nocat == 'true') and '' or '[[Category:Wikipedia page with obscure country]]' local catnosubdivision = (args.nocat and args.nocat == 'true') and '' or '[[Category:Wikipedia page with obscure subdivision]]' if not args[1] then if mw.title.getCurrentTitle().namespace ~= 0 then catnocountry = '' end return catnocountry, '<span style="font-size:100%" class="error">"No parameter for the country given"</span>' end if not args[2] then --3166-1 code for alpha2,cdata in pairs(data) do if findname(alpha2,cdata,args[1]) then if args["codetype"]=="numeric" or args["codetype"]=="alpha3" then return cdata[args["codetype"]] else return alpha2 end end end if mw.title.getCurrentTitle().namespace ~= 0 then catnocountry = '' end return catnocountry else --3166-2 code for alpha2,cdata in pairs(data) do if findname(alpha2,cdata,args[1]) then if mw.ustring.match(alpha2,"GB") then -- For England, Wales etc. alpha2 = "GB" end local sdata = mw.loadData("Module:ISO 3166/data/"..alpha2) local empty = true for scode,scdata in pairs(sdata) do if type(scdata)=="table" then empty = false if findname(scode,scdata,args[2]) then return alpha2.."-"..scode end end end if mw.title.getCurrentTitle().namespace ~= 0 then catnosubdivision = '' end return catnosubdivision end end if mw.title.getCurrentTitle().namespace ~= 0 then catnocountry = '' end return catnocountry end end --[[----------P . C O D E---------]]-- -- Calls P.Luacode but using Module:Arguments function p.code(frame) return p.luacode(getArgs(frame)) or "" end --[[----------P . N U M E R I C---------]]-- -- Calls P.Luacode but using Module:Arguments and setting it to output a numeric value function p.numeric(frame) local args = getArgs(frame) args["codetype"]="numeric" return p.luacode(args) or "" end --[[----------P . L U A N A M E---------]]-- -- Makes the ISO/common name of a country function p.luaname(args) local code1 = p.luacode(args) local code2 = '' if string.find(code1,"%-") then code1, code2 = string.match(code1,"^([^%-]*)%-(.*)$") end if string.find(code1,"^%u%u$") then if code2=="" then --3166-1 alpha-2 code if data[code1] then return (args.isoname or args.lang) and isoname(data,code1,args.lang) or (data[code1]["displayname"] or data[code1]["name"]) else return '[[Category:Wikipedia page with obscure country]]' end else --3166-2 code local sdata if data[code1] then sdata = mw.loadData("Module:ISO 3166/data/"..code1) else return '[[Category:Wikipedia page with obscure country]]' end if sdata[code2] then return (args.isoname or args.lang) and isoname(sdata,code2,args.lang) or (sdata[code2]["displayname"] or sdata[code2]["name"]) else return '[[Category:Wikipedia page with obscure country]]' end end end end --[[----------P . N A M E---------]]-- -- Calls P.Luaname but using Module:Arguments function p.name(frame) return p.luaname(getArgs(frame)) or "" end --[[----------P . G E O C O O R D I N S E R T---------]]-- -- Wrapper for Module:Coordinates.coordinsert function p.geocoordinsert(frame) -- {{#invoke:ISO 3166|geocoordinsert|{{coord|...}} -- |country=..|subdivision1=...|subdivision2=... -- |type=...|scale=...|dim=...|source=...|globe=... -- }} local args = frame.args local subdivisionqueried = false local catnocountry = (args.nocat and args.nocat == 'true') and '' or '[[Category:Wikipedia page with obscure country]]' local catnosubdivision = (args.nocat and args.nocat == 'true') and '' or '[[Category:Wikipedia page with obscure subdivision]]' or '' local tracking = '' local targs = {} targs[1] = args[1] or '' for i, v in pairs(args) do if i == 'country' and not mw.ustring.find(targs[1], 'region:') then local country = v local k, region = 1, '' -- look for a valid subdivision while region == '' and k < 3 do local subdivision = args['subdivision' .. k] or '' if subdivision ~= '' then region = p.luacode({country, subdivision, nocat = 'true'}) subdivisionqueried = true end k = k + 1 end -- subdivision lookup failed or never attempted, try country only if region == '' then region = p.luacode({country, nocat = 'true'}) if mw.title.getCurrentTitle().namespace ~= 0 then catnocountry, catnosubdivision = '', '' end if region == '' then tracking = tracking .. catnocountry elseif subdivisionqueried == true then tracking = tracking .. catnosubdivision end end -- something worked, add it to the targs if region ~= '' then targs[#targs + 1] = 'region:' .. region end elseif i == 'type' or i == 'scale' or i == 'dim' or i == 'source' or i == 'globe' then targs[#targs + 1] = i .. ':' .. v end end -- call Module:Coordinates.coordinsert if there is something to insert if #targs > 1 then local coordinsert = require('Module:Coordinates').coordinsert return coordinsert({args = targs}) .. tracking end -- otherwise, just return the coordinates return targs[1] .. tracking end return p